From 0f0777371f27054e1ca3e702af0885eb7a92e7de Mon Sep 17 00:00:00 2001 From: Pringled Date: Tue, 28 Apr 2026 17:45:16 +0200 Subject: [PATCH 01/18] Add token efficiency benchmarks --- assets/images/recall_vs_tokens.png | Bin 0 -> 62621 bytes benchmarks/README.md | 91 + benchmarks/baselines/ablations.py | 33 +- benchmarks/baselines/coderankembed.py | 51 +- benchmarks/baselines/colgrep.py | 53 +- benchmarks/baselines/ripgrep.py | 51 +- benchmarks/context_efficiency.py | 837 ++ benchmarks/data.py | 48 +- ...context-efficiency-judge-6248855cfef8.json | 9804 +++++++++++++++++ ...ontext-efficiency-recall-6248855cfef8.json | 313 + benchmarks/run_benchmark.py | 17 +- benchmarks/speed_benchmark.py | 62 +- benchmarks/tools.py | 64 + pyproject.toml | 2 + uv.lock | 334 + 15 files changed, 11524 insertions(+), 236 deletions(-) create mode 100644 assets/images/recall_vs_tokens.png create mode 100644 benchmarks/context_efficiency.py create mode 100644 benchmarks/results/context-efficiency-judge-6248855cfef8.json create mode 100644 benchmarks/results/context-efficiency-recall-6248855cfef8.json create mode 100644 benchmarks/tools.py diff --git a/assets/images/recall_vs_tokens.png b/assets/images/recall_vs_tokens.png new file mode 100644 index 0000000000000000000000000000000000000000..83e153c88d3d7501e3d608a6bffd90ed326045cc GIT binary patch literal 62621 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 Across a 198-query category-balanced sample judged by GPT-5-mini, semble's retrieved context is sufficient to answer **88%** of queries at 2k tokens. A grep-based agent that first asks an LLM to extract grep-friendly keywords from the query (the strongest realistic baseline — closer to what Claude Code and OpenCode actually do) reaches **71%** but spends ~11k tokens reading candidate files. The raw retrieval-token saving is **81%** vs keyword grep and **50%** vs naive grep; including a pessimistic fallback model that adds the cost of redoing grep on a miss, end-to-end savings are **77%** and **69%** respectively. + +![Recall vs. retrieved tokens](../assets/images/recall_vs_tokens.png) + +### Answer sufficiency (LLM-as-judge) + +For each query we hand the retrieved context to GPT-5-mini and ask whether it contains enough relevant code to answer the query. Sample is 198 queries, balanced 66/66/66 across categories (note: the underlying benchmark is imbalanced 703/344/204 semantic/architecture/symbol; the macro-balanced sample is more conservative for semble's claim, since proportional sampling would weight the harder semantic category higher). Three retrieval workflows: + +- **semble** — top-K chunks, hard-capped at 2k tokens. +- **keyword-grep+read** — gpt-5-mini extracts 1–3 grep-friendly terms from the query, joined as a regex (`term1|term2`); the agent reads the top-20 matched files in full, hard-capped at 16k tokens. Mirrors how Claude Code and OpenCode actually use grep. +- **grep+read (naive)** — the raw query string is passed verbatim to `rg --fixed-strings`; matching files are read in full, hard-capped at 16k tokens. Strawman included for comparison. + +All three workflows search the same file universe — semble's indexed code-file extensions, with `node_modules`, `dist`, `build`, `.venv`, etc. excluded. + +| Method | Budget | Answer rate | Mean tokens retrieved | Raw token reduction vs semble | Expected end-to-end tokens† | +|---|---:|---:|---:|---:|---:| +| **semble** | 2k | **0.879** | 2,000 | — | **2,906** | +| keyword-grep+read | 16k | 0.712 | 10,595 | 81.1% | 12,747 | +| grep+read (naive) | 16k | 0.293 | 3,996 | 50.0% | 9,281 | + +**Raw retrieval reduction:** 81.1% vs keyword-grep, 50.0% vs naive grep. +**End-to-end reduction (with fallback model):** 77.2% vs keyword-grep, 68.7% vs naive grep. + +†The end-to-end column adds a uniform fallback term `(1 − answer_rate) × 7,474` to every method, modeling the agent redoing a grep workflow on a miss. The constant 7,474 is the median tokens grep+read spends to surface a relevant file. Sweeping it 3k–16k gives an end-to-end reduction range of **61–74% vs naive grep** and **74–79% vs keyword grep** (recomputed from the saved artifact), so the conclusion is not load-bearing on this constant. The raw retrieval reduction is the model-free comparison. + +**Answer rate by query category:** + +| Category | semble | keyword-grep+read | naive grep | +|---|---:|---:|---:| +| symbol (named entity lookup) | 0.97 | 0.94 | 0.86 | +| semantic (behavior / concept) | 0.85 | 0.52 | 0.02 | +| architecture (design / structure) | 0.82 | 0.68 | 0.00 | + +Keyword extraction closes the gap on symbol queries, helps substantially on semantic and architecture — but at ~5× the retrieval token cost (full file reads, top-20 candidates), so the end-to-end gap remains large. + +### Recall at fixed token budgets + +A coarser, label-based view across the full 1,251-query benchmark: a relevant file is "covered" once any retrieved unit comes from it. + +| Method | 500 | 1k | 2k | 4k | 8k | 16k | 32k | +|---|---:|---:|---:|---:|---:|---:|---:| +| **semble** | **0.684** | **0.848** | **0.936** | **0.976** | **0.991** | **0.996** | **0.996** | +| grep + read file | 0.000 | 0.007 | 0.023 | 0.042 | 0.076 | 0.101 | 0.127 | +| ripgrep -C 8 | 0.069 | 0.091 | 0.107 | 0.117 | 0.131 | 0.143 | 0.150 | + +

+Methodology + +**Retrieval units.** For each query we retrieve units in rank order — semble chunks for semble, full files (in match-count order) for `grep + read file`, merged context windows for `ripgrep -C N` — and accumulate tokens (`cl100k_base` via `tiktoken`). Naive `grep` is run with `--fixed-strings --ignore-case` on the raw query. The keyword variant first asks gpt-5-mini for 1–3 search terms (joined as a regex `|`); patterns that fail an identifier-token sanity check fall back to `re.escape(query)`. Both grep variants are scoped via `--glob` to the same code-file extensions and ignored directories that semble's file walker uses, so all three workflows search the same corpus. + +**Budget enforcement (judge mode only).** In the LLM-as-judge eval each context is hard-capped at its stated budget: the candidate string is encoded once, then sliced by token IDs and asserted `len(ids) ≤ budget`. The recall mode below does not truncate; its curves record cumulative tokens of whole retrieved units, which is the right shape for "tokens to surface the answer." + +**Sample policy.** The judge sample is **macro-balanced** — 66 queries per category — not proportional to the underlying 703/344/204 split. This is conservative for semble's claim: a proportional sample would overweight semantic queries (where grep does worst) and inflate the headline. The recall benchmark below uses all 1,251 queries with no rebalancing. + +**Sensitivity of the top-20 file cap.** Sweeping top-{5, 10, 20, 50} on the same sample (saved alongside the default cap in the same artifact), keyword-grep+read answer rates fall in 71.2–72.7% and the end-to-end reduction range is 76.3–77.2%. The cap is bounded by the 16k token budget, not the file count, so the choice is not load-bearing. + +**Sufficiency judging.** GPT-5-mini sees the query and the retrieved context (capped at the per-method budget) and answers a strict yes/no on whether the context contains code that directly addresses the query. + +**End-to-end cost model.** `expected_cost = retrieval_tokens + (1 − answer_rate) × fallback_tokens`. The fallback is set to 7,474 tokens — the median tokens grep+read spends to surface a relevant file, derived from the recall benchmark. This is *pessimistic* for semble: it assumes the agent rebuilds context from scratch on every miss, with no credit for chunks semble already returned. + +**Recall.** A relevant file is "covered" once any retrieved unit comes from it. Most labels are file-level; where line spans are present we require span overlap. + +
+ ## Ablations `raw` returns retrieval scores directly; `+ ranking` feeds them through semble's hybrid ranker. @@ -190,6 +259,28 @@ uv run python -m benchmarks.baselines.coderankembed --mode semantic +
+Context-efficiency benchmark + +Requires the `benchmark` extra (`uv sync --extra benchmark`), `rg` on `$PATH`, and an `OPENAI_API_KEY` environment variable (used for keyword extraction and the LLM-as-judge baseline; `--no-keyword` skips it for the recall mode). + +```bash +# Recall vs. token-budget across all queries; plots automatically. +uv run python -m benchmarks.context_efficiency recall +uv run python -m benchmarks.context_efficiency recall --repo fastapi --no-keyword + +# LLM-as-judge sufficiency on a stratified sample. +uv run python -m benchmarks.context_efficiency judge --sample 200 +uv run python -m benchmarks.context_efficiency judge --sample 200 --keyword-caps 5 10 20 50 + +# Regenerate the plot from a saved recall payload. +uv run python -m benchmarks.context_efficiency plot +``` + +Writes `benchmarks/results/context-efficiency-{recall,judge}-.json` and `assets/images/recall_vs_tokens.png`. + +
+
Plots diff --git a/benchmarks/baselines/ablations.py b/benchmarks/baselines/ablations.py index 3969b28..348c962 100644 --- a/benchmarks/baselines/ablations.py +++ b/benchmarks/baselines/ablations.py @@ -11,11 +11,11 @@ from benchmarks.data import ( RepoSpec, Task, - apply_task_filters, - available_repo_specs, + add_filter_args, grouped_tasks, - load_tasks, + load_filtered_tasks, save_results, + summarize_modes, ) from benchmarks.metrics import ndcg_at_k, target_rank from semble import SembleIndex @@ -163,12 +163,10 @@ def _bench( def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="semble ablation benchmarks.") - parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") - parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") + add_filter_args(parser, verbose=True) parser.add_argument( "--mode", action="append", default=[], choices=_MODES, help="Mode(s) to evaluate (default: all)." ) - parser.add_argument("--verbose", action="store_true", help="Print per-query results.") return parser.parse_args() @@ -177,12 +175,7 @@ def main() -> None: args = _parse_args() modes = args.mode or _MODES - repo_specs = available_repo_specs() - tasks = apply_task_filters( - load_tasks(repo_specs=repo_specs), repos=args.repo or None, languages=args.language or None - ) - if not tasks: - raise SystemExit("No benchmark tasks matched the requested filters.") + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) print("Loading model...", file=sys.stderr) started = time.perf_counter() @@ -210,21 +203,7 @@ def main() -> None: summary = { "tool": "semble-ablations", "model": _DEFAULT_MODEL_NAME, - "by_mode": { - mode: { - "avg_ndcg10": round( - sum(r.ndcg10 for r in results if r.mode == mode) - / max(1, sum(1 for r in results if r.mode == mode)), - 4, - ), - "avg_p50_ms": round( - sum(r.p50_ms for r in results if r.mode == mode) - / max(1, sum(1 for r in results if r.mode == mode)), - 1, - ), - } - for mode in modes - }, + "by_mode": summarize_modes(results, modes), "repos": [asdict(r) for r in results], } print(json.dumps(summary, indent=2)) diff --git a/benchmarks/baselines/coderankembed.py b/benchmarks/baselines/coderankembed.py index ee4035a..b96ba32 100644 --- a/benchmarks/baselines/coderankembed.py +++ b/benchmarks/baselines/coderankembed.py @@ -3,6 +3,7 @@ import sys import time from collections import defaultdict +from collections.abc import Sequence from dataclasses import asdict, dataclass, field from pathlib import Path @@ -12,16 +13,16 @@ from benchmarks.data import ( RepoSpec, Task, - apply_task_filters, - available_repo_specs, + add_filter_args, grouped_tasks, - load_tasks, + load_filtered_tasks, results_path, save_results, + summarize_modes, ) from benchmarks.metrics import ndcg_at_k, target_rank from semble import SembleIndex -from semble.types import SearchResult +from semble.types import EmbeddingMatrix, SearchResult _MODEL_NAME = "nomic-ai/CodeRankEmbed" _TOP_K = 10 @@ -29,21 +30,18 @@ class _AsymmetricWrapper: - """Wrap SentenceTransformer with asymmetric query/document prompts. - - Single-element lists are treated as queries; larger batches as documents. - max_seq_length is capped to avoid OOM on CPU with long chunks. - """ + """Wrap SentenceTransformer with asymmetric query/document prompts.""" def __init__(self, model: SentenceTransformer, max_seq_length: int = 512) -> None: self._model = model self._model.max_seq_length = max_seq_length - def encode(self, texts: list[str]) -> np.ndarray: + def encode(self, texts: Sequence[str], /) -> EmbeddingMatrix: """Encode texts with query or document prompt based on batch size.""" - if len(texts) == 1: - return self._model.encode(texts, prompt_name="query", batch_size=1) # type: ignore[return-value] - return self._model.encode(texts, batch_size=1) # type: ignore[return-value] + text_list = list(texts) + if len(text_list) == 1: + return self._model.encode(text_list, prompt_name="query", batch_size=1) # type: ignore[return-value] + return self._model.encode(text_list, batch_size=1) # type: ignore[return-value] @dataclass(frozen=True) @@ -115,21 +113,7 @@ def _build_summary(results: list[RepoResult], modes: list[str]) -> dict[str, obj return { "tool": "coderankembed", "model": _MODEL_NAME, - "by_mode": { - mode: { - "avg_ndcg10": round( - sum(result.ndcg10 for result in results if result.mode == mode) - / max(1, sum(1 for result in results if result.mode == mode)), - 4, - ), - "avg_p50_ms": round( - sum(result.p50_ms for result in results if result.mode == mode) - / max(1, sum(1 for result in results if result.mode == mode)), - 1, - ), - } - for mode in modes - }, + "by_mode": summarize_modes(results, modes), "repos": [asdict(result) for result in results], } @@ -227,12 +211,10 @@ def _bench( def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Benchmark CodeRankEmbed on the semble benchmark suite.") - parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") - parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") + add_filter_args(parser, verbose=True) parser.add_argument( "--mode", action="append", default=[], choices=["semantic", "hybrid"], help="Search mode(s) (default: both)." ) - parser.add_argument("--verbose", action="store_true", help="Print per-query results.") return parser.parse_args() @@ -242,12 +224,7 @@ def main() -> None: modes = args.mode or ["semantic", "hybrid"] is_full_run = not args.repo and not args.language - repo_specs = available_repo_specs() - tasks = apply_task_filters( - load_tasks(repo_specs=repo_specs), repos=args.repo or None, languages=args.language or None - ) - if not tasks: - raise SystemExit("No benchmark tasks matched the requested filters.") + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) print(f"Loading {_MODEL_NAME}...", file=sys.stderr) started = time.perf_counter() diff --git a/benchmarks/baselines/colgrep.py b/benchmarks/baselines/colgrep.py index 534b347..9adc1fc 100644 --- a/benchmarks/baselines/colgrep.py +++ b/benchmarks/baselines/colgrep.py @@ -9,14 +9,14 @@ from benchmarks.data import ( RepoSpec, Task, - apply_task_filters, - available_repo_specs, + add_filter_args, grouped_tasks, - load_tasks, + load_filtered_tasks, results_path, save_results, ) from benchmarks.metrics import file_rank, ndcg_at_k +from benchmarks.tools import run_colgrep_files _COLGREP = "colgrep" _TOP_K = 10 @@ -34,25 +34,6 @@ class RepoResult: index_ms: float -def _run_colgrep(query: str, benchmark_dir: Path, top_k: int, *, code_only: bool = True) -> list[str]: - """Return list of absolute file paths from colgrep JSON output.""" - cmd = [_COLGREP, "--force-cpu"] - if code_only: - cmd.append("--code-only") - cmd += ["--json", "-k", str(top_k), query, str(benchmark_dir)] - try: - proc = subprocess.run(cmd, capture_output=True, text=True, timeout=30) - except subprocess.TimeoutExpired: - return [] - if proc.returncode != 0: - return [] - try: - data = json.loads(proc.stdout) - except json.JSONDecodeError: - return [] - return [item["unit"]["file"] for item in data if "unit" in item and "file" in item["unit"]] - - def _evaluate_repo( tasks: list[Task], benchmark_dir: Path, *, code_only: bool = True, verbose: bool = False ) -> tuple[float, float]: @@ -65,7 +46,7 @@ def _evaluate_repo( file_paths: list[str] = [] for _ in range(_LATENCY_RUNS): started = time.perf_counter() - file_paths = _run_colgrep(task.query, benchmark_dir, _TOP_K, code_only=code_only) + file_paths = run_colgrep_files(task.query, benchmark_dir, top_k=_TOP_K, code_only=code_only) query_latencies.append((time.perf_counter() - started) * 1000) latencies.append(sorted(query_latencies)[_LATENCY_RUNS // 2]) @@ -88,11 +69,7 @@ def _evaluate_repo( def _init_index(path: Path) -> tuple[bool, float]: - """Build (or rebuild) the colgrep index at path; return (non_empty, elapsed_ms). - - :param path: Directory to index. - :return: Tuple of (non_empty, index_ms) where non_empty is False if colgrep reported 0 files. - """ + """Build the ColGREP index and return whether it indexed files plus elapsed time.""" subprocess.run([_COLGREP, "clear", str(path)], capture_output=True, timeout=30) cmd = [_COLGREP, "init", "--force-cpu", "-y", str(path)] started = time.perf_counter() @@ -106,14 +83,7 @@ def _init_index(path: Path) -> tuple[bool, float]: def _resolve_path(spec: RepoSpec) -> tuple[Path, float]: - """Return the path ColGREP should index and elapsed index build time. - - Tries benchmark_dir first; if that yields 0 files falls back to checkout_dir, - which is the project root ColGREP needs to discover the .git boundary. - - :param spec: Repo spec providing benchmark_dir and checkout_dir. - :return: Tuple of (effective_path, index_ms). - """ + """Return the path ColGREP should index and elapsed index build time.""" path = spec.benchmark_dir ok, index_ms = _init_index(path) if ok: @@ -174,9 +144,7 @@ def _load_completed(out_path: Path) -> dict[str, RepoResult]: def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Benchmark ColGREP on the semble benchmark suite.") - parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") - parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") - parser.add_argument("--verbose", action="store_true", help="Print per-query results.") + add_filter_args(parser, verbose=True) parser.add_argument( "--no-code-only", action="store_true", @@ -229,12 +197,7 @@ def main() -> None: args = _parse_args() is_full_run = not args.repo and not args.language - repo_specs = available_repo_specs() - tasks = apply_task_filters( - load_tasks(repo_specs=repo_specs), repos=args.repo or None, languages=args.language or None - ) - if not tasks: - raise SystemExit("No benchmark tasks matched the requested filters.") + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) repo_tasks = grouped_tasks(tasks) diff --git a/benchmarks/baselines/ripgrep.py b/benchmarks/baselines/ripgrep.py index 724ab90..94077f9 100644 --- a/benchmarks/baselines/ripgrep.py +++ b/benchmarks/baselines/ripgrep.py @@ -1,6 +1,5 @@ import argparse import json -import subprocess import sys import time from dataclasses import dataclass @@ -8,15 +7,14 @@ from benchmarks.data import ( Task, - apply_task_filters, - available_repo_specs, + add_filter_args, grouped_tasks, - load_tasks, + load_filtered_tasks, save_results, ) from benchmarks.metrics import file_rank, ndcg_at_k +from benchmarks.tools import run_ripgrep_count -_RG = "rg" _TOP_K = 10 _LATENCY_RUNS = 3 @@ -31,36 +29,6 @@ class RepoResult: p50_ms: float -def _run_ripgrep(query: str, benchmark_dir: Path, *, fixed_strings: bool = True) -> list[str]: - """Return file paths sorted by match count descending (rg --count output).""" - cmd = [_RG, "--count", "--no-heading", "--ignore-case", "--hidden", "--glob", "!.git"] - if fixed_strings: - cmd.append("--fixed-strings") - cmd += [query, str(benchmark_dir)] - - try: - proc = subprocess.run(cmd, capture_output=True, text=True, timeout=30) - except subprocess.TimeoutExpired: - return [] - if proc.returncode not in (0, 1): - return [] - - entries: list[tuple[str, int]] = [] - for line in proc.stdout.splitlines(): - line = line.strip() - if not line: - continue - *path_parts, count_str = line.split(":") - try: - count = int(count_str) - except ValueError: - continue - entries.append((":".join(path_parts), count)) - - entries.sort(key=lambda entry: -entry[1]) - return [path for path, _ in entries[:_TOP_K]] - - def _evaluate_repo( tasks: list[Task], benchmark_dir: Path, @@ -77,7 +45,7 @@ def _evaluate_repo( file_paths: list[str] = [] for _ in range(_LATENCY_RUNS): started = time.perf_counter() - file_paths = _run_ripgrep(task.query, benchmark_dir, fixed_strings=fixed_strings) + file_paths = run_ripgrep_count(task.query, benchmark_dir, top_k=_TOP_K, fixed_strings=fixed_strings) query_latencies.append((time.perf_counter() - started) * 1000) latencies.append(sorted(query_latencies)[_LATENCY_RUNS // 2]) @@ -99,9 +67,7 @@ def _evaluate_repo( def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Benchmark ripgrep on the semble benchmark suite.") - parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") - parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") - parser.add_argument("--verbose", action="store_true", help="Print per-query results.") + add_filter_args(parser, verbose=True) parser.add_argument( "--no-fixed-strings", dest="fixed_strings", @@ -116,12 +82,7 @@ def main() -> None: """Run the ripgrep baseline benchmark.""" args = _parse_args() - repo_specs = available_repo_specs() - tasks = apply_task_filters( - load_tasks(repo_specs=repo_specs), repos=args.repo or None, languages=args.language or None - ) - if not tasks: - raise SystemExit("No benchmark tasks matched the requested filters.") + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) mode_label = "fixed-strings" if args.fixed_strings else "regex" print(f"ripgrep ({mode_label})", file=sys.stderr) diff --git a/benchmarks/context_efficiency.py b/benchmarks/context_efficiency.py new file mode 100644 index 0000000..d00719f --- /dev/null +++ b/benchmarks/context_efficiency.py @@ -0,0 +1,837 @@ +import argparse +import asyncio +import json +import random +import re +import subprocess +import sys +import time +from collections import Counter, defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Any, TypeAlias + +import matplotlib.pyplot as plt +import matplotlib.ticker as ticker +import numpy as np +import tiktoken +from model2vec import StaticModel +from openai import AsyncOpenAI + +from benchmarks.data import ( + Target, + Task, + add_filter_args, + grouped_tasks, + load_filtered_tasks, + save_results, + target_matches_location, +) +from semble import SembleIndex +from semble.index.dense import _DEFAULT_MODEL_NAME +from semble.index.file_walker import DEFAULT_IGNORED_DIRS, FILE_TYPES, FileCategory +from semble.types import Chunk + +_RG_INCLUDE_GLOBS: tuple[str, ...] = tuple( + f"*{ext}" for ext, spec in FILE_TYPES.items() if spec.category == FileCategory.CODE +) +_RG_EXCLUDE_GLOBS: tuple[str, ...] = tuple(f"!{d}" for d in DEFAULT_IGNORED_DIRS) + +_BUDGETS = (500, 1000, 2000, 4000, 8000, 16000, 32000) +_PLOT_BUDGETS = sorted({int(b) for b in np.logspace(np.log10(100), np.log10(64000), 60)}) +_TOKENIZER_NAME = "cl100k_base" +_RG_CONTEXTS = (8,) +_RG_MAX_MATCHES = 500 +_SEMBLE_TOP_K = 50 +_KEYWORD_MAX_FILES = 20 +_KEYWORD_MODEL = "gpt-5-mini" +_KEYWORD_CONCURRENCY = 16 +_JUDGE_MODEL = "gpt-5-mini" +_JUDGE_CONCURRENCY = 8 +_JUDGE_RETRIES = 3 +_JUDGE_DEFAULT_SAMPLE = 200 +_JUDGE_SEMBLE_BUDGET = 2000 +_JUDGE_GREP_BUDGET = 16000 + +_IMAGES_DIR = Path(__file__).parent.parent / "assets" / "images" +_RESULTS_DIR = Path(__file__).parent / "results" + +_KEYWORD_PROMPT = """\ +Extract 1–3 grep-friendly search terms from the code search query below. +Terms will be joined with | and used as a ripgrep regex pattern (not fixed strings). +Prefer specific identifiers, class names, or technical keywords over generic words. +Return only the pipe-separated terms — no explanation, no quotes, no punctuation. + +Examples: + flat_hash_map → flat_hash_map + absl::flat_hash_map and flat_hash_set containers → flat_hash_map|flat_hash_set + how does authentication middleware work → middleware|authentication + request lifecycle and error handling → lifecycle|error_handling + how are worker threads managed → worker_thread|thread_pool|ThreadPool + +Query: {query} +Terms:\ +""" + +_JUDGE_PROMPT = """\ +You are evaluating whether retrieved code context is sufficient to answer a code search query. + +A code agent ran a search for the query below and got back the retrieved context shown. \ +Decide whether that context contains enough relevant code for an engineer to give a substantive \ +answer to the query (showing how something is implemented, where it lives, or how it works). + +Reply YES if the context contains code that directly addresses the query. +Reply NO if the context is empty, off-topic, or only tangentially related. + +Reply with exactly one word: YES or NO. + +Query: {query} + +Retrieved context: +{context} +""" + + +Curve: TypeAlias = list[tuple[int, int]] +MethodCurves: TypeAlias = list[tuple[Curve, int]] + + +@dataclass(frozen=True) +class JudgeRecord: + """One LLM-judge sufficiency verdict.""" + + repo: str + query: str + category: str + method: str + tokens_used: int + answered: bool + + +def _semble_units(index: SembleIndex, query: str) -> list[Chunk]: + """Top-K semble chunks as units, ordered by score.""" + return [r.chunk for r in index.search(query, top_k=_SEMBLE_TOP_K)] + + +def _rg_command(pattern: str, repo_dir: Path, *, fixed_strings: bool) -> list[str]: + """Build the rg command line, scoped to the same code-file universe semble indexes.""" + cmd = ["rg", "--json"] + if fixed_strings: + cmd.append("--fixed-strings") + cmd.append("--ignore-case") + for glob in (*_RG_EXCLUDE_GLOBS, *_RG_INCLUDE_GLOBS): + cmd += ["--glob", glob] + cmd += [pattern, str(repo_dir)] + return cmd + + +def _rg_matches(pattern: str, repo_dir: Path, *, fixed_strings: bool) -> list[tuple[str, int]]: + """Return (file_path, line_number) matches via rg --json, in rg's output order.""" + try: + proc = subprocess.run( + _rg_command(pattern, repo_dir, fixed_strings=fixed_strings), + capture_output=True, + text=True, + timeout=30, + ) + except subprocess.TimeoutExpired: + return [] + if proc.returncode not in (0, 1): + return [] + matches: list[tuple[str, int]] = [] + for line in proc.stdout.splitlines(): + if not line: + continue + try: + evt = json.loads(line) + except json.JSONDecodeError: + continue + if evt.get("type") != "match": + continue + data = evt.get("data", {}) + path = data.get("path", {}).get("text") + ln = data.get("line_number") + if path and isinstance(ln, int): + matches.append((path, ln)) + return matches + + +def _ripgrep_units(query: str, repo_dir: Path, context: int) -> list[Chunk]: + """Ripgrep windows: files ranked by match count desc, windows merged within file.""" + matches = _rg_matches(query, repo_dir, fixed_strings=True) + if not matches: + return [] + per_file: dict[str, list[int]] = defaultdict(list) + for path, ln in matches[:_RG_MAX_MATCHES]: + per_file[path].append(ln) + ranked = sorted(per_file.items(), key=lambda kv: (-len(kv[1]), kv[0])) + units: list[Chunk] = [] + for path, lines in ranked: + windows: list[list[int]] = [] + for ln in sorted(set(lines)): + start, end = max(1, ln - context), ln + context + if windows and start <= windows[-1][1] + 1: + windows[-1][1] = max(windows[-1][1], end) + else: + windows.append([start, end]) + try: + file_lines = Path(path).read_text(encoding="utf-8", errors="replace").splitlines() + except OSError: + continue + for start, end in windows: + end_clamped = min(end, len(file_lines)) + text = "\n".join(file_lines[start - 1 : end_clamped]) + units.append(Chunk(content=text, file_path=path, start_line=start, end_line=end_clamped)) + return units + + +def _grep_file_units( + pattern: str, + repo_dir: Path, + *, + fixed_strings: bool, + max_files: int | None = None, +) -> list[Chunk]: + """Return whole matched files in match-count order.""" + matches = _rg_matches(pattern, repo_dir, fixed_strings=fixed_strings) + if not matches: + return [] + ranked = sorted(Counter(path for path, _ in matches[:_RG_MAX_MATCHES]).items(), key=lambda kv: (-kv[1], kv[0])) + if max_files is not None: + ranked = ranked[:max_files] + units: list[Chunk] = [] + for path, _ in ranked: + try: + text = Path(path).read_text(encoding="utf-8", errors="replace") + except OSError: + continue + units.append(Chunk(content=text, file_path=path, start_line=1, end_line=text.count("\n") + 1)) + return units + + +def _keyword_method(cap: int) -> str: + """Return the method label for a keyword-grep file cap.""" + return "keyword-grep+read" if cap == _KEYWORD_MAX_FILES else f"keyword-grep+read-top{cap}" + + +def _retrieval_units_for_task( + index: SembleIndex, + task: Task, + repo_dir: Path, + *, + keywords: dict[str, str] | None, + keyword_caps: tuple[int, ...] = (_KEYWORD_MAX_FILES,), + include_ripgrep: bool = False, +) -> list[tuple[str, list[Chunk]]]: + """Return retrieval-method units for a task in benchmark order.""" + methods = [ + ("semble", _semble_units(index, task.query)), + ("grep+read", _grep_file_units(task.query, repo_dir, fixed_strings=True)), + ] + if keywords is not None: + pattern = keywords.get(task.query, task.query) + methods.extend( + (_keyword_method(cap), _grep_file_units(pattern, repo_dir, fixed_strings=False, max_files=cap)) + for cap in keyword_caps + ) + if include_ripgrep: + methods.extend((f"ripgrep-c{c}", _ripgrep_units(task.query, repo_dir, c)) for c in _RG_CONTEXTS) + return methods + + +_KEYWORD_TOKEN_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_:.\-]{0,63}$") + + +def _sanitize_keywords(pattern: str) -> str | None: + """Accept a pipe-joined regex pattern only if every segment is an identifier-like token.""" + parts = [p.strip() for p in pattern.split("|") if p.strip()] + if not parts or len(parts) > 5: + return None + if not all(_KEYWORD_TOKEN_RE.match(p) for p in parts): + return None + return "|".join(parts) + + +async def _extract_keyword_pattern(query: str, client: AsyncOpenAI) -> str: + """Ask the LLM for 1–3 pipe-separated grep terms; sanitize, fall back to re.escape(query) on failure.""" + fallback = re.escape(query) + try: + resp = await client.responses.create( + model=_KEYWORD_MODEL, + input=_KEYWORD_PROMPT.format(query=query), + reasoning={"effort": "minimal"}, + ) + raw = (resp.output_text or "").strip().strip('"').strip("'") + sanitized = _sanitize_keywords(raw) + return sanitized if sanitized is not None else fallback + except Exception: # noqa: BLE001 + return fallback + + +async def _prefetch_keywords(queries: list[str]) -> dict[str, str]: + """Return {query: regex_pattern} for all unique queries via LLM keyword extraction.""" + unique = list(dict.fromkeys(queries)) + client = AsyncOpenAI() + sem = asyncio.Semaphore(_KEYWORD_CONCURRENCY) + results: dict[str, str] = {} + + async def worker(q: str) -> None: + async with sem: + results[q] = await _extract_keyword_pattern(q, client) + + await asyncio.gather(*(worker(q) for q in unique)) + return results + + +def _curve(units: list[Chunk], targets: tuple[Target, ...], enc: Any) -> Curve: + """Cumulative (tokens, covered_target_count) after each retrieved unit, starting at (0, 0).""" + covered = [False] * len(targets) + cumulative = 0 + points: Curve = [(0, 0)] + for unit in units: + cumulative += len(enc.encode(unit.content, disallowed_special=())) + for i, tgt in enumerate(targets): + if not covered[i] and target_matches_location(unit.file_path, unit.start_line, unit.end_line, tgt): + covered[i] = True + points.append((cumulative, sum(covered))) + return points + + +def _recall_at(curve: Curve, budget: int, n_total: int) -> float: + """Recall (covered_targets / n_total) at the largest cumulative-tokens point <= budget.""" + if n_total == 0 or not curve: + return 0.0 + covered_at = 0 + for tokens, covered in curve: + if tokens > budget: + break + covered_at = covered + return covered_at / n_total + + +def _mean_recall_at(curves: MethodCurves, budgets: tuple[int, ...] | list[int]) -> dict[int, float]: + """Mean recall at each budget across all queries.""" + return {b: float(np.mean([_recall_at(c, b, n) for c, n in curves if n > 0])) if curves else 0.0 for b in budgets} + + +def _mean_curve(curves: MethodCurves, grid: list[int]) -> list[float]: + """Mean recall over all queries at each grid budget.""" + samples = [[_recall_at(c, b, n) for b in grid] for c, n in curves if n > 0] + return np.mean(samples, axis=0).tolist() if samples else [0.0] * len(grid) + + +def _tokens_to_first_hit(curve: Curve) -> int | None: + """Cumulative tokens at which the first relevant target is covered, or None if never.""" + for tokens, covered in curve: + if covered > 0: + return tokens + return None + + +def _pairwise_reduction(semble: MethodCurves, other: MethodCurves) -> dict[str, float] | None: + """Median 'tokens to first hit' reduction, paired on queries where both methods hit.""" + pairs: list[tuple[int, int]] = [] + for (s_curve, _), (o_curve, _) in zip(semble, other, strict=True): + s = _tokens_to_first_hit(s_curve) + o = _tokens_to_first_hit(o_curve) + if s is not None and o is not None and o > 0: + pairs.append((s, o)) + if not pairs: + return None + ratios = [s / o for s, o in pairs] + return { + "n_paired": float(len(pairs)), + "median_semble_tokens": float(np.median([s for s, _ in pairs])), + "median_other_tokens": float(np.median([o for _, o in pairs])), + "median_reduction": 1.0 - float(np.median(ratios)), + "mean_reduction": 1.0 - float(np.mean(ratios)), + "semble_better_pct": sum(1 for s, o in pairs if s < o) / len(pairs), + } + + +def _format_context(units: list[Chunk], budget: int, enc: Any) -> tuple[str, int]: + """ + Concatenate units with file headers, hard-capped at budget tokens. + + Greedily appends blocks until the running estimate exceeds budget, then re-encodes the + joined string and slices by token IDs as the final guarantee. + """ + if not units or budget <= 0: + return "(no context retrieved)", 0 + + parts: list[str] = [] + rough_tokens = 0 + for unit in units: + block = f"// {unit.location}\n{unit.content}" + parts.append(block) + rough_tokens += len(enc.encode(block, disallowed_special=())) + 2 # +2 for "\n\n" + if rough_tokens >= budget + 64: + break + + context = "\n\n".join(parts) + ids = enc.encode(context, disallowed_special=()) + if len(ids) > budget: + marker = "\n... [truncated]" + marker_ids = enc.encode(marker, disallowed_special=()) + keep = max(0, budget - len(marker_ids)) + context = enc.decode(ids[:keep]) + marker + ids = enc.encode(context, disallowed_special=()) + if len(ids) > budget: + context = enc.decode(ids[:budget]) + ids = enc.encode(context, disallowed_special=()) + if len(ids) > budget: + raise AssertionError(f"context formatting exceeded budget: {len(ids)} > {budget}") + return context, len(ids) + + +async def _judge_one(client: AsyncOpenAI, query: str, context: str) -> bool | None: + """Call the judge model; return True/False or None on parse failure or repeated errors.""" + prompt = _JUDGE_PROMPT.format(query=query, context=context) + last_err: Exception | None = None + for attempt in range(_JUDGE_RETRIES): + try: + resp = await client.responses.create( + model=_JUDGE_MODEL, + input=prompt, + reasoning={"effort": "minimal"}, + ) + text = (resp.output_text or "").strip().upper() + if text.startswith("Y"): + return True + if text.startswith("N"): + return False + return None + except Exception as exc: # noqa: BLE001 + last_err = exc + await asyncio.sleep(1.5 * (attempt + 1)) + print(f" judge failed after {_JUDGE_RETRIES} retries: {last_err}", file=sys.stderr) + return None + + +async def _judge_many(pending: list[tuple[Task, str, str, int]], concurrency: int) -> list[JudgeRecord]: + """Run judge calls with bounded concurrency.""" + client = AsyncOpenAI() + sem = asyncio.Semaphore(concurrency) + results: list[JudgeRecord | None] = [None] * len(pending) + + async def worker(i: int, task: Task, method: str, context: str, tokens: int) -> None: + async with sem: + verdict = await _judge_one(client, task.query, context) + if verdict is None: + return + results[i] = JudgeRecord( + repo=task.repo, + query=task.query, + category=task.category, + method=method, + tokens_used=tokens, + answered=verdict, + ) + + await asyncio.gather(*(worker(i, *p) for i, p in enumerate(pending))) + return [r for r in results if r is not None] + + +def _stratified_sample(tasks: list[Task], n: int, seed: int) -> list[Task]: + """Sample n tasks stratified across categories.""" + rng = random.Random(seed) + by_cat: dict[str, list[Task]] = defaultdict(list) + for task in tasks: + by_cat[task.category].append(task) + cats = sorted(by_cat) + per_cat = n // len(cats) + picked: list[Task] = [] + for cat in cats: + bucket = by_cat[cat] + rng.shuffle(bucket) + picked.extend(bucket[:per_cat]) + rng.shuffle(picked) + return picked + + +def _evaluate_repo_recall( + index: SembleIndex, + tasks: list[Task], + repo_dir: Path, + enc: Any, + keywords: dict[str, str] | None, +) -> dict[str, MethodCurves]: + """Build per-method curves for every task in the repo.""" + methods: dict[str, MethodCurves] = defaultdict(list) + + for task in tasks: + targets = task.all_relevant + n = len(targets) + for method, units in _retrieval_units_for_task( + index, + task, + repo_dir, + keywords=keywords, + include_ripgrep=True, + ): + methods[method].append((_curve(units, targets, enc), n)) + return dict(methods) + + +def _build_pending_judge( + tasks: list[Task], + repo_specs: dict[str, Any], + model: StaticModel, + enc: Any, + keywords: dict[str, str], + keyword_caps: tuple[int, ...], +) -> list[tuple[Task, str, str, int]]: + """Build (task, method, context, tokens) inputs for the LLM judge across all sampled tasks.""" + pending: list[tuple[Task, str, str, int]] = [] + print(f"\n{'Repo':<22} {'Tasks':>6} {'Time':>8}", file=sys.stderr) + print(f"{'-' * 22} {'-' * 6} {'-' * 8}", file=sys.stderr) + for repo, task_list in sorted(grouped_tasks(tasks).items()): + spec = repo_specs[repo] + started = time.perf_counter() + index = SembleIndex.from_path(spec.benchmark_dir, model=model) + for task in task_list: + for method, units in _retrieval_units_for_task( + index, + task, + spec.benchmark_dir, + keywords=keywords, + keyword_caps=keyword_caps, + ): + budget = _JUDGE_SEMBLE_BUDGET if method == "semble" else _JUDGE_GREP_BUDGET + context, tokens = _format_context(units, budget, enc) + pending.append((task, method, context, tokens)) + print(f"{repo:<22} {len(task_list):>6} {time.perf_counter() - started:>7.1f}s", file=sys.stderr) + return pending + + +def _aggregate_judge(records: list[JudgeRecord], attempted_per_method: dict[str, int]) -> dict[str, dict[str, Any]]: + """Group records by method and compute answer rate, mean tokens, missing-verdict count.""" + by_method: dict[str, list[JudgeRecord]] = defaultdict(list) + for r in records: + by_method[r.method].append(r) + out: dict[str, dict[str, Any]] = {} + for method, attempted in attempted_per_method.items(): + recs = by_method.get(method, []) + n_yes = sum(1 for r in recs if r.answered) + by_cat: dict[str, list[bool]] = defaultdict(list) + for r in recs: + by_cat[r.category].append(r.answered) + out[method] = { + "n": len(recs), + "n_attempted": attempted, + "n_failed": attempted - len(recs), + "answer_rate": n_yes / len(recs) if recs else 0.0, + "mean_tokens_retrieved": float(np.mean([r.tokens_used for r in recs])) if recs else 0.0, + "answer_rate_by_category": {c: sum(v) / len(v) for c, v in sorted(by_cat.items())}, + } + return out + + +_PLOT_STYLE: dict[str, dict[str, object]] = { + "semble": {"label": "semble", "color": "#1a5fa8", "linewidth": 2.4, "zorder": 4}, + "keyword-grep+read": { + "label": "keyword grep + read file", + "color": "#d35400", + "linewidth": 1.8, + "zorder": 3, + "linestyle": "--", + }, + "grep+read": {"label": "naive grep + read file", "color": "#922b21", "linewidth": 1.8, "zorder": 3}, + "ripgrep-c8": { + "label": "ripgrep -C 8 (snippets)", + "color": "#707070", + "linewidth": 1.4, + "zorder": 2, + "linestyle": "--", + }, +} + + +def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: + """Render a recall-vs-tokens curve from a recall-mode payload.""" + plot_data = payload["plot"] + budgets = plot_data["budgets"] + recalls = plot_data["recall"] + n_queries = payload.get("n_queries", "?") + + fig, ax = plt.subplots(figsize=(8, 5)) + fig.patch.set_facecolor("white") + ax.set_facecolor("white") + ax.grid(axis="y", color="#e8e8e8", linewidth=0.7, zorder=0) + ax.grid(axis="x", color="#f0f0f0", linewidth=0.5, zorder=0) + ax.set_axisbelow(True) + for spine in ("top", "right"): + ax.spines[spine].set_visible(False) + for spine in ("left", "bottom"): + ax.spines[spine].set_color("#cccccc") + + for method, style in _PLOT_STYLE.items(): + if method not in recalls: + continue + ax.plot( + budgets, + recalls[method], + label=style["label"], + color=style["color"], + linewidth=style["linewidth"], + linestyle=style.get("linestyle", "-"), + zorder=style["zorder"], + ) + + ax.set_xscale("log") + ax.set_xlim(min(budgets), max(budgets)) + ax.set_ylim(0.0, 1.02) + ax.set_xlabel("Retrieved context tokens", fontsize=10, color="#444444") + ax.set_ylabel("Recall (relevant files surfaced)", fontsize=10, color="#444444") + ax.set_title( + f"Context efficiency: recall vs. retrieved tokens (n={n_queries} queries)", + fontsize=12, + color="#222222", + pad=12, + ) + ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f"{v / 1000:.0f}k" if v >= 1000 else f"{v:.0f}")) + ax.tick_params(labelsize=9, colors="#555555") + ax.legend(loc="lower right", fontsize=9, frameon=True, framealpha=0.95, edgecolor="#dddddd") + fig.tight_layout() + fig.savefig(out_path, dpi=150, bbox_inches="tight") + print(f"Saved plot to {out_path}", file=sys.stderr) + + +def _print_recall_summary(method_curves: dict[str, MethodCurves]) -> dict[str, dict[int, float]]: + """Print and return recall@budget per method.""" + print(f"\nTokenizer: {_TOKENIZER_NAME}\n", file=sys.stderr) + print(f"{'Method':<20} " + " ".join(f"{b:>7}" for b in _BUDGETS), file=sys.stderr) + print(f"{'-' * 20} " + " ".join(f"{'-' * 7:>7}" for _ in _BUDGETS), file=sys.stderr) + summary: dict[str, dict[int, float]] = {} + for method, curves in method_curves.items(): + recall = _mean_recall_at(curves, _BUDGETS) + summary[method] = recall + print(f"{method:<20} " + " ".join(f"{recall[b]:>7.3f}" for b in _BUDGETS), file=sys.stderr) + return summary + + +def _print_first_hit_summary(method_curves: dict[str, MethodCurves]) -> dict[str, dict[str, float]]: + """Print and return pairwise tokens-to-first-hit reductions vs semble.""" + print("\nTokens to first relevant file (semble vs other, paired)", file=sys.stderr) + print(f"{'vs':<20} {'n':>5} {'med-semble':>10} {'med-other':>10} {'med-reduce':>10}", file=sys.stderr) + print(f"{'-' * 20} {'-' * 5} {'-' * 10} {'-' * 10} {'-' * 10}", file=sys.stderr) + reductions: dict[str, dict[str, float]] = {} + for method, curves in method_curves.items(): + if method == "semble": + continue + red = _pairwise_reduction(method_curves["semble"], curves) + if red is None: + continue + reductions[method] = red + print( + f"{method:<20} {int(red['n_paired']):>5} " + f"{red['median_semble_tokens']:>10.0f} {red['median_other_tokens']:>10.0f} " + f"{red['median_reduction']:>10.1%}", + file=sys.stderr, + ) + return reductions + + +def run_recall(args: argparse.Namespace) -> None: + """Run the recall-vs-token-budget benchmark.""" + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) + + print("Loading tokenizer + model...", file=sys.stderr) + enc = tiktoken.get_encoding(_TOKENIZER_NAME) + model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) + + keywords: dict[str, str] | None = None + if not args.no_keyword: + try: + print("Pre-fetching keyword patterns (requires OPENAI_API_KEY)...", file=sys.stderr) + keywords = asyncio.run(_prefetch_keywords([t.query for t in tasks])) + print(f" done ({len(keywords)} unique queries)", file=sys.stderr) + except Exception as exc: # noqa: BLE001 + print(f" keyword pre-fetch failed ({exc}); skipping keyword-grep+read", file=sys.stderr) + + method_curves: dict[str, MethodCurves] = defaultdict(list) + print(f"\n{'Repo':<22} {'Language':<12} {'Tasks':>6} {'Time':>8}", file=sys.stderr) + print(f"{'-' * 22} {'-' * 12} {'-' * 6} {'-' * 8}", file=sys.stderr) + for repo, repo_task_list in sorted(grouped_tasks(tasks).items()): + spec = repo_specs[repo] + started = time.perf_counter() + index = SembleIndex.from_path(spec.benchmark_dir, model=model) + per_method = _evaluate_repo_recall(index, repo_task_list, spec.benchmark_dir, enc, keywords) + for m, lst in per_method.items(): + method_curves[m].extend(lst) + print( + f"{repo:<22} {spec.language:<12} {len(repo_task_list):>6} {time.perf_counter() - started:>7.1f}s", + file=sys.stderr, + ) + + summary = _print_recall_summary(method_curves) + reductions = _print_first_hit_summary(method_curves) + + payload: dict[str, Any] = { + "tool": "context-efficiency-recall", + "tokenizer": _TOKENIZER_NAME, + "budgets": list(_BUDGETS), + "n_queries": len(method_curves["semble"]), + "recall_at_budget": {m: {str(b): round(v, 4) for b, v in r.items()} for m, r in summary.items()}, + "first_hit_reduction": {m: {k: round(v, 4) for k, v in d.items()} for m, d in reductions.items()}, + "plot": { + "budgets": _PLOT_BUDGETS, + "recall": {m: [round(x, 4) for x in _mean_curve(c, _PLOT_BUDGETS)] for m, c in method_curves.items()}, + }, + } + if args.repo or args.language: + print(json.dumps(payload, indent=2)) + return + + out = save_results("context-efficiency-recall", payload) + print(f"\nResults saved to {out}", file=sys.stderr) + if not args.no_plot: + _IMAGES_DIR.mkdir(parents=True, exist_ok=True) + _plot_recall_vs_tokens(payload, _IMAGES_DIR / "recall_vs_tokens.png") + + +def run_judge(args: argparse.Namespace) -> None: + """Run the LLM-as-judge sufficiency benchmark on a stratified sample.""" + repo_specs, tasks = load_filtered_tasks() + sample = _stratified_sample(tasks, args.sample, args.seed) + print(f"Sampled {len(sample)} queries (seed={args.seed})", file=sys.stderr) + + print("Loading model + tokenizer...", file=sys.stderr) + enc = tiktoken.get_encoding(_TOKENIZER_NAME) + model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) + + print("Pre-fetching keyword patterns...", file=sys.stderr) + keywords = asyncio.run(_prefetch_keywords([t.query for t in sample])) + print(f" done ({len(keywords)} unique queries)", file=sys.stderr) + + pending = _build_pending_judge(sample, repo_specs, model, enc, keywords, tuple(args.keyword_caps)) + attempted_per_method: dict[str, int] = defaultdict(int) + for _, method, _, _ in pending: + attempted_per_method[method] += 1 + + print(f"\nJudging {len(pending)} (query, method) pairs with {_JUDGE_MODEL}...", file=sys.stderr) + started = time.perf_counter() + records = asyncio.run(_judge_many(pending, args.concurrency)) + elapsed = time.perf_counter() - started + print(f" done in {elapsed:.1f}s ({len(records)}/{len(pending)} returned a verdict)", file=sys.stderr) + n_missing = len(pending) - len(records) + if n_missing: + print(f" WARNING: {n_missing} verdicts missing — see n_failed per method.", file=sys.stderr) + + summary = _aggregate_judge(records, dict(attempted_per_method)) + print(f"\n{'Method':<24} {'n':>5} {'answer_rate':>12} {'mean_tokens':>12}", file=sys.stderr) + print(f"{'-' * 24} {'-' * 5} {'-' * 12} {'-' * 12}", file=sys.stderr) + for method, info in summary.items(): + print( + f"{method:<24} {info['n']:>5} {info['answer_rate']:>12.3f} {info['mean_tokens_retrieved']:>12.0f}", + file=sys.stderr, + ) + + semble_retrieval = summary.get("semble", {}).get("mean_tokens_retrieved", 0.0) + print("\nRaw retrieval tokens (no fallback model):", file=sys.stderr) + raw_reductions: dict[str, float] = {} + for method, info in summary.items(): + other = info["mean_tokens_retrieved"] + red = 1.0 - semble_retrieval / other if method != "semble" and other > 0 else 0.0 + raw_reductions[method] = red + suffix = f" reduction vs semble: {red:.1%}" if method != "semble" else "" + print(f" {method:<24} {other:>9.0f}{suffix}", file=sys.stderr) + + fallback = args.fallback_tokens + e_costs = {m: s["mean_tokens_retrieved"] + ((1.0 - s["answer_rate"]) * fallback) for m, s in summary.items()} + print(f"\nExpected end-to-end tokens (pessimistic fallback = {fallback:.0f} tokens):", file=sys.stderr) + for method, c in e_costs.items(): + print(f" {method:<24} {c:>9.0f}", file=sys.stderr) + + if "semble" in e_costs: + for method in ("grep+read", "keyword-grep+read"): + if method in e_costs and e_costs[method] > 0: + reduction = 1.0 - e_costs["semble"] / e_costs[method] + print(f"Reduction (semble vs {method}, end-to-end): {reduction:.1%}", file=sys.stderr) + + payload = { + "tool": "context-efficiency-judge", + "judge_model": _JUDGE_MODEL, + "tokenizer": _TOKENIZER_NAME, + "sample_size": len(sample), + "seed": args.seed, + "budgets": {"semble": _JUDGE_SEMBLE_BUDGET, "grep+read": _JUDGE_GREP_BUDGET}, + "fallback_tokens": fallback, + "keyword_patterns": keywords, + "summary": summary, + "raw_retrieval_reduction_vs_semble": {m: round(v, 4) for m, v in raw_reductions.items() if m != "semble"}, + "expected_cost": e_costs, + "records": [ + { + "repo": r.repo, + "query": r.query, + "category": r.category, + "method": r.method, + "tokens": r.tokens_used, + "answered": r.answered, + } + for r in records + ], + } + out = save_results("context-efficiency-judge", payload) + print(f"\nResults saved to {out}", file=sys.stderr) + + +def run_plot(args: argparse.Namespace) -> None: + """Plot recall-vs-tokens from a saved recall-mode payload.""" + matches = sorted(_RESULTS_DIR.glob("context-efficiency-recall-*.json")) + in_path = args.input or (matches[-1] if matches else None) + if in_path is None: + raise SystemExit(f"No recall results found in {_RESULTS_DIR}") + payload = json.loads(in_path.read_text(encoding="utf-8")) + args.output.parent.mkdir(parents=True, exist_ok=True) + _plot_recall_vs_tokens(payload, args.output) + + +def _parse_args() -> argparse.Namespace: + """Parse CLI arguments.""" + parser = argparse.ArgumentParser(description="Context-efficiency benchmark: semble vs grep workflows.") + parser.set_defaults(func=run_recall, repo=[], language=[], no_keyword=False, no_plot=False) + sub = parser.add_subparsers(dest="mode", required=False) + + recall = sub.add_parser("recall", help="Recall vs. token-budget across all queries (default).") + add_filter_args(recall) + recall.add_argument("--no-keyword", action="store_true", help="Skip the LLM keyword-extraction baseline.") + recall.add_argument("--no-plot", action="store_true", help="Skip plotting after the run.") + recall.set_defaults(func=run_recall) + + judge = sub.add_parser("judge", help="LLM-as-judge sufficiency on a stratified sample.") + judge.add_argument("--sample", type=int, default=_JUDGE_DEFAULT_SAMPLE, help="Number of stratified queries.") + judge.add_argument("--seed", type=int, default=42, help="Random seed for sampling.") + judge.add_argument("--concurrency", type=int, default=_JUDGE_CONCURRENCY, help="Concurrent judge calls.") + judge.add_argument( + "--fallback-tokens", + type=float, + default=7474.0, + help="Tokens an agent spends to fall back on a miss (pessimistic default).", + ) + judge.add_argument( + "--keyword-caps", + type=int, + nargs="+", + default=[_KEYWORD_MAX_FILES], + help="Top-N file caps for keyword-grep+read sensitivity sweep.", + ) + judge.set_defaults(func=run_judge) + + plot = sub.add_parser("plot", help="Regenerate the recall-vs-tokens plot from a saved JSON.") + plot.add_argument("--input", type=Path, default=None, help="Path to recall results (default: newest).") + plot.add_argument("--output", type=Path, default=_IMAGES_DIR / "recall_vs_tokens.png", help="Output PNG path.") + plot.set_defaults(func=run_plot) + + return parser.parse_args() + + +def main() -> None: + """Dispatch to the requested mode.""" + args = _parse_args() + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/data.py b/benchmarks/data.py index fb87df7..78e7b28 100644 --- a/benchmarks/data.py +++ b/benchmarks/data.py @@ -1,7 +1,10 @@ +import argparse import json import subprocess +from collections.abc import Sequence from dataclasses import dataclass from pathlib import Path +from typing import Any BENCH_ROOT = Path.home() / ".cache" / "semble-bench" BENCHMARKS_DIR = Path(__file__).parent @@ -140,6 +143,38 @@ def apply_task_filters( return [task for task in filtered if not languages or task.language in languages] +def add_filter_args(parser: argparse.ArgumentParser, *, verbose: bool = False) -> None: + """Add shared benchmark repo/language filter arguments.""" + parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") + parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") + if verbose: + parser.add_argument("--verbose", action="store_true", help="Print per-query results.") + + +def load_filtered_tasks( + repos: list[str] | None = None, languages: list[str] | None = None +) -> tuple[dict[str, RepoSpec], list[Task]]: + """Load available repo specs and matching tasks, exiting if the selection is empty.""" + repo_specs = available_repo_specs() + tasks = apply_task_filters(load_tasks(repo_specs=repo_specs), repos=repos, languages=languages) + if not tasks: + raise SystemExit("No benchmark tasks matched the requested filters.") + return repo_specs, tasks + + +def summarize_modes(results: Sequence[Any], modes: Sequence[str]) -> dict[str, dict[str, float]]: + """Return average NDCG@10 and p50 latency for each mode.""" + summary: dict[str, dict[str, float]] = {} + for mode in modes: + mode_results = [r for r in results if r.mode == mode] + n = len(mode_results) + summary[mode] = { + "avg_ndcg10": round(sum(r.ndcg10 for r in mode_results) / n, 4) if n else 0.0, + "avg_p50_ms": round(sum(r.p50_ms for r in mode_results) / n, 1) if n else 0.0, + } + return summary + + def path_matches(file_path: str, target_path: str) -> bool: """Return True if either path is a suffix of the other (handles absolute vs relative paths).""" norm_file = file_path.replace("\\", "/") @@ -173,11 +208,7 @@ def current_sha() -> str: def results_path(method: str) -> Path: - """Return the path where results for this method and the current HEAD SHA will be saved. - - :param method: Short tool/method label (e.g. 'ripgrep', 'colgrep'). - :return: Path of the form benchmarks/results/-.json. - """ + """Return benchmarks/results/-.json for the current HEAD.""" sha = current_sha() results_dir = BENCHMARKS_DIR / "results" results_dir.mkdir(exist_ok=True) @@ -185,12 +216,7 @@ def results_path(method: str) -> Path: def save_results(method: str, payload: object) -> Path: - """Write payload to benchmarks/results/-.json and return the path. - - :param method: Short tool/method label used as the filename prefix (e.g. 'ripgrep'). - :param payload: JSON-serialisable object to write. - :return: Path to the written file. - """ + """Write JSON results and return the output path.""" out_path = results_path(method) out_path.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8") return out_path diff --git a/benchmarks/results/context-efficiency-judge-6248855cfef8.json b/benchmarks/results/context-efficiency-judge-6248855cfef8.json new file mode 100644 index 0000000..80804f7 --- /dev/null +++ b/benchmarks/results/context-efficiency-judge-6248855cfef8.json @@ -0,0 +1,9804 @@ +{ + "tool": "context-efficiency-judge", + "judge_model": "gpt-5-mini", + "tokenizer": "cl100k_base", + "sample_size": 198, + "seed": 42, + "budgets": { + "semble": 2000, + "grep+read": 16000 + }, + "fallback_tokens": 7474.0, + "keyword_patterns": { + "WebSocket upgrade and handler": "WebSocket\\ upgrade\\ and\\ handler", + "how download requests save responses to disk": "download_request|save_response_to_disk|download_to_file", + "serving a file index page for a folder on disk": "file_index|directory_listing|index_page", + "flow operators map filter transform and collect": "map|filter|collect", + "how middleware chains context transformations between procedures": "middleware|chain|context_transformation", + "how HTTP proxy tunnel CONNECT method is initiated": "CONNECT|HTTP_PROXY|proxy_tunnel", + "ObjectMapper": "ObjectMapper|ObjectMapper::readValue|com.fasterxml.jackson.databind.ObjectMapper", + "Notify": "notify|notification|NotifyListener", + "how SETRANGE modifies a substring within a string value": "how\\ SETRANGE\\ modifies\\ a\\ substring\\ within\\ a\\ string\\ value", + "parameter type coercion and value validation": "type_coercion|value_validation", + "SqlMapper": "SqlMapper", + "how plugin installations and updates are managed with tasks": "plugin_install|plugin_update|task_scheduler", + "how mini.pick implements a fuzzy finder picker": "mini.pick|fuzzy_finder|picker", + "timer implementation and heap-based scheduling": "timer_impl|heap_scheduler|timing_wheel", + "how the async mutex prevents concurrent access": "async_mutex|AsyncMutex|mutex_async", + "BoxedIntoRoute and type-erased route storage": "BoxedIntoRoute|type-erased|route_storage", + "Uri": "Uri|URI|IUriProvider", + "CommandDefinition": "CommandDefinition", + "jump plugin for bookmarking directories": "jump|bookmark|directory_bookmark", + "AsyncClient": "AsyncClient|Async::Client|AsyncClientImpl", + "JsonReader base class and token reading API": "JsonReader|token|TokenType", + "radix tree path matching": "radix_tree|radix_trie|path_matching", + "how res.redirect builds the Location header and status code": "how\\ res\\.redirect\\ builds\\ the\\ Location\\ header\\ and\\ status\\ code", + "how Monad composes dependent effectful computations with flatMap": "Monad|flatMap|dependent_effects", + "before and after filter hooks for the request lifecycle": "before_filter|after_filter|request_lifecycle", + "test runner worker pool scheduling and execution": "worker_pool|test_runner|scheduling", + "how xmonad handles floating windows separately from tiled ones": "xmonad|floating|tiled", + "how listeners are subscribed and notified after state changes": "listener|subscribe|notify", + "StringUtils": "StringUtils|string_utils|StringUtility", + "how curl decides whether to retry a failed request": "curl_retry|CURLOPT_RETRY|retry_after", + "how backpressure and flow control work in streaming": "backpressure|flow_control|streaming_protocol", + "URL": "url|URL|Uri", + "Sinatra::ShowExceptions": "Sinatra::ShowExceptions", + "InterceptorManager": "InterceptorManager", + "MiddlewareBuilder": "MiddlewareBuilder", + "how query parameters are extracted and decoded from URIs": "query_param|parse_qs|URLDecoder", + "inferProcedureInput": "inferProcedureInput|infer_procedure_input|InferProcedureInput", + "Channel": "Channel|channel_layer|broadcast", + "APIRouter": "APIRouter", + "how discriminated unions select the right model variant": "discriminated_union|tagged_union|variant_selection", + "how Phoenix logs request and response lifecycle events": "Phoenix.Logger|telemetry|Plug.Conn", + "event hooks system": "event_hook|hook_system|event_listener", + "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides": "layout_anchor|anchor_property|layout_guide", + "how HttpRoutes define pattern-matched HTTP request handlers": "HttpRoutes|pattern-matched|request_handler", + "how subword token weights are aggregated for whole-word embeddings": "subword_token|whole_word_embedding|token_weighting", + "rvm ruby version manager plugin": "rvm|ruby-version|rvm-plugin", + "battery level detection for shell prompt": "battery_level|power_supply|upower", + "how app.render resolves views and calls the template engine": "app.render|render_views|template_engine", + "syslog handler for system-level logging": "syslog|SysLogHandler|systemd-journald", + "how type inference extracts input and output types from procedures": "type_inference|input_type|output_type", + "how MethodRouter dispatches GET POST PUT DELETE by HTTP method": "MethodRouter|dispatch|HTTP_METHOD", + "HCursor and cursor navigation for traversing JSON trees": "HCursor|cursor_navigation|JsonCursor", + "how RDB persistence serializes the database to disk": "RDB|persistence|serialize", + "how are static files served": "static_file|static_files|serve_static", + "Kleisli": "Kleisli|kleisli|KleisliArrow", + "Sinatra::Helpers": "Sinatra::Helpers|Sinatra::Base|helpers", + "how nvm_has checks whether a command exists on the system": "nvm_has|nvm_has_function|command_exists", + "how bats should retry a flaky test": "flaky_test|retry_logic|test_retry", + "AnyRouter": "AnyRouter", + "request and response interceptors": "interceptor|request_interceptor|response_interceptor", + "adl_serializer": "adl_serializer", + "toString builder for human-readable object descriptions": "toString|to_string|toStringBuilder", + "spawning and aborting async subprocess commands with uv": "uv_spawn|uv_process_kill|libuv", + "how zls provides goto definition for symbols": "goto_definition|definition_provider|symbol_resolution", + "Utils": "Utils|UtilsImpl|util_namespace", + "Codec combining Encoder and Decoder for bidirectional conversion": "Codec|Encoder|Decoder", + "Mutex": "Mutex|std::mutex|pthread_mutex_t", + "TypeFactory": "TypeFactory", + "how server-sent events and subscriptions are streamed to the client": "server-sent-events|SSE|EventSource", + "how vitest discovers and runs test files": "vitest|vite-plugin-test|testRegex", + "how the PandocMonad typeclass abstracts IO for readers and writers": "PandocMonad|Reader|Writer", + "hub github cli aliases and helpers": "hub|github|cli", + "how toJSONKeyText creates a ToJSONKey instance from a text function": "toJSONKeyText|ToJSONKey|ToJSONKeyHelper", + "RotatingFileHandler": "RotatingFileHandler|RotatingFileHandler.py|RotatingFileHandlerConfig", + "HTTPStatusError": "HTTPStatusError", + "how zls DocumentStore loads and caches Zig source files": "how\\ zls\\ DocumentStore\\ loads\\ and\\ caches\\ Zig\\ source\\ files", + "how curl resolves and connects to a remote host": "curl_resolve|Curl_connect|CURLOPT_RESOLVE", + "basic_json": "basic_json|nlohmann::basic_json|to_json", + "middleware pipeline composition": "middleware|pipeline|composition", + "Application": "Application|App|application.py", + "reducer type definition": "reducer|Reducer|ReducerType", + "how debug.print outputs to stderr for debugging": "debug.print|stderr|debugging", + "FromRequest": "FromRequest|FromRequestParts|axum::extract::FromRequest", + "ssh agent plugin for managing ssh keys": "ssh-agent|ssh-agent-plugin|ssh-key-agent", + "how mini.completion provides LSP-based autocompletion": "mini.completion|LSP|autocompletion", + "node version manager nvm integration": "nvm|node_version_manager|nvmrc", + "how client plugins intercept and transform requests and responses": "client_plugin|intercept_request|transform_response", + "absl::AnyInvocable for move-only callable wrapper": "AnyInvocable|absl::AnyInvocable|move-only", + "case-insensitive hash for request params": "case_insensitive_hash|CaseInsensitiveHash|case_insensitive_map", + "how nvm finds the nearest .nvmrc file by walking up the directory tree": "how\\ nvm\\ finds\\ the\\ nearest\\ \\.nvmrc\\ file\\ by\\ walking\\ up\\ the\\ directory\\ tree", + "how text sections are rendered in the lazy view": "lazy_view|text_section|render_section", + "how zls generates diagnostic errors and warnings": "zls|diagnostic|diagnostics", + "PowerShell completion generation": "powershell_completion|tab_completion|CompletionResult", + "Sinatra::Application": "Sinatra::Application|Sinatra::Base|Sinatra::Delegator", + "BackgroundTasks": "BackgroundTasks|background_task|BackgroundTask", + "Rails::Paths": "Rails::Paths|Rails::Application::Paths|rails_paths", + "how does Flask convert a view return value into a response object": "flask|make_response|flask.Response", + "how route groups and route collections compose routes": "route_group|route_collection|compose_routes", + "Request": "http_request|HTTPRequest|request_handler", + "IMessagePackFormatter": "IMessagePackFormatter|MessagePackFormatter|IMessagePackSerializer", + "how Kleisli composes functions that return monadic values": "Kleisli|monad|bind", + "how Phoenix routes are defined and dispatched to controller actions": "Phoenix.Router|route|controller_action", + "Command": "command|CLI|execute", + "how server trust evaluation handles SSL certificate pinning": "certificate_pinning|ssl_pinning|trust_evaluation", + "how slave keys with expiry are tracked in replication": "replication|slave_keys|expire_keys", + "how the event loop handles file events and time events": "event_loop|file_event|time_event", + "ObjectWriter": "ObjectWriter|ObjectWriter::Write|IObjectWriter", + "how lazy.nvim loads a plugin on demand when its trigger fires": "lazy.nvim|on_event|lazy.require", + "Monad": "Monad|monad|Functor", + "naming conventions for controllers and view modules": "controller|controller_name|view_module", + "how pandoc reads RST reStructuredText documents": "pandoc|reStructuredText|rst", + "BaseHTTPMiddleware": "BaseHTTPMiddleware|BaseHTTPMiddlewareDispatch", + "how PCA reduces embedding dimensionality": "PCA|principal_component_analysis|dimensionality_reduction", + "how tasks that are not Send can run on a single thread": "how\\ tasks\\ that\\ are\\ not\\ Send\\ can\\ run\\ on\\ a\\ single\\ thread", + "how is response validation and serialization applied before sending": "response_validation|response_serialization|serialize_response", + "UDP socket send and receive": "udp_send|udp_receive|recvfrom", + "Args": "Args|argparse|CommandLineParser", + "how app.handle dispatches requests through the middleware stack": "app.handle|middleware_stack|dispatches", + "how curl checks if HTTP If-Modified-Since condition is met": "If-Modified-Since|If-None-Match|curl_conditional_request", + "field_validator": "field_validator|FieldValidator|validate_field", + "saving and loading models from disk": "save_model|load_model|model_checkpoint", + "how the preprocessed test source is evaluated": "preprocessed_test|test_source|evaluate", + "StateManager": "StateManager", + "how proxy settings are read from environment variables": "http_proxy|HTTP_PROXY|no_proxy", + "fake timers and timer mocking utilities": "fake_timers|timer_mock|time_mocking", + "Rack::Response": "Rack::Response|Rack::Request|middleware", + "how Encoder typeclass converts Scala values to JSON": "Encoder|typeclass|toJson", + "how typeMismatch produces an error message for wrong JSON types": "typeMismatch|DecodingError|expected_value_type", + "ConstraintMaker": "ConstraintMaker|MASConstraintMaker|makeConstraints", + "how derive macros parse and apply field-level serde attributes": "derive_macro|serde_attribute|field_attributes", + "available request options and their configuration": "request_options|RequestOptions|request_config", + "how zls computes document scope for variable visibility": "document_scope|variable_visibility|zls", + "how the HTTP transport backend sends requests over the wire": "HTTPTransport|sendRequest|transport_backend", + "how nvm downloads a Node.js tarball from the remote": "nvm|download|tarball", + "how zls traverses the Zig AST to resolve symbol scopes": "Zig|AST|symbol_scope", + "how nvm manages the PATH to point to the active Node.js bin": "nvm|NODE_PATH|node_version_manager", + "value-based deserialization for self-describing formats": "self_describing|value_based_deserialization|self_describing_format", + "how does FastAPI run sync route functions without blocking": "how\\ does\\ FastAPI\\ run\\ sync\\ route\\ functions\\ without\\ blocking", + "Java runtime and OS system property helpers": "System.getProperty|RuntimeMXBean|os.name", + "snapshot testing serialization and comparison": "snapshot_testing|snapshot|serialization", + "decorator API for defining commands, options, and arguments": "decorator|command_decorator|option_argument_decorator", + "Rack::Builder": "Rack::Builder|rackup|config.ru", + "how tRPC procedures are defined and chained with input and output validation": "trpc|procedure|input_output_validation", + "formatter": "formatter|formatting|FormatException", + "res.send body encoding and ETag generation": "res.send|ETag|body_encoding", + "ClientResponse": "ClientResponse|client_response|HttpClientResponse", + "how bats finds a library in the BATS_LIB_PATH": "BATS_LIB_PATH|BATS_LIB|bats_find_library", + "how log records propagate through the handler bubble chain": "log_record|handler_chain|bubble_chain", + "queue connection resolution and connectors": "queue|connector|connection_resolution", + "HttpCookies": "HttpCookies|CookieJar|Set-Cookie", + "SchemaUtils for creating and dropping database tables": "SchemaUtils|createTable|dropTable", + "HTML template rendering": "template_rendering|html_template|template_engine", + "how telescope actions map keys to picker operations": "telescope_actions|map_keys|picker_operations", + "chrono duration and time point formatting": "std::chrono::duration|std::chrono::time_point|strftime", + "static file serving middleware": "static_file|file_server|static_middleware", + "model_validator": "model_validator|ModelValidator|validate_model", + "how pandoc's app module orchestrates reading, filtering, and writing": "pandoc::App|App.hs|Filters", + "TypeAdapter": "TypeAdapter|TypeAdapterFactory|TypeAdapterRuntimeTypeWrapper", + "how binary data is deserialized back into typed C# objects": "BinaryFormatter|BinaryReader|Deserialize", + "how pandoc generates PDF output via LaTeX or other backends": "pandoc|LaTeX|PDF_backend", + "PreparedRequest": "PreparedRequest|PreparedRequestAdapter|PreparedRequestFactory", + "how the router matches path segments to controller/action": "router|path_segment|controller_action", + "mock handler for simulating HTTP responses in tests": "mock_handler|mock_http|fake_http_response", + "CompletionOptions": "CompletionOptions", + "Axios": "Axios|axios.request|axios.create", + "Rails command dispatch and subcommand routing": "Rails\\ command\\ dispatch\\ and\\ subcommand\\ routing", + "combineReducers": "combineReducers|combine_reducers|combine-reducers", + "how Dapper caches parameter and deserializer IL": "Dapper|parameter_cache|deserializer_IL", + "how Applicative combines independent effects": "Applicative|ApplicativeFunctor|zipWithA", + "how axum nests routers and merges router trees": "axum::Router|Router::merge|nest_router", + "running work after returning an HTTP response without blocking": "background_task|deferred_response|post_response_task", + "connection filter chain setup for proxies and TLS": "filter_chain|connection_manager|tls_context", + "how nvm_get_latest fetches the latest available Node.js version": "nvm_get_latest|get_latest|nvm-fetch", + "ZodType": "ZodType|ZodSchema|zod.object", + "how mini.deps manages Neovim plugin installation and updates": "mini.deps|Neovim|plugin_installation", + "Schema": "schema|Schema|DBSchema", + "how Validated accumulates errors across independent computations": "Validated|accumulate_errors|ValidationNel", + "server startup initialization and configuration loading": "server_startup|initialization|configuration_loading", + "createStore": "createStore|configureStore|redux_store", + "streaming JSON reader and token parsing": "streaming_json|json_reader|token_parsing", + "JsonParser": "JsonParser", + "bindActionCreators": "bindActionCreators|redux|react-redux", + "how mini.diff shows inline git diff signs in buffers": "how\\ mini\\.diff\\ shows\\ inline\\ git\\ diff\\ signs\\ in\\ buffers", + "Router": "Router|Routing|route_match", + "DigestAuth": "DigestAuth|DigestAuthentication|HTTPDigest", + "how the handler stack wraps middleware around the HTTP send": "handler_stack|middleware|http_send", + "Serialize": "serialize|Serializer|Serialization", + "axios default configuration and request/response transformers": "axios|default_adapter|transformRequest|transformResponse", + "Ecto.Changeset for validating and transforming data": "Ecto.Changeset|changeset|validate_change", + "applyMiddleware": "applyMiddleware|middleware|redux", + "how type adapter factories are registered and selected for a given type": "type_adapter_factory|TypeAdapterFactory|register_type_adapter", + "ExceptionUtils": "ExceptionUtils|ExceptionUtil|exception_utils", + "boolean conversion and parsing helpers": "boolean_conversion|parse_bool|bool_parser", + "Ecto.Query DSL for composing SQL queries": "Ecto.Query|Ecto.Queryable|from", + "how log handlers are registered and invoked by Logger": "Logger|log_handler|register_handler" + }, + "summary": { + "semble": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.8787878787878788, + "mean_tokens_retrieved": 1999.611111111111, + "answer_rate_by_category": { + "architecture": 0.8181818181818182, + "semantic": 0.8484848484848485, + "symbol": 0.9696969696969697 + } + }, + "grep+read": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.29292929292929293, + "mean_tokens_retrieved": 3996.3585858585857, + "answer_rate_by_category": { + "architecture": 0.0, + "semantic": 0.015151515151515152, + "symbol": 0.8636363636363636 + } + }, + "keyword-grep+read-top5": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.7171717171717171, + "mean_tokens_retrieved": 10132.939393939394, + "answer_rate_by_category": { + "architecture": 0.6818181818181818, + "semantic": 0.5454545454545454, + "symbol": 0.9242424242424242 + } + }, + "keyword-grep+read-top10": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.7272727272727273, + "mean_tokens_retrieved": 10565.38383838384, + "answer_rate_by_category": { + "architecture": 0.7121212121212122, + "semantic": 0.5303030303030303, + "symbol": 0.9393939393939394 + } + }, + "keyword-grep+read": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.7121212121212122, + "mean_tokens_retrieved": 10594.934343434343, + "answer_rate_by_category": { + "architecture": 0.6818181818181818, + "semantic": 0.5151515151515151, + "symbol": 0.9393939393939394 + } + }, + "keyword-grep+read-top50": { + "n": 198, + "n_attempted": 198, + "n_failed": 0, + "answer_rate": 0.7171717171717171, + "mean_tokens_retrieved": 10594.929292929293, + "answer_rate_by_category": { + "architecture": 0.6818181818181818, + "semantic": 0.5303030303030303, + "symbol": 0.9393939393939394 + } + } + }, + "raw_retrieval_reduction_vs_semble": { + "grep+read": 0.4996, + "keyword-grep+read-top5": 0.8027, + "keyword-grep+read-top10": 0.8107, + "keyword-grep+read": 0.8113, + "keyword-grep+read-top50": 0.8113 + }, + "expected_cost": { + "semble": 2905.5505050505053, + "grep+read": 9281.00505050505, + "keyword-grep+read-top5": 12246.79797979798, + "keyword-grep+read-top10": 12603.747474747475, + "keyword-grep+read": 12746.540404040403, + "keyword-grep+read-top50": 12708.78787878788 + }, + "records": [ + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "Mutex", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "abseil-cpp", + "query": "absl::AnyInvocable for move-only callable wrapper", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "aeson", + "query": "how typeMismatch produces an error message for wrong JSON types", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "aiohttp", + "query": "how backpressure and flow control work in streaming", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "aiohttp", + "query": "ClientResponse", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how download requests save responses to disk", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "alamofire", + "query": "how server trust evaluation handles SSL certificate pinning", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "grep+read", + "tokens": 2148, + "answered": true + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 2148, + "answered": true + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 2148, + "answered": true + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 2148, + "answered": true + }, + { + "repo": "axios", + "query": "InterceptorManager", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 2148, + "answered": true + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 2214, + "answered": true + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 2214, + "answered": true + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 2214, + "answered": true + }, + { + "repo": "axios", + "query": "request and response interceptors", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 2214, + "answered": true + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 10824, + "answered": true + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "axios", + "query": "Axios", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 10824, + "answered": true + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "axios", + "query": "axios default configuration and request/response transformers", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "WebSocket upgrade and handler", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "BoxedIntoRoute and type-erased route storage", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "FromRequest", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "how axum nests routers and merges router trees", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "axum", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 10727, + "answered": true + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 10727, + "answered": true + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 10727, + "answered": true + }, + { + "repo": "bash-it", + "query": "jump plugin for bookmarking directories", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 10727, + "answered": true + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 1449, + "answered": true + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 1449, + "answered": true + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 1449, + "answered": true + }, + { + "repo": "bash-it", + "query": "battery level detection for shell prompt", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 1449, + "answered": true + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 12176, + "answered": true + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 14570, + "answered": true + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "bash-it", + "query": "rvm ruby version manager plugin", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 12236, + "answered": true + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 14011, + "answered": true + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "bash-it", + "query": "hub github cli aliases and helpers", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 961, + "answered": true + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 961, + "answered": true + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 961, + "answered": true + }, + { + "repo": "bash-it", + "query": "ssh agent plugin for managing ssh keys", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 961, + "answered": true + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 10760, + "answered": true + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 14340, + "answered": true + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 14340, + "answered": true + }, + { + "repo": "bash-it", + "query": "node version manager nvm integration", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 14340, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how bats should retry a flaky test", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 7015, + "answered": true + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 7015, + "answered": true + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 7015, + "answered": true + }, + { + "repo": "bats-core", + "query": "how the preprocessed test source is evaluated", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 7015, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 9550, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 9550, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 9550, + "answered": true + }, + { + "repo": "bats-core", + "query": "how bats finds a library in the BATS_LIB_PATH", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 9550, + "answered": true + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Monad composes dependent effectful computations with flatMap", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Kleisli", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "cats", + "query": "how Kleisli composes functions that return monadic values", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": false + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "Monad", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Applicative combines independent effects", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "cats", + "query": "how Validated accumulates errors across independent computations", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "chi", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "chi", + "query": "Router", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "Codec combining Encoder and Decoder for bidirectional conversion", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "HCursor and cursor navigation for traversing JSON trees", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 10462, + "answered": true + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 14983, + "answered": true + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 14983, + "answered": true + }, + { + "repo": "circe", + "query": "how Encoder typeclass converts Scala values to JSON", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 14983, + "answered": true + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "parameter type coercion and value validation", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "click", + "query": "decorator API for defining commands, options, and arguments", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 3252, + "answered": true + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 3252, + "answered": true + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 3252, + "answered": true + }, + { + "repo": "cobra", + "query": "PowerShell completion generation", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 3252, + "answered": true + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": false + }, + { + "repo": "cobra", + "query": "Args", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "Command", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": false + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": false + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": false + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": false + }, + { + "repo": "cobra", + "query": "CompletionOptions", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": false + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "StringUtils", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "toString builder for human-readable object descriptions", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "Java runtime and OS system property helpers", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "boolean conversion and parsing helpers", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "commons-lang", + "query": "ExceptionUtils", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": false + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": false + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "curl", + "query": "how HTTP proxy tunnel CONNECT method is initiated", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": false + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl decides whether to retry a failed request", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl resolves and connects to a remote host", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "how curl checks if HTTP If-Modified-Since condition is met", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "curl", + "query": "connection filter chain setup for proxies and TLS", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "CommandDefinition", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "SqlMapper", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "dapper", + "query": "how Dapper caches parameter and deserializer IL", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Schema", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Changeset for validating and transforming data", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "ecto", + "query": "Ecto.Query DSL for composing SQL queries", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "exposed", + "query": "SchemaUtils for creating and dropping database tables", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how res.redirect builds the Location header and status code", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 10023, + "answered": true + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 10023, + "answered": true + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 10023, + "answered": true + }, + { + "repo": "express", + "query": "how app.render resolves views and calls the template engine", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 10023, + "answered": true + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 3953, + "answered": true + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 3953, + "answered": true + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 3953, + "answered": true + }, + { + "repo": "express", + "query": "how app.handle dispatches requests through the middleware stack", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 3953, + "answered": true + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 14712, + "answered": true + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 14712, + "answered": true + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 14712, + "answered": true + }, + { + "repo": "express", + "query": "res.send body encoding and ETag generation", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 14712, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "APIRouter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "grep+read", + "tokens": 9026, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "BackgroundTasks", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how is response validation and serialization applied before sending", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "how does FastAPI run sync route functions without blocking", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "fastapi", + "query": "running work after returning an HTTP response without blocking", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "flask", + "query": "how does Flask convert a view return value into a response object", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "chrono duration and time point formatting", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "fmtlib", + "query": "formatter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "radix tree path matching", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "grep+read", + "tokens": 719, + "answered": true + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "gin", + "query": "HTML template rendering", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "gson", + "query": "TypeAdapter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 923, + "answered": false + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 923, + "answered": false + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 923, + "answered": false + }, + { + "repo": "gson", + "query": "streaming JSON reader and token parsing", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 923, + "answered": false + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 10396, + "answered": true + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "gson", + "query": "JsonParser", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "gson", + "query": "how type adapter factories are registered and selected for a given type", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 8190, + "answered": true + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 8190, + "answered": true + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 8190, + "answered": true + }, + { + "repo": "guzzle", + "query": "available request options and their configuration", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 8190, + "answered": true + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "mock handler for simulating HTTP responses in tests", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 12695, + "answered": true + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "guzzle", + "query": "how the handler stack wraps middleware around the HTTP send", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "http4s", + "query": "Uri", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how query parameters are extracted and decoded from URIs", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 6846, + "answered": true + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 6846, + "answered": true + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 6846, + "answered": true + }, + { + "repo": "http4s", + "query": "how HttpRoutes define pattern-matched HTTP request handlers", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 6846, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "AsyncClient", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "httpx", + "query": "URL", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "grep+read", + "tokens": 11879, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 11879, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 11879, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 11879, + "answered": true + }, + { + "repo": "httpx", + "query": "HTTPStatusError", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 11879, + "answered": true + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "how the HTTP transport backend sends requests over the wire", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "grep+read", + "tokens": 3282, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 3282, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 3282, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 3282, + "answered": true + }, + { + "repo": "httpx", + "query": "DigestAuth", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 3282, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectMapper", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": false + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": false + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "TypeFactory", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": false + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "jackson-databind", + "query": "ObjectWriter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "flow operators map filter transform and collect", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15303, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "kotlinx-coroutines", + "query": "Channel", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "ktor", + "query": "how client plugins intercept and transform requests and responses", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "grep+read", + "tokens": 12425, + "answered": true + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 12425, + "answered": true + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 12425, + "answered": true + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 12425, + "answered": true + }, + { + "repo": "ktor", + "query": "HttpCookies", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 12425, + "answered": true + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 13025, + "answered": true + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "laravel-framework", + "query": "queue connection resolution and connectors", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how plugin installations and updates are managed with tasks", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "spawning and aborting async subprocess commands with uv", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how text sections are rendered in the lazy view", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "lazy.nvim", + "query": "how lazy.nvim loads a plugin on demand when its trigger fires", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "timer implementation and heap-based scheduling", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "libuv", + "query": "UDP socket send and receive", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "IMessagePackFormatter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "messagepack-csharp", + "query": "how binary data is deserialized back into typed C# objects", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.pick implements a fuzzy finder picker", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.completion provides LSP-based autocompletion", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.diff shows inline git diff signs in buffers", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "mini.nvim", + "query": "how mini.deps manages Neovim plugin installation and updates", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how subword token weights are aggregated for whole-word embeddings", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 10014, + "answered": true + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 10014, + "answered": true + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 10014, + "answered": true + }, + { + "repo": "model2vec", + "query": "how PCA reduces embedding dimensionality", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 10014, + "answered": true + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "model2vec", + "query": "saving and loading models from disk", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 3641, + "answered": true + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 3641, + "answered": true + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 3641, + "answered": true + }, + { + "repo": "monolog", + "query": "syslog handler for system-level logging", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 3641, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "grep+read", + "tokens": 1876, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 1876, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 1876, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 1876, + "answered": true + }, + { + "repo": "monolog", + "query": "RotatingFileHandler", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 1876, + "answered": true + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log records propagate through the handler bubble chain", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 5789, + "answered": false + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 14788, + "answered": false + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "monolog", + "query": "how log handlers are registered and invoked by Logger", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": false + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "newtonsoft-json", + "query": "JsonReader base class and token reading API", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "adl_serializer", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nlohmann-json", + "query": "basic_json", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_has checks whether a command exists on the system", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm downloads a Node.js tarball from the remote", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm manages the PATH to point to the active Node.js bin", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "nvm", + "query": "how nvm_get_latest fetches the latest available Node.js version", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc reads RST reStructuredText documents", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how the PandocMonad typeclass abstracts IO for readers and writers", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc's app module orchestrates reading, filtering, and writing", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "pandoc", + "query": "how pandoc generates PDF output via LaTeX or other backends", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "phoenix", + "query": "how Phoenix logs request and response lifecycle events", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how Phoenix routes are defined and dispatched to controller actions", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "naming conventions for controllers and view modules", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "phoenix", + "query": "how the router matches path segments to controller/action", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "pydantic", + "query": "how discriminated unions select the right model variant", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "field_validator", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "pydantic", + "query": "model_validator", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "serving a file index page for a folder on disk", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Utils", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "grep+read", + "tokens": 5109, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Response", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "grep+read", + "tokens": 2490, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 2490, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 2490, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 2490, + "answered": true + }, + { + "repo": "rack", + "query": "Rack::Builder", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 2490, + "answered": true + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 1725, + "answered": true + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 1725, + "answered": true + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 1725, + "answered": true + }, + { + "repo": "rack", + "query": "static file serving middleware", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 1725, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 6420, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 6420, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 6420, + "answered": true + }, + { + "repo": "rack", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 6420, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "grep+read", + "tokens": 2801, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 2801, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 2801, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 2801, + "answered": true + }, + { + "repo": "rails", + "query": "Rails::Paths", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 2801, + "answered": true + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "rails", + "query": "Rails command dispatch and subcommand routing", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how SETRANGE modifies a substring within a string value", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": false + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how RDB persistence serializes the database to disk", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": false + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15230, + "answered": true + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how the event loop handles file events and time events", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": false + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "how slave keys with expiry are tracked in replication", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "redis", + "query": "server startup initialization and configuration loading", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 6635, + "answered": true + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 6635, + "answered": true + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 6635, + "answered": true + }, + { + "repo": "redux", + "query": "how listeners are subscribed and notified after state changes", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 6635, + "answered": true + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 7692, + "answered": true + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 7692, + "answered": true + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 7692, + "answered": true + }, + { + "repo": "redux", + "query": "middleware pipeline composition", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 7692, + "answered": true + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 9146, + "answered": true + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 10584, + "answered": true + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 10584, + "answered": true + }, + { + "repo": "redux", + "query": "reducer type definition", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 10584, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "grep+read", + "tokens": 7010, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 7010, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 7010, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 7010, + "answered": true + }, + { + "repo": "redux", + "query": "combineReducers", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 7010, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "grep+read", + "tokens": 9042, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 9042, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 9042, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 9042, + "answered": true + }, + { + "repo": "redux", + "query": "createStore", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 9042, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "grep+read", + "tokens": 941, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 8023, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 10882, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 10882, + "answered": true + }, + { + "repo": "redux", + "query": "bindActionCreators", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 10882, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "grep+read", + "tokens": 5283, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 7692, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 11155, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 11155, + "answered": true + }, + { + "repo": "redux", + "query": "applyMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 11155, + "answered": true + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "event hooks system", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 14120, + "answered": true + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 14120, + "answered": true + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 14120, + "answered": true + }, + { + "repo": "requests", + "query": "how proxy settings are read from environment variables", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 14120, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "requests", + "query": "PreparedRequest", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "how derive macros parse and apply field-level serde attributes", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "value-based deserialization for self-describing formats", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "semble", + "tokens": 1998, + "answered": true + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": false + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": false + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": false + }, + { + "repo": "serde", + "query": "Serialize", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": false + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "before and after filter hooks for the request lifecycle", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "grep+read", + "tokens": 3365, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 3365, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 3365, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 3365, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::ShowExceptions", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 3365, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Helpers", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "Sinatra::Application", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "sinatra", + "query": "case-insensitive hash for request params", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "grep+read", + "tokens": 9219, + "answered": true + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 5352, + "answered": true + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 9219, + "answered": true + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 9219, + "answered": true + }, + { + "repo": "snapkit", + "query": "ConstraintMaker", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 9219, + "answered": true + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "how are static files served", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": false + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "Request", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "grep+read", + "tokens": 2060, + "answered": true + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 2060, + "answered": true + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 2060, + "answered": true + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 2060, + "answered": true + }, + { + "repo": "starlette", + "query": "BaseHTTPMiddleware", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 2060, + "answered": true + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "telescope.nvim", + "query": "how telescope actions map keys to picker operations", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "tokio", + "query": "Notify", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how the async mutex prevents concurrent access", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "tokio", + "query": "how tasks that are not Send can run on a single thread", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 9505, + "answered": true + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 14918, + "answered": true + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15620, + "answered": true + }, + { + "repo": "trpc", + "query": "how middleware chains context transformations between procedures", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15620, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "grep+read", + "tokens": 6138, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 6138, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 6138, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 6138, + "answered": true + }, + { + "repo": "trpc", + "query": "inferProcedureInput", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 6138, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "grep+read", + "tokens": 8486, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 8486, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 8486, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 8486, + "answered": true + }, + { + "repo": "trpc", + "query": "MiddlewareBuilder", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 8486, + "answered": true + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how type inference extracts input and output types from procedures", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 11111, + "answered": true + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15482, + "answered": true + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "trpc", + "query": "how server-sent events and subscriptions are streamed to the client", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 10127, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "trpc", + "query": "AnyRouter", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 12418, + "answered": true + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "trpc", + "query": "how tRPC procedures are defined and chained with input and output validation", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 6211, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "vapor", + "query": "Application", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vapor", + "query": "how route groups and route collections compose routes", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "test runner worker pool scheduling and execution", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "how vitest discovers and runs test files", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "StateManager", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "fake timers and timer mocking utilities", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "vitest", + "query": "snapshot testing serialization and comparison", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "xmonad", + "query": "how xmonad handles floating windows separately from tiled ones", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": false + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": false + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": false + }, + { + "repo": "zig", + "query": "how debug.print outputs to stderr for debugging", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": false + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls provides goto definition for symbols", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls DocumentStore loads and caches Zig source files", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls generates diagnostic errors and warnings", + "category": "semantic", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls traverses the Zig AST to resolve symbol scopes", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 15999, + "answered": true + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "semble", + "tokens": 2000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "grep+read", + "tokens": 0, + "answered": false + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "keyword-grep+read-top5", + "tokens": 16000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "keyword-grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "zls", + "query": "how zls computes document scope for variable visibility", + "category": "architecture", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "semble", + "tokens": 1999, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "grep+read", + "tokens": 16000, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "keyword-grep+read-top5", + "tokens": 15999, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "keyword-grep+read-top10", + "tokens": 16000, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "keyword-grep+read", + "tokens": 15999, + "answered": true + }, + { + "repo": "zod", + "query": "ZodType", + "category": "symbol", + "method": "keyword-grep+read-top50", + "tokens": 16000, + "answered": true + } + ] +} diff --git a/benchmarks/results/context-efficiency-recall-6248855cfef8.json b/benchmarks/results/context-efficiency-recall-6248855cfef8.json new file mode 100644 index 0000000..aee9276 --- /dev/null +++ b/benchmarks/results/context-efficiency-recall-6248855cfef8.json @@ -0,0 +1,313 @@ +{ + "tool": "context-efficiency-recall", + "tokenizer": "cl100k_base", + "budgets": [ + 500, + 1000, + 2000, + 4000, + 8000, + 16000, + 32000 + ], + "n_queries": 1251, + "recall_at_budget": { + "semble": { + "500": 0.6843, + "1000": 0.848, + "2000": 0.9365, + "4000": 0.9762, + "8000": 0.9912, + "16000": 0.996, + "32000": 0.9964 + }, + "grep+read": { + "500": 0.0, + "1000": 0.0072, + "2000": 0.0228, + "4000": 0.042, + "8000": 0.0763, + "16000": 0.1011, + "32000": 0.1267 + }, + "ripgrep-c8": { + "500": 0.0691, + "1000": 0.0911, + "2000": 0.1071, + "4000": 0.1171, + "8000": 0.1307, + "16000": 0.1431, + "32000": 0.1503 + } + }, + "first_hit_reduction": { + "grep+read": { + "n_paired": 191.0, + "median_semble_tokens": 275.0, + "median_other_tokens": 7864.0, + "median_reduction": 0.9708, + "mean_reduction": 0.9323, + "semble_better_pct": 1.0 + }, + "ripgrep-c8": { + "n_paired": 190.0, + "median_semble_tokens": 274.5, + "median_other_tokens": 613.0, + "median_reduction": 0.6399, + "mean_reduction": 0.2028, + "semble_better_pct": 0.7263 + } + }, + "plot": { + "budgets": [ + 100, + 111, + 124, + 138, + 154, + 172, + 192, + 215, + 240, + 267, + 298, + 333, + 372, + 415, + 463, + 516, + 576, + 643, + 717, + 801, + 893, + 997, + 1112, + 1241, + 1385, + 1545, + 1724, + 1923, + 2146, + 2395, + 2672, + 2981, + 3326, + 3711, + 4141, + 4620, + 5155, + 5751, + 6417, + 7160, + 7989, + 8913, + 9945, + 11096, + 12380, + 13813, + 15412, + 17196, + 19186, + 21407, + 23884, + 26649, + 29733, + 33174, + 37014, + 41298, + 46077, + 51410, + 57361, + 64000 + ], + "recall": { + "semble": [ + 0.0404, + 0.0484, + 0.0584, + 0.0699, + 0.0823, + 0.1007, + 0.1214, + 0.1533, + 0.1941, + 0.2397, + 0.3183, + 0.4213, + 0.5524, + 0.6367, + 0.6719, + 0.6922, + 0.7134, + 0.7438, + 0.772, + 0.792, + 0.818, + 0.8472, + 0.8624, + 0.8776, + 0.8894, + 0.9101, + 0.9209, + 0.9341, + 0.9432, + 0.9515, + 0.9547, + 0.9619, + 0.9667, + 0.9723, + 0.9778, + 0.9817, + 0.984, + 0.986, + 0.9888, + 0.9908, + 0.9912, + 0.9924, + 0.9952, + 0.9952, + 0.996, + 0.996, + 0.996, + 0.996, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964 + ], + "grep+read": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0008, + 0.0032, + 0.0056, + 0.0064, + 0.0064, + 0.0072, + 0.008, + 0.0124, + 0.014, + 0.014, + 0.0188, + 0.022, + 0.0268, + 0.028, + 0.0312, + 0.0336, + 0.0348, + 0.0396, + 0.0428, + 0.0476, + 0.05, + 0.0548, + 0.0584, + 0.0675, + 0.0763, + 0.0787, + 0.0795, + 0.0875, + 0.0903, + 0.0971, + 0.0987, + 0.1047, + 0.1111, + 0.1155, + 0.1195, + 0.1219, + 0.1267, + 0.1275, + 0.1283, + 0.1315, + 0.1371, + 0.1379, + 0.1411, + 0.1435 + ], + "ripgrep-c8": [ + 0.0096, + 0.0152, + 0.0204, + 0.024, + 0.0288, + 0.0328, + 0.038, + 0.0404, + 0.0424, + 0.0472, + 0.0504, + 0.0536, + 0.0592, + 0.0624, + 0.0655, + 0.0691, + 0.0731, + 0.0779, + 0.0827, + 0.0851, + 0.0863, + 0.0911, + 0.0943, + 0.0991, + 0.1047, + 0.1063, + 0.1071, + 0.1071, + 0.1087, + 0.1103, + 0.1115, + 0.1131, + 0.1131, + 0.1147, + 0.1171, + 0.1179, + 0.1211, + 0.1259, + 0.1283, + 0.1307, + 0.1307, + 0.1319, + 0.1383, + 0.1387, + 0.1395, + 0.1407, + 0.1415, + 0.1439, + 0.1439, + 0.1439, + 0.1471, + 0.1487, + 0.1503, + 0.1503, + 0.1503, + 0.1503, + 0.1503, + 0.1503, + 0.1503, + 0.1503 + ] + } + } +} diff --git a/benchmarks/run_benchmark.py b/benchmarks/run_benchmark.py index 34148fc..dbb690d 100644 --- a/benchmarks/run_benchmark.py +++ b/benchmarks/run_benchmark.py @@ -1,5 +1,4 @@ import argparse -import json import sys import time from collections import defaultdict @@ -11,10 +10,9 @@ from benchmarks.data import ( RepoSpec, Task, - apply_task_filters, - available_repo_specs, + add_filter_args, grouped_tasks, - load_tasks, + load_filtered_tasks, save_results, ) from benchmarks.metrics import ndcg_at_k, target_rank @@ -274,16 +272,9 @@ def _save_results(results: list[RepoResult]) -> None: def main() -> None: """Parse arguments and run the semble hybrid benchmark.""" parser = argparse.ArgumentParser(description="Benchmark hybrid semble search across the pinned benchmark repos.") - parser.add_argument("--repo", action="append", default=[], help="Limit to one or more repo names.") - parser.add_argument("--language", action="append", default=[], help="Limit to one or more languages.") - parser.add_argument("--verbose", action="store_true", help="Print per-query results.") + add_filter_args(parser, verbose=True) args = parser.parse_args() - repo_specs = available_repo_specs() - tasks = apply_task_filters( - load_tasks(repo_specs=repo_specs), repos=args.repo or None, languages=args.language or None - ) - if not tasks: - raise SystemExit("No benchmark tasks matched the requested filters.") + repo_specs, tasks = load_filtered_tasks(args.repo or None, args.language or None) print("Loading model...", file=sys.stderr) started = time.perf_counter() model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) diff --git a/benchmarks/speed_benchmark.py b/benchmarks/speed_benchmark.py index 7bdc696..717598f 100644 --- a/benchmarks/speed_benchmark.py +++ b/benchmarks/speed_benchmark.py @@ -1,16 +1,15 @@ -import json import subprocess import sys import time from collections.abc import Sequence from dataclasses import dataclass -from pathlib import Path import numpy as np from model2vec import StaticModel from sentence_transformers import SentenceTransformer from benchmarks.data import RepoSpec, Task, available_repo_specs, load_tasks, save_results +from benchmarks.tools import run_colgrep_files, run_ripgrep_count from semble import SembleIndex from semble.index.dense import _DEFAULT_MODEL_NAME from semble.types import EmbeddingMatrix, Encoder @@ -40,7 +39,6 @@ _TOP_K = 10 _COLGREP = "colgrep" -_RG = "rg" @dataclass(frozen=True) @@ -90,58 +88,6 @@ def encode(self, texts: Sequence[str], /) -> EmbeddingMatrix: return self._model.encode(text_list, batch_size=1) # type: ignore[return-value] -def _run_ripgrep(query: str, benchmark_dir: Path) -> list[str]: - """Run ripgrep and return top-k file paths sorted by match count.""" - cmd = [ - _RG, - "--count", - "--no-heading", - "--ignore-case", - "--hidden", - "--glob", - "!.git", - "--fixed-strings", - query, - str(benchmark_dir), - ] - try: - proc = subprocess.run(cmd, capture_output=True, text=True, timeout=30) - except subprocess.TimeoutExpired: - return [] - if proc.returncode not in (0, 1): - return [] - entries: list[tuple[str, int]] = [] - for line in proc.stdout.splitlines(): - line = line.strip() - if not line: - continue - *path_parts, count_str = line.split(":") - try: - entries.append((":".join(path_parts), int(count_str))) - except ValueError: - continue - entries.sort(key=lambda x: -x[1]) - return [path for path, _ in entries[:_TOP_K]] - - -def _run_colgrep(query: str, benchmark_dir: Path, *, code_only: bool = True) -> list[str]: - """Run ColGREP and return top-k file paths from the JSON output.""" - cmd = [_COLGREP, "--force-cpu", "--json", "-k", str(_TOP_K), query, str(benchmark_dir)] - if code_only: - cmd.append("--code-only") - try: - proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60) - except subprocess.TimeoutExpired: - return [] - if proc.returncode != 0: - return [] - try: - data = json.loads(proc.stdout) - except json.JSONDecodeError: - return [] - return [item["unit"]["file"] for item in data if "unit" in item and "file" in item["unit"]] - - def _bench_semble( spec: RepoSpec, tasks: list[Task], model: Encoder | None ) -> tuple[float, SembleIndex, tuple[float, ...]]: @@ -194,13 +140,13 @@ def _bench_colgrep(spec: RepoSpec, tasks: list[Task]) -> tuple[float, tuple[floa if proc.returncode != 0: print(f" WARNING: colgrep init failed: {proc.stderr.strip()}", file=sys.stderr) if "(0 files)" in proc.stdout or "(0 files)" in proc.stderr: - print(f" SKIP: colgrep indexed 0 files (unsupported language?)", file=sys.stderr) + print(" SKIP: colgrep indexed 0 files (unsupported language?)", file=sys.stderr) return None latencies: list[float] = [] code_only = spec.language != "bash" for task in tasks: started = time.perf_counter() - _run_colgrep(task.query, spec.benchmark_dir, code_only=code_only) + run_colgrep_files(task.query, spec.benchmark_dir, top_k=_TOP_K, code_only=code_only, timeout=60) latencies.append((time.perf_counter() - started) * 1000) return index_ms, tuple(latencies) @@ -211,7 +157,7 @@ def _bench_ripgrep(spec: RepoSpec, tasks: list[Task]) -> tuple[float, tuple[floa for task in tasks: for _ in range(3): started = time.perf_counter() - _run_ripgrep(task.query, spec.benchmark_dir) + run_ripgrep_count(task.query, spec.benchmark_dir, top_k=_TOP_K) latencies.append((time.perf_counter() - started) * 1000) return 0.0, tuple(latencies) diff --git a/benchmarks/tools.py b/benchmarks/tools.py new file mode 100644 index 0000000..73fc86e --- /dev/null +++ b/benchmarks/tools.py @@ -0,0 +1,64 @@ +import json +import subprocess +from pathlib import Path + + +def run_ripgrep_count( + query: str, + benchmark_dir: Path, + *, + top_k: int, + fixed_strings: bool = True, + timeout: int = 30, +) -> list[str]: + """Return file paths sorted by ripgrep match count.""" + cmd = ["rg", "--count", "--no-heading", "--ignore-case", "--hidden", "--glob", "!.git"] + if fixed_strings: + cmd.append("--fixed-strings") + cmd += [query, str(benchmark_dir)] + + try: + proc = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout) + except subprocess.TimeoutExpired: + return [] + if proc.returncode not in (0, 1): + return [] + + entries: list[tuple[str, int]] = [] + for line in proc.stdout.splitlines(): + line = line.strip() + if not line: + continue + *path_parts, count_str = line.split(":") + try: + entries.append((":".join(path_parts), int(count_str))) + except ValueError: + continue + entries.sort(key=lambda x: -x[1]) + return [path for path, _ in entries[:top_k]] + + +def run_colgrep_files( + query: str, + benchmark_dir: Path, + *, + top_k: int, + code_only: bool = True, + timeout: int = 30, +) -> list[str]: + """Return file paths from ColGREP JSON output.""" + cmd = ["colgrep", "--force-cpu"] + if code_only: + cmd.append("--code-only") + cmd += ["--json", "-k", str(top_k), query, str(benchmark_dir)] + try: + proc = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout) + except subprocess.TimeoutExpired: + return [] + if proc.returncode != 0: + return [] + try: + data = json.loads(proc.stdout) + except json.JSONDecodeError: + return [] + return [item["unit"]["file"] for item in data if "unit" in item and "file" in item["unit"]] diff --git a/pyproject.toml b/pyproject.toml index 00d248c..ec4a2d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,8 @@ benchmark = [ "numpy>=1.24.0", "einops>=0.8.2", "matplotlib>=3.7", + "tiktoken>=0.7", + "openai>=1.50", ] dev = [ "pytest>=8.0", diff --git a/uv.lock b/uv.lock index 035e1fd..f983e19 100644 --- a/uv.lock +++ b/uv.lock @@ -163,6 +163,111 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, ] +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", size = 315182, upload-time = "2026-04-02T09:25:40.673Z" }, + { url = "https://files.pythonhosted.org/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", size = 209329, upload-time = "2026-04-02T09:25:42.354Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", size = 231230, upload-time = "2026-04-02T09:25:44.281Z" }, + { url = "https://files.pythonhosted.org/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", size = 225890, upload-time = "2026-04-02T09:25:45.475Z" }, + { url = "https://files.pythonhosted.org/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", size = 216930, upload-time = "2026-04-02T09:25:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", size = 202109, upload-time = "2026-04-02T09:25:48.031Z" }, + { url = "https://files.pythonhosted.org/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", size = 214684, upload-time = "2026-04-02T09:25:49.245Z" }, + { url = "https://files.pythonhosted.org/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", size = 212785, upload-time = "2026-04-02T09:25:50.671Z" }, + { url = "https://files.pythonhosted.org/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", size = 203055, upload-time = "2026-04-02T09:25:51.802Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", size = 232502, upload-time = "2026-04-02T09:25:53.388Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", size = 214295, upload-time = "2026-04-02T09:25:54.765Z" }, + { url = "https://files.pythonhosted.org/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", size = 227145, upload-time = "2026-04-02T09:25:55.904Z" }, + { url = "https://files.pythonhosted.org/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", size = 218884, upload-time = "2026-04-02T09:25:57.074Z" }, + { url = "https://files.pythonhosted.org/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", size = 148343, upload-time = "2026-04-02T09:25:58.199Z" }, + { url = "https://files.pythonhosted.org/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", size = 159174, upload-time = "2026-04-02T09:25:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", size = 147805, upload-time = "2026-04-02T09:26:00.756Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + [[package]] name = "chonkie" version = "1.6.2" @@ -638,6 +743,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + [[package]] name = "docstring-parser-fork" version = "0.0.14" @@ -900,6 +1014,109 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "jiter" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/2e/a9959997739c403378d0a4a3a1c4ed80b60aeace216c4d37b303a9fc60a4/jiter-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:02f36a5c700f105ac04a6556fe664a59037a2c200db3b7e88784fac2ddf02531", size = 316927, upload-time = "2026-04-10T14:25:40.753Z" }, + { url = "https://files.pythonhosted.org/packages/27/72/b6de8a531e0adbadd839bec301165feb1fccf00e9ff55073ba2dd20f0043/jiter-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41eab6c09ceffb6f0fe25e214b3068146edb1eda3649ca2aee2a061029c7ba2e", size = 321181, upload-time = "2026-04-10T14:25:42.621Z" }, + { url = "https://files.pythonhosted.org/packages/db/d8/2040b9efa13c917f855c40890ae4119fe02c25b7c7677d5b4fa820a851fc/jiter-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf4d4c109641f9cfaf4a7b6aebd51654e405cd00fa9ebbf87163b8b97b325aa", size = 347387, upload-time = "2026-04-10T14:25:44.212Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/655c0ad5ce6a8e90f9068c175b8a236877d753e460762b3183c136db1c5b/jiter-0.14.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80c7b41a628e6be2213ad0ece763c5f88aa5ee003fa394d58acaaee1f4b8342", size = 373083, upload-time = "2026-04-10T14:25:45.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/549c40fa068f08710b7570869c306a051eb67a29758bd64f4114f730554c/jiter-0.14.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb3dbf7cc0d4dbe73cce307ebe7eefa7f73a7d3d854dd119ea0c243f03e40927", size = 463639, upload-time = "2026-04-10T14:25:47.452Z" }, + { url = "https://files.pythonhosted.org/packages/25/2f/97a32a05fed14ed58a18e181fdfb619e05163f3726b54ee6080ec0539c09/jiter-0.14.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7054adcdeb06b46efd17b5734f75817a44a2d06d3748e36c3a023a1bb52af9ec", size = 380735, upload-time = "2026-04-10T14:25:49.305Z" }, + { url = "https://files.pythonhosted.org/packages/2a/3b/4347e1d6c2a973d653bbb7a2d671a2d2426e54b52ba735b8ff0d0a29b75c/jiter-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d597cd1bf6790376f3fffc7c708766e57301d99a19314824ea0ccc9c3c70e1e2", size = 358632, upload-time = "2026-04-10T14:25:50.931Z" }, + { url = "https://files.pythonhosted.org/packages/ef/24/ca452fbf2ea33548ed30ce68a39a50442d3f7c9bf0704a7af958a930c057/jiter-0.14.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:df63a14878da754427926281626fd3ee249424a186e25a274e78176d42945264", size = 359969, upload-time = "2026-04-10T14:25:52.381Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a3/94470a0d199287caabeb4da2bb2ae5f6d17f3cf05dfc975d7cb064d58e0f/jiter-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ea73187627bcc5810e085df715e8a99da8bdfd96a7eb36b4b4df700ba6d4c9c", size = 397529, upload-time = "2026-04-10T14:25:53.801Z" }, + { url = "https://files.pythonhosted.org/packages/cf/71/6768edc09d7c45c39f093feb3de105fa718a3e982b5208b8a2ed6382b44b/jiter-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9f541eaf7bb8382367a1a23d6fc3d6aad57f8dd8c18c3c17f838bee20f217220", size = 522342, upload-time = "2026-04-10T14:25:55.396Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6b/5c2e17559a0f4e96e934479f7137df46c939e983fa05244e674815befb73/jiter-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:107465250de4fce00fdb47166bcd51df8e634e049541174fe3c71848e44f52ce", size = 556784, upload-time = "2026-04-10T14:25:56.927Z" }, + { url = "https://files.pythonhosted.org/packages/b1/83/c25f3556a60fc74d11199100f1b6cc0c006b815c8494dea8ca16fe398732/jiter-0.14.0-cp310-cp310-win32.whl", hash = "sha256:ffb2a08a406465bb076b7cc1df41d833106d3cf7905076cc73f0cb90078c7d10", size = 208439, upload-time = "2026-04-10T14:25:58.796Z" }, + { url = "https://files.pythonhosted.org/packages/2e/99/781a1b413f0989b7f2ea203b094b331685f1a35e52e0a45e5d000ecaab27/jiter-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb8b682d10cb0cce7ff4c1af7244af7022c9b01ae16d46c357bdd0df13afb25d", size = 204558, upload-time = "2026-04-10T14:26:00.208Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/198ae537fccb7080a0ed655eb56abf64a92f79489dfbf79f40fa34225bcd/jiter-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7e791e247b8044512e070bd1f3633dc08350d32776d2d6e7473309d0edf256a2", size = 316896, upload-time = "2026-04-10T14:26:01.986Z" }, + { url = "https://files.pythonhosted.org/packages/cf/34/da67cff3fce964a36d03c3e365fb0f8726ade2a6cfd4d3c70107e216ead6/jiter-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71527ce13fd5a0c4e40ad37331f8c547177dbb2dd0a93e5278b6a5eecf748804", size = 321085, upload-time = "2026-04-10T14:26:03.364Z" }, + { url = "https://files.pythonhosted.org/packages/ed/36/4c72e67180d4e71a4f5dcf7886d0840e83c49ab11788172177a77570326e/jiter-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c4a7ab56f746014874f2c525584c0daca1dec37f66fd707ecef3b7e5c2228c", size = 347393, upload-time = "2026-04-10T14:26:05.314Z" }, + { url = "https://files.pythonhosted.org/packages/bc/db/9b39e09ceafa9878235c0fc29e3e3f9b12a4c6a98ea3085b998cadf3accc/jiter-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:376e9dafff914253bb9d46cdc5f7965607fbe7feb0a491c34e35f92b2770702e", size = 372937, upload-time = "2026-04-10T14:26:06.884Z" }, + { url = "https://files.pythonhosted.org/packages/b0/96/0dcba1d7a82c1b720774b48ef239376addbaf30df24c34742ac4a57b67b2/jiter-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23ad2a7a9da1935575c820428dd8d2490ce4d23189691ce33da1fc0a58e14e1c", size = 463646, upload-time = "2026-04-10T14:26:08.345Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e3/f61b71543e746e6b8b805e7755814fc242715c16f1dba58e1cbccb8032c2/jiter-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54b3ddf5786bc7732d293bba3411ac637ecfa200a39983166d1df86a59a43c9f", size = 380225, upload-time = "2026-04-10T14:26:10.161Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5e/0ddeb7096aca099114abe36c4921016e8d251e6f35f5890240b31f1f60ae/jiter-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c001d5a646c2a50dc055dd526dad5d5245969e8234d2b1131d0451e81f3a373", size = 358682, upload-time = "2026-04-10T14:26:11.574Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d1/fe0c46cd7fda9cad8f1ff9ad217dc61f1e4280b21052ec6dfe88c1446ef2/jiter-0.14.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:834bb5bdabca2e91592a03d373838a8d0a1b8bbde7077ae6913fd2fc51812d00", size = 359973, upload-time = "2026-04-10T14:26:13.316Z" }, + { url = "https://files.pythonhosted.org/packages/ac/21/f5317f91729b501019184771c80d60abd89907009e7bfa6c7e348c5bdd44/jiter-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4e9178be60e229b1b2b0710f61b9e24d1f4f8556985a83ff4c4f95920eea7314", size = 397568, upload-time = "2026-04-10T14:26:15.212Z" }, + { url = "https://files.pythonhosted.org/packages/e9/05/79d8f33fb2bf168db0df5c9cd16fe440a8ada57e929d3677b22712c2568f/jiter-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7e4ccff04ec03614e62c613e976a3a5860dc9714ce8266f44328bdc8b1cab2c", size = 522535, upload-time = "2026-04-10T14:26:16.956Z" }, + { url = "https://files.pythonhosted.org/packages/5c/00/d1e3ff3d2a465e67f08507d74bafb2dcd29eba91dc939820e39e8dea38b8/jiter-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69539d936fb5d55caf6ecd33e2e884de083ff0ea28579780d56c4403094bb8d9", size = 556709, upload-time = "2026-04-10T14:26:18.5Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/bbb2189f62ace8d95e869aa4c84c9946616f301e2d02895a6f20dcc3bba3/jiter-0.14.0-cp311-cp311-win32.whl", hash = "sha256:4927d09b3e572787cc5e0a5318601448e1ab9391bcef95677f5840c2d00eaa6d", size = 208660, upload-time = "2026-04-10T14:26:20.511Z" }, + { url = "https://files.pythonhosted.org/packages/b8/86/c500b53dcbf08575f5963e536ebd757a1f7c568272ba5d180b212c9a87fb/jiter-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:42d6ed359ac49eb922fdd565f209c57340aa06d589c84c8413e42a0f9ae1b842", size = 204659, upload-time = "2026-04-10T14:26:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/a676249049d42cb29bef82233e4fe0524d414cbe3606c7a4b311193c2f77/jiter-0.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:6dd689f5f4a5a33747b28686e051095beb214fe28cfda5e9fe58a295a788f593", size = 194772, upload-time = "2026-04-10T14:26:23.458Z" }, + { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, + { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, + { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, + { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, + { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, + { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, + { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, + { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, + { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, + { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, + { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, + { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, + { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, + { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, + { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, + { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, + { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, + { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, + { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, + { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, + { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, + { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, + { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, + { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, + { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, + { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, + { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, + { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, + { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/32/a1/ef34ca2cab2962598591636a1804b93645821201cc0095d4a93a9a329c9d/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a25ffa2dbbdf8721855612f6dca15c108224b12d0c4024d0ac3d7902132b4211", size = 311366, upload-time = "2026-04-10T14:28:27.943Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/520576a532a6b8a6f42747afed289c8448c879a34d7802fe2c832d4fd38f/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ac9cbaa86c10996b92bd12c91659b60f939f8e28fcfa6bc11a0e90a774ce95b", size = 309873, upload-time = "2026-04-10T14:28:29.688Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7c/c16db114ea1f2f532f198aa8dc39585026af45af362c69a0492f31bc4821/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:844e73b6c56b505e9e169234ea3bdea2ea43f769f847f47ac559ba1d2361ebea", size = 344816, upload-time = "2026-04-10T14:28:31.348Z" }, + { url = "https://files.pythonhosted.org/packages/99/8f/15e7741ff19e9bcd4d753f7ff22f988fd54592f134ca13701c13ea8c20e0/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52c076f187405fc21523c746c04399c9af8ece566077ed147b2126f2bcba577", size = 351445, upload-time = "2026-04-10T14:28:33.093Z" }, + { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, + { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, +] + [[package]] name = "joblib" version = "1.5.3" @@ -1868,6 +2085,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/1d/1666dc64e78d8587d168fec4e3b7922b92eb286a2ddeebcf6acb55c7dc82/onnxruntime-1.24.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1cc6a518255f012134bc791975a6294806be9a3b20c4a54cca25194c90cf731", size = 17247021, upload-time = "2026-03-17T22:04:52.377Z" }, ] +[[package]] +name = "openai" +version = "2.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "distro" }, + { name = "httpx" }, + { name = "jiter" }, + { name = "pydantic" }, + { name = "sniffio" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/59/bdcc6b759b8c42dd73afaf5bf8f902c04b37987a5514dbc1c64dba390fef/openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0", size = 693286, upload-time = "2026-04-15T22:28:19.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/c1/d6e64ccd0536bf616556f0cad2b6d94a8125f508d25cfd814b1d2db4e2f1/openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f", size = 1162570, upload-time = "2026-04-15T22:28:17.714Z" }, +] + [[package]] name = "orjson" version = "3.11.8" @@ -2624,6 +2860,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/e7/ec846d560ae6a597115153c02ca6138a7877a1748b2072d9521c10a93e58/regex-2026.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:af0384cb01a33600c49505c27c6c57ab0b27bf84a74e28524c92ca897ebdac9d", size = 275773, upload-time = "2026-04-03T20:56:26.07Z" }, ] +[[package]] +name = "requests" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, +] + [[package]] name = "rich" version = "14.3.3" @@ -3068,7 +3319,9 @@ benchmark = [ { name = "matplotlib" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "openai" }, { name = "sentence-transformers" }, + { name = "tiktoken" }, ] dev = [ { name = "mypy" }, @@ -3093,6 +3346,7 @@ requires-dist = [ { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0" }, { name = "numpy", specifier = ">=1.24.0" }, { name = "numpy", marker = "extra == 'benchmark'", specifier = ">=1.24.0" }, + { name = "openai", marker = "extra == 'benchmark'", specifier = ">=1.50" }, { name = "pathspec", specifier = ">=0.12" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.0" }, { name = "pydoclint", marker = "extra == 'dev'", specifier = ">=0.5.3" }, @@ -3100,6 +3354,7 @@ requires-dist = [ { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.9.0" }, { name = "sentence-transformers", marker = "extra == 'benchmark'", specifier = ">=3.0" }, + { name = "tiktoken", marker = "extra == 'benchmark'", specifier = ">=0.7" }, { name = "vicinity", specifier = ">=0.4.4" }, ] provides-extras = ["mcp", "benchmark", "dev"] @@ -3153,6 +3408,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + [[package]] name = "sse-starlette" version = "3.3.4" @@ -3209,6 +3473,67 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, ] +[[package]] +name = "tiktoken" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/b3/2cb7c17b6c4cf8ca983204255d3f1d95eda7213e247e6947a0ee2c747a2c/tiktoken-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3de02f5a491cfd179aec916eddb70331814bd6bf764075d39e21d5862e533970", size = 1051991, upload-time = "2025-10-06T20:21:34.098Z" }, + { url = "https://files.pythonhosted.org/packages/27/0f/df139f1df5f6167194ee5ab24634582ba9a1b62c6b996472b0277ec80f66/tiktoken-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6cfb6d9b7b54d20af21a912bfe63a2727d9cfa8fbda642fd8322c70340aad16", size = 995798, upload-time = "2025-10-06T20:21:35.579Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5d/26a691f28ab220d5edc09b9b787399b130f24327ef824de15e5d85ef21aa/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:cde24cdb1b8a08368f709124f15b36ab5524aac5fa830cc3fdce9c03d4fb8030", size = 1129865, upload-time = "2025-10-06T20:21:36.675Z" }, + { url = "https://files.pythonhosted.org/packages/b2/94/443fab3d4e5ebecac895712abd3849b8da93b7b7dec61c7db5c9c7ebe40c/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6de0da39f605992649b9cfa6f84071e3f9ef2cec458d08c5feb1b6f0ff62e134", size = 1152856, upload-time = "2025-10-06T20:21:37.873Z" }, + { url = "https://files.pythonhosted.org/packages/54/35/388f941251b2521c70dd4c5958e598ea6d2c88e28445d2fb8189eecc1dfc/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6faa0534e0eefbcafaccb75927a4a380463a2eaa7e26000f0173b920e98b720a", size = 1195308, upload-time = "2025-10-06T20:21:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/f8/00/c6681c7f833dd410576183715a530437a9873fa910265817081f65f9105f/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82991e04fc860afb933efb63957affc7ad54f83e2216fe7d319007dab1ba5892", size = 1255697, upload-time = "2025-10-06T20:21:41.154Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d2/82e795a6a9bafa034bf26a58e68fe9a89eeaaa610d51dbeb22106ba04f0a/tiktoken-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:6fb2995b487c2e31acf0a9e17647e3b242235a20832642bb7a9d1a181c0c1bb1", size = 879375, upload-time = "2025-10-06T20:21:43.201Z" }, + { url = "https://files.pythonhosted.org/packages/de/46/21ea696b21f1d6d1efec8639c204bdf20fde8bafb351e1355c72c5d7de52/tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb", size = 1051565, upload-time = "2025-10-06T20:21:44.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" }, + { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d0/3d9275198e067f8b65076a68894bb52fd253875f3644f0a321a720277b8a/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded", size = 1152444, upload-time = "2025-10-06T20:21:48.139Z" }, + { url = "https://files.pythonhosted.org/packages/78/db/a58e09687c1698a7c592e1038e01c206569b86a0377828d51635561f8ebf/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd", size = 1195080, upload-time = "2025-10-06T20:21:49.246Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/a9e4d2bf91d515c0f74afc526fd773a812232dd6cda33ebea7f531202325/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967", size = 1255240, upload-time = "2025-10-06T20:21:50.274Z" }, + { url = "https://files.pythonhosted.org/packages/9d/15/963819345f1b1fb0809070a79e9dd96938d4ca41297367d471733e79c76c/tiktoken-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e68e3e593637b53e56f7237be560f7a394451cb8c11079755e80ae64b9e6def", size = 879422, upload-time = "2025-10-06T20:21:51.734Z" }, + { url = "https://files.pythonhosted.org/packages/a4/85/be65d39d6b647c79800fd9d29241d081d4eeb06271f383bb87200d74cf76/tiktoken-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b97f74aca0d78a1ff21b8cd9e9925714c15a9236d6ceacf5c7327c117e6e21e8", size = 1050728, upload-time = "2025-10-06T20:21:52.756Z" }, + { url = "https://files.pythonhosted.org/packages/4a/42/6573e9129bc55c9bf7300b3a35bef2c6b9117018acca0dc760ac2d93dffe/tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b", size = 994049, upload-time = "2025-10-06T20:21:53.782Z" }, + { url = "https://files.pythonhosted.org/packages/66/c5/ed88504d2f4a5fd6856990b230b56d85a777feab84e6129af0822f5d0f70/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37", size = 1129008, upload-time = "2025-10-06T20:21:54.832Z" }, + { url = "https://files.pythonhosted.org/packages/f4/90/3dae6cc5436137ebd38944d396b5849e167896fc2073da643a49f372dc4f/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad", size = 1152665, upload-time = "2025-10-06T20:21:56.129Z" }, + { url = "https://files.pythonhosted.org/packages/a3/fe/26df24ce53ffde419a42f5f53d755b995c9318908288c17ec3f3448313a3/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5", size = 1194230, upload-time = "2025-10-06T20:21:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/20/cc/b064cae1a0e9fac84b0d2c46b89f4e57051a5f41324e385d10225a984c24/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3", size = 1254688, upload-time = "2025-10-06T20:21:58.619Z" }, + { url = "https://files.pythonhosted.org/packages/81/10/b8523105c590c5b8349f2587e2fdfe51a69544bd5a76295fc20f2374f470/tiktoken-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc5288f34a8bc02e1ea7047b8d041104791d2ddbf42d1e5fa07822cbffe16bd", size = 878694, upload-time = "2025-10-06T20:21:59.876Z" }, + { url = "https://files.pythonhosted.org/packages/00/61/441588ee21e6b5cdf59d6870f86beb9789e532ee9718c251b391b70c68d6/tiktoken-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:775c2c55de2310cc1bc9a3ad8826761cbdc87770e586fd7b6da7d4589e13dab3", size = 1050802, upload-time = "2025-10-06T20:22:00.96Z" }, + { url = "https://files.pythonhosted.org/packages/1f/05/dcf94486d5c5c8d34496abe271ac76c5b785507c8eae71b3708f1ad9b45a/tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160", size = 993995, upload-time = "2025-10-06T20:22:02.788Z" }, + { url = "https://files.pythonhosted.org/packages/a0/70/5163fe5359b943f8db9946b62f19be2305de8c3d78a16f629d4165e2f40e/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa", size = 1128948, upload-time = "2025-10-06T20:22:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/c028aa0babf77315e1cef357d4d768800c5f8a6de04d0eac0f377cb619fa/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be", size = 1151986, upload-time = "2025-10-06T20:22:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5a/886b108b766aa53e295f7216b509be95eb7d60b166049ce2c58416b25f2a/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a", size = 1194222, upload-time = "2025-10-06T20:22:06.265Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/4db272048397636ac7a078d22773dd2795b1becee7bc4922fe6207288d57/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3", size = 1255097, upload-time = "2025-10-06T20:22:07.403Z" }, + { url = "https://files.pythonhosted.org/packages/8e/32/45d02e2e0ea2be3a9ed22afc47d93741247e75018aac967b713b2941f8ea/tiktoken-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8a0cd0c789a61f31bf44851defbd609e8dd1e2c8589c614cc1060940ef1f697", size = 879117, upload-time = "2025-10-06T20:22:08.418Z" }, + { url = "https://files.pythonhosted.org/packages/ce/76/994fc868f88e016e6d05b0da5ac24582a14c47893f4474c3e9744283f1d5/tiktoken-0.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d5f89ea5680066b68bcb797ae85219c72916c922ef0fcdd3480c7d2315ffff16", size = 1050309, upload-time = "2025-10-06T20:22:10.939Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/57ef1456504c43a849821920d582a738a461b76a047f352f18c0b26c6516/tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a", size = 993712, upload-time = "2025-10-06T20:22:12.115Z" }, + { url = "https://files.pythonhosted.org/packages/72/90/13da56f664286ffbae9dbcfadcc625439142675845baa62715e49b87b68b/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27", size = 1128725, upload-time = "2025-10-06T20:22:13.541Z" }, + { url = "https://files.pythonhosted.org/packages/05/df/4f80030d44682235bdaecd7346c90f67ae87ec8f3df4a3442cb53834f7e4/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb", size = 1151875, upload-time = "2025-10-06T20:22:14.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/1f/ae535223a8c4ef4c0c1192e3f9b82da660be9eb66b9279e95c99288e9dab/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e", size = 1194451, upload-time = "2025-10-06T20:22:15.545Z" }, + { url = "https://files.pythonhosted.org/packages/78/a7/f8ead382fce0243cb625c4f266e66c27f65ae65ee9e77f59ea1653b6d730/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25", size = 1253794, upload-time = "2025-10-06T20:22:16.624Z" }, + { url = "https://files.pythonhosted.org/packages/93/e0/6cc82a562bc6365785a3ff0af27a2a092d57c47d7a81d9e2295d8c36f011/tiktoken-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dc2dd125a62cb2b3d858484d6c614d136b5b848976794edfb63688d539b8b93f", size = 878777, upload-time = "2025-10-06T20:22:18.036Z" }, + { url = "https://files.pythonhosted.org/packages/72/05/3abc1db5d2c9aadc4d2c76fa5640134e475e58d9fbb82b5c535dc0de9b01/tiktoken-0.12.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a90388128df3b3abeb2bfd1895b0681412a8d7dc644142519e6f0a97c2111646", size = 1050188, upload-time = "2025-10-06T20:22:19.563Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7b/50c2f060412202d6c95f32b20755c7a6273543b125c0985d6fa9465105af/tiktoken-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:da900aa0ad52247d8794e307d6446bd3cdea8e192769b56276695d34d2c9aa88", size = 993978, upload-time = "2025-10-06T20:22:20.702Z" }, + { url = "https://files.pythonhosted.org/packages/14/27/bf795595a2b897e271771cd31cb847d479073497344c637966bdf2853da1/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:285ba9d73ea0d6171e7f9407039a290ca77efcdb026be7769dccc01d2c8d7fff", size = 1129271, upload-time = "2025-10-06T20:22:22.06Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/9341a6d7a8f1b448573bbf3425fa57669ac58258a667eb48a25dfe916d70/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d186a5c60c6a0213f04a7a802264083dea1bbde92a2d4c7069e1a56630aef830", size = 1151216, upload-time = "2025-10-06T20:22:23.085Z" }, + { url = "https://files.pythonhosted.org/packages/75/0d/881866647b8d1be4d67cb24e50d0c26f9f807f994aa1510cb9ba2fe5f612/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:604831189bd05480f2b885ecd2d1986dc7686f609de48208ebbbddeea071fc0b", size = 1194860, upload-time = "2025-10-06T20:22:24.602Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1e/b651ec3059474dab649b8d5b69f5c65cd8fcd8918568c1935bd4136c9392/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8f317e8530bb3a222547b85a58583238c8f74fd7a7408305f9f63246d1a0958b", size = 1254567, upload-time = "2025-10-06T20:22:25.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/57/ce64fd16ac390fafde001268c364d559447ba09b509181b2808622420eec/tiktoken-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:399c3dd672a6406719d84442299a490420b458c44d3ae65516302a99675888f3", size = 921067, upload-time = "2025-10-06T20:22:26.753Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a4/72eed53e8976a099539cdd5eb36f241987212c29629d0a52c305173e0a68/tiktoken-0.12.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2c714c72bc00a38ca969dae79e8266ddec999c7ceccd603cc4f0d04ccd76365", size = 1050473, upload-time = "2025-10-06T20:22:27.775Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d7/0110b8f54c008466b19672c615f2168896b83706a6611ba6e47313dbc6e9/tiktoken-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cbb9a3ba275165a2cb0f9a83f5d7025afe6b9d0ab01a22b50f0e74fee2ad253e", size = 993855, upload-time = "2025-10-06T20:22:28.799Z" }, + { url = "https://files.pythonhosted.org/packages/5f/77/4f268c41a3957c418b084dd576ea2fad2e95da0d8e1ab705372892c2ca22/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:dfdfaa5ffff8993a3af94d1125870b1d27aed7cb97aa7eb8c1cefdbc87dbee63", size = 1129022, upload-time = "2025-10-06T20:22:29.981Z" }, + { url = "https://files.pythonhosted.org/packages/4e/2b/fc46c90fe5028bd094cd6ee25a7db321cb91d45dc87531e2bdbb26b4867a/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:584c3ad3d0c74f5269906eb8a659c8bfc6144a52895d9261cdaf90a0ae5f4de0", size = 1150736, upload-time = "2025-10-06T20:22:30.996Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/3c7a39ff68022ddfd7d93f3337ad90389a342f761c4d71de99a3ccc57857/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54c891b416a0e36b8e2045b12b33dd66fb34a4fe7965565f1b482da50da3e86a", size = 1194908, upload-time = "2025-10-06T20:22:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/ab/0d/c1ad6f4016a3968c048545f5d9b8ffebf577774b2ede3e2e352553b685fe/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0", size = 1253706, upload-time = "2025-10-06T20:22:33.385Z" }, + { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" }, +] + [[package]] name = "tokenizers" version = "0.22.2" @@ -3506,6 +3831,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + [[package]] name = "uvicorn" version = "0.44.0" From a507b18b399b1b354370bc179f10b39954817cd2 Mon Sep 17 00:00:00 2001 From: Pringled Date: Tue, 28 Apr 2026 18:03:38 +0200 Subject: [PATCH 02/18] Simplify --- assets/images/recall_vs_tokens.png | Bin 62621 -> 61963 bytes benchmarks/README.md | 55 +- benchmarks/context_efficiency.py | 187 +- ...context-efficiency-judge-6248855cfef8.json | 9764 +---------------- ...fficiency-judge-records-6248855cfef8.jsonl | 396 + 5 files changed, 459 insertions(+), 9943 deletions(-) create mode 100644 benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl diff --git a/assets/images/recall_vs_tokens.png b/assets/images/recall_vs_tokens.png index 83e153c88d3d7501e3d608a6bffd90ed326045cc..6a623cb6ea286fc9bd3bbb977d9006980b9a0c69 100644 GIT binary patch delta 23498 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 Ib!5!1_B`)2Kq;v{@>5vWyLApCcx;uQA_ltfJ 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 Across a 198-query category-balanced sample judged by GPT-5-mini, semble's retrieved context is sufficient to answer **88%** of queries at 2k tokens. A grep-based agent that first asks an LLM to extract grep-friendly keywords from the query (the strongest realistic baseline — closer to what Claude Code and OpenCode actually do) reaches **71%** but spends ~11k tokens reading candidate files. The raw retrieval-token saving is **81%** vs keyword grep and **50%** vs naive grep; including a pessimistic fallback model that adds the cost of redoing grep on a miss, end-to-end savings are **77%** and **69%** respectively. +> Across a 198-query category-balanced sample judged by GPT-5-mini, semble's retrieved context answers **88%** of queries at 2k tokens. Direct `grep + read file` answers **29%** and spends ~4k tokens. That is a **50% reduction in retrieved code-context tokens**; with a pessimistic fallback model for misses, expected end-to-end context cost drops by **69%**. ![Recall vs. retrieved tokens](../assets/images/recall_vs_tokens.png) ### Answer sufficiency (LLM-as-judge) -For each query we hand the retrieved context to GPT-5-mini and ask whether it contains enough relevant code to answer the query. Sample is 198 queries, balanced 66/66/66 across categories (note: the underlying benchmark is imbalanced 703/344/204 semantic/architecture/symbol; the macro-balanced sample is more conservative for semble's claim, since proportional sampling would weight the harder semantic category higher). Three retrieval workflows: +For each query we hand the retrieved context to GPT-5-mini and ask whether it contains enough relevant code to answer the query. The sample is 198 queries, balanced 66/66/66 across semantic, architecture, and symbol categories. - **semble** — top-K chunks, hard-capped at 2k tokens. -- **keyword-grep+read** — gpt-5-mini extracts 1–3 grep-friendly terms from the query, joined as a regex (`term1|term2`); the agent reads the top-20 matched files in full, hard-capped at 16k tokens. Mirrors how Claude Code and OpenCode actually use grep. -- **grep+read (naive)** — the raw query string is passed verbatim to `rg --fixed-strings`; matching files are read in full, hard-capped at 16k tokens. Strawman included for comparison. +- **grep+read** — the raw query string is passed to `rg --fixed-strings`; matching files are read in full, hard-capped at 16k tokens. -All three workflows search the same file universe — semble's indexed code-file extensions, with `node_modules`, `dist`, `build`, `.venv`, etc. excluded. +Both workflows search the same code-file universe: semble's indexed extensions, excluding `node_modules`, `dist`, `build`, `.venv`, and other ignored directories. -| Method | Budget | Answer rate | Mean tokens retrieved | Raw token reduction vs semble | Expected end-to-end tokens† | +| Method | Budget | Answer rate | Mean tokens retrieved | Token reduction with semble | Expected end-to-end tokens† | |---|---:|---:|---:|---:|---:| | **semble** | 2k | **0.879** | 2,000 | — | **2,906** | -| keyword-grep+read | 16k | 0.712 | 10,595 | 81.1% | 12,747 | -| grep+read (naive) | 16k | 0.293 | 3,996 | 50.0% | 9,281 | +| grep+read | 16k | 0.293 | 3,996 | 50.0% | 9,281 | -**Raw retrieval reduction:** 81.1% vs keyword-grep, 50.0% vs naive grep. -**End-to-end reduction (with fallback model):** 77.2% vs keyword-grep, 68.7% vs naive grep. +**Raw retrieval reduction:** 50.0% fewer retrieved code-context tokens vs `grep+read`. +**End-to-end reduction (with fallback model):** 68.7% fewer expected context tokens vs `grep+read`. -†The end-to-end column adds a uniform fallback term `(1 − answer_rate) × 7,474` to every method, modeling the agent redoing a grep workflow on a miss. The constant 7,474 is the median tokens grep+read spends to surface a relevant file. Sweeping it 3k–16k gives an end-to-end reduction range of **61–74% vs naive grep** and **74–79% vs keyword grep** (recomputed from the saved artifact), so the conclusion is not load-bearing on this constant. The raw retrieval reduction is the model-free comparison. +†The end-to-end column adds `(1 − answer_rate) × 7,474`, modeling a fallback search on a miss. The constant is the median tokens `grep+read` spends to surface a relevant file. The raw retrieval reduction is the model-free comparison. This benchmark measures retrieved code-context tokens, not total IDE or agent billing tokens. **Answer rate by query category:** -| Category | semble | keyword-grep+read | naive grep | -|---|---:|---:|---:| -| symbol (named entity lookup) | 0.97 | 0.94 | 0.86 | -| semantic (behavior / concept) | 0.85 | 0.52 | 0.02 | -| architecture (design / structure) | 0.82 | 0.68 | 0.00 | - -Keyword extraction closes the gap on symbol queries, helps substantially on semantic and architecture — but at ~5× the retrieval token cost (full file reads, top-20 candidates), so the end-to-end gap remains large. +| Category | semble | grep+read | +|---|---:|---:| +| symbol (named entity lookup) | 0.97 | 0.86 | +| semantic (behavior / concept) | 0.85 | 0.02 | +| architecture (design / structure) | 0.82 | 0.00 | ### Recall at fixed token budgets @@ -110,19 +106,11 @@ A coarser, label-based view across the full 1,251-query benchmark: a relevant fi
Methodology -**Retrieval units.** For each query we retrieve units in rank order — semble chunks for semble, full files (in match-count order) for `grep + read file`, merged context windows for `ripgrep -C N` — and accumulate tokens (`cl100k_base` via `tiktoken`). Naive `grep` is run with `--fixed-strings --ignore-case` on the raw query. The keyword variant first asks gpt-5-mini for 1–3 search terms (joined as a regex `|`); patterns that fail an identifier-token sanity check fall back to `re.escape(query)`. Both grep variants are scoped via `--glob` to the same code-file extensions and ignored directories that semble's file walker uses, so all three workflows search the same corpus. - -**Budget enforcement (judge mode only).** In the LLM-as-judge eval each context is hard-capped at its stated budget: the candidate string is encoded once, then sliced by token IDs and asserted `len(ids) ≤ budget`. The recall mode below does not truncate; its curves record cumulative tokens of whole retrieved units, which is the right shape for "tokens to surface the answer." - -**Sample policy.** The judge sample is **macro-balanced** — 66 queries per category — not proportional to the underlying 703/344/204 split. This is conservative for semble's claim: a proportional sample would overweight semantic queries (where grep does worst) and inflate the headline. The recall benchmark below uses all 1,251 queries with no rebalancing. - -**Sensitivity of the top-20 file cap.** Sweeping top-{5, 10, 20, 50} on the same sample (saved alongside the default cap in the same artifact), keyword-grep+read answer rates fall in 71.2–72.7% and the end-to-end reduction range is 76.3–77.2%. The cap is bounded by the 16k token budget, not the file count, so the choice is not load-bearing. - -**Sufficiency judging.** GPT-5-mini sees the query and the retrieved context (capped at the per-method budget) and answers a strict yes/no on whether the context contains code that directly addresses the query. +For each query we retrieve units in rank order — semble chunks for semble, full files in match-count order for `grep+read`, and merged context windows for `ripgrep -C 8` in the recall curve. Tokens are counted with `cl100k_base` via `tiktoken`. `grep` is run with `--fixed-strings --ignore-case` on the raw query and scoped via `--glob` to the same code-file extensions and ignored directories that semble indexes. -**End-to-end cost model.** `expected_cost = retrieval_tokens + (1 − answer_rate) × fallback_tokens`. The fallback is set to 7,474 tokens — the median tokens grep+read spends to surface a relevant file, derived from the recall benchmark. This is *pessimistic* for semble: it assumes the agent rebuilds context from scratch on every miss, with no credit for chunks semble already returned. +In judge mode each context is hard-capped at its stated budget by token IDs and asserted `len(ids) ≤ budget`. Recall mode does not truncate; its curves record cumulative tokens of whole retrieved units. The judge sample is macro-balanced across categories; the recall benchmark uses all 1,251 queries. -**Recall.** A relevant file is "covered" once any retrieved unit comes from it. Most labels are file-level; where line spans are present we require span overlap. +GPT-5-mini sees the query and capped retrieved context and answers a strict yes/no on whether the context contains code that directly addresses the query. A relevant file is "covered" in recall once any retrieved unit comes from it; where line spans are present we require span overlap.
@@ -262,22 +250,21 @@ uv run python -m benchmarks.baselines.coderankembed --mode semantic
Context-efficiency benchmark -Requires the `benchmark` extra (`uv sync --extra benchmark`), `rg` on `$PATH`, and an `OPENAI_API_KEY` environment variable (used for keyword extraction and the LLM-as-judge baseline; `--no-keyword` skips it for the recall mode). +Requires the `benchmark` extra (`uv sync --extra benchmark`) and `rg` on `$PATH`. Judge mode also needs `OPENAI_API_KEY`. ```bash # Recall vs. token-budget across all queries; plots automatically. uv run python -m benchmarks.context_efficiency recall -uv run python -m benchmarks.context_efficiency recall --repo fastapi --no-keyword +uv run python -m benchmarks.context_efficiency recall --repo fastapi # LLM-as-judge sufficiency on a stratified sample. uv run python -m benchmarks.context_efficiency judge --sample 200 -uv run python -m benchmarks.context_efficiency judge --sample 200 --keyword-caps 5 10 20 50 # Regenerate the plot from a saved recall payload. uv run python -m benchmarks.context_efficiency plot ``` -Writes `benchmarks/results/context-efficiency-{recall,judge}-.json` and `assets/images/recall_vs_tokens.png`. +Writes `benchmarks/results/context-efficiency-{recall,judge}-.json`, compact judge records as JSONL, and `assets/images/recall_vs_tokens.png`.
diff --git a/benchmarks/context_efficiency.py b/benchmarks/context_efficiency.py index d00719f..45290db 100644 --- a/benchmarks/context_efficiency.py +++ b/benchmarks/context_efficiency.py @@ -2,7 +2,6 @@ import asyncio import json import random -import re import subprocess import sys import time @@ -24,6 +23,7 @@ add_filter_args, grouped_tasks, load_filtered_tasks, + results_path, save_results, target_matches_location, ) @@ -43,9 +43,6 @@ _RG_CONTEXTS = (8,) _RG_MAX_MATCHES = 500 _SEMBLE_TOP_K = 50 -_KEYWORD_MAX_FILES = 20 -_KEYWORD_MODEL = "gpt-5-mini" -_KEYWORD_CONCURRENCY = 16 _JUDGE_MODEL = "gpt-5-mini" _JUDGE_CONCURRENCY = 8 _JUDGE_RETRIES = 3 @@ -56,23 +53,6 @@ _IMAGES_DIR = Path(__file__).parent.parent / "assets" / "images" _RESULTS_DIR = Path(__file__).parent / "results" -_KEYWORD_PROMPT = """\ -Extract 1–3 grep-friendly search terms from the code search query below. -Terms will be joined with | and used as a ripgrep regex pattern (not fixed strings). -Prefer specific identifiers, class names, or technical keywords over generic words. -Return only the pipe-separated terms — no explanation, no quotes, no punctuation. - -Examples: - flat_hash_map → flat_hash_map - absl::flat_hash_map and flat_hash_set containers → flat_hash_map|flat_hash_set - how does authentication middleware work → middleware|authentication - request lifecycle and error handling → lifecycle|error_handling - how are worker threads managed → worker_thread|thread_pool|ThreadPool - -Query: {query} -Terms:\ -""" - _JUDGE_PROMPT = """\ You are evaluating whether retrieved code context is sufficient to answer a code search query. @@ -113,23 +93,20 @@ def _semble_units(index: SembleIndex, query: str) -> list[Chunk]: return [r.chunk for r in index.search(query, top_k=_SEMBLE_TOP_K)] -def _rg_command(pattern: str, repo_dir: Path, *, fixed_strings: bool) -> list[str]: +def _rg_command(pattern: str, repo_dir: Path) -> list[str]: """Build the rg command line, scoped to the same code-file universe semble indexes.""" - cmd = ["rg", "--json"] - if fixed_strings: - cmd.append("--fixed-strings") - cmd.append("--ignore-case") + cmd = ["rg", "--json", "--fixed-strings", "--ignore-case"] for glob in (*_RG_EXCLUDE_GLOBS, *_RG_INCLUDE_GLOBS): cmd += ["--glob", glob] cmd += [pattern, str(repo_dir)] return cmd -def _rg_matches(pattern: str, repo_dir: Path, *, fixed_strings: bool) -> list[tuple[str, int]]: +def _rg_matches(pattern: str, repo_dir: Path) -> list[tuple[str, int]]: """Return (file_path, line_number) matches via rg --json, in rg's output order.""" try: proc = subprocess.run( - _rg_command(pattern, repo_dir, fixed_strings=fixed_strings), + _rg_command(pattern, repo_dir), capture_output=True, text=True, timeout=30, @@ -158,7 +135,7 @@ def _rg_matches(pattern: str, repo_dir: Path, *, fixed_strings: bool) -> list[tu def _ripgrep_units(query: str, repo_dir: Path, context: int) -> list[Chunk]: """Ripgrep windows: files ranked by match count desc, windows merged within file.""" - matches = _rg_matches(query, repo_dir, fixed_strings=True) + matches = _rg_matches(query, repo_dir) if not matches: return [] per_file: dict[str, list[int]] = defaultdict(list) @@ -188,17 +165,12 @@ def _ripgrep_units(query: str, repo_dir: Path, context: int) -> list[Chunk]: def _grep_file_units( pattern: str, repo_dir: Path, - *, - fixed_strings: bool, - max_files: int | None = None, ) -> list[Chunk]: """Return whole matched files in match-count order.""" - matches = _rg_matches(pattern, repo_dir, fixed_strings=fixed_strings) + matches = _rg_matches(pattern, repo_dir) if not matches: return [] ranked = sorted(Counter(path for path, _ in matches[:_RG_MAX_MATCHES]).items(), key=lambda kv: (-kv[1], kv[0])) - if max_files is not None: - ranked = ranked[:max_files] units: list[Chunk] = [] for path, _ in ranked: try: @@ -209,80 +181,23 @@ def _grep_file_units( return units -def _keyword_method(cap: int) -> str: - """Return the method label for a keyword-grep file cap.""" - return "keyword-grep+read" if cap == _KEYWORD_MAX_FILES else f"keyword-grep+read-top{cap}" - - def _retrieval_units_for_task( index: SembleIndex, task: Task, repo_dir: Path, *, - keywords: dict[str, str] | None, - keyword_caps: tuple[int, ...] = (_KEYWORD_MAX_FILES,), include_ripgrep: bool = False, ) -> list[tuple[str, list[Chunk]]]: """Return retrieval-method units for a task in benchmark order.""" methods = [ ("semble", _semble_units(index, task.query)), - ("grep+read", _grep_file_units(task.query, repo_dir, fixed_strings=True)), + ("grep+read", _grep_file_units(task.query, repo_dir)), ] - if keywords is not None: - pattern = keywords.get(task.query, task.query) - methods.extend( - (_keyword_method(cap), _grep_file_units(pattern, repo_dir, fixed_strings=False, max_files=cap)) - for cap in keyword_caps - ) if include_ripgrep: methods.extend((f"ripgrep-c{c}", _ripgrep_units(task.query, repo_dir, c)) for c in _RG_CONTEXTS) return methods -_KEYWORD_TOKEN_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_:.\-]{0,63}$") - - -def _sanitize_keywords(pattern: str) -> str | None: - """Accept a pipe-joined regex pattern only if every segment is an identifier-like token.""" - parts = [p.strip() for p in pattern.split("|") if p.strip()] - if not parts or len(parts) > 5: - return None - if not all(_KEYWORD_TOKEN_RE.match(p) for p in parts): - return None - return "|".join(parts) - - -async def _extract_keyword_pattern(query: str, client: AsyncOpenAI) -> str: - """Ask the LLM for 1–3 pipe-separated grep terms; sanitize, fall back to re.escape(query) on failure.""" - fallback = re.escape(query) - try: - resp = await client.responses.create( - model=_KEYWORD_MODEL, - input=_KEYWORD_PROMPT.format(query=query), - reasoning={"effort": "minimal"}, - ) - raw = (resp.output_text or "").strip().strip('"').strip("'") - sanitized = _sanitize_keywords(raw) - return sanitized if sanitized is not None else fallback - except Exception: # noqa: BLE001 - return fallback - - -async def _prefetch_keywords(queries: list[str]) -> dict[str, str]: - """Return {query: regex_pattern} for all unique queries via LLM keyword extraction.""" - unique = list(dict.fromkeys(queries)) - client = AsyncOpenAI() - sem = asyncio.Semaphore(_KEYWORD_CONCURRENCY) - results: dict[str, str] = {} - - async def worker(q: str) -> None: - async with sem: - results[q] = await _extract_keyword_pattern(q, client) - - await asyncio.gather(*(worker(q) for q in unique)) - return results - - def _curve(units: list[Chunk], targets: tuple[Target, ...], enc: Any) -> Curve: """Cumulative (tokens, covered_target_count) after each retrieved unit, starting at (0, 0).""" covered = [False] * len(targets) @@ -454,7 +369,6 @@ def _evaluate_repo_recall( tasks: list[Task], repo_dir: Path, enc: Any, - keywords: dict[str, str] | None, ) -> dict[str, MethodCurves]: """Build per-method curves for every task in the repo.""" methods: dict[str, MethodCurves] = defaultdict(list) @@ -466,7 +380,6 @@ def _evaluate_repo_recall( index, task, repo_dir, - keywords=keywords, include_ripgrep=True, ): methods[method].append((_curve(units, targets, enc), n)) @@ -478,8 +391,6 @@ def _build_pending_judge( repo_specs: dict[str, Any], model: StaticModel, enc: Any, - keywords: dict[str, str], - keyword_caps: tuple[int, ...], ) -> list[tuple[Task, str, str, int]]: """Build (task, method, context, tokens) inputs for the LLM judge across all sampled tasks.""" pending: list[tuple[Task, str, str, int]] = [] @@ -494,8 +405,6 @@ def _build_pending_judge( index, task, spec.benchmark_dir, - keywords=keywords, - keyword_caps=keyword_caps, ): budget = _JUDGE_SEMBLE_BUDGET if method == "semble" else _JUDGE_GREP_BUDGET context, tokens = _format_context(units, budget, enc) @@ -527,16 +436,30 @@ def _aggregate_judge(records: list[JudgeRecord], attempted_per_method: dict[str, return out +def _save_judge_records(records: list[JudgeRecord]) -> Path: + """Write per-query judge records as compact JSONL for version comparisons.""" + out = results_path("context-efficiency-judge-records").with_suffix(".jsonl") + lines = [ + json.dumps( + { + "repo": r.repo, + "query": r.query, + "category": r.category, + "method": r.method, + "tokens": r.tokens_used, + "answered": r.answered, + }, + separators=(",", ":"), + ) + for r in records + ] + out.write_text("\n".join(lines) + "\n", encoding="utf-8") + return out + + _PLOT_STYLE: dict[str, dict[str, object]] = { "semble": {"label": "semble", "color": "#1a5fa8", "linewidth": 2.4, "zorder": 4}, - "keyword-grep+read": { - "label": "keyword grep + read file", - "color": "#d35400", - "linewidth": 1.8, - "zorder": 3, - "linestyle": "--", - }, - "grep+read": {"label": "naive grep + read file", "color": "#922b21", "linewidth": 1.8, "zorder": 3}, + "grep+read": {"label": "grep + read file", "color": "#922b21", "linewidth": 1.8, "zorder": 3}, "ripgrep-c8": { "label": "ripgrep -C 8 (snippets)", "color": "#707070", @@ -640,15 +563,6 @@ def run_recall(args: argparse.Namespace) -> None: enc = tiktoken.get_encoding(_TOKENIZER_NAME) model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) - keywords: dict[str, str] | None = None - if not args.no_keyword: - try: - print("Pre-fetching keyword patterns (requires OPENAI_API_KEY)...", file=sys.stderr) - keywords = asyncio.run(_prefetch_keywords([t.query for t in tasks])) - print(f" done ({len(keywords)} unique queries)", file=sys.stderr) - except Exception as exc: # noqa: BLE001 - print(f" keyword pre-fetch failed ({exc}); skipping keyword-grep+read", file=sys.stderr) - method_curves: dict[str, MethodCurves] = defaultdict(list) print(f"\n{'Repo':<22} {'Language':<12} {'Tasks':>6} {'Time':>8}", file=sys.stderr) print(f"{'-' * 22} {'-' * 12} {'-' * 6} {'-' * 8}", file=sys.stderr) @@ -656,7 +570,7 @@ def run_recall(args: argparse.Namespace) -> None: spec = repo_specs[repo] started = time.perf_counter() index = SembleIndex.from_path(spec.benchmark_dir, model=model) - per_method = _evaluate_repo_recall(index, repo_task_list, spec.benchmark_dir, enc, keywords) + per_method = _evaluate_repo_recall(index, repo_task_list, spec.benchmark_dir, enc) for m, lst in per_method.items(): method_curves[m].extend(lst) print( @@ -700,11 +614,7 @@ def run_judge(args: argparse.Namespace) -> None: enc = tiktoken.get_encoding(_TOKENIZER_NAME) model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) - print("Pre-fetching keyword patterns...", file=sys.stderr) - keywords = asyncio.run(_prefetch_keywords([t.query for t in sample])) - print(f" done ({len(keywords)} unique queries)", file=sys.stderr) - - pending = _build_pending_judge(sample, repo_specs, model, enc, keywords, tuple(args.keyword_caps)) + pending = _build_pending_judge(sample, repo_specs, model, enc) attempted_per_method: dict[str, int] = defaultdict(int) for _, method, _, _ in pending: attempted_per_method[method] += 1 @@ -743,11 +653,9 @@ def run_judge(args: argparse.Namespace) -> None: for method, c in e_costs.items(): print(f" {method:<24} {c:>9.0f}", file=sys.stderr) - if "semble" in e_costs: - for method in ("grep+read", "keyword-grep+read"): - if method in e_costs and e_costs[method] > 0: - reduction = 1.0 - e_costs["semble"] / e_costs[method] - print(f"Reduction (semble vs {method}, end-to-end): {reduction:.1%}", file=sys.stderr) + if "semble" in e_costs and e_costs.get("grep+read", 0) > 0: + reduction = 1.0 - e_costs["semble"] / e_costs["grep+read"] + print(f"Reduction (semble vs grep+read, end-to-end): {reduction:.1%}", file=sys.stderr) payload = { "tool": "context-efficiency-judge", @@ -757,24 +665,15 @@ def run_judge(args: argparse.Namespace) -> None: "seed": args.seed, "budgets": {"semble": _JUDGE_SEMBLE_BUDGET, "grep+read": _JUDGE_GREP_BUDGET}, "fallback_tokens": fallback, - "keyword_patterns": keywords, "summary": summary, "raw_retrieval_reduction_vs_semble": {m: round(v, 4) for m, v in raw_reductions.items() if m != "semble"}, "expected_cost": e_costs, - "records": [ - { - "repo": r.repo, - "query": r.query, - "category": r.category, - "method": r.method, - "tokens": r.tokens_used, - "answered": r.answered, - } - for r in records - ], } + records_out = _save_judge_records(records) + payload["records_file"] = records_out.name out = save_results("context-efficiency-judge", payload) print(f"\nResults saved to {out}", file=sys.stderr) + print(f"Records saved to {records_out}", file=sys.stderr) def run_plot(args: argparse.Namespace) -> None: @@ -791,12 +690,11 @@ def run_plot(args: argparse.Namespace) -> None: def _parse_args() -> argparse.Namespace: """Parse CLI arguments.""" parser = argparse.ArgumentParser(description="Context-efficiency benchmark: semble vs grep workflows.") - parser.set_defaults(func=run_recall, repo=[], language=[], no_keyword=False, no_plot=False) + parser.set_defaults(func=run_recall, repo=[], language=[], no_plot=False) sub = parser.add_subparsers(dest="mode", required=False) recall = sub.add_parser("recall", help="Recall vs. token-budget across all queries (default).") add_filter_args(recall) - recall.add_argument("--no-keyword", action="store_true", help="Skip the LLM keyword-extraction baseline.") recall.add_argument("--no-plot", action="store_true", help="Skip plotting after the run.") recall.set_defaults(func=run_recall) @@ -810,13 +708,6 @@ def _parse_args() -> argparse.Namespace: default=7474.0, help="Tokens an agent spends to fall back on a miss (pessimistic default).", ) - judge.add_argument( - "--keyword-caps", - type=int, - nargs="+", - default=[_KEYWORD_MAX_FILES], - help="Top-N file caps for keyword-grep+read sensitivity sweep.", - ) judge.set_defaults(func=run_judge) plot = sub.add_parser("plot", help="Regenerate the recall-vs-tokens plot from a saved JSON.") diff --git a/benchmarks/results/context-efficiency-judge-6248855cfef8.json b/benchmarks/results/context-efficiency-judge-6248855cfef8.json index 80804f7..d511ba8 100644 --- a/benchmarks/results/context-efficiency-judge-6248855cfef8.json +++ b/benchmarks/results/context-efficiency-judge-6248855cfef8.json @@ -9,203 +9,6 @@ "grep+read": 16000 }, "fallback_tokens": 7474.0, - "keyword_patterns": { - "WebSocket upgrade and handler": "WebSocket\\ upgrade\\ and\\ handler", - "how download requests save responses to disk": "download_request|save_response_to_disk|download_to_file", - "serving a file index page for a folder on disk": "file_index|directory_listing|index_page", - "flow operators map filter transform and collect": "map|filter|collect", - "how middleware chains context transformations between procedures": "middleware|chain|context_transformation", - "how HTTP proxy tunnel CONNECT method is initiated": "CONNECT|HTTP_PROXY|proxy_tunnel", - "ObjectMapper": "ObjectMapper|ObjectMapper::readValue|com.fasterxml.jackson.databind.ObjectMapper", - "Notify": "notify|notification|NotifyListener", - "how SETRANGE modifies a substring within a string value": "how\\ SETRANGE\\ modifies\\ a\\ substring\\ within\\ a\\ string\\ value", - "parameter type coercion and value validation": "type_coercion|value_validation", - "SqlMapper": "SqlMapper", - "how plugin installations and updates are managed with tasks": "plugin_install|plugin_update|task_scheduler", - "how mini.pick implements a fuzzy finder picker": "mini.pick|fuzzy_finder|picker", - "timer implementation and heap-based scheduling": "timer_impl|heap_scheduler|timing_wheel", - "how the async mutex prevents concurrent access": "async_mutex|AsyncMutex|mutex_async", - "BoxedIntoRoute and type-erased route storage": "BoxedIntoRoute|type-erased|route_storage", - "Uri": "Uri|URI|IUriProvider", - "CommandDefinition": "CommandDefinition", - "jump plugin for bookmarking directories": "jump|bookmark|directory_bookmark", - "AsyncClient": "AsyncClient|Async::Client|AsyncClientImpl", - "JsonReader base class and token reading API": "JsonReader|token|TokenType", - "radix tree path matching": "radix_tree|radix_trie|path_matching", - "how res.redirect builds the Location header and status code": "how\\ res\\.redirect\\ builds\\ the\\ Location\\ header\\ and\\ status\\ code", - "how Monad composes dependent effectful computations with flatMap": "Monad|flatMap|dependent_effects", - "before and after filter hooks for the request lifecycle": "before_filter|after_filter|request_lifecycle", - "test runner worker pool scheduling and execution": "worker_pool|test_runner|scheduling", - "how xmonad handles floating windows separately from tiled ones": "xmonad|floating|tiled", - "how listeners are subscribed and notified after state changes": "listener|subscribe|notify", - "StringUtils": "StringUtils|string_utils|StringUtility", - "how curl decides whether to retry a failed request": "curl_retry|CURLOPT_RETRY|retry_after", - "how backpressure and flow control work in streaming": "backpressure|flow_control|streaming_protocol", - "URL": "url|URL|Uri", - "Sinatra::ShowExceptions": "Sinatra::ShowExceptions", - "InterceptorManager": "InterceptorManager", - "MiddlewareBuilder": "MiddlewareBuilder", - "how query parameters are extracted and decoded from URIs": "query_param|parse_qs|URLDecoder", - "inferProcedureInput": "inferProcedureInput|infer_procedure_input|InferProcedureInput", - "Channel": "Channel|channel_layer|broadcast", - "APIRouter": "APIRouter", - "how discriminated unions select the right model variant": "discriminated_union|tagged_union|variant_selection", - "how Phoenix logs request and response lifecycle events": "Phoenix.Logger|telemetry|Plug.Conn", - "event hooks system": "event_hook|hook_system|event_listener", - "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides": "layout_anchor|anchor_property|layout_guide", - "how HttpRoutes define pattern-matched HTTP request handlers": "HttpRoutes|pattern-matched|request_handler", - "how subword token weights are aggregated for whole-word embeddings": "subword_token|whole_word_embedding|token_weighting", - "rvm ruby version manager plugin": "rvm|ruby-version|rvm-plugin", - "battery level detection for shell prompt": "battery_level|power_supply|upower", - "how app.render resolves views and calls the template engine": "app.render|render_views|template_engine", - "syslog handler for system-level logging": "syslog|SysLogHandler|systemd-journald", - "how type inference extracts input and output types from procedures": "type_inference|input_type|output_type", - "how MethodRouter dispatches GET POST PUT DELETE by HTTP method": "MethodRouter|dispatch|HTTP_METHOD", - "HCursor and cursor navigation for traversing JSON trees": "HCursor|cursor_navigation|JsonCursor", - "how RDB persistence serializes the database to disk": "RDB|persistence|serialize", - "how are static files served": "static_file|static_files|serve_static", - "Kleisli": "Kleisli|kleisli|KleisliArrow", - "Sinatra::Helpers": "Sinatra::Helpers|Sinatra::Base|helpers", - "how nvm_has checks whether a command exists on the system": "nvm_has|nvm_has_function|command_exists", - "how bats should retry a flaky test": "flaky_test|retry_logic|test_retry", - "AnyRouter": "AnyRouter", - "request and response interceptors": "interceptor|request_interceptor|response_interceptor", - "adl_serializer": "adl_serializer", - "toString builder for human-readable object descriptions": "toString|to_string|toStringBuilder", - "spawning and aborting async subprocess commands with uv": "uv_spawn|uv_process_kill|libuv", - "how zls provides goto definition for symbols": "goto_definition|definition_provider|symbol_resolution", - "Utils": "Utils|UtilsImpl|util_namespace", - "Codec combining Encoder and Decoder for bidirectional conversion": "Codec|Encoder|Decoder", - "Mutex": "Mutex|std::mutex|pthread_mutex_t", - "TypeFactory": "TypeFactory", - "how server-sent events and subscriptions are streamed to the client": "server-sent-events|SSE|EventSource", - "how vitest discovers and runs test files": "vitest|vite-plugin-test|testRegex", - "how the PandocMonad typeclass abstracts IO for readers and writers": "PandocMonad|Reader|Writer", - "hub github cli aliases and helpers": "hub|github|cli", - "how toJSONKeyText creates a ToJSONKey instance from a text function": "toJSONKeyText|ToJSONKey|ToJSONKeyHelper", - "RotatingFileHandler": "RotatingFileHandler|RotatingFileHandler.py|RotatingFileHandlerConfig", - "HTTPStatusError": "HTTPStatusError", - "how zls DocumentStore loads and caches Zig source files": "how\\ zls\\ DocumentStore\\ loads\\ and\\ caches\\ Zig\\ source\\ files", - "how curl resolves and connects to a remote host": "curl_resolve|Curl_connect|CURLOPT_RESOLVE", - "basic_json": "basic_json|nlohmann::basic_json|to_json", - "middleware pipeline composition": "middleware|pipeline|composition", - "Application": "Application|App|application.py", - "reducer type definition": "reducer|Reducer|ReducerType", - "how debug.print outputs to stderr for debugging": "debug.print|stderr|debugging", - "FromRequest": "FromRequest|FromRequestParts|axum::extract::FromRequest", - "ssh agent plugin for managing ssh keys": "ssh-agent|ssh-agent-plugin|ssh-key-agent", - "how mini.completion provides LSP-based autocompletion": "mini.completion|LSP|autocompletion", - "node version manager nvm integration": "nvm|node_version_manager|nvmrc", - "how client plugins intercept and transform requests and responses": "client_plugin|intercept_request|transform_response", - "absl::AnyInvocable for move-only callable wrapper": "AnyInvocable|absl::AnyInvocable|move-only", - "case-insensitive hash for request params": "case_insensitive_hash|CaseInsensitiveHash|case_insensitive_map", - "how nvm finds the nearest .nvmrc file by walking up the directory tree": "how\\ nvm\\ finds\\ the\\ nearest\\ \\.nvmrc\\ file\\ by\\ walking\\ up\\ the\\ directory\\ tree", - "how text sections are rendered in the lazy view": "lazy_view|text_section|render_section", - "how zls generates diagnostic errors and warnings": "zls|diagnostic|diagnostics", - "PowerShell completion generation": "powershell_completion|tab_completion|CompletionResult", - "Sinatra::Application": "Sinatra::Application|Sinatra::Base|Sinatra::Delegator", - "BackgroundTasks": "BackgroundTasks|background_task|BackgroundTask", - "Rails::Paths": "Rails::Paths|Rails::Application::Paths|rails_paths", - "how does Flask convert a view return value into a response object": "flask|make_response|flask.Response", - "how route groups and route collections compose routes": "route_group|route_collection|compose_routes", - "Request": "http_request|HTTPRequest|request_handler", - "IMessagePackFormatter": "IMessagePackFormatter|MessagePackFormatter|IMessagePackSerializer", - "how Kleisli composes functions that return monadic values": "Kleisli|monad|bind", - "how Phoenix routes are defined and dispatched to controller actions": "Phoenix.Router|route|controller_action", - "Command": "command|CLI|execute", - "how server trust evaluation handles SSL certificate pinning": "certificate_pinning|ssl_pinning|trust_evaluation", - "how slave keys with expiry are tracked in replication": "replication|slave_keys|expire_keys", - "how the event loop handles file events and time events": "event_loop|file_event|time_event", - "ObjectWriter": "ObjectWriter|ObjectWriter::Write|IObjectWriter", - "how lazy.nvim loads a plugin on demand when its trigger fires": "lazy.nvim|on_event|lazy.require", - "Monad": "Monad|monad|Functor", - "naming conventions for controllers and view modules": "controller|controller_name|view_module", - "how pandoc reads RST reStructuredText documents": "pandoc|reStructuredText|rst", - "BaseHTTPMiddleware": "BaseHTTPMiddleware|BaseHTTPMiddlewareDispatch", - "how PCA reduces embedding dimensionality": "PCA|principal_component_analysis|dimensionality_reduction", - "how tasks that are not Send can run on a single thread": "how\\ tasks\\ that\\ are\\ not\\ Send\\ can\\ run\\ on\\ a\\ single\\ thread", - "how is response validation and serialization applied before sending": "response_validation|response_serialization|serialize_response", - "UDP socket send and receive": "udp_send|udp_receive|recvfrom", - "Args": "Args|argparse|CommandLineParser", - "how app.handle dispatches requests through the middleware stack": "app.handle|middleware_stack|dispatches", - "how curl checks if HTTP If-Modified-Since condition is met": "If-Modified-Since|If-None-Match|curl_conditional_request", - "field_validator": "field_validator|FieldValidator|validate_field", - "saving and loading models from disk": "save_model|load_model|model_checkpoint", - "how the preprocessed test source is evaluated": "preprocessed_test|test_source|evaluate", - "StateManager": "StateManager", - "how proxy settings are read from environment variables": "http_proxy|HTTP_PROXY|no_proxy", - "fake timers and timer mocking utilities": "fake_timers|timer_mock|time_mocking", - "Rack::Response": "Rack::Response|Rack::Request|middleware", - "how Encoder typeclass converts Scala values to JSON": "Encoder|typeclass|toJson", - "how typeMismatch produces an error message for wrong JSON types": "typeMismatch|DecodingError|expected_value_type", - "ConstraintMaker": "ConstraintMaker|MASConstraintMaker|makeConstraints", - "how derive macros parse and apply field-level serde attributes": "derive_macro|serde_attribute|field_attributes", - "available request options and their configuration": "request_options|RequestOptions|request_config", - "how zls computes document scope for variable visibility": "document_scope|variable_visibility|zls", - "how the HTTP transport backend sends requests over the wire": "HTTPTransport|sendRequest|transport_backend", - "how nvm downloads a Node.js tarball from the remote": "nvm|download|tarball", - "how zls traverses the Zig AST to resolve symbol scopes": "Zig|AST|symbol_scope", - "how nvm manages the PATH to point to the active Node.js bin": "nvm|NODE_PATH|node_version_manager", - "value-based deserialization for self-describing formats": "self_describing|value_based_deserialization|self_describing_format", - "how does FastAPI run sync route functions without blocking": "how\\ does\\ FastAPI\\ run\\ sync\\ route\\ functions\\ without\\ blocking", - "Java runtime and OS system property helpers": "System.getProperty|RuntimeMXBean|os.name", - "snapshot testing serialization and comparison": "snapshot_testing|snapshot|serialization", - "decorator API for defining commands, options, and arguments": "decorator|command_decorator|option_argument_decorator", - "Rack::Builder": "Rack::Builder|rackup|config.ru", - "how tRPC procedures are defined and chained with input and output validation": "trpc|procedure|input_output_validation", - "formatter": "formatter|formatting|FormatException", - "res.send body encoding and ETag generation": "res.send|ETag|body_encoding", - "ClientResponse": "ClientResponse|client_response|HttpClientResponse", - "how bats finds a library in the BATS_LIB_PATH": "BATS_LIB_PATH|BATS_LIB|bats_find_library", - "how log records propagate through the handler bubble chain": "log_record|handler_chain|bubble_chain", - "queue connection resolution and connectors": "queue|connector|connection_resolution", - "HttpCookies": "HttpCookies|CookieJar|Set-Cookie", - "SchemaUtils for creating and dropping database tables": "SchemaUtils|createTable|dropTable", - "HTML template rendering": "template_rendering|html_template|template_engine", - "how telescope actions map keys to picker operations": "telescope_actions|map_keys|picker_operations", - "chrono duration and time point formatting": "std::chrono::duration|std::chrono::time_point|strftime", - "static file serving middleware": "static_file|file_server|static_middleware", - "model_validator": "model_validator|ModelValidator|validate_model", - "how pandoc's app module orchestrates reading, filtering, and writing": "pandoc::App|App.hs|Filters", - "TypeAdapter": "TypeAdapter|TypeAdapterFactory|TypeAdapterRuntimeTypeWrapper", - "how binary data is deserialized back into typed C# objects": "BinaryFormatter|BinaryReader|Deserialize", - "how pandoc generates PDF output via LaTeX or other backends": "pandoc|LaTeX|PDF_backend", - "PreparedRequest": "PreparedRequest|PreparedRequestAdapter|PreparedRequestFactory", - "how the router matches path segments to controller/action": "router|path_segment|controller_action", - "mock handler for simulating HTTP responses in tests": "mock_handler|mock_http|fake_http_response", - "CompletionOptions": "CompletionOptions", - "Axios": "Axios|axios.request|axios.create", - "Rails command dispatch and subcommand routing": "Rails\\ command\\ dispatch\\ and\\ subcommand\\ routing", - "combineReducers": "combineReducers|combine_reducers|combine-reducers", - "how Dapper caches parameter and deserializer IL": "Dapper|parameter_cache|deserializer_IL", - "how Applicative combines independent effects": "Applicative|ApplicativeFunctor|zipWithA", - "how axum nests routers and merges router trees": "axum::Router|Router::merge|nest_router", - "running work after returning an HTTP response without blocking": "background_task|deferred_response|post_response_task", - "connection filter chain setup for proxies and TLS": "filter_chain|connection_manager|tls_context", - "how nvm_get_latest fetches the latest available Node.js version": "nvm_get_latest|get_latest|nvm-fetch", - "ZodType": "ZodType|ZodSchema|zod.object", - "how mini.deps manages Neovim plugin installation and updates": "mini.deps|Neovim|plugin_installation", - "Schema": "schema|Schema|DBSchema", - "how Validated accumulates errors across independent computations": "Validated|accumulate_errors|ValidationNel", - "server startup initialization and configuration loading": "server_startup|initialization|configuration_loading", - "createStore": "createStore|configureStore|redux_store", - "streaming JSON reader and token parsing": "streaming_json|json_reader|token_parsing", - "JsonParser": "JsonParser", - "bindActionCreators": "bindActionCreators|redux|react-redux", - "how mini.diff shows inline git diff signs in buffers": "how\\ mini\\.diff\\ shows\\ inline\\ git\\ diff\\ signs\\ in\\ buffers", - "Router": "Router|Routing|route_match", - "DigestAuth": "DigestAuth|DigestAuthentication|HTTPDigest", - "how the handler stack wraps middleware around the HTTP send": "handler_stack|middleware|http_send", - "Serialize": "serialize|Serializer|Serialization", - "axios default configuration and request/response transformers": "axios|default_adapter|transformRequest|transformResponse", - "Ecto.Changeset for validating and transforming data": "Ecto.Changeset|changeset|validate_change", - "applyMiddleware": "applyMiddleware|middleware|redux", - "how type adapter factories are registered and selected for a given type": "type_adapter_factory|TypeAdapterFactory|register_type_adapter", - "ExceptionUtils": "ExceptionUtils|ExceptionUtil|exception_utils", - "boolean conversion and parsing helpers": "boolean_conversion|parse_bool|bool_parser", - "Ecto.Query DSL for composing SQL queries": "Ecto.Query|Ecto.Queryable|from", - "how log handlers are registered and invoked by Logger": "Logger|log_handler|register_handler" - }, "summary": { "semble": { "n": 198, @@ -230,9575 +33,14 @@ "semantic": 0.015151515151515152, "symbol": 0.8636363636363636 } - }, - "keyword-grep+read-top5": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.7171717171717171, - "mean_tokens_retrieved": 10132.939393939394, - "answer_rate_by_category": { - "architecture": 0.6818181818181818, - "semantic": 0.5454545454545454, - "symbol": 0.9242424242424242 - } - }, - "keyword-grep+read-top10": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.7272727272727273, - "mean_tokens_retrieved": 10565.38383838384, - "answer_rate_by_category": { - "architecture": 0.7121212121212122, - "semantic": 0.5303030303030303, - "symbol": 0.9393939393939394 - } - }, - "keyword-grep+read": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.7121212121212122, - "mean_tokens_retrieved": 10594.934343434343, - "answer_rate_by_category": { - "architecture": 0.6818181818181818, - "semantic": 0.5151515151515151, - "symbol": 0.9393939393939394 - } - }, - "keyword-grep+read-top50": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.7171717171717171, - "mean_tokens_retrieved": 10594.929292929293, - "answer_rate_by_category": { - "architecture": 0.6818181818181818, - "semantic": 0.5303030303030303, - "symbol": 0.9393939393939394 - } } }, "raw_retrieval_reduction_vs_semble": { - "grep+read": 0.4996, - "keyword-grep+read-top5": 0.8027, - "keyword-grep+read-top10": 0.8107, - "keyword-grep+read": 0.8113, - "keyword-grep+read-top50": 0.8113 + "grep+read": 0.4996 }, "expected_cost": { "semble": 2905.5505050505053, - "grep+read": 9281.00505050505, - "keyword-grep+read-top5": 12246.79797979798, - "keyword-grep+read-top10": 12603.747474747475, - "keyword-grep+read": 12746.540404040403, - "keyword-grep+read-top50": 12708.78787878788 + "grep+read": 9281.00505050505 }, - "records": [ - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "Mutex", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "abseil-cpp", - "query": "absl::AnyInvocable for move-only callable wrapper", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how toJSONKeyText creates a ToJSONKey instance from a text function", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "aeson", - "query": "how typeMismatch produces an error message for wrong JSON types", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "aiohttp", - "query": "how backpressure and flow control work in streaming", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "aiohttp", - "query": "ClientResponse", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how download requests save responses to disk", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "alamofire", - "query": "how server trust evaluation handles SSL certificate pinning", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "grep+read", - "tokens": 2148, - "answered": true - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 2148, - "answered": true - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 2148, - "answered": true - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 2148, - "answered": true - }, - { - "repo": "axios", - "query": "InterceptorManager", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 2148, - "answered": true - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 2214, - "answered": true - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 2214, - "answered": true - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 2214, - "answered": true - }, - { - "repo": "axios", - "query": "request and response interceptors", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 2214, - "answered": true - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 10824, - "answered": true - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "axios", - "query": "Axios", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 10824, - "answered": true - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "axios", - "query": "axios default configuration and request/response transformers", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "WebSocket upgrade and handler", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "BoxedIntoRoute and type-erased route storage", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "how MethodRouter dispatches GET POST PUT DELETE by HTTP method", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "FromRequest", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "how axum nests routers and merges router trees", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "axum", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 10727, - "answered": true - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 10727, - "answered": true - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 10727, - "answered": true - }, - { - "repo": "bash-it", - "query": "jump plugin for bookmarking directories", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 10727, - "answered": true - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 1449, - "answered": true - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 1449, - "answered": true - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 1449, - "answered": true - }, - { - "repo": "bash-it", - "query": "battery level detection for shell prompt", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 1449, - "answered": true - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 12176, - "answered": true - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 14570, - "answered": true - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "bash-it", - "query": "rvm ruby version manager plugin", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 12236, - "answered": true - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 14011, - "answered": true - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "bash-it", - "query": "hub github cli aliases and helpers", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 961, - "answered": true - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 961, - "answered": true - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 961, - "answered": true - }, - { - "repo": "bash-it", - "query": "ssh agent plugin for managing ssh keys", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 961, - "answered": true - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 10760, - "answered": true - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 14340, - "answered": true - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 14340, - "answered": true - }, - { - "repo": "bash-it", - "query": "node version manager nvm integration", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 14340, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how bats should retry a flaky test", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 7015, - "answered": true - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 7015, - "answered": true - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 7015, - "answered": true - }, - { - "repo": "bats-core", - "query": "how the preprocessed test source is evaluated", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 7015, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 9550, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 9550, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 9550, - "answered": true - }, - { - "repo": "bats-core", - "query": "how bats finds a library in the BATS_LIB_PATH", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 9550, - "answered": true - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Monad composes dependent effectful computations with flatMap", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Kleisli", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "cats", - "query": "how Kleisli composes functions that return monadic values", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": false - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "Monad", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Applicative combines independent effects", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "cats", - "query": "how Validated accumulates errors across independent computations", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "chi", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "chi", - "query": "Router", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "Codec combining Encoder and Decoder for bidirectional conversion", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "HCursor and cursor navigation for traversing JSON trees", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 10462, - "answered": true - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 14983, - "answered": true - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 14983, - "answered": true - }, - { - "repo": "circe", - "query": "how Encoder typeclass converts Scala values to JSON", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 14983, - "answered": true - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "parameter type coercion and value validation", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "click", - "query": "decorator API for defining commands, options, and arguments", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 3252, - "answered": true - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 3252, - "answered": true - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 3252, - "answered": true - }, - { - "repo": "cobra", - "query": "PowerShell completion generation", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 3252, - "answered": true - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": false - }, - { - "repo": "cobra", - "query": "Args", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "Command", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": false - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": false - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": false - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": false - }, - { - "repo": "cobra", - "query": "CompletionOptions", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": false - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "StringUtils", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "toString builder for human-readable object descriptions", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "Java runtime and OS system property helpers", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "boolean conversion and parsing helpers", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "commons-lang", - "query": "ExceptionUtils", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": false - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": false - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "curl", - "query": "how HTTP proxy tunnel CONNECT method is initiated", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": false - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl decides whether to retry a failed request", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl resolves and connects to a remote host", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "how curl checks if HTTP If-Modified-Since condition is met", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "curl", - "query": "connection filter chain setup for proxies and TLS", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "CommandDefinition", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "SqlMapper", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "dapper", - "query": "how Dapper caches parameter and deserializer IL", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Schema", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Changeset for validating and transforming data", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "ecto", - "query": "Ecto.Query DSL for composing SQL queries", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "exposed", - "query": "SchemaUtils for creating and dropping database tables", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how res.redirect builds the Location header and status code", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 10023, - "answered": true - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 10023, - "answered": true - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 10023, - "answered": true - }, - { - "repo": "express", - "query": "how app.render resolves views and calls the template engine", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 10023, - "answered": true - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 3953, - "answered": true - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 3953, - "answered": true - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 3953, - "answered": true - }, - { - "repo": "express", - "query": "how app.handle dispatches requests through the middleware stack", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 3953, - "answered": true - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 14712, - "answered": true - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 14712, - "answered": true - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 14712, - "answered": true - }, - { - "repo": "express", - "query": "res.send body encoding and ETag generation", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 14712, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "APIRouter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "grep+read", - "tokens": 9026, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "BackgroundTasks", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how is response validation and serialization applied before sending", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "how does FastAPI run sync route functions without blocking", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "fastapi", - "query": "running work after returning an HTTP response without blocking", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "flask", - "query": "how does Flask convert a view return value into a response object", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "chrono duration and time point formatting", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "fmtlib", - "query": "formatter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "radix tree path matching", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "grep+read", - "tokens": 719, - "answered": true - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "gin", - "query": "HTML template rendering", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "gson", - "query": "TypeAdapter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 923, - "answered": false - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 923, - "answered": false - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 923, - "answered": false - }, - { - "repo": "gson", - "query": "streaming JSON reader and token parsing", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 923, - "answered": false - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 10396, - "answered": true - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "gson", - "query": "JsonParser", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "gson", - "query": "how type adapter factories are registered and selected for a given type", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 8190, - "answered": true - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 8190, - "answered": true - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 8190, - "answered": true - }, - { - "repo": "guzzle", - "query": "available request options and their configuration", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 8190, - "answered": true - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "mock handler for simulating HTTP responses in tests", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 12695, - "answered": true - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "guzzle", - "query": "how the handler stack wraps middleware around the HTTP send", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "http4s", - "query": "Uri", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how query parameters are extracted and decoded from URIs", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 6846, - "answered": true - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 6846, - "answered": true - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 6846, - "answered": true - }, - { - "repo": "http4s", - "query": "how HttpRoutes define pattern-matched HTTP request handlers", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 6846, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "AsyncClient", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "httpx", - "query": "URL", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "grep+read", - "tokens": 11879, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 11879, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 11879, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 11879, - "answered": true - }, - { - "repo": "httpx", - "query": "HTTPStatusError", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 11879, - "answered": true - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "how the HTTP transport backend sends requests over the wire", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "grep+read", - "tokens": 3282, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 3282, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 3282, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 3282, - "answered": true - }, - { - "repo": "httpx", - "query": "DigestAuth", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 3282, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectMapper", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": false - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": false - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "TypeFactory", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": false - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "jackson-databind", - "query": "ObjectWriter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "flow operators map filter transform and collect", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15303, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "kotlinx-coroutines", - "query": "Channel", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "ktor", - "query": "how client plugins intercept and transform requests and responses", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "grep+read", - "tokens": 12425, - "answered": true - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 12425, - "answered": true - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 12425, - "answered": true - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 12425, - "answered": true - }, - { - "repo": "ktor", - "query": "HttpCookies", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 12425, - "answered": true - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 13025, - "answered": true - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "laravel-framework", - "query": "queue connection resolution and connectors", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how plugin installations and updates are managed with tasks", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "spawning and aborting async subprocess commands with uv", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how text sections are rendered in the lazy view", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "lazy.nvim", - "query": "how lazy.nvim loads a plugin on demand when its trigger fires", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "timer implementation and heap-based scheduling", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "libuv", - "query": "UDP socket send and receive", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "IMessagePackFormatter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "messagepack-csharp", - "query": "how binary data is deserialized back into typed C# objects", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.pick implements a fuzzy finder picker", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.completion provides LSP-based autocompletion", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.diff shows inline git diff signs in buffers", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "mini.nvim", - "query": "how mini.deps manages Neovim plugin installation and updates", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how subword token weights are aggregated for whole-word embeddings", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 10014, - "answered": true - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 10014, - "answered": true - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 10014, - "answered": true - }, - { - "repo": "model2vec", - "query": "how PCA reduces embedding dimensionality", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 10014, - "answered": true - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "model2vec", - "query": "saving and loading models from disk", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 3641, - "answered": true - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 3641, - "answered": true - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 3641, - "answered": true - }, - { - "repo": "monolog", - "query": "syslog handler for system-level logging", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 3641, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "grep+read", - "tokens": 1876, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 1876, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 1876, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 1876, - "answered": true - }, - { - "repo": "monolog", - "query": "RotatingFileHandler", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 1876, - "answered": true - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log records propagate through the handler bubble chain", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 5789, - "answered": false - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 14788, - "answered": false - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "monolog", - "query": "how log handlers are registered and invoked by Logger", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": false - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "newtonsoft-json", - "query": "JsonReader base class and token reading API", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "adl_serializer", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nlohmann-json", - "query": "basic_json", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_has checks whether a command exists on the system", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm finds the nearest .nvmrc file by walking up the directory tree", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm downloads a Node.js tarball from the remote", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm manages the PATH to point to the active Node.js bin", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "nvm", - "query": "how nvm_get_latest fetches the latest available Node.js version", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc reads RST reStructuredText documents", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how the PandocMonad typeclass abstracts IO for readers and writers", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc's app module orchestrates reading, filtering, and writing", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "pandoc", - "query": "how pandoc generates PDF output via LaTeX or other backends", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "phoenix", - "query": "how Phoenix logs request and response lifecycle events", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how Phoenix routes are defined and dispatched to controller actions", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "naming conventions for controllers and view modules", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "phoenix", - "query": "how the router matches path segments to controller/action", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "pydantic", - "query": "how discriminated unions select the right model variant", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "field_validator", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "pydantic", - "query": "model_validator", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "serving a file index page for a folder on disk", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Utils", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "grep+read", - "tokens": 5109, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Response", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "grep+read", - "tokens": 2490, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 2490, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 2490, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 2490, - "answered": true - }, - { - "repo": "rack", - "query": "Rack::Builder", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 2490, - "answered": true - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 1725, - "answered": true - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 1725, - "answered": true - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 1725, - "answered": true - }, - { - "repo": "rack", - "query": "static file serving middleware", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 1725, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 6420, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 6420, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 6420, - "answered": true - }, - { - "repo": "rack", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 6420, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "grep+read", - "tokens": 2801, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 2801, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 2801, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 2801, - "answered": true - }, - { - "repo": "rails", - "query": "Rails::Paths", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 2801, - "answered": true - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "rails", - "query": "Rails command dispatch and subcommand routing", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how SETRANGE modifies a substring within a string value", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": false - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how RDB persistence serializes the database to disk", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": false - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15230, - "answered": true - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how the event loop handles file events and time events", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": false - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "how slave keys with expiry are tracked in replication", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "redis", - "query": "server startup initialization and configuration loading", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 6635, - "answered": true - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 6635, - "answered": true - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 6635, - "answered": true - }, - { - "repo": "redux", - "query": "how listeners are subscribed and notified after state changes", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 6635, - "answered": true - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 7692, - "answered": true - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 7692, - "answered": true - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 7692, - "answered": true - }, - { - "repo": "redux", - "query": "middleware pipeline composition", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 7692, - "answered": true - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 9146, - "answered": true - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 10584, - "answered": true - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 10584, - "answered": true - }, - { - "repo": "redux", - "query": "reducer type definition", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 10584, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "grep+read", - "tokens": 7010, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 7010, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 7010, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 7010, - "answered": true - }, - { - "repo": "redux", - "query": "combineReducers", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 7010, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "grep+read", - "tokens": 9042, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 9042, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 9042, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 9042, - "answered": true - }, - { - "repo": "redux", - "query": "createStore", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 9042, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "grep+read", - "tokens": 941, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 8023, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 10882, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 10882, - "answered": true - }, - { - "repo": "redux", - "query": "bindActionCreators", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 10882, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "grep+read", - "tokens": 5283, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 7692, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 11155, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 11155, - "answered": true - }, - { - "repo": "redux", - "query": "applyMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 11155, - "answered": true - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "event hooks system", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 14120, - "answered": true - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 14120, - "answered": true - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 14120, - "answered": true - }, - { - "repo": "requests", - "query": "how proxy settings are read from environment variables", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 14120, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "requests", - "query": "PreparedRequest", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "how derive macros parse and apply field-level serde attributes", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "value-based deserialization for self-describing formats", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "semble", - "tokens": 1998, - "answered": true - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": false - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": false - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": false - }, - { - "repo": "serde", - "query": "Serialize", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": false - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "before and after filter hooks for the request lifecycle", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "grep+read", - "tokens": 3365, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 3365, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 3365, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 3365, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::ShowExceptions", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 3365, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Helpers", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "Sinatra::Application", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "sinatra", - "query": "case-insensitive hash for request params", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "grep+read", - "tokens": 9219, - "answered": true - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 5352, - "answered": true - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 9219, - "answered": true - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 9219, - "answered": true - }, - { - "repo": "snapkit", - "query": "ConstraintMaker", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 9219, - "answered": true - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "how are static files served", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": false - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "Request", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "grep+read", - "tokens": 2060, - "answered": true - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 2060, - "answered": true - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 2060, - "answered": true - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 2060, - "answered": true - }, - { - "repo": "starlette", - "query": "BaseHTTPMiddleware", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 2060, - "answered": true - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "telescope.nvim", - "query": "how telescope actions map keys to picker operations", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "tokio", - "query": "Notify", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how the async mutex prevents concurrent access", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "tokio", - "query": "how tasks that are not Send can run on a single thread", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 9505, - "answered": true - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 14918, - "answered": true - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15620, - "answered": true - }, - { - "repo": "trpc", - "query": "how middleware chains context transformations between procedures", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15620, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "grep+read", - "tokens": 6138, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 6138, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 6138, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 6138, - "answered": true - }, - { - "repo": "trpc", - "query": "inferProcedureInput", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 6138, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "grep+read", - "tokens": 8486, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 8486, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 8486, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 8486, - "answered": true - }, - { - "repo": "trpc", - "query": "MiddlewareBuilder", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 8486, - "answered": true - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how type inference extracts input and output types from procedures", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 11111, - "answered": true - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15482, - "answered": true - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "trpc", - "query": "how server-sent events and subscriptions are streamed to the client", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 10127, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "trpc", - "query": "AnyRouter", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 12418, - "answered": true - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "trpc", - "query": "how tRPC procedures are defined and chained with input and output validation", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 6211, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "vapor", - "query": "Application", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vapor", - "query": "how route groups and route collections compose routes", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "test runner worker pool scheduling and execution", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "how vitest discovers and runs test files", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "StateManager", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "fake timers and timer mocking utilities", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "vitest", - "query": "snapshot testing serialization and comparison", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "xmonad", - "query": "how xmonad handles floating windows separately from tiled ones", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": false - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": false - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": false - }, - { - "repo": "zig", - "query": "how debug.print outputs to stderr for debugging", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": false - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls provides goto definition for symbols", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls DocumentStore loads and caches Zig source files", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls generates diagnostic errors and warnings", - "category": "semantic", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls traverses the Zig AST to resolve symbol scopes", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 15999, - "answered": true - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "semble", - "tokens": 2000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "grep+read", - "tokens": 0, - "answered": false - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "keyword-grep+read-top5", - "tokens": 16000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "keyword-grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "zls", - "query": "how zls computes document scope for variable visibility", - "category": "architecture", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "semble", - "tokens": 1999, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "grep+read", - "tokens": 16000, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "keyword-grep+read-top5", - "tokens": 15999, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "keyword-grep+read-top10", - "tokens": 16000, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "keyword-grep+read", - "tokens": 15999, - "answered": true - }, - { - "repo": "zod", - "query": "ZodType", - "category": "symbol", - "method": "keyword-grep+read-top50", - "tokens": 16000, - "answered": true - } - ] + "records_file": "context-efficiency-judge-records-6248855cfef8.jsonl" } diff --git a/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl b/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl new file mode 100644 index 0000000..ccab5e3 --- /dev/null +++ b/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl @@ -0,0 +1,396 @@ +{"repo":"abseil-cpp","query":"Mutex","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"abseil-cpp","query":"Mutex","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"abseil-cpp","query":"absl::AnyInvocable for move-only callable wrapper","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"abseil-cpp","query":"absl::AnyInvocable for move-only callable wrapper","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"aeson","query":"how toJSONKeyText creates a ToJSONKey instance from a text function","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"aeson","query":"how toJSONKeyText creates a ToJSONKey instance from a text function","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"aeson","query":"how typeMismatch produces an error message for wrong JSON types","category":"semantic","method":"semble","tokens":1999,"answered":false} +{"repo":"aeson","query":"how typeMismatch produces an error message for wrong JSON types","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"aiohttp","query":"how backpressure and flow control work in streaming","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"aiohttp","query":"how backpressure and flow control work in streaming","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"aiohttp","query":"ClientResponse","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"aiohttp","query":"ClientResponse","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"alamofire","query":"how download requests save responses to disk","category":"semantic","method":"semble","tokens":1999,"answered":false} +{"repo":"alamofire","query":"how download requests save responses to disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"alamofire","query":"how server trust evaluation handles SSL certificate pinning","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"alamofire","query":"how server trust evaluation handles SSL certificate pinning","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"axios","query":"InterceptorManager","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"axios","query":"InterceptorManager","category":"symbol","method":"grep+read","tokens":2148,"answered":true} +{"repo":"axios","query":"request and response interceptors","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"axios","query":"request and response interceptors","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"axios","query":"Axios","category":"symbol","method":"semble","tokens":2000,"answered":false} +{"repo":"axios","query":"Axios","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"axios","query":"axios default configuration and request/response transformers","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"axios","query":"axios default configuration and request/response transformers","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"axum","query":"WebSocket upgrade and handler","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"axum","query":"WebSocket upgrade and handler","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"axum","query":"BoxedIntoRoute and type-erased route storage","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"axum","query":"BoxedIntoRoute and type-erased route storage","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"axum","query":"how MethodRouter dispatches GET POST PUT DELETE by HTTP method","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"axum","query":"how MethodRouter dispatches GET POST PUT DELETE by HTTP method","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"axum","query":"FromRequest","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"axum","query":"FromRequest","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"axum","query":"how axum nests routers and merges router trees","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"axum","query":"how axum nests routers and merges router trees","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"axum","query":"Router","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"axum","query":"Router","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"bash-it","query":"jump plugin for bookmarking directories","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"jump plugin for bookmarking directories","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"bash-it","query":"battery level detection for shell prompt","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"battery level detection for shell prompt","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"bash-it","query":"rvm ruby version manager plugin","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"rvm ruby version manager plugin","category":"symbol","method":"grep+read","tokens":0,"answered":false} +{"repo":"bash-it","query":"hub github cli aliases and helpers","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"hub github cli aliases and helpers","category":"symbol","method":"grep+read","tokens":0,"answered":false} +{"repo":"bash-it","query":"ssh agent plugin for managing ssh keys","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"ssh agent plugin for managing ssh keys","category":"symbol","method":"grep+read","tokens":0,"answered":false} +{"repo":"bash-it","query":"node version manager nvm integration","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"bash-it","query":"node version manager nvm integration","category":"symbol","method":"grep+read","tokens":0,"answered":false} +{"repo":"bats-core","query":"how bats should retry a flaky test","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"bats-core","query":"how bats should retry a flaky test","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"bats-core","query":"how the preprocessed test source is evaluated","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"bats-core","query":"how the preprocessed test source is evaluated","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"bats-core","query":"how bats finds a library in the BATS_LIB_PATH","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"bats-core","query":"how bats finds a library in the BATS_LIB_PATH","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"cats","query":"how Monad composes dependent effectful computations with flatMap","category":"architecture","method":"semble","tokens":1999,"answered":false} +{"repo":"cats","query":"how Monad composes dependent effectful computations with flatMap","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"cats","query":"Kleisli","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"cats","query":"Kleisli","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"cats","query":"how Kleisli composes functions that return monadic values","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"cats","query":"how Kleisli composes functions that return monadic values","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"cats","query":"Monad","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"cats","query":"Monad","category":"symbol","method":"grep+read","tokens":16000,"answered":false} +{"repo":"cats","query":"how Applicative combines independent effects","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"cats","query":"how Applicative combines independent effects","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"cats","query":"how Validated accumulates errors across independent computations","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"cats","query":"how Validated accumulates errors across independent computations","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"chi","query":"radix tree path matching","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"chi","query":"radix tree path matching","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"chi","query":"Router","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"chi","query":"Router","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"circe","query":"Codec combining Encoder and Decoder for bidirectional conversion","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"circe","query":"Codec combining Encoder and Decoder for bidirectional conversion","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"circe","query":"HCursor and cursor navigation for traversing JSON trees","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"circe","query":"HCursor and cursor navigation for traversing JSON trees","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"circe","query":"how Encoder typeclass converts Scala values to JSON","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"circe","query":"how Encoder typeclass converts Scala values to JSON","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"click","query":"parameter type coercion and value validation","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"click","query":"parameter type coercion and value validation","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"click","query":"decorator API for defining commands, options, and arguments","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"click","query":"decorator API for defining commands, options, and arguments","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"cobra","query":"PowerShell completion generation","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"cobra","query":"PowerShell completion generation","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"cobra","query":"Args","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"cobra","query":"Args","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"cobra","query":"Command","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"cobra","query":"Command","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"cobra","query":"CompletionOptions","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"cobra","query":"CompletionOptions","category":"symbol","method":"grep+read","tokens":15999,"answered":false} +{"repo":"commons-lang","query":"StringUtils","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"commons-lang","query":"StringUtils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"commons-lang","query":"toString builder for human-readable object descriptions","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"commons-lang","query":"toString builder for human-readable object descriptions","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"commons-lang","query":"Java runtime and OS system property helpers","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"commons-lang","query":"Java runtime and OS system property helpers","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"commons-lang","query":"boolean conversion and parsing helpers","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"commons-lang","query":"boolean conversion and parsing helpers","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"commons-lang","query":"ExceptionUtils","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"commons-lang","query":"ExceptionUtils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"curl","query":"how HTTP proxy tunnel CONNECT method is initiated","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"curl","query":"how HTTP proxy tunnel CONNECT method is initiated","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"curl","query":"how curl decides whether to retry a failed request","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"curl","query":"how curl decides whether to retry a failed request","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"curl","query":"how curl resolves and connects to a remote host","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"curl","query":"how curl resolves and connects to a remote host","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"curl","query":"how curl checks if HTTP If-Modified-Since condition is met","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"curl","query":"how curl checks if HTTP If-Modified-Since condition is met","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"curl","query":"connection filter chain setup for proxies and TLS","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"curl","query":"connection filter chain setup for proxies and TLS","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"dapper","query":"CommandDefinition","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"dapper","query":"CommandDefinition","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"dapper","query":"SqlMapper","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"dapper","query":"SqlMapper","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"dapper","query":"how Dapper caches parameter and deserializer IL","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"dapper","query":"how Dapper caches parameter and deserializer IL","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"ecto","query":"Schema","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"ecto","query":"Schema","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"ecto","query":"Ecto.Changeset for validating and transforming data","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"ecto","query":"Ecto.Changeset for validating and transforming data","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"ecto","query":"Ecto.Query DSL for composing SQL queries","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"ecto","query":"Ecto.Query DSL for composing SQL queries","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"exposed","query":"SchemaUtils for creating and dropping database tables","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"exposed","query":"SchemaUtils for creating and dropping database tables","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"express","query":"how res.redirect builds the Location header and status code","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"express","query":"how res.redirect builds the Location header and status code","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"express","query":"how app.render resolves views and calls the template engine","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"express","query":"how app.render resolves views and calls the template engine","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"express","query":"how app.handle dispatches requests through the middleware stack","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"express","query":"how app.handle dispatches requests through the middleware stack","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"express","query":"res.send body encoding and ETag generation","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"express","query":"res.send body encoding and ETag generation","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"fastapi","query":"APIRouter","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"fastapi","query":"APIRouter","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"fastapi","query":"BackgroundTasks","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"fastapi","query":"BackgroundTasks","category":"symbol","method":"grep+read","tokens":9026,"answered":true} +{"repo":"fastapi","query":"how is response validation and serialization applied before sending","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"fastapi","query":"how is response validation and serialization applied before sending","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"fastapi","query":"how does FastAPI run sync route functions without blocking","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"fastapi","query":"how does FastAPI run sync route functions without blocking","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"fastapi","query":"running work after returning an HTTP response without blocking","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"fastapi","query":"running work after returning an HTTP response without blocking","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"flask","query":"how does Flask convert a view return value into a response object","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"flask","query":"how does Flask convert a view return value into a response object","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"fmtlib","query":"chrono duration and time point formatting","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"fmtlib","query":"chrono duration and time point formatting","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"fmtlib","query":"formatter","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"fmtlib","query":"formatter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"gin","query":"radix tree path matching","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"gin","query":"radix tree path matching","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"gin","query":"HTML template rendering","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"gin","query":"HTML template rendering","category":"semantic","method":"grep+read","tokens":719,"answered":true} +{"repo":"gson","query":"TypeAdapter","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"gson","query":"TypeAdapter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"gson","query":"streaming JSON reader and token parsing","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"gson","query":"streaming JSON reader and token parsing","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"gson","query":"JsonParser","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"gson","query":"JsonParser","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"gson","query":"how type adapter factories are registered and selected for a given type","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"gson","query":"how type adapter factories are registered and selected for a given type","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"guzzle","query":"available request options and their configuration","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"guzzle","query":"available request options and their configuration","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"guzzle","query":"mock handler for simulating HTTP responses in tests","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"guzzle","query":"mock handler for simulating HTTP responses in tests","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"guzzle","query":"how the handler stack wraps middleware around the HTTP send","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"guzzle","query":"how the handler stack wraps middleware around the HTTP send","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"http4s","query":"Uri","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"http4s","query":"Uri","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"http4s","query":"how query parameters are extracted and decoded from URIs","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"http4s","query":"how query parameters are extracted and decoded from URIs","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"http4s","query":"how HttpRoutes define pattern-matched HTTP request handlers","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"http4s","query":"how HttpRoutes define pattern-matched HTTP request handlers","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"httpx","query":"AsyncClient","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"httpx","query":"AsyncClient","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"httpx","query":"URL","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"httpx","query":"URL","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"httpx","query":"HTTPStatusError","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"httpx","query":"HTTPStatusError","category":"symbol","method":"grep+read","tokens":11879,"answered":true} +{"repo":"httpx","query":"how the HTTP transport backend sends requests over the wire","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"httpx","query":"how the HTTP transport backend sends requests over the wire","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"httpx","query":"DigestAuth","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"httpx","query":"DigestAuth","category":"symbol","method":"grep+read","tokens":3282,"answered":true} +{"repo":"jackson-databind","query":"ObjectMapper","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"jackson-databind","query":"ObjectMapper","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"jackson-databind","query":"TypeFactory","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"jackson-databind","query":"TypeFactory","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"jackson-databind","query":"ObjectWriter","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"jackson-databind","query":"ObjectWriter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"kotlinx-coroutines","query":"flow operators map filter transform and collect","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"kotlinx-coroutines","query":"flow operators map filter transform and collect","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"kotlinx-coroutines","query":"Channel","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"kotlinx-coroutines","query":"Channel","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"ktor","query":"how client plugins intercept and transform requests and responses","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"ktor","query":"how client plugins intercept and transform requests and responses","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"ktor","query":"HttpCookies","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"ktor","query":"HttpCookies","category":"symbol","method":"grep+read","tokens":12425,"answered":true} +{"repo":"laravel-framework","query":"queue connection resolution and connectors","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"laravel-framework","query":"queue connection resolution and connectors","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"lazy.nvim","query":"how plugin installations and updates are managed with tasks","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"lazy.nvim","query":"how plugin installations and updates are managed with tasks","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"lazy.nvim","query":"spawning and aborting async subprocess commands with uv","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"lazy.nvim","query":"spawning and aborting async subprocess commands with uv","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"lazy.nvim","query":"how text sections are rendered in the lazy view","category":"semantic","method":"semble","tokens":1999,"answered":false} +{"repo":"lazy.nvim","query":"how text sections are rendered in the lazy view","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"lazy.nvim","query":"how lazy.nvim loads a plugin on demand when its trigger fires","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"lazy.nvim","query":"how lazy.nvim loads a plugin on demand when its trigger fires","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"libuv","query":"timer implementation and heap-based scheduling","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"libuv","query":"timer implementation and heap-based scheduling","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"libuv","query":"UDP socket send and receive","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"libuv","query":"UDP socket send and receive","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"messagepack-csharp","query":"IMessagePackFormatter","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"messagepack-csharp","query":"IMessagePackFormatter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"messagepack-csharp","query":"how binary data is deserialized back into typed C# objects","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"messagepack-csharp","query":"how binary data is deserialized back into typed C# objects","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"mini.nvim","query":"how mini.pick implements a fuzzy finder picker","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"mini.nvim","query":"how mini.pick implements a fuzzy finder picker","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"mini.nvim","query":"how mini.completion provides LSP-based autocompletion","category":"architecture","method":"semble","tokens":1999,"answered":false} +{"repo":"mini.nvim","query":"how mini.completion provides LSP-based autocompletion","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"mini.nvim","query":"how mini.diff shows inline git diff signs in buffers","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"mini.nvim","query":"how mini.diff shows inline git diff signs in buffers","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"mini.nvim","query":"how mini.deps manages Neovim plugin installation and updates","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"mini.nvim","query":"how mini.deps manages Neovim plugin installation and updates","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"model2vec","query":"how subword token weights are aggregated for whole-word embeddings","category":"architecture","method":"semble","tokens":1999,"answered":false} +{"repo":"model2vec","query":"how subword token weights are aggregated for whole-word embeddings","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"model2vec","query":"how PCA reduces embedding dimensionality","category":"architecture","method":"semble","tokens":1999,"answered":false} +{"repo":"model2vec","query":"how PCA reduces embedding dimensionality","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"model2vec","query":"saving and loading models from disk","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"model2vec","query":"saving and loading models from disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"monolog","query":"syslog handler for system-level logging","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"monolog","query":"syslog handler for system-level logging","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"monolog","query":"RotatingFileHandler","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"monolog","query":"RotatingFileHandler","category":"symbol","method":"grep+read","tokens":1876,"answered":true} +{"repo":"monolog","query":"how log records propagate through the handler bubble chain","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"monolog","query":"how log records propagate through the handler bubble chain","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"monolog","query":"how log handlers are registered and invoked by Logger","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"monolog","query":"how log handlers are registered and invoked by Logger","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"newtonsoft-json","query":"JsonReader base class and token reading API","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"newtonsoft-json","query":"JsonReader base class and token reading API","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"nlohmann-json","query":"adl_serializer","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"nlohmann-json","query":"adl_serializer","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"nlohmann-json","query":"basic_json","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"nlohmann-json","query":"basic_json","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"nvm","query":"how nvm_has checks whether a command exists on the system","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"nvm","query":"how nvm_has checks whether a command exists on the system","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"nvm","query":"how nvm finds the nearest .nvmrc file by walking up the directory tree","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"nvm","query":"how nvm finds the nearest .nvmrc file by walking up the directory tree","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"nvm","query":"how nvm downloads a Node.js tarball from the remote","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"nvm","query":"how nvm downloads a Node.js tarball from the remote","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"nvm","query":"how nvm manages the PATH to point to the active Node.js bin","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"nvm","query":"how nvm manages the PATH to point to the active Node.js bin","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"nvm","query":"how nvm_get_latest fetches the latest available Node.js version","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"nvm","query":"how nvm_get_latest fetches the latest available Node.js version","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"pandoc","query":"how pandoc reads RST reStructuredText documents","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"pandoc","query":"how pandoc reads RST reStructuredText documents","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"pandoc","query":"how the PandocMonad typeclass abstracts IO for readers and writers","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"pandoc","query":"how the PandocMonad typeclass abstracts IO for readers and writers","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"pandoc","query":"how pandoc's app module orchestrates reading, filtering, and writing","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"pandoc","query":"how pandoc's app module orchestrates reading, filtering, and writing","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"pandoc","query":"how pandoc generates PDF output via LaTeX or other backends","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"pandoc","query":"how pandoc generates PDF output via LaTeX or other backends","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"phoenix","query":"how Phoenix logs request and response lifecycle events","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"phoenix","query":"how Phoenix logs request and response lifecycle events","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"phoenix","query":"how Phoenix routes are defined and dispatched to controller actions","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"phoenix","query":"how Phoenix routes are defined and dispatched to controller actions","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"phoenix","query":"naming conventions for controllers and view modules","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"phoenix","query":"naming conventions for controllers and view modules","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"phoenix","query":"how the router matches path segments to controller/action","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"phoenix","query":"how the router matches path segments to controller/action","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"pydantic","query":"how discriminated unions select the right model variant","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"pydantic","query":"how discriminated unions select the right model variant","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"pydantic","query":"field_validator","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"pydantic","query":"field_validator","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"pydantic","query":"model_validator","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"pydantic","query":"model_validator","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"rack","query":"serving a file index page for a folder on disk","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"rack","query":"serving a file index page for a folder on disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"rack","query":"Utils","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"rack","query":"Utils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"rack","query":"Rack::Response","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"rack","query":"Rack::Response","category":"symbol","method":"grep+read","tokens":5109,"answered":true} +{"repo":"rack","query":"Rack::Builder","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"rack","query":"Rack::Builder","category":"symbol","method":"grep+read","tokens":2490,"answered":true} +{"repo":"rack","query":"static file serving middleware","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"rack","query":"static file serving middleware","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"rack","query":"Request","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"rack","query":"Request","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"rails","query":"Rails::Paths","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"rails","query":"Rails::Paths","category":"symbol","method":"grep+read","tokens":2801,"answered":true} +{"repo":"rails","query":"Rails command dispatch and subcommand routing","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"rails","query":"Rails command dispatch and subcommand routing","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"redis","query":"how SETRANGE modifies a substring within a string value","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"redis","query":"how SETRANGE modifies a substring within a string value","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"redis","query":"how RDB persistence serializes the database to disk","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"redis","query":"how RDB persistence serializes the database to disk","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"redis","query":"how the event loop handles file events and time events","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"redis","query":"how the event loop handles file events and time events","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"redis","query":"how slave keys with expiry are tracked in replication","category":"semantic","method":"semble","tokens":1999,"answered":false} +{"repo":"redis","query":"how slave keys with expiry are tracked in replication","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"redis","query":"server startup initialization and configuration loading","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"redis","query":"server startup initialization and configuration loading","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"redux","query":"how listeners are subscribed and notified after state changes","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"redux","query":"how listeners are subscribed and notified after state changes","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"redux","query":"middleware pipeline composition","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"redux","query":"middleware pipeline composition","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"redux","query":"reducer type definition","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"redux","query":"reducer type definition","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"redux","query":"combineReducers","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"redux","query":"combineReducers","category":"symbol","method":"grep+read","tokens":7010,"answered":true} +{"repo":"redux","query":"createStore","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"redux","query":"createStore","category":"symbol","method":"grep+read","tokens":9042,"answered":true} +{"repo":"redux","query":"bindActionCreators","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"redux","query":"bindActionCreators","category":"symbol","method":"grep+read","tokens":941,"answered":true} +{"repo":"redux","query":"applyMiddleware","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"redux","query":"applyMiddleware","category":"symbol","method":"grep+read","tokens":5283,"answered":true} +{"repo":"requests","query":"event hooks system","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"requests","query":"event hooks system","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"requests","query":"how proxy settings are read from environment variables","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"requests","query":"how proxy settings are read from environment variables","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"requests","query":"PreparedRequest","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"requests","query":"PreparedRequest","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"serde","query":"how derive macros parse and apply field-level serde attributes","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"serde","query":"how derive macros parse and apply field-level serde attributes","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"serde","query":"value-based deserialization for self-describing formats","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"serde","query":"value-based deserialization for self-describing formats","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"serde","query":"Serialize","category":"symbol","method":"semble","tokens":1998,"answered":true} +{"repo":"serde","query":"Serialize","category":"symbol","method":"grep+read","tokens":16000,"answered":false} +{"repo":"sinatra","query":"before and after filter hooks for the request lifecycle","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"sinatra","query":"before and after filter hooks for the request lifecycle","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"sinatra","query":"Sinatra::ShowExceptions","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"sinatra","query":"Sinatra::ShowExceptions","category":"symbol","method":"grep+read","tokens":3365,"answered":true} +{"repo":"sinatra","query":"Sinatra::Helpers","category":"symbol","method":"semble","tokens":2000,"answered":false} +{"repo":"sinatra","query":"Sinatra::Helpers","category":"symbol","method":"grep+read","tokens":0,"answered":false} +{"repo":"sinatra","query":"Sinatra::Application","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"sinatra","query":"Sinatra::Application","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"sinatra","query":"case-insensitive hash for request params","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"sinatra","query":"case-insensitive hash for request params","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"snapkit","query":"how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"snapkit","query":"how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"snapkit","query":"ConstraintMaker","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"snapkit","query":"ConstraintMaker","category":"symbol","method":"grep+read","tokens":9219,"answered":true} +{"repo":"starlette","query":"how are static files served","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"starlette","query":"how are static files served","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"starlette","query":"Request","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"starlette","query":"Request","category":"symbol","method":"grep+read","tokens":15999,"answered":false} +{"repo":"starlette","query":"BaseHTTPMiddleware","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"starlette","query":"BaseHTTPMiddleware","category":"symbol","method":"grep+read","tokens":2060,"answered":true} +{"repo":"telescope.nvim","query":"how telescope actions map keys to picker operations","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"telescope.nvim","query":"how telescope actions map keys to picker operations","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"tokio","query":"Notify","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"tokio","query":"Notify","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"tokio","query":"how the async mutex prevents concurrent access","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"tokio","query":"how the async mutex prevents concurrent access","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"tokio","query":"how tasks that are not Send can run on a single thread","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"tokio","query":"how tasks that are not Send can run on a single thread","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"trpc","query":"how middleware chains context transformations between procedures","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"how middleware chains context transformations between procedures","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"trpc","query":"inferProcedureInput","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"inferProcedureInput","category":"symbol","method":"grep+read","tokens":6138,"answered":true} +{"repo":"trpc","query":"MiddlewareBuilder","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"MiddlewareBuilder","category":"symbol","method":"grep+read","tokens":8486,"answered":true} +{"repo":"trpc","query":"how type inference extracts input and output types from procedures","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"how type inference extracts input and output types from procedures","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"trpc","query":"how server-sent events and subscriptions are streamed to the client","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"trpc","query":"how server-sent events and subscriptions are streamed to the client","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"trpc","query":"AnyRouter","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"AnyRouter","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"trpc","query":"how tRPC procedures are defined and chained with input and output validation","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"trpc","query":"how tRPC procedures are defined and chained with input and output validation","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"vapor","query":"Application","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"vapor","query":"Application","category":"symbol","method":"grep+read","tokens":16000,"answered":true} +{"repo":"vapor","query":"how route groups and route collections compose routes","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"vapor","query":"how route groups and route collections compose routes","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"vitest","query":"test runner worker pool scheduling and execution","category":"architecture","method":"semble","tokens":1999,"answered":true} +{"repo":"vitest","query":"test runner worker pool scheduling and execution","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"vitest","query":"how vitest discovers and runs test files","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"vitest","query":"how vitest discovers and runs test files","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"vitest","query":"StateManager","category":"symbol","method":"semble","tokens":2000,"answered":true} +{"repo":"vitest","query":"StateManager","category":"symbol","method":"grep+read","tokens":15999,"answered":true} +{"repo":"vitest","query":"fake timers and timer mocking utilities","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"vitest","query":"fake timers and timer mocking utilities","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"vitest","query":"snapshot testing serialization and comparison","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"vitest","query":"snapshot testing serialization and comparison","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"xmonad","query":"how xmonad handles floating windows separately from tiled ones","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"xmonad","query":"how xmonad handles floating windows separately from tiled ones","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"zig","query":"how debug.print outputs to stderr for debugging","category":"semantic","method":"semble","tokens":2000,"answered":false} +{"repo":"zig","query":"how debug.print outputs to stderr for debugging","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"zls","query":"how zls provides goto definition for symbols","category":"semantic","method":"semble","tokens":2000,"answered":true} +{"repo":"zls","query":"how zls provides goto definition for symbols","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"zls","query":"how zls DocumentStore loads and caches Zig source files","category":"architecture","method":"semble","tokens":2000,"answered":false} +{"repo":"zls","query":"how zls DocumentStore loads and caches Zig source files","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"zls","query":"how zls generates diagnostic errors and warnings","category":"semantic","method":"semble","tokens":1999,"answered":true} +{"repo":"zls","query":"how zls generates diagnostic errors and warnings","category":"semantic","method":"grep+read","tokens":0,"answered":false} +{"repo":"zls","query":"how zls traverses the Zig AST to resolve symbol scopes","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"zls","query":"how zls traverses the Zig AST to resolve symbol scopes","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"zls","query":"how zls computes document scope for variable visibility","category":"architecture","method":"semble","tokens":2000,"answered":true} +{"repo":"zls","query":"how zls computes document scope for variable visibility","category":"architecture","method":"grep+read","tokens":0,"answered":false} +{"repo":"zod","query":"ZodType","category":"symbol","method":"semble","tokens":1999,"answered":true} +{"repo":"zod","query":"ZodType","category":"symbol","method":"grep+read","tokens":16000,"answered":true} From 6d7dea15950e62e91f41868f385c6819c39084a9 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 08:13:33 +0200 Subject: [PATCH 03/18] Updated benchmark --- benchmarks/README.md | 36 ++++++++--------- benchmarks/context_efficiency.py | 66 +++++++++++--------------------- 2 files changed, 40 insertions(+), 62 deletions(-) diff --git a/benchmarks/README.md b/benchmarks/README.md index e50c8c6..abc4dc1 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -62,36 +62,34 @@ NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best sc Coding agents often use `grep` to find candidate files and then read those files into context. We model that direct `grep + read file` workflow and compare it with semble's chunk retrieval. -> Across a 198-query category-balanced sample judged by GPT-5-mini, semble's retrieved context answers **88%** of queries at 2k tokens. Direct `grep + read file` answers **29%** and spends ~4k tokens. That is a **50% reduction in retrieved code-context tokens**; with a pessimistic fallback model for misses, expected end-to-end context cost drops by **69%**. - ![Recall vs. retrieved tokens](../assets/images/recall_vs_tokens.png) ### Answer sufficiency (LLM-as-judge) -For each query we hand the retrieved context to GPT-5-mini and ask whether it contains enough relevant code to answer the query. The sample is 198 queries, balanced 66/66/66 across semantic, architecture, and symbol categories. +For each query we hand the retrieved context to GPT-5-mini and ask whether it contains enough relevant code to answer the query. The sample is ~198 queries, balanced across semantic, architecture, and symbol categories. -- **semble** — top-K chunks, hard-capped at 2k tokens. -- **grep+read** — the raw query string is passed to `rg --fixed-strings`; matching files are read in full, hard-capped at 16k tokens. +- **semble top-N** — the top-N ranked chunks returned by semble, formatted as-is (no artificial cap). Each variant models a different `top_k` setting in the MCP tool. +- **grep+read** — the raw query string is passed to `rg --fixed-strings`; all matching files are read in full (capped at 32k tokens as a safety ceiling, rarely hit in practice). Both workflows search the same code-file universe: semble's indexed extensions, excluding `node_modules`, `dist`, `build`, `.venv`, and other ignored directories. -| Method | Budget | Answer rate | Mean tokens retrieved | Token reduction with semble | Expected end-to-end tokens† | -|---|---:|---:|---:|---:|---:| -| **semble** | 2k | **0.879** | 2,000 | — | **2,906** | -| grep+read | 16k | 0.293 | 3,996 | 50.0% | 9,281 | - -**Raw retrieval reduction:** 50.0% fewer retrieved code-context tokens vs `grep+read`. -**End-to-end reduction (with fallback model):** 68.7% fewer expected context tokens vs `grep+read`. +| Method | Mean tokens | Answer rate | +|---|---:|---:| +| semble top-3 | — | — | +| semble top-5 | — | — | +| semble top-10 | — | — | +| semble top-20 | — | — | +| grep+read | — | — | -†The end-to-end column adds `(1 − answer_rate) × 7,474`, modeling a fallback search on a miss. The constant is the median tokens `grep+read` spends to surface a relevant file. The raw retrieval reduction is the model-free comparison. This benchmark measures retrieved code-context tokens, not total IDE or agent billing tokens. +> Run `uv run python -m benchmarks.context_efficiency judge` to populate this table. **Answer rate by query category:** -| Category | semble | grep+read | +| Category | semble top-5 | grep+read | |---|---:|---:| -| symbol (named entity lookup) | 0.97 | 0.86 | -| semantic (behavior / concept) | 0.85 | 0.02 | -| architecture (design / structure) | 0.82 | 0.00 | +| symbol (named entity lookup) | — | — | +| semantic (behavior / concept) | — | — | +| architecture (design / structure) | — | — | ### Recall at fixed token budgets @@ -108,9 +106,9 @@ A coarser, label-based view across the full 1,251-query benchmark: a relevant fi For each query we retrieve units in rank order — semble chunks for semble, full files in match-count order for `grep+read`, and merged context windows for `ripgrep -C 8` in the recall curve. Tokens are counted with `cl100k_base` via `tiktoken`. `grep` is run with `--fixed-strings --ignore-case` on the raw query and scoped via `--glob` to the same code-file extensions and ignored directories that semble indexes. -In judge mode each context is hard-capped at its stated budget by token IDs and asserted `len(ids) ≤ budget`. Recall mode does not truncate; its curves record cumulative tokens of whole retrieved units. The judge sample is macro-balanced across categories; the recall benchmark uses all 1,251 queries. +Recall mode does not truncate; its curves record cumulative tokens of whole retrieved units. The judge sample is macro-balanced across categories; the recall benchmark uses all 1,251 queries. -GPT-5-mini sees the query and capped retrieved context and answers a strict yes/no on whether the context contains code that directly addresses the query. A relevant file is "covered" in recall once any retrieved unit comes from it; where line spans are present we require span overlap. +GPT-5-mini sees the query and retrieved context and answers a strict yes/no on whether the context contains code that directly addresses the query. A relevant file is "covered" in recall once any retrieved unit comes from it; where line spans are present we require span overlap.
diff --git a/benchmarks/context_efficiency.py b/benchmarks/context_efficiency.py index 45290db..4297fdd 100644 --- a/benchmarks/context_efficiency.py +++ b/benchmarks/context_efficiency.py @@ -18,6 +18,7 @@ from openai import AsyncOpenAI from benchmarks.data import ( + RepoSpec, Target, Task, add_filter_args, @@ -47,8 +48,8 @@ _JUDGE_CONCURRENCY = 8 _JUDGE_RETRIES = 3 _JUDGE_DEFAULT_SAMPLE = 200 -_JUDGE_SEMBLE_BUDGET = 2000 -_JUDGE_GREP_BUDGET = 16000 +_JUDGE_TOP_KS = (3, 5, 10, 20) +_JUDGE_CONTEXT_CAP = 32_000 _IMAGES_DIR = Path(__file__).parent.parent / "assets" / "images" _RESULTS_DIR = Path(__file__).parent / "results" @@ -198,6 +199,18 @@ def _retrieval_units_for_task( return methods +def _retrieval_units_for_judge( + index: SembleIndex, + task: Task, + repo_dir: Path, +) -> list[tuple[str, list[Chunk]]]: + """Return (method, units) for the judge: semble sliced at each top_k, plus grep+read.""" + all_semble = _semble_units(index, task.query) + methods: list[tuple[str, list[Chunk]]] = [(f"semble-top{k}", all_semble[:k]) for k in _JUDGE_TOP_KS] + methods.append(("grep+read", _grep_file_units(task.query, repo_dir))) + return methods + + def _curve(units: list[Chunk], targets: tuple[Target, ...], enc: Any) -> Curve: """Cumulative (tokens, covered_target_count) after each retrieved unit, starting at (0, 0).""" covered = [False] * len(targets) @@ -388,7 +401,7 @@ def _evaluate_repo_recall( def _build_pending_judge( tasks: list[Task], - repo_specs: dict[str, Any], + repo_specs: dict[str, RepoSpec], model: StaticModel, enc: Any, ) -> list[tuple[Task, str, str, int]]: @@ -401,13 +414,8 @@ def _build_pending_judge( started = time.perf_counter() index = SembleIndex.from_path(spec.benchmark_dir, model=model) for task in task_list: - for method, units in _retrieval_units_for_task( - index, - task, - spec.benchmark_dir, - ): - budget = _JUDGE_SEMBLE_BUDGET if method == "semble" else _JUDGE_GREP_BUDGET - context, tokens = _format_context(units, budget, enc) + for method, units in _retrieval_units_for_judge(index, task, spec.benchmark_dir): + context, tokens = _format_context(units, _JUDGE_CONTEXT_CAP, enc) pending.append((task, method, context, tokens)) print(f"{repo:<22} {len(task_list):>6} {time.perf_counter() - started:>7.1f}s", file=sys.stderr) return pending @@ -629,45 +637,23 @@ def run_judge(args: argparse.Namespace) -> None: print(f" WARNING: {n_missing} verdicts missing — see n_failed per method.", file=sys.stderr) summary = _aggregate_judge(records, dict(attempted_per_method)) - print(f"\n{'Method':<24} {'n':>5} {'answer_rate':>12} {'mean_tokens':>12}", file=sys.stderr) - print(f"{'-' * 24} {'-' * 5} {'-' * 12} {'-' * 12}", file=sys.stderr) + print(f"\n{'Method':<24} {'mean_tokens':>12} {'answer_rate':>12}", file=sys.stderr) + print(f"{'-' * 24} {'-' * 12} {'-' * 12}", file=sys.stderr) for method, info in summary.items(): print( - f"{method:<24} {info['n']:>5} {info['answer_rate']:>12.3f} {info['mean_tokens_retrieved']:>12.0f}", + f"{method:<24} {info['mean_tokens_retrieved']:>12.0f} {info['answer_rate']:>12.3f}", file=sys.stderr, ) - semble_retrieval = summary.get("semble", {}).get("mean_tokens_retrieved", 0.0) - print("\nRaw retrieval tokens (no fallback model):", file=sys.stderr) - raw_reductions: dict[str, float] = {} - for method, info in summary.items(): - other = info["mean_tokens_retrieved"] - red = 1.0 - semble_retrieval / other if method != "semble" and other > 0 else 0.0 - raw_reductions[method] = red - suffix = f" reduction vs semble: {red:.1%}" if method != "semble" else "" - print(f" {method:<24} {other:>9.0f}{suffix}", file=sys.stderr) - - fallback = args.fallback_tokens - e_costs = {m: s["mean_tokens_retrieved"] + ((1.0 - s["answer_rate"]) * fallback) for m, s in summary.items()} - print(f"\nExpected end-to-end tokens (pessimistic fallback = {fallback:.0f} tokens):", file=sys.stderr) - for method, c in e_costs.items(): - print(f" {method:<24} {c:>9.0f}", file=sys.stderr) - - if "semble" in e_costs and e_costs.get("grep+read", 0) > 0: - reduction = 1.0 - e_costs["semble"] / e_costs["grep+read"] - print(f"Reduction (semble vs grep+read, end-to-end): {reduction:.1%}", file=sys.stderr) - payload = { "tool": "context-efficiency-judge", "judge_model": _JUDGE_MODEL, "tokenizer": _TOKENIZER_NAME, "sample_size": len(sample), "seed": args.seed, - "budgets": {"semble": _JUDGE_SEMBLE_BUDGET, "grep+read": _JUDGE_GREP_BUDGET}, - "fallback_tokens": fallback, + "top_ks": list(_JUDGE_TOP_KS), + "context_cap": _JUDGE_CONTEXT_CAP, "summary": summary, - "raw_retrieval_reduction_vs_semble": {m: round(v, 4) for m, v in raw_reductions.items() if m != "semble"}, - "expected_cost": e_costs, } records_out = _save_judge_records(records) payload["records_file"] = records_out.name @@ -702,12 +688,6 @@ def _parse_args() -> argparse.Namespace: judge.add_argument("--sample", type=int, default=_JUDGE_DEFAULT_SAMPLE, help="Number of stratified queries.") judge.add_argument("--seed", type=int, default=42, help="Random seed for sampling.") judge.add_argument("--concurrency", type=int, default=_JUDGE_CONCURRENCY, help="Concurrent judge calls.") - judge.add_argument( - "--fallback-tokens", - type=float, - default=7474.0, - help="Tokens an agent spends to fall back on a miss (pessimistic default).", - ) judge.set_defaults(func=run_judge) plot = sub.add_parser("plot", help="Regenerate the recall-vs-tokens plot from a saved JSON.") From 153999857e5b0b0cf18af0f122ce70372184092a Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 08:50:19 +0200 Subject: [PATCH 04/18] Updated benchmark --- assets/images/recall_vs_tokens.png | Bin 61963 -> 54685 bytes benchmarks/README.md | 56 +-- benchmarks/context_efficiency.py | 358 ++-------------- ...context-efficiency-judge-6248855cfef8.json | 46 -- ...fficiency-judge-records-6248855cfef8.jsonl | 396 ------------------ ...ntext-efficiency-recall-6d7dea15950e.json} | 176 +++----- 6 files changed, 97 insertions(+), 935 deletions(-) delete mode 100644 benchmarks/results/context-efficiency-judge-6248855cfef8.json delete mode 100644 benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl rename benchmarks/results/{context-efficiency-recall-6248855cfef8.json => context-efficiency-recall-6d7dea15950e.json} (57%) diff --git a/assets/images/recall_vs_tokens.png b/assets/images/recall_vs_tokens.png index 6a623cb6ea286fc9bd3bbb977d9006980b9a0c69..2285f3c82bc316bd186f64f5aa85515ba619376c 100644 GIT binary patch literal 54685 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

MpYAPcwf%XV)s- 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 n|MHPmcc! Run `uv run python -m benchmarks.context_efficiency judge` to populate this table. +### Expected tokens per query -**Answer rate by query category:** +For each query: tokens consumed at first relevant hit, or 32k if the method never finds anything. Averaged across all 1,251 queries. -| Category | semble top-5 | grep+read | +| Method | Expected tokens | vs semble | |---|---:|---:| -| symbol (named entity lookup) | — | — | -| semantic (behavior / concept) | — | — | -| architecture (design / structure) | — | — | - -### Recall at fixed token budgets - -A coarser, label-based view across the full 1,251-query benchmark: a relevant file is "covered" once any retrieved unit comes from it. - -| Method | 500 | 1k | 2k | 4k | 8k | 16k | 32k | -|---|---:|---:|---:|---:|---:|---:|---:| -| **semble** | **0.684** | **0.848** | **0.936** | **0.976** | **0.991** | **0.996** | **0.996** | -| grep + read file | 0.000 | 0.007 | 0.023 | 0.042 | 0.076 | 0.101 | 0.127 | -| ripgrep -C 8 | 0.069 | 0.091 | 0.107 | 0.117 | 0.131 | 0.143 | 0.150 | +| **semble** | **567** | — | +| grep + read file | 29,675 | 52× more |

Methodology -For each query we retrieve units in rank order — semble chunks for semble, full files in match-count order for `grep+read`, and merged context windows for `ripgrep -C 8` in the recall curve. Tokens are counted with `cl100k_base` via `tiktoken`. `grep` is run with `--fixed-strings --ignore-case` on the raw query and scoped via `--glob` to the same code-file extensions and ignored directories that semble indexes. - -Recall mode does not truncate; its curves record cumulative tokens of whole retrieved units. The judge sample is macro-balanced across categories; the recall benchmark uses all 1,251 queries. - -GPT-5-mini sees the query and retrieved context and answers a strict yes/no on whether the context contains code that directly addresses the query. A relevant file is "covered" in recall once any retrieved unit comes from it; where line spans are present we require span overlap. +semble returns the top-50 ranked chunks. `grep+read` runs `rg --fixed-strings --ignore-case` on the raw query string, scoped to the same code-file extensions and ignored directories that semble indexes, then reads matched files in full in descending match-count order. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span.
@@ -248,21 +225,18 @@ uv run python -m benchmarks.baselines.coderankembed --mode semantic
Context-efficiency benchmark -Requires the `benchmark` extra (`uv sync --extra benchmark`) and `rg` on `$PATH`. Judge mode also needs `OPENAI_API_KEY`. +Requires the `benchmark` extra (`uv sync --extra benchmark`) and `rg` on `$PATH`. ```bash # Recall vs. token-budget across all queries; plots automatically. uv run python -m benchmarks.context_efficiency recall uv run python -m benchmarks.context_efficiency recall --repo fastapi -# LLM-as-judge sufficiency on a stratified sample. -uv run python -m benchmarks.context_efficiency judge --sample 200 - # Regenerate the plot from a saved recall payload. uv run python -m benchmarks.context_efficiency plot ``` -Writes `benchmarks/results/context-efficiency-{recall,judge}-.json`, compact judge records as JSONL, and `assets/images/recall_vs_tokens.png`. +Writes `benchmarks/results/context-efficiency-recall-.json` and `assets/images/recall_vs_tokens.png`.
diff --git a/benchmarks/context_efficiency.py b/benchmarks/context_efficiency.py index 4297fdd..79e7e8e 100644 --- a/benchmarks/context_efficiency.py +++ b/benchmarks/context_efficiency.py @@ -1,12 +1,9 @@ import argparse -import asyncio import json -import random import subprocess import sys import time from collections import Counter, defaultdict -from dataclasses import dataclass from pathlib import Path from typing import Any, TypeAlias @@ -15,16 +12,13 @@ import numpy as np import tiktoken from model2vec import StaticModel -from openai import AsyncOpenAI from benchmarks.data import ( - RepoSpec, Target, Task, add_filter_args, grouped_tasks, load_filtered_tasks, - results_path, save_results, target_matches_location, ) @@ -39,56 +33,19 @@ _RG_EXCLUDE_GLOBS: tuple[str, ...] = tuple(f"!{d}" for d in DEFAULT_IGNORED_DIRS) _BUDGETS = (500, 1000, 2000, 4000, 8000, 16000, 32000) +_EXPECTED_COST_CAP = 32_000 _PLOT_BUDGETS = sorted({int(b) for b in np.logspace(np.log10(100), np.log10(64000), 60)}) _TOKENIZER_NAME = "cl100k_base" -_RG_CONTEXTS = (8,) _RG_MAX_MATCHES = 500 _SEMBLE_TOP_K = 50 -_JUDGE_MODEL = "gpt-5-mini" -_JUDGE_CONCURRENCY = 8 -_JUDGE_RETRIES = 3 -_JUDGE_DEFAULT_SAMPLE = 200 -_JUDGE_TOP_KS = (3, 5, 10, 20) -_JUDGE_CONTEXT_CAP = 32_000 _IMAGES_DIR = Path(__file__).parent.parent / "assets" / "images" _RESULTS_DIR = Path(__file__).parent / "results" -_JUDGE_PROMPT = """\ -You are evaluating whether retrieved code context is sufficient to answer a code search query. - -A code agent ran a search for the query below and got back the retrieved context shown. \ -Decide whether that context contains enough relevant code for an engineer to give a substantive \ -answer to the query (showing how something is implemented, where it lives, or how it works). - -Reply YES if the context contains code that directly addresses the query. -Reply NO if the context is empty, off-topic, or only tangentially related. - -Reply with exactly one word: YES or NO. - -Query: {query} - -Retrieved context: -{context} -""" - - Curve: TypeAlias = list[tuple[int, int]] MethodCurves: TypeAlias = list[tuple[Curve, int]] -@dataclass(frozen=True) -class JudgeRecord: - """One LLM-judge sufficiency verdict.""" - - repo: str - query: str - category: str - method: str - tokens_used: int - answered: bool - - def _semble_units(index: SembleIndex, query: str) -> list[Chunk]: """Top-K semble chunks as units, ordered by score.""" return [r.chunk for r in index.search(query, top_k=_SEMBLE_TOP_K)] @@ -134,35 +91,6 @@ def _rg_matches(pattern: str, repo_dir: Path) -> list[tuple[str, int]]: return matches -def _ripgrep_units(query: str, repo_dir: Path, context: int) -> list[Chunk]: - """Ripgrep windows: files ranked by match count desc, windows merged within file.""" - matches = _rg_matches(query, repo_dir) - if not matches: - return [] - per_file: dict[str, list[int]] = defaultdict(list) - for path, ln in matches[:_RG_MAX_MATCHES]: - per_file[path].append(ln) - ranked = sorted(per_file.items(), key=lambda kv: (-len(kv[1]), kv[0])) - units: list[Chunk] = [] - for path, lines in ranked: - windows: list[list[int]] = [] - for ln in sorted(set(lines)): - start, end = max(1, ln - context), ln + context - if windows and start <= windows[-1][1] + 1: - windows[-1][1] = max(windows[-1][1], end) - else: - windows.append([start, end]) - try: - file_lines = Path(path).read_text(encoding="utf-8", errors="replace").splitlines() - except OSError: - continue - for start, end in windows: - end_clamped = min(end, len(file_lines)) - text = "\n".join(file_lines[start - 1 : end_clamped]) - units.append(Chunk(content=text, file_path=path, start_line=start, end_line=end_clamped)) - return units - - def _grep_file_units( pattern: str, repo_dir: Path, @@ -186,29 +114,12 @@ def _retrieval_units_for_task( index: SembleIndex, task: Task, repo_dir: Path, - *, - include_ripgrep: bool = False, ) -> list[tuple[str, list[Chunk]]]: - """Return retrieval-method units for a task in benchmark order.""" - methods = [ + """Return (method, units) pairs for a task.""" + return [ ("semble", _semble_units(index, task.query)), ("grep+read", _grep_file_units(task.query, repo_dir)), ] - if include_ripgrep: - methods.extend((f"ripgrep-c{c}", _ripgrep_units(task.query, repo_dir, c)) for c in _RG_CONTEXTS) - return methods - - -def _retrieval_units_for_judge( - index: SembleIndex, - task: Task, - repo_dir: Path, -) -> list[tuple[str, list[Chunk]]]: - """Return (method, units) for the judge: semble sliced at each top_k, plus grep+read.""" - all_semble = _semble_units(index, task.query) - methods: list[tuple[str, list[Chunk]]] = [(f"semble-top{k}", all_semble[:k]) for k in _JUDGE_TOP_KS] - methods.append(("grep+read", _grep_file_units(task.query, repo_dir))) - return methods def _curve(units: list[Chunk], targets: tuple[Target, ...], enc: Any) -> Curve: @@ -256,6 +167,12 @@ def _tokens_to_first_hit(curve: Curve) -> int | None: return None +def _expected_cost_at_cap(curves: MethodCurves, cap: int) -> float: + """Mean tokens spent before first hit or giving up at cap, across all queries.""" + costs = [hit if (hit := _tokens_to_first_hit(c)) is not None else cap for c, n in curves if n > 0] + return float(np.mean(costs)) if costs else float(cap) + + def _pairwise_reduction(semble: MethodCurves, other: MethodCurves) -> dict[str, float] | None: """Median 'tokens to first hit' reduction, paired on queries where both methods hit.""" pairs: list[tuple[int, int]] = [] @@ -277,106 +194,6 @@ def _pairwise_reduction(semble: MethodCurves, other: MethodCurves) -> dict[str, } -def _format_context(units: list[Chunk], budget: int, enc: Any) -> tuple[str, int]: - """ - Concatenate units with file headers, hard-capped at budget tokens. - - Greedily appends blocks until the running estimate exceeds budget, then re-encodes the - joined string and slices by token IDs as the final guarantee. - """ - if not units or budget <= 0: - return "(no context retrieved)", 0 - - parts: list[str] = [] - rough_tokens = 0 - for unit in units: - block = f"// {unit.location}\n{unit.content}" - parts.append(block) - rough_tokens += len(enc.encode(block, disallowed_special=())) + 2 # +2 for "\n\n" - if rough_tokens >= budget + 64: - break - - context = "\n\n".join(parts) - ids = enc.encode(context, disallowed_special=()) - if len(ids) > budget: - marker = "\n... [truncated]" - marker_ids = enc.encode(marker, disallowed_special=()) - keep = max(0, budget - len(marker_ids)) - context = enc.decode(ids[:keep]) + marker - ids = enc.encode(context, disallowed_special=()) - if len(ids) > budget: - context = enc.decode(ids[:budget]) - ids = enc.encode(context, disallowed_special=()) - if len(ids) > budget: - raise AssertionError(f"context formatting exceeded budget: {len(ids)} > {budget}") - return context, len(ids) - - -async def _judge_one(client: AsyncOpenAI, query: str, context: str) -> bool | None: - """Call the judge model; return True/False or None on parse failure or repeated errors.""" - prompt = _JUDGE_PROMPT.format(query=query, context=context) - last_err: Exception | None = None - for attempt in range(_JUDGE_RETRIES): - try: - resp = await client.responses.create( - model=_JUDGE_MODEL, - input=prompt, - reasoning={"effort": "minimal"}, - ) - text = (resp.output_text or "").strip().upper() - if text.startswith("Y"): - return True - if text.startswith("N"): - return False - return None - except Exception as exc: # noqa: BLE001 - last_err = exc - await asyncio.sleep(1.5 * (attempt + 1)) - print(f" judge failed after {_JUDGE_RETRIES} retries: {last_err}", file=sys.stderr) - return None - - -async def _judge_many(pending: list[tuple[Task, str, str, int]], concurrency: int) -> list[JudgeRecord]: - """Run judge calls with bounded concurrency.""" - client = AsyncOpenAI() - sem = asyncio.Semaphore(concurrency) - results: list[JudgeRecord | None] = [None] * len(pending) - - async def worker(i: int, task: Task, method: str, context: str, tokens: int) -> None: - async with sem: - verdict = await _judge_one(client, task.query, context) - if verdict is None: - return - results[i] = JudgeRecord( - repo=task.repo, - query=task.query, - category=task.category, - method=method, - tokens_used=tokens, - answered=verdict, - ) - - await asyncio.gather(*(worker(i, *p) for i, p in enumerate(pending))) - return [r for r in results if r is not None] - - -def _stratified_sample(tasks: list[Task], n: int, seed: int) -> list[Task]: - """Sample n tasks stratified across categories.""" - rng = random.Random(seed) - by_cat: dict[str, list[Task]] = defaultdict(list) - for task in tasks: - by_cat[task.category].append(task) - cats = sorted(by_cat) - per_cat = n // len(cats) - picked: list[Task] = [] - for cat in cats: - bucket = by_cat[cat] - rng.shuffle(bucket) - picked.extend(bucket[:per_cat]) - rng.shuffle(picked) - return picked - - def _evaluate_repo_recall( index: SembleIndex, tasks: list[Task], @@ -385,96 +202,17 @@ def _evaluate_repo_recall( ) -> dict[str, MethodCurves]: """Build per-method curves for every task in the repo.""" methods: dict[str, MethodCurves] = defaultdict(list) - for task in tasks: targets = task.all_relevant n = len(targets) - for method, units in _retrieval_units_for_task( - index, - task, - repo_dir, - include_ripgrep=True, - ): + for method, units in _retrieval_units_for_task(index, task, repo_dir): methods[method].append((_curve(units, targets, enc), n)) return dict(methods) -def _build_pending_judge( - tasks: list[Task], - repo_specs: dict[str, RepoSpec], - model: StaticModel, - enc: Any, -) -> list[tuple[Task, str, str, int]]: - """Build (task, method, context, tokens) inputs for the LLM judge across all sampled tasks.""" - pending: list[tuple[Task, str, str, int]] = [] - print(f"\n{'Repo':<22} {'Tasks':>6} {'Time':>8}", file=sys.stderr) - print(f"{'-' * 22} {'-' * 6} {'-' * 8}", file=sys.stderr) - for repo, task_list in sorted(grouped_tasks(tasks).items()): - spec = repo_specs[repo] - started = time.perf_counter() - index = SembleIndex.from_path(spec.benchmark_dir, model=model) - for task in task_list: - for method, units in _retrieval_units_for_judge(index, task, spec.benchmark_dir): - context, tokens = _format_context(units, _JUDGE_CONTEXT_CAP, enc) - pending.append((task, method, context, tokens)) - print(f"{repo:<22} {len(task_list):>6} {time.perf_counter() - started:>7.1f}s", file=sys.stderr) - return pending - - -def _aggregate_judge(records: list[JudgeRecord], attempted_per_method: dict[str, int]) -> dict[str, dict[str, Any]]: - """Group records by method and compute answer rate, mean tokens, missing-verdict count.""" - by_method: dict[str, list[JudgeRecord]] = defaultdict(list) - for r in records: - by_method[r.method].append(r) - out: dict[str, dict[str, Any]] = {} - for method, attempted in attempted_per_method.items(): - recs = by_method.get(method, []) - n_yes = sum(1 for r in recs if r.answered) - by_cat: dict[str, list[bool]] = defaultdict(list) - for r in recs: - by_cat[r.category].append(r.answered) - out[method] = { - "n": len(recs), - "n_attempted": attempted, - "n_failed": attempted - len(recs), - "answer_rate": n_yes / len(recs) if recs else 0.0, - "mean_tokens_retrieved": float(np.mean([r.tokens_used for r in recs])) if recs else 0.0, - "answer_rate_by_category": {c: sum(v) / len(v) for c, v in sorted(by_cat.items())}, - } - return out - - -def _save_judge_records(records: list[JudgeRecord]) -> Path: - """Write per-query judge records as compact JSONL for version comparisons.""" - out = results_path("context-efficiency-judge-records").with_suffix(".jsonl") - lines = [ - json.dumps( - { - "repo": r.repo, - "query": r.query, - "category": r.category, - "method": r.method, - "tokens": r.tokens_used, - "answered": r.answered, - }, - separators=(",", ":"), - ) - for r in records - ] - out.write_text("\n".join(lines) + "\n", encoding="utf-8") - return out - - _PLOT_STYLE: dict[str, dict[str, object]] = { "semble": {"label": "semble", "color": "#1a5fa8", "linewidth": 2.4, "zorder": 4}, "grep+read": {"label": "grep + read file", "color": "#922b21", "linewidth": 1.8, "zorder": 3}, - "ripgrep-c8": { - "label": "ripgrep -C 8 (snippets)", - "color": "#707070", - "linewidth": 1.4, - "zorder": 2, - "linestyle": "--", - }, } @@ -560,6 +298,26 @@ def _print_first_hit_summary(method_curves: dict[str, MethodCurves]) -> dict[str f"{red['median_reduction']:>10.1%}", file=sys.stderr, ) + + print( + f"\nExpected tokens per query (first hit or {_EXPECTED_COST_CAP // 1000}k cap if no hit)", + file=sys.stderr, + ) + print(f"{'Method':<20} {'expected-tokens':>15} {'vs-semble':>10}", file=sys.stderr) + print(f"{'-' * 20} {'-' * 15} {'-' * 10}", file=sys.stderr) + semble_cost = _expected_cost_at_cap(method_curves["semble"], _EXPECTED_COST_CAP) + print(f"{'semble':<20} {semble_cost:>15.0f}", file=sys.stderr) + for method, curves in method_curves.items(): + if method == "semble": + continue + cost = _expected_cost_at_cap(curves, _EXPECTED_COST_CAP) + ratio = cost / semble_cost if semble_cost > 0 else float("inf") + print(f"{method:<20} {cost:>15.0f} {ratio:>9.1f}x", file=sys.stderr) + reductions[method]["expected_cost_at_cap"] = cost + reductions[method]["expected_cost_cap"] = float(_EXPECTED_COST_CAP) + reductions[method]["expected_cost_ratio_vs_semble"] = ratio + reductions["semble"] = {"expected_cost_at_cap": semble_cost, "expected_cost_cap": float(_EXPECTED_COST_CAP)} + return reductions @@ -612,56 +370,6 @@ def run_recall(args: argparse.Namespace) -> None: _plot_recall_vs_tokens(payload, _IMAGES_DIR / "recall_vs_tokens.png") -def run_judge(args: argparse.Namespace) -> None: - """Run the LLM-as-judge sufficiency benchmark on a stratified sample.""" - repo_specs, tasks = load_filtered_tasks() - sample = _stratified_sample(tasks, args.sample, args.seed) - print(f"Sampled {len(sample)} queries (seed={args.seed})", file=sys.stderr) - - print("Loading model + tokenizer...", file=sys.stderr) - enc = tiktoken.get_encoding(_TOKENIZER_NAME) - model = StaticModel.from_pretrained(_DEFAULT_MODEL_NAME) - - pending = _build_pending_judge(sample, repo_specs, model, enc) - attempted_per_method: dict[str, int] = defaultdict(int) - for _, method, _, _ in pending: - attempted_per_method[method] += 1 - - print(f"\nJudging {len(pending)} (query, method) pairs with {_JUDGE_MODEL}...", file=sys.stderr) - started = time.perf_counter() - records = asyncio.run(_judge_many(pending, args.concurrency)) - elapsed = time.perf_counter() - started - print(f" done in {elapsed:.1f}s ({len(records)}/{len(pending)} returned a verdict)", file=sys.stderr) - n_missing = len(pending) - len(records) - if n_missing: - print(f" WARNING: {n_missing} verdicts missing — see n_failed per method.", file=sys.stderr) - - summary = _aggregate_judge(records, dict(attempted_per_method)) - print(f"\n{'Method':<24} {'mean_tokens':>12} {'answer_rate':>12}", file=sys.stderr) - print(f"{'-' * 24} {'-' * 12} {'-' * 12}", file=sys.stderr) - for method, info in summary.items(): - print( - f"{method:<24} {info['mean_tokens_retrieved']:>12.0f} {info['answer_rate']:>12.3f}", - file=sys.stderr, - ) - - payload = { - "tool": "context-efficiency-judge", - "judge_model": _JUDGE_MODEL, - "tokenizer": _TOKENIZER_NAME, - "sample_size": len(sample), - "seed": args.seed, - "top_ks": list(_JUDGE_TOP_KS), - "context_cap": _JUDGE_CONTEXT_CAP, - "summary": summary, - } - records_out = _save_judge_records(records) - payload["records_file"] = records_out.name - out = save_results("context-efficiency-judge", payload) - print(f"\nResults saved to {out}", file=sys.stderr) - print(f"Records saved to {records_out}", file=sys.stderr) - - def run_plot(args: argparse.Namespace) -> None: """Plot recall-vs-tokens from a saved recall-mode payload.""" matches = sorted(_RESULTS_DIR.glob("context-efficiency-recall-*.json")) @@ -684,12 +392,6 @@ def _parse_args() -> argparse.Namespace: recall.add_argument("--no-plot", action="store_true", help="Skip plotting after the run.") recall.set_defaults(func=run_recall) - judge = sub.add_parser("judge", help="LLM-as-judge sufficiency on a stratified sample.") - judge.add_argument("--sample", type=int, default=_JUDGE_DEFAULT_SAMPLE, help="Number of stratified queries.") - judge.add_argument("--seed", type=int, default=42, help="Random seed for sampling.") - judge.add_argument("--concurrency", type=int, default=_JUDGE_CONCURRENCY, help="Concurrent judge calls.") - judge.set_defaults(func=run_judge) - plot = sub.add_parser("plot", help="Regenerate the recall-vs-tokens plot from a saved JSON.") plot.add_argument("--input", type=Path, default=None, help="Path to recall results (default: newest).") plot.add_argument("--output", type=Path, default=_IMAGES_DIR / "recall_vs_tokens.png", help="Output PNG path.") diff --git a/benchmarks/results/context-efficiency-judge-6248855cfef8.json b/benchmarks/results/context-efficiency-judge-6248855cfef8.json deleted file mode 100644 index d511ba8..0000000 --- a/benchmarks/results/context-efficiency-judge-6248855cfef8.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "tool": "context-efficiency-judge", - "judge_model": "gpt-5-mini", - "tokenizer": "cl100k_base", - "sample_size": 198, - "seed": 42, - "budgets": { - "semble": 2000, - "grep+read": 16000 - }, - "fallback_tokens": 7474.0, - "summary": { - "semble": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.8787878787878788, - "mean_tokens_retrieved": 1999.611111111111, - "answer_rate_by_category": { - "architecture": 0.8181818181818182, - "semantic": 0.8484848484848485, - "symbol": 0.9696969696969697 - } - }, - "grep+read": { - "n": 198, - "n_attempted": 198, - "n_failed": 0, - "answer_rate": 0.29292929292929293, - "mean_tokens_retrieved": 3996.3585858585857, - "answer_rate_by_category": { - "architecture": 0.0, - "semantic": 0.015151515151515152, - "symbol": 0.8636363636363636 - } - } - }, - "raw_retrieval_reduction_vs_semble": { - "grep+read": 0.4996 - }, - "expected_cost": { - "semble": 2905.5505050505053, - "grep+read": 9281.00505050505 - }, - "records_file": "context-efficiency-judge-records-6248855cfef8.jsonl" -} diff --git a/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl b/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl deleted file mode 100644 index ccab5e3..0000000 --- a/benchmarks/results/context-efficiency-judge-records-6248855cfef8.jsonl +++ /dev/null @@ -1,396 +0,0 @@ -{"repo":"abseil-cpp","query":"Mutex","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"abseil-cpp","query":"Mutex","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"abseil-cpp","query":"absl::AnyInvocable for move-only callable wrapper","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"abseil-cpp","query":"absl::AnyInvocable for move-only callable wrapper","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"aeson","query":"how toJSONKeyText creates a ToJSONKey instance from a text function","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"aeson","query":"how toJSONKeyText creates a ToJSONKey instance from a text function","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"aeson","query":"how typeMismatch produces an error message for wrong JSON types","category":"semantic","method":"semble","tokens":1999,"answered":false} -{"repo":"aeson","query":"how typeMismatch produces an error message for wrong JSON types","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"aiohttp","query":"how backpressure and flow control work in streaming","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"aiohttp","query":"how backpressure and flow control work in streaming","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"aiohttp","query":"ClientResponse","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"aiohttp","query":"ClientResponse","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"alamofire","query":"how download requests save responses to disk","category":"semantic","method":"semble","tokens":1999,"answered":false} -{"repo":"alamofire","query":"how download requests save responses to disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"alamofire","query":"how server trust evaluation handles SSL certificate pinning","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"alamofire","query":"how server trust evaluation handles SSL certificate pinning","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"axios","query":"InterceptorManager","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"axios","query":"InterceptorManager","category":"symbol","method":"grep+read","tokens":2148,"answered":true} -{"repo":"axios","query":"request and response interceptors","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"axios","query":"request and response interceptors","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"axios","query":"Axios","category":"symbol","method":"semble","tokens":2000,"answered":false} -{"repo":"axios","query":"Axios","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"axios","query":"axios default configuration and request/response transformers","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"axios","query":"axios default configuration and request/response transformers","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"axum","query":"WebSocket upgrade and handler","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"axum","query":"WebSocket upgrade and handler","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"axum","query":"BoxedIntoRoute and type-erased route storage","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"axum","query":"BoxedIntoRoute and type-erased route storage","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"axum","query":"how MethodRouter dispatches GET POST PUT DELETE by HTTP method","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"axum","query":"how MethodRouter dispatches GET POST PUT DELETE by HTTP method","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"axum","query":"FromRequest","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"axum","query":"FromRequest","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"axum","query":"how axum nests routers and merges router trees","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"axum","query":"how axum nests routers and merges router trees","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"axum","query":"Router","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"axum","query":"Router","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"bash-it","query":"jump plugin for bookmarking directories","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"jump plugin for bookmarking directories","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"bash-it","query":"battery level detection for shell prompt","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"battery level detection for shell prompt","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"bash-it","query":"rvm ruby version manager plugin","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"rvm ruby version manager plugin","category":"symbol","method":"grep+read","tokens":0,"answered":false} -{"repo":"bash-it","query":"hub github cli aliases and helpers","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"hub github cli aliases and helpers","category":"symbol","method":"grep+read","tokens":0,"answered":false} -{"repo":"bash-it","query":"ssh agent plugin for managing ssh keys","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"ssh agent plugin for managing ssh keys","category":"symbol","method":"grep+read","tokens":0,"answered":false} -{"repo":"bash-it","query":"node version manager nvm integration","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"bash-it","query":"node version manager nvm integration","category":"symbol","method":"grep+read","tokens":0,"answered":false} -{"repo":"bats-core","query":"how bats should retry a flaky test","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"bats-core","query":"how bats should retry a flaky test","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"bats-core","query":"how the preprocessed test source is evaluated","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"bats-core","query":"how the preprocessed test source is evaluated","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"bats-core","query":"how bats finds a library in the BATS_LIB_PATH","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"bats-core","query":"how bats finds a library in the BATS_LIB_PATH","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"cats","query":"how Monad composes dependent effectful computations with flatMap","category":"architecture","method":"semble","tokens":1999,"answered":false} -{"repo":"cats","query":"how Monad composes dependent effectful computations with flatMap","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"cats","query":"Kleisli","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"cats","query":"Kleisli","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"cats","query":"how Kleisli composes functions that return monadic values","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"cats","query":"how Kleisli composes functions that return monadic values","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"cats","query":"Monad","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"cats","query":"Monad","category":"symbol","method":"grep+read","tokens":16000,"answered":false} -{"repo":"cats","query":"how Applicative combines independent effects","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"cats","query":"how Applicative combines independent effects","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"cats","query":"how Validated accumulates errors across independent computations","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"cats","query":"how Validated accumulates errors across independent computations","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"chi","query":"radix tree path matching","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"chi","query":"radix tree path matching","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"chi","query":"Router","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"chi","query":"Router","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"circe","query":"Codec combining Encoder and Decoder for bidirectional conversion","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"circe","query":"Codec combining Encoder and Decoder for bidirectional conversion","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"circe","query":"HCursor and cursor navigation for traversing JSON trees","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"circe","query":"HCursor and cursor navigation for traversing JSON trees","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"circe","query":"how Encoder typeclass converts Scala values to JSON","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"circe","query":"how Encoder typeclass converts Scala values to JSON","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"click","query":"parameter type coercion and value validation","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"click","query":"parameter type coercion and value validation","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"click","query":"decorator API for defining commands, options, and arguments","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"click","query":"decorator API for defining commands, options, and arguments","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"cobra","query":"PowerShell completion generation","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"cobra","query":"PowerShell completion generation","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"cobra","query":"Args","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"cobra","query":"Args","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"cobra","query":"Command","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"cobra","query":"Command","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"cobra","query":"CompletionOptions","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"cobra","query":"CompletionOptions","category":"symbol","method":"grep+read","tokens":15999,"answered":false} -{"repo":"commons-lang","query":"StringUtils","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"commons-lang","query":"StringUtils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"commons-lang","query":"toString builder for human-readable object descriptions","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"commons-lang","query":"toString builder for human-readable object descriptions","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"commons-lang","query":"Java runtime and OS system property helpers","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"commons-lang","query":"Java runtime and OS system property helpers","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"commons-lang","query":"boolean conversion and parsing helpers","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"commons-lang","query":"boolean conversion and parsing helpers","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"commons-lang","query":"ExceptionUtils","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"commons-lang","query":"ExceptionUtils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"curl","query":"how HTTP proxy tunnel CONNECT method is initiated","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"curl","query":"how HTTP proxy tunnel CONNECT method is initiated","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"curl","query":"how curl decides whether to retry a failed request","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"curl","query":"how curl decides whether to retry a failed request","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"curl","query":"how curl resolves and connects to a remote host","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"curl","query":"how curl resolves and connects to a remote host","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"curl","query":"how curl checks if HTTP If-Modified-Since condition is met","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"curl","query":"how curl checks if HTTP If-Modified-Since condition is met","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"curl","query":"connection filter chain setup for proxies and TLS","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"curl","query":"connection filter chain setup for proxies and TLS","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"dapper","query":"CommandDefinition","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"dapper","query":"CommandDefinition","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"dapper","query":"SqlMapper","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"dapper","query":"SqlMapper","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"dapper","query":"how Dapper caches parameter and deserializer IL","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"dapper","query":"how Dapper caches parameter and deserializer IL","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"ecto","query":"Schema","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"ecto","query":"Schema","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"ecto","query":"Ecto.Changeset for validating and transforming data","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"ecto","query":"Ecto.Changeset for validating and transforming data","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"ecto","query":"Ecto.Query DSL for composing SQL queries","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"ecto","query":"Ecto.Query DSL for composing SQL queries","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"exposed","query":"SchemaUtils for creating and dropping database tables","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"exposed","query":"SchemaUtils for creating and dropping database tables","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"express","query":"how res.redirect builds the Location header and status code","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"express","query":"how res.redirect builds the Location header and status code","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"express","query":"how app.render resolves views and calls the template engine","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"express","query":"how app.render resolves views and calls the template engine","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"express","query":"how app.handle dispatches requests through the middleware stack","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"express","query":"how app.handle dispatches requests through the middleware stack","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"express","query":"res.send body encoding and ETag generation","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"express","query":"res.send body encoding and ETag generation","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"fastapi","query":"APIRouter","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"fastapi","query":"APIRouter","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"fastapi","query":"BackgroundTasks","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"fastapi","query":"BackgroundTasks","category":"symbol","method":"grep+read","tokens":9026,"answered":true} -{"repo":"fastapi","query":"how is response validation and serialization applied before sending","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"fastapi","query":"how is response validation and serialization applied before sending","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"fastapi","query":"how does FastAPI run sync route functions without blocking","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"fastapi","query":"how does FastAPI run sync route functions without blocking","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"fastapi","query":"running work after returning an HTTP response without blocking","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"fastapi","query":"running work after returning an HTTP response without blocking","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"flask","query":"how does Flask convert a view return value into a response object","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"flask","query":"how does Flask convert a view return value into a response object","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"fmtlib","query":"chrono duration and time point formatting","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"fmtlib","query":"chrono duration and time point formatting","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"fmtlib","query":"formatter","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"fmtlib","query":"formatter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"gin","query":"radix tree path matching","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"gin","query":"radix tree path matching","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"gin","query":"HTML template rendering","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"gin","query":"HTML template rendering","category":"semantic","method":"grep+read","tokens":719,"answered":true} -{"repo":"gson","query":"TypeAdapter","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"gson","query":"TypeAdapter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"gson","query":"streaming JSON reader and token parsing","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"gson","query":"streaming JSON reader and token parsing","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"gson","query":"JsonParser","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"gson","query":"JsonParser","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"gson","query":"how type adapter factories are registered and selected for a given type","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"gson","query":"how type adapter factories are registered and selected for a given type","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"guzzle","query":"available request options and their configuration","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"guzzle","query":"available request options and their configuration","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"guzzle","query":"mock handler for simulating HTTP responses in tests","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"guzzle","query":"mock handler for simulating HTTP responses in tests","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"guzzle","query":"how the handler stack wraps middleware around the HTTP send","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"guzzle","query":"how the handler stack wraps middleware around the HTTP send","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"http4s","query":"Uri","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"http4s","query":"Uri","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"http4s","query":"how query parameters are extracted and decoded from URIs","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"http4s","query":"how query parameters are extracted and decoded from URIs","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"http4s","query":"how HttpRoutes define pattern-matched HTTP request handlers","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"http4s","query":"how HttpRoutes define pattern-matched HTTP request handlers","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"httpx","query":"AsyncClient","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"httpx","query":"AsyncClient","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"httpx","query":"URL","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"httpx","query":"URL","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"httpx","query":"HTTPStatusError","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"httpx","query":"HTTPStatusError","category":"symbol","method":"grep+read","tokens":11879,"answered":true} -{"repo":"httpx","query":"how the HTTP transport backend sends requests over the wire","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"httpx","query":"how the HTTP transport backend sends requests over the wire","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"httpx","query":"DigestAuth","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"httpx","query":"DigestAuth","category":"symbol","method":"grep+read","tokens":3282,"answered":true} -{"repo":"jackson-databind","query":"ObjectMapper","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"jackson-databind","query":"ObjectMapper","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"jackson-databind","query":"TypeFactory","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"jackson-databind","query":"TypeFactory","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"jackson-databind","query":"ObjectWriter","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"jackson-databind","query":"ObjectWriter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"kotlinx-coroutines","query":"flow operators map filter transform and collect","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"kotlinx-coroutines","query":"flow operators map filter transform and collect","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"kotlinx-coroutines","query":"Channel","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"kotlinx-coroutines","query":"Channel","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"ktor","query":"how client plugins intercept and transform requests and responses","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"ktor","query":"how client plugins intercept and transform requests and responses","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"ktor","query":"HttpCookies","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"ktor","query":"HttpCookies","category":"symbol","method":"grep+read","tokens":12425,"answered":true} -{"repo":"laravel-framework","query":"queue connection resolution and connectors","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"laravel-framework","query":"queue connection resolution and connectors","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"lazy.nvim","query":"how plugin installations and updates are managed with tasks","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"lazy.nvim","query":"how plugin installations and updates are managed with tasks","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"lazy.nvim","query":"spawning and aborting async subprocess commands with uv","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"lazy.nvim","query":"spawning and aborting async subprocess commands with uv","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"lazy.nvim","query":"how text sections are rendered in the lazy view","category":"semantic","method":"semble","tokens":1999,"answered":false} -{"repo":"lazy.nvim","query":"how text sections are rendered in the lazy view","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"lazy.nvim","query":"how lazy.nvim loads a plugin on demand when its trigger fires","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"lazy.nvim","query":"how lazy.nvim loads a plugin on demand when its trigger fires","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"libuv","query":"timer implementation and heap-based scheduling","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"libuv","query":"timer implementation and heap-based scheduling","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"libuv","query":"UDP socket send and receive","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"libuv","query":"UDP socket send and receive","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"messagepack-csharp","query":"IMessagePackFormatter","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"messagepack-csharp","query":"IMessagePackFormatter","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"messagepack-csharp","query":"how binary data is deserialized back into typed C# objects","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"messagepack-csharp","query":"how binary data is deserialized back into typed C# objects","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"mini.nvim","query":"how mini.pick implements a fuzzy finder picker","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"mini.nvim","query":"how mini.pick implements a fuzzy finder picker","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"mini.nvim","query":"how mini.completion provides LSP-based autocompletion","category":"architecture","method":"semble","tokens":1999,"answered":false} -{"repo":"mini.nvim","query":"how mini.completion provides LSP-based autocompletion","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"mini.nvim","query":"how mini.diff shows inline git diff signs in buffers","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"mini.nvim","query":"how mini.diff shows inline git diff signs in buffers","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"mini.nvim","query":"how mini.deps manages Neovim plugin installation and updates","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"mini.nvim","query":"how mini.deps manages Neovim plugin installation and updates","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"model2vec","query":"how subword token weights are aggregated for whole-word embeddings","category":"architecture","method":"semble","tokens":1999,"answered":false} -{"repo":"model2vec","query":"how subword token weights are aggregated for whole-word embeddings","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"model2vec","query":"how PCA reduces embedding dimensionality","category":"architecture","method":"semble","tokens":1999,"answered":false} -{"repo":"model2vec","query":"how PCA reduces embedding dimensionality","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"model2vec","query":"saving and loading models from disk","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"model2vec","query":"saving and loading models from disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"monolog","query":"syslog handler for system-level logging","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"monolog","query":"syslog handler for system-level logging","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"monolog","query":"RotatingFileHandler","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"monolog","query":"RotatingFileHandler","category":"symbol","method":"grep+read","tokens":1876,"answered":true} -{"repo":"monolog","query":"how log records propagate through the handler bubble chain","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"monolog","query":"how log records propagate through the handler bubble chain","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"monolog","query":"how log handlers are registered and invoked by Logger","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"monolog","query":"how log handlers are registered and invoked by Logger","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"newtonsoft-json","query":"JsonReader base class and token reading API","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"newtonsoft-json","query":"JsonReader base class and token reading API","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"nlohmann-json","query":"adl_serializer","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"nlohmann-json","query":"adl_serializer","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"nlohmann-json","query":"basic_json","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"nlohmann-json","query":"basic_json","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"nvm","query":"how nvm_has checks whether a command exists on the system","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"nvm","query":"how nvm_has checks whether a command exists on the system","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"nvm","query":"how nvm finds the nearest .nvmrc file by walking up the directory tree","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"nvm","query":"how nvm finds the nearest .nvmrc file by walking up the directory tree","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"nvm","query":"how nvm downloads a Node.js tarball from the remote","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"nvm","query":"how nvm downloads a Node.js tarball from the remote","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"nvm","query":"how nvm manages the PATH to point to the active Node.js bin","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"nvm","query":"how nvm manages the PATH to point to the active Node.js bin","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"nvm","query":"how nvm_get_latest fetches the latest available Node.js version","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"nvm","query":"how nvm_get_latest fetches the latest available Node.js version","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"pandoc","query":"how pandoc reads RST reStructuredText documents","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"pandoc","query":"how pandoc reads RST reStructuredText documents","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"pandoc","query":"how the PandocMonad typeclass abstracts IO for readers and writers","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"pandoc","query":"how the PandocMonad typeclass abstracts IO for readers and writers","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"pandoc","query":"how pandoc's app module orchestrates reading, filtering, and writing","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"pandoc","query":"how pandoc's app module orchestrates reading, filtering, and writing","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"pandoc","query":"how pandoc generates PDF output via LaTeX or other backends","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"pandoc","query":"how pandoc generates PDF output via LaTeX or other backends","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"phoenix","query":"how Phoenix logs request and response lifecycle events","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"phoenix","query":"how Phoenix logs request and response lifecycle events","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"phoenix","query":"how Phoenix routes are defined and dispatched to controller actions","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"phoenix","query":"how Phoenix routes are defined and dispatched to controller actions","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"phoenix","query":"naming conventions for controllers and view modules","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"phoenix","query":"naming conventions for controllers and view modules","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"phoenix","query":"how the router matches path segments to controller/action","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"phoenix","query":"how the router matches path segments to controller/action","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"pydantic","query":"how discriminated unions select the right model variant","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"pydantic","query":"how discriminated unions select the right model variant","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"pydantic","query":"field_validator","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"pydantic","query":"field_validator","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"pydantic","query":"model_validator","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"pydantic","query":"model_validator","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"rack","query":"serving a file index page for a folder on disk","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"rack","query":"serving a file index page for a folder on disk","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"rack","query":"Utils","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"rack","query":"Utils","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"rack","query":"Rack::Response","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"rack","query":"Rack::Response","category":"symbol","method":"grep+read","tokens":5109,"answered":true} -{"repo":"rack","query":"Rack::Builder","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"rack","query":"Rack::Builder","category":"symbol","method":"grep+read","tokens":2490,"answered":true} -{"repo":"rack","query":"static file serving middleware","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"rack","query":"static file serving middleware","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"rack","query":"Request","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"rack","query":"Request","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"rails","query":"Rails::Paths","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"rails","query":"Rails::Paths","category":"symbol","method":"grep+read","tokens":2801,"answered":true} -{"repo":"rails","query":"Rails command dispatch and subcommand routing","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"rails","query":"Rails command dispatch and subcommand routing","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"redis","query":"how SETRANGE modifies a substring within a string value","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"redis","query":"how SETRANGE modifies a substring within a string value","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"redis","query":"how RDB persistence serializes the database to disk","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"redis","query":"how RDB persistence serializes the database to disk","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"redis","query":"how the event loop handles file events and time events","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"redis","query":"how the event loop handles file events and time events","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"redis","query":"how slave keys with expiry are tracked in replication","category":"semantic","method":"semble","tokens":1999,"answered":false} -{"repo":"redis","query":"how slave keys with expiry are tracked in replication","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"redis","query":"server startup initialization and configuration loading","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"redis","query":"server startup initialization and configuration loading","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"redux","query":"how listeners are subscribed and notified after state changes","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"redux","query":"how listeners are subscribed and notified after state changes","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"redux","query":"middleware pipeline composition","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"redux","query":"middleware pipeline composition","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"redux","query":"reducer type definition","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"redux","query":"reducer type definition","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"redux","query":"combineReducers","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"redux","query":"combineReducers","category":"symbol","method":"grep+read","tokens":7010,"answered":true} -{"repo":"redux","query":"createStore","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"redux","query":"createStore","category":"symbol","method":"grep+read","tokens":9042,"answered":true} -{"repo":"redux","query":"bindActionCreators","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"redux","query":"bindActionCreators","category":"symbol","method":"grep+read","tokens":941,"answered":true} -{"repo":"redux","query":"applyMiddleware","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"redux","query":"applyMiddleware","category":"symbol","method":"grep+read","tokens":5283,"answered":true} -{"repo":"requests","query":"event hooks system","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"requests","query":"event hooks system","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"requests","query":"how proxy settings are read from environment variables","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"requests","query":"how proxy settings are read from environment variables","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"requests","query":"PreparedRequest","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"requests","query":"PreparedRequest","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"serde","query":"how derive macros parse and apply field-level serde attributes","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"serde","query":"how derive macros parse and apply field-level serde attributes","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"serde","query":"value-based deserialization for self-describing formats","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"serde","query":"value-based deserialization for self-describing formats","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"serde","query":"Serialize","category":"symbol","method":"semble","tokens":1998,"answered":true} -{"repo":"serde","query":"Serialize","category":"symbol","method":"grep+read","tokens":16000,"answered":false} -{"repo":"sinatra","query":"before and after filter hooks for the request lifecycle","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"sinatra","query":"before and after filter hooks for the request lifecycle","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"sinatra","query":"Sinatra::ShowExceptions","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"sinatra","query":"Sinatra::ShowExceptions","category":"symbol","method":"grep+read","tokens":3365,"answered":true} -{"repo":"sinatra","query":"Sinatra::Helpers","category":"symbol","method":"semble","tokens":2000,"answered":false} -{"repo":"sinatra","query":"Sinatra::Helpers","category":"symbol","method":"grep+read","tokens":0,"answered":false} -{"repo":"sinatra","query":"Sinatra::Application","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"sinatra","query":"Sinatra::Application","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"sinatra","query":"case-insensitive hash for request params","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"sinatra","query":"case-insensitive hash for request params","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"snapkit","query":"how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"snapkit","query":"how DSL protocols define layout anchor properties like left, top, edges, and center for views and guides","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"snapkit","query":"ConstraintMaker","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"snapkit","query":"ConstraintMaker","category":"symbol","method":"grep+read","tokens":9219,"answered":true} -{"repo":"starlette","query":"how are static files served","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"starlette","query":"how are static files served","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"starlette","query":"Request","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"starlette","query":"Request","category":"symbol","method":"grep+read","tokens":15999,"answered":false} -{"repo":"starlette","query":"BaseHTTPMiddleware","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"starlette","query":"BaseHTTPMiddleware","category":"symbol","method":"grep+read","tokens":2060,"answered":true} -{"repo":"telescope.nvim","query":"how telescope actions map keys to picker operations","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"telescope.nvim","query":"how telescope actions map keys to picker operations","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"tokio","query":"Notify","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"tokio","query":"Notify","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"tokio","query":"how the async mutex prevents concurrent access","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"tokio","query":"how the async mutex prevents concurrent access","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"tokio","query":"how tasks that are not Send can run on a single thread","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"tokio","query":"how tasks that are not Send can run on a single thread","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"trpc","query":"how middleware chains context transformations between procedures","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"how middleware chains context transformations between procedures","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"trpc","query":"inferProcedureInput","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"inferProcedureInput","category":"symbol","method":"grep+read","tokens":6138,"answered":true} -{"repo":"trpc","query":"MiddlewareBuilder","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"MiddlewareBuilder","category":"symbol","method":"grep+read","tokens":8486,"answered":true} -{"repo":"trpc","query":"how type inference extracts input and output types from procedures","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"how type inference extracts input and output types from procedures","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"trpc","query":"how server-sent events and subscriptions are streamed to the client","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"trpc","query":"how server-sent events and subscriptions are streamed to the client","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"trpc","query":"AnyRouter","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"AnyRouter","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"trpc","query":"how tRPC procedures are defined and chained with input and output validation","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"trpc","query":"how tRPC procedures are defined and chained with input and output validation","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"vapor","query":"Application","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"vapor","query":"Application","category":"symbol","method":"grep+read","tokens":16000,"answered":true} -{"repo":"vapor","query":"how route groups and route collections compose routes","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"vapor","query":"how route groups and route collections compose routes","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"vitest","query":"test runner worker pool scheduling and execution","category":"architecture","method":"semble","tokens":1999,"answered":true} -{"repo":"vitest","query":"test runner worker pool scheduling and execution","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"vitest","query":"how vitest discovers and runs test files","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"vitest","query":"how vitest discovers and runs test files","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"vitest","query":"StateManager","category":"symbol","method":"semble","tokens":2000,"answered":true} -{"repo":"vitest","query":"StateManager","category":"symbol","method":"grep+read","tokens":15999,"answered":true} -{"repo":"vitest","query":"fake timers and timer mocking utilities","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"vitest","query":"fake timers and timer mocking utilities","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"vitest","query":"snapshot testing serialization and comparison","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"vitest","query":"snapshot testing serialization and comparison","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"xmonad","query":"how xmonad handles floating windows separately from tiled ones","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"xmonad","query":"how xmonad handles floating windows separately from tiled ones","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"zig","query":"how debug.print outputs to stderr for debugging","category":"semantic","method":"semble","tokens":2000,"answered":false} -{"repo":"zig","query":"how debug.print outputs to stderr for debugging","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"zls","query":"how zls provides goto definition for symbols","category":"semantic","method":"semble","tokens":2000,"answered":true} -{"repo":"zls","query":"how zls provides goto definition for symbols","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"zls","query":"how zls DocumentStore loads and caches Zig source files","category":"architecture","method":"semble","tokens":2000,"answered":false} -{"repo":"zls","query":"how zls DocumentStore loads and caches Zig source files","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"zls","query":"how zls generates diagnostic errors and warnings","category":"semantic","method":"semble","tokens":1999,"answered":true} -{"repo":"zls","query":"how zls generates diagnostic errors and warnings","category":"semantic","method":"grep+read","tokens":0,"answered":false} -{"repo":"zls","query":"how zls traverses the Zig AST to resolve symbol scopes","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"zls","query":"how zls traverses the Zig AST to resolve symbol scopes","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"zls","query":"how zls computes document scope for variable visibility","category":"architecture","method":"semble","tokens":2000,"answered":true} -{"repo":"zls","query":"how zls computes document scope for variable visibility","category":"architecture","method":"grep+read","tokens":0,"answered":false} -{"repo":"zod","query":"ZodType","category":"symbol","method":"semble","tokens":1999,"answered":true} -{"repo":"zod","query":"ZodType","category":"symbol","method":"grep+read","tokens":16000,"answered":true} diff --git a/benchmarks/results/context-efficiency-recall-6248855cfef8.json b/benchmarks/results/context-efficiency-recall-6d7dea15950e.json similarity index 57% rename from benchmarks/results/context-efficiency-recall-6248855cfef8.json rename to benchmarks/results/context-efficiency-recall-6d7dea15950e.json index aee9276..26374d1 100644 --- a/benchmarks/results/context-efficiency-recall-6248855cfef8.json +++ b/benchmarks/results/context-efficiency-recall-6d7dea15950e.json @@ -13,9 +13,9 @@ "n_queries": 1251, "recall_at_budget": { "semble": { - "500": 0.6843, - "1000": 0.848, - "2000": 0.9365, + "500": 0.6859, + "1000": 0.8492, + "2000": 0.9369, "4000": 0.9762, "8000": 0.9912, "16000": 0.996, @@ -26,36 +26,26 @@ "1000": 0.0072, "2000": 0.0228, "4000": 0.042, - "8000": 0.0763, - "16000": 0.1011, - "32000": 0.1267 - }, - "ripgrep-c8": { - "500": 0.0691, - "1000": 0.0911, - "2000": 0.1071, - "4000": 0.1171, - "8000": 0.1307, - "16000": 0.1431, - "32000": 0.1503 + "8000": 0.0755, + "16000": 0.1003, + "32000": 0.1251 } }, "first_hit_reduction": { "grep+read": { - "n_paired": 191.0, + "n_paired": 189.0, "median_semble_tokens": 275.0, "median_other_tokens": 7864.0, "median_reduction": 0.9708, "mean_reduction": 0.9323, - "semble_better_pct": 1.0 + "semble_better_pct": 1.0, + "expected_cost_at_cap": 29674.5835, + "expected_cost_cap": 32000.0, + "expected_cost_ratio_vs_semble": 52.3008 }, - "ripgrep-c8": { - "n_paired": 190.0, - "median_semble_tokens": 274.5, - "median_other_tokens": 613.0, - "median_reduction": 0.6399, - "mean_reduction": 0.2028, - "semble_better_pct": 0.7263 + "semble": { + "expected_cost_at_cap": 567.3829, + "expected_cost_cap": 32000.0 } }, "plot": { @@ -125,33 +115,33 @@ "semble": [ 0.0404, 0.0484, - 0.0584, - 0.0699, - 0.0823, + 0.0576, + 0.0691, + 0.0815, 0.1007, - 0.1214, - 0.1533, + 0.1206, + 0.1525, 0.1941, - 0.2397, + 0.2401, 0.3183, - 0.4213, - 0.5524, - 0.6367, - 0.6719, - 0.6922, - 0.7134, - 0.7438, - 0.772, + 0.4205, + 0.5536, + 0.6383, + 0.6735, + 0.693, + 0.7138, + 0.743, + 0.7716, 0.792, - 0.818, - 0.8472, - 0.8624, - 0.8776, - 0.8894, - 0.9101, - 0.9209, - 0.9341, - 0.9432, + 0.8184, + 0.8484, + 0.8628, + 0.878, + 0.8898, + 0.9105, + 0.9213, + 0.9345, + 0.9436, 0.9515, 0.9547, 0.9619, @@ -225,88 +215,26 @@ 0.0548, 0.0584, 0.0675, - 0.0763, + 0.0755, + 0.0779, 0.0787, - 0.0795, - 0.0875, - 0.0903, - 0.0971, - 0.0987, - 0.1047, - 0.1111, - 0.1155, - 0.1195, - 0.1219, + 0.0859, + 0.0887, + 0.0963, + 0.0979, + 0.1039, + 0.1103, + 0.1147, + 0.1187, + 0.1211, + 0.1251, 0.1267, 0.1275, - 0.1283, - 0.1315, + 0.1299, + 0.1355, 0.1371, - 0.1379, 0.1411, - 0.1435 - ], - "ripgrep-c8": [ - 0.0096, - 0.0152, - 0.0204, - 0.024, - 0.0288, - 0.0328, - 0.038, - 0.0404, - 0.0424, - 0.0472, - 0.0504, - 0.0536, - 0.0592, - 0.0624, - 0.0655, - 0.0691, - 0.0731, - 0.0779, - 0.0827, - 0.0851, - 0.0863, - 0.0911, - 0.0943, - 0.0991, - 0.1047, - 0.1063, - 0.1071, - 0.1071, - 0.1087, - 0.1103, - 0.1115, - 0.1131, - 0.1131, - 0.1147, - 0.1171, - 0.1179, - 0.1211, - 0.1259, - 0.1283, - 0.1307, - 0.1307, - 0.1319, - 0.1383, - 0.1387, - 0.1395, - 0.1407, - 0.1415, - 0.1439, - 0.1439, - 0.1439, - 0.1471, - 0.1487, - 0.1503, - 0.1503, - 0.1503, - 0.1503, - 0.1503, - 0.1503, - 0.1503, - 0.1503 + 0.1419 ] } } From ba7bdf25b0b44a44cd5cfd6de4663a0edee72626 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 08:54:25 +0200 Subject: [PATCH 05/18] Updated benchmark --- assets/images/recall_vs_tokens.png | Bin 54685 -> 0 bytes assets/images/token_efficiency.png | Bin 0 -> 52264 bytes benchmarks/README.md | 10 +++++----- ....json => token-efficiency-6d7dea15950e.json} | 0 ...ontext_efficiency.py => token_efficiency.py} | 13 ++++++------- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 assets/images/recall_vs_tokens.png create mode 100644 assets/images/token_efficiency.png rename benchmarks/results/{context-efficiency-recall-6d7dea15950e.json => token-efficiency-6d7dea15950e.json} (100%) rename benchmarks/{context_efficiency.py => token_efficiency.py} (97%) diff --git a/assets/images/recall_vs_tokens.png b/assets/images/recall_vs_tokens.png deleted file mode 100644 index 2285f3c82bc316bd186f64f5aa85515ba619376c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54685 zcmdSBbzIZmA3r)oQB*`lMM(>gRwSeiPyt~`HwHCENW(})MLq~9DH|}lLt?~;fkn&_ z12#H@0izp6-ZQ?xd;h$D-pAwec=%xI>wVtmyv{40uUe?K))SVK948?V2#eZN6&(oV zC>jDeGJJvw{L4|}@9)4bId@efcU@;2cdwVO))38??r$8N-5p@Bu6kO#y1|^C?uy;H zEp|`js-3(08#g&|amW9MLd@CKR=m;FqYbRW{N|~#8wA3Bp8kiy7EJ{2>S0z>d7$T= zI5%|MTTj2gVOd7;+O?xkAD-fVcvFB)2|qXHK0^ zG|WLcVb#*o(~Xa@G=%U5-16OAh=mu|8JJW$iL#ixxRi*PRy>P}j<){!k!8}qJy}u5 z#6&3G0+Cz0^y5^|{@(I<69qi?<#!l63a9vHG^kq4fmD#-W0yJNve9R2NZaIa-y7#W zFiNM$z4~<`drVMJu+)#Xa*_gtLS@F4XcKH#0x?wNKMdsE&A3l6|Q$m86xNBHs2D5OkTaT;W@}^PZHP5DB zJBqgOU+-b!_9LFEl6LI(7TJnPN)kPwwFmySt-D=2Uomj=>eZAVlJcH&w@xWgR}>C* zSCi_q&1*dQjWQdb%G+t@>t<_NqZz#aY>otqcV$CmWa2%KqSr2`?s$e>5_J$nD<4G{ ztbQ9VIOn&bP`BW-w@xN_v~hb4UK<`=8vE%A{!ZRrl&VT+5D80OTpuhL$uF*Un`)iz zOeeU8e)^QN;(LUVQL`aWNZ(vOV4Iq4y~ALi4eQF9>>bF{&u1z*u~@sR#TL`;IJtrs zpX&XHXc{`!0ii}0DesQ4W|{A5 zgKq7Pw`EqO&Rx97H&o*#BNdBSpRwi%GS-}eK4yewCwU^7gCaPjS{2@u@~ps?Ud(jo zN(Aov(Ynz4H=_lhMJvAUK6|^X?b&9Yb<&-<9#=SRe0-eJ`Gi-Ivbb!^;a8vmA#!8T zk}q=K;@g#W{wnMqondPfNO{|d)B>!=F)Mh?_xG6P=+$?eJb5xo$$$G>eDXbeok9+l zkV)54JI#ujELeBW^Sanmkf4u`QMtyL58~MA>&urA>BWLuru|h_5cW*J!8F^sZe2mH|R=@R%&5!7>&g)czfSjy4 zb-0_OUHu{&`Gz>!Buc>l2Rj?v4QJe5MfE+m9*ct{ui-n;KLue-b#_RHH?Zr=!bMeS4;>{9Y3!}y>DL~8{ANgVomml4 z)}&e6i7rkh`?l$!Jyr3U`csAlMlVTdgFZ5cmjBL%lvG};z}2GK1rO8QzhiHj0}pmA z6J*`8S{PEHX&$H!{?FLI>s~e3FM^f^1l^6sTrw!%rz=z^p_j2+2&AY6$O~v`-=zr?Gtvym$I_5T03pxxLutJ!i+O%J(qC1+zeTh zFl5xr7Yu_>k%EUCx z7qQ$mtuJ-ike7{C*NlXCqt`AM&XyHT^+$J(WKGGL^O`Vvw#En&i!E^`#l_g<5z&w{ z+!9IF(|4ZWpzv3-9#7585>N9e^m2`?H-1aHBx+(sDqa}ScVvyNTwb3gqxK$b)_nea z+Rd!nEYc+3tg?7Jg)lVpLw_{47Pu$kQFP3{MNQ-o!pT#{Tn5WB^7+aqzNHQ4ZCz-CP;F5&jece0%`1gyaUDJ*)0-3+ms%ie}qA+c4i zS8nfM6ksqIe^8o$Mcq=7XkFDeNm!KM&U~fy&oz0eZ>j7x+sHewKUUxVF6LgCF~)KA z4d%1ETz=yA9#%wn%034cAW(Orlk;cb-mE2fq{idQtZL`R`~ZQahDkw-Z|b8MRP(+` zy#n@`N7A$gd4TRtts7Lxkro|PKdF!et!$jGc#u1)C%c;CP44Vsr_c08;lTIdT|-RL ztY&_kT40EiDaBbSzb2=UnWcbQk+Xwg3R>GFd2k9rn-n*CU+ZXVzt}Iv>p0g-UCm_w zj?m2`D7H>XckT6IODeL+j?d%K_2p%dy3nG9su%1-Z5Y8&rs%a6fBi-Q77M!+9dp+f zKI@+zH3|1z($xMsax;1;&fI}ks_iLa3;VhKgmB8!E++8&nbHD3h0gK6mIvG9lLG}} z&MfB(Oe@=J*O=6u<=jnmvEkFMosRd(`T2=Xv6bn_7>bp>n+S;$g*(_=oJ{=wqVY&q zaFj6ijO0?rZ1(Q9uACX8Di$r2^mvnD$ku(QCw?Ka|3Ps6NCCmPoEb|Tjc1ZrAI#X9 z*M%zbVN!RHJZ>JGI@{HLXH!?|?V74dJ?<%Xn@A1ek(e?W3UsgO7>#9m=3&}1 zZl;fks8gdIKZU4WmgczKxi^5Y%WV=);dxjUEKE^srR?Go+cMtQZE{sJ;!>^ zo7^qR$;ojC1~T(e$Qh~eV(g4iwvV`RX~x`QzS~6eSK@tHm)5@aq@83H< zYpAIS`cpIG)!EqC2wMOc7;X(DCMFWg+T`$`QTJS4!CYKi`l>>B5Y4CQ?x)LHH~n$A z#JDnmK}2j7z?Fo}&sXkdxljI0$V^B`u<;HE2%rM@?EGgO(0 z(tW8ostMTMCSsDjS6p~kX@~Xea~+zUT5-Q(3BZ`m;Cp5^^}wyM5F+pirR&ST z*)3xV+i|-Tas4>`%G|M^At;*ZtS`X4nepbH30FpHycSEXjmaZ!TaiYpARLty-ZJ;iWU0LfVq#QOnrK86_t| zdP+*e?!nh5Jc2`55BLY1FTh(G%G=X7bkD#ML&f9*W8I3{k1U)9$oTjv$#%79{)FZ2 z0HN``)gD931l;U!oiFV11$}5(n zP}QUj&t zbVb<&hN!{;Wsb4e&;2=eOMY_tjx}&BnE>8+<_?JgD0SCz&r!dm!o_?Ft2ynNjn|jh3VP=)39SF(4?FleA@^&sAuTokWcBMN0R489#@>j*NE5#G-8 zYxEJ?U&~gGP3nl`QJj&qa8}=5qmH|GnbWKa1#ApuQr)K7L{X1%`O?7pU7eN${@FRU zYr4fUTb7Rf|2Pg-b(+1H*)p{7`7P+3EwfnEd(MxDIysvK6r%81e3->F)xD*qWt{`W z6p>=)*l#Wz<+-^tV%=+xhx_@>j)lYwAB6?oCx;Cmtrp6U7^wHJ=^EjY_xx*iVOEk3 zJw5M}6j6t02gW+cPkH8!0pFonEeFJm3l6U}>6sgAc`D@MOM2xdXXAhMSNApsoT1oo!^#l_0LW~1drMv?{fV`d#`wU#q$&kN5nB0T+D1MJ zMgzGXLsoTbZ_R1``StIhq~PQJu#PebmdhrrF9y%~<>8mJv!-a#$IwL}c)6>^_(0!h zCO7-9ByMls*>Q-Sj>=0L;>^is?`w7!-jRTq!t{N^Dh7&JScKrQzL`BAF!Ns4$S3Me z#u6MHSJ{MKN#7}}q4KYtXSe3nr1>bT=%j(bgR z9u+P9wwp_%f8sf+vpUTOW=1*RS$oGoDH;HyffZlL;w-7FM9`w=PbNSUW>AK|*{j(NF+dmhTf)yP;jP1L^q>gcx3JS#H& zuYQ2Ec}n$UI=w|9Fy2CWXD2s;h zrpsg+oYi0xG*pc~1?M@b`KBPS3)qZonB-WRFru_O?0((TihdOOq~>QBCAWI)Bd7hK zG|u&m;GU_YcyTp@q*ny->W>?d3fC9PT`B6TMeJ`#;X%TPF6-DjCF-#(;wkKk>@|B0 zac_fS3r8jRzh|27Eib}-b7o}VZ4r6XA6zL{9n1qFhl6GagLrYA!x2qNr4(T`gO(hl zHGZb({Cd*U;J3qaMktvH8;cQmk>c)lBeYX~)X6M6RC*(N7zB>Jhny zA6m?1*6oqQ+_e7BxCw5Ngd9#G#STj*IqcccTx)?4@dpN-ARX}MitV@8Ut;gJa<`6LCf|HsrBpTBks6G5SzcbY zMz2@KidQNfy@j@`zeabWny&E7YJy}XS{SJdwTx{KL)3PRW=$ULf|T$RNb^*^mCvMD z469+hbF+E%ry0a$4u}L#>7LcVmcY%+Blo zEX12J&p7P9-x$@2UV;C3?cY-|xA00-S2)zg9KdHxf}Un@xXD0sEYd+Y*7?%xitn0@ z5&RF8&5tF;7?Z!2n_ndFkFew8s6>$_U7Mt>6sZM-l@5!}wZ~Pv5@b%f*_L99QIq2B zG=>|B`_tjoOv0_3A8mS!x=z7o)tqVX$#8O!RNWqRyF59g(s^Wf@C_{da$)$Cn3OS2 z$~;bgUfeV0_fXR-e~IEo0pXG=jQNbu?>t2#*-md7jkK2QOQV@gRnN4!Ab2|5>@@@9 z1==x4?OtqZcf&*fM0vPd0J;B<3H&MC(*DVbZ6XZgiHod5HqOM?XYIJsR#nV5f3J{RD4Ta0hE6CkuzZp>F15Qz?LUgHeL&0mxh+3?UWAC! zo&A+Nl27=MHxox%Sb?+NGKl`~V@4hlg3+&M=bjhMaV3wl&^D))GTxq=XNLMZm%f7< zM9VvF7{pt!!Ur@x%qvp+#aIhJygrs(RJUPr*K+=2L{Va8!vd&UXh3!t=h3om6>E-0YkNuf7 z+)b|vUuG}}uqaTs%a97N+uF`cg%&LN$YRpAOV0%|8bn)otr`=u4Njk%ZBD_9^pPnD z6ZbjU7W1csRMo*D(tlIUQa9__9mP2N7rkNzt5>bpPfQlCy+koxiD8Ox!cw#3{L!Sd zWeCr5r0Wi&e57(u(iGg)JhQ2(zq=}*F3}HOId=I$Fb~=UQW!dg{*W}^C!d9<@9KU7 zP+niwoMt11@psiVrMSKB&a4hieu2q-SDKeJ%VstIs!plZa)dy&Z_SHyG^DNl_=R{i z7dm1_9(g^~3=6pA_$LdKQr?n)1@8Md+e|4-&xUg$@&U(*jx3IT70k*9H~&dj!S<74 z^TTyD1)2 za}mIQW$FptgK1-tyx;~dxh}ZRb39#HWTJ5m5G*7hx0}l;6KHGuJBu}r{(Wk2OPE$M zfPO!BEi1j`ayHYX^ihwlGk5b7Rlb&Pp0rsCWJP3bODs4 zWHuz5jooW)J;)?%=E?mrVNIA*+VAyYNx^(C;HY1(7PtT5Cd_I=;hztZKj(LZ*IlC7JFGFA`aCe;7X20JQsl-=M> zyNX%i>xsvU)%@+Y>lCm@GUCsWoJlsMBUXqT_7V&VH2P2Dp;)FX^Vlv z@5N>-ni_O1aZ2=2=@eCY9GKit5(NzYE3P7L7uXj-z`&jrPCwh!DC@))MR765Uh%c5A%21 z6i=4xnAZvJ+SaqwALg<2pNue36BI@R%?R=ec?aYC082u@>?SOS;q+`Gz^gbIg&f4P~_p-irDE zC@xPxl5EP~edYMlc{O4|88iPuGm_PSaKiDAu|A8CS0Y@>HV(4~AAQh%uwZ1Ft7 z2Wp+l48-^~lisWnWDHTK&7!};qwm6%J2^g*M&JuKhIsR9Hb7X`B!=K2hY%2o=~HEk zxP$s1uHF7xo6dyJoTLxE)#4^QQA0aIZzOJV9p^{^MM2bPs725WOZRHKva=RC3x$-Pkz6QwEtCD6$-o2g z)>h@%(jCD!n$y2SNLd~8Pw_e8`F_~F=?`|aqIOUK<1vZ8k24HLaBP*^BdM+(BM#<+ zr1DTb|9zezrgr(o+R`kug=dl$yaQjD^wz$m$lOFk=R;lAw^9O&1L5YM<8a2EoaYK- z(->F^!_yyJ9vUg|fw9Ue`fe0#z8|Ncp4(lK{O08G)7*UNA-RU<(OM?{2^qJ)u+ns< z?yZaM*%CRBeOQ@Z>7LiJ#1g1?bnq5RR7Yz>L3hYm#A@agBfyDQFY7%8QsH7Xd&Od`&7G$bt?=Xg^d zSLnpL9mulVBb^;K{AKozR(v>9<(gS4PL0tLVc|AaZGeMDR+|JHZn_N_NKQLXZRfGD zyfSJE5JeZ|uSnfpznnqA$iFS|R4s1OVEF}#DIsRV56PMN?}-%O>GF3Fj$5U6XM6H! z>9dBxUt$@*Qm7@vh^MbRvx*H?4b5c`^`yN#KSyJh7xobHMbSt4v<;!-y6cE`M2Zd@ zBDrfcRB5i0e+ZI{QR_P3&;h40E*~QB|I* zinEBBjTTXSV4}&`s;sYLa*5>(m8E3(jlCwszcj1ys$$=)?wvYsrOiP%!W!a6Hq>?f zhYFm@j^(o9+VvkZ>*{C|P);}yf+N!L&*DRqmplTH`Kj0$ynbhN#qedjRgStlot%g| z2$2mpoMANk1n=Y(RLsBjN`)Lee0JtoVH`9t{|uQ@BvYK-KcOS;wD!sf%`_v|W$nOM z)-AAXqM?e`hJVSvw$EeEZm`s%8~SH{@FTEG5#)@1B>Aax>G~^uH*TtGp@m-D;_oM$ z!b9w9kB#80Giw~>U1qRtbB=F4Vg69!c!GYk?xwNuSBx;n`_7R3pg3HGYjqOAfm(4u9n4qhJk#h+AP1WXFfWTpVWIuW=W< zU7l3-W+Oz3gc|Z?@({y1*f}Wab$$eyqZC{^rwfbRjL*aPBiMSAi`d9A@>1SYkSr_PxC`r~j8%#m@(QfTUr3%T0hKr7POL|6w! znXYhLKMHHwmea=;x%$&4kEBzzL>9A?2jJIA@TW z=bzToFEk8O66y569~o`3Y7$w9FzYZ;;n0)oD=8Ig;;orpA#2@P^Dg!ol>AgUtH!H0 z9grLoV-=B4;Vmb5SeDyo%_ymsx^!0t>3G?e9fhPYfT{&4k$68=I+Fq7eVj#N_7NkC zk=?v0wENcMy)vE@J13QV8lOGXc?XkQsdSm-=e`X&l>?ms{Wn_*{@3mK9*}m=Kp=~$ zGA;C!zYM`d_gF)27e_Rfm0GVd%A9;3bmfe8mCw{op6cW})6dnNq(997SxD8K$H*2* zvleN(`81%ZO6fio?!0+Ij>krw4%faZ99lVv{eIrd{?)5|na7Zz%?>UFqyTia2Ns|J zozOj68#~!eRCr^cB;3FTf=Y;A6#slT>VoEryihfaz!iD6r6Z6Ta_(9V(`aD%WTo=W z*(X0A|8V(VuTT{W$oL%oj7rm+rszNafA};+5<><*{=a_WH>&NR*Tz8u%k5$iO(wh#pf}6B z|M)R^#moO-Z&Si|!(ml1oI@&#fsv^h_)t+zq@;^R-~W2Ec0&!B&`MjQjH^8C?6yZ9 z0|boOPKGMcQ~9bH}P;aZ;-*p@hW zYv0S&Ny22E*W$3&xVw>oLEPL3ZiJEVe=9C=TlCGfodLy|xKE!>#7pIvl-oU*)&#cz z-8QH9m*B^M*{E;P&^I!=#lXNI9m4?`6)pEH{5dwt1%U*7a=ZW2n3XT$Kk<-sz5fFJ z#dFvCo}0{2uQRe(M0yh7>s|qzeys#TVd)cj7IovUUY7<9D71KW69TD?RtkbZwu;`R zomV4>MUD4;h(em*f*GquC0RP)z2LVpa(-P?{hg^}^zX~RS0NYTV$`3PjQ?7S(h=-_ z`TLCE{<_=q>g5l=GjaQMkGPaL3Hl7b^@ zf(HkG{nQ8|UqnzxG$Et-UFoe18Acx;AF(FmpB_jokuw7HjyWkn8d!s&G#V|D5z_E+ zJXbm-ufrj4A`oM`Rz^~46&8uB{c*lUcxz;8_ubSfMN_(Azl%Lg3++BT$FfanCx1V56c{f_!-dh<&4hbWkZYE-h@KgAo_OXM-q z7TZtPlmBUsPOF^Zd1Cw`*OiCIp8-;f8eu|Xy%wF`L1)Ru@#k(l*1MejlS9TygqfL{ zN0=9^I?8Oq_7oKZV=Id}?P!y=c+C2z*3sCLd^e^78*d&_vCBEac;x22TlYcB)y-SC z@4sWj2c8kx;mYXhP`fZHt;FjmBqk;;mGI-okDJoc6%JdVON)|UTptD6dzu^GG7`L{ zK$DZK`}7xTuGpMqYyfr5s1mvqf`q}*p_J`>Y1dX>3n^9%TVGUodiwx3#` z%Pa);c{gSyQ?EUkTwHgSZ1{(ty}Cqhh}zd$rIBBp_hEngu~9e}O0Ot^s&a#0#qdbL zjwAEw(~{`ongwiWmOE%`a0NLUHPEI_mV7xdjwXua?;mqCnC2DH98aRhD_J zcL~hNtIs;#XQGmB7Ghz})>#$LtFzz+EExwgzW6#kodWOFTr?$9 z*5EI4)vA2Nm9-c(AK->VVpz9~sfs58AVKj=XrTHxIAxp)ZaXx-J7$e8uKIT}TS2SH z%#9#LOjA8YTc}x_00m?z=0BLn-Od54oT2~y=Xz+BMsfdXaPi-ESE$jBn7WYY-Ci+_ zXBCcd=iY}8-#q^!EVt#nRnHq{x#!VMk_jhId|B$a8ros_t^PQwUEpKv4wvV@GO1_T zEUdH2822Bsz2wX#%?n3Ina&NZgR9?=jOzUyDEhGOzUN}l}6AO4UJ`}~uN%thT93bIlu&`#&EaHqHj5r{t(q@V3SfcJ8)Xpf^tFh--0?WB7IREFl@!<#}1@B5!ZAjPVOFSZaBt+_89f9kelKl+;K z8LOvS0WNh+G3Q_1$aHkb@Nw>uOnVrlHiA<9kYJ+LugeL6?7u&JbM3>IE}?VxV)#%S znJ7rK&q(~WkgnAk#j5U#Iky{Xc04d-H4sEH9UeeZ8a;FaZz>*;uXcq(q63BlZfX3d zJ{Y|vfBWivIn3v%HqrDa9cdlhT0B@gsxHIA6F@4ge^PPFmt>c9ofur|`Kwm0q9*cTu#_;(uo9T|%uWfOLf>j&aowO<6eJN0dm@9TbE zv-7<^no<1?n3_RpO9({!?jc~&o-%nR&uZIJ^wU^JdoDTgS=<)?7%|=P^IAtgcuz$r zOoIK=`3Vy32qdWgP$q(eDC}{~+lsK#R|9ueO=^S*HyOPuzmMKmb4X|47jAaHK6-(Z zyRH8Sqyc}}UVT5I`>!9(+IOb7G3$bHK<|NV^b-d7b51u<;Q~AGVFgHk5Wh^F{s%q?PJ!NL$7YD@qhkzz1 z^36SUKB@fs5gAi0W8*%PL)*2K`yU-Or^_$t?ri0-z2y^bUV}H}8js&*K9Ldv;LsB2 zuLTURP4O|aar(+ddO=*SWm}{ic_uKtO0j#Kd?7vtn;BC5*8H_~M{%*m{HvVb;F|0| z(*^B5qmGf;D@2TGt)Ob0qvlt|CuN%7)lh$Xju)0^_H`5=HZOhIN8V6`W| z`OX;QrmC1FMf?1^*KWs0Tbenq77xA`%Qe>p*1e#T28a(1+uR$%)w#~}eHR!yioE0~ zCxoxedRoC5tl4?)8Ziy_zWh_CVO6<(e{=2ZL3F=NCNno!-s_M74ht?$4MHW_Oi3b^R2Dfv;v!6r1#96=1VncI&aPa|tiQ`g{7U0~>tsB|elLEYP zykwpzG>JFrb;2=^?fP%c+E+-5S|7b4;~PU=qRw&(YI1z|vIdmYo9`VIJeQqQUanWc z)%=B*#1q9!=9W;^-IMS82$7QoHu_)7ORu26Q;_qBrzpM^|Ltu7Vihsud|`}WSE8(H7O_6pGT8iSHj@yijGK`sJmKl zKHD{z<2$W$YjS{DFAg;)Ku`epwBD%piPF|fl!NRSpVmO$3zx43*ZgU{l8uRT$;L$e zB7rg>cwqDhU0y~FJ$c%q0{5!Sv&4G&5`0v%*D75)$0RDC8du2Kn8e}y50as$JxpbR zA@e(S_{1t#gboe1ca1h0GM@!A*F1Lg)7pIRoXUKbQelSIPS*L$mq$sZ;Luwf^m}Nq zwVt@pYJ1A71sBlkgeb}n1&+wdT}PuU#>rvP;5;Yy!iFoITH=s;%3&BSw%9%-W+^f( z>hpn5Y8#b0^l#$NU2LoD-oVqRw-vjY~U;4)3()pP-llW}q#TeGW!E496T;Xdn^Z%|>KDwAsnNuBy)yqyoyu0I?!p(}u1I9+(`wAD2tcs4{a}pN`s(}GZv;JlCVY|dU!_h2bpcUATAl)Z)&*S|!;-|5M8hSw~8NgC; zOj3DP*NBp(0FVHIBqe}!A8$BZV`qU0Ppv_}@PAD$0PYeZe(1)ldWvosuQb#MTlJBm z$(|gEm*L26&CA^euhM@S-vwk!L3IATF?G!L!i@+89=xiXFw`B$g@$DDkGeOGdJ?mI zZjiv}QcxtQJ^-Ie3>#ux6pOz&5TP%t3B1nAKha=oz4l85;OG$EL(I~f1>C3Cq(k%+ zrb7354<^a!GFg?UE-g|;_5JrXx~_21b>&6ae24^P-zy&9I-jer)dk#Af zE1K^f?)Kym`RV(sECal2_v|4_e!rG;V5O=>V*P`Y|8eVUdEt%CDP#DZr|GxFfFFYF zUNn3Mq&vnz@yknB`NH7@1BxW~zjUh=(O@e(8GCuK(w6+8Y(6HsoupVQJH*G^@@c%h zh)Ftfq`X2mO~KFDIW(mL@Dg%(pV3mqJ3c?pC1Bsg|F!T)>F4+4HdSfSs5~7946=wG zAd5+zq;tM>Pdm%6{!QgG({j@@*;D#8@5?K?9LL!xsT#TSfa4Hby6Fx2nqYeCz`P!+ zWLl+R;8cv=#IDF;931TBS!Ou!I&?YGpwlhAKJz43q~A}EZm~uR2E}P~Doq3 z&OXXXKh&rIFtHQ)7k8{?ehihmYp91Ghym$qyH^-%CRLjLS-vp#J=5`OOd?o+N%U|# zE}R=&@jw=0iv#<_tB?Jb+OJt))|_bl%B`uHUBy4mQXXVi!&zH|%c88;+sdQ0c)8DAXFmh8eW$f2CzWmt95!Syg03(Y&11J>oedUb z2(!`)8p_l)W&&r+V*BDX!_RY9&!r~r1Ey&QR&5`JG=yDLza0-Fud z3!!hBMcdQjtDi(*cJ1DfjcinMAdxENvsK5wL3fv`=jk~($y;>Z+TGWYSfLCpRw^3jG#1Zqk)O5<&;N10#-K+u0YQ-o0v4%jS*lCQi6> z5JihDT8{(5{~<30J3^aYbUPIlyOUYIHqjNiNbWzHwC!PU!TXz@(wR9#bn68GluQ;X zixdZz8OJ#&A&6AQBPwmYy$0a?A#3*J^8cOZe-3UvBd7NoPzl4~EzdHC{&*K6^-(Y* zWo3+eV#BRQE#9DWUFR`ayTOTms5fPU?_SY1+vO<-^#j*;blsqG{^Os{RtGrPR$Kd} z0YP}NM<>pw1B(VtV(BT$K|t?S-reu!K;Z!~{@aP_`8kzpn`gFcLEsJ`ehhS>b*PZx zGacUc4D+jakv+klR6B(QfEu4Pou#$Pc5=(?h=ZrBl8}N? z5w}~~6qZEbD4`qeQ7^jOX=?zxp|IQ{1pL)J=+7hLGHc)9wL?QszrF%4sKJ@emXu2X z-uf)=ENH{Pg^ThNtj?l^5=-uMJ4@p{ zu6|ar7rYG84VD?zn*bpXx3fsxBALrwcE5;OaUwE)-6oaJRa{yh&@!nQQ*DvTTC8?} zmeN1hTBal*0Jg^0T>-)2IBm|?zk?5}$0)~2{bujPkE6FWm8(7cu4~XmGv_@LoH|j( z#PhA0yia|>kjEg*?0(Ra06~`xKLxz9OrXrOwkuy6R_Jn@cj%J!Y!kcwv&wx|Z!l!}2-fyGhGK`m(vWW-Y7m{-*K{yaT3W>M(-x6;Fy~lppap4qY z)`+jt1kN7cK0pPrq@Qp!{^Wn^RzzQ6tL-R7v8K(ZcGnLA-hBQg#az5uO5a#LJsxjZ z%&@-LELtoYLoto4<{By1y-SF z%Cq$m@9y>Ae3@F~?}Cp^RC6-5{_2wV$#4KvLE@`3qq-n*^b94f={eVX?d{vQQQyAZ zqR(%+&-Io(4g|UTYjgwwMsXTtH{_x?uXWwo=*j}HV+5nO;*bdymRK1b- z!7d^izYKz{=9rqt&7XKgjp#lji1TQSy>gd@T~D6=3h2^T14S7tP&%^d{qf;cW=_u2 zWWNfV%;)H|GO8^U6)1hmOcHUDH)cK8E(ktYYnrN53hMdIo659}7+FZ-4> z#Ow5Uyhj-ll>8A%!9c~@Ws%7OGIgceq&amr*?>2%3Tl1HPhq5QJoDhp5U-OL#LJzA zXB!2Fk1ac=&Fn?(oKyS6XenK=nX+QPkv~ zK!{^ssr3igVZU_rjhSeu(w*vrehgf|*w~nV3N$_8#v|nI&64R&Qj{go543Nf$j~?v_ zY{dZNI4srYZGGZrkA_bUHmKR?I3RC5H^nXM5SS~&RW7fu$a@z2`tzsX^IvDi zBm}Z4=n~VaVd)qjC@u$du&ep34|V&dY~iDrmQ6#nBmg=~Q1GTL!qBnAiigK?1>NV{1WMi)HM&*#FX?Xo?X1s-~tQlM{HYVojvuCHJ z(7^eXu7+6=V=k_YZ{HAW@`Cjk4cEZGm4}BHkUdgZdDk9%QkqL?(uFLEA4=0ZXitw* zUXg*G4;UT8S#2&1Nq{jJ*g!?$l}kK4Vr0v}x)z$G*Mb>+Qm@>;Cr`_|hx1Hf+@J8{ zkY4A#11tSXY>`9H-8Ru=&0c%R;LqIk%;{-Oz1 z#?H1NvxMl4xSDeX4Z1!^2Q%nplO1MA$I`^bOZdCGE4R<1gjd(V~4T#U80u|aN*z9=rZ%mh(#T+T{&og6QtggZ;4 z%%HI#j#s!-Qmo+h6J+r>TDw3M2{Ni%yOLK6DpbT;A2;LgFW$ng+scBecxq$O>!ygw zOv$Q@pOM`124nK)+1NCdvcTYJ>5rxIa>)c4=VWFDsw5a~z6NrWJliimm@N-NOLv}D z;9=Jv22Ug@fBrJiPJQfV3tp4*cBwTFe2c?1SI|Y%3dB!5QgP!On2;r&CO1TT!p)VQ zS20C{l)F+_%mTdyv=W1_ljiTV=Q5?^~;7g{;lPA6tn+y;k zWZ8C*!b)+h>%Bb{3uQyZP06qE&YaiP=24|vbfshZ1xgV14M7YmTjP;<@bw7KG&36- z?o&yHsAq}yp38a6xD#>Y7hPrTO2TyesELwpAr+cx>hzxBmTTTx9=HDW>D>B?JaD5L zEzR*w%Eo*EuN4EZ0&rULDc@E)N&>}^O90M5IvRkDv~fI4;pc_|aa37lh1@%aut!#S zS1Qn`9BS=?1+G{+W(t#GjVmfl=bUiv;Cg2g7RLi+XutstgYf3kfF5Y>=(tWq9&D>l zI^XN`%@zJS*0|D4@t**>j6+O}KTf~AZaRdPJi&J+#Bb@RCvB&EJ<4=+kS*8RVKHuH zlaopPp@UUj937I~pQn?050V(KtTX`k))Ub!lnvv!Ceh~zFFUPNuqQLYeoM#cWvE7 ziN1-Alec z7Z#G0HRd`Ka+8nmEBYuz$0ta;_!+QayvH0}YVYhsiCm%?Zo7NhN-^KPZK@NU{ z2;1SL68#$kR=`+WOJneH%@i1rjVv2oU@quh?&3Rjj*R{qui{*8j17UqxYR0?`6P3C3Pe^D3DE+Y8^V1Yg@x`ey7QZLX~S&`^Q$`LZg&8>8=QL3A)b8%AmJ z2r(0j0%4Q{ZL%?{yFRyFM1o!^4Fo1A=s){CI~q_i$p_i}9rt^xT*m*xm;e37h=P#e z6i8CFhKq}T0jZH{uE5zX6`$R_E>MpAK8&XWycCAxXnRg?S28Ffb0puO`nVFpR;_g} zD)uY7`tZ^LeoGi#Ft=_mLh~3Pc3%!bB|x6Ox~_?Tj)6?pi1X#ET(uZL(V=P-3% zp)u@hR^+p63ld&l9PD7g`k>Z7Cs8>^RD%aBw#0}zqh#(iJ$&0b2zEzzq>fV}$m|*c z&qKSavYw}|EbnD&jA#)Qb)*43#Nv`4@~&+}*LPs-hfd?b^qw^UPQB6(s# z)53Eb0+J5^iujR({Y?*HDUjp?IR`PH(V>ev|K0>NcjWzFe7$)*Ra^K!ekyS#xlxKj z$&k5pkXh4}45yOJBva*M zGxoOkUTZz;dEU?a{a)JtZkTr+o$itv`27^1|1tac`lO-HW+5a*+kv)2Wg16&-x(`{ zF@P>gpBxq{SFdH<&KmDh7Ads)guyUGi+VnnSziznZg7TeOD-1s&j8l$7Bm#lTe&}U zc@RV$hZKW{+(2EuGWS`tYJKupxfvaXe8T41=HQW8NIX{N`c%whJg6U{s6+_pXZDhU zmN3?Ka4m^=<;s;Nkg(2031JAAP%*S-C@|5pZR;fIZPL!X*ni15Nqa1JC;P;3Si9gK z;z5|FBVipVehSMqju9&IfBc*Drdcxz#21m23p z|MTMLNoevef*7zovp=bJYcZm_5!jZk1wiZx4Kd`BsHjM2CJ@DprJ8hI51iWB;D)1c zNG=E>=zqdR3~l9jd3eHCTwKQ+5B39NI23kykl(ku0dq&Gg+Fk1`+I)oaO9-JhCY)= zBZtVW5U?dy3@C$2uda}0_PkKZ#ighM%w(6827S zKd4Vj&aRn&2abeTEKpEdx1+_ZcpwCY0i)wPFRaP6XR*+En>jMswAHPLx4-akm*{%< z1&6x-Ua|A(UaEuaVNIkBK&ccn*NG=jpDKgz!_fC0NEO2?R!j7jzO)AiM=oH6Ww@>m zS2(_YvC!+cf~G;j)+5}&M+GZ6QxlWd6*!R6Iy691Xj^nw_nF>y*Y2i|0uHRb(AJPE zaZTDk$K37#7h$f;*Wj0zo!mjBYyv%Rp57p-+06XrN4OEMrI!^;ZPF=G-r#z*SiIckvN~ca=y}c+ zA{UxyBk204pLzLXjR?V7yVy2XKYuT#@7vq>qLxz}*@rZTZaD3%hxnE7Gg_6uSm8p>hZd!q7o{kTLgoo z(f`i)sk?UN$S#ab2K2+{y&NsV9^#ds7Dn*-9KAq7rK<1LV;tBfy*qUHFfixk_&k4n zvuE`o5q7!Hmri}0dM;enh;~LxK4@XtdYHcPD!d!t@*VmKR}4yR{`;5evr9VM1w(qe z`G*d$-5TwM&PbY5rc-?^b3nDLK-RE!9D^GBZn=o(_X)zjg#>?e(B6S{Y>R zGd)n4;RPDIJgZ*eb1F*;(;2WEI<$)QHp1@mEruIII>ZJr#Yn|@L-D!x`;uEt8NZrs z%w3I3(Ra#yGS_bm5!S|FdV1Oc7PI8r;AB@q4>2>}mVEh&XaVuu2u&MaCAXgo>(Ud=QgFCt zPyzNEiTLcWKoYptOllmq+Q>6)`35mJVIR#+$ML8p`Ie+r&8t9sBCds>Jt#WXY2THj z?ihX&uJrZe@ah`>LQBirez*%p4uQ$ zJjzBXTZ6xyrPBm1UO-^G{OHjmJ+-%EPEjQ#=h5Y77%*zxE^iWx zEVjv227nobCgmzteoV?Kb-HdIxeckx>A8c^Kr0sfxANhkNvl6nOj4db{3!QFQK32+zQu-pxy;hKR0M6E5R;;FC<@d(LESEt__DqGT1I-xEjn02LHIb2 zYd;o7>>Q-S@cEtpjw7AE)7Op*l$qc31oHIp0vSw#Fv?bxpasLNn?6r?qmloY`)K_I z=#&aD7twrm7ddxM9gN2$X)wO=qY(dX)7O&*itR)|c^CAA?nv`YPsRkWvCQ1OyegJw zdvOp8wN2$tV-#8~r5})M#od1_IR|TM-JEdheKF7FQ#ON*qQHsdEK*1psSDX{(P8ey z>nrAsKXlb>%*)c~b+IH?1XbK8o?waX4!(l&c!C5%Ej&@^8D9N7zF?Rcv0-T`tuIlO zFXJ*{(RH5lUk&&*459cj4gxVxlbeBoL742w$~3WoEuR__pEs8K$wfz4polHQA?n}B zm*aK1)GeuTLNkR3Rlr~mSoH$Rkt0X=LhRU4+pE`#vR(Wlnx7pzl?7G z#vh>9smS^ysEASs)gHOmdn5}|3qVKAcjL05B>X4N`=>=yV`CtL+!_G_tS|0$<&5tO z_iwuHcD6ka@dv)&Sgbo`JR#EiV<#>UwjbdjSn;fx&>oQcez__)H`iM0)~!$_Y?XDt zC|WiKa~>V>I4ot*O zty`npGmSx~x{xwl;V@?H9Pm2jHZ00F=3w5$8tP3rDa{#=KZ&MRia*dgvr~n2kRIV+ zd%-^BQJ!jxO-8MU)@a^deb-o)6xDgCV|l-Smno$oRg2FlM?95V1N!&XEQhH7I!;77 zDFqKo$=!JL*g7MLVtqJ#%!?HqR*+8z52gnwaNu*73fskHxve$hekg0OcEft$*2D!A zT;%gd`QEJVPwEyIGhZ%#DvnMrNt$`_W$b4`uzAk06EyEWm8YTb z@xj}>ckllF-X!5&$phkTFBcaVO(4)93ol?;BE)lx^M5Kk`%|=QX+Sh`pOLp3e_rRA z9y=e^89Ux7fD3uu*x?~?Y)~1O1EfzzHnvu%?l$&M!Df^;Nqo#8cN*qaXhwEf^M;|L zq?pyGk5sRliLBQjQ`4u& zHobQd?H#_FRPm1L8e(&}`wyRo}EEaUfJU>+S5$ z!X;_c;K4tz5u%VPeJTX>unAWwkAfNAO$1N&x_rWP+*y*=Kj-cZNe2)##&MdlJP}O2sNy-%5O8Hd7D`we!dg&&VSrU~47GLZ!WIS(lfOo;o z$!yuLSYaN~TU$#VN2jmZqS6NAovBuXUjzdmsp-Mee0@V2jKOHwwrwbGa?XjBo%#4_ zjzQ^Q0&1yXs$t!zxaNcUaeMab4Y&SD9_`vdiNwf^vk4> z8s4Y1C++PA@9iQpECDI$shrlR!yvJGns0geYukpEO%t>BIH4+GNy+~4_gw@% z)o@y0KY^TFEgm^}oOgfR3^v>IA`{A&Ef}Yz`VMR-P1XLt1y9~J( zD7*)k6?LUiaW!6zlEq>M*}S4;-1GDe_hRU0nkM4qwS`8qWk^_IV4KKQZ97>EWdpuYHx9ZK@MR1`LXAk-{tUd2AI0kbZs4WdQQLOd-c|cCP za;Ws~$`7*@Kj6bCTq?9TEF1hWz{v+(otNbknb{7%B!^^f3Zr|IXGz2)r4YRXu22{T z2XjJ=9t>q-DF6f9XU}$`Z6XW$)s4;}KHL&vG)`_*Z(7B+(bM-G;2Ku{7DC1GMv@n+q`)r<3t>4c$ zAf85PkI?N&^fh?+Rmdxq9<(!K(#P+ILZ5v8J}W!W znK*`g$_gylo4P2U7&ql56`7eSxIP|&Gl6;T0Pa3Lkp7aA!tIoU9yB=c@2A`US0JD3 z%Rqyr{9lDeLg?qd5^Tl=)%m^p*U$pW>AMFalvn?ITTt*mx9DAvXo=Nv<-_PMtU9fDaI3oQ zy|r#`L7en)zX|+yZo8`W6d-s{gWmywlu>uOztlZPXiWFBA64t6&v{%U=i?ctHIBGE=K!1Hz#MJbst#%w*EqU6gV(FLt>SbsdDXnvwlc_Qp3h8r%@Y%ct2_o zjfBD;dO0?zcOV=K?AL|1OxhgQ?Bmg;ZP*}`;^iKgz*0u@(Xvh>3$^l<8<<~eC!$C1 z`1>&qnusVb`LPW#puf_yczJ&4^NW0x5{Qb%SRKPCJmBMZdF_P@yD>|dwFncw@|-z1 zCPpt@%L|O)CM$imw+^Qe6K**<6+qhVt1j+SYa|)2eceb)>wW^TLD(qmZVaoXo$Els z{O0ON1aznjJ$`)SL(RK{gcB@h?_PdFRSnxm2xv4=&XJqkG^D*ba8(`WLUhH}H0GQCJXENQ#&ai}Z2Xj;2mR@o# z3Hxr%0v~&O!i`OH$PIJ97$_tTtS;X>To@Uxb@$1j59wR}2)Clj6ocF8%o^=B^!N97 zfbItJOt#u!g9e=_?7Hg{5r$l1VjAyjYgJ!n0Z9FnRmV4=-1vuSuo%7lF-e3v}BC(&ZP{xfW2`Zinta{bj24t`ddboY4i!Jp@4x!C2ke>6YGaJqfL5UVz=Pv%6$YSLa^dD))*flAk~2dcDbXpGG$4Ywdmn;`yAX z!H_lJ%WW}vHMg{!TL4X)1M884_KD1wY;EV2JWGicYKC6lpA6owrB5l18$RI$qb_RR zc07b(rr$h1%dz7sP6p}<=br~K&gVQ^4>q-lWS_~raW8QH%-<&=c{cz4KI^ahyM4F6 z9LErP3+~^bO*NpXpOCpWxPS}OVYDyAA+zG;YezUZL?R5m-Ji&)#wFt3t|S+Rv?1O1 zXz{Q|1|N*8t|_R~y51@Vgn0KtUwqub4R9dZ`;e?%U!o-^EPRrbsFn4(bIf8W(X8;; z!vQ(34w{oc6aG#5fgu^ftNKPi!o_5%o|;5h zM@7(nr58)T=UaRqVC5dmsZbWCywBxU4u8!mAHt(5D)wR?T&|U_UJZmMWUqz6ZJQ)O z#id{7`^9F~--HshwVb+vKi{thJ9^&N?^k!Hh6u#*g%b}SI=4(wQk~Q(Qi!b5Yb^jsBh{ZT+0FFq~6fz>Iw|0WV&bqiX%EZ)$G z*f(+(%-U(eX*%+p`R#jEu3tM&M#}qC{rlvJ63{GWZ>eG8!YU;65yHmm-T&VKc0S5> zw|45YgB+AFnVC(|T`@}i{rwJ5jNN|S_G(ZO8nQfR*Z#C)r_uuJebF{z}{)vnRo>pf#sRHI~9mvAS$4OFASUswjNBZNd)6jJ%qBs zbPW03nx#E$F_#`y@-^`}7eIkkKW7BifnLz;{d6)V@e>ni2nn!8)J-E8@SiBTJp_sA zW`P`R4IU3R_?i8&)DF!w_OCePg^}!3b@*E#Xq63mI(d8s=nOUd7&vSVFkUScD^Dl1 z%q~1JdQ)YyA(~iFZ52Ms;3Rf9#d` zMfjwesFBLT!ost@rlF~CS`Xeyx(F)U{IwcECf_eNr^nP6TxnCC7iJkyyZFez7==M! zO`7=0_IMHSqzoRPnu<#d*4`4qLqkQw~&fVF-{qIIc~UtYbuS){|t* zR{#}jCWItIY=>0M3}u5a#EU;i2df+T-%|{U*l*Q-6XlN>I|jMKhYnqZm8vGC4@z78 zd@A1%9#)Q?{3oDR`Hvex#h77sudWYY01-@cVQt-&tU9k#WNiWWBs79f6n*jnZ1#yx z(4PUo{SVoKM0l77cBN?MrN>Ny77&2KL#RWI07&Du^vA(rnzxKBF8k56NbX_Ox`?hL z(a|>Ws>R&fjYAgW)+1H=&;m2^n}W~1ZN=aUt|nrtOTv}QH_`0z%eXv-s)m1zir6O6 z)tJJ+uczCLT2pk)U?VvW6@;3s^0f8cyLUgjsjAE~U}?*1M+1|RxI6}S4}QJp5x2i& zq54az)A{J14QE9Y73sodWiGaR{y(TjYU3yVUEtjj3c6y$s$cWc+NBQ3$0Z#;P*G?= zkfezky{Gbj@uI*n9CLyg@y&jpOrgc_RX^wF=F{l8e4q9YvnK-sDn*-3br$26*ED2W zD}D9OojTUn=;s&_wetrsae>ga0v78ib|Y_ePIf1)P(ZzDw?d2OF;=oGv)w9X1sx-ZFjS@b_-Y!A>ZBy781Q@T>l$AP0>lcF<_9T+=U~p@TQ*ELp6zMg z_*D<@Cq^ePJaiZ(6=fohBl;C0gb-^xC1@51eUAEqwZ0QEiI$}4PM$^uihQ>$(2Pma zAB#CU6_kgr!svl~f?y@&dSl4~SYL|GlxdV(+CKzDtX5BmMcmLR{I)H2n1jRcv-Td} z<5F<~(8lH$^hZqXjva*}X6-V0dcZ12jJ5$bK7H68PXF>z?flHff1y*WZ7KX3z~7 zukyTYt2R7j;pNSHF&fQ{d`L+dkg8(z+IQeUIB1CTwj;vBqmE$QIQ!45&ZEylXn2GJ%jJ|w zV$dnYZ$bw#-JB!Dzzfvi#5|f6$)`);hx#mUn@TRTwLVkql)IoRiUew=? zQ5eJuT59Mjl5!0mc7oE4#g9KAx1O{rsVKL~JCFA*} zp_2*6q%>vc?7>8Ymp89=3%yFFEc&Y3OKEv%&&tl(jfnur0(6JzMDj_0MA3xzow5Qs zdb!OS-UD~J8AJfTqzC>oEV1WdnY!1m0sb&$wa&ZOGwaQgRuN{eF*jQc+stJP8y z#~~wuLJtefj*5%mm5|vt$=~k=^NA8LQ(4gezmE$&4rFyhBdx2~6JkESi)?5{L@vyE zNy<<2gxU(@)Moo`abC2UEueh1j=;w_0HYJUz|4R*b{=+U3F2-A{g9UoCr2p1fORX< zV9^4EvEW|kmn0$-h&agT%psVq`A>YlDo%N-;nd;ip~K9~*REf`4t2io5yW7EhBTDy zfBntU7iKbso}#0p$BN9y%d04EJ9xS^D(J*fg`ucHXFKBMyPTJ_U!Y$hwY1Iy##Xj( z+YnL2yr-@yDfy#{X_Zc-B3C$nFUdT-^e;Jjo}GtV^CqLT%QSw^?%iA>BJCA=ZKuy` zK^iCwRY{nxZD}&)lG`PXtC#aAz8U1llo{MC2cFZz6+Eg@CW@sPLSvgiFuiA2Y-=SN*)=jJcCJ7{vdot81U~TVVYb*nawtoAO<^4tW7B6LY87R9A1p z6A}jW4r}`4rr`K^5%8W41O6HuIFjyAhHS>?wfB%Ov^1?!E;VTVL?Xg$Ie|J+&R`OB*KZ$Lk1MN> z8VEtZhFSO<+7!?)K}SK*%IwN*UCe5T@$1}~ZX4LO?o91-v^;>C)8GzZZ)-PphSN75^!3^Lx<5*xBLO@*6NBsy^~1g)+GuSQpJ%3o_BAW=^xFWr zyx9!QS}7=%$M5LaJ~67fuuBxwtACzv6msVLJs4N9(%GS^H0-|oxj@RQPUSV3-%C2I zI!_(6KzWmj;Lqs?P0Y=eZEfq!&LPaZ-0Bm?D|eC@_-F2{d6Ho;Rly4I0jeNP%*<{} z&jFe;7bAw@2m&xwmqCg{o|*}Wa`12afLwA)N;Ah6nP!Ro*f9YxB?$ud1m(0Oh+&Xh z+Io}{w`piXiud|jRa-mSIv`9AYjwPyld|@G+SZqWXZ4yu1S63X@!mhv_OoIesiFZ?I$N?2{3X*ZSjXeY#Kvd8JkP5BoM0@}; zv5$cD-h%c#wBBEv3NOn3o){GoHZ^!4ZYlv5nH_U>w2{c zN;YLj^L5S3`dsS0`LhWu`&AfR&z?OiYTb7Rrf~$Hddh1a_krl(Bjpq4X4kXMEvhRHs5D-BpTtXPi-$i;1v(DvZ7(wB8Op?eK8eM}@n-3Cl zmj`SZ`TW5vWPhHWwYUj`SoyvFn5g}i%apT+0z06*KwRv7e}aH|F$G>Ahi$P`DQW+#2roiUsSxYK>gXQi17j8t8YG)xy$XH zDR!qUh@U7Lo(FQ`1O!5foNwQ(*TD@(^@JrHVX*kUfddxQb+aceCS&gePf~_r*Glkz zN{>+ob=i-GfMoW0yxjON5BW|gP&-j1njo|w*oeiWLLL}KDMdtRYqt0S&+;?2d=IAZ zBh(ggb5U18{KWh>y5$;1mx6=j-RtBGxu?ez5D^;sTDV)<>Fb@~m$L$La>H%fyU8^s zW0x4mWNuOrWQ9Ek+0*9!3BN-P_Iy+rVfZ5!^oLQHr1m~L%;)r zE(!((;kA%}WX!@soZdWuNe_m~4h$`%={W|&elJ@A7;)L}ADBc<8vmxHJ&B|9jaoPT zb(T*k>wM;==coMx{O=q@5ym$lS7;6EFn+bXYM*bsR@K~V;+fww%I;ldaXF-WkP%WiPahJ5Kvdd9~R7`_%DpC&`n&dAPgy9!YkHqqaSq{ut5wIug=WVl0|jpbqM zjlo5^4Wi?RkSqN-9EXJUZ``$(v+6T`XV@<>592KmtXn(4i2!rC^g9`_CrIJpR zBiL|knXccSG8uc!WZ|&$aP>tbb?~DC=y^PeXliQOFQ$w!NC%1TVd4LsFSA0~9;M|4 zSWJ)FTS@R7)(4yq0qY_K7KVN%6Nfd9GDCj@6#j0RDrnaDQnP!p!g(iP%VdZSHsi;y z1CN-SoBN92ewMosfZX1g>c%d~(tl$VxbU!uEf`&dsS3aE_2q*<4|y55z%9UPKn!to z?nu>o^^f}!&NH`&*aZrkvj|hs0m5=9J1*}a&SWKMTQj%ufbUEwBBj74GT&_+*2crb zQ~#p(!}yj$NUk)+`X!M@grpf+`lM?rJM!kOFR8gIRo-7zraz}iw$RF5`u`Mo_tjf@ zdq6qj4t`n_zv2Qp_<~9$yvF|T;(>6SC-IXjY z(*dDR7bGVQ6j+=BUUDcRs%xqOsjL}*1tB071jC{(f7k8n^UF3FaJ12(v1BEa)IW6u zhXIQhTpHrO@JBk-+JuUOV31ltI+@>^Om%%Yrbjqxu(M_7r7CnJ$}^flufYjt+JspT zS7?i#J2&y-T-zD{iXPylnM^c?IRO5wY;A3wHD$j>Hd-16(g)ri_#~NURGo|LMuZV< znN|kCLzP$TvN{=ygFf4v!cXI&iOC}o{waIW#9NR+{E;%=n6k;DR@=Z8+b54PY;~Nx ze;(n(90;Y>eB$TlA-A>+4!$iw=>1qD&dK?H90-@;D5Nh>6IB%^^IC*6R=f(#rIMTK z1&HhE=p?r4OD#V>>Dr<{ zi?EKtb`h5BZx9?Yj43)IQZKX35DEKjaF8Qd*F=> z9`gFR;Il0NMeZV4p!QJdrYG)7jpEsp14iM|=^2MjI}<{vXPtm1 z$@G!Gy?Mn%b*vfaGphOJ@PLt;rq7Rvi03@qL(_bTLG~6tZ}*n%eAMGFr+YVU7ruNM z%1*2Ldu}Rhz7v~LSG8PCN=dnT30`Ev!5vfO=RPDq~iWo*n8&PG$K zU7;1UkB4 zSaUU`yJB|ZAdeK4N_+BqCntX)5fS~kHA*Z5Hj~d>-##6|Y>Rn@If}S~ye+hm{C7Yo zWn(6>6mc79S9z5}Z0(1NykhWMPg@PN;p4wXGE(M+Jen6^um@a#xt~%P1M6QkD*f&y zch5+jP#DjwviTD#BWU95U$F^5Un&Hu^YSW2--w@WS3=5n#YQXZh1~!1_x9A_!R>Bf zdFBVusTz^;w4|gjJBOOYq&lCvvQzyx7X3Sh&ZnC07ly4INe)6+ypOQ5&R}hR>qlH# zSrzs;K%?pQf{HV%Top&nPK}@lH3InmeZhVM;ML`UEJoz}X4GQ}fHoEWGFds}9`5i? z-Aq@5mvo%$ThYK&^jSmU-uCAAULpkDmR$7{4%|YA$xF7d0W)dB74G!(iiHSL` z-lAkBaif-&tl#8GH1)9rqyfYj4)qrQvsW|hjpskrN40iDQ+3|Y>3K-X4Wr*3Gy;tW z6df(rVDPb%W+Qi$)O=*dR~zR9nGgCGk-APr_`%~U`?>z==aQ@8g6Ka%#qL`cS@|=8 zn4ABLxU(^nsKEa+wQxD+qITItDv=D76|*!-7PTL4WjO~io~ba9>|cI6t~O;lvtM!fg<&kKNt83tW_rwTnyhJl~EB-9>HzXoJH`g;##9)vn7vQ~yZGNQhQL9CMDF0Hazo9JR zJC`URH+K#l36H#?yk9#0sc$imb0Z+wX8VwDgl@ioD)^>p9%W`cblTXncyXtvilJwk zGseW^^=HId$-ex?BJ%RoMXe~x_t^)3@w};{-nb|0NDjU7&R;XkFAtFWnOfvy>2SrO z?KEcCd}>s%-{TC?;{48P@|}Ze$Z4_Qj0b#{R5@94&!HDI_!j-x_rFWowR>cXt|X-& z;Z(l8lYbCE0yGL>U0eOaV=B7eee}|P2PGGL|BxL7iNs3Vu&cXoP>d$oLHY9mp+v5C z&RFGx=s8J@@Q0l(9b8?i#d!iKfg4jK4(Sz;nN2`E=Kxz7%=s*bGKk?d04Uyn3zV>R z@Xm?Yd1A~Uw4MwW0OS`OLGTlUTbO5U{uWM%mhcNP+ZLZ+yg z;76ILxxvRQ%au~uul()RMNo$oE(7frpt}mmZ;&6e#03W4G5DQ%wxDzudY-{R@a+?` z0x6M;W)#$q%`k$(wPPK0^2;mmj>^(W@GzH z+9f;JK)d#iLbk%J0E1e>HU?zPc^5;~sI0`Rv}ti>WfL@2V7LdTDs(^<@fj zkAd^2ut96Oc9q<^Mb>E!QE-A=v<3gFFAYJO@ui`7%%5M|8;{JAk*6vQ?=4AHsEb>% zKX;QJz#n0|v{Re)x!Sk_ZkiI}S*Y_AuYPzc(9j7~sW;S=Ge=&7D zDBd!%R!sZ@0-!l@uf)IJT-Z?!`+E$16(8e(UI5My54xru938pO1jJo}mVT8>mzBJdEL9?;*miNnK96a4F^O4YFJ2bsS?o{y$dMKmCs=i1I+ zLZzaJ&-!!VPMm)!51plrl^mb2M~`;1zz_gVap!H1G!cXa`|+c_f%hng^L6DS4b$^* zTH!ckjltlA(X1*l#D%Ed&`^lBr(s|Zg}OP4fYb})kLZMRVW6#-{h#aL_LTj;MF-{) z4)(f5z;B!3OcG&O&6R=%6(#T8T9=%l9%}&&j77>`5*vJ3mZAR{K5E^Nl7F8*ZP~*h za{@^l({`DPRX+!ECs9pW6&fS9Q{OOs|NR~=*Za!UM)aaVy|iTZ-?OCT`RB5n0U$d~ z4+%?2=>Sb_5b!DS-_2@*z#|+itVKAxyb1Ldfa77-r)?g~jfgAp00j#m){#Y2Z?f_c zXzeE)kmK3uauZZ{&;8__Yf^ix0-fnF66p?$j9acnv$_E!?WS-cIx!tO)d{ae9rSov zt6lc{Q}8ehed=Tgb*#AEu;5gT<10Ak-6s&-m|5h#y`EUW%1wsqHqT?ll5(k;VE-v_ z@H*@#W^srUsF*Ez6hIdn6NN*J51=$d>F%jQO5+FBn9%HA28Bzi*x?JD7l*-`DFmy{mBH)Gv@ zMnT@u1SO~Hm+vrR41n8c;Rgrwv@qdhPNH-dOi?5Ohcx}#@dnnKf)LY7pD&3`LldX2 zVkxhm8<91nO))Ts;X^Uj6e@SKKB)0N3W$o{gyX$<(7DL5`Bc~G1Ts{xzuAol-`q<@ z)flE}z=uw$ZJJAJsw?!nVr`uX3VYRy7cYK`Ve{2-(3rKj-m5kJDTTHL$u%$?_aEcJ z0smvN?$R^`&RK*=)!Id*@^k&jiXP7JTnbam&bYAE@M;1uz>nq*9Nh~N;gdDIgiF7l zn;b<7sU1B-TaRe8sJ;Q~Zx-ymz!v}|fKybmi{1V3m*+JGQs}*N zeE~{4FHZI&g-{2xKUltjsC}hx3hxC@gC%;n{Pub~V$Gq_jc@PXy=GD9MBX^Elyjmx z11atDSoHtC0TF;})0LSXMpjmSq}+x9RyHt*L*P1S00ohq1v*Ka=PQEOktSOO=Z2A) z8jJt)62Z`bDki2lhw$RE1GNzFw+KX|M#y<=JgUp*iaw7&6UffZr~px>EdKh|ENACh zp|MoH3ME+CI&z*>7y33-t_h<)ou`PlfUb&So6q3{rVa%a!wTKS=W65n`5!<#xc->& zPc5{N;S9XEJ}8^ICeB-(FOBu}yAWON4Yp@Qa*JPa#D5(gv&%c>)zjUx4(F^^?rBDf z7pq4x?DL)4%o}n}{EY`=Sgj##TwODXb4>gWz-w?{ivMp!iOk__X}1J~+h|RV!ua%K z@<59zgAt|=+KH8Mf%mULW?iIcaIIo;R#POKgaTb z-CVzg+rkgk2~cUQ{`uoz#7Q~@?sel^uHnl5Z|^#m2PQDJ&Ru-ePwDt#Rszaz5ELtZ zjHu>W0Lz+OF7ovxWc+TwpAM7?UIahchKZgWaVh$R&LaN}ql*jyp_G~t17?MDgq=9-aBpT>S5!D!4<9DWak0kXWjJ!~gAjGQk()J{?}e$b8XJ8r|G?3JlOH zx{=jgVfia*`t708p(H!}Bs(9aL5>MSKkg`c9J%=A1!!WBRq3i>%=qt5M*{aZLQCj* zHEgkfpv%ypuuSNr3+1+c;C)LnP5C&?55ZW9z8W0nSUR{ro!Y^b6ZmVs)BzpN6yVD| zz=Od5J@mte%cXD}U^2kGyqlkq-Y}S3*#wX$B>x40ejscLh-ig~_t4}p5UJjE{xHmz zCOTql^k--AhGsChw)0X7wPS^1@jz$i2BBa9l8FKYECiM!!LXY&jRnXHL#-@7JyH$& zc2UPk6=={05pnYRZBny>w4jomCgP(P8r$1*B1U#~ht}TU4;j`KUcUm{6%EyY7PdzY z&h)%9p}c0mVsm-V|1UsX0{d9@z(U8J9w15^TS{vKWHSz@jXy=<2GOq6_w2iOdU)F? zT5!bUqs3aQxl0&0Y5w{Ca@tD(j5!BKMOp5?`oB5T7E#^P8B(mN{2XpKA@xAgyQubP z2|E|{>4)mY;J7ODYh4OIIyc6N%s_LmQX&t1I2@Y+dN7k=AX?91+gQz19n&8@#@(VO z9>1yZ*ur*o-l0h(vu{wX(rxLE#i7Zt!$&C>dcPM~&|%<^vmVwhxHpQ;29D?96iJPx zsdkA4B_%Q3uotu#%8!GhVMLUqoX5k-BSX{CqVf>yDJka5n>S&&cmZjXk_oU z;~62`mbgtNk$hXVcKnsS4dTSH^BwVxI;F55v-R8&oZE=+uW+A;r~3bHaiYTrB*w3WG^zO~-Nqg~KnS~?{5 zR=TOAidOJCfzDP2052pJMj$xmu)FDP8-bh<>X-ca4zk+B7!|N!lUeCjN5*J~=d=8+ zpE%jI8*keme#qUs?D?ciD<@Lu)pJsEB{zCFO$4}*wG}yr3to=4$n!}}M<*)ndy>0j zL7INNoRc;~yL5P@h-+2p<~BJi?Ay8a^xGmXO%4-aL9T2`V>I34=C`U%kF1Q^cj`xI~ zOpBkDgFXE<=b3ILkY$TN`jB-d04@1*W-78<{0id`KASh_d81y1OQc$5$~alrF;nVr z!YmMdmHuF?2;lk{ErEk%A{kgcsKd^5U5X`xhjLeLgz0Ep>yz#>UbsBiO`*DG4mucCddpJHjXDJv`HHwUsgd zePXd)+V5IR%E35(R?2`DL7&`B0Z0zs+mno-s3BqJhv__#&Vq$ANWIweaGtt+h+MhG8iB%vbs}ra~L_WQ6-rn zkAyhBmKfJ6!zG!zf1c)3GER)#bNJyu2=W|?RtAK!!(#AK1b0)1?e`s^!50Ut&XUfN zl&p}j&+4&$0kgzw-ahQVZ(S7tSMxaD<_IjV{tUSVQut34orE?dA&*jwugN^Z`5yZQ z!c0&7arb@THG!Nmqr?sv?+_g}z*3!H2JTo64ac5ypDJ#&7(5lR8gxN_Oly+zV$}fC z8mS@NSZG(0WF<@57B-r@5azxq0)J$uQeb1Ebe!j(1~Nwq~cgf`juG zs;z3j5TuZTxXf)DM@;m{Bh4O zH7_|gf>)bV?g-TjR&byv@HIAx1kW1ioM_yZJig z)RoeH-eE@vE{T=C?cFLrx2yuwPV;`A4Htx|=$E(jY`n~8L$IZo-ElbR(eCk=(tb_r zkN=WE-_uwA)756#aL%;PMOTNvW0_>SPTVw7D>^h0x2AWiZhJ-J=5M%FHzS#2P)>Q22(+b07jwLbDCm!xll;zYy z?C^7aJPk#*;oVu$t-s!7>2htmMJcu%WB4sg)zpzH1ilOJ6QjFz&rIKfOfWqt=h|U5b2)$hwC^F0%|*@Eb8#EjPQK*i#){s&$a#vpAgD?)a{K8& z|HK|;X5lvK?Bq!`*{w!vlYC>TkNTLN6p&&S4kHV436ZuCl#0HjgJWcng!G)+js+Bk zUJ1;S#_=2x6=MzD^0KOnL?SnCq;P!$ zM%Mm5=lgv8*Di9hDkFME3yO>&5O?~mUd_fGBWLT2vk;V^GQ%XQ0!<#a(Gjc7AoV%%pvutuePyk7yG+?po zCigG$NxsH5(Oq0bb=~=#g)k3Wfn(vGoE;{cBRBN8hA&5##iq78CH@oQZQE5;NkzTa zz3iR=nnG$iw;$@QY{&rUc!k7=y$aS&pfvwNI2Qk*m*=P`?Lry?*QAHSgupTdvki>!)6-sTGD5*nHNMR z6LNEzE+oA^N^8ZqRNdZr7QRZ_<=5@3CeMP%JZBl%iQU*Y8Nv^XYxl?w^zd%Zt%MO` zNK7XO4QnlCaIYlTM9}j@rh;fjMi1;H>R#^wY!LyiMG`#O-d^ zX+bT@-rv}frNp`q=(kQSQv0PvaWoV zG#A76?2-QXnKIsg8_9Rp#~%_+uWRl`jUt6h31V?ra*{+7G*{0RiqB;92eLI=@=6}( zwLE2!pS^9jAV+wco-ghjui|m4ayMVXvcVO;GP+NNcP{vBHD3I7sjj8fT7xb6GvulptXrjpC8#|6VI zQ=N*w={&7bnmBmG^f7Tp#w*hsd!y?_)A7@h&EEg?-THB~HkrA}L=*@S{{et|)z((H zmX}kPaD;Fq<3QuN_)Q)b$tOL+y``#w6&|Y!)2v6{v*9kozj1|adAnt|i*+HVG(=A7 z1$X87raimg**|sHvuDZ^FF9OV1n69@Ua(&o!;5@9&L{F>fp;!(PiegWfACM|zr|+m z%Fs}TpnPS*EoOcT9QSi0yNOzo)|<=1FT!x+dE#@@LQL{nBIU2*(p)0%_=vcBIEj>w zKBC$(ro3i%@S_yQC7aJrR7@`fUs<{Ngk5=mMCxASwadc1(m7XC+CTGfY^*&kjW-m_ zW;>KqqwXdUpQ0y=#)C8OoN=EX-_Jg+e^p-|h#JiFt9#?&|FYcQvaViy{3ck^^Bhsz zx-e{b`vJLIe9&;~7wNkDT-?%88CVks50+lNqON2gbm+*Tt2Yed4oyscO-?#tc7;tCZ-Tljp1Kier`s3q$`s;8qUS4&zpLGXiW$VW0x6Cm;yH!Ca zU;JQwal%<=3z$4M?|!9o8&5Em{u}y2#(l9mdc2%oF+;z8e3Hjizv}`!d%x;Nh5J_~ z^bnE)RI2w{Om2zwoF9L~!xQpaW&X?Lt9>cqY@7%Cnc4|WX<^}UVYuKQEd}j9As=Oy z3NkdN**Q43J$2=${1@@hozqurZh z4v!!4P^k!2==i6mo%Q0x7mnR8Q;Dj)AwDmwKPOscFu&MXI5hF<;MB9H(u$FclxIs! z1i-e?yf_B?C`Dg-yqm+*sWGNzd_qWnR>tYTt`LpB4+;LM{bcKy7`595K{8_IA$mWT zyI3FN>B_IP;E2Lup2BmDB+5)lW$_e!!=OH&77}c~mJl;oc z4B_zNw%L=84F)0tTL5pwtd=It4;q|wOD|LmDSukx>24vyvuwJ!xOxP~VOZHdK03-+ zgS0^7;O7?tko@%1V4 zZ){_WMI~yCh)H2M*0-c{C+J=e*gX=SP%UBT7?JolaP>)Sy1Z) zRLCLdq(uIOLe1gNVs3tjGMhFl18X2+|=T2~pSO_#)G@f9WggDeBL_H<C&vO{1J2eZ?!j8yw$)Z0{dbefHbUIUZzuXQ&Z@oW0jxYsT~Z=B-%!_txW~7&cKf&oa0> zIDV%f6xLLBK|yWAD^ocep|EuV92IbjM?w2{ahZx#HjNoSS`)Vc*zMP9PGM;w4D{Tb zhC@(W$Mm=a?iPnI)4R=*xh-bI&Vu7~@LNX#40=U+2}g6>KH<<4AMmJCT@BNj{P$&P zw(NUV!2g zjd#m@_QHj3>6-lf*o5y0M9R~p8O@gZALcg-zr3vcHmq4tE~aSx3yUOwcy+Z$z@ez9 zD4*+VXyr*kyNe&Uh)|5|X6h5XDPoQUXz?0O@dKzV0N<|>%r*H_ z5;nx?LTn?&LfSxs^~8566QL!5!=iMlorc~Y>3d48-pJ-C_(*xKP0dN5bGoY) zmUEwYZfUt%g8eD0-o3M%V}bgmz*hD=Vup6Gz3|=g4fCrXaN>W8Httb|It4w|(L*7tixms6PF~FsR>SO0CCk6juGQg^VkZkwIVLgJS4F zN9Gdar=lxVRN7Y5=~bA|t#97E;SfWk=LSR4T&U2xNn0=f*>@As3M^#gEh}{gOpyzP zfb+}E;|KkIU4Y1qx`G2V%C_-%Zluu5Ogew~zb>XnYP$NIZi`kC9tTnTj!RLq)a9LP z3ehFUhf4!nW89qjPY;R029GbvKL36GvWpUqlhX_9t5h<(p*}}a+*w$X=^M~gGBEVs zHzz_RyH4X7*zK)P6}?>Sd#2M051M8bi5KSF10Cm(FoFj(=-=TsPxqvWO}6u{xOwi# zjCe3-kD7~4C~k&!inJg5EOXZW5`BrBF>TJ#SFXyA*49KMeRx98I+u}Dh8z98ycDm3 z=ua4a(ED(BOEEY~^&7!T1DrKXieHl`4unmf32!}|`H3C^I`XHJvPwIE5-0fvg^3!$G5kDOb1U9C00P`hoe%-6MR*>p{8 zXY+oti8}Il&LG70`JgEgS($A*bLO8E?xLG*f2DTSs+GTpj%cVNd7GU-xrdc&*^uFU z>et6n_VkqA5s{JI1zaQkZkqBFuxhw^Bm@e9FuVp)lDaLV1CbyULT3UBU^sQSp zXfBgW)yP)c@cb38MRz~r3K(>AcifVblO0>>UM&cx?+c-+bT6q`+MPf{wgbk^8kak> z9YS!`_3=}Q`m@s#WhB7Taf@yxp#AvTYj*KR%^c>uZM-iMoP;afCk=C0@I^mvVLARL zUR{%tnV(W({ZrFJApTS9ZaBODHtY zr`V)B`uO-D)Z851Qu#vzF#eC(Ei3J`t_OcmcXUtotljkW{7_QYqOQSDq|1!FvV;yP zx%2REoBSG9m`)J`t)A5>l%Y~75{UphW7$b!f0lgWwz`CgObtSc3#5*4auRtvoV4;3 zPFG0I$!Ji z%IixBT>B!vL0K#viXvQxLpc$=b!!pidIIuG?`^l~B`Ny_44=C1Mo*%e-b_6aypUEJ7 zag&u?x&LhC?#RD+bK~?edNwmt&RYgOYaV3)zf-l#i@Hi7C#RZ*eyDv_L&2TFyCq}T zv%0~{yfZdNOjExnO%Vd;;DtVo#?NtvUMyv=j5Y}JMQz2%!i(Wi7SK@F=a4vY(flC=>U{9M7D8LLNV^55G(WC2Zb2kX>9=now0B!vjPPMKfSO3>i)ClG3bR^+xTJ}d z>al8#u%@jgQ{n{o-N-CEv8HtDXKdG*twAT;#!8&>Jw`c_xNZK{u7bSG#7UpO>P<@L z&~P7vfrkf47b?Q~b;eV*Q}M?=TVk9-Vn#XlkuIWi=8(@0w7O(T$oVZTvW zQ{m7?MOMm4n37eGO!{j7Gc(%BZuQ79DLe70q}SYMrq$WcOu>Du<0&cUkdRq}pm7R` zLHt>~ypgVmnsJ->M;TsktcMmFo9<8~ck zy$K{A{PO*^uozD95YZaNbyIX{?AxkGZv#aVE+X-`syVh!yrbugyU@Wh4N(GwJJ~;~ z@x-D%r6il!1hqY1OLdj|ziwu0s-R;QXJVS3V=yMW>6UPj<*hH?5N@({g6!)^B~mht zrVchtBr;yhu90ltbMApowMc2VN3LRAN(lX+QbJHG%KnWOaxP(T6>CFZ{4%DO-(A)f zs&uMO|aCQg#Oa7HAJI%`UBC zHy_hXV#&KbK0Z+@^eW-J|EF!=e=na2DjOO7)njJHfenBIS-!RUUMjWv&ML&82fYNs zP;KX^#Y&RK1qB~4`|nGfN0!jme8@{2t-LU)Td|!}{Blpi;&sXmX8y2}B~{BOoXpE5 z`1#)`QZwoC47%$_vO8IbC^mQM=;ijoy6R1 zhH*O*LGE>>IAMZFrA^?q#|Jvx>|^C0b83}(h{Q7eH3dqk?UPIXN~n17A{&wEUVlU2 zfbIAz-M|5^qwOHGxq;kq>d{9y9dRbBvuJ|LH*%sw4Td6-OOcqax(8Qb*0|46sKh#8 zHd$CFa~`{uP1c48aHt6<7n`|78~!fKOG_)hol+x+N=#;R(qicEwK8(lOiH1goMF-; z35lc)ydnR4$K?5_Eb<^VoQB2M`WU%6{|xS;ElE+cg`nuh-y^2W60?%Qw0znZKAL_o z^9l~i+UN1KX4)ixbsl3n+G@35X2zatI>P%bye8EtDugDHF?QSbI-Is<$UD`=eEcdZ zR5qnWlt9dK%o*SMesIw(ZMA2hfZb%_;pLyz`4t}Sqh1EVL2V8^a`qc7Q}D=3a%a0_ zSf10++8{e|Y@C#)(;Q+Q|DCrihup6BKQh^Ox7gc-9rTMLLt_n6!Z`Ii?1r3gCRLZ0 z6Q?Usxr8^7)T+E5Eh#-bASVl-dAc_%`9?wByz!UXCi#WTTs9a##k=iZn^GRAFO-_w zt$D9N3M+8n>}K_nRyO2twigjbcQms6b9Qkoin=;fgOgSIZFo?31V!+gjf7zbo8@DS z6%Zxvg0&5q4RhnhjsB{mG^s$uPZ$NRP{iIuNGtFdVEuVL&DiBcpn^@iChDrf-Hn=x zj1)Z(sG%h<0Pw1dk8iN_a6xcTa4H6wZy~$@6j& z1W}jtmTJ+WMnko=RjE2Eq44|ZFyhFVn^!!j*~|J}+3s56%^{;O#*OgvJK7q^b6liGq1N5r zFVUFcj~ln6&{BUK;dVrIwP4?a*%CkK&ETI&2#GFBxMr2m@o9g(s5f#{1GhH<1coq~ zJpwto!2Z>UA9@Ul<@6%6*e1Nb9|$+)M#De){p`_GmR*WJx>Tbi>l;hBMxE{Vb02w3 z9EkZmj6_JDiNA~`%U$}IP(WC1FEj?Yrq_5K^j=X%YvlvnfWFW>gNQ+Sz_E_=wY zf}2&7;a+9+*p^su5YJ0a5Ce4k2rl` zVY?wBqK8Z!+XpAkEQB4p{HWGR$W&vHybQ#?pC2d#Jz*}GExFhFx=&yuWiqvq7H{O<-%Gt*Xl$Dhf!IOK=Rv%npmoIVM z)$vuh39U4j2JpZ1-4`>8Tvm03PLKW}GC>*vCVid@F&KooPh+R=)Wwg;m0>K!;GqLU z^75ZQpF^ik09E-=DhC*4olwxx`w}0GA7(8=UFEXGwjEsk}YlPy`OAkT>`g8=IKF4}&$~Itq@JAhj z^L`ejaZ$?R`_dpv{Jd$tAv_#td08A-S+=l(ydoFI@2PBh`e)m ze)#E*Yz-wB-c6ONaCIxV@c}M!+u(qLPHSlNw$@#DuJ{D^`DEb{Gm){b34_<8Ezvj% zGu z*0l)QL!{&+cmG?8*tl!k~H=)2Zo}+j=%n(ygyMxn^ z1%{lj4dRHC*V$*X^xYelI5CehZzX4<6d-(MO_5(<`yMew3M8kxOGZcr~`c^#YO*m;Sdr@KRSzMU7uPasb z(%rcA0iZKWnn@iauJGy|AkYE(j{ivvs9SDs$|mI>7d^K~rOV<7fFtc8l0 z{1mw)(RJ4gP>&-rfm=2^>x%%_$|Ds$Uq(h$t@^_ZzL&`gtjfLXc<1Rj5*WqB zYx|a&<0QYKjENtF-zg!}P}A^YjVt^MsZcC<*c8-cVKQHS?SVX08PWLlIcxIAtYW&1xA{@VN-0I_zeIv4+fd15iuf9bDM%>DVZWD4cO2*AHt-G0oova&kIPUKGC zknvAgrmZ(m6^2=rybQ9{u=>u09R0ypo>|Db$jj?wnV}TEKyBb?zK2a&-YR_cR_xLB zbPi%48w+~kK%E&uk!z|yiLIRGoTW`|mctrJsi}2V|6$w-y+S4d_792mU>bq?0B@VC z7vESO(IA6gL`FymA)O;S&1BH)z4em0MvCpjI?m;#PfKMK%Y|m`mluIWLYzcEL^J?t zXxZ~0;;K|dmfr-lC@yK1-`;uZnGEI7p9+d&?d!o!&>j#Ymol>)vZNm6l0PURFZ+CiA8~QhNF>BWSgmZ<-_)5bd(2y>a(}?&S%k8+YqNN2(=s1C6&vT)qguH6g_=bgyDjXtDve;$ zZ=olzkA=KbkbtlZPE)6>Pc<>bQM(3`>*~7t&&zlDA^-7_Mq!l(M^0j4DXw;zs6F+- z3kjaH7i6~9gd?iA0QPyQXpC(y-&gTo%Q06&uZB!8Vyjn?DE6j78EZPIAa`LA6_!;t z@~gLCY$4Lj7G%yE-mI2?>_%`psQwrX)D}^0y_8(n{5_Kj%?)cw+}PfHxxhZ>cQIvT zCyM(!NOajX{oLxymHBxE2k+!7l(Pz|$@?xYn|MwYC3T#Z!Uf8kJ!ZpOH9w@EAbtGNhHD9a^Yqx{4z`o7Jl=%FZqq7-|y3fALwy7>u^6F(lBCSz2q$QKavxfegEwCeTNu(EI%Ylye5GKZDm)j}}E+JW4&7 zZ^R9<(1AnX{_4^59Ru0(meHlIuRlIb&^#m5M=B^RC5fwl;jp(W@>V9LrOo!E<|rb0ue(@4v80>`Y-R@=Ek)4-HhH4cjrv00f6mP&2--dT(ZVpoS53?DW%LM}Z zA!DwO{XZRj-DJc|ds65?y9?Jt&b#)?+`L@y!%)HmN2f^5!dz$BYwnynf$|Ia)3h`# zzZ9frw-8M5J_y+7fVA7oWQLq!$WRKX>eeBtW%ubPyWH{Xve=2cANFM@Gj-+Oz>xs2#X3#$+ep||1`qQV|`9p!e=!f#bjR};}tti-rU%lS*aBo z)b>|YOpISN4oGcCdB_4IHTe(r2&-Yg_4b8hHA-B00kDj4e_ekqz6+qAFfg3ZiSHnT z8Nsm4A!gB^rHYWHEKA8H*-(N=1qyLQwdmRCEwBfydcoi-zWb8RR|n~&uo>KD!#7#S z>FMdKBme?yLWkLf!un!w6`Y0E{Bh2EDEoQfGz=XF;Pb60d$LxLG;Vyj>j|~qK8`$S z;Vf)yK*J^|HZ~R+03y-Zvh%YDyS$hxOxDFO>WUiu$B=OIacOBTf?C5n1o$6RH${9` zGN7Nb*{7tS#PQ5YAsS+b8iCWqCjuAsF;EH;ItesZzr&)9QZN^bRcUVeech4uh`4|x zQ7>(tEOkxQ;Fg#EM1e_T$x=qupP_dFZ?ebisui>It}!(+&L7o0ojWToUcAq1`>(gO zh{--j67}+GnizW|x>20p zld^j_Sr+PwgI)Xv($@E&xh{R$+6NB7Qpzh0Ow5m3){)b$?GnCIk#kI02uQVNK#cOe zyN~fpMQUo!z02-Q)MDYAoiEbao;Y~>K{ZR@aDH-enGNbDqn=~;1e-iXZc2MfoqSy- zzs6~J-p~B}Wl0uz8#{wzf0L8DYVf3`Z`%MZKv(0PxA=l;iS3vG-QB**eCr($xk89Uz-jK>7-Q_?9GNHRWo<-MpJeirTD~Hz_E7Pp;>LUzQ z+SRWLm|qhH^;wrun%U<1l~WkV78-K(v`v;M)}GFIo0lVM_*QV%;)cjK@!@~LZ9DKE zwI{)ZpLhj4AMBAy&<^r9)6a7!${wgb_L}_r?T>X^>(GwxZ~WFhy)iJb36gB z7j^5nNzq(4n0|;#=}C%g5D^tyLW_~Z?J%f)V&e0fBJzV4&aPRwS{H7t+lp)klLN%I za^3BbPjvOo%6DCMcVZ?hu<#yKL=79hCMUhiB5yDG(G{nxXzcJZS$O;$&r?F%8_Z*b z)x6$yD?;iiQ^*PvN<8AFHb4JU-09oPZ{z)k->0Nph~mCU-0ir=!&1VF^Vr-(&G<2A zU=5qqA7R({y7Pfk1`yb%jS!J|8}1(rfW8?30zSzsc#mu+*&G% zI9O}04Rh}=T0ITz$iUDz;Yi0@`15-2Z2c?V_kh}j?cU*`0yJViWyII9d3t#X6<$!i z2-0H(5PSdHDgJkQTCfSXAq)E^J4e(}2qF9T_Lz@}*Wj1%kK>8>63e#Zu}KCyt|O%b zn=IJa)0Qf^D239rCuSwC<<`yQSD2aED6d@kq@fJ1Aji#5$E<;j)^g($6D)#)!+C4< z$XjlEh)5g${Ah%Rdsw27r%GVf;_CIl61Iq3j+hSwG%g8&4JPUUMY+OvdN_PN1&Gl0SViasDx~j2r>>P6aacrH zM*b96@Z)T09uyBf(fOT$a=A=O(UlCNNk5%ehqAw6uWMpgYcQN7iY;8AJ%EbDog-y? zIo0q>58X0Y9Lp-SM8KDflj7_Re1q5y7)3A#ne?b}_KV-O2Q*X)kENw|=$JL*qIKwtEU8S%s-kfC zC>p3mHB%+@B%Xl|sdz8{)2C?<%F})EjH^?s(aW}Ej6#=FCQ0$$yp8>~K((<+!V@Ta z-tP}%`)}Ns3*U!m_^3Ovf-*z7vyt;9C`)y`TiEK|G$h$bae#)3h+b5CO%M3?@As2{ z#e)oNEv;=q_@+P)K`H?VELO@>$0=2ndFJ*>B!{@Y-SGYI)a?_>n(8nQCMMyC%%I zE18zYk(Tb(+ea;)`weYaq>m4D6*;iZ{qlh(bO%7>K8G^JVURhR2=N%u2buX(tE;)Y zyU+tiri3ESMgS1pYu_Oy6LJhwr)M=clZA+5e}{TT{GYR`l8aNm%iBo?3a)yYtSgi+ zh~uX(-^j8})Vzi4l4L^6nS?22b`uy4c?b-+Ns?2cm#T}s4e?F~a^_$2E`QpLfBd!y zQtwWGHY)HfBV8I8V0i-$_EL}5SIi$<8VH~LVKTxtZ|uWRT|)nQfQ=2c-Y)}>bOSy` z%PvN|Vr|q9M=`Qr_kZw&t9Q9=qEq2YTX|mPp>ZD`fK=$ zBDTJ{@#nPo8h%f+jc#qSkMyS!YjU>a+S;Q4CRn}9nKMySKfyh`RR!T`G<~BNZc4#p z#VLerVdMD@R26MN)@6Z=PIbA;VNJMQ( zy*CbN_^r*2jW24Uwz0S=U`O7f>1xSkQh5#dA{wKMp<4IS4GfIZ5!i3v>4Y+jZ7xvF zmwKNDz5TwvJ{VhH(oE9&GQevpXslO%xnF(l?QVUTmB-gmuJU@#eDfo+roD7rp?i;x z?xhO}9iG@XZNKPtw(eLv5C0_BXy|Hw>)N@Y>7dhRd~6oK8Qxc&u-x{(JsC9>nU189 zHaS6-qj@nR_lUJe2eI=_YBe zZTt@TGrMxwNH$a_G}Jy)hx7cns?1f)8>iyxe|sPO+Y$@Y^B0tauBLwO`1Aquk#owy zbOc>{3Aq`_SEccu8KH@+oSc>o@_ZBgI9xhj%9*D%lEJU|SKOCfB z_*psSc41+m`zZoFN0b674iZ-=DQ#FH%gf8bqa9n<0#7wkX$*%FVh2QrTMpWgaD4y3 zuYknyh{-v9Fj5SXJKfu`2*^tH5y6e4A9@DqFwZBw>VUN8CL)aiqSx{<$f)|*71tnv z+%*4D>eYb411~ToP{!oZ`xPq<740g!cgIHD5T`s#MquGEaBO5 zWKq)DHyf_?s{Rh}cQCQCu|~?lDASt==LW`mWlyLG1&+}!!rDgU6vilBYwfB;ve5AEPtC@sch zWo2>18UeQz?DpD5zk7O=5m^jiU=Xvih#fV=E8DvlVe5?jEJz6gC_F0hfoUKp^)JIa zAVR~yA8UPY@EL9b^-12+GAo4YjwEmi5OeSWj8Unul7N-Oli;+SnqH;5jHDHD6 z%3xi{+IXcJoHIh;7_?lmfHRSJ{rEl{5v{-GFF=xj-I%HS_yeCDG7Ag_Q$zsG)bgf! z5)d5sA-RF*LmO6|psF+flxaot?o$kL@KE zr0fc~sdlis+5VFwCsQr`a)~HeI4?ZbQoth{v|#Mo;lS{&0mqcxU+B1eWEG{%>OhD?2=^9b0l6jC zD-1&LV%Uvrw0BRe4F>Q~Ka6`fxyLG2mzVYCV&yeDA!f80E;4^hTrRUlf~5>{?XDW= z^7S{(Ul;@nqJYazuvmC?!+R1wg|S*hUEUMSG#`Qy>B#ro-fDpfO@Y zi@0-BXFShZr*p`-l8Y>S8CHWt$vlp`505KkEF<$5&``lO$Uod#Yy?55{#E2kw7k;d zj}c*E$!NISV(TfS!TdXn3A;NDT3O&FXi?t6eu=pE9l;I0 zdHCw@_!lEVu<&N{6eDSFQ&*Q_?a6@+xOs2Z`M^R%o^zNec~jv9d{9F4SlSO)gx3qa zjBrqZpItm_w9|P7WZUmoQ-{Pj^ zu^X@0#@ZEkKy5C{a6xBFX)k3AQaY3;J?9Ub7`EcYO@Z(w0A@qMwR7leshFk2yK z>j2hFam?_?U7Qp7*W{PgrA^#CJv|F5*a(=gDK9E|ZN|n2 z2HYS+_TW*buqcO70f^Sq3`z+|If!p}DeN7fVU{gM0Z|x#$Mn)JM9Hex3z1y0ty%J> zKEimDh0#)Gz<%9qp?%Q?j~TGvSl)RbBNQGZ2DbTG;cHV)w%>&(-EjGlZ@VMZl5!vU z4J)fsqW080VnT=0f)m;G0C1@TGh%+NcpM;m6};O&hD69kwq^#E5S+#)5WK`7#myHl zh6^5CdjN?6G0qM6n~yPm(a0^heOp}IFrWACT@EpqofVzjpaTTO49&CZaAxCK1DYQSaKkPUxD> zBF~VKq~vRTx4G!K2T7#}OdK%i=73jzdN=+PY}|Lfk6f*8KA#6^@|Q8U%~?6*WI9F~ zd6he(HqF0(*EJj|_~Il#|s*Xt1A{O--02q1>Zh6aEXcv1Kg z4$kuYo0-ne&g=%Kb&(KL6SzoKobQ`~2T2qU%_3{D+i>TvfyxMO871s~nL~nKO4Xs4 zf|MpN;ae*G0%jf&OE23JETqB6mx;sIsp@A0b!4`$D2)daQa@pOUa*7ccxC;D03KYI zDCi)WkUC@r#2lI%fG3uNvb8xFr(tWP_EOI2gw8nM!Z}g&`XpS@AFGWAIxogH=Q_7% z$6bkyCm1|d?jVEAfI4e^-;ebC+Hu|KVO`ZKjL|j<7;5l91`c{Wo0_HfBS;RVe>f1J z!9P-Fn}DVS&d-4^1f0p2oIz?g=u2?E9|nb{cm9E1P(eF@#-$`Ap5K#v&!tzkuxwld z*c2bleR1F)y+<<*%cv);4i`!xSOPBw)Lj|1gDTIwZ6VD`L^_{G`}(ry3Gl%B4)2U3 zt8vISj>qKnS*dj9;F?~HZn<4<&%^rx^OKdAI+v=DsyA5UKduFsE(18Jcl{X>R_#v@ zONQwrK-;1XzVju+@j3v>p|VSsuEV^`TV0;}BGrTeUD2mUCx>e`>!{V16VO5a zJS1Z@@lqK;kzP0-QwoHIc0hP#_+4UjMUoW0@oy&&nw1PBh7PXXBBi3r%0~hdYyNA4 z7k8QTrAYnP=fPhvWWMb2TxV%8H^GopoI2l>D23tz{c{P9!h-iQq;K$r)vcy@Tb8x| z9%3*#_JmKVu^eKiG`&J^UBr}<4toL4c<%7Z11`+A_tD0qqz7d6OgC6qtkzNXmrb(f z9Q@zh{7MODMf%g8vulo$ry%^{4zU*h^KbUIIvH_I@G-YkxL${~32tC3D=X*ree=Q% zU)S9ZAYZMzq}&qh1#kjlp<=@1a|0~Mp{FT0g&H^JQ+^a3%|9dl{lMaz${qE%$?X%E z2c<>Thw{ab7FdadI3d=ARskU`*AS!>+ZNrXFcBY7mS0_$YM-9 z$d-($)xT2JlQZsp6F;whPXoKL3}p7C-3Y<_=a?Yt5+GZ3qAR0(b5d8XiJuki~vhwR2?3I@d4B438qja9 zqFAyD?mQo_P|YV3&`$Y!5nW{>NWqcI=^^$&qb9mHyUj69%iuZmfb#Pzrr+qsHd~-- z<+bxMG$piCwCJB26r?-LL-~DPRDUkv9xP$*z%>xw%9Lcdp?)q6AFmOY48>1z{aby3 zu;;UZ)kibMW#}bdb-O92`*Y-yoC-ujd4$>w>X8F;P7UIhwgM$7XfT@)MI>SeP9V8G zsp%dyS_+N~WdNmqq+rJ-CY9A8-o4X6y3AxV7$PpTZQ}LXkk-`eWZvf_bI`=*QsTn( zE0P+-4exC7DrMFlkuW62r7yJ?QATahGkC818Djj`JABhT_-#pOWQK4szTc?iHOOab zvOP$)^d*1aBGhQ&sRh1^hAYHmU;CUwme@OOa}-VAQ>e?B+#CneN_q<3hZlMzV#Vd7 zJLwJ*G~;?w1?A9n%zZ4m#@Z>f{tiA8?mtc`6Mu*C>D}SpOl1bT&-(~k(Wyr)vqy?C z;7~O>@C`fcE{~eeYQzEByI&vh__zE-w#=6m?;Sqcs&_DA6(&B+;}}enG0^Vm)1Xyv zx^LU{Iro+?k0{<)kco@Tp87zTNT;m~MRayz)=+;_4Td8TZMjnT`q}U$tdCSJS{jqn zL5IC@?3a%dd-FTuGI}&yHM}IQ6D~^)T%$?3PADD9qkeJv)w!CACB5KBkmjhL#ch>5 zeA+E?9Oz4FOnhijzaQDSCQ2HL9};LVFI6&}e=6Qvd~EGJkY^y0)a?zp?9nXhf%^+} z{`7)_jol%(E$cV8^e_bJlqAn&vgMt3wQ!bwSEVKLM%}lly7J*Fr%&TG{wkQ*>5DVP zmKq5WSKdps=kx|l$6dQ|K`V~Z)ko=$Uoi4_R)*M8JfB!}NHvqa=D@oDPAre+VzfDs zcKQe~UwXeEA5y$4R(Ti)mcl~i zOBgvKA3F07OZ_^3S;v>pJ*DuBHx$D8VPj4zsr>zEkcvIj>1nPGTF@;OoeYTe>=FJD zt;Lv!99wQt6r-J6LcDN$fasVRjVcp%p(UU|<9;Rm>(C+sVV&7o$gF>jhCY2mKLGpuo2h{4GSjQxN+$~<{N7d^4QAX&IVRdvzgl^q0zfB^rv4ejsq@4nZW5VZz1ES5 zxbPBeXT((GObPGt8B<075T*0->CGfKoQ4q$KdDCuhflK@FPK)CnD%c~3T$cDtMnkl zr~#r>+7o%_AFX&NqPc9?=`SO8*6~@nr~X<;O6rAryotejyw2Z$Akwt5M0wc?C8Y7^ zh+Md-?lVQ@1#%}EXMKLGLGsqXQaFt**HN|w7TDJywl=jN1{Jm{fv<_u0(mjS<-4C2NN?SL zF!hPLzC}%0EJJN1UHDQoD-0DDo}v6){HVZJ=P)NQJB?Zpqsfy!0!6pddt@{@TG#{k z7T)<=t=%!DDxCdJ>f$W4y3paU5 zq}W))`cQw_BPaCY@_P2Jsi0fK@=Q3=S$N7*i!ocsLx zQJX&_uGe#(#Q6pS?woaD?W=5i+VsU8)Wr_`0-hJJWEKqkx21lwCaPb2eHV3G+s8CW zO+#ueWG)-yUPMT0=(Vk3;Df>%HdK#HUBXYheBr{ft&A};e9EfPitm+-Eb7|=2zfbE z6br;vg8xCS%^JH4szrQPq$8bCLSX;Q=OL%RfJS_e&^hAo)q$~NKv%^NjGwU{9X!Zd zb;|82e9dul#WaUalA4gN1eGj@`vgd%XJ}2Rj|^GSSv!K2#O5LS4hv0UdKG>vVFTNJ z9<&Nc8Y@Q_kN)MUtMA#dY>*Q0Pw%_WYNXBubnvcFdOm~GXlWVLor9@_twQgmu=KQ3 z&R@K=u&lLP{Qy#9-0^PRA!scA=hq0X$61pZ`QQI#p8G$f#rtR7#Cksib!`$OG)Pdib^vuLl51{OPI2$yNiRfyMwLSLr+UrH(O^XUQX_(oPz8RZQR{m z+=RKf9RD|h)7jOU>!*Q7ADD%}MNZER1|z=<{kdeFfdp%H$I8EWuIZh+HhIHeQ)|3^ zi#f(v?lMD`*G-OxaJG-13r4BP)=DjLZ!L|Cy1(21tS-i`o00F{zY|;irr;q>EUoXx zBZi!Pr748ls|tB5ruP<1F-eC39^x?*e!TlVX@5@kV$&y2u( z)&D-ZQ2qM%zd==Nf6xJ?$tb*Q~nWEbr^gL$2Z(@c^QiNmzj&=*(ztlL4 zJ>H-4E4xj>^WrWkX|KTi-*8@RJcof*;7C|e)7D?ArM*)4o<1$xXt~(*ZoL;PcE;x@ zdAMEHWd7_I%|=w|?_&;Fok}F3Ga+o|vBzQPfg%^2LC5g*wFqe%OKa=yI2~h_P!c+U zmS=W@a%N^`J=ML<0mlp9i%O$YQ>l0S92|BC!)KXH(|AgfRND59)0pB==|7(RMd86_Yb*= z;O(mt$7{T#qSf{zD&nWR8n#nSKDqeW*;!<{xokp>;yVs_FByk^-LB`Q)Z}N={wPBd zTG3I)*_h@$e6_N-5ig}E#yqnIZN+5WavT&mD5vlShMB!LT9=YxK<~rUT|yF9SFp;kvn(p zFi$e^@I;&61Xn8f9EiszcV}nk_Sx}9_via;3o8TJRu9tmChBM25-L4M_xJZ}H20n! z?{_Odn`CJ8#6_oz`6Z*v1lLqYf;NBNsPNu06LOge)-BPt9jnMq4LriQq8)3KGHC7# z1?>*VD#O2;1f6OPmzi*#A0mP*7Q5o2lag3^llf!Z`h;ZH>z8SHcS~yAbteW3H7vm~ zRk$sykUrqIMZP%N-*8^nXbC)Jbu4QyFe|G_;uX5pdqa`7n>RGbBhHsF^14Ks@{bIBtXOw{B_$WRQ zmBl1Hh={7H;yc`IBe6U?Ijr#7Fs>vKOCQfOaH{`vPp0g&R2H*Dmf$y z)ys`~ySqOf)Y4{bobMZ?ps3i3!}QB=tOmBzcnQLLF{u3R`3MQ8f14Q<=teKP6 zd*+hH`)QdB)eZQ5x{nd&bl|w4T{Ys(9(&U+Qqf4?rD4@gZ<=&EV1IIZ|3$zAYqRIB zP!Xbhqxo2+#%a=y);XYWb>Z@epwJ@a3eD zq{^vyx`5rN`pMYXd*!<9OL#utU7MZp;d%Y2<_+hmrm>F zque{m$WIKr_)^5r*49=Hr!et!Uk7~op!wDw+F9p_XHJujOLk++w+HW0uyNyPVz6aI zo?}-GHMU$Y9wN+ccrG(7;VwecS19${<1$eI$pGaCm|6xfYOSFw5^5&iv)9}n7gPz> zq(8yRml^No7^ptHd-txLe+uQp6^UpK4GqhK&Dm{4&{-w2^L)f4h$BL5FHz`?#-m4% zmgq)(qe~OGT27Fu-YXJ4X-Q&!H3SbohlMGpC@Lr@aXZ5$eCJAQ)l;UV$H8t};7vAl z>4r8mOsA*dZ~V+DBoZe-COk%r7K5^x(i?+MEp-mv_`%zv25U6U)bd60qMW z_$-!VM|pcC;G~W2?3IdlT>62utZWMDZM1oORMaC?@k5L7jmq?b75TLEg|YE(*T>_rhrPLy9yan3=!%s-CwMR$65X`J$L zNVR|Iq{O0X2R2_uWZ+JpXN1+v=O^&n4<}lB_}nhqX(N$He5z!U@4Hqc-aNi!;0)KQ zaYO@0u!r@eWU_%3kQ04K_gk;uZW&nq)GWIqP_zH#bD59qn}3zZU3t#W_FEQ*bWHdW zbh+*7(`=3i#(<2$SBfnUe+;~mrjsZ!&EG)v?Hz(4N%ll9imuCh_(Y8Chly-7Rh~HG z5B(Q9?i?<}s9N-;3N2N;eRrSsJ#pm!2S2KF`u5wZy_CuPk&l_*7d-dizFa^VDs1XJ z=oD*`f6oEyhnw`8cAT1aXs@5!$rOmt(K`Cj)6Lc55I8J=b(3uqB`V-^KR%d`z|o>= zr+gKSgHG|=(;h8HXI96z`$sIwjNv^AcVKE|T`-vOJbuK43p-k#U9X8psY=9^9fP}9 ztAWf@(~loN9F}^LEa86p0@%{Jxz82R(a{P)$H3_%dgNyW`sOYw#llT9<$B} zu!`G;1Bb`q2kaKL_zm}IEyt;*`eNA#TB}oFOO3((*KD`zN8mJ6#Vm(0r^djL zqH65?c7>_}jy)??==LEYJgML8mm;ZOIHMMJFDM4fEjjPjFMXV1HfY@C);toeC<6_t==4Tnj?x$S)$q#EcugHat7sI`&RRMmhj!(DdA#`MK?3Yinx>oR-H}#`(#z zLQpnZ^kC+l<<3$sn~3L{?%_574XE`jsnBHf3D)F%b+dWwE3i%Z6{W(!l~*1%f=3y_ z2pk;^IsT2HGqF7^P|xn!rgCl?5RDhOcI}#_L5%~8-%jtd-c#4y&xl21xNqE~Yd6Ot z!m=7TKex1$6a&vbq2<_?bO;5F=kC@QA+%2YjLw0N9$EDsuHssoo>YUvMC`IgrV{shyRhP_1PP7R~D)yI3z`>=HAOZJYMpZl2XDP|L>xzQ4BOC~H@4UfKC|#h< zuzjnRq2XHeu^aH?v7sqnPZqg?xUpPKo4>X#OK)X3WJQalONEhfuuiuFn9^-1EhPo- z&B@8x&ip+&ivlv--PZ8=&A0HH`6`qOFM373HvGDKO@Q6amnN*@30&~qm!TV>3h%hk z_MK#`+IYy!IbOg0;MIPr#L#A8LyhKsV02oV5iOD(*yq`4J2Zd-k3*j)T@PwF0hjJ| zP)nIJYCO`wr2}u504B=H=ltxn*DZ^ch~ClUX&swC@>PjROW@E{5c*jEPjF*HfX&CL zLJelOfsCT>*m=rDO#OGakd2>ZXV z-?kx&kD0VCY5C@nKs}JfAY7HpTJkgZ)~#DT<{O`n&5J^Lz19si48A{}j37Q#*Y|6e z!OCL#N#TPYb@9XmuI+9eo}yJM8bisF9s`YD&Kg1Tp;Va2)}zdbMq*i{`M2t(@5n4$ zVI{55f^@GbpT%yxvjc*j#%_^7cmXk{##_>s>#kc~nN?x__Y3#FR7MIUDFz1Lv)l0Q z9}}BPt5lNdj~YgNUv+6ae_wUew4NG#WY!llF-B{x)6|Y7pAcpr+8Zy?rSH$PA1UPl zw&681jaiEHP3i^*!Hxp*QJ0AI^V7<(QF8 z%HY)>V7sN4`@!1i=bpDsK$IIoYy{(3b42fJ_D$N0X42X~PH%GFR3xhidpa;z3k)y+ zhkR6b4Q51DtjN`@AnH1(6tea8=k5K&oO4o-1y9vf6aCaa72?mlH6#y=&rIopw1FSP+Ru8_gY$mIT&KTJ_}c!}_lSt^ zxI`$|q z2LMcXH%&x>assDO>ag(OH(U+k&-aZHJTh5n_=tK`J2=zU)gi};3)E>3-RB6#*m2)|4?|x?$y_j3;(UMcc6`Xy*uyA3QG^_OKunqA*6AKIe-3EFISKa1OY4C<4W`a zA65up<#bQ5u1TfkWl3qkBLutpUj8;+vl_{s#-o2;zFJKF#jzuP?`nTca!Agc3lB}Q zrqRP?g7t&z?&Hp4rbttFN~e__m7w9Inb;7Gb+yTV3L3;i?fjJ7 zwK<8>`Q(Nv{<>>R1Q==Oh*4B6e|6OE2DaeSbrnic+h9{F)*@a!hTwFHJn5FLs&H)H;J9-xeM(=o{&_bUUC$;q#2_1|ea_xR^Hp~8$s z%4E!DXGY*rr{OMtz7%$n=H!y3)*v8V=w2Pm7=@~9?JHveq+oS4iQAJ)@j+9IS1a z${%kMuL}K?{`7kbaASF)3PUsUst$PWQfJ?}fUQ5|I+RvATh_QV?Q&~F>2Y&K`)N`9 zpoW!AOo$5LFs7AZ-`YZG{WqV7w%s~C6#J!akVb^~{^^laNMd>!6s+K?U9&r?u*p&0?=Szo9*+vkS z-1%0m?;xf|J;XIID~%m4i3xeJkx`QO<*cnSYaqr6UE3#dep0FEgaTGgFl*Y^4}DsG ze{on?^(eIh-{GQD#_S~#dW6S%bp;i*wK&X{SAN4C=@)mZ(R%$LYMZQg%lGL;m!^Fn z?^|(sjI-UTZ8_~dDV1tqCFU(A(XVPQMd%r92zc#FR>EtlXM7w9YwZoV>KCFF-eln# z00u_F{k#&I+iPu6dH#Zn6_(wpPWdqmgYk|J>^$11_r?llqbq;NP4hZB7IUr)Pkqer z-~Qy|xQerd<(6IY5;ZQ(LwKYK{uC(IYkLAKa0W^;b7gnod1yBa4d=2AS*1zfq4aRE zo_SzRZ^itVK#`+9k&VQ;R!T{XgPN8U$0^gKz?x*}qtxQ%fB#$_!f%z7;l$6DCC-H~ z&-(FWHJ_z=9mM<{;3TX6hGE7(qgB#H$94^i5XXii$GopvVZ6Ml*V*QCbVpt z#M7l}=Ck0p0mYy_ulASB#wI-HJD=fj`>@8YkQG~VoP^z zzwR^#-a6$B@zWfHo@^Ppfif+}=M5G8d|CTL8-!p$SqZ1ZK)Q0@xH;iXyilQOv?G(e z^-oh^VDLW0IPHvpy`;7V{c&QBU}FP*p)>syc`17QUn*z82^q9C_KimcLdJmP2~j@3 zE)v!yfGRGcD;pQods@`_1rm@@o$EB4%*_Bdib03sr?b)bwrVGrN;ADLwsD&30YJZ*MIM zM0VY`-xagae9wIo9@rLixR{VqIK-CzWu+GHOYLs=nj;zAzaAkT8q2Zbu5IHFFkGHY zgmG$`n(vWNPNg*^6^sVBCFuTw_4HThZ@2#$L^O z9{H+A!vSvHe7c9;-uzWl%t}*H#5}jra^5WTympdYjAA6qOZYZom`&=+?q~PJbn#|i z*9}fz(dzh!W|^wx$#%LRLtDA*kjwh{tFxhWo}*V(rJm)sjZO%ezPU~jbheYxZSP>) zh!4Ap-Ws$QYX&q?DMj;YF>?Z~ssVylZ12c_P*}C^@>D}}`!wJ&m>wdR8~PsDV#RVJ z&VPL%>`kDod72~O&~75dj=t@tg~8b;I#sZ|_i(I|nJj~KW?=l{y; zGAf2SU@hH$TOK7Yrv4+XXUZL=%-^gW;E#WC4)_S}YmNA3ta(XoVXe+<0ah9^6u9OR znNPU#t-(kU9kEb%-K3JQF=U5BVI^KM9EnB36Y{G1cnj@!{}OHO@&i@_&UdvRJ?JZs zHyY`dxxyb1QI5A5n4e|$f9d|> z3~>*nr_+dd@<~m*5C2X~Ox&JQ1Eh0ZD$t81Ysbn!itLT>@oxEduLFqej~x+GxW!xq zHW|76@wyJ>u1&}HH_gPIl^+U9eVbI`#GO6%Yt!SBvcwYI<-P$bWEhDb9@;cG?o5;)y4iNbSx+{ck`b?b9#t~ExBAZ`BG~R#x$`@v`|_$x__~$O zI2=Q6bG0LScsIG9Wvx05Sag17CjDRoRkPj1GzAVC^k%is&QcO7yV#@QhjMfzVwVQy zv#vE&rzh;$*xT&Os;;;ve(4imD*Si8)Snn*FX>0J8mU7>KU`{L?>oFgP(Vu}=2LTj zt7hQ1_!v2oI-E6-DN{R=E_pPLniZ!M_xVh0id>EeLDy{l>lZ5Y&2ebv-;K~IFPglZ zeUs^TRU@Cphbd)*kB^TskB4b(j;8Y9ntZVX0(K8GJ+k=vhm0ML&h+9q+)+?dM8yv>Pm=F4`Stj`D|$nq zeBHDpl&TU{A&f?c#9)5>Bm3bmNK?(EJ@C8%{#l0b8g|V?Kjj5>(WZO}=>F8btKeI~ z&Y8;~>9zSFZAh8$n*DP_4u@jtaDsF&pFg44|FT=V|NrN{zzVScA5&@n@98FNj`wg& z|K;pv%5G*%6#V$1w!O2HTU^|e)_4iVCwVlLk(AVF4TBv#62Ah=sELI|d(UA?^}LpY@r0p;eiBYWF{Zyz8_5gi}Tw6lzWk~3X|Tul$v)zvwj zg#Mc#2%2E4oi0HoO<3ODy-M_S7sbRbtmU`A9tQ|YMRbkhB9s8>?^mmAQq2(G2JCt_ z$k(wvoAS=4(kHo?Wk#Z@Vo77VIY4<+lbn!@{b?JX6TXYwo{eaf;AsEa#3vOSc&6aTqHWPYq+eR=# zs<3+dj~z!$H0emLR$xthoKHiiFdIr#e3c5sgLEmS)zB>%sN?~yzX?gzxUG6E^aQGhlRCTLH?80XNB&Z zy5GM3KDJ5sFco);Vp9+5>wX=5i>@FIa=u>_vBYY5|6iset*@aijZ^5P*%YMB0YIVPBp!hB6 z$Ol)xMzxo0XX#oGZS_7xAh~k&omAi-Y3iELX=PM zCxc*oMmUg4oZorM5Rk%5dU|@E9vKiJT?-|w)dB=#4b&bd`TU7a(qYhBddW^v-(JS+ z7N){pTO!fSUi;(sRoQm?P2KKyx!*m!cQ3;>oxp4!*x}yys@RdTgxR)G9sT@nN`5#fb6LYOrpYp;v*-bn}HCdy3CeA;|UwvUyz<%k{-Fpunk|_pX z)xXTp@p8*r@euK*fhgw1C8znFSq*vlPngbol$5NmU%y`LmisHz3Cj!r zmywf6b1u7$fm2wCQuc$K{OhRq@85qOe2v6LN`_s%p~t}RMD5>Q;nBxG-;fayi8rqu z2%{GdHnNy&2ndMzg35xjFNJYQT#qOH89k-Cv-9ccr-m@ewwbtDl#WRN;|*f!rxNJW z^V5x>us>$p5~_($v;3bJ`T90MG&nL_mc-`>li%%}4fr9~*$?Dhfc{*JlBJD$bLB>| zV*R69Uc%H&e%5pxPh?>*jDV0J)&>54)g$uo@Sx(BL@4d~SdCIG z5#iZ1qM=FM`v*a?8GX{zn=nI`OeJ%lI%!we3Xu4gS5TOvB7tr4`eTU>NI1TvMJI6` zM=W(U4;qen@u?y!2)|!dY%i{-u}hA0%1$67>sVu;q)wjhTJ-ClkZ(^eVXc+nL*P`yYn!l@D8=wc!z`VUvn?V0-q=fY#`WM9L6&qg(7!yAE78_xe?o)UaNOpx?)S?)3h~=vZ=-f;cz#(EeZtyVHX66`Q z$sK+jg=FGH8rIrS8?(GZVwu#l@^qs62CoB0b5XDotn-AGC5|Sv!V=YdoAhZCHXzAW zkiKQAEmvSsLRJo&7iE=51%tVKxmbnBDfuY&%UjY%sI6f6psBzo2A>rtH4e~s|9ME0 zA}gQ2G=OAEcL9|%I*%bl5Zt~%9-pYU#Ai6JnElr6ZcpQOf@G3usQnt( z$MKD&iwG8+a#1zYimTZEY|%dJ!0Vt==E&QJQ|Y{8pX7HdST^KZT&NP|Q;f&RFn8V_ zs1quXxTvXd`Sh|#Ymcs%jU+*-KW8Mga#7Ce4f?BVCZnVpvd-5O}5oRYU3(Tb$CRqN^f?qTbK-Btm%0TOYMsueEM|zbvLLql5D#G zb~E`>D^;NyzMff%`*)})%-%9`z)EMMjlJydaNzDfW@Px-pahhG{z6RYOsnJN^*yt4 zEEc+F%@3Ex_jcm1Bym#xn-5PMXM90J67TQ`^{KT`K3k38=Bp53R5$-SZR4k+oNQ&f z#P*5q?B@p_AA&Il9&e~SdlI6NJheSfpJghh-WGk0854*%2CHTMz0f1d$Zydvd9x>? z!72FLe_s=dHvh#$!=po2g^C_FrR+ZpGL0Fw`}Pbxe*wqE{zzCk%exvTF%=d&cl0VS z9}EA)ny5aHxdp6CGfi?w>u+yTKK#aD?By9ywUv9Z$f~-0q1Nz*kk#9~+?0q!iX~S< zg;mFMtx;UtHDL1q$cQ2rU?_p{cFSWI$}urD{*oiNF#kJ)X@St^gSW zqWBPZWkFg&57o%^67xT11T(LJ4;Oy}scGi*?OTc#1Ap(43Sbr`^^Hp+46-+0QKWi{ z+E5O282eU*$4L@Ow}9O_U#O{z*?tuDp%3mks!bmI?0&qiy+`r4UvGOhg=l2*-)OuP z`NagBs>H=Ht3c+$(%@ypzLUP6oF{c(=}_1D@y8h_6>aZT>aQ_YH>7DR(=QaG^gHz61|Vci)msKMkk8T#YAC;DcKiOY9U6^Bh{9K04gY$647JDPOz# zaTn9S;JuMI#gU`a_}8rbYF%{+SfKf$&hMbOXX5dp{{ZLV3K+lCko@t}&G;z!-d?o^ zUcc%{pz^h~Ky+IZ?m%^a8I?XkA^uOD8~y7oY8S}khF6?J+`|)6`c@yCA6G}uJhaNY z0_^Gii=B`vD3tJc;h*~iO$q2V9Lj~CF|jkKang;eIEfZj?mD1HagHEp+mwY&U273! zPV!sUVJCL@xiV~5VFHozky#vN&Tx_H)#zgn=&M<9sS;9tC z2KfE$u6_8KioMXJzb84xWMlnR{RjFt0PLf?IK~Syva{FPBZ@7g zHlbkiRc#G87+4>)pWy2tuu=+~j$$(5LbIJ4m8-t2yk&P%8y^f4%2!pa$E@|a`bJpY z{pX*V;TmvPGYinRB;Vakjo!CPeB@!mHO+R6veOovVB!=Wyj{{b+tY_+5=T1XzyY-u zUKnWF%6XR>f4D;gL230yHA$)>>0^Pob0Vi35kf^4Md;p9qn{7hb8=zeEo7uLn#;dB8C7 zi(=Hel3J9Xgi~BgK)vy;?-<-*V}LoSppjrfNtGSt&unO$<`*|AUXG2=?e=wuE=JZv(=)u%2z3Mg}=X}q+TGT^|VX-&#L}1&Y7dKtvD{^`q z%CWuLL-bPD%%fqlWZ6Bcy>x}+PS!~bP?=VfEw1N4a};W5JNT;8v^SKz8kCRUKS}b( zN>U)>rc}VL&%QzjIw&XO6y?8*^7IMtthgtH!QJ~O6P|W=vAo+)UhqPOFFdA-K-2mN z5erYi0B2I=s${j)nlN8j^oSD;1F*$H1z@@-vJiB9WepDD&}_gdsocAky04>b@20JD zKDwQui#}lhItSR^#koht=`cWYEe=E~aC+T;ui>+>fU||K2+`Wzc6D%?!BUVI9dH*_ zE0H;iKSq(SM?;zeKn4Gi2oC4oUT|l zaRa$+cjBc?`Ju~F3f<{JFQQ;p^q{r|Xg#d?!uCr<8K|*O7f&#w$Z_$&PTQY&0rM$@ zts-;9ePONHU@cI`%VFIUw;`mT24;yDv7 z4ZbG!V@4KYDIJ{&ZbquZle>rVy&~O?s$%won9>)&)Tp8>)nEwy^<7}4mz$CPMxndT(gh-Pk=~eo^6(a8)=dQ z(7_7W7w5oA`5KxYVay&bMY=O!zM&hOvZ705uJJgu1I>#akV76YNpY{kVA?5ql0^vY zq1>`+!poGT-bIay;1+{BINRW5=xqCg@865-I_H>RIX`i#q?YRz!R*Q7%ofiG{kld2 zOMaUX6eI|M(Xb&1i)UWy>g0;ICG_lS2^wW*p}598X&e?R;i9ezUEjSsz*bAX`xhL7 zsBe= zQY>bk4Agw-rh&3`89DH^r2_-i44}*M?oUp$%}Ymt152o=h;f$4b5cu;WyCQK{F2CS>&@Z#z_@fcHtGfRVs_r7F!2=S76)1$x z+2N_xSQXb!4m$Lz-oj^7+~U`r28Cs^0X$L$%-uQ!ZPlf+>DS%EwUM;#47!?*v#O>T zr|Bo6x=wdAjXb`GGyMUefPVZsPWZ)ao(bc9McCVZLr1_p}?7&=KjQ!k|& z>b$B3Mh0^|1c%!CXD@H5qosNJaR%1}%e6nu8TF+AM!W7GPA)`0!ZGj(Mz#Yo<7Z5C_D~-S1)*v&y13gbcc0~n`Pr#mxkH_%!eDu{D`U@4NxP`uQBgS&A+wIg~ zs=#+(s$k*ks$7BPDpO}pm2G%+)90?I1@pWk)ed)mmO}*W^o3}|1IXfIH_m!ElaC`F z$(SyyZ*s-{^C|rH;seMuIzxw|MhIN8($UPbL;qRMP;8k{_PY}d^2Mi5H)jtZbuZHs zodl~kDZl=twSG9llm8P1nb-tp%7<@yUO~6q516W84Rtk5Rkkna%lXLP9$SNN7 z9h^O~F2%9chRZM5K$5O?u||v>f+ZHq%oSPP_;sv=@a8`n)0pw7G{LW6MDP_zAT{UZ zWSR|kRxgh=NuZq4$nFKr@BMVe^m|fEfibNF&^oDtk@3v)CP`c(B-ZE>LV}785ig>+ z@>2u16KEd03-i{xPA}w&S8M?yCEDl#u=@5?K%1pz85uQr64(sG#a)@9f3j1YZ~F_S zMmc*qJZ^itkbOfXA#3ukpc5D*Nd(QL_A^ARePLXOTn+?Ildr+C#ut)A#0I7%yY@iK zQ9@vM=Dn5(vZvS+kZ7LmIkwqqhYmTm;UrT7=AT?(yP|tc-l)`zI|Dkb+A( zLYq3#*3(OB68Fn)61IQWhNnq+7JZ(=r=ZUtUa(&SiEHy)AY(HLx55-H=Z@Jdmylw_ zBVNul^cl*OjKH|#rv$*D)`W|>R6y`JaWwo`uN+^{h6naEN|jbv3J_$&erPZXW&$<4 zY_g$AEIY%4OrA7GEC?C~odpkXFX7%XipECBK~vp7NZ0l@|htQH>uO0J=}c8!opE$Kn`d?u1P`3zZnAq^p22H`X}jxs)E)E z9`nDqLA7nDE<2gLl2R-vij@&|Us20$LG<**>Q!2Gj#t|=^7Cswrl-#ZbR>_{gdhf8 zTZTrHz+5DNw>3U;g`do$m5E2%UtH~u^$YFZT<`T3gr4cy%_k_IJb3?it)hk81mozB zA8%4{o4wbou^D*G!pRvADuVTeK@lBp+SRQY!H zKAUD=PV+KOYvV2&VgcJ0SWG3_$=t_$FPIk&%(dvg;lJ0YTJqMv$?7je~7`1dWI`t=}4VrOLa) z)t)pF9gtaI0_F5@L-zsc#cr;~H6EXX*-%SR*6cwHOi#KS1HFk;pm|jBSlqhHY36T1 zpN*+I$ecU8F+{ZTmDQwd(WzVvsZh1+FD4mmPT;8`aYPytW@r0<`519 zM?PF9Mk2Nw*|tb-=U(j&6UYg$Ld@2jjdlklXS5CK| zx7-}y5=q>;2Rk8z5++w>H9X)c-?8_#K;Aik0TgP-cg8R)f@0F1iXT6o*3X7eDfQ-q zv}|YH>-ik%FftFjqI4IVT0Rv~SSx;bLnYzHl+mMF5 zcXnoGFeI>2&>@oCqpltDP>?S_k4I}`J8QyuK`kf0)SAOj4QYJ`Ly4zV`=p==s}tlV zmh;Qv2-DM+`MevPG-VGLe)5Xm6@_GSb9=K8B&e2rPml1PSch&0w4lbzmu9{y7!NIw zrdSew(!nMYaw%BV0I)%+rwi1F%U&tUCHdbkUw)BJIW244@H+VF4WGpezdEDQv~98o zAlfT^UfQjY>?kS>+A@CDd{8`T6oPPQHB&ZJ@#2>i*sEBu46rxIu!jr^lDe*{_O;jzn+$LykO7$lHQgh=`%C0>Txxo z)<3}{o;lt7UzsltOyli0b5Qy^?DtAdk?%;vZ9Ci>COB@*yTT_=|m*w_{xwnsii7hlTCx#$f ze=tzG9MIgw1-e&qdJ?(Yb~P(>*^$-uIusItP3~)>TRA~xrYI;gSZUQ8t(+pzIb33( ztUkJjLw6@~n_Gak9K5Rph|F`X$U0(B+MPin07nru&=Kv#Q(kb)Cuf^v}7}0~kU!|6+zrL`^xBDS*VhzuyZj?MK zfZHVfPZa5)OmVZViCwAa(SUQstG2B%MVe2y38UM~Rydx0U1uj#l!VuifYn+HA-KbL z6CfG?1C-|>`U^f<$3}v*ur~=r57SQ64@>4BW2>PE6=oL-`H;uu|pLgi4$`O2A-O3MNN9a_8 zuTzW1#m6hCsC<1PEiM1*VI|2W7^?xCSDC4~7c&?2;0tv`P?BmCep|(vVD5<6p_5R_G8z0hYyaw~0y)Aiu;2G0& zvUt5*n|F4VC|jg6qf``xb2mopkD=YxX-g)hUmMKwLV*HhE-2Hr25SFO)kfckhALWE z%1vNjA zr56jX2gJ$zKZ_zLP!3mu&*y*)8{QK?J;Ihg#F6rHvgMQt2Eypkzm>uA}=Q=7k*w-P#_0tju|q7&g$2u z;0C~r(Kmktcl))Qi#wI$pOsM!C%&s057cf z#Ddi2b}iL$w@0?HPmUvWeXAtkJX#l{_i1CW#;00<;aVI10Ae0GuiH_C*K1}wpveL= zhi6gm2}teWsNi7OA?RtcKivmRvHfAZrp7!ATg#}Ek%ew#lh^c3A-F7WL>1&3gULUr zvaqmJ-%7I+s;7mu5<=*F;&AUS%M;FOgApM1dE)LNyO`0z|De;1!0y2_f8N!nNnb>9uMm5 z|0Z8|GW}Z}S#Mb-I}U;oSnCZtanN|G2#V$m4v(kLIYF6jNmZ#-D6uQHq_*qh9r}eg zH)tclZFX2D7%hD_x&jk*=mL?_uC+aNDR$ypl)v!nSio1QZ{Q%~GUG$0GZ}eZ6*Obj z5T>&tJwO{x6eykQyHJ-%;@m(?H(upkzBnNLizU*eHvx+R2$X~ms-QqUS|*$_&Akz% zDuw(HeiV5U!Zss8E{OJc#mi@>g^H$>ZXi3!|E%MQE%Hg#6#BpYhfdmVRt28=vaqs7 zM@Ie=ie3?(l)3T*7QD~O&Kc)-4p(YEb!=(FFO%4CoY$Fue1HAM|DoRl8$>?Ha4SM- zT+lI0>?eS!039|e0E}7H0Oih~cxzU_h5rDyi7qm+`py~^nQ-jIHtq`lLPr=U$6yv1ZOPO*;!HXR1&~#aKJxgC+tTD2M7B) zQ$aI@fTU^Bp9VQ#qMAU%H;?m_C<{A#aTO;YpXNoo3D!v2PU`S2C@wD7FNuzg{r%|y ztjz1Fm}+T&#~TNc#6_1=jrrpa8uK(&;aTV1d44uF#c$c!hqqxci8g>z>bU(YSe`t2 zDwc*sB6~KJllh`JjT+>^A;E!gG6E?!rfFfdQtGLn^p5rg zf?ELV{DEe%9W|0RH8n*R>2P^X@WC?E88^h3M&L(9Iac>aO9%;xW4+dCSMnl+n^Jr!LAkr3kSZ3#`T!+ z55({CK?cKOnAG~t1$-%(PFDq`>4l(oPOh}&%ohSzJr$tZMrT~c`UC?y5rKcW5bC;7 z<`##9c8N11YGv60fZ-0^=bn&CLdPHp-}Be6u=oV9d4s68YaW1Pi5H!PhX<14M0oiBfylB8rXa19rmB=0vxB2-P-xcXcscs*=JypzsW zl8}7DU*;h@(#qSm4#FfxF|pGeG!4M!09+bX8^9!K;`B?lM?+h>L4v`(?krWDV==8U zRKfeB0h1gQmCno?4)3sVbE|{54VbNp3ssu86T6l72Ht>e7K5C3{c)Nlko@kDni!V- z+sxh<+I_f*f%?Vg=FFgi2TO3Vo>&rU!H1xoEBf$oE{w}_$mtTSI#x&b@w1k4xn{k3 z#OzTDVwK%_LR|OlJHtJ7=v-P!uEpABk&yd<3Tw-wT})o7Mv-=j(#&ApYx7T^K5@T^ z9kPo9eL>nz4H%}a8z5d>5@%*)OftU=Ba(*f|K`5Q;y&&xbFla3T>ADVqnOXe_baE~ zyn7a;jC1`N@8*WfO4Jm80iF^{YLeQ zuvQk~=qRp{<_1ZSYzJqBu|Mj-EqgB3K@aUhkf0MmBjlP>Z((5}r=ai|b4W@@#|5fa zN~i9_X71sXd!y`)^&SFG0#pI`%A(rau|+cOGyi>?qE^``hj*O2hz7<-4JH1n%h)5^ zC=NZbAl^J6n1$1C);jd3 z2Jj>P+x-+*K^Ou+t>*zBh@_zgzMO)B4vav9N^KIqeLQ431?7LD5M*nyMaId_pTFqb zr=obAA;F^{vupGBHDq-Af3)StvFRv)_ZRg1p+Fxkb|*AKD#1*gv)JVk6BPG}t~eGj zc#Zg8^ES)j3>n4gugXFp7t017m4Dj@R@S3gxUK>Qd427|rsQIF{1>>fXSCTuLGr?CZYg5q7sa+TfMM z@4lt3S={0n_DI3~#m)8$H|s^zNX29EG3n1bDBc!9ei*q9_vPZH>rhE3Nw%RKhXyTKC0j6=_2NE!VO;-f9v+tVPf* z89CYLr3l`Yu?RrFD>SP!$R~iD9w#EGywCLc>y$0PlIQ>3k4lvDh0;&3f}l&5eGM!_ zzrdR#7Lu&fqrlrFQpQ#8W1OlU9)c*65r?iN4~hf@XLhE5Kp3MTffa;J%DP(2`LS7G z$d*Y3t8DIamQC=f^{q|5eTTbrRG$zR$2c%B0HLxB5Cp>}26yD4cWvY;B|Qdhn$e&t zx;u(qwrBhO`>PO_^5p^dFI%xEpm@SpB;Wug;4>TM5pANm>fVTz@r;!)380i(gD(3( z`yhwUkP?!A057d|6lx$iq1QYFvOZAKH!kHyS4YkgwJ$WdnF3H)hDC#Rar;3NOhL!4 z@OzplwC%5?w1rPaDlsy%KSd$ggZYd2cY$|>NdMj0*-7j39|5@9YmE}--}SX^9Bumn zD#ySGK>U7DEpar;kFRLt!mvxiLsg;oZGeJFSx`yrhjawZ)$?6OSAtbpKz%`My@ADc zu?5Q$&nYwpN}{Uj?8QI%@5DFpoATCme&F>S%4PZB)D?i&he{U#{dX%7-a$M|-z)hPbQeD-b zYXjj%D_X7kF`A1`LLPnP{BMK{^MGP>%IMq_Igg@bnOad4j!Ok0pkK1Cj@}E_YfB zm_9%Z{pBpU3=6UXxtMm~_sCmxnT4(~s?;h1EMGPus^(kk{IU!Oq2l1{_0X!Rqk>iD@T!J`e6(I z_F}ZykdxPB$JgzApd+Ilk-qj+6N(bXmH!W4Zvj=+8hwu*EJOtq5DY?;POo&M7&J&X z1|i*@R|yrRQ(7rOK)OQ_X+%=egK$7VLZtJp@5ueV_Z$EB-WlVLJJfUb*=O%>uWzln z=A5grkU?1Z73^d{qeI1(yEx=;GQg6&1f;~0O??X?@PzqvME~B{Ig~j5sLvWv*Ypo^EVS z`+*QcoYe1Fxsm^8@{vYrkJT~e&uwi2#G##>Z{|wyH568T9PRH$tFwI>glZ6rTIWP) zgnsPA?>$H6B2^ZcNAFh?^Wv-P&6X(0&v5wEZt9f6k`xedye2!pEXOs#MVGQ1;^|HC_I=pSbz6DBKwLMhVquZ{e zchQet5-1@_?w!d@w&pSie8xmWgj19Rv$xVQl`OugKb0%?sEiAGr+bTGcf0+E5S)+M z(MtT7`J4&tUSRp#_jM5XYPwF;T{IrrNpxY*SE*<7()>8 z_K_sm2>Al7WK9$6_qutw#XY-e<@4Vd$FATjEKKsLYH}sLF-Ly?_ zaQb2}tl3G|RXH|{kFer2;wbt98+0B#LqBi z6m@)+0+nL)?4MbFd;dWXQ?EHM*AaDbuT~idSHJr8May${W?IK+&8YC_>iOY!S{j28 zSO85TPI|$^rdFWDGt$#vzj5ORwRQd+ranGxngUV?s^+lvLsd=?Fq^;ITx0-3@ZXvf zL#!?t*Gax`2w>naUtbK*e7Qk#dxDU|rvXO5q;#|{wD(QMLYluEBx|(O_6JusZ{|E# zSrQx;7ZMU3E8TQoWGBL#*2LHt*zmjv88t=sS76n1wl9Zjzx)_BLN-^UV*Ps?^)V&R zSAK2Gq>0z@g(hZ!B$-Jm=~s3<*hj5);0!ZzqZfT7?v-&t(;1c9#g=5_e`^R|!?V&4n(-5+yW$u%F(gdrWT5%u(lg?3RAWXvUW^ zDMp6!|ZL2o5Aiw>mxeLTXdROF6j zQO%%90}x-jl&wZ$=ux-jxm>REoV8eH(8xcfId_Ke+K;skLS)Gk}4duQI}h!Or>)& z!l=d2JC__gG9y|#JEP(0MZ%0paGA)-A3anrllv{2Z98~ML&pU6G}d*Jm?W!<4oC23 zLhq-fqdXG#`0=5Z)>gD55fKwdfujxr^L&N3fe}(=d?n&l%XzVQ2gkqX?uS5{P8Tu? zqZ2RJ7edJf*^<^}AZD1B?K~f!7b-+&)fM_Nv%+DzayA3VMeW*NlJ+NL zf0>IV4wsz`K|2n{_2CCQ%p++Nj#4^%mvPuQXmxBDq0ELTm)R$`5g8xP4pt~(D=RBo z-)Jzs&A{a>y!T``^nSny{z;uH|CO`*-FsVM>Ps>=dS)FLMk+iv5lLM&Lq04#e4;_e zaaZ4E6qh}ENHW)}#4<#yt(A?_f}D!=N#!R8wZFe=)pH9xG;q*ziqgp4(_}Ut$kSg2 z3GGuTyr5W>0br8o4Pb6R@JIRiE8bA>oW0BDduL$M*&ZCjUkNO0@R}4?SJ%x#q=A`} ziC}60R~LGly4}*aP3yH^gDCImm0cb?g>U-`NiCq?n(}Xe5-M}b%gbfkH1Z9s+(lkq z;A`C(dwuKV%xG2FuhFUjbW3#XdgoBjzB^U>N-zuhB=4uCmInpWkdSOHLK~sbW8HeD zFDFLZl$@OWN?hDp4Ke5;DPpt~YBIBbuHu(0AcCMwi37MhhKka#_)%EJ!a%-Z`aEys z^Wb1quVN!Pzu9VmdP75p@`6#=Nx~8wzOyYUl{l{$*zW~7<1#qu$b`^}8Nt;iJ9mzy zA&@j*4eJ6)8lb8d@ej_m$%Ta4Tn7GYes2&+gdyhhtegy&Yv*u|7qH=vfjGB`Jd56v zME3i3)4M>m;DG;bqe;q^kQ~x)oTknA{h4H^Yh3b?)>@lCR0@a^#knSabwhN zI`JB`NzwNywg|AV%iMof(p?Dh2V>xX1T)|-(BzVg+5O)=iXt5|?)sXe?ikxLZp!&W zUFVk2QZnkvLNZtMHjInE(yGGAgfFrGNCC=y|8f4OPd6*3URk6;VZ>Ma64Dk_NbZ1? z2uYIw`^jkPha71p_2@>dKI`D}@EUIwPV;5frU!!IFxXz#dCgte<-@_lNW&RC;sBD2 z1Vnk1g2x8}p)p9a_$pt*!COFcI*Do~5UjLkva+&9t&yydEnEhav%1)Fu$yCGOct4sX|H$7aVM_uLs;iXPfs@) z&gNN~vB%UlfTrj?iAhD(11%4p>-cA{UaY!sx~I}A&CBdk!zF*$AloRS9o98Z8`=O>W^5j-vzN~Ti-Y3NCgn*?giFE6J;_lUvlgEm~qdUy|tIlN2$B=H_dg^`m#$6B05;sbc<3DDi z9bsjr2bWtm7XIner{%Q$+UQrjwP*-^G!SlcGrY+^h*B;zEQQgj5F5+{~3E|gdf$WivE!&I&~^CzitoIuQliae|+>L1K`&H?5SotA6j}h zS#!S7%qL@Xxh=44UD^Y!{d&5JcT=hnObV@m)vUR3kr5GBAZ|FP&+FaYW)T$pMsW-| z1>l}BCtc;~V1e!2m!UIw*R2a>Cd%pTOOs?`g`y`+;E>&>>N(iX!l zFyOP%Kqvp(5i@4-nQYrYX;(xbO0mNYPeJh=@K-|hDBw3OP%@_5e6MBd{hDId97-Qm z+G8N?#L92|=Kj|RC2>|BllIWfKhq%j3d_^4dL=32q1pEdY~?sW$hiy*k!CPERPmN5 z=097Lgjv*3G3Q%N%C3BH4*rCGBgBZDyvkNTC6J<9ZoU^Gwr2|vMB5(p`C{p9@J990=2B$4V;PN#@bN3q4|FiInH>o=88}Or!eSPq# z5~8Zc)#$jsQ$Rlw3ys-doww_7i2^oBmV<@2uJQ0F{QjMjUpw?}xW=Olkww5}gc&xF zyfHq^IUdSk(uyiaX%9zj7t5u2AG+{?kmmFKzp_01g|g2qrz z0T9SMf_VzIrGpVTwD3spp9F1uE>Tae*H3&8w$o*Zm$LWnrHt4$(JVthGY*q|dH(3x z^XFM%)gn|bC7hdP#eH^&O~<{&qCE`%XxS`muE4?L;^qz9XBc^U60cm4N1FRnb%!yU zMLKQNo%WeENi16ky~G%d{gE+so*S#F>cO^Tz z!Ef-p#2BskSxQP-dHHskvbN4n=RPh1Y?}XPrNyuEI=sPHX?#Lg7O147l3M1a2sdZPRa^wG_rQRjll$mIDfBqYXrcMH*27_MFGj;cC>iK}o7(O>G# zHuF0*|Em5gK6a5hY`R7Qy^H5vaH-i{o`!(iA(00-*HQR`M=``Uc8 zq4>MRJ3|PW!YdwpHRB7u)efivs-5N#^eChlzZ$Wx@4G+`Ft4`}>e1Pibxca5Xq`dr zz=EWn(Cfp5`1e$cd3Im^p>A4y*mtXVLb)`}hypf5>PKNg$4bWkMaRe3kR}5(H9Hgy ztp%N0zCPeJ2jRj(76F_f81Q0U`dC)l%_cb6kIV#N3%>uiFk|)Gp3F2+Wv?}0_7P?0;C0Xmdg8u|h;A2~@ zn(aF@XA4g!I54oXwx|mbVn}jr)fV4c zh~7brQH*Eqw5mGneD-|`1in&0i`gj^>#*L$-h_56yp}eT093FBcAl)Ww_Un16u#Xx z#3fVc-%?V6k&5k;S~%ty93gqq#u)u&m$KdGWAzps-`#ty2QU4-W|B|PN@9}`PWKnyLED@7hsg0EO??E%lI{NlbC%B& zOcJ8N3PCo4iQ@P%YA8XXTjgWlrl_H7jC7Hqqq*D-iQnjSJ`twE!FAi_@D+FfG>M86pUfZM=XbaV>r!r zS;EyM7Jhu7^*$}$ktkBOGmW?{Z2*$$f91klwO#Q z3ytM8N2xLA>K3KREwr`M-+X1_QqkdmhCPmt@Dlz?LvutJJ*!R1JF7_tMX5KH_#kX| z%~0Aw=T;w@VTsl*(CsdFAHaBaotPEFe^k@KY-0sIY=8}>zklB~!wA}~H;3BXBxpW(JB-ki}ZXF}OfHeEjPmh}yVzO$SszPM0+nJ>s!}bkC z{g;C8@ISz2yvOCc7c;E?WdONlzyVOtsR*<4?RhTAteDd?o*HI+U>f`IBm1H(>@-mB zK!4me?yPRe5a+{#P+_*wnT{OOosuOM@x5Xx7hne#v;b*VslI{k^aI4V(eS;GaqBOREQ|Uq$Z4>p<$5 z#HrKrtKPkF<8hTUaXq1jII&{d-&OgvE>LM^W@h;VAzd?6jtuPVIYa+-vzE@x2>BPT zrtEGvT{?&gi%WosDIjZj2O26WX7CpY2d`^rJH`MMfvT`}4wo$t<K=JfJxPClNrQb=Xs z`T?L9?89iA0y=wvrw1#&M2}J&ctr5y zu5_vbzsWA*plX2)z8h@s_DA32HWaANo{i$}8FxjTAaHpohw$JjZE*kDyYCL|)VY>>B`NOA167Dei~5r zD4-pWd?fa3z{z>aeRCOyYXi$v1|cDBs0$E=wM5TeIz)Amu9tDF_c{LTT$y7OLmXOBQnGE4PfvW1NLrRfujVd#y5n8wWM`%cs_7aWf31}tK-`~GIR3p zeIi%-c2orzm?l5g`3M)@foUk9XCfIliRZ|Am^%htobeE{VI4A?MM9MNHQ4tL$ z6O|qU7*E^gQC}{*2L;LpM~-Vd5$pp6JPZ_=0o)&Jsv&qh`J6pI{*HYC3YoGpU4@ zR_xpD-Z~$j0xi902ZE)4L`Y2KbewVZ!XTTk85USOcvgrxJS+cnir|7p7DAC(1#Hj^ zsCpb2I>`o&JLoDJKh6TEvBEqCgI=BFhh{+c`omXRk(7y@3HVUUp zfE^zv?8F9v)1IA%@?yxu-`Gr=6>~%Wg1E7f(bbEz7?HpbTw7A_NUM!Je0LoWQb@r9 zJ5;vn*$U-5l!EbNih$;E8IA!Fisu&zrq`aZCJE%%VbIy8zJ%VrM8HLy42#d`_m9Sm zu5wCRZca`<)vPj`?_(4f2jn0Uu)7e|69&B`ReZ57t&2W_IE(J^5Gwrp`}OO~q!m({={QS{D>vD0t!5S z%ud_$+_lEfgpAiF@tJ|=OSt+UKi&YAlF*DZkiGMU7%|-H;5{H4$TNEP;1dI$*TE;cjFFq)>))S)~}$sjiL+5K-7?R$*&|G%`W?pn@WTTQ~} zeL-zw;phruYBg*Zf&kWQ!1XPvPD!cX$>SLT=gHAi9aX;y+fev2_?cM} z_$!*&=wQ!I^SwrMa{BT`0qaO$k={m>M}db?3rzg{{qF`oPVPwtz1PLNxI8$M?#*Blcu8Vs=?U`c20#7> zA7eH)TxS4XdvQ@f5iu-)c4aUXvl=-6ICH9Cyt~TlzcdsJGhd!ReR{QF7S!zZVL~}1 z-#9P!JvvJSEeO?5;@xTDzbW8NA$#mE*{ekb&V(4yd97!4D7*1dt+-!`B zMq>9aYa&rRhXDJ=TS{J*LI=ew^{HyukY`z61agXOAZ=dZqx2k>EevSz=hPMLLLT6%g5 zoQeUh=v$y|wZH>!1bv?=74loRZXu_7T^M7)^5ht?{lgrB{k4Wgr~?9=i~t(NWzFdOd@9fR>SXW%Iy2qp{w1!TqmVZnx($ZR+^UQqVhg%Yb#^^{+0X&kw>g{MEoZk33 zr+YWMy1LrjMrwF1-)C2@(sAZ8)O5k+L1RAi+DA8v@?#c?bo+DFBmD>|S_>Zf)0&Yh z8y?ppsQ3AO9#cQS>(E7%WzfLP`E3_=Ah`z*UW+c(A2unifSN*WDC1#MFq122!L$=U zGHb>{3W9(#1F(n^UYGqJ;5!=XnrAOxrcaaa4E@Nx_$xYbpzbBF^~g8aC1;;_Z>AXf z{iI@C@ji;#|7Z#{0Cqrg5rL)8kF)a;M!n|&wo`4O>TRXLUH%KgW*d$zj4{%{ zzG+Nc@sp}bxBEfh6P2XO!d{j>$SL7-Z&=4=@JKc8e+z;DR7VUq*lKc!lhk16p@zk% zxLt@uLNfo{*SJ-xqf}}|jojhRI}5-=1x;cLQ{!m_Z6sWU6Eac6NzFMD;BkF1tEkFXGd|9Y2WBXmvw-Nj~It%B3cOoQ6px zXnuL?k2*(C>uRS7VC9VcakXe=^$kB#I z^E#a~$3gs&NS#M$YmPVxd+ytD%wOh*pG)D>Iq#299SKjo;9-DDZp>?4KXVw7xx=BC z`{wq`?4DYfQiMYdj-orFzdw;rIj=5*6Y-$Dh1d3cS&U7Nl{+9{I5cD+ag7Mu%Q@tF z6TXF=Gw9{1uxm#&^*{`%7jUSCu?;er-;;*^HFmg~+5~FtQCpRU#XMsM_F< z?HsNkGW1SdAAk%Eg&u_trqTSr_;o8_fb+AG1WPZ3a@K}9MXHqKh)y_aFCdmA<`MQ# zt0UVnDk!5v!A$HH%Jya})M{oB4)-ub%(?sZWbI`kp~00;5S(7u67ML!?PJ@ejpYR2 z8+OiQ`!BXaKE58NaYrs3+C9|{k2q+bP-EoF(s`J+#UYrN+6}hnHnYOJupyXC33*NQ z>BtSKB4JA22#xPC%f4X8Dl97`kM{9rk37Dku!jJ6i8t)L_3Kiqr0;VNi8;;g>6FjQ;J!2;j)&+1l_=S-VNeVg#e(}bSPsDs=AbZavRPy+Zu2AT~y)?~ghTOU4zR_!IelJ%62 zJ;;ui{#}}RWs&z!QKcAotra3|DJ!d8pTgm#XY?*B?)b0tnJj!ffyST24RV2&6-;p} zmIoIh4*e=6K7KqDOk%&OR~_r}MV?KwiDu4iO)HF`m4X+1a*36ZvC$edvQ2tUe=yab zLM%vRwY71^iLV60!C_0R58v(e<@Qr@nC^4}ENSV119h**g|>tAOP4DL6ox{ZjfJjn zytteH0cZza*fLN@m$&Z_2ZBSEj+wTnW9-V@x5zipC!*>vHK~Q$tL9wy>HnoQ z!vp>GZ4JzQKt|u3pxb9D8+DF{86=XB{W1X+-5&TUfx~OFeR9W0X*mFyb^IoB!q=r+ zdGIbi6Ini3k>X_HgMI-4t)R|pzXb(GtQ-uTn!%;j#Qz*WvXO_HViKJB-G$&Jli;Lt z@&JRwN{y?k`ziSP*zrzU+YY#zQJzE04tVAEo_xW!o?0| zLw{EfrVPsL{*CF&ZCg^Xh7T%HYZ66aP9x0aEAe0?79nof_c>t z--mG)$k96-f29p-RnfK6A4;4 ziM#^R|0-Lka~vCp1$x(%2wW@ps=65&-=uUGVkLtT26O!XD+*%I(H+J{c4%9DpEJ7| zas*-EU-5vs8VCyEADomI&E&spP|M(d>D*reSIMrbD!Z)3ZGt6n@FZvh??C4^BG5j< zi;Faw_h$FtoZ{JWa%|0%@HzW|vWMhmV}c_GMeN3-4PLt+HwQ|O_zv`YydL-qa^c2% zU`d#7XJV>*zrH(!bZn!`4%-Ly7WN!8EqcFI^AV=cN)MwVt-zS~4j%Qyo`&jGn7Bfu z%!XYR&uzzGVo0hSOaNprG-@G3BL_jcE;PCT^91Zx^9aiCI(rxFRMI!z|JxYw9d2Mw zT(yP~h|4fVD*B7BrW3#D@Zw51ruqwz*wRwUi@OV%fJ`D8lkp!U7xFO^VwXJLp(NAcp(_^Hx%m-U3P-MhnWd;NKqoVh0Vmr^9CeZ6wI)*`a^dr=U%B0k*?z6)M&%nbZb^`xU zgS@E4yd;`XiH(=HS8sZ9Qf(*?$oz=>0Vs{67{!Hs^Ff0u+(Gp2wb-Blqz$qXT-|U$ zADSf7?YzCd7y}h4LUrOh^eXQx2eDCIu%V#kpdz+zE5M^Hy@ngT6%M96E1mr9c|QAl z8PdNaSykJYtE)v}3{<7%aA}9-$$GgHFZUlvOfD3r&NBdx$T)#tQsV8#rXh%c!!v{? zY@*5owW<+*3PNTa;BVaD6+Og8A(ckuq<~HlyFULy5jU^*XjU-Tgu_d6H$dslosj4= zS8l6aP+4!j5+V&PXJdp$tVMLXyY#7R%9L4;qMFc}_vH=z_xcLk&y>f7hK9BZ&{8mf zlv98T9BtY2oA0OoCNg#YFQR!H{2}tSi7TBQV$O zDm##6Fu%HK{b4MP|7UKx+o^b1-#74MCU69FOui&>LX!Z9-mq*s_}vMxUjCo+=^FoT zTj*V@a|6)Y)@OiH6fbDehROx{+V#Zfjt;zi>u58vvx-kze03W#i;IiRJ;VkXz_8wm zfOq7^gduksH?LwoGrAbQcN#K5&J9r;s&&wP0Zuke{V2B3Q19o1DCEi= zlP(E4VgzXIphU5+e3{oX?pDd^draq%XYIs|iSg9ykmIAn)>i>WDLnVC2oP;U*w%$$ zhbhtZS^0T)6R0I@{{H^gVEiLmBqwvn;<%ufGsIaJd~mIG?6oxmAQb}64US41)RrS~ zH&LRDW`%0IEMc#2!e*wh)C&nNlC2?Jm5aCIdVc0!;z1+$5oTN!8r?98>m=Um8HHIG zard^^U`{jZeQ((^jmr#KYpBqhC+0_b!E$nZy|AA5cFDs zET-^^-)gpXl)#q$#7q2hHu8bpXI-7|Y-Ovn^Gbf?dj^ZSXKU(V>*R2Fg z@#`a?=Z_gk1VK1@2_d*dNeMt6QrP5h#au8?{k=v;`=d167QGWAfjBr|WDy=4%L2Z{ zeb$*$%TUOpyW{lU{LU+U>A6#RmqsY>?~%`n`v(N{v#524X2bIfkE^e+?E#xH*NLO) zEP7Yh`;Smp2qP^&*g0`vz`KP5I019m z9vhhqkxszc4nr;wpk2`ew{7%2I9weE6wW~dGT`oU7<&HpN4Sp3 zAh4X;8LwSav98@TL8vldn<Mh}Ai+O+UQ!m%!crSdQY>0t*;C+2B-)>vcYK z;TX-Hu+;~}DjZPAn8)c?`DYl>y{aeGp0&Sb5&t!h4d$5^(^6o*Y+F^qgL(kT^L|?* z@?DSR|6bd*0nRltmS-mpGTNOxiJymeKrTP^2a-w@Zix_G0WJ^3meSas>U7e8B-{@bI3Y}~UR`C4_@ z@DFh=jxpU{I6p9YaO#raDrS%eCT^rPWjADH*-6WgUUjaFI65>%GNc5*sbb*Qwbks7 zGRcg^-!I!qI$0?P`TxPrhk>!@P&!vjNEz%8d6(-CXneKbza=Kx&4gA0h7I@$)oL;` zzsH>$)B9!HIKfY0DEA2iZ|t};{taJ1+)xeOqi>fjTxg1Py$9U%)0LVs{yVxlI=@F? z-GwaHs&I+Ayy1adGRp@)&DL*;Xz5ydKU|IHveahV%?qR07~C+p+$z64?o9LQR!dsjIct0XdgNMNI^6@zOuSAH zV6rxdEjWlMG0?|uK{P_3$xF<9uLG*)GJ*naZQm!@eLimwWsx*c5CQ{*$M}k+Y``h4S>Sv!Yp9StakSxMB0i5lyHW#y?sUqB<<=#%mrhjzh4ilhP(pS}%0%La;s6RTiyVd(c;Y!5X_;#N*fr_PH);wG zUqK(NS8~N^&w(vNhZ8v6{OShyb}6(WU^>HLWEk-RuY)#mMYcI|5%Fbt{yP(=onvylv4GRC_jI6 zl2TTmZIy?Fbo9>UoYBe{8?e85rD{a|sClK0aQE`fI+oORcFYD9Le2<*f$T1zKEU1@ z2hI{`$ZLlHIhrhldVg@V89-)=Pt#2fuKfpt0X@)ygS?cyolLk6}#?*1Jq zaWLs5|6R6K&RkmRU3ENEtH^`^Dd@wY^Z|&BNZX({q66UL_i#4uFOFA7^1vx%bGAn? z4c!z>{&>{5Ds;y>R<~Byn5RpPORcgal9H_5Ma@R3Y0L+z1XTMQ{(yv{d32E@O2r~> zv{KWCmgVc2685EI=m5UV;BeFnT~o86;;vH2WzE6sEg8qjJXtiUQlRZ^X zJb{@lR1i;qq929ER!YtoS&F4X&T7V`Zl-l>!*8qDRrR@iQj}#`HCV52PU}lC3WD(! z8-8ov(UXi*Y{Zm-E|g!a0J>zr((9A$;0XOksUz%4+)?K_q)AH{j30OQEdyFE%@3OY zMWC!y!O&_z?~!i5r1$=k<6`;35j@I=$p`wE>$f>Wo5;ra;BTCCLwp8I2CpU$wiqlM z1aZRMSDspX;={F_sy(+;mqSDXWtA^+k?QrTcK#epXu@x?SaQITNMm=@3pqx^&C5Jp z*N?a@{h$^7yHO+qkknhWIY-)}``xlwmzIu(33;;|(Q(zrUl~tA(+Wv3@T+BB-!rYy zPh2nL1oG${U55VSGNluqxq}f0Gi=);kk28Pzcub! za;KypuNz$P04YWsMl;yH0i<(ewG$X;oQ1mU%{ZBBX%>f?kl_>t+XFvZz}@b%@TQl? ztI_4JHM-4oUosC)c^!5)YcK~V*jy*o{S{pX3VvjZ!4ZuK#wQN-)94NFkp$OPd78D0 z?9$>0pV}+l6S#7GNw#wcQiBJ#7}M>iC1Rva3<^dok=+(@DQ(AZ5XgSi)@f;FO+~wi zebjmsTuvjw+zjXX_v5mmnHMn|&ylys#608j#H%OHbKol(I$%S0Gm#mcKi->EF9j%* zdrNB%HqGYgx2d$TzlD`vzRCK7$I9@z(aFb|!(%$g_1?0K>yjjhi;v0fciK^#;*Vhn zNxHzFtwp+bn-^UyW--VwZ+l*MH=&Prsiiv zN0-+93muERmM9((g_iAIy~#z}9X){uLv7!}4#L{pesw(jn4C7@8qNMDmf(-W+P}L@ zSIr+CPxe&}1$Sn016`K3vJBxn~ z%OUCUOVUzluScj^J7K~}LB#h}6&)?m@ajH(%y^Yya)WVW;|paCNh#;a&F_Vwp*oA; zr?d&uRUtP`-~vFg|S4b2gZliQMM zyWO%MoisG=BiY8X3U*!IuP}{$F*E#p;xE6XKc00P`!5@Pk4ei&(J;kYp3QY|6Oulh zu2I_dEVSi_VlE@EaK_ljG*xKet6kyIe3E&z&^^=ZF%4PThaOwxCm&3Y7LRMe>jX=< z8YL=SX;MF*+mEOkvI<^SxpDaloEQ9WMYwf`mh8Nfr?yd~-|ai`%IMg`(l>j`k6q+S zgdrZ-n@}R@ZO?jYSIxzaR>BAv`3jfv1g8ssy%TsD82$ZKLha<2Lueu%zi?!Qewb$s zf1T#eX6&RXHID?<^mLzDau`uZn%M(^XL7&TUh0&Fhc@31Zb;8!AtDJ0#RT2jA%gFz zFG#on&PqoMy+bCjGrQY&nzIZz1@URHvQ+vl{|x3Z%HjTGxuEB1#pN5HoWA~^dwscJ zw(!S(ZqZP``nP^dRW+jSrWQB4hD0t|3gjLKzAo1xJp#SDG21<#S1_N;%Klt=4j6`jYDj zqDWFYL49OB{}65K^_dhV#xni?dWBc`BpcCu;~pejm+OC)Ttu=E6Taj5n@@O7S8IZa zjCNS-;{}1}&-22OfeH#$46@Q{SCj<4nnDa`PBT6mi#3B%Ch$W~6KN7xLlrsRfrSs1P)@rr>h4ZS+qKDVntIVE~-9Xr`+9K7WfN63KR;m_1a&YD87>oKM=A>$#+mo_GMf$Q1o&HBkpdiIGY?uU(*XmbhZP<_;aD9KN0+}ZM=&R` z>TpymLC>=>IUIe2$f1nvnuwKkHnE7~;n<8ZrB;o|BzQ{vAt$K*vuonEJ7>hoVJGhG z4*AaJ@XNz#5C7c8?~Cl#p+_gOuEAVv?z`m| z1zArF*Jrltdr96F`(0Bl@x^Va7pUuK306BboyL2T)!%XFjf$p_lewQtF+DA3XOLGB zNlE#%q+GgHR?dP}G%nTl-v>k|DCMM|9tjALQFiq^a_44J`AunMt@0!O0kZdO-)kK@ zyiX;$nF`GGp^!jSvbSqRg`A>1w}-tmhqVqJnp|@rHwG_Z zvNNr!D6d-5xWH?s&7_;3VIC-|*7V>^5To*;LnVX}K7rD{B6i0}@{t`4nxir;VaTq% z*_5g8gvP!sw{{#()7)k{xSJ)aI(i&4BBgC#J6ggk&E8Ot)~bioddfcrlj-93U7i(s zIVm!SnIsl-kMs(BWOmJ+tZAD39pV%7y)08`lu499nMuE24w*3=IeM)X;gpY_KL4{k z`Ln+x-2CJ#e#W-1R=ORbLKo$vvsT{y?h+!7&Gu6`qTt(P%TJOYk!Z-Fq@c_AaDVw> z$%me-v?;&9;h5vfimA0`wceo2-4!j*m6 zZe0^S@MhVVGc=lrNp1^!d6Dg?5_9fXigOJA($i;9M)Vt>c=jR^``)&wos43V{6i0T zn;3!0p&R)5Xgnpb;9L4M4LQM{knMX$TH4Jq&p!$?+xzpQgsy4;xhzGDiM*AR#>~__ zSLr=k@b0L-+UZXLc~!IC{2W@6R1^|+XQ@0IzmOdN_K3|d!*PbChKV3NbZj$eUEVrD z-u+qxtDDbuJ5L0w%R-HV-CC`~-t_mXGI3^r<+z0z?oH}fYWklC&4cAcNS zfYSxP-L)YL9Ox{z62OtH6?yxBK^QdXjc0q`W|%DW)q5lZ?)_tKjy+MtB^sC@Wu3z@ zK(9eFejR7JZyC~^IYW=SUO*2Qb`!nU0>)&`2-jpjr#?}Mjo|bb5>oM-`(?>`(_t}zy2dcSW3PYP-l6S+ zw*alltHY$+HoqmaCKn9&4<}me?|b_R?{5v%@qRlmV4bkBx!Hmwi)bDwGH7^`1njMf zy{$Rpudi=)=Nn2?%;i-9&0h{VH$aas3J|B+k_sS`B75@ks;V~N=NLn;t`I~mLf$*& z01T-jVqC>?E4!06^gz0%egI!7Qe?5Zs9PA#tA$Fpt{IxipN5BZYj>9A;sotp8=082 zfp0TcN1?0o=GRDt>i*%b zTwQ^f{gBk$d678Q2#GO{9GCRojp~cXn447vR>PMhlbLh{F2Byk&Yj&iJy~~YS;Y5g zmYbdbqHlLNnNW>O8TI##oP=-X*A*?tE^VHlQCQnM9`%uISjH%mtNXQs=CfZTw=N4i zM@O!l@}gFkI4*yR(`NTZLgQ~zn|JFLK%IYczn#u!C-p;wTe>Rn;WY$1lEicuYSsUf&+8Gl*!Blm%{GO!JEQaQyu)_Pmns+FK^wQ1?%D)EQq2O8Q43=x?z z?`+E>SJ@c>6IR9yY|LEP%RwcEtDn2MT; z&itRwpp(&NV9Dv9_$Jqm7k*|X5M zs#G<>Kf7eA+iy@#Fle^|Pw9ByOV zCZrX$Bj6cwi5gZ{QMn98KEcp{e}7}?2x4|4D}LzUG6Q*;^Sg$<_^IUP`<%n>HHJ}|N6v%Gjqq6X zs^N*=^RvaIs)OHMIT&hR9#hD&U0z!LaYy~|in#laXUu7!Qx|?m93^?&;r zJm+_hh@K)liz9WPB0Eia)nD>O0(k?oyrHnD&JT=a`n=W_u%i7Sphww<7In@!J~Q|$B~Cl`A0@dufk$M41E(V z{Bm`VG&@XeH9s}5Q>gUDhpga?;&QF!?jDBqcC#MbidhSfbv+v})P#hrEJ#+%=;0Q7-tYE0~h=C^x|L0i)p1QyQP zO%NBlPasKR6ILTuitQ?s2Aq->t)PFYjAORR z46)gd`FC9dL_9sI0_1E#wVP8H6U~tAuy8deG}S%5yy87;Kv0;|(bjQ4TKN4h9%B-o z)uYFbwE`)k*u5<-SR`8{=|hBmy2)gVgW(R-pMki_IZadPfk&I`<>KAqrCXm8(9&!M z&Rm+@wSY#e!K{v2RTs;M@Q;|Xw2b@*mC`0(q^C>GvwE9nfnJ|k2?XsRNd@+zu);^w4h!-Q8WsS2DvBi zA;9Mi4FJ!eg~nwhb?(K~^tlI*XeCoCHc`tElvSx6{fU+#ZCZNvO3mIq$+KWK#WUJ5<+Jv$kP|rluPq%lT@^+15;EIL3K4dySb&DMs$eu;|WCA3!mDPB@CZrfuyPx z#Jk9sWsBOy#U&1m1**Zy*Zum_C!ewBG6J=KSXX~7l_F{^zpSgPLwY5{ZQusZI;U9{_hznAjLtFt42YNU{^W z$D%pFwEa?>j|e?uIv<_A*YKU@mET_Jy7BLsbnjfgY|${lZsL6XNypRIo5iFo(*h@aMCpL$4&BF>!QI~$;6boP#-ahs_OAudRrkb&`yb=}H6iq^)_hd4t` zmoV>n-K7Y$Kwj(M5@e$u&JDB_tkyLb7!Jrx6Hv@ZPjy4d_oy^=3_*t7k|ZJPx4vagdL z%3L|T{j0WYq^7#Dp-oP-dcWGaiEm+jt^e3}`uWZX{=?kZ)54c82PpNPCJZlfEUo0$ zq>Jo{JL=?4Y?6O*j9ue1i3Ky2OUM}|Qhq`PbjGbG3a{ZlWf0r{8YsEIpEy=k^|gvf zENbWD$4>&hYMxRJ3T09^8U@ z7Amm_Okn5C?XkXbnxdyD#;?qZyEgT{F@b7%fV_9=@yL&j+`MYlhYkt-VL1~<^N;82 z3qA$f``c!@wp%6*cUxMx^Mzo)V%(ZnGn`9@qB07myqq~r_CSW(6YhFEn)fn)ZzIWbm3BO zosx+e=-HG%pR!^XIHeexrM#DnK|f&2;dZ4|jz;UaI{Rev5Cg!d?}qd293q-K_0!e& z|D^ZTUnd*LOm-zaW>-dbM(BKiQrhx~AmiT|6U&XWPYT^NWfS8AJz%TBdFi%(3mR(i zPkjApv}Wq}BH9Nhx2{?)^e!aYv&@**r2YC9P`D*r!(Z)1m}_ayhxIfY^hsGWfwP$Y zy!1AXG-tSY{{=~o?#kTVmew5I3ZCL1qVR%-q1K-#$r&zx8_1ZGK?m*p%Chsbvd^By z%%9qzM#Ww!IlE`>#xR4l9C7?HnVh}Djdi!uItHSiK7B>mkZHmqB&IZ#CzO`jvp4xp zxQ?r9KsE3DIc|YdGLg0Om%kNSaTl^@|c9xymu%b5fr@6wKy!h z17b<^eDZ1Da&xoyoXEex4=rr%Yaw(wJ#+t8aqk_EINzhbR?{%Cz|qjbLp-gnyM&7Y}AjPKEMma)#N+Al10;jkQD>wH6) z*r!76S6J@~+29SyMdj0SMg?+Nmu3js)Fkge^VTeN;N>W4U(s zQV+V~$3R+WC_NR1jY`u{lap@ueL@rv|1T3zdf}Lr(W~{S$jZrSFE+)P!|2R`zMO)Y=V<*+XdX7g@I<6t(BVtGpjH?>85_%SLxOFDG`B;2 zgiPf9>w*iti(*gh&KIy8%?3AwZB$*P$Wqlxzo7#QB{bAlt0~TfbGyrNf$Urk&KswB zKl4n@-5abYu&oIZ7&f-oZw=TLZ$A)pJa{pps3`GnB7HXSyhq1csuQhw+TUF`k)9wL|E?<^C%TvZuA#V zcinA?uuwi%Zh*r}?)|~3-tISeH%kKX(Jv-Sa2Mc`fXM8&6D3g^y#@p_wo-9C`OmUj z+Zi}YC!-%|8uk=FDz2#_h*kFZ-u}p=S*fUUa%ytLetR2<6Ehd%6XFzP=JeXST3>(N z5^U>I7*J*`?EPW?ZY<>QRlic5K268`{!62rCtcEtm~35w@UU3FdFu78^~rk*Gk*Xu zG>d>o0kfzCc3a52@X7J2?~>zkLyi~vq63!ZyP$F~}Q?d1#U=LV$i3IK#Xg11Y&$M`~SblE*Mj8Oqmsez2( z#p1_YWP~ve#;|Pq$QT2l7q5$?WqKI~3Qe(nG9 zLzM}0jKGM3brIMxf_>B^twIP@k8W9ZQdb{sbO_D3|0`*kf#L@L(|+!fDhQI*K-0%I zVCWKg!a#3Jd&LWY?Ct-C%CaH*7&iC_WvMGXhIu1vZER`tJJd*khlsdm8!z(4!6fAq z_FV+Mg-jG89D`9X;+XAfaxNzQb&5sx$pu z;#C*}3MQgqfwup^a%0`M^_P4XQKL|8Mur&wg-yo3XEubP>bp3(+P7n8*FL7;@#Y(; zyw(vu&bCS+n(vnVDxr5t6?v+b7qdT6v~(PB(bOiWsMflur`eRgU!I#pp$euu0$7QY z+Y65y8{gSVgwp>QUH`y(n^ljV<{;;I8FuWgVUUNZ2e1XQ&3V5h3Vnm@pAfPeH0LXw6TmZvvV++H&TjbGX{NE54_Pj}T?Fpm<3x z*uJ#GwZH!IrSFd5$;y{iu;ZFdFmPq^@JMDM({e!A*#R7Z+Ib{6TA`-CNf#UjneacP zx=)1>9wO42f#a7Jbd<_`RzK;FQx<6@fdZ$1VZ&8RVl6_!yGat)A*d;04q}kW^(^1H zJNV9_j$`Nh+Q+cVm*ZP=ysfT1u`2yE{FY?|{KB8$_+oFayAIGSl8G4g2&i2e&VF}o0TlHg;X5kHiND<{CSNbT(JN9 zSZ;{>06&SW6UELSESzbBMt9)~^h=x`Z6YpiPY8jB$M1XM1u8_>pg#nKkP9MmW|BVh zy_u;w2eGRH3D?_rJ=GPBO%($YDX3N)AUgiu{)gw+)GB85HC%zb!tUv-(2Fa5@PPHN zR`^U-&U}QE^?bp=M-GpTWY4+sKL2Zh_i`?t%U&y${`gP05aVd{?2+#0pY$OE=8q4YTdD#!SMALJRq{*6|!T)uw8n7>(;_s>g#vDG`Du!|LVy#!u7m`L`Cr& z9Gq`D&F;BTrwDI17k@6za7tqRnIP`vb*)@A6HkTGKPOOborGx0N^S;=c38Ph5BL1} zHV9zQ49~RRqY0^txuxq_w)oNc=aZdGFfjH==FsXfR=&`2$b)j{yunjBbXep0LRs28E3iB~u^Sgxby>yq!Qk7aDyyJ1 zV(VZ%Xt$+US`PeuPALjOms_hi7DStcHjjn~J;YG%`KwOdzo{jKP=U(x16g+#YMK?6 zTK#goJmJu1`6BXApA!Nv&6G5@rt|xnaaJ|&-+T33=3!vJm<-+GqcR#DZ-*_74F_@# z?3nvvay)#T`bClTkx#dbAHTw3an`ctPK}Gp!nE*pBx9HLEQ5g1xI;Fc+=DVha}FR6 z2)0<;onD6c00;Pe)s4qcuI<-onm>+9Ow287o~(bbD|OEmVgPHQUce(~6E{ZcEfXP! z7Q_gP#}E+kkS3o%H9tY>!jG@Nvc@i15*Z>D6js5s#Byk~AEVQ|9G*P~@OYEP|31ZhsBoesqux>qEzZh+@ z%F5#G@qE-N#0v~T5n9kZSt;sHa4Uqzvr9$w{a6Ip7cGtRFA836`R5AC-Rv!>m?CWh z#G_~@ez?jZ4UZE6P-d?^0rfnBh#*epi?f4y${HS!X{3!=)#P(ne}M{%1z5uMWZb!6 zbefbz{eIa2Mm&e}7*xLlb`S(whiayw4CiV=uCO2^duz+Tl>XUsDBE zV6Y%`Yux<v{Z5T!wsToL{hjPE?W zz5)hkYI*qvShDtXm6jZre`;8!$Gi4Mm6^3EE`;68oaPq!{Z0R(hn@cZmT^ZU%my4c zIAXq*3%rR99~#v}B8MVX-`uz#Sc#la35q&JQERIZSWar{b+KyQT%RBprSQ2hi1)Lg zdlSEVH?J^Wve168*i?U8(`a+4S+=Rqu4*ht`(YH>dEg_??M_x^smWN;0s?t`| zb`Pg2i}nHoOT)uL^P)iLQ}MWE6ujvws4h36Snf5iAsc@yA)!mDTS8^ToeS5dTTMAS zfA%nc{G6Wt>DDC=6pcj8Mu)=(Hccm=mvL7phmT#>Ha4jyiuvs7mZ@khYZxwF_c8Sy z-ytTZT>X|_ibas|Ce8g|Z{CiSm)Fzb9C=I!EvQX&v_GVgdRzu+o>53=#_6SGV+v9J zU}QIx+oqmNaN7vPQ%QRJ-%NW35Y+npTMs0cJs z49zJBR_ViGM%@$X#NkLjGE?D_9N%m88dH=qC_Dr+<7kH1EYa;)U+}g0Q8t`|@>W40sRll{`)P&w07yNtk?irp1 z0c@$KS7OAt40L5Pp9EJ1R!&hdn)Z8r;nvz%r+iLInqP;UaWNmv_K**yCUn(sZv8`i z@OO*%B0QqGYKl*sVt$N|U|R0UPE%YXn$(1|Lshypjy;1QY>MKtZP_j)bQGJW->HWc zyZuE>cUkzoQ3(37ACIt7!k4@Kg31GL*eHdn24I zv{gJr-K95rd%s_aSJoDqBZ(0HfoFBJJiF?!y$ebH5y#O0lLo{)G=Hu^dB1vrQaIJWtr=6b)pr@JN9NerrXa}QmlefBQ6ku^bRSC}~LqFrpO4J&+_#<4M@ z$B!S+KrZwqfJr{w_V(p>t$h%lJy{FHYEPhs)kiKGlR0Wg92=oQfE~+WE_Q8*qfIBR z=?7!C!9tg@vW0izrC}u#S0YayxUYB`fHU)unRXIpVzZ$(xJ7dd%J=YOwy*j6D~E>* zvbS^Hh;eCZ($v(ouDSfS5N6TZ9j2>u4%<(JSGYLirjEP{^!fdBQXYI%J$#W-o$u@C z4zz@a(thrT7eW)$>icAw>qGG$P{tY$FWNf)tA<4s<-VaJ_e0QYxY{Kbakd6pZPCJW z&{>!R2LQx#x_>R;d{6;z0Twp()Zcgp&?@V*FyX!lXTY;iT~i&)7p)PcIx)_Z%bST4Wi`j#j69q3is1Z=E`bj?sy-aOR z_~u-M2}ieUflTariuC%%wpj&SH+XQvM?~2Q?vH|9FM=e%`2a`gk~iqG`ft`FMJGr~ z2Wld~fEP(W*@14`0}KstHHbi*V8KMm90Kmh)EbIOT?mFp>4b!HgNf zoZJPdIU4K-E?`Z(_{*@qvxC@KD1tg}+!uhn2zVnW8kK}b6mI5l;9O#2D(YBUU;lOJ zxxL7Wn0yF=kP}tlB#q_gzb19{hwI@dr?iC{cD9l6{4s7^xfX>ya?Ylz zn?Wk;1ebcmjPuVbQ=#-R4}#Uf#h{ln8yf407u34}W?A5W00ov=fQAW?)Ehtybi#7e z=6Bx49|A;>3={8(U;u+0>_2YTQIHE=vE&mV-sfbeOVDZJ!+EVh zPATzg8BI?3HC#m+8lpEgFOBapj*m~R%(5~XkLSEvuex<2Z1ly`qfPYr^Y!&j3Q~u( z@UDiY-j08gX@o^h{67+@$Y@v_3Z|N%{CsKxyIpAOf(RItgYQG_3Ut7;TO47MPCPef z?FlfHg?P-s>klCmBhr%({cgQ8A?8%-S3+BpC*Rzy&*+(YoI6y%VmuD}AWt1CV~Xm^ zb;$OT4UoP}0%pZmj+=P^IfATpN zc{R(UM-yV(gU`a&ICy#0i+d7rkYKph7$l^ib=e=q_ST#{|V31u{ z!h)`8X{$z103JL4J|2GukA^H!mmu%S&=Hd&HyiYB#q6Q3%TT|5KhTJC2aZS_iKF%= zh&-KljweHx9J<_`cUG~V@($2;Oh5N~>h%58axk`RmGqv`=^Y*)o@U^N=gD3H*Rap~-4!IvL=UW-VY09jyd zk6E*KvkSTx5;NMwmy)UwjFtA##&Y3<0Sp2_D|&bP;UHDiXW||G+#HWb26fRwiOZoa zctcFl7YBy_yDDr}r;Nor&J62&%!gAqC-o08_XnhYH+7vK{b|Z$&GrDq&xnZF+{&sW zf=1vP_)M)z!5j|)?K-%%5(4G50`raa^%#H`#_>+WfXW7<&Ic5e1t7H!L_Qf-Ya;4+ zB!~x>w2b>pZK)8;{Gh7GfpRdf&jm8_YH5rUFE4L3M3iT6JP`hNz+<|70_J{8aXA!h zYTUj&HI-68nu7F~>Mg&8(*7~Plbu2J-v&|}a~K3eb~W!6Nb%f0k3m_@A<^zClAyuM znN>}1-yDjTA^&^h=3QA?=_xV0SG|z)E(?Y%X1fsDINZl7%{|<~Eo7Jo2>KNdFVjZs zf>axVYc41*JRAJ)?cnRc)bF$7`|OU13g_C2sQu5)`T6qy{K*gz=B(q5d|xTFf&S<3 zmRlH! z5o=RcC_EsBv(?qrh$ixLMq(QH>s5o%BSnxv#L6pFw(Q_{m1Y#q$Ood+=-2HK9l zo8%L?o+GSO%)@JR0!;Z)$tRTgMJEPyHu-gG{1uIG)F_ zaq;_96fWX6TJu?-bO_rY?(b{wXKVIt!lx9nh4Mj&!H3-o{<-jc4tm1*m>1S{p8FU& z24{3!KvI|kI%U`_JhWB2_-`!b?Ck7<&^cD+=EMuhB(#oSU>}aKNRomTo5Ex%0}PXd za=Q^7&oEqE+_Sf9CHZ?Up={B6>(@Q8rEMHiab{y<<0F;O*6g#@Y{N2tq10|f_*k2+ zRvhMEs#n88ldBQE=J(OY`1&%WeF1a6JExoZK^UD!x(g-Lak;x2JCD76ON|8d;>%n94?ewoNbXUqb_PL6_X5LwYq=p!7R}D;ffzjAKpS{Toq5$pN zKL(|44{r)E$+VM(kR*3%ZtgnRt5pC>J8q)hc~(jE#YPrTl23B*de0&z!0=l6mCrrruOMQn&)io1u$qT)q}Ow(Mjl|hP1D=h&A3y6=! zA}M83x_@XZC7&0%3Fr{p1B5Qnf#j^0@YtFsWTQeLRwuPED5_U!`&KPBeC{Pc65?TN zQR=9NZLH$^m0GDaE&??L7Q~`Ri4RCG)8*5V4^bmc(o731uXIYu5uVh2NNzAJt zjn9V8ZLB?&b_NKYWfmyfuaSBZu<&SWk3twd6cVFjU7Q)B)~baq8P>!Cli~BsB+*Z^ zX}}Ls8V(X$?LD9tjcveL(E%Wi8R$wRK*&AftzHk4yqboFwyS+-gE7||k<^rhsvjUi z)!8;{rg%oUNhvyV$MD{z4il1KrSKXm zc-8ZnuV#Yj?8zW_B$RL@nyYGAC+gyf~jM~t=qL)R8;g#ln%xckrHVzCcG_# z)I@u8)t3&R!(=sLb^s614d3zqQMki28KP>}n|+3?G~@u;2kT@Mvj5k^Wq&kaG20&R ze6;6O%L^jLodfBlI6Z%kxW*xAOIAkldoYxUxBm-q8S

9>UW# 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 OOYyFnT%oLq|NjEzF@FmH literal 0 HcmV?d00001 diff --git a/benchmarks/README.md b/benchmarks/README.md index 28b5c52..3bc197a 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -62,7 +62,7 @@ NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best sc Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that exact workflow and compare it against semble's chunk retrieval across 1,251 queries. -![Recall vs. retrieved tokens](../assets/images/recall_vs_tokens.png) +![Recall vs. retrieved tokens](../assets/images/token_efficiency.png) ### Recall at fixed token budgets @@ -229,14 +229,14 @@ Requires the `benchmark` extra (`uv sync --extra benchmark`) and `rg` on `$PATH` ```bash # Recall vs. token-budget across all queries; plots automatically. -uv run python -m benchmarks.context_efficiency recall -uv run python -m benchmarks.context_efficiency recall --repo fastapi +uv run python -m benchmarks.token_efficiency recall +uv run python -m benchmarks.token_efficiency recall --repo fastapi # Regenerate the plot from a saved recall payload. -uv run python -m benchmarks.context_efficiency plot +uv run python -m benchmarks.token_efficiency plot ``` -Writes `benchmarks/results/context-efficiency-recall-.json` and `assets/images/recall_vs_tokens.png`. +Writes `benchmarks/results/token-efficiency-.json` and `assets/images/token_efficiency.png`. diff --git a/benchmarks/results/context-efficiency-recall-6d7dea15950e.json b/benchmarks/results/token-efficiency-6d7dea15950e.json similarity index 100% rename from benchmarks/results/context-efficiency-recall-6d7dea15950e.json rename to benchmarks/results/token-efficiency-6d7dea15950e.json diff --git a/benchmarks/context_efficiency.py b/benchmarks/token_efficiency.py similarity index 97% rename from benchmarks/context_efficiency.py rename to benchmarks/token_efficiency.py index 79e7e8e..455e435 100644 --- a/benchmarks/context_efficiency.py +++ b/benchmarks/token_efficiency.py @@ -221,7 +221,6 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: plot_data = payload["plot"] budgets = plot_data["budgets"] recalls = plot_data["recall"] - n_queries = payload.get("n_queries", "?") fig, ax = plt.subplots(figsize=(8, 5)) fig.patch.set_facecolor("white") @@ -253,7 +252,7 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: ax.set_xlabel("Retrieved context tokens", fontsize=10, color="#444444") ax.set_ylabel("Recall (relevant files surfaced)", fontsize=10, color="#444444") ax.set_title( - f"Context efficiency: recall vs. retrieved tokens (n={n_queries} queries)", + "Token efficiency: recall vs. retrieved tokens", fontsize=12, color="#222222", pad=12, @@ -348,7 +347,7 @@ def run_recall(args: argparse.Namespace) -> None: reductions = _print_first_hit_summary(method_curves) payload: dict[str, Any] = { - "tool": "context-efficiency-recall", + "tool": "token-efficiency", "tokenizer": _TOKENIZER_NAME, "budgets": list(_BUDGETS), "n_queries": len(method_curves["semble"]), @@ -363,16 +362,16 @@ def run_recall(args: argparse.Namespace) -> None: print(json.dumps(payload, indent=2)) return - out = save_results("context-efficiency-recall", payload) + out = save_results("token-efficiency", payload) print(f"\nResults saved to {out}", file=sys.stderr) if not args.no_plot: _IMAGES_DIR.mkdir(parents=True, exist_ok=True) - _plot_recall_vs_tokens(payload, _IMAGES_DIR / "recall_vs_tokens.png") + _plot_recall_vs_tokens(payload, _IMAGES_DIR / "token_efficiency.png") def run_plot(args: argparse.Namespace) -> None: """Plot recall-vs-tokens from a saved recall-mode payload.""" - matches = sorted(_RESULTS_DIR.glob("context-efficiency-recall-*.json")) + matches = sorted(_RESULTS_DIR.glob("token-efficiency-*.json")) in_path = args.input or (matches[-1] if matches else None) if in_path is None: raise SystemExit(f"No recall results found in {_RESULTS_DIR}") @@ -394,7 +393,7 @@ def _parse_args() -> argparse.Namespace: plot = sub.add_parser("plot", help="Regenerate the recall-vs-tokens plot from a saved JSON.") plot.add_argument("--input", type=Path, default=None, help="Path to recall results (default: newest).") - plot.add_argument("--output", type=Path, default=_IMAGES_DIR / "recall_vs_tokens.png", help="Output PNG path.") + plot.add_argument("--output", type=Path, default=_IMAGES_DIR / "token_efficiency.png", help="Output PNG path.") plot.set_defaults(func=run_plot) return parser.parse_args() From c518dce70ca7f5e9348a30ce44b962f5f6da1061 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 09:28:17 +0200 Subject: [PATCH 06/18] Updated benchmark --- benchmarks/README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/benchmarks/README.md b/benchmarks/README.md index 3bc197a..01e07c6 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -4,7 +4,7 @@ Quality and speed benchmarks for `semble`. - [Main results](#main-results) - [By language](#by-language) -- [Context efficiency](#context-efficiency) +- [Token efficiency](#token-efficiency) - [Ablations](#ablations) - [Dataset](#dataset) - [Methods](#methods) @@ -58,11 +58,22 @@ NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best sc | typescript | 0.706 | **0.708** | 0.545 | 0.430 | 0.128 | | **overall** | **0.854** | **0.862** | **0.765** | **0.693** | **0.126** | -## Context efficiency +## Token efficiency Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that exact workflow and compare it against semble's chunk retrieval across 1,251 queries. -![Recall vs. retrieved tokens](../assets/images/token_efficiency.png) +**semble uses 98% fewer tokens than grep+read.** + +![Token efficiency: recall vs. retrieved tokens](../assets/images/token_efficiency.png) + +### Expected tokens per query + +For each query: tokens consumed at first relevant hit, or 32k if the method never finds anything. Averaged across all 1,251 queries. + +| Method | Expected tokens | Savings | +|---|---:|---:| +| grep + read file | 29,675 | baseline | +| **semble** | **567** | **98% fewer** | ### Recall at fixed token budgets @@ -73,15 +84,6 @@ A relevant file is "covered" once any retrieved unit comes from it. | **semble** | **0.686** | **0.849** | **0.937** | **0.976** | **0.991** | **0.996** | **0.996** | | grep + read file | 0.000 | 0.007 | 0.023 | 0.042 | 0.076 | 0.100 | 0.125 | -### Expected tokens per query - -For each query: tokens consumed at first relevant hit, or 32k if the method never finds anything. Averaged across all 1,251 queries. - -| Method | Expected tokens | vs semble | -|---|---:|---:| -| **semble** | **567** | — | -| grep + read file | 29,675 | 52× more | -

Methodology From b64abbb0b9dcb637de623d32878f3fa9f41fbaa5 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 09:46:41 +0200 Subject: [PATCH 07/18] Updated benchmark --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 00062e3..3e62d95 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

semble logo
- Fast and Accurate Code Search for Agents + Fast and Accurate Code Search for Agents. Uses ~90% fewer tokens than grep+read.

From 3c8cfc215d331a0c7450c7599d3c25b2dd3580e1 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 09:47:29 +0200 Subject: [PATCH 08/18] Updated benchmark --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e62d95..f935235 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@

semble logo
- Fast and Accurate Code Search for Agents. Uses ~90% fewer tokens than grep+read. + Fast and Accurate Code Search for Agents
+ Uses ~90% fewer tokens than grep+read.

From 379cd6f1445d1db3b57ce6ca9edf93ec13ac0cd2 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 09:50:40 +0200 Subject: [PATCH 09/18] Updated benchmark --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f935235..d6235ca 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

semble logo
Fast and Accurate Code Search for Agents
- Uses ~90% fewer tokens than grep+read. + Uses ~90% fewer tokens than grep+read

From 16cef994e64d8d796746ce86b0d2a1a62c1016f4 Mon Sep 17 00:00:00 2001 From: Pringled Date: Wed, 29 Apr 2026 09:52:52 +0200 Subject: [PATCH 10/18] Updated benchmark --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6235ca..af98212 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@
-Semble is a code search library built for agents. It returns the exact code snippets they need instantly, cutting both token usage and waiting time on every step. Indexing and searching a full codebase end-to-end takes under a second, with ~200x faster indexing and ~10x faster queries than a code-specialized transformer, at 99% of its retrieval quality (see [benchmarks](#benchmarks)). Everything runs on CPU with no API keys, GPU, or external services. Run it as an [MCP server](#mcp-server) and any agent (Claude Code, Cursor, Codex, OpenCode, etc.) gets instant access to any repo, cloned and indexed on demand. +Semble is a code search library built for agents. It returns the exact code snippets they need instantly, using ~90% fewer tokens than grep+read and cutting latency on every step. Indexing and searching a full codebase end-to-end takes under a second, with ~200x faster indexing and ~10x faster queries than a code-specialized transformer, at 99% of its retrieval quality (see [benchmarks](#benchmarks)). Everything runs on CPU with no API keys, GPU, or external services. Run it as an [MCP server](#mcp-server) and any agent (Claude Code, Cursor, Codex, OpenCode, etc.) gets instant access to any repo, cloned and indexed on demand. ## Quickstart From 5ef8e76ffaef927504d3489a0328f70a4ea81de0 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 07:36:13 +0200 Subject: [PATCH 11/18] Resolve conflicts --- benchmarks/baselines/coderankembed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/baselines/coderankembed.py b/benchmarks/baselines/coderankembed.py index e8a58b1..1d7fd8a 100644 --- a/benchmarks/baselines/coderankembed.py +++ b/benchmarks/baselines/coderankembed.py @@ -22,7 +22,7 @@ ) from benchmarks.metrics import ndcg_at_k, target_rank from semble import SembleIndex -from semble.types import EmbeddingMatrix, SearchResult +from semble.types import SearchResult _MODEL_NAME = "nomic-ai/CodeRankEmbed" _TOP_K = 10 @@ -36,7 +36,7 @@ def __init__(self, model: SentenceTransformer, max_seq_length: int = 512) -> Non self._model = model self._model.max_seq_length = max_seq_length - def encode(self, texts: Sequence[str], /) -> EmbeddingMatrix: + def encode(self, texts: Sequence[str]) -> np.ndarray: """Encode texts with query or document prompt based on batch size.""" text_list = list(texts) if len(text_list) == 1: From 19eb50b34ec27ffb9df4f18d1bc73b1a67622d87 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:33:09 +0200 Subject: [PATCH 12/18] Update token efficiency benchmarks --- README.md | 14 +- assets/images/token_efficiency.png | Bin 52264 -> 60796 bytes benchmarks/README.md | 12 +- .../token-efficiency-5ef8e76ffaef.json | 323 ++++++++++++++++++ benchmarks/token_efficiency.py | 67 +++- 5 files changed, 402 insertions(+), 14 deletions(-) create mode 100644 benchmarks/results/token-efficiency-5ef8e76ffaef.json diff --git a/README.md b/README.md index 3c76093..e70fe42 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

semble logo
Fast and Accurate Code Search for Agents
- Uses ~90% fewer tokens than grep+read + Uses ~98% fewer tokens than grep+read

@@ -24,7 +24,7 @@
-Semble is a code search library built for agents. It returns the exact code snippets they need instantly, using ~90% fewer tokens than grep+read and cutting latency on every step. Indexing and searching a full codebase end-to-end takes under a second, with ~200x faster indexing and ~10x faster queries than a code-specialized transformer, at 99% of its retrieval quality (see [benchmarks](#benchmarks)). Everything runs on CPU with no API keys, GPU, or external services. Run it as an [MCP server](#mcp-server) and any agent (Claude Code, Cursor, Codex, OpenCode, etc.) gets instant access to any repo, cloned and indexed on demand. +Semble is a code search library built for agents. It returns the exact code snippets they need instantly, using ~98% fewer tokens than grep+read and cutting latency on every step. Indexing and searching a full codebase end-to-end takes under a second, with ~200x faster indexing and ~10x faster queries than a code-specialized transformer, at 99% of its retrieval quality (see [benchmarks](#benchmarks)). Everything runs on CPU with no API keys, GPU, or external services. Run it as an [MCP server](#mcp-server) and any agent (Claude Code, Cursor, Codex, OpenCode, etc.) gets instant access to any repo, cloned and indexed on demand. ## Quickstart @@ -154,7 +154,15 @@ We benchmark quality and speed across all methods on ~1,250 queries over 63 repo | probe | 0.387 | — | 207 ms | | ripgrep | 0.126 | — | 12 ms | -Semble achieves 99% of the performance of the 137M-parameter [CodeRankEmbed](https://huggingface.co/nomic-ai/CodeRankEmbed) Hybrid, while indexing 218x faster and answering queries 11x faster. See [benchmarks](benchmarks/README.md) for per-language results, ablations, and methodology. +Semble achieves 99% of the performance of the 137M-parameter [CodeRankEmbed](https://huggingface.co/nomic-ai/CodeRankEmbed) Hybrid, while indexing 218x faster and answering queries 11x faster. + +### Token efficiency + +Agents using grep+read spend most of their context budget on irrelevant code. Semble returns only the chunks that match, keeping token usage low even at high recall. + +![Token efficiency: recall vs. retrieved tokens](https://raw.githubusercontent.com/MinishLab/semble/main/assets/images/token_efficiency.png) + +At a 2k token budget, semble reaches 94% recall. Grep+read needs a full 100k context window to reach 85%. See [benchmarks](benchmarks/README.md) for per-language results, ablations, and methodology. ## License diff --git a/assets/images/token_efficiency.png b/assets/images/token_efficiency.png index 21b4931fcac7508da1bf8e980fcab069f21186db..f6a06f2a917dc83c12422950a83499d5440264f2 100644 GIT binary patch literal 60796 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

IR031w z#F(j5=+xarO?E}4GU+3JHRr#+)k3gL90RLkh-HlVFi~QS>zcgB zmOpeA3DQqhP&{IuWv?1wc=H(%B$yPf;#pWB)-`@LGAkA=*@28X!svI%0OZBw>6r^O zxuwZ>C3l5ipHuX-dC(yerr#v$wFWW9(8u8JS05TVgvkokQN0LC8g0N@Zd<yNOtjovg|Ku2GdnA7O@us8UiaQ^}i%-{fSq&s(Ln)Z1}v>8f^6%u6jy} zS%({mD$jvz)%f=>y|KnR{cjq?+kQFlj4JtPdxdpi{~gZC7Nij9=KMg ziI?1WN@73>VHQ8czpX zo9`IBoX}htqjX46F+jLyF%!$lq=N(+)7)DuEgbO=JVr&hm{=~pGX+k>r;ayTo@pxD zR!!}#IfwsCh0r&erE~3WMBEgT;1$o<&&EQrhm9zA6!IX`p!%t-0|$jH+{ADWda2M0 zNMR$cVtzX-W6SNe@tod$j%A9YVRJ$r+>aT8xHHe&BtH~5*9cfDtF5gqUms&R8*qd}=*2pByuP?qjMMWhKkRL>mf?yg*EO-8#!!Lo1W6E`zKdt`* zeZb-DUwMQMkZHvJQNyTiY?#ho>y3|lq?uezs0-e=k6X8b1T1+^g57;@`$v{Izvwl$ zz<7qB#aUq8DlH%Bx?!)NUA(kd-B+^zK3u&Uddj#l ziYF`LwVuLE<8%Sd1&K#dhDVDJl!kRYQ9yMd9#$_~z<=4} z0IhGr`ZfOk;TA*-QtI?(>ETD8Qb?lk-r4@bh?g(_V?3L0*?R>VTOSHAvWC*{4cy7{ z82DE3D@6`OScn6OF2ROZcwZ~7ypy|2nYcCCKoUowgifQc9Q2IVgW6EGS(@07H}lTX zyN;ef5zb?XkuWWf7O_u8i_F&}|6am(`1@J;pgZ@+$p%@UeO>ay5YsXdPoTdC3EtL1{;e${Ra>2~ikG{>SZy%rpGMIpHS9P4=db)Cp~?*xbP%?gC|!y;Dgk8!FQ zpP%P}%DkWs>N?bTPxWNS=QOj6ifZFBj$XB`J z+0J{r$$qu_(Bp;J#fqO~eilNVNsb4^Mb|qMt{sq*ljA+cV@!aU$}gKpHJ zuU@@EP|NyD74LrSteFq`N=)y)o+eU; z#)UH!`KB$@t`OO3yf!y@1!4$9)&}eYjK@_Z{)Acr?<=2e3!A#@Xpqb(^j={Q%+~-R zmk&u|noV>*oSTjl zKM)^&z=k%K*8bNcou)8@?vynCjPv8c`+kZ-Y_n;v;F@c1G2s|U*4~P??`*a)WeuuE zbRDxXqw8G;)mrb_iz#KX8IM`JV3Rp_`JNBr)r;;*n~nEF#P)zq^)Vo|x<@B5x@Kbq zA943pOpBLnZ&2!~(Zlap7epJZr&yLQ;Szs|-wNJ{{4r}~zndiV%MC^I?MVv7Cfb7D zyBWlWD&LEHzu#+XSiB*{hpa0YO@ovV7rCuBJAE<47 z=GphP5;RV8qd^Omze>NNT|P zh>)T8REI2hgQR}~H346BUEP>dXU_1ApAkMr+P*y2BS6|1HhiThY|)ii`BvLhR7D^X zB1*PaEeN{G6v{1W_9#^GZhaT{bJABX#X^#5@2zb4$1jAUU^N1Hv6#T>AxpDa9?#)7~COOkOe$!mOn#J&jUbaUQ@>? z`=)=O z9bSca$P;?r_~!RgBcTJ<2^Z*;LSO}JLN9Ms;WPk2xpoVLYdQxw^-HxRw-;`tY0fwE zT;!M@RL5qg;v9+()w=!peb*Y>7AFw^J8Db1{6g9lx9=ZwmuwdgsJG;qY%wW#Ut?!v z`etB#F8F~*xX-6=dm@`3|NEyZ{CTWy0UQMNp#SL&BPDsRQ20HBseHt*mCOg9Q)Ir- zV2;i20hSiAR|n%lS#~8s@8vMvt)%a@VRDYw@R_lR2||BWGp(@8qDjfg;X0-*e~k4~ zE_M%TzImeFeWm2cfqd@|F)KP7H%By~f&25}dM_=kkks3N=R=wN#_n;-ThU{q8HX#5 zyAbQrdWZte&u`xTHERZfm-*ec#kUu#r71q5glb5sxBz@{YIi|KSr9PdNbNSGE)kA$ zIR`9kW{kUWpIB%}2{a0Vv_arChw_u&?P4n8usWZC#vCg!B`;DmejdM6e~30|Sg%6C z;W`C1osHvyobTsb($al@?m@09YCqfS{}^|Dy2}BLb$WL}iNloP(f$qw57ESI%Wn@r z?prJPCmCt%mOjb^_LbEpTzkrN;lfp~%_&y=Pj_E(+TiD8XQ+FBg62d&(~VeIf^vTe zXY0i{SnEe51HF1R07x0;CaI#UZ)SD>(Vxx}x`+ME<);tKy!NuH5^gJ(pNLXFfZZd0(5;Uw zO|+pllV58E!hRdjDMUuadEDFE8%di^sJ0K?y=x0Jo-AxG%~1jhC>5}O>)U|(iW~96 z9_ZgjM+aP#em`$|E-~x7j1J>gJ7L!sNQMsO4u0vYe|$*z#9-am+dlY%@mXc7+KlTf z1NLpbF9yvoq*xwj1xCtg=Ewb`uJ$jWi9TQ0IQdp8_IdV2U<-t-F}ke4mL_u#-Ocit zd0TMuEFtfE75cfeZjL=43QeYYRQmH@df!WRD4R1f|6xMHb+E{20s1QC+Rp`39VrUX z7a%UbHsHM3iY%^u=$2@RF0hKIsM5dJ7p#Y3Vl=6!X)b(h6^p~87tV&tzn2NsRI57z zAe$2YP`*;Sq2p)nL=|vMI5Pg$jq=nJFt9?JoP9QS?6t0@kI#?Ajq<8PO1qOpLG(6*?y{*e)B7{e6~)qf(v9OKAZ5SShcTS ze+vB=QDx-1(aw822nq6H^Q(nJgCL$9OpIOYIxE+Ir6)_gpsTojq&Az0E#_P}QQ%?8 zDV`QIxB^7aFe@;Kx}3WR~H3FpG=5`TT{~O!H2)4V#`1*ghLhNv%{355K=EdtZHJ;lM3Ac7WY-M?`Wk^=73Y4F4lit z_FQ{@(7!9IL1D%rS(2zrNJBcU6pmpQC^i6zL6MH{dgsD4^?6N8>~9{p11C4{i(#V5 zlGwUNfiG{Z1HKLq@0>(1ZDsB$0zb>Z+fYn|za zd{ofvXh1V%H>0&dri>{!n{8dOGa1yWElK2tw`GCO)x3W+n}VD3jLSo*Z4(5&607*6 zta`Asvj}hQW&29V`l-ev*!?|WENz)I=*=X&0K(CHkBi}x|3kpa4m7Gk#9)&`j;T2H? zfZ$R(iyl|f^T>iLQhQgY+y+_OQ~SI4*$GqCb8c&MTw81N5lGql#SsY(VS@y_$d)KH zx8j}Jq#JQ=d9RYl5DwBRyZPpp^qUmiW7fS&)hXMKQ}BZdS3Iae7kk3R4I)-eV1$lc ztH{LJvFFd9*BZtCvS;Zjx>2WWc%}T`Jhu-9gF_=!;T#ZlKjy|WX$ta&*JDxd2F^S<=>)wYjATg` zBDD!-P}yaVUNh?r^Yq#)w!5}gn|Jz?(%uA2^H5M%KZOoPlbENs`^lL-c^d9KqVzBB z)Sx;=#aLGB#lzdO`S}LHe&U{#P)x&jbBTC$NES0$8f{pDjkWQ2S30wRK-YieUu$aQ z;6yfAU-$|Blb_8>#0yu84>H3&mZ_eDALH|>uVRU;ccEIst;Pz;Mj|9fyhB9;L_6O4 z2px)7cX27=&3Nm4~T9=5;o z5h9HTpJ?|id;EMFJO}irHTQ3cjaOXkpC|*NpMFLDO0i?|vl{*+S|St?;iJ>+&=b3V zcT=wu%$sIdP1b%n&o(licM68@6Z}?mF^_?u1at;Z>1XZpaeQXV`EeAL_L+{CJ81v@ zgLAOQU6PW#u%+n%E#6>W;R^LuEQxQ3)TxCMc>WUxb%MDlz}v$5zTf=bgTsIMFgJdry`Ywv4OC4#k&m{!ZufWQPcX)@#||!~Mw2 z`R;Zl{4TaObv3r>$74 zjI}?o>siJZB;D^xPXsU0OYf`4kCD1y06l!zB}&>*+pvZ-Pa%;?Nx}Sox}hd{CMl$l z!m-EbwM)cLO_;4pffDiT8c4lEe0(tdBcEOcno$u~_PlGMlKU`$I)CLVL&2sO^Scab z)82U;kB0Wh&Aod$M(GcEFt0m6TS860?nlWg4=v-Y?Oon}T7tV1O=}Ri3-CBVmdpoV zk|3q8a4U4pKoEyMwW!Fq2u}8_JK;j?!L{BA(-s(ioH}{ZaP2HW*QPQX#v^(&PdBfFNv>)H!bfC8tk@M2;t2eX!{QsOdye@8-y z%a(hy2YYizCGg!3zL`9OPO^M`@hLMQr?m)Q1#dHV#qMVMY|gkxV{5CEMj2*Z7PmN; zX{e`m20mOALF--003OnoEY7T*=k2p4Dm79*#W+m-QOTBAF-<|sANSnFAz=&kYcY3u zF#5>}Me0bYq&f5y8Tv4ikJf_MO!{NYX8YdjM_+5-dBFo7gC7(9q$n@$-n|6qK>7n( zy3S*SgK~B=_U06Wr-%FcYF9k8_a?=F*+y zdL^MjV-5g&hF|O41v%J+qR_F*1DXA|%F*r^W8<=;0&grit+WwGddKJ773#I8B%p;* z_c1R! zH3TFZ4)1v#?_h!rOCnKe3y5FA&SnC0QEHU{-c@WBn-_P5c_gt|DU3crOF0OlrE)oz zmno;ZpYR|=pq#~XYyU{kc_(jaazBSFu`QF2ndwR^05=3vk$7c6he=hCI_Bo;llw$a z6hlM|bI|>3e^EAFMx!-5?D7U1Zv<6uJIID3;>TF z_v-ZmHU8-SefHAby8@u;>@s9;C=5F&Q+r+_?u$`$t`3H0JP)3&>WSb0z&zFqVs4x_ z?)rKHTC$w5gU{=zAE&%5Dgdm?Cko5}R|9ZboH!>|353Ua+?@-`#M%8iy$^Gf9SsN{ zLi^z{v64J%%tO*DR*Zl=Wq{czRe#v?L!`2Jmgd*+LNJ5wFW-6R~%^);Umi|oKZa>;$tyaOqUY+DJL%~F@u-G;>P{uZ2{ zMjz1A-62Z7Z9&6wJ}{{ZPW4i)+sdC#xUkp%FydGy`!ATzs65;)v(4Uo5PDzOH+0`x z#zdmsy!5WEeo4mm%8>@Cl0l8}3Hl3zGTtnpuRz~kTzq|{o-wcpe%625M4_3kH)5^ z5I9)nEjb%r5E*>#zK^qAl7QRe55Y|XR~2_am3uKvdLuPOw;O(-myk}e&Pfp?AwK( zwK#*9s>_0%jr}t@FEh!P46i>YAqknF^r3vB0;-_=9SN}KjjY1JBh3kBA{W2J!E=T= zKO*uik6(g7HQl>N?k3z@J{C`19M|~Uqh;&l?TTYo$0|2+2hG2w*^bni2n2c_bcT@lV?7c9LUN=ybT8hjCxDu|` zaA;y2&C4(@uKPk^)dK55cBmg9k)D$EL&z~&(azrJLj-A~y`DKvsSZ77(-L?x3oan_ z2u>N~ejd4HX;Kwr+djM5_EqXaJzC-is#4k{w-mkBf0ABeXaBVFK|Lgd(u26Pr^@Ic z1m%3o;$*8d5EbzM3$77p#P(eD-dJzU-h3Qi;c#9+4gjO?Uoj5_*ZCcPt4D(P1#&x^ zux7E$z<`{jYn?gd!=pWs&=Ybf?)npA-F;+BxbC}^cYT2?PhVI*?P_AD1>akiL#oUB z+Fu25AEH@H?FCjkW@VfhioEds8>XLfdD;iSoCFrj#(THb?LCYs z13fd@V^$0~Y?AwXwLO#u(oYtHODTt!zx)ZvU1fX*2_Y%QDg0$XKp1L9%4jeY zCRd`F&7Gx-m-Y`QguST`hxe+;jSrnJsPiJKf|I3wb?TJx zG`t205P!j3k=mKXDJm|jEs#30Uzre^Y4!I$&R{po^{~E8`azS=;`ljy`i@Bsf=qZn zvUPJRWvue?fmSyxhR!thsfWs-cI~T*iunC<+=nkBqClzJ+c`oHJ3`kZ*HJ$5Km(H> zZ?o;k8iz;sF%xz8h=3b7lCrv7@^>t!~6{-!L7@D){p^1U-HV>VvuVVCXa zLSN`*I{=dFBACKVLyD2vh%5Pf`Wl6fn$?$NKRW53_CtfJV}{clWR%>QXE1H(&|qz9 zX$jlj-aZmhS6A25nM_o4yF7*Nf2xfbI{#iy5OK?1tEJPys@{~C@~WNy*`}gBu}vVM z0~rjV1mE{px3*?E3?iD_z5_E*Df)K>X@L)2rd@E)4OBELNJaDhyOJ)J3jj0W^M$pv}n;fn{lMayF5l6CD8glYas7} z;c9o=p^Gd2`Qkhc_dJZKKvN&Wf&6L$9(W8iOg5C$^{ApH*dnli-y{P%Lv+Sd?iauD zQpctZ0d2WbmbpV#6$hIwouGsj2cxM+cqyuH8m<4+g<$0%p7LcgbaX8a$Yx2Dk)hT=&O<*#edPdJ78BCJhZO zEjauxojl*vIqf6V8yUrj-C%YyiJHEYBNqyy3ApB~S>1&fGuYMlde|@6LfKre!ta)t zm{#*hANQ3>25?`CYtLn7K*5*Th#P_;iLQX(GQ%SI&eA3l5-g%PoQrp3{MR#CPm zJF;RCq7H`z67j+72d}?&2s+>^2f;iS4}{fl7AL}8z+d)jf}VhLBU-Rl2KE`Z2u9Wq zx>rBJQC0g550Iantn6jCn+FeF`6EhD>K2{c=qzKdwt#bYKyLF*P4LRBa0|aR6rrh* zxi@tldLKuqOI!-61Bq+u>Y7X<^fWr6i3k^OF|)|^Mq{%|#rRO1VNt-$0Xf{b|7}BV zE?n629*aw5bvqXxzaO0!K;6Z3*~yT zk{cRIN#Yy!WP-Q&(O-bjwWG1gIeM3%{YH2 zTfgjUJT@B>-vGO#z<%?on+a+%5ERHCc{5uOwn6#=?4~L5>Lc7}j~hm`Ij!>m10{>% zTgU0{1{g$Wf^gfi)hDmsya@*%`0#%>^I={fHkyQRs9W^+#?Ad2KjI3=X`Fgrcrv9VmYZ{LpbCQ1mmC3lj@ zO;d+rA%vz^xGAf2xoa;BI?!V1X&z3{%)D9jrH-EE2I32~1S8?m(HyWut`OgbQg8`; z&>IjZx8Nj)Z=@);=wN$=Oo2XRJmNyFMHN6mEq*Wqx7fn=vyrgxggd6DEV)04B;U@b zxhw3S6-AApylvXOYXFrTy-h?O&AJa-SOVS4mte;2{+uDFzEaoR%u+Pw@v|6aC~`hc zX4;KA4KlfWvir+MC3-jNrkzXz+;v%Jd0fA9`ToQ#&;sTMd`lxxT>&>oqFe@ml^c}Q z$$N00>3ok4NSeS4QF&`6x2*NMqI2f{pl8*7@~l|)eP~0YVo-HTe93dsXxtVvbkf5O zLec|BMxq|*^2ks3Wb>eY4OEs_(bTMr7K{z$R^YgTn{tpI7EB=yvM>J@JRZ0E!i#ZU zo3TzN-&;0i*Upz8-}AW;(FL+^IuC7l&tQb`St3?ijh=i9%@QYKeanES49>ASonZ-; z+H%aW>tRkb4B)SKdpd?_H76CUzI^?N=U?lXcLFniL{egBr33kQ4agkEcg@QC* z9(-ZBLdO!qLqnrXcH$@v95PA@4U<7y?GvQ|X-VlU`jj zRje&rE923RsB?$R+ihc8?@$Kn&`P+eBX?=&_7&&00pxkt{)OJML6$%YzU`ALJ-(3LDN7e}+ zb_Mrq=4wmK3gO7nqkAtCswWBUE~8-B8+@n>HoODny34y*kAPjPNq}B{=PN^=1ZIAI zV+CR&URG38pgF*(zVw}baPJcwptTEPm^cemgZ;gc*k00}rrj9>vkEhE3)6ZK5YG-xydRD@2GA^akk;Ukjf zhKm51$6V3QzA*<8?vrrDq?*X#1H*QzTE1PBR5P4@_8BP|9{SW+21AY%j>AG?{lwun z_mb~pB&j@p58?|Uu-^b^lAHXy#ueL3{)tIRa>M1Gu|PS@!Q#EkxdnGD;RTJ>PX1`J zb)E!ydcSVeT1D*YA%gqiI+*}!6OuSI!?hO_Ehy<-+V%eZ_lsI)Md+~N<)8nQo`tj< zMb{SO%uu7@vm6E;SwS(+k1%Ha74Kj4vf1{i0Yok%n0Rpwy%3Qw7u*A;JJ#k+`=8+v zv=$xZW?`w-(ua9tP{Lg0(iyqXEByDq)Xvq+%inIj-#-Eg0Eqy*nOkGZ&v~e!p!J3j z)+TW2u%~NgheNN&8{Hy(?~_?u97^f&d->94oQ0_K!;NzrcETS4G=!W0XkqS4!QB$Z z-e0}no4;U%$2momKG?3Oz(}6=P=g?z+Rvgdx{1npN3+1GaG1<#GY!u1$_cCZwcvO1 zOIEYThi!|#7R<~q&k|SqQocE`;N@+l#GzUH7I_aQnnX%(gN6Ug>W?-lRd6G7Djln2 z1beuuNd+q{yJk0D$y56{T(6;Ednxo~jiviQ-n_8iOA7_D0}HZd;u_;LngstnBfi0l!Bq*hu4rn0sE9|U-n&9)e967D{o;sxjOQwgS*%}f11=KWKhP= zr0ypT{)&>2jn~AB{j=6bNVH^@LZoC&sDGsLEgLWbyb;}pF}f!`+L?Z3DLND)0mfLE z=4+Ze$QITJ!#*z}^@aFyGhchMQgnw~8Qf!SJG&X445F9?_x38gmhWXI83;&@gdZLA z6@+8ZDM24cy^=s8)80?xL$Qy#a@dCb|D+aP-*261Fbb3~LScJ5WS)-OD6u3o}q>ZxW=vq$!!G!x+&C z8*}CP$XClI(=ijXU?*_XCVuh-;T3=#0)rm?dW&1HBvi+g3nt661Bn;b+^l#`$T}v( z;;>6#QuG_y+f#neBG|dv)kTHU|Dw?@(Sr&@As=Qa)5t$WIYdYgW;vS2LLOK396Rn| z7dy&TupBDILNbC03?Y@i_$c3QOdeb2mj9YYMD2Hv)G{xsBn9Wr^FL6v#)6J|wmYpE zz#24VT##4=F+ZcS8*#LE7eNj#%2~0}t`IPw)rW5k+sN_xy=gVO3yhlcn~3)IlhkLd z8w_(m#g9g9#5|Rdww*fxLKP)EPUA*=cyPNK!dc9`D98^VK9Nl>39>ZzeSL4si|5bJ z6-TZ-N(W59&NuX?RWXIXcfG*@&n_iZ(cbf|#1l|Ow2PvFy`85#_xf^= zEU3F3ZF7EWS*p?`+fZL`BNyxQshuDN;TFQA@o}EZ2FC%ZnYC4Ky7o)6kZiaR6C)@? z>j+}2#KU-RAim`k6+^e?D~8`$Sp$jgG!5A&jsJ;*w53!V#&1Aj^nwN~r?4Y+JzSG_ zTUOdKV9P)Q28^%3CqYR;$SI(y53i2AitF#n>TfN`<7p-!m9(AloU(S3)x2{VK)0-NPWGm>(A$BUf)x= z#gDn$WlT7omf?KIr0hcm|72oS$_YkkSwP}DnaU==V>gP{AE#)SUdq(P#(xz~qo@2C zyotHHlcJ-gRS(_>T_5{}DIKYK*PM4s1$98Hg_kIaiaAz5@)gx13Q5F}mN?C7!`RAO zH*c!rr&9&8?|?PtL^FF+)O1718%AKvgkB87v})(tS!1vS^I1a}M!5Ixa(ve(4#Jd| zil};)rL3lDG3>%NFIH&%nXNi_kPRxRef&wCxh_V(CQT&%Q#+njLZYm%AzRd8^4`%! z9W=qibF~*Hc%a0eUn3(X3xuk%#y^^N$3&;r>tU*g92AM4?y6LFn2eondSxZk6h<+% zA19npg7QQncM|om>5tbGWNFu$dWbRBCp;duC;D0T7qm>?K6Q3--Nf1_bOobc2}{5>1-IYn9AB^L#@Om1gkGn5#~KB93jXM6^Hl zP`q}b^{kBu!GbC&@l}K6uod5X{h~Z8nz4PX#l`=ITnF=3rFQ?w+f?cHUjukOZB|U` zVFU~}+5(||FmS8S(p>{usN6<&?+#zR+o8)|O%soUEez!=lvA#F4 z|IgZ51bBTLQg4539D7V`v)OFwznwD#_{E6CF*u=Z##cGFRFCkj_0sj2|G-AA&?tov zFUWgQu_j-KK{%m+{3xMTXXUl~|QU^P~C?&sB zFt*%ITsal@G(9*FUm)`5h}u(m7%%)GsK*?T)!JtJ&02w;;8k@L*up17nh@?g@Mr$G z3IRa&gs6hHy+S=gn%A%6#2~eg0xSsS+Zn6^LQ$7XPTioenXP5xEK z(Il%7&nDJ5wuR*gIH#|EBwl!^tRP%&SaSp#7F%d9ZQg^g9%tQ?V>gCk5iy_4rnB2# z)#yHSkNGw&o!0T0vgJr+x(M)I0CRw3zyW=RL5bhXPOu1#D_CBa)x3*Xoe`6n-8&E@ z&_{>VOVRgLit?19m8?p+_Vkb(Abm7q8s&u~n6@iYe)~*kYhtmD(B3u=K(`ZvjPGwJ zLVm~&=zghT_7iV<{|yQWCgkvJZ>Q9gBXW5ITsu{klx~)XY+>y_YvLm$46+O3Ssg2P z8k%!Fki!L@J7P?rg0Q61j22^5e0Vqu=$1;YR`CP^!EX9@o;T#EJkJ$8R_UklNF`$C zAKxd!ks~>K6kd-*z-QweTXUUEtb8RdJ!VMchs1ICLcm~gX@&;{{mh6URaF>grRCIg z(ocB-(dd;(j4yn^eRumNYJDZ%KvSaRHYlq@yl@V{1mNF#usjDVpL?mW45LOc7n$Q| zmkshcESwvbe?cyY0xxDEHbw;_KKyt^97Uw-ZX{$eeSwNem=fB4uI4<6te$ZX2;w{& zaJVuBg;$tor?j>hCEg#rtc|D_{#pIa$AFOT`VmV>nL9U-Nt5eh7MRUwJo?JEzP=m# zZPPuCNiE-y1CoIky%d#G-~8Scw7Fvi_vS&xUn?Okr#_O!&w`1!udPY}8-6{CC=_#^ z6aP5zXt;dv-DwpAQlIJ5RMEx_wM&$wN2m5nHJ?wocP$7&l3qyTRJt;>+aB>i79%f`1(d)z>tupvpU9+Z^#RYBaHKg|O>W~Soyg}+3;Yt`z|c9Zous)P=tKf8 zZ*cry`v`j>LidazZ3N5{Ohz+ySFidY0RT8IpFzlzmsdFi0m^D?M?vbyN3w_DP}PO9 z?aISWHW29A&WRD*Nbf&g!Bhpt!wakeh$KvVCx3()Y#(;UBb@l99~u*KZP67$m2XA) zFJj{FW^PD8bQFj4pku^<+jJ&!6=KUhioyC<4?+`~tbX8%r}_)CkJ1Q#yFbr{$>JNn zhFh#^wu8FKMn36QF-n_Z2IdgIwEiYS9wdLv7uZ5INC+LDPJ7^vfcXK;ujhoqA|uTQ zV8?x}uiS_Cqf_?T>a!J=fza>1unkCotmHn1kWN5=Rrl37beFJO8ogmcb0XTJ20I{2 z79I;G!-#7K#2h{>NEA2bOnPI^t>8`AkNV?(D>%wiru5-=DP?4>e@o++Om|pieSc=Z zq@NGhoE3_*O7ujCSAM_*uTkWACc_L+n1$U=m@n4rzR5_+KJan~K-*PQ)oEOEe} z*2re(49h9z<|4p#fdqYU{6RRreD)X974VTDRj`c^KEmrl^xj%3z#tH-?7khSmU5pJ z;T_@-(_QH+0)6Q|%4Lu;b=awSuh24n4X5X-Wl1*0w<~ivyQdN4^O*RP>RQXf>Z9w0nk#euSy4|e4DK0PCt)XS6`TdDam3V zdq1z7A@QVxf16KbC3`xz#!$0cocp@AP{v=9r6{UbogFfy7)dp}tu*Okzuf_Qfc_K4 z-=JW|5bUc`AfhoS?FSKsAkWl2aIXwfFBikRAlU@kj|Rww?F`-P4XY~3 zu%{NTy)i95|Ly(bX9w+Jj1y#~T(FPNh!VcO)LsCKVOr{%=uz)m+uJ*O8t~Yt%si3+ z5iy8clot3|H2#{HAPJE2{=)Q7oD1RtY8sd_J=bWmUFJ+*ad~bq90S`dlgrhavwa1DKaLks5KrjZtETMx6yAWoipB;9>EerRcL3eK8`+S$GKf*8@t@5+^@FFm zEAG!dr(!!$6QG7x{s`ntX^G&>3-nwE!zTdGt_Vx`_F(@X1i(L_b~$qFSQu#I<$!rG zhLP;juF%8SPIsgP#yECkmtYvBJme!JLg~}m$M3`bF5cs_F3NOb<`xZIg(s(^6pagMomk)QNJW-@(TP~+IHY||R*6SM zN$Q6U@+FC5bA9jrUXg9$WybnsJ1C}VC1ex=&sTtc5)((`aV5H?pfUsw6W%#{d;8gL z3+OD6g93zoss|x&2xr+5WH)xBWS{VL3EVbv2l=Bf!0yKQrSSuE!Q6~e$M-NSTZb@# z$op%Ch6gEz_QPi*pvvfYR%&KLex* zU^7k8bL}VFQ|U9<3|`;h!^0raR~@aD`*O}9tZy$=z)c|ZM66Kb^766?Xb^E${enh% zn0zxYHIR`#EfGBF?QI$dt~NeBasaqxOEu7$L^Im1gY z4^m2m45obEQGGKb7G&*-PVP^TVyA0+{!X-}A5M)m5&7ZUagW^KTejU`2 zSJ?FX5QZ&qiVnjgBo&DY>`Heq1Zg` zStY>m)g2~2v(`|EUsf+thD|EKaph3LIG3_qm|93pRt9*j^Hg3YZ@^3|89B)L-`*Iy z2XkvQz)1MI@{X3`o&E2kP(2480v@aWg0Oe*-W}=rZc?HQ9Rqqa{L2!@ruyDZy+BuJ z8Njqe@g`O;BpEVE_d@0cF$9i%{@A={u5%=P1R8K?*1*!}BVV4nGk4+N zqfNOSc1j-d*c%~BsV{8$wUb`J$^igQw{7K(5*LPOM-b#npo- zDh?)*IGI#E-nCQqb%E?rOi>w7!uzEg1U2B7K9{s4fnZWT_C+jMJuyE1PgD^52wh`C zYil?p+xkvVUZIWa`EZL2VY3G%qYWf;yeph+Q9xfblnaI7#gD==c7C~CY80{5r0f5! z3%vRnsBYWPH;a)>alA%-#rP$Bzj~m{c+Abm%z8xKR#H)t1qACcK@O%90La2`VZh{` zPENM&1_TP51E@{tCePTA*6?t!MfOUsLV0)tPP!0d4CXc*pn!C8&q;{oCXc(#-@0`*;>{~s)z7Lc*%ny$ z`*)22(n$Z|bnrygD~E$=@}yH`Yf-A#-FWsUBrfxY$X&nQ*vvHCwmceXGannt=lp_c zIeM)$rFg)N!#?*h9AEUl%mRZY3}$0T^sjujw^9~|0!lXW+!W6H=XpEJF_QFI?yR|X zOM**U*T#K(z%dNr!q1TC=xEs6mC;aOEY8?3Ll58muwvEqH*CS;fYpy{VVD_31oV=3 zY=4+;eWUwR(;u?u4y$4@kwv;;mHtK3^8*T*1@7wy<@&cO!W!=j{jjpcU`UU|hZYtV zii3r2>Dvv8$Rlh`EBH@$)8(PeXJ&g@+Hw8H3R|MkFb}{gFl5y{c^sw>CkW3|`@B@txBE6Oo|mO5 z*Vkj#2rQG$(Wx{!oO^eOo$0iSM*pDrPGVP?fxIjk6)Uk1t~S5OT2>R+@z#8EW$M@5 z95=*WUWtET+>@+y9tjD6M*dJVM^$;+jEA{?TZz@GweF>U!1^da`NGc<-{siSvZ*Jet^Oa< z-ZCnx_Kh1IEJQ^VP!tdpX%rOcwh)GtZd7vU?lMtOx>F>^A*EvoC8R-zZb7=cq30J2K;BXMC(;OUJ^-j)EUVUL; z;6Gr0 z^70h4`Qrn!m=mroz$8TUmk7}M8Y|QOJUC$U=heK}^SvXhM>+2%4hJE}+`9qqJ*E3L zqCSQ+hyfcR4IrD=Lx6f*756Gn!D5?zh&-BzC?f~c6Z*TzLinEZEWkQ$248Vi;gc&1 z_XFwa6?r@!U}Z+2-IKPmjo9^qe8Rl}Fju$@BaSkJ`cFDI$p zcylz=-{1cqaj!?$IeJ*WUq>hQhB{8^G3cV*qNAg$b9I&|jfje49?24Tk?+~tx=~kC z(QDiZlqX67m;U7mlyrb#XyGSlzA4U+hQ5V}LlV2rfrZ(7BOsCyaIna6iHj|I-a22# zlrxK5%kWJQXasYhPFA@HI-qD#kET}0Lk;1b$TR)T0Fm~F$1y(%jx$wScE61G7Ie*I z!u^Khv{9&MBYzsZ9`+CNhvS@3K3{wlfH{%&V;d$Yz&1i3JANEV1ql`I&bE$@t!Lul zzcVB4YmOltja5k!E3$dax8g%Ru@>s#w8Qz&OU3zN=Nw*A__Vmq^#hDTrbk0hNrU5h zI?_{Cd9GpFPyk~SS3tuXu8h^K&R`SKaN-J1f>Inm$0)EsbmxYST?lS0RS|VGQ+ce_ zoz((|ILe7Mp*kh5+(7w1`BuB1esM`M~5=PNO7F)3QuA(QwWCqU2QUwpXnB%uz1fB+~)epac~7ht5REN6irvVMxdeNpY;vPlAx_{1Y}jVU$9N!g_ULq{tNQ;TVU=8w z#;w-)-Q*jfFDp$d!RxMho4{N9f&>CV1py@s1#s>49( z%=8ZVx0Ed%L~*t0Ll^CqKU%J}`MUEKG`m34c1Hs8_HWuXwuOd`;&UQ;)kJlB7&T(L&iwb!1`G~nZHG}8$IlW?_Q%F;A!pewS+n|K9@?&G?iY*``RPbd0;l~KA;IQx$kk0 z_oge1e;>;Yi9YOkz@h@1d0uJf#OLukrnDx7jDUU%?-G-Tw#~^iNPsGo@*|0i7Z+!z zB0GFu82|6y-YEFI-g9le`#}bs-#__xhWR!AZJ(tqJnDJDD(m3+{hhngAF7@e4t3=C z6;O*vr}LEeSs5Hh3Gi35e1BkV{6{E1!fxA6oo|2>UuM4V z8ehje^@i)iStrj2I#H9L-O7OcIypT!kb&dyFy-kd)PEl$Ei>D|eNr|W;o_2ZGket~ zHuCunM$|CxM5l#G@d^>D=`wuq{xu<*o8I&1iu>fdAk4G+b-t0wGvDkW&$SO|t(;w0 z3^hJ}bbC?nl0YNuria@n1it3j&upmh_v*V9Wm`qAKwO@3p6M0pJNzpp?I(mO92&~_ z!h`=Su2j(~>O?~WtHt1Pj8;+hfuF3tXN&RPLvQoz+1Z>g3_4L zNKQ@zj#SxV^CUmb_1lZPDk2B3=DGP`$0JJDWmWJHk7;AAf`uu~q z_jfaV1|+DZMsc09A`f(Qrf-m-SViHt9T&6_(o$Op_y$j0{pP=iClClzX2HtIvwcSc zb0N_QFACemQ*Z@ztA#43Esg&@Juc+-G7_pEa7YDSPI9_R2FrQ=Duyl3VD~0@r9nh% zWxuW@`Y(~Sf2?mHvb#{QlGh>38~%(j;2ZGWvS7{54*Pi=VY#HxVr6aP9?{Xp= zK@-NZ+nG{!Q1aJM-?Nb&c^9)nBrPjl+&{Urz_~T3*kfe?ktyId?`Vicf?eRF_}*v# zvXlIncxMSmB)vtQg{vc)7xI!8+i?tR-Mr7=P2o*XhDWFt0!8D!r~9_M7Rae82h8w% zl-7L9$8BvL^9Ooi1Ku0$SRBF|f%F$5%Lr#hIOwM}2Hkj=qF3RjUa<%?PotqS$A1C@ z@81WFj~gNh5F&L2QJQmjcsO_akU#QLASje43vyVAizg1S(<8W zfa6W98H+!_i+9?+4{y@&Sp)$mJmw7RXT}AQ%WM>0x$#y#DaJk`_r3`txxB^)q1>l@ z3Z(<Q z_5gRA6~LBxi9;=_8MM18w}pVWV39pQ3>y280f$4?Iyqd^v}q6t{;@?wn2s2tRc}w~ zsGf5^=8@6SY>=4j@1Im;jvLy2Js-bTAZ0As&F7pbfe~GQg44)&U2`z>z5N;L+fw^8 zE-o%#_cL+a9%xxvp2*6|O1?c0504h32M-=3SvvzQGY_aK6wfw5W4bqC`zz~!F@bfY zV<92FK+~?Jh{9Q&%Jm@o6gfT3ZEw#slFzKP3#3<3l-;Gb^_yod{mm>Y-BSxcfy!&A=RQHk@lSUYohOB5A4`FbNR9764BMb7&qGAUP=3~gAnmK&(4CIR*T~vyd-iI zYu~?1uqOshRA}PI8w3Yz)*H2Bq#`E^1(hZ4o;=#U@y1Iki6i=$&%Hxh;oUvFom-tt z#=>y;tkeLpi62xdV_&zgoyXnj3Ls9cc+Vg>hg4f!Ihjn7Q z&y0hCx?)=@mbs}Lv(?yVDXwivX66#=KzmnR#8Z=$3iT%rmd6aN98R1(*$B1tI3&+% zp0R2U4c3wG_2%o-prgZ)8sl|#saU<>n(Ml{RFMJ%@h*8u=+a)U&V|#qGeV|V=SeQuNW*0D)+7lk7Ex_Yd9PPRragSa=5 zKqk_%=ty}PLh0FL=3XOaEu|4?62Cb`g}g+S;;(gSm$!U7)WnDaIK|jh6ZXtrw>nvq z@$a-Z$U_N?3NxT0yB%pcBF=~-3HG*hunjgoE*=KQX0N>|tc-9q%jY*A_gsA;6G)tM zz@O@3w;P6g!6r)4>#ooXelyKPLWdKTx-*hN;JSCM@Bw5fpAd=d6Jb7G?hJ-ac@Oyp zgn3SfJoTiuZG(^c5<*@WPPGS0*DmU37U9d>Wd@QuQp`fdkW2~1^kJEV)!6oft8DR_ zLnzr3C*v}hc26i;)avyKEqFIQH-c=K5J%RqO_X1q5PH^E?T^QC*wS%BcV(PfxA7@h4TXBx()mFA2zS{%*@rZW!cM{cUCA1}#MyBu zV3A*8pPbGO8D|?W{7NZFw;0;(1xLZ6UFBHM4QsFa)axFqIyys0vV%fXj8Z7dzHlrX z8vn#M;MwAUmmiy*b!pZ;1~(r}>)w`W>^w7VmazbNqnyFYAL9eT4U~`FYq&dR1MgmD z69!A{z`@#ZH*!R-odXwn+nMdeyahZlqu^v_m(x*@aavWVe)y?>tFj5pN%>mbDK30T zoi4Y}%d_K|>mTF8?+yPR^)+#pOI;*@ZUj{mMV zzz6R071Kal!+KY}MbSvF$fI|gU)xJhqCS5VF1AjZ-(I;WE#sHhpZ!vKZm;sq&n6_1w(mpMuB*`w3R)7J2c@lHbh2 z4(*+KD?RXhMEdQo$^Whx-gnkFDPay*#hw>h2-y5E)_+V-w!{B#ee>n55A~ed4}A?& zG}Xn3`4_lu6CWsulpjYLf+*Unu(}d#n3>gS6LX`k#nZ8#!*o{MGdP+QHzR#SKf*{> zNw#EuZ-R+rL~y{(*WaIKenWv|ZY8dyq^#fE1@cG{*uN+O;of-T(E*!Gabj-Y)aWF8 zXhQjYD^u#~QrI6Kc`u0(h^ME|)3cc0PF&=5Ao zY#pZ0pHR>@H95ynbcZmu6{e;OrmH8?op){_WtR^Ov5T+uUZ zYI{0^B8-`P_sE?(*2X4BEsO6SL;bOU3-Ne`%@wx_#dy=UIUW&{Ifo74mp>pYQI~2k zXV{a8Wjq}8iuHWyC?vBc%p&zRDDA&X_z0I!L!9s280mk0ylg2eX~EE@_)Z&y4kHP( z7h$v-0+RBFf_=t`c=gAaPV0}IvpjKWV;}){vzp~PRpMcpx>!sxOOO59tZ3Fa)H{OK zu*YArPrcV&Gh8aCVie>XH1?KS(@veSJi5H(GwXB}UM!=NqZC0k>N4jWgzq_xyXhrd z?bSIH^RaV>0!#NrCtIKJmaAZ~^UGGT9KWuVK1+HjDSzz+BziPa!>^59Qm2jRsTzox z6Lc-GHgH|soQ&gwk7^i8mc?m^OP{~xp$wT|rgK?|)I!_Ml;dw3&AI2<^P?9EwTe0w$?pmtDCm8FQweY#!KLdMjzf%&;^kw=v- z^KL6PERY6$k2ZbV@mn>qVMcC5T2d>d_3&4>vvh~{Fh$OpAO9ZS#KlpHrqpZo3`V`a z985R*%9dWw5=zo#z0xyW+{^lm;B@%B{6)bsIGIB%Vp-STQCc|mVEAQW%FY5kx{KLU zpaOOXvJAp|@{b#XymNwjYgJ-BEo<1D`HxDTdX#VHK*uJz8KU!9;)s}EY^x1TgJgEL z;X?c(%%tw0E<1A_5$G6DsOugNTY&#>{tYLP2iK}XmRy=(~8C=dV5ii>FBlLhS!w}4UDmN*`$JWU1LFsr-lu?);aj}|`)d^flzrf&V=7Lmzdfy{;~`C9?^={f1i(+f%W*a5=hg(ItB?Lwyruedcc@g?peqVTG@I zuTY(D&Q(opnrSV~(ZPCT@Z3?JOE1302x6K+Cj|UbQWz19J?KWdlby6NgMRPW)D#O5 z5fL1=ZsLH3KsDH5gi& z981+@PjoJ_J|9X9{*!i4SNGxQ3USjHC@Fy?5%lrgKsXB#rM#J$nOYDHHT7%(5hW}~ z+;)n})xEz?J5D>JB7ryjm zq=-*!?`(?%&U6&LE8kKi#!*XP#Guh|ozEk1K5iwdHm*OWy~*))ie51&d7rmA2F&tF zr4h!tup6kJwvmw$odl>O0K80+h;m1xr6adY7Q!IwZqE?XXWw>d=-nG=66Nol2vvdu zNCF}at@c4Ft;TwqVH$Qk-)`vd*fqr=PJ$Tz&f1;yA0!wpU-+!bZmNq-F6EO=%vBV-dLtt}T;*kR9HC==J!0s^<*sHOqt~(3%&v4+$$$Z_wQ29T?%tUet4ib2;`uND9{DcsD_sN0zvryC&l<(QEod5bf5)OZ#5a?QA zVHRuZd%^53fqO#=|bCr=5@TWC>xvYR8|q*ZCmQE zmqDsiq82{}K`d(Hpf z0XzGXdmc&I-YD3ZnlMm|?=;dF)nzY>1Y#7kUU`V5=NFKiW$!{3W6&stsrhByQHVi? z*l&g4%*`EDOUA5Io|tr~IH9GzeZn`(X%`y8u7B}a*-NP3^Wk_A|OzWuZ03$7~!ZESq{V)fZ0!qew7!Z9v?f90k%0ie(>TUXnP=hr@pB3 zvjb_G=IDDSEq6f%F$fTHPXYFn0)Azyz~GA^TU-0GH3Wd^mCelv7}hkUNQa);--gkc zA&kfn;R5>u5D)|#X!mhYFL*1a&Z^H!^|D4vS|+lcYCe=?ZF9U&QD9gQIPOFElGFxx49i#X06p~suY@=e zS0x0KHBfBLe_ugT5@2IJy4=>oB2ZVq76BzfavB;A1S$o>nvF0JXf<*Iem5aQoeOCk zBCab?FB^gksNL>51{o2qFOBFU7Qa^JZE=EWr7l3VHH0A;pMl5G!4@(Sy1Tzt(+Rhi&jz=4-n4*Q=f1r7T&-Qgc&H z|KFSN$j;)8#m=N&pXeSY_74vISI@3S{E*S*nBt--Z*Xkv#_Yi2;v%z)5`v0X$rD7tV~uy-U$VE9v&5FcCtf9<6e@wJek<`GqvRu z7{8R#ZiXo!mu*Tdywo1L z`g2Qr!b4Ump}y=%Ej5wyU$9t*iBI5czEF9fP0j@}ma&JS`_%Ra6`u)cwIAVa|cUdU*17Q1)>O365Zx+PclHDnGTw71FXksQ%f} z)-m!_gaYJItN)!xhV!d^bUs10I{q(Fy*HLG=qETT|6xJrGp79Pw zLJO@a;g1oXttKY>X|klTTkNLB>gFcrhHVyre0aFp<<)V@ec0WJ6poD@P|1OnyjGON zOG~q~{PfEU3T319f>yf$ZJ9OFgx$iN8{Qx1Sje_4q@cGh!6xG;b{i=tGmbi>yFHyk z<23m1w*P6&F?)#Vog$q%Bv{P|yx@chgAVXv(6RPOo*@V`uDQ8+e=oP5?q0Yg;=C&N z(1z5}4*zKk&X<`2@w2)MR@HAvm`~$@C$(0d03(i%SMFA4hGARV^K)Kd*K+~3llG|o z{FLMb1^Uh5on6Z{jO)U{ZF0Kss43en_PvIIhXXQ+PTilD;jnB(%Y2B0@^QQ+f_`Fb zbYizzxZOb1gG0Ko+gWDA=^^81V|THYQ$9L_P6L+YfLTMZHW@vbWge3@S_&~yV4Y4z z0VxWtmZ|YP?e9z{9@^b9sp#Opi_&;Up31# zT_&qvpF`qfwgF}vgYi!ESp5(uVEX_>A5Gi@FkIM-m5q(?iRQ@IIWIVvCT(Zdg>|3i zz+D>0+z6tIYym$SRz45}=9AGWGX4EU$Kyd%M8XYyE>YH{_I@Uk#%`vRzQV5*tV`mZ zPqlh7bkhGGS8UtuuC0yw89gyN#bv__EvzP-T*o+czmS@!vR*B-PtB|V->xF$x_i>r z?y2eiInI&wgFv-v)~v(d-%d)*98}qLCO}G-q@k7@TRi&4qw-neyl}X)K8rq=v+HQv zWu$#*>-;wo5Hd_`_ipMUkT8~Rg%GF#Cxx@xVA6^kw))m-Dy*^pFlM4WYClkCt9Hvc}M_mPU8i+@|q|g<1g)>!z1#i9KOy3 zrFug)cv9;Hz2l45nyH)~Q?!k;3XN;MP0xp9|1STEDE@#~f2(v25;4|9sI#9Dx7Rj! zdk?VWcVCMPEBNRU*cCVPGM2ib*||8(uabuqnq(}g~sDU!LNl5riyR#&%%Aa z7j~AA&rW2-7VlrjNV{%nXR2%o;kt}c-V~L{=?qo4aKf7DUJ$#XK6CYIp3NF&XRO#W zZ$oNawLL^lXal4D@GwW8f&xs=ea6Cr6PTwqIiaLvAj@f36W~`6#|=9LA+u+8HS5L> z7~jnYER(2_D-*`2y6VTh{WqI)-w-=v zHkDFL{T*+9yEoyh`h5A1gIv@z)zS^%T3K&ZW9_6KraA7lH7aBTHtm1H zGTywmmfnMT%A!cO)T46BA(L&*7jj8S6BTr7Ei*W(_DvqxavM zmn}4H;A3%)KU#PFGid0K0lH{PVp~N%uJQ^O^oPPnoa4e_48WL+Qk74C;;*<BcHc50($e5Q?{jAwz(R|w@39PK+oHF;U|ihXJ%>1FE zWD|SI+mbplLM`A*+phq!eBIp22?8qU^ z2o_V=Soz{De!=1;{tsfMr4l`BXRU7iklT}nUKrCiCl*`BzX|{_ZTbS4uOf^YnE*!K zd?rrOX8-N@i8eiS&W?5eTrcauV`6*X`l;Zk}P0OgjcQ>p}zyqn5tvbp`m zU{ABM{On|Z#tjcUMJ#7+^S&I`@Gvbj&33!+7oGf2jBnKUnKZR7#)1%q+(5wHm;^&` zupPxu5LPzqR(|;%Q@|pvaaEeFh;+ECa7k|pvLzp-tI&}RkiZ7OS}Gv=W3JOlz9}Mp z@8921CH$MjgIc?F9?MAZKX8Jp02kUj$p&6kjl|QEId7ELdU~XA#Gv7*V0A-R)(UJRiUHDsEuSyz)n= zJT{}}fS#~(bh%M3nM@|*K1HflhA=V$-thw!uBxMhCFYc6I4kF}@og$UO}%dbSU7`D zLhF9=z&aFtGXy~Gt*or%o^gTH{^rAX=Ym1&Z)J5g1mONr0|a#3eBMYm;y4RZ<&@Ue z))dr;1VTu#t!2K6pZ}%=VFe_xVk@P2&ATZ97Lg$)jkqd+-kKgjUaub>9{$6L087-u z${b*M+#t+=0V@%3k(aLXyCip%3MuE5+XzTDtb&w%w0+cpAX`iCTqn+;@(9Z8mcQTP z%u_p-)}vm%hw2=P>9!MUyB@Pq@5tymP1@pu^8%V!goPdWBrogWZ2BEV(tq`AL3?H{ z=0q&cfxkGNdE)_lSc3q(Jq{n9vP=+iH^?15Ds+T4v9<4($Qy6<(hqpcVdnr`x5piS z9;IlC!C(-LAh|Tc4d_%Bw(WvG(Z=?GU06Mz?qvO zB7-N)5c!NinfAApVm!YHcP!wUDHWQjvSpl3L`O%=UK60WxyGNs(=odl@5i}rIlV4O z8VhhXPJSNJ%i`9Pk;hO?Ba}jvuR-?ap#gh+teoD!78)$w0ZOpU~6s=RS?5xxkC0a5I%hJbLvPAHgVYO38DiI;B2WWrLVu-Ha0ypzU@1s5af6K#W({Im>p0qC4 z8FiSput>5_e!k(y{rREXOiyJRPtLUl?p7G(^1tPrt(An4SUgG07kP`2^{|o$L+{k< z%#?8QRL}#~WbayFxRhS_!chpt`j}dT>2W-3{*+FJm5#2i+@H{RwS{spL@_?2YqeN5 z$C>d*8p9N*#^DLVTxvf;2?Ix<*)k4kei2C`Pv^H23TW&K=K4M0VDEsf%L1KP#mY|_ zAWo{2-r^X6G*NP*;Xz z>Y${;k~#`LXx!%Aw~z)_<|`IQkb01YO=}3ivo{JQPNC|L8{T19WW}-7W?CE)kUAPY zz)JF(TAe|$iiiAdYfeozpCJ6^Ww!AX#OHrko<2uKg}Xq|IX351NiN`cF%jLJ7y{tm zIPj6U0S&iiURuy4l}Q*?#yc%o6am@rhmO^7xnK{PhBSP0X~a5T)P33TIZ2U&hkCMT zlvUYGn$DIexRp$Dm_(^Wp+A??nFANx1Aydwd*Gp9%DIuNRgHxafqmvX>oWa4DI;fy zaGA@Et8p5KmPy`Z)1~ZL%V1J3m$uYh=TBuXst?_A;}O7(rNCk-U4FWwQk`bas#CKZ z;mF?T6TqA5?W?6E9(E`P&$lyYW?Jh*Ik`YxqPXJMIXu9zB(l!K!!;qv9C!@9ffPXj zl)#^`qC62vON;n>V(O0jM z(^T%+{c?~!jx7u!ch3H$JT2R+QtVF>TYlX9?psh&Q$+eg)nESB2M(wVn072z|B@Vt zn7hR6p@nzKYUQ(hl?@_LYyncRd=7*lfLc^wYOG`uQ{uWaHACm@zqAhKZ@tX(xDYW= z%FYIELwCH3DK{MzBQA)AldDrv%?y^L4-%5n)-ClrGBt=%5}IMb3G8>V#Z9TnbBu&_ z3oR~;^wX1-l}H8xbs>8X{yuwGMcW&>GHw_v2guU+=jfCYWa&FpyKgzDmJQ*Zsb-4` znxxz>VNzwm2{{!s6Vzy3ayfQCE@~Fq0>c3B!aA*6$qd z-!HYXiPjPMCd&|*8L{5^=9vCS*N`^S?Lu#4M>fG9K$O)Dg{D74`Pd_Pf7xj6$4K&X z@9q3g8fzreYyz~OoKFgoe|EXrg?>dHbu0}ydLgt{M28D*g3mMc{52uNW8r`$?SG@- zxw{?=qIxl(rLlRf(f8^%kI=HqRZ>fussK!NGgL>v@~+)TW8(VTQz z&yQiDPM22dY&@pl0~qe;2iWJzsc!sI5}%63W*0R>YM|7ub#-xxTK)q@Cc!W{hzXzN zS&kO>t|SrW@yJ_0WIIiYMs%o=wrlC4b=3hg_$M3h_QJu$4u@i5t0QDxjL2bzb0Ykb zei(;DW5j*U*05h0O}|8?@A3Q?V^%LAcTVL8zyNP#kQC$bc)>(O1SL9s3qWvCZNUz? z*Y!-WhK1A_ImX%|)jrScbWS}go^dEAoJ#~~rtGC2Xa%*-8I09_7@L`4gXE2;-RS8a zMo=hH_Mn8E=>dg?uKZIOM$P`KD0JYVSx1*#K_jEMxBpC>af-}3u9exe3=&hw^&2fX zPAgQg1Gr~Hojukn2xxKd{WG-hemduqJZfUIleXktFcnOwd~z~toox=84y5a?ntAD} zXxVOnK6q?;MjqXZuqRjFZhNPSzrMDzq|crR4YKTzFADnSW6$3T_4hrz(Yu#^P+vRj8@>94tr!kcKFAF@ngC@#pu_~&y|y_q$j@7U@n|TeGgBN>2H1# z`_|mvWp-%fC!1lOT2#y~GESc9E2xl8_06eGR2y+O3s@CbB9wA>_;; zqsZ6$WE6ZSdCN6DIM#@HP+q5ME{i7mj78pWhbGIPugcReBa;nU?)|Oxg>98=j+cePG3jZa zcZcf4Q`kOL6QLe|IV(RM>2>Fe^4nEyayp40(?=|4O>{fo!gBkN8y}(+k^{$uJ%JcHxk;zGnpyZJL&9WhRmiH8Y&KYuzj0%z% z9-A|nT~9?0GQxTdPNBjSc7OJ^w#tEZFC!Dv5@NWQMHB=)CTy zg*2-0VE(A&$CtRP7c^_2P^ZtG3j<=E@{YrW zr3aD6(>TIqb4T5o1Se&2iT3~tX}h*g<;*3%l77XE*Hhk|UvO^U8zs?~+_4C+CUC*n z&C9^DF)cR$fJpcgu^l8%^l;t!&N7B=k_rXIH7Um~Py=S(8aHu3#9@ABhcO=~9wj?_sx$@MCCRiCAvX(W*`>NFi7@=++*hFFlCy z_nw~cnX&8bd?Zr7QvtgkHU5*SL)!d0v;-KIDz*|xJ|fWmqAa}%EwB+bYKgi_0DHNN z;h%`78cZ?6&AQT&a$*98r+HRGLI{@vDvS?RRo=lhxgS5CLxz|baTLB$N+EQ8TtiyU zFPP^59S~lSGHo$ZALTit&Y5rB)0~OJ;7BHBH9Il3nna;$+|fa}XqR2}2@@gI_`?ys zX|xH{mg7@QsNPYNZ~n*CXoUX1$PXE@3!ZzM;oxK4H{bD$U7STeE(l5#>4pBnR!h?< zmoA{s|YePb|Z}99STc}1i+Bgu*v%KK%Q!}_A9A%U-y%u`Y?YtD zLVkZLV6ogj`&D zj)Ww)58Lc&EY4gtu)MNzH_>m(uvAwx?fPg3XsE}|Z34+f9keG%a*z8cO^h*T!)rV? z%92fYs9w3nJA!wC*6M`&(A22AQ7qk5q~kTw;X0-xHj^3kN{bY|9q#;tkQ@))FhZK> zmc!jMD2bWBCU;Q1fyDql+asX>)O^8sz7sQLDc^o=6iqBLTRgYZ)hl^U;IrXx(M3CrO@D9ZFYx<^Z?Rb(g%V#A_cnxGC#l_ zzSlmNsb8gsEC)obJN1R8zaK1C9eF{`-MFz00@V%BBWzjN+ucRfRS?-%@(UNfcN|C6 zt><4w{c-UoJ}%)}^qF>o^o@f0U85#SdrfFqtv!P748mUk^5r7|G>ay}>$H5Cm-`rM%0xMfvT(kD)P)ftz z03fAZT6%_JT}lf}E`PZ^!>;E#aR~<&iYl2JPoeu^kdRVdTU*-zMHb_oJBq{ber7V} zf}b=Zv4IpFA~0artT$J}eK3NDityGhLuQa)0fk=LxaI#s^X2w?q^OB?lY1anad`d| zN~*MpW_rir5(uR5a=m$_0c9*B3yaLr;XxLPaCwRGg+ZO9KteQJt^ymy1mahA3l62$c0k$^Cq4$9x8KOJ=|N80r^hZ zlM+wG4FOzin0RgV9W;EKj}EuQXL@s!%R!k}?S|U(i(;2+A&tXUB+h(Az8HDsU;ZZX~*~wP{Is0Za z4e}NNWarZ$qEQH^p&#D;cNyRBHQW`XxR&vJWuLcytn1yg%e$U>*CuZl2Oqcq(S3UM zIsy#?e$c)8;r8}G2e!P{M1Q}cT21ZqBt-}LA!hz_X&AKtQG zrKF@p>M4*+P)#S}S*qYfT*H-Zk^?NPXe$Wyd2kOTs1PAq0?6KXyl!u8%^FOk07MDs za>ph%gPJrVT->rZ zcy}W|E+aCxk+8jP0-l+;fo6Rw&+EeH)?fY<@Z|DZDq1Xu4MF^{>n@mCOSfAx1tJTn zg9q1ys4fY_!3ZMA4Jopd!bnuce9su@3)u89mesSdb2E0Y%JoJ^c<7k zS6}yFmz0a)xf=-)EU&K^%&q@NJnf^+*|QVYQ-7Wgkq_AsO}7;k6!OteK(TfLrT`Jp zjp}!oLMd7uoiF-T<*e_%z}vCE3BQqBS@hr2TAx}0Xx($QA{x+)rWLe%1$ zmM`v*{0p}6k>CK>1TThQ73!I9)$9DTkg$X8vo5IF8UkUkwDRdOpVh@(r52iW^&Bg) zE58n`D>fo%0R`9a*SWE!rRCOYR@ig<$(CS{sW7?So~4k-$@>-eg__SIs*9o=h>eKg zm`b*eCIoaL<;fzq4YM@{SCH^(Aq@9<0(uZZ;^EY?Vj%cG1-CjmWgSs@Wl3-EBPFj| z)SvA$Yx%B#=UfGWmgc{K;+%-b@4(pD*tq`DZsgA6U1T7lKZ)`&Kho6ht$K}BNVJMr z=~n1*L>CBoAC~VpTUcc7e3qbk53iO*!0`!Ep##m=I6!sq%sD{{#twQCyf=_))Q{($ zf7fF61ASBsqj52$w3$mwrBienRIfQ7e?3YNcFw*9wyn1=Wsp)X;g`f>sa_ElSG2m* z4xaG*=zOOiqd2<)@P9=S@mPC8Vh+4&5y&eqwlhv)>+Bo}+Q+tKM4u_)mBhh!ryWBd zXIRkHw z;s1Z1*b2b|N!KO|Au4ZJ!(a>sVZr@{=FMPC$XGn&6kCE9{+Y7^SW7g#ORz+b;)dXq z8h=eD7KC6YK^x`S(&*2~v{KR@?$C_;S{MjEgZ%m$(qU7*owy0HYn)h0v{ z3J#cX03JSc+nmR2-P=M!E0CireE%h}k0;=h@+r{GM$~iG4gil@dl3Qr$r2;0Z1?cr z{|5(lp-FCb_9kO}AmrfQ@50eE4g|~)P>2WZ3qtY}GUS}E8yFZ!Ck}YLxfGu29jeAV zv(-<`26Z@MxNVPzHR5*Pw15+{y?CkvCde(0h#xSJJMV0b0O}Pf;&@=+&y~P}Gy+XF z6^@AiHbeaZXhf@n3K1Jb?UF&;`fHj4;K$aY0Vt*$u)FyNWIthXLa3f63qALo zTn{#ST6bK)f+`h`@t*ZELhidaZyMlTG0-~;9#1?5=gytuY0s#v1U`FKcJh($M&UOo zD(y2XFLS7-8$OssCW1XMxHlpiMII>g-MhbaW@G#3xw*Ojxh%hY#m8dZ`8Ak?sX(C< z5|EZy2Ty~XAMY1?_?xvvQ>_OTBL^qHm1Qd)? zAvY$J+M58ufNu+DfY=(y{z?L%D>0b8@CPc?N3P|9lKfz~V6o1VnO*>@8X@{l5a{|& zP*O8Ydm{Z)zQ6-8So>CXyCU$e!Oy4!&D}}8<5U%uo2*S7nN97Gs>``t1b0xY4476j ze-*YJdqYyf<6{QUSV6uUH-5;*inuI)c0F9THE+lT1weaYAxH-gmP&`)Yd=uPUHKCD zG^5oCG>6uv+WEJVlRl=hdEWo;VIc_UpK13$h#etF-2un43E`!31G*X*Z{7UY$+Ug0 zr`-p%{TdzhBcj-bS$N}Sxt8cnV2 z&QQ(x*QU7#dJrfZZt8Qaq(pfg&m?M2cy?rvHg3q}gT{0?NH0gB&yij(P+|r>#r06a z_s1iq;?Uq{7HITW8-&WDpMASAP)!nZ>4V-Z&0^KTf;F&cb_|4d5|>+3=#gb}#pEBM zVw)hc1>ERc9^eL@hR(PHoiN$Dh*Jt~=a*o{NO4`mRO2EgW!T0Nl9~LGrY}yQ*Vot2 z*FDa7El`aYb2^DgO&$Ss!&CBR{-sD=F0#?7%slvOE%}o0Nl(4AYg$h)v8&uE-Xq9x zMVkp+^R?=*k$ZiG)Em0~)&aNY%{lO(Mi9kCns}=?G*nETdU^V95Bk=%WTw+yXN0l{ zgeeVcmc7#UtR}SnYqyW5Z2M}msw=Z^6==yE$Ae$2VZ1V_S)rCSc)l8+d`x=23(j`H z|Bt4;OX}0-*SeUx1%gGI|GK7eK5FUHlvxmFdf$)=4Y9jlNO|t3rfypJ{@tSp{>rAB zni>_%G#_d3deIq~5mPE2m%Q@az>gn!l-u%%70?+nNNJ)xnqu8>`&Mg5VG}z`GoS88 z`va^W=Iw{!;UfrSnsOL|51PZa6DIK?g}Nilb2NJZ#Wy~wfUfcPrE_ag`Aqpv?e)w8 z=CmyUN;OWNMq{sNRdaimQ_oJ{)mj1Np|Df*Zt`Jj{1cK`OU+j>a&5U?Jouurr{~dq z-8u8e$Mb>9FrYH2q3288J(C+@uS@L^6Q?G2l9;#|;JX&8FR?^vha=zO=E_aC(}=>= zv^>{;KT-S9QCOax*U?lsKc&JEb?b;YPh5dIL9@-gt>@FJJV1GJbh;9uz6T>2>!0rh z$E2zN24Ya{3khwPN|b5po7h9DW z437X2qY)nz6SxVqpebS^WzLA=42S?^n?&a4$C|8=43=a3C`n%umclvng4O>(LvqZ^Q8~ zmg>c=&QK1@cIl8_&|A4=y}c=o;dPUi4?*ZM5%$bj6*whcWGJnC4G+%?+WX#@^vz2_ zQJE=u%UqzB5nhb{u}&FV9-YR1p4^0|TaQCa`PQo3P-6ld9n|(Pw)awyU@L|n-8)## zp<#`ehnkr~MA27x-l&gZnWgcX(LDF!wbMm{wlm`enOPlmW<{q8R*us{Rrei>Y&V%h zJnv?Kaj1VVM5@7ZkeJ2)DJQg(&QhGn`-yOOi&hK zP!>K8Q}zzc+=-S^cGp4{gY$3px}%OPVK2n8EKX?CCb_vp6IlNRREe9M+V89OP#-g1 zeuCxqy$$wxVE_AI%)=30YlYZ}FW4dJCnFe_MWw zpi}U@GOzX|F*bH9()_kgGlmCH@jvVW^Nzsi$YkUPN@+4w$B!x%*@y^Wd?g_Wqj~d$ zJt(5mtBF*!mG{#wHZd|ODJjLv2#TNP;7Kx?z4fhV7h#H;+92&xutcxU`Nz@Lmt~Z} zN9jcgd3y~f#n#F>nm(>M5o~uug+tp0x8^?ETrFlsJ#&WI^@X#_-@vu)0{-N>*&OjZ zO6Pf5_qi~+E?qdBLIfLTi{`tTV6{5_m!iImX@PAKi=$~Mf8w)eI|I{z#;Huw!}01TdQ*iCZG83?ltWaW zABQN3jvR#{XEvAdKGw3~#6-vGZN5}nk3~0#mS%w#I%7lku2Y2R{5gj3!AGbxkY}=1 zfYi#B?vJ5qvE>+4F~E83ot-BvQD6Nv)RS8Hskrd!6=~cQizAF9;8HI1MvV0%oFjhp zH`?k!I?*!iHD|%f=_UB~{m8G-TIu2aSqaGA*h4p6+@9SpwhIxvnsnHD@ zSoQvlF%KTx1c~Jn6&VLa}oI#JFIma0Ch= zew!6F;mdob~1ZZZ$E3M8=TP|TCHM@ztmME85-ROrbqmY21?-C zsow`|1&((-mY+zumlfp-n$N0^CDqEV+^c1Htppl%AM(MsS`2VA4* z`KNL2lQ~nq+aGfU%J6?A#M6*C*T(iR@*Zy0R6eb_JOvXb0U2;ygBI8bAGfKlPAm;X zSBe4%e~j%fRtI$)fY8gUA2%0kxT=+f8`cu8a!x#L5}oLR^NHM<3}vRd=0h*i{W^vF zpn1^Sm?E_5NgK$uYc7He{}gq@?Qheba+hI!Eqs8LbnTd_(5A-BUnLFZy#pgzW7-0J z98@Zl>i9Vga|0C^Uq|rnZ>y>!j2>`H8ppq>{1~oy+?+SheMzd8cWWJsuB`z9RLgpL z2%{!e5GvB*1MSeeb9__KVZNKMcPg^TEvM2$*w<$eXkFZVF^OU~g($nC{QId2`va)7 zx_or5)zvkB0e#Kwq9uR=03$T^2@Y7py6z|?lqu+oZ;QIhvc*f{<3fw>lG)s@#mAAs zyiZejK6P#(2rP@(g#vV#%sBBTb#rZj%M6usJWeXLSZI>6$#%0;L`DRLcl*u4wU{e# zI=)m48XNOvZxV4>VS;y(>xY(e3yul}qev*-9+^JBM;M5{ljn^LfZXj+Zi6Z7)>~&& zrVLsCZGeGTeEJ>WyOCuF<~IKK3E6LCW%)*f;|p1gUl88+|NrENmu>ItyOruM`D}}X PygoFD@O4kX#ghL3<@yh~ literal 52264 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

9>UW# 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 OOYyFnT%oLq|NjEzF@FmH diff --git a/benchmarks/README.md b/benchmarks/README.md index 3521e21..362d13d 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -63,7 +63,7 @@ NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best sc ## Token efficiency -Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that exact workflow and compare it against semble's chunk retrieval across 1,251 queries. +Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that workflow and compare it against semble's chunk retrieval across 1,251 queries. **semble uses 98% fewer tokens than grep+read.** @@ -75,8 +75,8 @@ For each query: tokens consumed at first relevant hit, or 32k if the method neve | Method | Expected tokens | Savings | |---|---:|---:| -| grep + read file | 29,675 | baseline | -| **semble** | **567** | **98% fewer** | +| grep + read file | 45,692 | baseline | +| **semble** | **566** | **98% fewer** | ### Recall at fixed token budgets @@ -84,13 +84,13 @@ A relevant file is "covered" once any retrieved unit comes from it. | Method | 500 | 1k | 2k | 4k | 8k | 16k | 32k | |---|---:|---:|---:|---:|---:|---:|---:| -| **semble** | **0.686** | **0.849** | **0.937** | **0.976** | **0.991** | **0.996** | **0.996** | -| grep + read file | 0.000 | 0.007 | 0.023 | 0.042 | 0.076 | 0.100 | 0.125 | +| **semble** | **0.685** | **0.849** | **0.938** | **0.976** | **0.991** | **0.996** | **0.996** | +| grep + read file | 0.001 | 0.008 | 0.037 | 0.088 | 0.212 | 0.379 | 0.583 |

Methodology -semble returns the top-50 ranked chunks. `grep+read` runs `rg --fixed-strings --ignore-case` on the raw query string, scoped to the same code-file extensions and ignored directories that semble indexes, then reads matched files in full in descending match-count order. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span. +semble returns the top-50 ranked chunks. `grep+read` extracts non-stopword tokens from the query, runs `rg --fixed-strings --ignore-case` for each keyword (scoped to the same code-file extensions and ignored directories that semble indexes), then reads matched files in full ranked by how many distinct keywords they contain. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span.
diff --git a/benchmarks/results/token-efficiency-5ef8e76ffaef.json b/benchmarks/results/token-efficiency-5ef8e76ffaef.json new file mode 100644 index 0000000..2e4e97d --- /dev/null +++ b/benchmarks/results/token-efficiency-5ef8e76ffaef.json @@ -0,0 +1,323 @@ +{ + "tool": "token-efficiency", + "tokenizer": "cl100k_base", + "budgets": [ + 500, + 1000, + 2000, + 4000, + 8000, + 16000, + 32000 + ], + "n_queries": 1251, + "recall_at_budget": { + "semble": { + "500": 0.6855, + "1000": 0.8488, + "2000": 0.9373, + "4000": 0.9762, + "8000": 0.9912, + "16000": 0.996, + "32000": 0.9964 + }, + "grep+read": { + "500": 0.0, + "1000": 0.0072, + "2000": 0.0228, + "4000": 0.042, + "8000": 0.0755, + "16000": 0.1011, + "32000": 0.1267 + }, + "grep-kw+read": { + "500": 0.0008, + "1000": 0.008, + "2000": 0.0368, + "4000": 0.0879, + "8000": 0.2118, + "16000": 0.3768, + "32000": 0.5941 + } + }, + "first_hit_reduction": { + "grep+read": { + "n_paired": 189.0, + "median_semble_tokens": 275.0, + "median_other_tokens": 7864.0, + "median_reduction": 0.9704, + "mean_reduction": 0.9319, + "semble_better_pct": 1.0, + "expected_cost_at_cap": 29547.0104, + "expected_cost_cap": 32000.0, + "expected_cost_ratio_vs_semble": 52.1736 + }, + "grep-kw+read": { + "n_paired": 1219.0, + "median_semble_tokens": 342.0, + "median_other_tokens": 19298.0, + "median_reduction": 0.9813, + "mean_reduction": 0.9556, + "semble_better_pct": 0.9992, + "expected_cost_at_cap": 45004.4476, + "expected_cost_cap": 32000.0, + "expected_cost_ratio_vs_semble": 79.468 + }, + "semble": { + "expected_cost_at_cap": 566.3213, + "expected_cost_cap": 32000.0 + } + }, + "plot": { + "budgets": [ + 100, + 114, + 130, + 149, + 170, + 194, + 222, + 253, + 289, + 331, + 378, + 431, + 493, + 563, + 643, + 735, + 839, + 959, + 1095, + 1251, + 1429, + 1633, + 1865, + 2131, + 2434, + 2780, + 3176, + 3628, + 4144, + 4734, + 5407, + 6176, + 7055, + 8059, + 9205, + 10515, + 12011, + 13720, + 15672, + 17902, + 20448, + 23358, + 26681, + 30476, + 34812, + 39765, + 45422, + 51884, + 59265, + 67697, + 77328, + 88329, + 100895, + 115249, + 131645, + 150374, + 171766, + 196203, + 224116, + 255999 + ], + "recall": { + "semble": [ + 0.0404, + 0.0516, + 0.0616, + 0.0779, + 0.0995, + 0.123, + 0.1597, + 0.2105, + 0.2911, + 0.4129, + 0.5759, + 0.6551, + 0.6843, + 0.7082, + 0.7446, + 0.7796, + 0.808, + 0.8352, + 0.8628, + 0.8784, + 0.8954, + 0.9149, + 0.9301, + 0.9436, + 0.9539, + 0.9579, + 0.9635, + 0.9707, + 0.9778, + 0.9817, + 0.984, + 0.988, + 0.99, + 0.9912, + 0.9936, + 0.9952, + 0.9956, + 0.996, + 0.996, + 0.996, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964, + 0.9964 + ], + "grep+read": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0008, + 0.0032, + 0.0056, + 0.0064, + 0.0072, + 0.008, + 0.0124, + 0.014, + 0.0172, + 0.022, + 0.026, + 0.0288, + 0.0328, + 0.0336, + 0.038, + 0.0428, + 0.0476, + 0.0516, + 0.0568, + 0.0659, + 0.0763, + 0.0787, + 0.0819, + 0.0903, + 0.0967, + 0.0995, + 0.1071, + 0.1139, + 0.1203, + 0.1227, + 0.1267, + 0.1291, + 0.1311, + 0.1371, + 0.1387, + 0.1419, + 0.1443, + 0.1443, + 0.1467, + 0.1479, + 0.1491, + 0.1491, + 0.1491, + 0.1491, + 0.1491, + 0.1491, + 0.1491 + ], + "grep-kw+read": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0008, + 0.0008, + 0.0008, + 0.0008, + 0.0008, + 0.0008, + 0.0016, + 0.0032, + 0.0052, + 0.0068, + 0.008, + 0.0096, + 0.0156, + 0.0172, + 0.0248, + 0.0344, + 0.0428, + 0.0508, + 0.0612, + 0.0651, + 0.0795, + 0.0923, + 0.1163, + 0.1323, + 0.1543, + 0.1815, + 0.2138, + 0.2389, + 0.2736, + 0.302, + 0.334, + 0.3664, + 0.4291, + 0.4671, + 0.5123, + 0.5485, + 0.5813, + 0.6112, + 0.6423, + 0.689, + 0.7367, + 0.7631, + 0.7927, + 0.8176, + 0.842, + 0.8592, + 0.8822, + 0.8989, + 0.9125, + 0.9201, + 0.9281, + 0.9357, + 0.9392 + ] + } + } +} diff --git a/benchmarks/token_efficiency.py b/benchmarks/token_efficiency.py index 455e435..de4e41b 100644 --- a/benchmarks/token_efficiency.py +++ b/benchmarks/token_efficiency.py @@ -1,5 +1,6 @@ import argparse import json +import re import subprocess import sys import time @@ -25,6 +26,7 @@ from semble import SembleIndex from semble.index.dense import _DEFAULT_MODEL_NAME from semble.index.file_walker import DEFAULT_IGNORED_DIRS, FILE_TYPES, FileCategory +from semble.ranking.boosting import _STOPWORDS as _SEMBLE_STOPWORDS from semble.types import Chunk _RG_INCLUDE_GLOBS: tuple[str, ...] = tuple( @@ -34,10 +36,21 @@ _BUDGETS = (500, 1000, 2000, 4000, 8000, 16000, 32000) _EXPECTED_COST_CAP = 32_000 -_PLOT_BUDGETS = sorted({int(b) for b in np.logspace(np.log10(100), np.log10(64000), 60)}) +_PLOT_BUDGETS = sorted({int(b) for b in np.logspace(np.log10(100), np.log10(256000), 60)}) _TOKENIZER_NAME = "cl100k_base" _RG_MAX_MATCHES = 500 _SEMBLE_TOP_K = 50 +_KW_MIN_LEN = 3 + +# Extend semble's code-ranking stopwords with broader NL query words. +_STOPWORDS: frozenset[str] = _SEMBLE_STOPWORDS | frozenset( + """ + but its can not no nor so yet both either neither than then + will would could should may might been being had did will + they all any each few more most other some such only own same too very just + about after also before between during into through under up down over + """.split() +) _IMAGES_DIR = Path(__file__).parent.parent / "assets" / "images" _RESULTS_DIR = Path(__file__).parent / "results" @@ -110,6 +123,39 @@ def _grep_file_units( return units +def _keywords(query: str) -> list[str]: + """Extract meaningful search keywords from a natural-language query.""" + words = re.findall(r"[a-zA-Z][a-zA-Z0-9]*", query) + seen: set[str] = set() + result: list[str] = [] + for w in words: + lw = w.lower() + if len(lw) >= _KW_MIN_LEN and lw not in _STOPWORDS and lw not in seen: + seen.add(lw) + result.append(w) + return result + + +def _grep_keywords_file_units(query: str, repo_dir: Path) -> list[Chunk]: + """Return files ranked by how many distinct query keywords they contain.""" + keywords = _keywords(query) + if not keywords: + return _grep_file_units(query, repo_dir) + keyword_hits: Counter[str] = Counter() + for kw in keywords: + for path, _ in _rg_matches(kw, repo_dir)[:_RG_MAX_MATCHES]: + keyword_hits[path] += 1 + ranked = sorted(keyword_hits.items(), key=lambda kv: (-kv[1], kv[0])) + units: list[Chunk] = [] + for path, _ in ranked: + try: + text = Path(path).read_text(encoding="utf-8", errors="replace") + except OSError: + continue + units.append(Chunk(content=text, file_path=path, start_line=1, end_line=text.count("\n") + 1)) + return units + + def _retrieval_units_for_task( index: SembleIndex, task: Task, @@ -119,6 +165,7 @@ def _retrieval_units_for_task( return [ ("semble", _semble_units(index, task.query)), ("grep+read", _grep_file_units(task.query, repo_dir)), + ("grep-kw+read", _grep_keywords_file_units(task.query, repo_dir)), ] @@ -212,15 +259,23 @@ def _evaluate_repo_recall( _PLOT_STYLE: dict[str, dict[str, object]] = { "semble": {"label": "semble", "color": "#1a5fa8", "linewidth": 2.4, "zorder": 4}, - "grep+read": {"label": "grep + read file", "color": "#922b21", "linewidth": 1.8, "zorder": 3}, + "grep-kw+read": {"label": "grep + read file", "color": "#b7770d", "linewidth": 1.8, "zorder": 3}, } +_PLOT_MAX_BUDGET = 100_000 + + def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: """Render a recall-vs-tokens curve from a recall-mode payload.""" plot_data = payload["plot"] - budgets = plot_data["budgets"] - recalls = plot_data["recall"] + all_budgets = plot_data["budgets"] + all_recalls = plot_data["recall"] + + # Trim to the configured max budget so the right edge lands on a clean tick. + cutoff = next((i for i, b in enumerate(all_budgets) if b > _PLOT_MAX_BUDGET), len(all_budgets)) + budgets = all_budgets[:cutoff] + recalls = {m: vs[:cutoff] for m, vs in all_recalls.items()} fig, ax = plt.subplots(figsize=(8, 5)) fig.patch.set_facecolor("white") @@ -247,7 +302,7 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: ) ax.set_xscale("log") - ax.set_xlim(min(budgets), max(budgets)) + ax.set_xlim(min(budgets), _PLOT_MAX_BUDGET) ax.set_ylim(0.0, 1.02) ax.set_xlabel("Retrieved context tokens", fontsize=10, color="#444444") ax.set_ylabel("Recall (relevant files surfaced)", fontsize=10, color="#444444") @@ -257,6 +312,8 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: color="#222222", pad=12, ) + ax.xaxis.set_major_locator(ticker.LogLocator(base=10, numticks=10)) + ax.xaxis.set_minor_locator(ticker.NullLocator()) ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f"{v / 1000:.0f}k" if v >= 1000 else f"{v:.0f}")) ax.tick_params(labelsize=9, colors="#555555") ax.legend(loc="lower right", fontsize=9, frameon=True, framealpha=0.95, edgecolor="#dddddd") From beb820881e1e767089d19bfb535ae2f9212cbb3b Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:45:16 +0200 Subject: [PATCH 13/18] Update token efficiency benchmarks --- assets/images/token_efficiency.png | Bin 60796 -> 54262 bytes benchmarks/README.md | 6 +++--- benchmarks/token_efficiency.py | 7 ++----- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/assets/images/token_efficiency.png b/assets/images/token_efficiency.png index f6a06f2a917dc83c12422950a83499d5440264f2..ac89e1cb792906bd451c68bbc108e210e6dca0b5 100644 GIT binary patch literal 54262 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

IR031w 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 PygoFD@O4kX#ghL3<@yh~ diff --git a/benchmarks/README.md b/benchmarks/README.md index 362d13d..0d9fe92 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -75,7 +75,7 @@ For each query: tokens consumed at first relevant hit, or 32k if the method neve | Method | Expected tokens | Savings | |---|---:|---:| -| grep + read file | 45,692 | baseline | +| ripgrep + read file | 45,692 | baseline | | **semble** | **566** | **98% fewer** | ### Recall at fixed token budgets @@ -85,12 +85,12 @@ A relevant file is "covered" once any retrieved unit comes from it. | Method | 500 | 1k | 2k | 4k | 8k | 16k | 32k | |---|---:|---:|---:|---:|---:|---:|---:| | **semble** | **0.685** | **0.849** | **0.938** | **0.976** | **0.991** | **0.996** | **0.996** | -| grep + read file | 0.001 | 0.008 | 0.037 | 0.088 | 0.212 | 0.379 | 0.583 | +| ripgrep + read file | 0.001 | 0.008 | 0.037 | 0.088 | 0.212 | 0.379 | 0.583 |

Methodology -semble returns the top-50 ranked chunks. `grep+read` extracts non-stopword tokens from the query, runs `rg --fixed-strings --ignore-case` for each keyword (scoped to the same code-file extensions and ignored directories that semble indexes), then reads matched files in full ranked by how many distinct keywords they contain. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span. +semble returns the top-50 ranked chunks. `ripgrep+read` extracts non-stopword tokens from the query, runs `rg --fixed-strings --ignore-case` for each keyword (scoped to the same code-file extensions and ignored directories that semble indexes), then reads matched files in full ranked by how many distinct keywords they contain. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span.
diff --git a/benchmarks/token_efficiency.py b/benchmarks/token_efficiency.py index de4e41b..47ae7d0 100644 --- a/benchmarks/token_efficiency.py +++ b/benchmarks/token_efficiency.py @@ -259,7 +259,7 @@ def _evaluate_repo_recall( _PLOT_STYLE: dict[str, dict[str, object]] = { "semble": {"label": "semble", "color": "#1a5fa8", "linewidth": 2.4, "zorder": 4}, - "grep-kw+read": {"label": "grep + read file", "color": "#b7770d", "linewidth": 1.8, "zorder": 3}, + "grep-kw+read": {"label": "ripgrep + read", "color": "#b7770d", "linewidth": 1.8, "zorder": 3}, } @@ -301,8 +301,7 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: zorder=style["zorder"], ) - ax.set_xscale("log") - ax.set_xlim(min(budgets), _PLOT_MAX_BUDGET) + ax.set_xlim(0, _PLOT_MAX_BUDGET) ax.set_ylim(0.0, 1.02) ax.set_xlabel("Retrieved context tokens", fontsize=10, color="#444444") ax.set_ylabel("Recall (relevant files surfaced)", fontsize=10, color="#444444") @@ -312,8 +311,6 @@ def _plot_recall_vs_tokens(payload: dict[str, Any], out_path: Path) -> None: color="#222222", pad=12, ) - ax.xaxis.set_major_locator(ticker.LogLocator(base=10, numticks=10)) - ax.xaxis.set_minor_locator(ticker.NullLocator()) ax.xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f"{v / 1000:.0f}k" if v >= 1000 else f"{v:.0f}")) ax.tick_params(labelsize=9, colors="#555555") ax.legend(loc="lower right", fontsize=9, frameon=True, framealpha=0.95, edgecolor="#dddddd") From f481da68c9090fc4c8cb213086a3477ed78d9815 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:45:45 +0200 Subject: [PATCH 14/18] Update token efficiency benchmarks --- assets/images/token_efficiency.png | Bin 54262 -> 54559 bytes benchmarks/token_efficiency.py | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/assets/images/token_efficiency.png b/assets/images/token_efficiency.png index ac89e1cb792906bd451c68bbc108e210e6dca0b5..df33e8ea1287af88df9ee79207e81cff4ba4d0ff 100644 GIT binary patch literal 54559 zcmb@uby$;O8#g=?3sC`sHUMdq95GNzS{a=R(%m^gQBV+&?vj|aw6uzJj~LxGIyPWK z;JXIT^L)qm&v(3kygLqcvU}Hk-q&^J@BE#7eyJowdWGr=1Og$IeIcm=ft*i)K+aBF zx(I%9UhBtu@Q;v_l%^Bh*2Ky6je{{n@r{$6m93MNxgmp#v4f+ztql+76K+mHb_O#i zCp$+WE-vf;UBPMVV9NDd$GHova@p>MmLmjm=N9qL8PgOLxL1FWtmHFQx5U+P5~qZD zT=N!Nt7r3PncWG`C(jukiEF-ryA0(_*VAL~{s#eyFu_0F{v$%tfPSH5vxH_bNjhr|ksKgZqQm=9yeB8;aBS z3|?nX-uNoN!vE*vl>7hvS@#XtnUha{nO*|hL3~Z|d{91pw|Vam^Xa?&Yt!VX@4Wms zFQ2}HN$me0FL&d8mQoU{sON6vY>05zq{QXN!Y->{Cy$Tzp1Q1RV$g*tQ0WGLQpZu# zwUIK1c8-dcS2DDW2m~QPdhaAm zwsa*4ch3L)D=Dj_#J{LCT5cV2mGh^#oSa<8d}JiW=TD!$@>`GWTaQ7s19%<@ZPe^! zz>!KcE@J03>i=yAIjs(bO}ayFya&6MN?B@&?wZ{#E`I80VUrRYdp9M7L)Q!3kjV}8 z3)4U*hP`{K?)d0{$!&S0EVpKF!ZSQB4&#EbvdY6Q^)}?rqF&3}mLLvx^=tJY0SoxW z6oEwbla!Dl zFv1cOTW{h)qT9^p;P=dYPD?NGyQ8+Xgs-~Z`1ytN45cDF9Xv;LKpW2ZB`ZUGf4tP! zx9OUlnYsQ`*~`l-H~1Rvz_H8+7Y5zngl&r%}r$9osEk|bG z%!Kux><2H%v#! zb$#qRK@l0hq$;MoyE^>Pwr0z}BM}NOw;8usmk33MV3u%Y%mxGx?S*4~v@VBFe2twHvxfQ^=oav#&e2_g6#Ty%CrE zJyhoq9Rf4OL3hFBt%dbR7Ie0VuH~7tcMQCWXng){*;M#+i|+lbWft6MZ^hRL^%n_F zdfL?D)OUm|b4Ip11txhb5)u;F)N==Fl9?1@U+a&0=&tnb9r9TY#;$;qsbdO_gOx`x zE8h-kG;EsK6s>05*is@m9`B?a^X|P;Red`VgpFPH^ps!H#8xh3H0Mq4G{ZL}L`?`n z`ZaDvbBl`!=t#~-X@#zc>myd>5_CbZWDhG`QNPjFOb}PqA=ib{G?oE2wy=ylc?lI4>MJKCRJ z@JmH43=y7biD8#z#hg}1K4Gy~zdA+I8`#jf@oLxhC(Seuj|u4dG1xyJaB>bCwR`bo zcC4(dZU5fo)1z?MUK#p0GCD$lI~;bf%0n)$s-cna1l`{sYcfIDSt4<*4USg5gBdEU zUKi5nvpcj)L&RdYV+_2_VOA5)Xua*x$)iD>C?O5*$49Ej%Es17zlKZrVriF3e-|r6 z+UnGyO{-S_eEGHCnZtYFlstCcX<$g|Gcq3SoN2(vQc_T~9PUl}^oW&szw9M*Cfx6a z-WJ6mFtYSqq~u+qdt*$t5)EXBui@I-7Ic<}soBj6VyWHneC=MFyAm_2$OnQkx|VcnE?5{~#mbi(ez^cCqgH2ZGR0 zr1#^2zCRzY&IfVT+3CC~Ix3YzOsqI6g(h6Q?SVoE`5Wi=PAWDO)gR#s7tZC?-EI!0 z->?^>jq$$)j)%mZnUo8+51pjPRxXKnduUfVWe>XuhQ4vE!!J;i`(svALlF(l8qHpv zeCU=c=amj)+WK|moA(!eJy0)~!er>|5uq?;tmyMS`#RHppH9y!6xU7INw!mt|H&Nf zR@BEWhN5P_Z$x!1hSw=u{K!0JutU9;q8D3xgWTv-9A9Kk@iOe8CA2I>mm4-SPoZVP`_r1ApTI?}Z9Y2<@pk6sKvOqGG}$ zx7Ud9=PFl=*wGdl+PKyL;p2F8y$3xv_1mvg>>-396$*iP?}YmNYv@gvA#=1?I@qXp z)pI?>p@oTVs$4@|T_{U2Vd3u6x1TE4|Lt_U_V@SyL~I1mdz%#q?+zJ_mv<)#qj3o0 zy(;qwCf&(vO9Qzv>B=dv5aMx!SdW%NS6!;1)?nxs$CW~Hpd#=piW2~;vgQ8jMyEPfT>qjR)zq<5;l(4Y<*TV>%1z{b8^~rD?ImX z9210WYP|_qOmN*X@B#d2j60mOZr`vZ6vmnS4@jyA)0dKx3b{f@BBQ_+RfTq#0Ky(8&xCOC5G zl;^b;ExTc%rQU}gj!Cd}1Fx-*E0uPONvAu*X>33ux{29HN$M(_ZN2z3?3@O@EJzUA+!Z6z(ddOWBZh8 zeU5fg#_MGEDnUj=Gl|$sdMG9~Syr2o@%PKYQhF$V1s?qE@ozY>S&F_}qOt(0q30Zh zuhX%q%xpzqak&S&PQ6k#qoHC)ZY76-Yz5q*nQ$qok47K?3Rz6?nfRwWp?X{?;Oui1cJW6^S` zZ>Ku@pa)%WG=W;7^IU!6C{nZKHc+oD%I~q7;!QB$@t*e5KRVp-aXl1)XDQepOstJo zBy8A+ST1%Y6|7)A@33pW_9hdYlt07p^(Ha<@K+{hR^lDys@eP_JsplBE9u%e1OfQ^ zT^IsnRRv-N^zL(E(muK?B$rHwHYYqc_@E}FPn=SKst?T~`0s2k(RX_s?r+V~1}u~L z?EB#-Ms4eB!L~PKt~&ycUE#5h?cnK-UGw;&QJ{;7BGc_6<0ZVwWFZs9eq~FwvdD|k zb@=S=MeQ*gEYN|YvQyL0@SI<)oc5>Ioz7zR!M7W9;7k+k{VfwJ{xF+T#`&cfW6~V%#O6d1HW~5nnZUus!Jc4|smt@=zKmO5_d|iW`L|yJ+xHnJO>% z?vroBDUBu3MZu8QR_(C#7MF$HFZ0nB3H@p|^EgCN~C%#rUfD2tnhYDpjLq#Q#q=)!!9~)jq zIpnaJ0Yj3Z!}P~H{O&qkEP_JDNERUzWhY8#nQ{AV4aW_?H292@MYu&l%vVRNT#Z5( z#WZscp$jUQB1@Z*#^0!HGa-be=e8MH^tr>15g(}oPWNwcStkp5i4i|}HC5Hv<_T)C z&=UHtFZXy9Y_kbiZ>P3U)P%6oh?pEQc?n~Ow8TU*7>EQUHcK4v@~vKW67;`z&yc`{ zaeA0^YlsSKkH)<4P$-SjkPzZiL}o8j48WB|2g>y7oADy3Z1tm5_)&bkMHb>`q!OEr zMb7Hq&*YumY2BSsY#IbB_Re06hme$lfyM}PCplu=QjB|kRbXHfn!{$hOi`4TH3p?O zwXJDh5zBMd&eUvnxLY`AwX`Kv2oI8Dy9CDt)dT{NZpSq_D zuaqahIox>hDA~;C@|s#&MW&CLzyP&b?>DIhT`?z%zNsuT-^^u!r2^%IWS5n}&RJ)i zC*0hJaZS&j8@t#?*0v0skKp%>-Ys{6@7z@ngAp%v^I0uhI~d)F!Q5PgvWG93O z*WVOfMGrf=z7|(DH{jo`+xgI0dyi(y-|4%nM;(Pe=0-jX@cz^XdotqLGFr;jk^0Qf zYnuj@)x?4DDiaIw*BBv}IWWZ(x$JgicMk`&p|OJI-!t9>U!)w#ZHK$1(SM@em7(S_ z`EnUjP_@k3CoJnJO?sF6m)8#)(vhA~a#5GAy+_t2le#=Mive!q1_@t1J=sYPMh1Pj z&B&Lt%rsY4sTWwp`=(_5!U(}X`M3v~Wd=3|oPTa?jp(%C>3YZZmYqomrY+NUM+KIX zb+t|#6XUZms!Pj)yh}FAuIWc#Tqh9~?gc9cVY{&YJx&7=eWh9uy^7Ik{MN2V`d0fB z`ESzvYYEjl295;JdYMo<#ohjMzT#4#4nFfD;S8HzXIACFDwb@Ma3GLDPsi(~LI`ki zRLo9_x<-(}|5hc19{1RMuaus_X$+#I^GR~OqZ)s!^U}&04@{#L)^Hk4+ZRpu)2C6t zk2(}ZnH2fPt(Uh16H{cwZs>tv!G!H^n!z<7LDgKppv!h%8)bJS&byCQot_U~{JIlM zv%J-FfbyRm`8p(P&_{TOf~x2L>20p$W25Gc?b&P{)*Qn-Vmv>WIHbREOXK}DXtJ$+ zFH12Sm+?D-Uu5uyoFBVEK~<)jA&G|+@|_T$KCxwKD-hmE0p&>{|ECkU!)h7TB$ z8;7>JO06iybX@2_R?h20czNk9ak2jM;e@_cCkqwFcZp*AGh#hmflT=|y=q_IV-|aj z>v88Il+yd`BvM=nWd-MvyouW%7qY}@*B!rSHcM*Eqkw|E)qA6$f$KvXBeYvnqlCNE zICT7AOjLsAn;B>P9dq&u`jPa$IQK>KG9EpsB9hC(xw9jVM^WvQ5+%w}6m!Lh>V^47 zRZCbCj@}??d$`0@Ic4nl_m_F`M5BQoag6}0%cK`^2<=JgQdCprwMOWzxBymMa#scm+_f2Y2d6e@N@fG?>lW!XoQ zEM^Oe^u#!(mU$v**1OZyM7t)qv=3E}b&-wcQ3{sAV=38;g=G2My<}gOxqR?J*)PrS zieN}|5MOi>yf|z=pTbebF60Ed_TH3R55Xhb#2qi*c6II5hXq zf0i&vzwS7wHNLQNg?G_XhdQ~U)V?|d2VA<#)oV$MhXh>2(cyt7PPEQ(v8w@VbrnagTG8Z#ND`YpKAb$J-4yG|hn5rIor#pNu4TW5v`(j_PU{r+ zg?sSI!FaKq=_8SJ>ENeq4dy=_R`M(28JaYLn{;NOb0T!w#+x9mr*nEddyThLMn!^( zbH!+di$LSZKbFjI9nZ$l-`ok;bV=R&K!D#%SgxIy@1h*bQiyZ-wU~!Q2bC~~@;B}= zuJxtYdX+v^nzT%~s#98=oxLS^?m0rqB6dz!wm5rg6Sx_id)}=2M*VSJbDg%(b!*=V z6%xmPWdafY(#w^L$vZzoL%OxzIj2qrcU^f*isaKoLE0)&c@^}9(Sk3z^N)2^ch{ah8wCtR~&yNZw>(~OevzP$7q`D0H$Q3T0f?#8u zUw5#;#F7wyzHCg-pxP1k-1uB;gregb;azVuhtAx`JNn#x3}n$t1E^op#|=Kf4&pKg zR($UE9uKbA_hdGfncJiuiV$d2x>8HBrDsPgYz0I;u>Jicaz0`KPPjbT2&T9~P@6yF zIm|rjr>|8cT`nz*h&amY%DJr9rN>5@R9jQ}^o4<66;;edqobL;Wc+qJm)`V8M;!?v zV-2xS^}8dM3+JkKOnb>@g>Xv9X=v_KUhzU@BnC5^OTUhg3PtX2_o6?kPt<~H&jwD# zN6`aQa~*e%X}%&tIv%NHv@`$y0@d4pAn|j-4WaB;#BL=v!@F_&b=z%hCIkz3l&*(J zQk1C2Dh~f0ksN=;jciZ!sG|Nb|MDknWdWPCP%aX?l_Kg{jz{|QTrC=Lc^N;mVdNEhgWcgG=OR~q81}Q%!9v2OgX^)KU zy{4XAE`2zDTs~^UQ)|Zix<|~WEG--5NJ_C@xk$IuT(cMSLDeitK< zi9{xlU81^Xb~pXmdv%SaC%yIq8$omb+_fX<(gDCYo_9WrJ{en74G`bXeXQU6orcvY z0I>B`WQP`d_tfJT5)>P34u^3?gQNYUx%E_0NMMUmwb-l+RMC*8vGeP<@E1a4Y6!*T^=!MbMhx&FHhhWprOXyyujNJD0YQqmAXuI+K+g z$?t&%evnu+B4?M4Jo^*{;<64sCJ6|_(28f+L}8usziBcbv)(7Ya@};I9&- zNB{2=9yQmaV7AUU*~Kf7RCO3x&s-?m4-ee3afmSFyb$P9TzXANd8-#CC-xGPBdr~m zMyVjgD1DrpOCNpRd4TgUHH~f83_ev@N02K3uv;H_TV?S8Nb42(qLesLVn3YKX!Gy( z%-1Fzo1>45=>XP=8o`EI9oiNu-9$me#UL2^X#x)>KvtBKFx`f~pIPRNK{cu>F5TJ{ z>N4;-9Pr}qy*Ng=FC99ZhDF&c85{tY*g?X6D4zH1D~yhCMlv*je{;}VU%U6VnOLZI zYM=SjDne{MRj}s{G^6lLK3zXcA(b?{PI-sw;1bD8Q98o(@bKSJSs#;HE<~p}Jr${i zlTZG66gpXHuXnT6!0Ac^%!hZ(#s7{r?ZW2}HNUHePyh>?%Mo@~Jin^vFB#>(c?+MM zq{7yfomHG1EtQj!xJR3Q@$ASQxpR8?hJAb8{)uS`7pbU3vsG6L)L{mgedSJKqd zVp+BjK3@+2HR-`$)^54cvXZXip!tPR;P#E9=^RNHoGgx7nN!BT)t`g>qGt~o)J5Nc zKt7P>Q}i&%i2Ykpy}QUO0=gC-?syRUSSdZp>{KF94T*CQh`8GWVv|cBN!pqOvPJDr zNa@8+!!b%bTM;U91Op!0KcvHsei zX%-?WB}Kb!jW}4Vc#0r6ISPZ+?y1Avi^~0(AVw&3nAwQrM50T~&+fr$x0EfV{S$W!Ja==9GWnaA5+-^B-VE&PR>96eb zZINNa^U%Y%;_>@s z9!Yw8CGzH4adT1qffDQmh%=>27aq@3Qr^;e$?<1{Y0Az!ZcF=Y%||r(l<4&U?8b=F zS;ZlLWn*Jw#R4;ATBKu2LneL3)hk!7AGl0W5AeCLuoi}W+g`5PDXuCEYPZZNZn8NW zGNK*Ozj{@6j4No=*z_xEsW>?SlF6y?BrR}-fEZoFl_wx}ZOQlxHoxotn!6UWth8`= zgZQXZ=Z0-{AHQR=YGAhY*c~<%wdrnadx}U`QBnEsWx>c-<}$3Nd0%)px;>=Uc)?5A zK9eF!P5zBm6h-7<(w%i-uH1}5VBO$VM^Qcv*VRpojEV8A>8jM*gX#*6bF#7mt(E_+ z^2R)BZf@gh^lqeV`Q_NQM>_QraHh%&^Ut(6P8!nU->-~rvheW0!O1fNTsfEkn_pO{ z+I_cS_O+CwP_=w9s;%q2g9e|sN(4T1~<(<*Gff za-M$iVb~;JxX`sW+0ysco07qgEC;*Ji2TWVF4gS%Q14K@{-SYhKH|OtcklFacZQhJ zxO;88iO#saSme|TKLyjM2k*%3+<@p4zb!9s(&;Pvx*90Id;GWo2|#km;*t_jd+Z$l zTNE=KP%eA$)P4IcTD1z`C~dT^WA_1c{}o`$$jHmiUUQ$D6GM=f`(yfayJ6o<0~?SE-RqDUnc zCC~Wqp#-tBgeR;ND*D;yf2so1f=Bo7|7JEKbE&@4W;{Q5wsj<)i>-p91r_Z1_8_@f zz0#H=QZ_I+vj49cW{BV0;1`8ymvBatYycw0DBW+{oRp|W;xCE?&z3QxZF{5TiZ>4kjEsr93K7p`NMq8oP_P$^EoPV_6SZpVZR@<=ZAOSv5LqRv*sUA3P?v-&oG<$h zh?d}$AG*o%MNM^}&2NJ%tior=?nU1c!AT+fncis2FHV-H-{qTNWlT5?!7LC$w&y`YccXO!=REDYxjz7(= zk5iGEWI7Sm?&qbHKa$4I`D0scUU+OwK3!pG;Ey)Hm}@cZ&3liWP6gDL*r&L7MLu^f zesQs-+tL+u0UfK|@ZB3tvC035o)eP$6f?zpk!^FPK9Oa^Qgnr4=9(n zSZc@r783)Dy*2f&9NU~xE(WdcP_${r-xeKL8fL$$a&z2&7X$L21z}$yu0)pZXyYl% zHIRxEpnsQr?d(=rL{w2;6Q1YQ5a!rEG7Ir{e1bM*A-t#-;bBI)1K>JVU}FakA+&RQG%> z>%D!xRI##g`zVx}+PZ%E@5K32rW3=|4cLXadPI$ig$1q6=q;m%^R5wu18arTJ1gGz zy7GY9^>#b+PC5U`(J1^t*5Y}oLDMPysfXqdlHuvvB1dp}CSzku8M)_yF)=3vFOui` z6pz40d#&F0syd2<-J&PQ#5_5bmgdql{HtcMeWBHa+Dv(;;Z5k`Qh_)1X^Q#l9T4cU zvYN6HAyfW<-`@Kk*~x;xelvJoISV2w-pYGcdUjC-cPhhKnrZlr*b-Ka?LgM?aw!?j z`O;TO|M*Y!-q#N(Pe$%o5_g{8qedzG|D+4rWcfujU4ftyYHQOr+LK#cy7)o)jLlKi zxQh0x*>VmjrwVb8EB-4r`yV7^Z?i|szVF5f+tk*=F0cI!noiBVM+L}dF+bQe-3OfK;nUkExAl#F;B`fuaekl} zT9MJadz1wK_w+PDJpClM;tub~AcyEPpel#|pHH-Or~;JFRloet!MrB}r;PQa8p;g* z?;VNg_Su(%>a3@HJ8?5`q}(7E)2goh(YyOjFV5w3Ly2GY9sW`Bg4J@>W>kedosoxe z(AMZwY%>iq|{?su2 zUqayhkDDyMt3x_W7c$jsMh(ANp-K?nCjX<=CsKN~=^ZPz8kTHxpL(Gw$()Nc&m zrPksx6!l+D4eJ**Shr@|{ACQk_dOzq3=~TOV6$(iSDnU)H2+N&akKO-Yxhi>(Y)J1 z*Ood;g-=DQ0bl*gN(Nu|c+2#{%ISka)9F{HNWrlff@A4yB0+7OG7ir}!NU}IQT0c$ zxSo8Q;V00QPXnXW0m_HMpmBV1XJW{JSXiuWTe`eTUprUzAA;jaD1q>=vq$GpRgac~ z;4P~hvNalevJj-^-6jhpZ)DJ|ZQQqu#jr^8zsC)+1^Nfct)S!|8LW3K{_h!1DFX4d z@sj`D*(=~NoHDD=0Pft05I4m4=S=a8QQ;*OW7Y`+hG7%5vHv|*`ss+2{B9PD(tOhc z$v)`%0R&R;;%$FZA@3~pPBmsNDhDO1qE@Bx^kO3G zJO9nr?(Hk!+0A92{CD3s$pUKCbK18vbF2zgV+JnBF6eT_@C%}UWLt#}8_>8^j6&xN zgH1K@)If-NN)7N-oN=c%>HFHaFyBS(p&DAu_3GDM5;+e&XZP90mgg71rE9yIc#5@{ zq7#82u4Mz1IM%R4N||84%)@Dves=b?n&pQ+54^TZYQ8m1!*#O8PxfI-?RtQOMQ*!@ z@*77rrnRf#a(fyqn7#89K~fKlMqj+u&5>-Z$QKT^WDDEMHt}R2E-+5_hxw$Khd_F~ zzGe(a4JfKVT*C==cIx;2#086K<&_^!zpCYKh5w)^v-Nyy6^O6P3Xuojz4F(87JEu; z{eTIy#x*?D_@O!?_}XE}^3hjKt5>+Q>8hW<*sfgp@{LM=qQXE@p;(js_GM>qltXqk z9HOW8_@>4%p^IhkrvtfxgxN6?9#+ik9v@u_H)O0?}%tcy`v@hnna z(8(-*Ebv;x%94i4-R$Su*zHm2JbuG3um7em$asoiJyHJwClXir)Kp&mL>T(+jI$E>3fHhk`O2v3}b~6)I z>k?DdADspkd&+`3d7X?Z_DRz{+N9X~Ppqq6Sjm}ww(e6i99^o^Uw`n#T1Z|}wWfQW zT2S+YvUlWS_9A)INi4s?4dSiVnXV6Vq^!}2lnO8%$}YpO*o^B;3V~0iRbmd2kzFPU z9O1(}m%KhGzZ>-qm=CGG`k}bW7c7?Gp6l*v73eRox2G7Cn{Z_@ zk?u~?kbWLNEczjKi=FJpCQH<*&0UYLE!Sqf;@YpqI-qmEOY1jSLXT#bDuw2i<=Z?q zRfptd4Q?ssx1Sm<=6fZF9(rvXnJ-S<0)gS|>C;YSsL9S>7~T6Qf51k3TFQ^Z+7ojT z=S+g+zTaVYwt4xxU+UY;=;ubm>ECCs`);->2e##8W(`i4bMUt@74?cdB5wO18Edt; z$PF#7D5z)Vw;!CUPuUvRuEsdEB?^v-3A@V!8~dBlPZqPR{uvPYg1%Tw{5Q$hq=T z69e20t2IfBwyRWpTLofL1ywb_O!w%MVk^0HM+}PQz>YM}7jiWwM}DvWquc>&G?hB{fcou&g)R>D&$7!?@z*ubE!8VW?X5|FZ{M3uIJh{a z2DBr*`}D-lpn9sUHcVLBM;S8RsWYs)r8S0B!|D}*gYt5yzis&;TM6}&p?(LxZ=6vWr~5j?V7}s zJFomJ13m*PU&NUR%bYRw!ix&!OMgA4!%O1!j()H_t>cK2gIvEtyf4c)&}|$Y(>S;Sh2=pZ|(U)w>tUOq|GEcdz|qB|3|yaz8WBsznq6# z7)G83zhCrc`qatU<9y8xaN+ucYx<ZU*H$A600@4Bqd$M1;{kQtc(~ZO7%($Fhla)|B?+}=$VR-~-<-~; zgJm+kJehGgZ}6+s+J`L5Be<@8&t}W!7e#{Mb4GGbs9zQ$CVfVw)01e;HwS)mY>j7xp zMgY#vb0Sp*3do#@r@PwKdVy`Z)Yi%&%qKzUY_QV1zJVFt0eKu1!qS#W#(K7XO^5XX zlhn*8&Wu~s1|SEMgO+>eAo(l+r2rt1JAOWfk(E`BNTMTB=ZC%9SdcBXdlQxgeXnz% zJSH7q|NZl-TrF;&1MD>?Yq7mC$9d4r2siJ`!n1p^vRnRZXL-V}^1zB+f;i{0&-Hpl zA3ZiYuvA?@0w12})W04Z&Is=NHmhmiYFw#UM57@%hBM*}m)bVX@!Ru6d=P9LFXnIO}Tz%zsWP1yPE zMYy*DW}sYHweJ!DlEo1I~YwA6<8n>jcLB0E0~7G&eU_QB#}W z4Kh`J<(`g+FnrkI4Wa5|m8>40SSmX|)wAVsw#E+~eta&gZH5M3t7?v+sndy6gmaX01$o4?EOv5=BKt z3pIIpdBdYU8;JesfO+C1NN0NtyOv=&GZRxAAT(y`RlDeWPL*Z5BZOV%1xC1-o-2^C zLKGjSUZ@E`lmD`0>4DO?WOKGgwY}$1iL2LQy^1Xza9;n8)Bp80_)El6WWlW@RQ`HR z=TYIq87d8KsAPs}N#;eL#o0}OF>PK~{wQ>GJ90Wgz^o@dcLd|}h|X>5Oo>o(fy*9o zCV;K5=7CPRRoDtpyHuN%Vbc`cPd&CA3rkBzM#jdqJL>tFTU^h8OOc~`Rf*PYcA3U=sj zjh0tSGQQmu@TVtk@`1+{Nr1ESX^i*ls;MFXK{Cr~qDCtjkP|Rtl_kTs$;lrA`g|n@ zj~#cNB>IC4FijJ{r+%24m%BZ1{7YBG+_uyp;qToNdPuizDkUXlu)aLxI&C5IFJU(h zS|LyCvdFoDuy3^O8IL`)Db_SO8=-6&JhyR<#l2SwwW2aAW0fk)V8PWgjygq4Nrl=rMpMQJe+BK|{rc?cxf(tfA-=X3jQ4o~+1Pxv zJii0rqzb_+L=Tjllw_^`V`ZYY8p=W%Q~F%4x)yEwU;?R3Pp*pCZe=EpRaKX7j8|)z zbS0X=tIcAwP zZaF8GXsD&{8j&i}`vU{oKrw*2t*Kt9&jE&>a?MS~@^u8_1ns}kICeaNQG13Vla){Q z;Fm#X^40RSt8vlmmY3=jSc6tPvgufZ`2MK!nD@L@0yj52cy{Y1!vUl;A2KhmaRAs{%PDazSt&AoB)*2C*Ac^L{fs zDoUOID4pR+bO6!w2dl;0dC?m}dGJ1~3gehrjW*xOx=mX!#ILufoG^MvP>R{aZs`mJ zHeb@8US6&aruhJv|ICU%p>UmPDKc8%dP?aw5looQ&v~SLB?-Q;tC+$zT9R!nU{dtL zt6KjcH%{nU*x&0Ck61YeMjI|drhIFnJ@WLb)xike9W5}_U^VpPSzBA1E*cQBWxJC_ zja$CncbE&4kpl!@MqT$DufWig;mS*QKecWNwyQY=L|5}9 zU9clh{Lam!CE}s?+`1W{Gmgcf4cY-?|9%3$_0#$nNrpy7j4+tKoVd3d5j8_OFFN;U22`(A-2nE*=heVO4yAG0xDQ!mz6_XDKhg;Eu!MN+bc2k*lB z(+ULO4gqQ5U!mewVMY4%;CgSe6z_jqGVWk5?=2W>U@{Y${y?r^46pY-%mCap8{mUf zbt-K523~!1Mn0TTaAH`7624c3?Hc;soy)PO2~|4`}?{A-24i(z#FLuxCaLCpZ{DEgvu zT~$)*I$n~<0uUGfp3NRMlSrvzmen-?bZESGP$Ap$bL^bb0dQ&0nMf1Ak@H-Rhd|zZ zG#)&gx(KH^*{%G7tYXc;;u!f?ySL!I8Smhjb%Qc_w;&s?0_)Jj0Ra%PJ- z`*WZ|x|E`Q@1*R|HgJ}ju1ht?)KM-*$1hBAT#08_mwmCp_GFD9KWdZysB)HDc9mQ6 zfl)Z(i4&;k1ia!!+#P~8R2NI?0e9iUjgdM!cfpYIxoH-85?W% z98d>XKL-YG{|wbf9+*KW3q^K4ADzv9HiuwF9-y* zKu4rrhWIi}mG#fY8ij;)iyi9{XMpfSp&XJ6IRiDlrL$LZxJ6+5t<*O1-uZ(eNsNoO52S z%x0ARcG%EkqT}%WbuAv?XZfGUW{(d!1p{GCV>N8+2Z(5ic1)e;4@)TrP24hYyEj4i& zni$}OO8EoEIgLH}V^dpId94jB>I$+STLJkPGb%lJ;(lcJaetOwm+S#u9s{T?gjBfxfLmtu(BtT{7XfV|-;A|W$3Vc?#&aB7IYZl?nN|E~zlCr+te;q!CLQ*Uu|LAgRuOkni80#e;!u#uC%++tuSXYI8uWB$IuP-0>i9YT)t8!M?;(C=%V#rhXKBdRMC0dLlQx zWc6VYT9pR7*YwDB%%B&bg;pq5fD8KiUQPisUZUh8dM?Ap4#2z=mD@WBK+S}|o^V+x*!xNSyz1&Xop2&=6@aI%yU>h&3Zkn%;Rid)t z%o>~hkzkBHzS3ZehhTfNcd&mJaf!H+92DI`Q@2uKi`E7ZiR2RM(jJz zK*TpcDua3WrzRb-=hjV&G&4#|RsY;1`t~WiVM|uy#kTIZqg;iuM_DQHW8GBu*wzA) zx%5J+q{D@Sr+%G-_)d|f%*@UjZ%ovZjM;+F8y+71V7jHx!u83?M*F=icMY;iIIeoj zv#^CIgW(^$(-$6As2*tMpQmk~oNyk9a~}NmsbtUm}cV#|>~`1IONFUIK;LKHPVntU6SR0OMuX9H-gM@Nz)|(@ADWNyyJfT5Sn?+& zi!`li#6jeyn~tag+~rKyjfrib8LeRKwS#}{TqY9mN7}*MEh{;b!dE+D=Brz(K@ZII z#@n3stB*W;J+t1qfsmUp#>HBf0bf-+sn5f;ugmyNSQiN>8fs`b(Y{1PsaXl)O?c@SJcx#q~Srf*2<#&{Xd2Tb~2vtp}cfod;!IMrWf; z2#x!%Lm`*d$L-M^5q5L-BYM2;4?&8vO0%oodVmw|6ZhI1xmWdj*86s@B8o&IoKr^c zVYX=Vt9fuTf8L}2FzXGhzcyoWcXlrOkX|eYAaDv|O>;>-im_VpW8W^`_J#XVG}B&? z?E2%Rke@0-!F9TZ;Uas)cIG8DeR)`E>pma>Wq_){iobh6#3N}vB08FBx@FeF^%c?d zZYTgeYtA;_Qa!I-4<9FJk+6@9Z+x)kk;0G^S|g1jB(bYgAKQUPnr^l9xj^gO|7sg# zm@Py^1kguoo1boj-5tmabp3Og`Gp|s4)0nBv9<92xwBN-swTG1oI$_XQW2beQ$>_g zI+Oh3!-DXi<>NZeUqC@}pB9$nbA;a}!WX6HeQ&pB8bOked=YS+w!@kDyHWt=Abtfe-?71y8f zceD3YFT@wh<{q-J$R@kZTy|ed3wYa?rMOM}B^j)*Hu|$8L^gk&3r|dBpO*GH3cmt2 zSRv!28yl~#qs9bn7mK#8uX*rs^fq5*3Wv}uq3iW8h3K7wADLXA`wBM2ZEB!60eFqJ zcCLDMB8bW;AKg-*=iGi3iA1(Bu{bI?}{@B&W5gnW95yKBafc`Sw3MFxH49w z<5-caQX8_0QqLj+n2QcygJSURF7@Y6N^?Xq7jMIgV;!$9k%b9;Q$Mra)cIo8DAs`l z;#)s#nQM&B;WA#S(JBROT|U^yHQwq1dSf}-kf({ZpJTj5Ia#jOdD_*x?QBhHGOtbUz^I7OH zW(ogmVRkCdiGj;|@y95m?f9OF#drbVQI`lbIV=rQ*xALg) z+pD$G(UZBkxx-Np;@?2@u3Ko479c)Ft6NWA<>s3yo%#P@bqANG)^D*4_S~v{6QMB5 zniah2Qtsvkm)xVeCh!{i+`HvgG8(KIk9@(iYK>Uhv8ll^;VtA?I1}CxTeebbhGbO#klPcPKvr$Q->APfGl~hYt@^e13=e zAu|nFllGt%Cl z1d1yLhlC6RO8q87zfci;i-wc&-oaoCAO=+xe2cbl{K40s(NTR&QAI1o%9s>BKCT&G z`E3x>S*J68)gs4_=ib-!{Dq!;u03t-d;?Wu7`!hoom+Q zFfDTLD`hbvMfQf?=@9NYbC#U8HKp+Ov+Mh8gFs@O3mFA;+SyH2x1q| zjw!lkg{b82a7mo0Qn?Omy-M!;b_2DuZyRri8=JJJkD7E%2;`>~)jkgCbq{rt zo)ND9M^u4V+dBewn4i^Zo>jNtmGb6s&~1c=U@^KgC6oNNulR=GIw#;V%mBK%WNi1O z8{GM1Y7`>Rma&t<0s89chtbaPNCYJm{w3C>%zO1 zWfi~mD9UW~`L{Fd=bjp0>4smDCI9$6J3g6(XNFaRr#;{T9C&>wel0P-cN#aC(xx45enK)wlEPHN_4NUvH+ z;8vUy=FedWzE(@<6#u*d_ZREfEY_B3D6s}@2~#MmllF46v)=^oq^Z8+Pwj?Jl7H>n zhqVsvE#{;1<|uvh`glU{kYbR1p~A@Pg|8L?f3N0xENyY**Zm+NP9gh0H*!r{Rt;hxrw}}dx7N;7nh{O!K(XDI znHmpSBL~>|L|ndK<2K20UG8T7sM(-)+Bbp0J&=xBa088hQ^a%uyA%H6k@fkN?3**UgZaQNogNy6!n)Bzpe_EfL3QJZ?jNZr*+&)>QBv6ZoQn`7gS2l zdp*`I=jX1l-d(;IPGCU!t2IAAU*_z1p|UMb8|5GAiY{B+F+Mn>oQTakfJL2Od2ZRI zRKnyL;Pj7u_Ai$EdR{0~pv)$XgQ7GXoNCmyGYz;NAEch|Ythw%q#&RbP+GEP~zBAL$qBp^KHIQR49IM4Vbr2cf2u6-7H3PMbNoAY<- z6LFEP6DV_+A(8a<&O=MoZ8Aw#)%g|ROt%=W!B+VcI^D+`Gg@}B`$&Iy&xBym#@7U= zaGU!+oN&7Gql9^Pt1va#>iyT(DvHa|qk=8_-#fdF6Wxo0jyaCsID3BA4`QBA``=oz zFH{`)?f8FJF|*roO#UN1&p}c>QYDjEr&}XeCS7yJYe#p}kgkH2{p~l(tg{BAj35`F z*m;Vzt=w9^Hk(%dF7KLq5#r(PKMbv>DWkbJ={l=9p;O-h!}(?r^8Lc7!pfjcSi-UE ze_uME5j8$GtR zZ!K53CM3Q8G3Z^QXBcr=L@|OjD;!|{42&vzve^-8s>$s78~RAn6Bh!R+El=qd(q9uDE1YA9g$)JZt3k4k5ip zp3_2L>mtvVp4``J$4K$}CNNt}M{|Ode{1I5*UjDFaG~cbuNmMP-@={_=x7*(`|$mt zH=PMUb&g5>2`WyZ<(fwAT!@js?X<#%>YGn9#eC-SS!ijRwaQkk@oi5e*cUz*O3Y$o zXU_({0Ys52xQ6=rH$6RiRGetNx#ils*>s-eu7L%ah)B zZ=HlF=zq8J4SKN#7Iy-#pf6{|wLSf#lJfE6r5)3bodP*Pv4pw|Sc!g+Sbct%)74oQ zPkn{`!MJ99(>iL^#PmrE=f|YjSx8Tb1V^^w_rX^7{c!{js9H=#$TLa>C8dxH*Pliv z4H}j{?ee*cmhz!$XqA8IG-i7+?vGY8Lf59Y#b2qW#q`if7y~Mi;1Ag>g{%ZF`ttp! zg*Mznzs{utRgt8e_9(znJCe&;tPv9o0kG+ODs;%||8WXWaZsGTtPRzWKO)QS$>?AR z^k+qdE_K*QhKR<*RVVJgEz8_Pb!X@}$M>m*EMNCwonDV+?tFIf*hTn@M{;R?SP*#S zcx|{`S>hKG(yF2cdr29sQ!}q)hugpBmAs!~Z#sVpQ0bl}u~rD`;Gp?16)`UFs zkWFw5IFr`FjpX~_kQH^wV(iB|0D%6Xnrz@a0yplL8r^WBJAXn+gBV&k#B z)ppQ=U8Kv|yZ2$s?Pv9`zHmT)H0E$}9Mp;c2sF(wg}vs8dfal^D^|UP@!D^Af4-jv z^GRGFy2;7OQNBO->=`9;QS8P*l3BQQH5B@F!FE*^aFd%aT+QkO6PX&CO_>zjy%$cG z9lu;3e3^7qV>q;DP&B(o&(vNQem66-`*habIK34R@H9eF%!L$2bXUxtHJOFn4-~7J zuKYIHnGpiGP=Mb?oI_GZavEE}V-$_ZTN-@Nr{C0+}-C_{# zlcI_RC%!S2YYI?dj#(4EV;klSD)N!hXU3sW)#4av!}*ylTOPpd{fZVvvqT96^8iGKf> zTRznj;WJF)P7g!6CY_rMnNp{Y(X`K`gKHCo5A>x}3j{pwxbS*lxdU8yYCS|h===RK9hoyPtxu*`4!OQ@QVDV&3x;g+>^Mt30*zOXMM4dOS%KFl4p zP*x~F1PEs<_)OgyqWfF#y(uWKQA$<|Q5m$;PDQ_`N)o3B{op7TS5QWmJmT!gzAsNF z;gXI6@46gdznCQtj5pxmYzm99DM?Wy4Os=w@CoHF%Mp;9OU2!+6hQJSF1Js(WNm4G zZC#c6#YK+p6QY2gshDq;!goNX_7n^LSi+-^57F2-#o4rz6jsdnanT~S@llHQUysYz z0f4RYHnHP2($k^fe_p-9O7uMO8{rVevs1GMrrfcp_Rx%&F`s{}!+O7o+xeWlAxBDI z?TaTX_u(5pCj;G~r#RQ<=KKGbBL!Y_it6gYxTTIe^F)89Xm4g!U>=1@gQy=$fYQhG z|399TVY}O5e659W-HSyYzN?m2Q2p9Ku&cHGVnpgOj|H#?asdMKS=?s z9(^N^adu$%SO?6e6;C9Mq`seMpA`CsLCnGA!=&8Hf9_Us#znhcB5F7;KF+yLe+PS0 z{$_N?It8Q2fx9=KxHo}zF9Id&w987D|wL4&CXqG%u%w$%)DcXta~{kl|4syYJ4w)f@s9#o2T8M+z< z%r0BSP{^*GH3Re{ zSFaD^Z(`E>xAk7uYE%%~+>_khAYrBCgj3A-_A$K6bPqd96$s0KT*c7rMMhsy4#`?_ zD4?w^j52AjCUo2aufh}*n!!o=Vd11xj3a*JC>W6WVd(>fj(&2A5&!jc@X);#T1|?z_oE%QBhIZ>=YXn zJ0v30vHe(8u(qIZ7DdHQ()9SL3UG2M_PAyK@G7d%@gC|zLPAMosufL0O%Rg+DygWl zuby($mH=UW9jJl7Z|h|bQ|F&==!azct<7*tne#y7@{`%ROfBOV9|}t9t53xJ1fpG; zCj58f521J`7sV`@fBdj1DJhv;wu+t{VWFXQ0R4;=;6>K+Z^+3-*ZjsxErs^N!!b(~ zPXte}<5|X9`L44@$l?;3p^s@WV?CMe^FV`QX-}H~M#$wonx>|SQS={2(cx$wKa*?j z3RpVj{Y3Xkc28nyaQUiN3U5#AkoOt=gajJVK25RwNv}ud9FVzEFe_IlLw~iQ%za@9 zL0Cw1e_Q@>532hF4m0Mu*%YsO6k#qllg5@&JCB$)t`%y_DL3Y?+cC;yCohN&wK8vA+y?? z|BeLtiBS4sQLBmyk08meJPB%t34c-OdFR}%K6qugi2*uPCaO)XTs|d-jWuds(%o0B z7)qJvs*(e2^&Qsd>?x}_0aRT=;tG7hgnBR5d+G_*q=CrOlfmLg6WtN#nwA9;DQZU1 zAIg>+K%q(e`0|)!PJZ=s-$z z|3?(G-12L)@1@)!Yr2@7+@)YC!{S(pLwu;iM~wz%*%f+%igL{F2(-UyRM?9Q9$7kh&?*i4QAAa96TqMUECxpr%BiVLSO5FnMnMOGJ; zLMmp?`K7R5i!)mq8$ie+yvi5!R`V=6xZUAoR=z&RU{mzvDs$yx6$Ao3Z2eQdO<7FW_3GmG#%xU3G~$Wpw#9J@$EYCVnWTXy zCu#WbI&f3Bxw@CqtYX(*4)MmZ09;b*)wYi3mZ}|K=Q0d@xHN~ZLkYq>9v&s|m>n=7 z4TVNWb6a+%zp;C-LCcW6dY_HL?ji7k>Yp-ga}?|1$76H{&+(qAXT$}jI4N35KdVNh z&d;ty4cKo`DKObpLiI@{5|7E!*6W)|MBdIciy=Yrn(m64G@G7iyZ2o zl?0Wl+|v**Btw)Ge)g+ZEq-1kTN8lM>g&0|TF>6m$*jt7z#z)S1%@xL$rOQR*R{pMLilSj$P@g9ocP9lKJ7P^hp z)b8?69(ILu?6SrJ*i{?A#z^j4gJ<*!UtS>R!oPD%xEZId=y1nV^6DFV>x9Y30mZJ% zB9U3>Ie)e#g0FS7BxKX%wkO=`MR4vH>W~7WgD_`Y^PAw{dzrTF9A%i#zob-3KMaae zNCWRcarym<$zXb=(wb3AT96#4*)0S+H_IEb|6iPl;$5{RF@*lozrJP2=N`Op>)ziC zV1wfdT$8Di-~hc4!l4oj3yexcg_rgKMMf&H5eiy-t_yFiKGHlhO)A1dr8RE9Io)PI zWO^^)CGj}QRcUpIA>bNvrG28x+M@5B2qUN0-XG%7u{N1(5ojC%T&E+^Q*!1czEj?V z(I+{NX_+CrhsFINdaL_wR{d(GAn1}FLo4Z|sCC?ikGh8LkUbv2qr}?PQnvfQ>FzX(Y|HpW-V=nKw00nKdRc;Ul1pOY7-eTToefz7l5C~gUPSjp0a`sYQds!?5zun{ZHIz4>4*nr&AP|XviFMbZA}eb z7KZJWP(T>5_P;FY4Q;b;Dnchp5rDLiRTrr(L4=A^*n!3n!aST0j4V*G7V}7l2pRWU zM!ygNdOW;t1FpWHQmuQz5)L@Dn)bV{Le0nT*k53+pWSVh*?5Qt627V@{#BgOm_4Fw zaL}1{B)c}k?y+==gT81F>M%Pm5Dtpg*vc|S9<&GA)Fx*0D$dY0sU zKSFb)VwA`7Jex#bW#$4*n00a{Ec3qYi8Q|8$EXlwcB)RU+?uu(1nQ3%)OX)ar`Jva zxgO}${fx$S%cuk4`_v+h2l^>Kbv02fF96)z|NZ*sOvYZ(q;?WaBJKc-2C-;JnHAdy!O zjvLRy!jb?E;?@>X$>XLZ5P$pdQlyss8dA;cz-Tg8lSY6#()P{dW-x9=(X6YTKxI?+@aULwjSsK(@k?v z_WS#1VgazM@(2B3!RBIc`pyhhN(Q&N6PS)ZPwL^yw5F+iNxqrAf;fw@gb>wWa3FD? z9Fcv|*Y6e+wn#;J#8agCvc?odQIQgUj>LdP=|KerCOi57vX>8~E*uu<x^Syx3nc6-MwB-vvivInsNBp>|3(GhVn$ZS>ZWTyfJUKQs zA0Qn499u{A^G@zI2bFpGmLP(pDIQvbI8SF>_44E~N~tw{?>AcbUiNQdjSPlo<9=RS z$9l*@)28VZbTSc*mQ-IWDUYSc=;FM(DD)Jx6ynpjMg)S(Nz-y&x`4PiPpPy``bpoq z;lvVzk|Wn;#i-uwstLb;X+{7I^>0utK}SaigfS@Ha&Yd0 zVQ;IRhs9%Mesq`G2lBda1k07jfy@(3Oqt#Uvhtq^=&*DrKVrX^+IW{cT3YOovs69l zyI*bJ#>pIMBH(ST?d_B+YLT{Lo2Qeo@aB#Z{y7cku^D`h?XDWVw5Mc<7P2S>n7i^x zZh8Oyro8T@0jUcN6+3AJ7igm&EngJ^#zX2r%|Y^GIgWvbT=(?+RCjLEq68K+L5XkQ zevSnT(Wn#rkS0;8LVl&Y*2>K%UdA;TcczEr;5>-V6-r3Vtf9p)oO&!eQyC z=$GtQyWy8-P0$V$pSV~&5^c$5@JmXFF&P%)LoHKJ(|SS#(Cox)2mr1()bU7%{t8w7 z--WbRuimdY+SP?@g#CsJqAlcT^M{le`2-9C6zfSFGF3DliA6Co17&=Y}2%$`vHtZ|2j%TR8^ z8i)$88o8kq@dCUJ@#da)ScI_#ipqkq6&v`notTj{L7J64Z%f|a4zKVmp3+@;OjurB ztT4M-TJ+QAe-HNr^nQ%Jmcnj8!vYWu9?)hkLkH4qI7Is3-p`2;qIo^GMAU;z8>T-d zEQ_i>HC`^bQIk)6NWTBKPq3w~v*Ey>J}!Cg#&8I%W8Z;OHpVOg17$M6E$l0B1t9OJ z>el|=^$WP`#H1ue03Hi%_)Q)Lr9FkTb*HXrT|Infg&x%Ej)eY=1Zkxps+CLZ zWDgJA=ZOpkaTw=f3c^Npm~xO2bCe1){=L;BVmra?vj%_8Na|Xt2@bu#lQ2qE$?1k( zk*^F5p1*R_VZ1FdfXs)Ai<{1fq4t2k+uWqj>uN}CnRx^G!esbCOJnGOGpaI-Nb*B``%#oROEP07v?PXA@SQ+YtNuL*BGs7UKQm7 z75DM06M~3Q13OuLRTEUQrluPa zS8Xq%jOkIWxoZN}_l~idODP2IJ>8pw3pNDSd%>owrnX81qguz$Xn8Q7s!B#?VX#B^ zk;eA@`}bxmaTu=>zkQ{(?ylSaP|-$%Y{PWzP?r)AX!;6j3&y!wvo>!7mE!MWp%8eA z^<18M6JuM^9b0JGr3!o*2t+bac?n3k&V+)5wte!Jfc%Xcek*wr(l7T>-VFOzYBHyP zR)JXX#D)+e5fpkn!iTx_`Caw9=p>=o^W8EI6~2bRK(_yOnoKzzYyF_|YZ1ngp;;Tu zJ{yDqB%CoLK+}c)?qhRTUu@`<9?!zIv+Rf8T=#!RIec|C-i_!oAD@tWSl_=ZBMUMq zBWaU5+OUP|rp4D$IgLElhC3%pVL0H+WDVm*FMSM3JqV2QiVN`~6CGQbq z33&_d!xQBn(*=J|JxCld4|-ub;7Jbn%$M9U*3@yhGQzN*-+sqTjXB_;%=Vn8qcbmf za)qb+q+Q+rA`8%)ORNiTve$i58hD*oaZ)Umd@sIb+AObuQ3=JngW*hPMvT}FfO`f6 z7>mRPb+5XH20O%WKBPjiyOpZA(l9~8Z+S}c8=Gq|t8J_*Iqjn$-d?+kTeU+X@2119 zTwGiZFiS}Zc6}L;#mp4rRf{*E7H?WYW!5Jm7jC{*)R)L@HH`H z;6pabL@E4~R9885_&e?Lp$L!S~0mdPV+sSsT=)0L283KJkajCAO zGX{hgy7PzeUlrH)yJ_m?=#NxNLWkj0OpnSz!|mq)gha6(LVrWlTU*TX*;0a0H9K{6 zZ&;h0N}(wx_x{6p?H?{2i|1Z?o}O&kGnLM70B42>nzW%q=Q6IZuEtP*mmJdUj^R-O z9wlTM{v9uE3>5KywM)oD8s1-hougN-ZE{+Z@w{H3zRv71yO5ZrC%ikq#UT-OCiIU# zOEdW#g$?+2hU@gr85Q8_!oRy`Fnusl$)TEB1lg1igTyjI%yA@gVFwsWh_PrN;smzj z2u)N5F!y%P$qA&Gh4x4zj4EM5;LNX++195KvUGZUk#bb!`|e?RdLb~>f&iMf`R{QG#sPFE~?X3(T+sY+hIisQa`k+QLa1c{H`og(WuyxtopQg|Ee3H?9|p>wHc zI6)Uvb%FepY5(Ms6dor5Div*!44T%W0-E!Zzm!XlOgz% zK!er6dw{MDtHMCm3eHuuau(c5Cf`CC5QDsM`i*^x;AW01TYjz1-#m);2C*HvR$?&y z`&Gp=Y(O`aKG6vo%EAmSKZtP}{uJ_ugMJQWZwKq1@oe+hr}S+Kqc%K+%nN4pflgW}Jngah!c7*X{)!u^iY}$r*h!z%qvd0#p~t#N_=WzI;@Ur$ zSLYgkMm@&6)Rsy3f$nx7EIr8fq`Y+)VR@!@fXj=cU*JqylkI)-yUOFw65vA)9e-iX z&U7~sh(D+^(c~N>VjF%=!lmxnaaJ}C4!NoVqG2)B5Du`UHN-{WS_ zYvO@Lzy4m*Pi8g23yZ=~E1@$>ygPB?i;`JmF) zUGCR{Q}<}$v>MeoI?CA+8;?t(YMg@hDXJZ`(zNSOVkIv?4sTOLJm?N{b?BEQ+PE)T zD`KEwK*eyr4Fr-GevVmstsN4%dN>|{=dcg9@w=ro#oh0gVOV6E59ql&1Q4W}IKR^R zZz^l@t7us-+*sPs-lX>Ne6{>h7~4Alw61cFcY(`ZJ2zCs<%l!>-1C-U4{5dh(N} zBHou4s>qGRRFlF<2iY2manA|Xd)Xe-(_||#+OK8H`Q_f_v>sj7_nTt8=v!niKE=Xdf?&jthAzO5Aq=>2=TG&Q>jz5C z-=cZ|8|dQ44DOJyb{l6xr}Ot$!EL5_e_hTfi9kOxbb3P-AMY{2rCaG;j?~*`o-l{2 zIGv|gB}(v{a+3tOY_J<#HJHO5$6PptDs8TTQlB~B$WZ<^&p%t<=MaAe#+6hj=jB~> zhx2Oqo&Wh@xRu*Tg+Xr#B4I-8RX>1GE_W50x66@Fcb@T+j|}cEt9M`BI8bQ4uVtibk^w_{<;9em?<&qFkC6EUAYps8G&g6Ly%p0i- zk%$35{4?ez;%&IahVd@oVrHKE-erF~XaWAd1DwnTu==A{##B@pNH zg=2UrzdXnhyhFAdh~zim_Em2TGeU~R?75b5)%J1v&a!=>^%m!r7L=Fke{b(I*i`u= zt1a12n26k@K91$+!(9a~UaFzX)%>K%BJ{l!7eJ{8t$s|pL_B0~jG5`_yzRemK$W_e zua^jFK!>?+XO)0NO0!nb(AY?JF)1sP1m?!eUhj?RKh*Ju@#&hF3zVh;IQeCp%~t2` zGp7aMIr;1AkgrdX<&W*T(TisiKPzCwi&RSEmxaJNH`ls3R?Go<@Qu)}x(H1_@dSb= zB;|=kMMYXkeYy&GS`+RUE)CHFvyOz$jiEzq1uADNUy<`X+CRj0@SbJeh9%A_P`Q}{ z=GFDcG8*c^O9ZUg@Tp>$-P+_#uY4{YZAyTKc+kND1N9oy?&o{n!hbw@?UU}-+AK69 zKRb&RFI*h=SX}zw3K2!t(!-4rjnMTP0`{x(0clY*Z9`V3#>r|UneD2^^LmL7@kpV>|{k1Q$9Wg<7Ek6|1r^ zVvH3`lN~_C5-Hbj0rH=mhpjAPJDUs0dxWnd2+2bKUq6-DrOB>Fz{<=YC4*A38?-_J zHI8WDUN4+S$pO{JyH^kUS8E#V`OjuLVnxYREpXDoptQfueabpxd$S{K8Nl;mW9~zH zkm2}m*OQ+osVILAV39jY8?hb6NM1z!&$YYv@84Ik<=E;;0TPxV%zbT7-z-~bww&7< zYj9GGc_ostk_N*3=yK|F1SNrTHmD-PLsZ2TaNlff4c0Xc4cVcqhbhH=W>72;cs+H% zw#a%?lz5kmx3f!oAxpscLf!#nPy*d_vf-|Y+r^($Q6vQh7c}Ct4Gb@ex0VS_7LEWZ zI1!Rz_!Ea4&@lS%KEd{rK!wp5curyn2({u5fu)oL?;F;7_DypvNB7=FyGFISxX2V z&TushRGnbn!us4`*<38^5c%=q#o>h#uqgQJ#)5tp{;lw>ww7r* z^vVO{C1rab>;NU69jlf4G7*+Mza|WoM|0ABGhhu;l%<9#N}_9 zjnKes+j*HR+J>T$@0kU?qhx>FD=G271w1%N;DL*wj! z4|CN$V}2Y;&oGoR%JsuQ<6z*h7e#ye!0Cg=FV{DO@icL}CC9m}YPiV-GIGH**vj$l zgcVB&zP1Au4y`xO3Qg=A#>Q81LT$JArEsGDQvI~LetG3{ABz@y=uRbipCgwk%&WSL zMpjRZzyu4afp~R3eO?r@aBF9kd-)nb@)ci|`s+7=(W0zhq;Ir-q04%sgL64to}YnO zXupSgT4&x^cl*myW+P}%=sY)CPIL)hdSu`wz{SlS3<6${q&;QvzP_JlIefcL(tfPO z^B!sqlK99FX!&swB4kvBYQPyjL7tXzn#}U>JoOagO79akkarv@8{Jc-gD~LjO`}5V za%_pfzmE{b68cEc{9Oe52t^Bv)LxItjHJ7T@jo;X@VP&*!?>5H!_?C-B1HUHNM>#C zP}i=lt*n0+eP9a|IFP2410}z@JzefS=l&OcmJe<=Cx z-ojTrPV&I0ZS3FC7uh7ihgYABkF3mN|uJ4!5>C&uk2(qzPl9PB7*6-x>NUYjYozUTy~ zQ~^Nc^JF7anSWPsRqw7cjy`<1)NN_`-AMwHa!Y+^1O{IoQ$CL}} ztr3TMs+=d`-$u!UY5 zq%NUUa)L5n0c~ZFRL)HZF z7d%C_#|p};NdXB9V?6G=F1r5_>^7l=7m}ip+yJIO7oo5UK~1997p^Bj5`E(I>5hjx zT0IWm62dPPO@t2h_Vs!%~gAD3mz&sZ}KWeuJ^x2$+?&aLvoC8b` zt%EK)xOH%yXqY-b(xlsI527>of1CkFSYMYg2%Sm=r^ zaUfDy;WRjQG}NUfD>%v0`;#{cEiEM;*90vX`~Z)v4mfV|dd(j0E;lP7EDQJ5LI-1e z_rN4S2ny=suo32;cg*}y?-)Liv)Xio9h3|W+Z3$GBOu%^VeHA zp-IPgTQ`>Hh_RIX3)f61LO%p?K@=J+28WNLT|)_s)un0+c$dW6Vbk4gut1a=R%~1d z{nJJIiL)s|Kjg`uqxB%RLu%`(X;UlitFH)}rDI=@(s}ho1i$Y0-$!0N zlz7rOn8(=6#aRpoEx$b6MSA{pkd$!AGX+{5I0Sg5xzT$~kM35!zNDl0t2gF72mKCy@PL#vUPxgxSsZjDZ=NavTnT7A%O!#@=}ia5V?Sn@ ztcdH98tA}xW46aEKs8jYOF0A>9irsw2YmtPbI1DL_#IE``;ubS!l6r=r&HI;A>=oK z>f%FYG&fhAy!~7BG$^jMOw8`_yFVNP{3#Z7qfdrs${dn_jbe9>#_~qq%c4J(ZApYy zMppD$nOop;eA(Y^V(rHIDZsc~qElRk*YpkGmE5B9?v`jP=$iYxS1I;fhOz<4Ig1@f z6WkDS&2)#bCQ>fQc$H+XSDQsEg%h5x-R7r9)1=^=^v*Z;V#zbRne{%E- z7TwkLV)fYE-s!hT#aHlccYhsVytw=O=k-<-zGwjCED60MG)HK_XQ#ZoAN)cb>7_jK z7=d*?52;E0=l}Mh=^<7B^<7`TF|4tglENK!)7F3)n#aY~vp$^z3GHL`-VEdo)f$QoeG7SnF>XpJgr1kTaxV%t2}X5HC$@a$BxiH znXr+tVPCjvO%4uIUJgr~x zZp;cH`BLGuRA8l&hw5ti-;-1ZMl3-|4X}4?`xNAr=8qzv@awh`;Nc13(nzW+ai08M zL9Dt?gaiEUXD|jk&D4JpC^i5GF9AnuHiYTz>~2-Uoc=G7ytgF3Z(17d@Zasp6wk(7Y8yC;(+o!`lU;Q_ySA zH6U+dN_rgqGQ`&#*mvgDG%bi8Q)I0KmH1@tZcLUr7{ z-3z6n#NGvnWbf{e&Ih5=s?=I(LexOcKlz&% zCM((jjueD`5Y<^1nuQrFz_A}`wFVC7j4drBg4bt0ANK`AxLnHDg7H6Hjvc@kDBx$0+ zMFh;|h#Dj=La8n}Vuy|Fo^?YV?QEAF-x}AFlNA{-K<9>36Uo(!VeF>Lfl$YFLtsE2 zJtwZ&Q$SrQ_x%`6B5+-4_)kBPP$p^W=2ho60k42HE0zTgiM9VdIIY#8gbNy?OU~j$ z4V;SjM{-bJQN^PK!8-RBi|Oi+D?7sX|Ay{Q)cBv!Txptc0bmokDN)^t_rw56Q&bb> zE5AE(6P;GFAWuveTzucfmNBcqc$@r!^dxXF=`0u$41F{%4${`k1Xb~IwqiK{nz|4U zkAo`K%)%(ksGQ9JNkJt^9h%{hTGI%wv}VF>SF$;hbpN+FztljRzb$O)s!25T^lsd^ zQFmOPvGt-Gov>A;Rd10RxewZB7u%LBqpfdvAz+|H=Ws!@D*=PD*TFia&0UO}qN-$G z;W}!*)Nv)pvWN`eauN6k$!y=Uc~@o}cvsv6Z9WT;5u+RFdiK-RONMjAS2?baJ!N`U ze#$2_wsx)k-K4jQ?qHf?#WX-nJ&eYRe$miC8hO0~0yto?nqCy81Vv?NTw`*v^`sba zrOm6?no*kkXg29E)4jzSKs93(j>+iWa#Az`b7DWo;gDC0T+CXhhU-$X6YC*j&UB8C z7sbahe``zMe@8)7CoaDJR+gPQ<;2O8>}7XKKP+<5^8D0R-HHQ+Ur_C>myCFrjr6*f{-k(I#wlBY1wJ1phT^@FQb zZu;6EEI^Og&0Iv_q#$R{v=`I*R3a~3gJSLheGu3S4GaD&(|2eEurv4H{~a=%mqFm zyPalG82+VwKAUc1g->K$fW>Hfo7e?WsN9E?wP6E%wc z_g05Ya=Vp(B_uzcUsxDMx+TDYw5yzZ;+`zl&mx-KpK1n(X2hOO$gSFjKTd9nliMy7 zvahgJoLHn?L6ROszXf&GFF)WJ9Z`<)-t<3ZlNLjt3Uem}$2QM?lNE6zznQ(9xE#WC z(w9}R+d{Ml2=^w7W37UKjc3nn&}O}BC)iflE3tj-o6k*7lU>=$vF+a?~cHN;#s4FszRQ0M4$g`oCwWjsi9d1afOQ403|K`6@ zjBWHVc~SXN9L779#HnU@jzm4^r4KN6YP~s+m>LMA#{4jb0mkz&1DkSHVZh?OFiHw~ zlySsl@cV-;#^yvgd$$AFRPs? zJf{pWG1TvaFr??hOn!5IQD>m1(O6&n-tcZJcw&BUS3yyMR05QdYunA_>-jQNC2N~ycV_IT96)@{wT-S@ zn7*xN8LURd6fJYS#ey)|;JyS&p&aqRbzZB{6`SC<2KuO{z@ z&3IYGIY2g@00W>xYbk8e9mJ!n_9P?56iqP9!&DQqCikWDK(NrXcA+)s5rd65dnZ45 zk}*DtLyy6KSeMIdzT`!fmG1m9`@O6bCu=1uX&op;f^~F^$W&R1N*1_K9&SDpq;a~N zo$SbIy64R40aZDJZ47k{`Fm8i2x9PA{1oSZfc9a zil0jKB(Efjewo#u4ZO;w5?0?Na!r6NRcviZ@GM)Dn$E7Sv?qTCjmF4$Y3}Nu4Dxth z?*$feGz|cN_*%%gKiRmbz!^-NkaJNMX18+xyn#LwhV|#S zoj%$Pehq~f?3Sv}qp*Fu4}9;na!DNoOvj09fjuI#cA6GCSiyic8<-4Rz5}J^?Hpt) zn{O{pgWVqw>Qw_(LjJsaLM*se!Z|t^av8+BPPb5y9!Zlfh4Xsb2D$V09U`Y*6stFW zXp=`sAn_QI$AhX_HBf3t`~%B;LEkX&wB@X#36Md92pJvwdXiFIM9oQ|GkTLHjKJe5d0G5rGHCaGlU}_|$EBvEyn*DW=PBwaDCjZIz>S>;v;)+>q5*OC89t`ZzJ>ZZsv8cf3>)dTtHd~I33aNLW zpK+}X=$rJ;r*^De4b#kPY=**I{`omM-Czpo$I0V4mJO}!EJs={V0xDl2D1Y@XLXQ7nVlMCD zAJ#nt`q;h}b;YD7i$dgm3|^-pL=E8k^>zWwWLDfv80q5>fe{q;r?C@X5>i}{>**7E zqDHg!cigvSo3(b=V&yP7?X;y=7kt3!7XHbMeKlGAS?2DTrkN59a7j~VrXj^WNvgHT3`2=hK~&<$u7+(rNo& zCFK|OQSZo?{=E}Wf5lU18u16C7U(otN{*a_x7`N6`Ub`yKd^RTs+o?6Ln#YO8)cK2E1g{95bB-nFxSDTYQ7JOZZk-|MT6_$f}mo&cWr|Rg!^R3g#Oyg!Lt9+&0a}t z9!H(lHPdWYNhaU{lLkJ)`(MXQ>^{$eU%~Z32d84>MrjHXezp<46?We!<#Egti2Xac zPV=-9MGw+!D>XlQzR2=7L;sLQojv0YWW_zT_fUG@=p*Hk56;t3?ShYw$|+KRQWXnbDJo^GF9%OcJ} zz69-g^6yRRGc{w(Il#1X?3Z?7Uz~P{dik?m@(YC@Sbj#HF6@}mZt`w-$&8sqZ^k*z zM=$GHAekPs`w8~5A0Y617W4!Q97Ow}pIM1tP59p5xs*hhy=kVP@Qo9vC+Pm{TyO3- z*R^Nj*6ALNJgon_6C-pd2K0fp#!Dd?n>IfO7*3o>uYXd_`z}&Ng8a$yy}Q!+%xz6`FyVHJkRSq z&$n6cKW(0iZ}%=;YNCGwm;Bg+?Q^4(N#DiHw$cOt{iQSTm%`6YiN&s)ZFGdYZK!`K zs%Jb>7~0No;cqr7-7Vx-=o`cWVH%c5qN?N>8`c>rYC76lK;Y#IoG$tE{f~q5!4uJJ zhvNBS{vzk42>5zAlQL#5qdE-sDMC;EcW{$OVRRXJW@}NK2hB{aRCT$vb1nY&7+ip$ zMNm5_u@`s^!g(hAdYah8S`(e{$~S6(nffH+#H)wX801wXSa(o=kKs zb6zwfC10*;zT9D=@o&J+f8UH4@+P+eT*Qg}CB5O88=`ueA#Y>y#!pQA_swXJvQzmU zU%F1@gT>r(*0uaOi^woeb*=Yp1|j#;g}-eMoi@Bv<=2y=7vYW@=a_3QRW8^l`Py`k z$3Okw!|5XqU-Bv1Fw|K_Hw%x)7!f_qgq1^@jRj1{|K{EL$iG63;79oJR&ER3VK*ID zt0{`mx962^6B48TyP!(sn#0cqyhuEsqdP=2IYhEpG3VCaFfw(Rc_ix-GV^Nx<9{}~ z%(%3}Mk~#)wNWs=vRj1dLhUaH;_q2}(RlF0#Xpyx%L^{|FrV=|;pXte`z%XJ(-4zu zm@7iG*cqTI(yxC@j*HY09cV&Zp32={?LOMnQAL(R7BIe21b!_2&=+15yTnRJOiWb& zc>OsKOdXzh=5&PtmQhlj-q)qUsEED+{^CPs>DIM{sw;JTe?F~e@39ydcDCFiEd;JA zc&0im4&Q;ft|;PQc@H=gpUNkvA5kuGbW$>_R6NE!U|L<((RGYCG=ozuGC67L(zsZ{ zxrg+*bUIikrNz+DPy+@ol^mrcnQvY67eA*aC&01O19nfN0gTK-B0BoV_uuUuTAX(~ zF`K9*)ZloFv+!ME#XPU9JnzXrYsp7D(u5t-h3u65AiYQOGYp@UWy4Wz(;%1e8kLKF zee#fg+OqM~YswLY2hU2RwSI0+o`@s?O99xepM3b;HcMQsJYebfr&U7 ztdv>PM|jH?i!r6=&< zW`LW)O{-za9-GVTE^}abq23sLITJid)(Pp^lUo}A{x={t7*IOd59y{UT`nK><2C~? zCrZ4U&-un67D?;i6BEkwsz03ghi!-gztxMm?|IS&yP|f%OL*Fke2T!hDw(UAnh5C9!7=Q#u6@#`gpaW6awVrRUSD4;(ty z3nDjj@ac5`PaPb{73RLuN)!NI+Y8>(#O;;VVn_lk-HN>S)XS7lC*M#G=r+x8{$o&- zAwd!4Fh9s6DA)zo^yZ+SCTNMd zl6y^qp%>tETF$oXuXHWm+5;Kmv=_h?n|;GI|6;hC#DGrd&U-Ff4&f~35L-pg-IA$U z{PU;i%464+79nl2%OJCKxYGgNCUaitP?nYv5lK7*=C#5c*^Jp&cC@sy8{(Hxo?%^J z)K-f@>#4%mdoFh9VxZ`#R|*p0K&c8IEu{_eAY3Kc!w4}Y-qHut7WKL=Zk!{=rkL=i zhZi~RCJ4M)Il&X@f0rDcrHUNvD)c$Lw{G>xWvJ*G{@)-15D5I!!p-EQ;l)gn)BT|eml(RtJz|TR4R&J6BS!{ifU1#g219s+l ziU|*%z}7wMFy0|7z z0NfQ!u&pgLaA#gbkJQ2#PCOw6z|29!v`1}?{&7zuSTbZduS`}E3FnjixICyo-V0=S z++*xA^!n)8JhvgxXhu$~V>NS?V}}%&Q+ZQE9E6!Ix#VSYMAqZg2GM z+cK`=yjz=8xN2KC)4nC#R^MRq*kj$t7|&G!cv(Wtjuztl+$JG-NbPZ=?gvl;nXhr>D~KW0E<;Ami3d}Ei(S8zT7jhiG+{O|Y^F0xI_y3YrK4$_1#_AfE>SK#VLVT+&y7Wb z36CkyJSx4@cTc5SPa`ectS|4T>$(}^^$k)wMSM0rd%%6=i4gbGKhD~g6Nhqt7H1l0 z@FEAa`=k92a@cK)Sp1|Y4b=`^V8%V)6Z6Y3k~PWYKM%HSJV$HnSt158^p`U~q!@d| zv_uKvU~Ea7&H>oc$=?_tiyWGHi%Y_mJGZr-t))x>^Z)LB0CU^hrWF1D72^rV1hX-( zR;1Z6;>~hyQIb*f8P7rfE~|w$punoIdEK5#3>hHUQ^#C+{9(8jaUd$g4S)*sCU^|F z!f1sV7pP^O^7=unA2owmOnu7hX_HstVAVtV0A|*tHTNdpO;zJ} zCfHqQWy>E-JZ}okg;TT_996ZexijGQN0JOJyET~oqp2x==nACtCt@7WzY2u&%+!O%%RB;XN278jm`fw16H$Z}YuYBIwc=MBL=PV>}L>c;w za-Yf@%e{z!8*<_ zKq*@P0uxv4DLJ=GtWGkV_OF;7yEy*nGs);q1flNw1&wR9H(K?UK7E-PEyx8aBF(xv zN)J2z{@3szXKzB{VWD%ntH!!WZ#JR9j@Ls6RsvH3wm*(|oV;YG{Jm9+iu2xk|Mqj68Q_l1riIX2|K;N1`17%`%QU^|*lHhR%^*d`ZW% z@b`3mXwu(bgR6NHhQg`s7|=+}T59fnV9BXO>YRSX%-ZXJ;6^fNHWNbWNNzGi)g6=m z<;~rDH*YrEOQ${07%4p2wMXP-xL4Y30pcs<>4TG}WFN~P?fVPaj=$=fuT8xtW8^@J zJK$(ryc3ckJe$d+S4voP3(BCIC$Yu~65J!SN|KRJ=lV&UNjaALkoJpCADQx#QPa~J%8Glp(sz5ztv>oQ& zel~^knga2!5g-=3UHt-fh3;gzvyAdxsfu60y~`Ymljdb%s50{Tw9C{1L(bGHwQ=Zv z@}dtWM}o~g*aovnAFfs`dI_5McY<;*uFX{lHdgriLb-yHwWoE-r({4If#vv>!R7zl`p=zDk`V}MY`J23WY*8^6TKZz)! zC1&jilfZZFA#n0Z*QqR{i9ikjuY1Jv=A^lS(hkhR=(o3-Fpoo?Ee(uuhA=C#*e;j| zXZ>q{@4ZbNj^V8`f1ZA`u*}@@YVa1)#&|yZJ^#(tY-qhuv2sN=xhp5cGRjV!6lW#% z@&|*OR?xzNVi#h`I7@L-(WwhG5{%)~v0iM7l1aleaJ!1&1pMcfEEGR2OS|a78*q%O zWsWO;wn2`#rX)}smtmQ2*-gLK23^}aeDzO&AJvZK@+c#MkGSD}@i&mIE5VpIoz9hq zRY}tiLUKUV#MZ%^Qe8&I&k}i77S+&dSg&9EbkZe;mSta4cbA5nywTI; z(eFd`8?@J`<@On_IsrX1B2at_2a5$Zid$Z!j-e$*tRZEF(R8bO*G$4Ds zTL-Fi!(<|FMw~=%{yv0S25J%qEvvS77*vtqIclj9BNeSjomep}&83!QhI9{67lhrn zo!$yiTJP3`qes-P1i$gS<}LY3Y~`pRFbjX?lBh8 z=_-?c-5h0$4Vr7u`XS^7QGXaK5S0@z}BNY2}hAIIq$;fg;DjNap;eP#S^r zL)J=+DVQA$?iHKkCb=S2c-LTM8_ZM!_3cqQ;}mI9qW{g$O!wqkSUY`1v`&Z2xj~%!elhSzo?I6S%cb;XWbIVbOp&vg zg+q_|U|AOiLr6=p*%qf1+BlQ$xQAD_O)$2o>1gYu--fNm4vjWpVsYErZn7|=4(`N1 z=wR4M;hJ34>JpL>i&mjZ!pp-xQ)DWi)pNI{Tac(wyyQ{!@YJZFFZ(MLf2Y-Uc9OE$ z*h1_kAN!Svf=RUsGhgY7cgUBkKQywgLV2qBMg%p5W;ngj?yPwj*SQF$y}xLayi0 zGuJQ4p3lTtl(%@JYDkr7blK9PaZ}2tFS9eaJH9{=&sfpZIhni0l^JGXukT-ja1}V3 z1)#@M4L6tA{hbiCJ1Ix0ye0>|vG#p=tNX#p-f2`$cM2>9`!QWyPLy$B8#YYULfuC3 zk{L)zETgx$S~>^WE(4gg$O=~#F@|lC89`XG0W|5*Rx?-)LSZ=vgkA2a=OX6=u2|Jp z_vSxv_w~%=E>jP+;B-<4bhQVn_MqprM=Mdr zaas_95+C#tE;Br?d?&!n_kk-^z`G?Mj2FSXH4$p_cERz02Uv9_hJANqI31oyCBY`q z?YNPe5MZO*r9LnO)Ln@A7Z5-6l+HN9ASO+3*33J6XT4K{TP9t)hWNJ=!NEj5m)BvB zq`5jV=LU)g!yi+dxpXg9ybKT3DD!!+4+8rb61Wqu3?SV>dLlB2x&ytp1Jup`s0>5d z+mI=l5+e;45@L;(GVa#^HwZJ}SvK4sXYM8&;t`ur)Am8w3X7X?U~6PHQtO>nE6rU> zNzx-g-n3>L>W(@L?)bBa^#e;YOOb0tw6+6h*wPsr0kzul&p^%Kx%4-SbM8L;FYad0`+oa9Tx~n z=UV2E&NUoo?2n$}%Y7i&L2ZAY`$ZK%vzF`H^67*9*kX>}ylCVmdG;nTjMIz4bjJ^L zFUOHm*u=DR#uj`o23Vm*sNLz0iNTDp1$B%UgBCnniF_ z)}ap=7YeOOQzy%CqMviJDt}05I0qH`8lkH>J}lBZkok7Ezp~r_oROH~g@VyoRR)#s zlM-?$ZZe0t-ZrrYq@m9gNyW^`p;y(iv~H0ikvt`$>|nMR&!7(X9K#{1k1h?Ymypd} zh7EbLQ(xNz2f2SqK4xmM<(RQze!H|G!r>k<#Lp^G(yk+rGc1kp#_eg~WwLW9NyX88 zDh|<47mdrpQ@tAYNVna4nq|TS!I!lx-C#MnkHMjuds-nUo)D$*>vw_10Dwxi>T)$f zTl@*1d5T+8j6?%c-TZ83r{oSFj^XOIME&ve_`V@(v$M&A18c;Q%^PW6RELFJ#P9Q8 z4(Cp;rpw8+z_I*o?pZerEr;-HZ0$`p*kHw^kmTXCbz&l;+gH1H47u}UtjX7i zd@{VT%LPviUoR{xW|nK%NH<;FFa9OXAb(lPwK%JwP@;MYIS@_kaYJYRa6^)ciy3 zwK=}xBlD5*IHWBv@dbg1qW&7Kr2$n8R^Zl9q?Q2BADYKg0UY4LU=`a33Q%*X$q)$J zLE!ySxkBY{A@B!FZOGw*)#2bM6_gwBR+h(_8ZD291!1gz=aloz(O6_y`WImz6M1x-4wa9|0cHQSLASUwMR*!MMYq|7*vSqu zIQp?Bjx-7g+YJ_D=epH<{40NT&*6f{*194ci^j6tyMWj_Hv31AM7FO% z01qTbUASeD6J_v#Q4U-w-r_)GL&L7>iZ|QicL+B(sA2)H4kNCEsHXk84ONU1mtbMt zvxR~oMxLe>e$P?9ix96^;`e#75-aqE*Cc? z4q)TAXIvJFyet1GOUde<{vMaB?1M))PWH2XrBpH?(gvkJ%XO3g_U80o7t;WPpPvQD zFJEiQe8nOp1ky>TT+S0ZRNxD`z{J0Qvn7}4K_CI;VOc_VOoP59js%rY`4G8~#lY#{E!45b%2T!?d<9f5EEe42h-rI2(5sWOhurf!hvZvGt3ipgEplc46ZT}V4!LWX?YPo1lb6{ ztsM**Zj^(%KLggoapz-_0)Y<8a!JIPE zZf4$na||lC+nRX>zQ~k+IG?sgC+(rSccAa>hvxG+Bx2Z0EW&7Xw0TY>muV z0?~650Bu~}^S7Tsem8$mvO#UA3UfES{y?q?Kp5+QAZWlmNm0*A-@$RSz1^Ml>4d=k zvz8T4FUy4HAQZ{T2?$c}2j>+!D@|B~(KCt8u%peZx9{1Xo6$0Yy%S-y`k@g1x^(bh z+Y;g;!8pKmx=Hqq#2dWx6f^0e^x&TJ)Tb#gu1_AEvA=T9$g7Am#KF`Hsg?_K?z({w zg8rCGK(&_%9wzf;2+F{5{)Eq&qf7!hHUA#cg!@5JgxGZPg}T6v$b?m65rvJndlIH7 zVpyS41{_o>6eW$qQ|gMd`$;a&XWvhbgT4o98?qA(khw)YY;y#Dtv?FMy%F z4Ks>m@tBH}npd4ppeG08pfQ+j%dCA3*vA4Oa!RuaL*#Y; zLf?+x(Z>TANTMnCN(IM?UeF7gffSFtcp{(b`={MhwrWU``r?2VNA@=WL&vzT3CDQW za!yaZcif70KcsTH0?sh4^DD6S3ZY5tlUq=}pWxwxR(M>_Err+h$~Rq|*optC`}U=z z%rsoeELVb8VA7ntRpl6W@v|8KX{;qKt*Lo}f0{%?hz)D_Or3g1DdJEg^o>m=R!+p% z2^#zX-R~?e({VXMDF>yb88CScL=B`}+!9^pFzZqgU5IdiRZ^kJW3(BF<+KaN4t-TY z$4P`5$v6Qu>Lz9m*X+eTZJn?e!G-3+Nz`r)RRPJ`CmwT3u|p4 zEy*aKMsi(D+Y@~?>qU^eFK&M!j`QI`l#d$TRhPZ7#-pq2=3bgJR70g5=kIsEQJ~RF z4OUQA6C9j+cjIRc5~QP=p+3UIYAZ_at^BK%ZAYRUw>k7seo93oLg~h8{Jq~QuPRC- zARCI~*Y@Mj!ipWzXwfvAyUIie1Bs_ti(3lFo(s6V)3u4f4YF@cZt1e>r2k`o&WKYd zQ#5|;`<WYk-L7cRj}Zg;=^@gvhgWW{&~omk;N{>uqQ9pwBvnw|16^<{eYv(3p+S z!+@BrE}H-B58V1xtcML;mF!ew@=3d9)B#Y;TU9esls3L* z8RdBPv#<;bt0VxcV~Jk*Q5m zA(UM6+;IBhtEVBjKo z&D+Ja!^S3F?spIsxTfH@y$Hsz&nAtII|uwO$_+Wg#y?Q8hlF~_6*o5mXH9VL#q4fO zW%+$gkfGiAEDC`b`PzkdI`<|4Np@%$1-vMK=P6Cyb#EzPhfRz2R%KtwaZ(XYyPuQ}1A%=I=xTJ2TBLc_`PBt_5i@_%|ShL5bjqmtFw%$TUrS1)&B? z5RT6jet*{zSYTNxHx-h70r@EgC%9t|+{8R>*sVgYG{uD1TM1QJi22N5LEqQ=UzaZI zn%aSJk6CZdQ&2id^sK6{()i0)fN)AD6lwu_-mY7w-8_yqT1940ip^eJv;1~@=NFQx zKDKubpH!Cm+?MpAoncK6J8ZtE}^X28}u$4rVz*?&1P}NO9 zwh`8LKsR%(nU;=rRkkqMjP}g+I_C4{{RP%>vp~j-CSO8w+cb*IW-OXtoP2*X!~~2k!nFLHE1p!bIA0wQrY1*q14iU_;UP zHB(D-)ovvFRG{%-S)t~f^xGz*vQMf`E&f$|;QE#aChMg`2M!%M{oXuD#r?8@OS9YO z@2N-R+54fwwY6lDds4DVNFP+{lC(||f2rXec8(}J>p6iW$=J)#h}of;u&>)!(P)ATI~mJ?OVxKOUEc7? z+oX6Iz0}Iap#Brm`$DEx8hSF5^$Eb-Qp`f}B@Z)Cc2+A-J=jc$KlP%W*wNmeC#Fl| z{sY(^a1Zu~ZgZ-1_ocl5UkMF}%6>6T_WxC2@BdWtJEYz1|BKZCq~rT9y6gWZ_4?np zyYyy0i=0gIDN;a^N1Oy%sY;rXYPo~?ZE&X`BGlXX`1J473*hby)=)Lz&SI8357L|* z2q0<7s@`=eA9;QDg4j9wAn=DN?^!Jw3&@99qI_L)vcoqZGJ?!!nNDU8DV7lei&v+j zSI2GX{wyL&fpEE;g+1U@>`B=nwsnCpueJ`y2!>Tkq|`%pETi3?6@# zJA`y9d3TW*dVcU26q%oef-O%AnU>&+7vI~q1+XHGI8;3ZazaC7c3InbB1{zq?L1k8 zS@!nc_Ebxw6zc{c)k1h5S+&|iGpQPXkE(bGsb9cNi-PaJEu=^Z@x zGBgNfOC~S^K6qf>7LZmrh>J`2Ol4AIQ0@)ym0Nk+Y}Xesrv|d6x3+;Gvfn~X8Z11f z#ga&>P|5RDyKfPNT*0q@aQ8IKcQbozFL}G@8YAX^g@Ax|R5Bti9Q95Jkkx};$nNay z^jv7;&mh%8Jw9N*rjwx%=SA}oZ1wa>RR_sfS&-+Q?ipw|W~&H^-MSD@agHEi~?^M^0H5VzS59()zO zg{BeZ*$5#|X%Cf`9eD&rDiX8_^mdGxMgKSms0LYTw?!L*?>i3c`heM+w2gi;)=C9c!6QCCY^(LZ(~rF z*<@Sa!E5dUCp1%~Mjlr6aAS&Q@2>5Li-lbDINUAUF!Gw#1VWnt!`4gL`39y@Ch<)}bB4Osi8&>RT_$55oP zb@kw`=yZj)odBDWXUQGd*CgL5USp*u-{w56@Zocaj^L#p>HKq|PQSnfV}^^Lo+nl5 z3g~~=LX?K%PZB+#_T>|9^yRXEfe=Qz?ePa;ir5QnYM-o-FoddEF!UU+eF+Fs3Ef?` zcU)5R0!Hs3mc2EvKeqPFr;6EI>DTKLJnxae7+ZQ zAa%^@0D>C=8dD47#FN+pYJK3vv-D+aLe@tBYMG=s7+C8Ec)|wX9!M&!YeHg**HK_= zKj=XDh$#>oNiW6mg?b&VH~OJyoufFaxM+jWELL~79x~kCz-ZGf>jWV^&lU#eu(brE z>*LI+d+6&pwh<@DL35f-{BjQf6C~6~h@(W!ss`t9+lt!d@cL=WIP7QTuyCDcgMoWh ztyxVn3wH(|+==!mLH{C!J?zq;p2Ith9UT%!E2NuLB4}ae=hR^Z#Q%j+lrvi8G-0nw z@qQ=^4VkCY9mrTC)A!^;3*4VYn6Rh+CTngSx)-1{EhHygCqC0s|%m3w=K#zgU}nTO=2%`BG>=y%~k@P6_FfoQKi>&g{}lX@T=QIk}gSUmRoj%m!Cy zo4Lx;D0HF2cen1T42Ckx;g-GF6@_hUC>cxkX2pVZy)oGw*AQ4o`*{FKTtz(v=dvYo zPC!mR428z3pIgW1*f?hI)*D5 zY70iB^0}8g93w<+*y*$h&YHzhS!17!T*IzY-`Q3RYL>T34LVY>Lj< zx4SOENn8j=9lrK*_Rch#@3|Uh@=iZcFvUtSTmkedoMa*cq^=Q#=Y0svx|t zd4i$m_b0eyx~oXMuH?HVRn`u|3%qX;1&bV8d+3F|G&AQVm&sI@Bo1T3dpIT%z6{L@ zzEJ%Z;v!~@4c^>3sMbS2$=|6agJ^-*U$SJgR`9!lKLI@B%2;}yw5fLR*v;3C-#)?_-yyRxxOd+ma=XYNuPdYv^gor5~fAw8V3V^sv5$l3oF-7p=zE%TBFV#;3&qOH&MWbMKn-vZ{NB zDTtJQc}|7&oL;`+P833WQ7YfHM1M5qacS8mZ6IP;qeKj`I`Zi?e{J$mZ1pM&hFI8h zY!-t)&6I*aUvuiJ&YTy!*c%1aFHj!I0~<)j`j2sB$YvcFU@{`0q8cYiAR;M}n*ud0 zO21{wKu;|w3oSnR7eIUmq{}@*j5GC9-rqSI2z}Iq=@&P!QDo`bb#6cIB8--i+4P{j}Y znM%<_0SCE;4hKv0tx7)ZiFUg}B!m))6u`lt><+lDSTu!srFdoWeE3wM)8kd8rox$w z!@f|0QWX=JkYsvPu$D)#UCh(1zXSUv&5OH=#&ivTZ-sBq8I&6VntZTV#b}=3Dw|R%% z?KD3P&#r5re`@;AT76|#)Jwz*GR1D*oJrK659PFL`(4Q?-zQhOViBtiJFVv;qHkQ{ zzVvGaE$EBQqUYjdJ?#FI`Z40S-eaZF@`>RD=QUVZ5tf2AUJ93gLMJiKW#qoS^pKGn z+gMf`4RgZ(WV}l8d^bxPQnjcXQVP|vK!dy*gab3ve>y!Z7; zk!h4z2z}z?XyG<+xqOBokv*qvY~f)q_q#%r6%1K4P?R zcD8pC=HjyXUkgq@7m&^9@I!+J>)eYjmGv*nCU@WAG!ZRri_tcfiOWsJA zl+E z;2{@3bNc@e#O;Igr=K7hcfJ2M^zZxMU(HFth7h0MPXg8ce%iRx#Pavk{y#Gme?NH# zZCw8QNnCpW|GGQ!0Jv%z+hmkpQcZa_julP-^L&jkz;bwLH{_6 zzgb0BY}HL4sYVDb+{O$SCXBuL^DAVb)?<4ismpUKelgvvcVfyc!C;|c{MnLy!_-cN zn;`1v$xhNwM$2JQZxZK`g@qLLLBiE%QPy9PVk&#m@c&0j~@R3E6~AH?=Hg_}K=q zkfn+rZb(PI{Y_YJvWCZG?t-hNr5Yi!CRlTf z$M*E4ho+v)T=RR36ZSpal+!6Sd4D*4a+LAtJDOwy|22d`^zBYHhURSSbK zhxPB<5#D=~ZeC>I>3phF zZ&U=G2>CAcMtgcO^<-%3bEOq zLYU?;@1-59b1NA$*Zp)1HhNF66Kl_)W@A%SBbJ8#EHi0Wi-F79Id#UeI-VTurF^nm zo2ZHY^oddK&kxj8pTvpvE~?C|tGfXyF23FUq{o+x&SH0E?9K8*G_z9oDwaE+u<-WM z_Hk&~n{XYsSrD|cE}u`aYk=7b2nc9@(JB;5Z;fQIi?Eq2!C?r;$$VDbF4sgiBy$ML z8RH5u4?34s9s$MTbZ1?2>s_}S!cm4#aCJ{$i ztLyWA3w`n8#lkh~qv&Epq&U9ad$V7nn`V2=JR=E`U0aLZse!{=Z*GsY-U1 z$`gE>$porHgRlvtMa{VhjfY!G+h*H9c;lxJ7X*r@2e{IxzrZZib#!3I79~cn_1~R4 zYRW{x`ZCFxRS5m`!!xHVMJQn#pX{ddds8R+8)wlJrR4S9^_zONGUvw72st}N6d-_Om zD%~#zjju7Q%j=lkbnlIymlpIJ?O}e)eh1deVfd{6S*g8X`X_i%hW!iWLM3-u#CCUF zipB+n_7J|T!^o!hr1N214fcA*rN`xpK9g80)xDI9l%9jLGRCDTQXGNx$B`OFkUJdl~8RoCcQYh&dtaPJwA})27E_sxH$E z`-hepC3S1UI#sr5HD8WUtGvqnkmqXDSHyNlO~JOILK@_j_Bxj!E9Ul{= zYtGJ(km7Ola555ai1FsY5OOc-;jf)#A=BD9KvKKn#V1F7e78DS7WB^zoO_qc5+}E*=PfI+k82@jEI!&>?&&p(ESo%^d7s zEvlNb+(>QMXd>N;^gC>J(OK7?o=(j;95W ze1J+R#@c@0lx-U+(o^v=Gs`nYm%}2Y-d#+>a#sI7E2p9oKECd|KNGxAI~yU=TjT@O zPw{l!YUOyh&9H#iuC-hwy%=r1C(iM3p3Bd{dc3m7xN5uy)*M6@p=Vb=d{{gs>*`wB zMp&6{Y|K&15RV{AdWDLPPSPxxu;b3!n%xFrZ^9|EMzxQ|36qzQY_sFBIY%^-I|poRY>popB&PHQ zoR^-r5iKP;wbFX*kNbR_HZ4(gwW0i{_TB;+on1neWYioV6V~0n=vDRN^sx;-OIg9) zF8JyM4!sczqY4Q;wQi$teT{0y9#_MD6Hd1pTU_^j%iYn@kygxWm$xyegimdUTZoX? zmos>E)(Vc~eae$NnPrM8D!=t-&HqIPUJ#@+S+&I29rR_qO`%=_ru z5E;J9`^b#rxm}Uko;0^9%s#lYv-WMtqe-cDu4xaGSt;w7Ce}XF=#`6_t;i$jBRkmRTMOqpc+A=9&|=9I^kV? z2JyNUkGpTSP|?-7t~%Bm;#@oq<`Yt|;J9rJ*;Vn>uJoo)%zJl6+qSkGQKde=ogD73 zZ{l@br`CYwUVB;VoDVB0D&q4QXt;WZCwE}4{T*z%{%ZrcgGd(!zr$Gu1A=OXpO0Z$ z+gAk2&2%rTt=QKVED1g1zv_9{R!i;CFf*4;=vwH0s&ag zoIwInS;NobOWWwJHrgtD-`WR}5sxd!XM|k3$^*DdVpHbOGm*!eUr>=W0=*8^#~Z;C ziPQB!_^Bsl8}*m@%~Ks@!-CafSk(AeYa_Lb^)Yc=`n_Ddc(Xk2NYSki?3vbIN)ilQ zlRSK{?EuA^h~@iTP+Yv*Ia`B)r|8eXS^SQ-GkS35=^pUH9=(~ECmLHVRu;XfLd694 z#WXkCsqCz*sRjQt=k%pQN}3UU;)L#7Bg5Bjrj;|iyL63zd?~?}g={HxFaNH*QvQjq zIJggD4Ge5#4XJI>Pc%gPiE6I$4!6m(cc{aeATaV?54MFBB6y)nZ?QJMBtVi>`hvzNb zl+Pm+=fkLi6%pB(o$Ey%Ieag#?j}|ohmII*Jwrq<4aJ{>k#TCicwwCGWhY8+E|z-d z$(uy9Iu3KR6w8oT;g(wN8>=cdfQ(W_4YEo#xRVL(1&_dlzdq=Xy3K3xDZeon8Sbq3 zN~wR*0KtS2AJ8?tG?)()R?$R!PIpDaid~QB7P0aO-Gg_k2UgYvNh34r!bR1k`DGLj zlpjY*8>O&o7w_m8C1)dX&Y_9)+PW+~6k=-?^ofomDZ(3k1?+aqH%nXL6G9p0cHi5u z5?@?&3${m#jF|fK-PWfZm-7*!T$r0r(#i^`y-KS8gtF^H2U76XLv1@lP_?A|)!N1k zpIx0NX2|irgcwyj>y`S6gR##UM>q_xc^(vw6FUnDxWktLVT8a+Z5J8Jb-(3s>wZ%R zV-u;`dxllAD7sS5aU@+=ik1wc(xG9&e;v5-+POCFuS$K z$G1W}B1l`8LJn(=X>c9s&hOI+?nF6Dz&__1hhMyk7Kv4f!S$y*}%t z4cYk$25M)4-LcP+o4^<5E^+aZ7(@r-r{=>JyYkKZ(!)oDhq70D`&!OT*YQ0X`l>Ba zhf75E9obIS^65gaLC)SHI*p7R7r!|3rNFhmAtiob?fe*zwlaUl3`&%zuqm$6c4Yd+ zGIV~vyU2jPWLfaZ{V1-Y{5dwOK%(={b2(nR-u42fyq0ln$;WxJ-VM3tJZYcqa50wf zTaz{`2ZGVSSNyE}D|Ni{e5PM_GG$ z7uqTqOJnGf`1gZj+H~)8`ka&^tovU*ZDuhyc37Mp+`F;Z9)7NwH1A9$Weh6HST|Nz zjan4;)0C``w|#5AKu=h4?0P zEM&gU=U?mU>b`qCFF!Sl^=sv=5PkzidA$3^aH)=A5f|>mZ<)CAPpk`beQN-Vov4wj z$}I`Eh)j_Urx$YKuu=!QnlCat3?6gWk;PeGk4=|%kZJ<#jFm%{Nf7({Aev?j#88nR z*%hjG3^M27B8OXLe+nY3G4hZjbqe`qH5Q;hR4zCk{|-Bm6p`b_w9^<|U`?ctH?@93-5HYHwE7k*m6 zoH2{Gv_S3e+vT%4o{z>`5++4MdA0u7V1_*9bxT1uIpUS-wJQ??5T%`Kb3P&D5kGQZi zgA$9*Ts~yw&P9<-KBB?}Z8`)QIf-Ej6wE4x$CFiS2w!Lg!{70cPVy;lEU#C9?h< zIa}Uj?;E)>gldJG(}kKw2(^Cn9{z;Z=~9+!eQjpOCv3U;uaNMG4GEbbwNsDmeRug< z$J$!OXALtC zNrJw1>R`=m6vF5_Jr=Df)TX$`ke-9+#D9w|JAtpD#6VK zpYTM~_KQUweONG0TpLv?(q6!J!XmoKhl}DHLhL;XXCdw2DSK^$N9dJa$gs!yx7GyQ|pYy?p>S)WV^?DFP(}tIkn@ z3y!MNHkKzM5;T1JmX96{?kSryq+F?W;r%mi*Ju-=QZGi9xpRA?WqaNRuZwz5k%~;_ z`*_x0QVxJ`XXG12mz;(2kn^HNCcDkoB-#h_lzRGlHC?H5PUw!na&1D-SwZp&rRZ*3 zV*CcvkXN0ln|{i24sku7ym5ka5pO*qG@gho`DN;r+2Ih$LUQ|patySWIpEkwwjv%| zub(&;F*9sOiKky@l1+@8;eA;H;s<5&*}|u@9GldRYuD(^Hh}+2@Az=`AKr4=!MD8n zBa0(OJA4a|s>N*3yxNkV`%(~JS6;1O#vyq4wY<6#QrW9jl6dAbOLWxQ!oEF-q-@z^ zE<)y1cssvNZ9wtgs$6P^x8i62A;IzG8%H}aceDmH6T>l7>8@V=$uWT*YYCGmhj=>C zbsnS8%GA{PL`-m&A1$#+^5vZmzp$JnOt9!@^u_1Bac}C6y!qOG2EdLMqqFw~{a;BE zcTF*PsF3J*dOoT}e;SnV$0-F-GP*>x_cK>qlWn}c94fAR^JRj~$VuYJ30H+`smDrb zTX#)FYyW&Xt}(wiE;6?G)h+-+l1{3z3@aQ8q;PDgBtB0L!G)ok$9H|SGS)fzNcmi_&A}JykbvyL2A3g7@pd$wr3X@xdDy4sRs8 z(}=5OaE3W>B-2<#${9&_-f`yFvhW6OGh8+@otp3zvyS>yoX+R)=h^l)IB{!u<4^`Z zrz&46ZN$ZKux*)^FRQBtD=%Zt!9{l`w=J`{HScF)qo7=$H;4j?H=4#=8Pm!NjeZ$< zt@3SOm^^s7(^ainkA%7RzPLl3i9#TEb`FNQ_8PJYP^*I_?rf&@DNig%6>B*46^pcj zy7h+fSrSpQ$yim>?fHNU)UOXQYJQHxql3O!i5sZ|XrIeT!&WEz8@#0{Q;oBqu-xua z0}7Qh;$ivdx7gs`J`vn_z&MDiExwJR70c^8SsDA*Bf*zyEbk<^*BJD&_twJI+^Q1e z%5T-RYjWnB&OW{6y8{3;UMm=IehBr(9rU9*`?I8bK0o#eA7Q9jELtoS;(dr3=)@ap zo*c;<&3bkVPy68*lpy3w4+XD+(@tLT)4OB_XQUgPq`;H)Kn$B zDi0jn-EkETYO>oqk$M~!1v~oZ-UEylb?8vUm+gFu?x-p2t>)25EQ8|jc@+!>vp^bf z@f>xl#iz_1cIOO>#$}X@qj-9JE@26WG7?~ai%DSdS)=#fkU~lvW&b|p@d7w00Faiq z3ypT{>Tz1ouX+r1;waA)PcNKy&LE8Y?XG(&pJHlXcq4qm1Iw3->`Zk@EpIPLPt8e5 z{W>@5VD;pNI7nf@Q+jxqG7?)k;v4X2klkq6Qc| z9UBCeOx=nH^AajXy`91w7%r0$cK8a7j{vf$OqVLh;4}2)ANU!mqs#%Q1I#C#cc&ks zj?lKOXY`?^hGQ()>;@m}L^6@RbJi_N-*L%`lp^RzkXu@6gwdN)zgkv+Wx4sJ2`m8B z?jl?)UR5>W7{-b&*(+*9^wl>|VUCswzZgLD^=6fV4l`DyC-4NPqOD>*To7l)J9M-+ z&4oyFO(p^$Cm#p)Wa;K}e^%2sqx}}K&*eNYSp0L0)w6f(WS+dQhb4^=b3)P@c49`s zN=8++_*|z8ie%F}xfR2yOkX{BmW+2rAm@dNf#WND#%qH(#m48D0$E`mX}QOk*xN@X z#lAYi6Pk59VL`>CIWlh>@yqNrGeI=UDi0SswTQlbPQJ5c)bZP*!sVq8XAGvs4>DYV z1-;CY%E+N|(mrysyL|I58Dxj_)A9AR_03Qqr*X;AAvpFP zDhiGtMMfsh8FZ=~bc;I`>kWin@1KKQzo^e+wzG^Ro&7A%*cC12F`>_{ZZ1&?r#;9i zj65jpuNE+p_WWmQNh)ot!1xyt4{oPEI$J=HZWI*>a~Hvwjt~Y-Rk8gR&vVAH@{D4; z&b5(2YRB2o#2sADOy!gB{R7777Djy4{cTy11_)NnENYLDt|GgyA}A{S$XBVKFml}j zKLyXx;Ef#+w`9z8$>QxFeqoJ2_Fyz$g1-$4vc~VH=ID7#O*i6PGVcaQNDfNMMB0$) z?~Ed&1U>bw{AhA=E@yZyvuf|pe3>1NCF){VAGLlzlcjbYA2F+?+*Rsm20^n`dyCtJ zgr{;6%Qn~{Au;~Ai%K}yX!c3wz<>_*?d6+NV#U0N!+ZC|=xiYc1cP%A>Be%IBKZ70 zfub~kKCj>OrsE`A!SNNfr8Ycpc^$vzM7H2;dCZDP9sJUG4)TNHQAE5xiV6Y=B%@=^ zl#1{@K;=K~g}H;I1qs&>F`p%##izsT?pPcIa(ez7&xqNn@2aHHB8V7FIl0>VR*>Hy zr%!af1iqFfy?|YI(M@@Vowq1mC}})K-#icAl5{tj19`3uYJ*`F(hF8n`W)6@WWq0} zgE5+DnEsa^`}qGkdv=;{`+rQvd0QOeaSMMFcI3q*8Q!1E%G5yysAa}}f6LbY6Qb?8 zvGLuu8$UMBpZ`ZZ1rou+NG^1i*N^f4Zmmfqm!BH>;Nq-Dzy3@GSevp`k=vAqTy}Q$ zRYGOM(XL*SxKC|OT6MMH9dYk!eNRl@V1Xuk#tz--+89&Mo9&-MF5BhhycD%*bVS1t9qD3TuNS(L$}ET3JOEb9eE06pE-`SN;346Xx+6a6cXBjX z@8zbTs2Cm0;5!;96KsVYDcS-syaGZsZ7zf*{nOHt1ycNVJGloy$mVk*#iKzO+QU&)5C+r^@{E3Yj5PXM$lQwK0N|SBy~MK?E9&|>C?cH%zrYz z8}}shEqMR_@s_L@Sqb2pu?C+y22WyQ83>$kfFn9hU}d5PYGP_C7LnQ6-fnM$tZ`a= zH#K75HaTB<^zljWW0(Abf`VTrrS4fMNsIm$!B>Ojize^x`bc1F3`ejlo?~mDbnAPI z$H(%@zbJ1hTDIJ!L{&nPT_B1cGVgy;YJ_c!ou};xzSDN&HwUd6#{*VQ^}%Qp-Li>ged?u%lrQ=OYY>D$|*C?r>eTupP869#?^z#cI2bgROd6Inb%6~sJ zgf`PQe!nuR$0@QKpR_I35~r@A#qr)uQ~kNFn_>0(_b<`4hQvOb-bH+XP1aU4)}3Lv zc9GkhF9XRC>7pk@iY2bj!-UB`JwS(48NVu z)4}oZTIax1Vqd?l_zQcyC1jQy$;B_kcXuljGYL0u-QxR9h)qesqAxb&NDWqgS078) zW)mUpG{}j%qUiEkeKJ3D>S5ksD0TW(VlR*Y<CnH?rSK_Ah$Ql@4189C2W_$=a}aY4bQXtKn|GL4*hb^MnCA=Vw1aD)9$k!haG)AI7rLee*P(r@dqwO#2$n-8Z4=I%yLf(HB=vbt?W<&Vmi}s+`PA75gDpj-P?D!Y28)oqDlWvFc^m#fKE4+={HC+&5`{ zyPrKvmZ1V^qagpBp%xG6X1IMX;3EGzTU4Yk`Vm9VueCDBkJAKF=%QX$|hQyC=&RT<4ih|}p_n0qX7+OU6%B%|r2 zjAoJO;qeU*LNHk{UwE-L;r^Zenu?wE*hlAtE8>0AqM4%xR8HIfIM;-DT;bvtGO^!R zQ)Z&%8#9i9z-RGh?Z2Yv%gZHOY+C*Tvsw-BBu=k4W%~YAS0*jNxoE z?o-i@%k&Dtzm+S6SPdMXl3@J%rS@;iuDAw^irKtB+zuNKx6NTn^%W>BNm7@ad~iCp zeJ+^mGc%W>iGxn>gPnvT`jW`dubs^aWO3|mE-cP}RllM1{>_U(*UZ%}F1Ghsxp{qW zFtz-CxLB2=qVg|k#_pc?6^Ah|MYF+g5}oLkdy%LN(cHAd*`OR|A@PD1!e0yVlwk%+ zqF2LgRE#HBkLf&L+r)eI(lJ(LjH!LmQVIhc7UC0lsR==j8<^i1(F={L5`;_h^CZ;hn2b@}%e>3#pVGf}Xskl^OK&;{#gxsy8OD~g4pwn&6D zyT^9KY_7DWci7&wzmwx?LNHc&Xonomgumx8*R;(UPjyme@mNTXx0{JR2OO4u`U z0?egY|6p&7J}gv(G)%&Mle}haF5RT`YxZA9z``R?O-d1gngquleo+lmWHOhhC)+hp zkJSBlRuEOtVtLxA2v**J^vDtJYEHNs#jgOQ_|*D9{P83i0nVCr+6_k)QeFgphpmJ{ z+4g-Yo1?*h8=Si?ej&@xJAU|8t$}l(rntxNXFx$LR-N)+AQ0MibmoOKHc;Er?xIs$UYkUD-Hf|U~Zyd5_Yiu`1qSlD77U_!tv?uL1_P(fqnwqt*z4F4NNQ4OTk+? z*XZ9)?H_~Xnsl_*mx1loOKG|1xc0f%7yFlt_2Vb#^Rik_y6m1pLS@nH;UL3lkN(m? z%FkO`u5OJT2EA|XGadTdp2Qw>_6k^o4)y|PtFVZ#ofszJ{UWu$(+CdOV3pUd5pj?g zQ3ws&Qu6!z_0?N5Q2)Zu1#xzi<^mSxoqrFC48$Fg;WEZRz9Yu@%->9Es8 zc;EZiW&Ihr!75pV)?)MuWuHWw+_T{+(=Pb$wCt;aoP3@_a@Qm8^RqQ^9i8e2h{aVf z^9pOI@4L!by!n3KUzvgQ$n4+D)Uvg?El!4=YUT3zw=tLnL_^(>BgILHx_oanapk}H z@e(Qiiqs`EPo(mqBkaGNlfG`*;eP{nJ8>k3b0Y@UHh2#;d{a{-yZ^ z-ULm{Ozo0x#%k46v^*Qj^%{Tn-vGbmfdKBu)-}-ShV*nI|K5WDihNm!P7QOTlwPB1 zhcAZobP#_5V$*iSnKWI(f4e#*xqnmgCFZX~6-W&R%6i{gH6K@7p~FFmK}EsbPG4no z2RHVECOv$@rAztK=n_fe&R=)^2Mw6`ug)T}u<$*^)W0(B2n17f3npm}pZKftf6MOQ zWYn^=13SJ-#Q%s-01Y^w&-oQyC1WyVXoAcCL?#@Zj`f7jBTYWns>;}377BK^X8)6F z_jBN-mlZ`bv30(5F)b#g`*{+ly+Nj)?%#xH*|A&qk5rkmH||_G{rX1=n4a?-#s7Ae z(fdk&+!~(yzcYn2u}E}r<;SMh&)eE)g~@nUnxg-`UcP~9zLnyL&r*7Ol_57M%(nlN zpYI_X9es|ZY}Dm03Thkw-JkE_;M=V$G(l=G1@8ZCdDV6C106#Lvv-w4TK{r78F|UY z55{aGnKFQ8`YUP>J0|a~Z{M?nW}r0i$-jF>F10^rUMCi)b{bfN)nozXKu#I~1^Ec# z6G#FM>yhA8Q1V~p!T1bx`@+L4JXUL{xp{Qvfi0%(w7FGZD)*9(XLlfkEv z&4%p5W(UV>7n@!NHj0qiH{+qGRaoJM8M zhhnazW6ZHjn_n-!rwmp&Kz|LF4z~GpVye5zimY6t4P5$z&tXdS_OO)83BQc(9D_CI z>`a53?7)fG&QXBW9dQvc=;bXR<3UP_2T7kgJ{lH~Ca{IMg$mNjIWuVHd8k7**{;9X zG{g$ne+I98S%B)^`1i%=R6~(aUJaJE>?GCCir&@`5GyWTh~^6Okz;uy|M7Byu%b1#_r`c_4!dxjAQPHICFZ(5P!8puQAZph z<|5!dlpQN~&Wkr8B-sUf+fT=};J#XCz^3Htq0iiVhjUmf;b5+TLo4N1`EtK|^-w|m zOQvjZ$7xBWd)`|)_4G{${t)H5Q$=m(Flv>T{jjZ>&7l|LFy3S7*zl@UM!~u)NGWYk zC9E*z%3>-#RobZ57ygELrkzc;YhO25-~ZJaSCi^1b=j_bGsub_CxHjl+IJY2YHXLrf2V9e_(H)27bhC1T!9(tK4W1^&m+E|ta_W9=Z z3|0lq}r_ANDSG-iFs0Dl@}R_h$}A zC?CyU4!FPQEJ#-qo6VHCduvD4lAW@!=VLJ-Y(?kh-VgOUcQ+KA!Y-vYpT%F*<-bsd z(ooQ8xTuU(Y0qU!RPK+h8u(~(BY3h<1Vw$PPC}zV!UQ%wzZB>UB*3s<4e~Q&gVkTF z&MM~SYC;2XLL}+_3W#6B?-dDWAD}d9iVVpTtp`GIP0Z%p>qo}W*WNU;Y-a@T1IZ~v zd}` z?5_=MQGYuk_SeI|y4qjjEWGH!OP({xh5;o{o$-3=$1Qn77nJCq!rMn*mrP!R@CFgr z>G@D_>Oqv*Q=laMpBtAHMTG_w72D?*_wUJWI~n}Yn5`g$ezf9nuvre*FQDSbxIliZ zNzsX$nVEGA1F!+}01r&%*cY%w4~b;#MZmg`nrRMJ zQcwu#P7zQ`2S9JlLbBCdIZ}07VcKfdm6ff;wttE({q$~=@Csj0)edtCH!RRz(zALZ zWJz;uGp&D}yW>U%detA}KsXEE=QpflfLJI1KyG+wsJ)A;@e#mgwti8l$pc23G9e$4 z&IVZB88xc!^5NZy+|q#6J0Hqk{E5hP9`*$c)s9KGX$~Y@Wm{)oR zCKfd8bGB~xLY64X?E?6xGL0WN-S*}M# zmi@q~9mMVtwc!u3R|OBdU5gkOuOx1zo`E(uB2(D!3B#sitBVP8T&so6x$NE7ADR0j8(^czfQB$7duT2djy=t?@42 zxpRlCxU0L{c^uA7OlI(96A@Erwf?!!0EL8ZD}+T%dvEsyPh`}s)pnT@?wF_Eg~4Fz znws;wKffV9fB#vjPCsGb>{D^2XZcO*%S`w+|jRBeu3` zH)O-Y86NWUkEABV#qoL2;OhW0`m^ZC;Wpg;fS8H$GBL^iNF$)C4u#h5{<3mM)9Nc<`V7II*o)mMYErj`Q6ix;x2fimxbMiJh@(#$+jvu zJDP{6uBp3Cd7kuLcOa8{Ec7f_<6GXj6d=vB5JU@MkKmx8+yn9w&^{A3H#=|lOx~y#IdCYavH-UBZ`iWW#gB$it=WHHFO=n zm)lO_N$9VW*Yf@vmei3pl@&ijt0u|#`&)++;e{N3!raI$+{gy=21PJ~phkshxzP8;h~~kvpD|~Cxxi?#i^<2atNx1u{h^_u z7u#<5H@9t`cfZs&IP(pqrKGS%&5ABn4lPSi9Eg}#PyP1PvQV*px2#;Ib$HkatsM;W z%UZX+k(Ssoef>-*m=q{2;c^^t0d(Ftz;miGSp0&Un}Bn7#dAD?uB85i`siBgBmQ8P z5KLqlqO6a$%h7Z{iLTUBX&aZCo9o>?XP_^3dBB(&p-yGr%aT+1cq%zxqN&(m)pL*V zbZJBJ{(#T&{5e2Q$E!-b0kgKuq~*#TKFe5uoi0qkS^4<*ilNT}3AV&qfW=Fd1lNi> z`HTsoqxxHkFRlfwLH&vgZ_MT7cm+%`-=D82egc2db#9z2r;r>EjA(Jtp)HoUWmBLj zv;f$6?$Xs*ej9WWly8p$tU8w|w;b(tbng!!Li0!svt)SR zqtds3Tj&F*{ya_#$`qm){)Xqj?|Lgnn4h|sXZ1A43|XfHlJlR-Jz0IpndgCZNtgR( ztET-?seQ@3DX%t4*(E2DBoV?`4w4!-@7!TU8Tr*8;!6DDF44P7wtl>0iso}4oFBzf zT|qs@^op$WLNWBd`^MUYyaYowtC25JtWbC&xgu!<6%|$2;lZ{FM}8P*t$cKJwD;gi zQ&~_~G0&;_f16t-h|)~y5X#OM^;6om?KX)EEH{iE^8I?hlID@Z0`K#CrZM%CHV{e3 zmCg+XG6r#dq7_IIb}6`%{~8z~A~&&vIf3`{x%rSF6*cjLTq1F~%oAsM0CJit+_Rhp zwe5kIDdt8^BXK&@VWPv{r};6+q2@}>tMP_UFibf-q2nX;Em-4+kXlDqRK zUny9NNZ!l-Q$OVfk+dg4gTZe<{*js-ot|zhE8sB**iSWpmz$gCQGD?0G?LwqZ?;V+ ztEVwwN=j|{QP{PWVvwTnF0b|zOn$N*{;|O%{KKy2^cl!c_Rr0TSMxBmfg|mOHeiQ; zi|wMRStpOM#{gW zUnXyj*KQxfoCs$TOTYec6@&ahc*lDV0i^^i_5J(zKlHrW9-cg(HngQAQwA#tu3d*bshn;YI_8iVM!jn6{E6KHn;X_nS!XJD|-&F->xx~zCh+i9I(ASr+Y<79-2;}%lc z`!sL95y0*~0^tN=&mr8xa@hBS&RfoV!UI^JOOQ;VdlAmgNFe(hM&6t6tI^#^P!130f5aiyJ0G|6v7m7YO-R%fhZack>Z&A9TsR&Eo|v3zJ>EUR;LZuDnGJ z!v-~%9#Mv&2v;GJ&x6%^$kM%CM5GM1LqORd1ac+|UiK{1NlQK}Nm%<-7ImNG6$_c@ zx{L}$=X1Uu{J|>B9g_))2en?l;ec3*x13@bnJvQ_lu9pl9a%dKO=Njtzcp$J+C?{} zzKn-iA#F}99;At*Y`;EZ&h@OH2GzDSO$bU^VqEMWuWj(6n#)4B)~=-{4=(8bE#N_z z=8ZuwC1pz^7}6}T+*0D%jd8Nr_C&3QC1DWS(TJ-g^X8Aa6>N`916tB$IeP6nQ{svF zqcjqzhK9{M4cXok0^nue$$Dxz!Z_4#Ji!mA@C&@W@#NA6J{~P#CGWGchOjyV^T6f} z?3|6((wxP@MgO%EVHVUGymRV((Y3auuPkxu|3)b+53D zd|0|T9z>Wf2f0r9eO}Ynj~8t~sYy0W0+91xPgFZZM@1Q<-B!`epi1y$4)_x>mnj~! zg90QyaF-C1GWb*c>t}9(v)ZJ^19R>Tx~^RB^@TT+@fQ_CY%V2&d?7#c>z!ML;f)~8 zLNc1H2Ffl+$gRv9bRt%V%#Y~V z#er;Z71nKS0(K>OadENhR|o~OK9OPz2{h@~c#&Ao^~zB-L+=4Vb-PS)?X+XCp!t)JaZH2-^*skxgUiXF+q;HouAmsCuLJm_Y|}n_ zXpGRyHwhDBs_`_uG^M?|lQO3vb;9G|rxaB9q7gUDL zyi#1eq8y5_XW_2BCcmZc^XG-V+_`oS>}T2cWKRnY1R#_e*w$hmJQ;+6m!B5#KhZo1no1qY=uA52`(#?4gw6*0tSF5V1yn^#oQSv_sKt~ zfoFf!siKPev{2CVx(R+&`aWFq67i&d*KOo~{@ni2o9)pfUY88~-uil2-DTl^^qG>ncWOXy!ufPkKo3|XZRBTW zN*)7us{{CaEw)uDl`(4KW4FY801Xc?6H5|rZC?E6HseeXQR8LiX(Y@m?Pj}~VYx~a zbf)lcCS{$~$9?W1U%`fbEhay}b1Mzk*})OnT%V#{&BdhyZc8pmQ$MiBgVMK&N@6%k z3~9E2;R!O|*T5LhL3xR&o&TP!&@Ee|`{N7sY(ib)H@s9@?w;5x7w!_|cq>XsQ=DUo zcIHQ*8Yp5)znorN{pU&zn4Ze`+Zm|3dbBfkM1^RXXWEhNELyc73Y9B>7ic)f`&v9@ zDVlVC%-um}P}l?OkIj{WKBZOzur|rc1`O2r4Q5GS(%u+K1kpl}&A!G0Y>t8m^hiFr zwOGvm78%iUVpA3r6Qp$KT<;h5D^s=~fL<=^I|Gs2c(3N+;lTrFb?uPd#t#7r< z0Tz+Akq_{ZGG~lBbWZ^>;!$SYe9=kxcz>3eHcs2~^TD&9AZgK05?rt4T9RfAA6Y%d z=@mU(a}WvRd&+Y$m6c{h%nYDHk{DQE&=poWg_9UX zcVRkW&E;UN%Ra|Z7ts-Kf_4;FylJUjX<1iNkulC0XRe^JK8vV)$MxyMQXu6j6Y;(T zs{!IAAA(3*w{lJab^RW5QF3#jTreJZeOgUqg&=`JE)G1Z=oDN{{(QOH?22sFH`!nE z<3ATu`tvn|XWsmz1UvHlPsIidhy^heakBiljR&sq`wbX_7J$DQ%VQVq;%v63Kdq8Z zMHfUHgxgXjprwWBe2U6xe3PEF&{>wfc|EMs-??Wz3E*MIMqHrJ%T1`q2?M?Z!W?W@3sh-5xqW z^l)*h2+S!{1j+fE#L$LBD~`FYhXk<-CIZwvm;|z*-dS+j67zUVF+^cYp9W|UMhy>+ zgZ_K7fVdJ3%unfQ@PiGHKq0@X7)}F*Do(4hZHu7W>JgZ32Nkz@F4z&`7CNY8)D(QvlSlCoda%h08o0`e^+XwcR0&`D8 zKB&GH0R8j+#5y(b>Qjrjei1Tm{IeC*B0p=I=y(a@-#BJfXof1_GQ)n?Hd_zU3AaT+ zF+7*jt)3$0ROLLr*a5}rA0#iK`vJk~7E-EQ1BkLlourjry9ajdyBF*f%r<*vtAH2Y z^W`PVci-&Bt!en*4ZGrfLp&}nF6rLv{QNw8B#PzTMY3pn^(Nv?JnRKnqG0lidtV@?6oY0MAEF~kAnPJPOKmh511-Irx1a2UAc8$M??Ih>A} z#}^v!R%reow%#%zs_%;$9vcG-1rZUDZWZYiX#{>sNedFvh%`fpSfGG(V}M92-HkLz zOE-wr&<)Q%gZ|(Az_;PfoqNyOXYaMwTALQ$By)!`E4@};6ESH;8?1t}EW?Tb%P-IN z+V2rcw)fj8D+h^*i-*M!oj-r~;{pUI+L>~C*m~z5Jpla2omv^dFs_~TNECmstiFuN zsUyC~KKoMJOeICugxfC)RfBKwskD-+YJrvt1pe0VkE)N}R?c0xHOod743NJ2MCa3< z0^Q)_QH!oS#VxbvZ*EG*KT72&Qxv;eLZAz!t6m9#gBe@y2X(!4c}gKaSMi%CKUoqa+7eYNLFC zhEOgK%qJXmS{wz$&Jg=Sm#)MA0hVpuaHCoZ;@B9d>feL+jtscFjDg(VAB-w^p|qmu z3sm8XJnC190Hf2=a>@y2I=JA3DW&L=s!^`ang>(Y_55u}mo(m(wgm|S>)@=(aGNxJ zl>V3g@yW>u93vN($}Tu4)IqAo2IO9Ab8fR=*U?!GS61!ddhG3Oh)PMh1eO6>4Yyri zvz-lt1hzE+bK#rC?`*Ex2H0G-eJ)m&qx%Zp*5ONV|6o=W0QLe+DdxZ#HXLiK3u2DT z&3%CSH&7Y)TPbOGU&ngA%icg0-{Jh${%QTT8Miv0s`)oXUs^}G`0^9#pX5ky4Trp8 zy_sEwA{mC_mBQM9bK2WWH$>Tr*Y%#Nneu}5O{jZ<5cvU4>oKY0_K+IK_g9I59uD)L z&Tg=dep~XSe%BxNti;^vsJ6sWf+?r%S^pNdPY;r@!EmddX6u<|-8VUknx;VNinP7r zbH!U0mMg4daGmpT8A?dj?NWAok~LMo8EAiYrb(GMrn52WH@F}UD6Bi|!1H3X}!|(-#pvtBF08}ms z)PZh+N%8LDA=ZQxrj=Yd$iG`18!Y1>t&HR)00b;*n)Y!|h3Et#*%~ zWXFB}O3Tj(@geIaT?qt_W`g3N;X-hq$GM-qTWT>J#VdAe`@na5!jfW_y$+e6P-?M4TeM*b(jhP9udFPo1$$N?-|w zv?8!kct-;gUB|v3#H94(657Tld{uEa6Vh-E0wV2`G2r188wZuwgy;!H2w@)+0dP)M z&w)(wzT&;1ClOygZ%qmOq04a6Qo=^;f43+N_77y(W8>rK-(2JP$x)*4jj4Mj$!vGQ zu~vIg=SjPYV;>z`)+-yqIeW+z;{d=jUJ!znN?BPR50XjAXxB|+wLI&%Q-B(4aFeAE zE1Cs%0S1a;RS_$ESTE3hYnrz^YcokAM|KXInJ^hRu!h>n0uUH5x=p6XUmul68lyhY z10eBz-Pe1cX#@qeK#d?^k=FIX`-JZ>o?1~>rkfU|l~nBiPI&jui5xau;rlARayr5& zb$i|~aRsm)-K_{>P;HhWmcFaH3|J0WeBF%^(kd5sRF-?r1=1st4@oI(A&|7zPjs_O zsSUts39O37%zQSq30j^0u2_lTw$f*ZLbelNT9U`vMUoV1G0JBRNGvK;4duKq!^p5efMXTGuvm&^#+GEmPG(xTR9cRGU9X9@i z%)5gw?0Hj2YV{zU^z6~B{k^PScv*;7wP2}I?X70onH*g0obFga(8vtNomffn9u&|e zj2f<+AwUIkhIM+8o!lp1J^yWFY<+t*9aI>m@Q~(TWaGa?hsq&^}W|nQ@ zn`S`{a-Kve8`-|SH>?;~q-4hub*=m4;QMedQQzJv6Wb_>L6#_=VwG#7>NyU=5U$Sl z6cP)`gOZF>o#k_!ey^2?eY>Nf3!yNL0NLGzVII4CE{# ze(A<8U$PI0T@#dJQDJU|D1Z?)%_=|*7-*H!M7IATW7B9ffptTztn5$EuZo4zXuDCE zyXbor6X{NqA6xYxTj$t-e_&wcA6xiuf<_!8J-wufsVQybbx0S68q0_C)O12ijhil_HM1H?e0CmM8v>oeS5|ZiThRV*%Lm``S z14?SE*Ct8K`fK4+bXKiTo#n&>dg&nu+TCFbgdixZDPy$Cfo`1|+v+j$4sf08dj=hQ z*%FeH^|oDFkO=|k;$C3@%n3mSB{qQ=@-y4@<=I>YHB@W0INAR@m5;xtnK9} z9}5%yv4h4Px;&hbaGA3`!)yA$Eq{56PIJ25wpBSgO}s zx!|`4j3VyIGxq;@U1jp93x%T(Sq^0jR+W$wmp+qO>WpBtz04N`MRqN@zV}F;~ z%SdEQ(uk@qpQ}0ztUr;TkKf}G06EFF9JKf{00*~JE?P5Ry~@e`GqB-dDyo4+v9(cp z-^JnI0vZVD38SG;*8K*(v3Z>FaQO?=b>s!mA{K}msjJYG6VrBuJR~9EM##!0lFy!> zOX^ock^BheXL_Q{S`8pG;rHY>BHUUX?cQ0MeV3By8ok?sgP$X#q`AIRfq3R0t4)XT z&6tzKEPjK#t2wFJauHm$C3`!T-_=uE;}s~nv&|!pe?EHVDhq00e7m}#4>#`qpR%Ib zwE`6vV+o$|l&u(^8QVQ~d6;PPM8<)O&zn6F#N(RhXrQtS^ZNvdKcAkuE+9U$H z9K0ov$rwPJ0%h?C)j%o^-HSpU4kuzzhD}wat;kr=j*fd0$zKlv%S2{WwyvCQK*bf^>NSndH{bGRd&dX!KV}PJVufcKK1*iPba#q`(kJX>XZ6i0>={|3vF9 zEqmz_*ByOmAnRpxqn51gmgPde?R4y;YM*PvLbE;z#F(=M#r?R3=*EP+CO? zAkZJm7`2VmJFiY#^!}Fm3N~tL67Me44tv5`axkJOTVk=(g&xkW_gYCM=U)|lS$M}v zY}{{Hd(U{o;RFr5k@4Saj=u;84IT z5VK6X?i9ZRt_(7VG=ROA4h~=7-+6;N8vzt)?|vfm9C-OyuxVN*yNE~u*c>_(J>0_f2g%T)$+Oewk0*hDng|rZDw83j8-8=_wxTAS?ZSMfB;9(2(rEe zP%T14R`QPRpLXe^gqQVAq&Cur96U)ZDKM1x3!es&4re~9b&JclQTSX?d70EyCBam9 zOvDaw}lyn(*{tz0$^jyCg%A7*{I_kc_>hR8plGW*$n=m|<$ z5g*R4y}kX;pXUDwGyMQZOGq{5dC?4sBDACKyB8JAW=fX>E&>Q#a=hZ#2e-mhva4G#%C)ynK9uMTi22 z6+yqq+od;p%Ot*hCui~HaQ4t9#D=CF4kDezY(mLSBF}5-E{ER+uk$|ni zhR84)QFLxC_bxcKwn#%co}aX{Ii1GsvI7(m15m!U=2#AbmK9H%5`@TiSd&YmqCYY) zkO69Vp>oLsp2rBEaQ@d>8ungcIH~Yq#Ej-*@feGv4no-T5hltdsNkPn!4|?*Bu|{g znl8RY`Wski|DKn^j+zz~sZbHP58gDWyMU}SVxdEjI<}eJYY_l_hFrT+==6*OdBz`@ zKDV}t!!P%@w}1V*x$H#voePNV|0zpDmtb*%>+*=h!NTW{fGY*M zMrTnWEMoR$LQQ*7fRS}ODk_Q-4B$JX(fTUYq6m$q`*emzos=EocrHeKyF_!$=`whE>{sy${H zsJPG+1dF;;%QxsWb*kUnXOmK5N&@`&FMkD3^cyV=P43R5(|BD_YnG`hkpQpp&(8TXJp}#& z)|J-W>`*Wvc#dPFrLE!|mosjR1t&({sn~$N>?Mh!;F=mK#Y@}BbW;FVddM)2FRmWfMTAcdv}zt+{saB%+DYzZctiUR#cc+8vf zZO}wY$jpm*nbncCxb(-8pL^BJ-un;CpW>)v%$j`jB^0_n829UhG5PlMY_N#}Vq7<+ zU!Ep65hW)KN2b;}vof~0M4X#rQn*Ti!tHqkoHY-<=p{#gVff0Sf+m7G)%iS z!YB#Hc#5ps0Gu9%n*vDER<59pGT!xdKuiof(0#5e4ixG_i)y0%Leye>5{}bw`FG32 zm@II8#D9I=I83=bWpul&bHl%A$h=lfNDhdDm;1S{(W&(i7X3_q5YldOy{ZD8u4jj{ za0s+DRPP1JJ%hNocx#4{LLRcDd`&}7t`(aV1d?6G;Y!6udPsiG)gkmmnH+%*6M?dFoU?v?Ux7U;ByMP%RRADU*9tUR7i*|}Yha-<(?{9(d!7X44FTsxaejlP84^5TZmyhA zZLV$$+_vg|YGW7qI0v+{&i;VBHAOv31`)Lt|J(i&VR7?FjoVtmV4nHs&mSN)HUK1S z_@dA~t1BX}8F~xE0U35~2Kbg?4RpS%Cva0Ue8@nPXm+xDk;m=RrF|vcs z*|SH76;)J%0lLm<8LEYSC=On&)Wc%&lw1!NBo#12xC;jC0ffTaa@H9_ZQL0z$sVwv zs4!}_iX7Ggq^drC(BI&t>s-`B(@Q=1N&ZHO1$3=$f1_czjwsCLAQg%8= zSBOnLGs)}{Y{;BnRmOAfC;$o%%ph>R3?L>R1P7Jdk{HNg0kb~7_Fh3>0dsJn$fP-c zFYG<+71zbwcbwNG_}&)Y&-W?P0tjIrp22uNS-+)MNw5K(#4%XMet2Wz3FH@!5QX)H zQQAm{OY36iv@r)NbaU!cJ9OZB;=Lgb07*nKMET@t=fB-Z5u^W-g9kM*huPC!D1>NQ zzd0VgyV+Gz2c^+Cr0krt7cX9%NKdumhNFyw6Rqq3s}aYZC}F3An5}M8Q~k+BU;WVr zqc|G-tZFSH(k^vA-(3KoT>>^p(eK{9L zXG$9fR_uLn2?>BwO{;igf=n&*@%yof39o(&?y`1pMnf#*^Ar^9!(ZMX`Gol(-k}s! zhZ;>^D0KYlK9OI|c_TeX(=VTUr{_$GsM-4)0(a0YA7sYf2VS9}x>l}S3jempXsiN8 zT>|tm2w(5sZYzn+xACnu2O5!d4$+){_8qnhNv!_ysA?4%da3ZZ25FgG|5NriIvAhw zbWg#A$y>l8pxxq|4Vit8{<5$li;BiRkSp?=8f$V6LReOV;2{Fxi!Ztn(q+)Q&0VRj zHTNW9tf^XRZDCCcDsR#^&^ZGJO+`Gw;p4C895$Dy&JQGkz2yO1DllIRMw8v7fEQAA zPh<8;1eaj7?Antxsp-_}^L!{e0oOv>`?X@uZz9y_HAi}$ z`ySdM>b6&!EYSKqdu6x{j15Nnqdogg>?;*8K6jzny*SP7Ta&7+<1kRF7nJ?H8SG*E zSl@*0{OX5)!EAekE4W73b)8>3MR}nE0{+Xr9c8ZO-FTiEPQuijU)SPxaP@K13puh_ z6Z?{7gk)nP31YT6XOV~h>41u1KWO&WhO^Ich*zD_fA==XM^cMb%eO>MPd&?M4<9S% z@Cn33A>{N>RBDEtQAX{YlV=XaFl-(k`W6UhopQ_owR7iATA6M3Z?P$XO}Z)Uj3o^p z)jQN;!BE~Rk7rKJEq^=U2p!@$DEU(BUol0h6fE7EMi2yljKBFtoblpVt(^8t=cwRA@7oSMzS|uwM`zPhG!b#MtNYVPT=knZ z>B$>8uRDlq{jz5tl6vR%cruHutUv3LPRmK`$zi+J@YyCCXlVDfPrwn0NA=Af90Z%G(Wwy>+|T* z|LHBVd%3;r``KW}UV)1sdgQ)y&1+NPV5*Q3X&kx_N-UhRVq#Lz;OlLNW_taQ;~3G( zcg)vC5A*bir7arn>7}FmP|+~=R}V64`EEr$p#Jk`8ZA7LU!Dq};V>Liw6I9k*VlK* zQKkB!NC!-2%EE5bME#{mx4M_}drVm!285{!unafvVr53|^KHes!GB|h)^NtaP+SCR zNo|m-_LRvMOfG1g`VS9j=MV8r_aD$TZQcw^|I=0wXS0@nw5#fi4LtT8<<_nCjy4qQ z-NDV}mW>S1`@qCT28Kf*ZyR`XaWGh6U{;p^5ond~<=*MUZb)|LVb!0Le`@;!!B#Op z$}0ZXwMX5$=te{(GAihkI+##>!JB~ikqgxn?8qRTdyC}!m8*&9T@X+p1bMMdHhs4s zJ~lfswrs_?h(5GM{)u`1#{LgF>o?r?49$%|?=;7PE%w(eVQ+G*g2;nk1y6j!^i%-{ zDYLy%8x=brrXcH7(x&E#zFwqeQGMM8s8>$YUqnw+$GGDZ)gqZqOEv>$9xUE|KFyLX zg_>xsE`5S}-d;Iti;d6+pR$GG_s9o2l4F%XZgTx6_E!!SNE(>m1 z`ulaZvEvU#_h5b`4&^4rhF#ON0hstIV5r^0Ti zwdCAk&%=OvAOWFEh6C@Havch)Oq>_u?Qec4j! zLPfG(+3dzvS~hwwmxV@;8}qM=O7P}8Y^01`T0q|36=q;Q zrQF5^_H8^S-6`m9U2BNP+iGD-NvLChK0pTz;A8z3fas-T9V>!9l)niIR}lHx4KIQ9yc1$qdg65a|0Nr{Q)BO2+3%jdoi@k|k&y_-%_!pcB!{mxQEpVaA4s)H9hDje6E?fv*0@<2uIZ6x5 zY5~q<7T%14HKdcX`n&Qjsoly2;1Rwa+(f4tMwbWy+WB&{%m_#S*y zB~oFe!Eq8hg(KCZ8;1{PCZ-pqkIgdExV2r$S@mq#y}AA83@umQ^M4n*DAX8wqhe(V zbr?}ocR`{=^l~@R*<67C0>v#g8R81M^0MMr`J`WJuD%qjq}fQZM0aqulM^GH6Gj{3VKuv2wpU2#8HXV$$X(u|(iq-2OKkHx} ztPpTf(c)%Sv?dGjluOTO>v*n)S{z<@8(urT_ap7=S3mH{QC^+vXYS}&38ob;1>k~Z zxRff|MCiuCX@b~`vs{gv1>2jA6&ACQj+5Ff)I%<4RSRMZ;N1H2hS-Vu^pBaqQnG^RXOoZh+k=5v}q; ziVE+aub*S#R60*WLOyB^g$NR9gD0sP&H#eR?mdkmG8GH_ch@zh z!-_I8UX_)V4$w7y*_q3Cwwq{(0va}Ti+kGi5X~)S1r>G!Y{=Z$6_MfuQ+h0UApawg zJkM=J69o>>Kz^;CNZAw0>t@kQ>}rcm1{P%jAeMN}<|v*Yv+nGHKzah}8u?aP1$3c`orETGbJpqMI>mg*KO-9N|asC`ObK%f!g|K0SR$Hk^V1I?LrA z)yDR*3ht_BI102nU6=e&uRCY;b*ReCWv`q#IbWh*!}yyyG2Av#om}D;Kh3nw?POR z13o+FBs_cMqsPd=;8*OjRR`mx02CZ-=WDG$ckbM<;B3>G9gOHbg9SFV?M~YJx#k}= zoS}DP@GFQy%0@5r?KhN-xML==>cH4_D-~$SfIB+E*3k!^E1j7W0QzIk&j|UI?95sM zbx5*pbu2(Z=GVg>@*yJHg3h`^x2Ru~4t2lXg0I+Cgd9el06goa{KZLH4h}_Ro#oqg z=JGA6-NlfS8dL)zZjY7j+E0mE`k|T`HDSexooRi>=E0H9f${ZT{hD#hH>^xPTBp#J zJ`xMTx|Rku#@ZmRc)S7PyrwxHxn+$X)lG0YJ5F-?3}=kZGKu>Hc)Zo8!bj)i@cjA%hrH1x)SDDnQ2uB6vzE+^fWY~PouoLvduMAond&A@kt|wx&7av^9S9gMOIf z?H*ZlhG_m0WJRau&^M)^xu6aT%@#@rFXN8eKE;lFc$Fl^v!W&*u?0aaWTuiUD=!}m z(?X>0-hErRy;yH36D^;&1(Qu0SCIDm+b|=<8)0`!HkRVw@4P`ELYK1&oWI(i()0Ho zp!O)HoECdo*tL*!16c|a3DE-m5r#rosN_Z5H1Hyw1@m-1`#F{_ZRZrvCn)d@ot@R@ zzY|7g^X2x5UF|M1H|P+*`Gj6G|3 z{q;3LTEBT|hBFJ#Tu3VB_MPW{8lP$hX6fumSKhO1lmhdTnAK1l-Z^_ukPpBEqrpZW zjEj%24>O9Mnl3obQ;{zp_B?U-Y~G=!>djI-B9p?+)tUFW?_oZ39vNeR;X4 zWxr+(?mA8y(l~cX;J_N}))SE(R`|}SrC%BpBc&dr`0FYDJ5s4*@I-$Y%Rzx`CBYI7 zteRzPZmm2Jcmbuq$Q^Nhm70+pHqhytTg;{u_`HW4oc3bY`x!2D0fI@~6so|X304bo z4g=r=8^#s1e3p!$lsUwh)M5HO*~6>iPVJMEkQZB6XB7L5Q}j_nU&dklkB!i9+Tu0=`o|5j%t!vDg^LUk+65}MQGeC?4I1+!dX z+?LVDV{C2(c6x69bH;>u9d$6hg9ckcA6#$<)L#Zw?Hc-%>Arn-5@L7LPvvdPNzd~7 zM4`Qop(-^>>Iaan7Se4?c~~+?xDZZhvavY62vSr}h4rzI?`DnXto{xreMD(aZje(_G(uZUEv@R3SDAX2)S@qHqtW4*jxQtz! zQh43bdCd_4UNBwHaV0`qT>Qm0{NOJ?bBV8_=`=4q3T&qIyxvVSqUigkI$R;y?$!0t zZ@sAIf=XF%wA13dgjC7XXjJvi?jP+K4;ri!Jg&RX7JxZU#1r@BOI_}h(XrS7d4FJ| z$>c67E!Ec5(0jgzj-T3%ak|>Z&At@Dn{47QwHJJ1ZOBIdU55b+Bh7+=jT%uZ9p6EC z`POUY{>!8rm4*DC-izBQ>FX)7alkOpa2AyiCbjEuqh*Wp{(IIFq~oSOzPjoU-lOW* zsHux=1E_9GJ|lk}u0U`MMyg2xD{*&CFn4i@Knz z3Gyr%sSsV&V*1)BpAl*FYuvBvuXGar!!o~jn_0KXao2+F;?EBQ?|nR4KaD+|Xn6l^ zn92n*PtkW*r|X4t6QG0uxqFF@+>T$|@={z*jw;uLbay!>pYG)E=Up zt}7puf@bWr2hDnkE(@d)iICWl!bKv%eu$@W%054;-!t#sojh(v!y zuW-;h5BF}7u@Gk@MsZ%Ni|I$T7zoqwxFoWaMSXyG7E6#i)PqmR`0vlY!B#(#`8_=V zVNv6q<;ux!`fM3ICQrT7iO=;!2uQA!jQPvn#Vy0QI_1tZ9d_hWY780r^$^<^1xRI{ z;0XPXXix7$s@sa53Is={OPpou*5-5sD1kMx9Etm&vxN^E1j9H+IQ_1=Z9l;aEHx4+uljIwxH=F4OFEtW7}a+q*;*^WW26ABY2?j(NZJ{?7zHeYjBI1;#gpx(MAu` zT{8K_+@sUY@SXx?mbhv*En{p@Hpy(x>+2+Xj%ODxr&$rd>4FD$5=O5#{Qt zIbymZJCl8B)ng=kuOt&7#HNEn@HT@p^tJ3qeN*eRzdB60%?US@<8K1v0R4z-BfHzJ zd4E|2a_OmtTBgA2LM(DXGF!V5*7Gq0OQYIPC zNSjT||8)zbtgMJfmdx7_^&}9b=#7_`Kj=9`L6KwBqX2w|JjekXY%kv>2Mk`NHfPY4 zIe<>iKWD(HKFKA^St{ldy~o3h&80z5=RBLXPV%9SUHVG4)3d+WtO)AD73xFSLtq2e zJgFw1JQ1w~YU?SXN%-*&nY6nS@+Xi-R{rNt?(-wGE44tff7h`e( zU^oW>#|<1DmQ43|XBibkMSMq+YQ)mBL&vyso4P0ZCLRi{4;?}&FOvLV%i1#e)9DX; z|M3!4Tbb&&Fb4oy_B_Yd#=fti`}HupuFw}JN$Mc%Q6YB)VEgbcR1(QiS!O*fJBToD zO{=ma{^8+0Gh4qvcEHYkA5RgNZ} zJ6C*aUaIn3F|53J_IIc2#s?+h@m#j*xYaC;^Re$6pJ13jNYUbQuviJW;HGX4H7O}O zHKwtnn871iaxG^y4jB+e0;Yk!7-$FXqsIxvPAg=&K?$|Fz0?dI-nUUyk(QUYu;C~C za60Rf!=wEMJ_9{r)GfSz4;Anu8idbN2qGGj+m9ViwB?8iPA^1-8a3t1gBpUaA+cF)x;F0} zeQ%B>ciSAyC^nHl77pgZyzhX1?+W^DihDYO4f&wqJE;DoNv4};Y2Lzor`b{Enx6mm z-!O|?G--^#L;C(3OpT&ubM45n)ZwVItn#{e)1;jtXF9VnPwr7`TN~oR5%$>Xzj!In zC!7u)Q<&94!fQ>~MlWGO`5*60R{G*+jVj%=Cs_uk`4oU%HTO5zc!YG7$0Gs`yqJd9 zpI#F*b0@Wpahd(11WA(6r!9n?GinRLM8`0mC!b*EZd0a_kx@M~++*?f1DV2nqB4ir zCr>zEX6gq&AVLdJgS6oi;F!Cbw$@n#Ff21Sp+kRg9=kN?08{Ise+l?pNqRg!)-_IK zT^a*^6cTmu49T5= zUN4Yei=PwIp1BC2{igY_h2zvK&74(Jg+GkGS~nUjcMhIL)FXq9W8C>{8q|*r8pwrZ zH6uz1tXGO+zkWqtEnmZq!kRzuY=6zSH`CWswU3_u<1u=fNf5%%m(;dT;@%B)Pd7`m zI{kf=kd?S6nQzngzUO%g6?h9F*h=I~v7*8oFc0sKNlCzFOy)N4`DcwwfK z=rS{p{HAB=_f7Au*nG3JY3uu2RIMAoG`9c7<=;5%OFYHmNb``8E6t*KGhW3ZkEqk`f+_iuX`gndqki&H=G(XC{ANPyQAA z2%0R4nZN#yqQ0;`pAyl>pc=TPS6FCKJ)mc+ag7VgBcseIu z^$Y`26M)?>f`lljL;~KG!}OOsY}ij@MB6D3r?K6OOKyEV0K0fV&){E1^LSBRH^ekG z??*d#Pmyzu02=w)F^_2dKHHAdDLFJ(cm(biX7~w}`2x)VHq>Aq?PqccO-A#4ismK! z(Mr&VW8~(}xvk;qTI|UW>f{?!r*|`-bPl49>$Ei<4KHH5j>m&2A6CSJz#DF?93YPc zqV3Q6UFzMq5+k^==oRiaZ%rE&_b)mVuD}xsT`Sg10dTDhvzYvvVx1MY7Qp~2>yasx zdthLMdH@ALpo_;@Q?m0#p$rcKw%??Q_iK57SEIdm9VGat|BO_~e4wzKnH<+SdzeW= zsBF-L$xFXwnncQ?bJAkANZw5e+ILHTlh@&o-NTSI_tT*1o4{-Pu2upZQKt;1=mB|# zr3Y4#j`okKlxZDr?u~O8%>SV1@98Bh665nJ44=e*+u7VB)i99o1o8yhhE0xQ5-GPu zxKnP9+_!MDwT4LhOXKm0~AA=EeF=qYw%6fWw$g%yrMX24Y;QzG0$q^S?X9td_ z*qhGZf(9Y~g7NnUVYaA0h#?rlN#FSlIb9u^dyW_ug}@Cl6!UE~3;=Q+vWdve<$(+w z4Z7@xmkRo6FkwS&W}q^qqDiU#k&!GP8|HKe$PdK~nbPK&>X#)=N*T1A&RM-mFHG5A zy%*gAb_kH)m7a-F0wacTG^q#+Z2Yb3btew4{V=}E<7(p z&JbDg<2pCK=*CYW<|=rPR{`e&JV)`_JPs-(p@p1KiuA z%RFi=F?n;DO^#p79O5%VRQ>y=7*_Emaw*uFVjC(->AeIiywliUnQaeSrd#}YWHH+! zZEjF$8zZGBp|gsIJWA7`LwtR)R;H2OVKmDir#_s0j{(Um0H`&wCw($Ye?Fu&YzJSs zHJN zH&l;o4k)KPH`?T^c4}4E;F5Nk&)tyz3t(c7f!k;WxEd7Pc?!l7H6z^Y!JuR)$ckU% zzjIV)GaokmuRL^FcXv_fpoJ>{RC4PMK<6yj6;1GIYE3CZo$ozI_SYRhhVi#bAb{0a z0fNw5Z22%#Z-z8+p;LC?eE$p{Rg7IT_Pr;G|J+%p;WkKYoyF|2K&+JIv2u`#`O586 zaSx=F#Km^0q#H^)X>C`7EFR52G{SFfQ4XxrM3_-HXOC#brJbU0$72LC;oZHGG394< z8oic~z|c4N_`3|?`2helRQce`B~OcWo2rYdFpKgm3{h>2OX_BIT$A~(8dA{1lFdMh zoig?39b&O#!9Tmqig>D> z&VG$ng2Q*HEELKgXYrc|eJu6|-gX(Yk&LZcaZ)3&XQ)#nkR0fH2D%;e1)#nugU3OA zx8S)VwDi-5#yR2=^>g6Er1aFOVNA8;lHWe#KYY9S&-`i6(HeT#$6~RC4+~fv##s_r zdWL%_I$u9V$V;4U$h{eA^kESxXo22%<&d}`ws~QW$;&Q0!ESs*L(`mCBlc9$2)Qxn z@c!;qclS^z8X(iC>&tse%g?U?$@k^{IlwaCGy_C$R38GCglEDB?_shp@s zN$SwzM)R~(ZH5hht2L+x1#@(3K)8a~uGSzR3a=O5Sq?za6Uiw+!0He6nmn5I4eD6j zhJRxXJx_YlZODLX(TXmkXBvtB#orvRiB>D+ICILkN2Tj{1H_{Yu5`wLFH z0ZRB}@lfl^`r!X=LTf!RJe@kdoqUo86m7kBkkgZ(w(uv{GF$rec-%u!9U1Hu z$=juc&2WkkhnzDo^zVk<6o(qeD4USv z>QOkq8Bg&*vOZD~vEQMI^4)p2EHF;>XCE3Uf7x}y$M-U4UGn2K=n&NWZuyKfG1leB z>1%-IIsTH&!pc1Ub98Fn#O33Y9pIyIq34QSfxZj&)fh_@v_XKA71vx@a&{kPD))lq zYGJe*vG4o7wC}(y?GUhLtW^-+(KivEO0*}@vU$G@2505G*iRFRzgt^elSwy#;eJN#Z zc|1~_z+$82<;`m`U*_vK1Tg!26K4$kFP|OT-UAg^n6zf3B1?X$pzE9e{?bl^YcI*aeVVW>!i#3dvE45+=G z!_3S~WO^xObNu^I?hF6XGK=O-we;mEX|Sct?HTE@2{_l~!gO!J{9i;q_@?Xr2k6nE z?kSo$l>bgUzHP~-*GgjbLLWXx59W(OlO#1eRE1oBY$XQdRbO=W=Y)vVyi`E$8-ai) zfv*)^f&ILNl?%{s1i%{y04T=MYTpn5->%O$85)c!eq-wSu1Q?v`m9|gD8J{^`BnqC z9QcgO|N9-!7|MaR0nfZ1pd?Cg_zZx&S^{PWQGuwPqiYsQeqvU2eUJFvoh{VFVH^hY zEsxQ%1jGi#bv%vz^66&>F=>REM?6?}{ktj^g;2K{7aGnr4$&*nvSdePqA6`f_xviqhP{8|#tm!m z2&{*8yt#x3Z~P!4KMs{WkCThQF;~vut}ml|iu+{s>UcDhw_R>e^0^zpm0Afzb{m7CwPR0pXpCVCBmTp;Avm>G zhI2^r{I^HX&r!!f6NeE-U|PeEj2KF|0qP5z6c3W(wz=)r zi&s1%4JhiG#@nDm^xZ46A$R8AI)k1J#_c6CEDi(#-}lgV6j$W^MW7h z_jl0SuGB{Iy(^Y>irjYpixi7|TT)*KM`0JKkNz)}K$nFGnm3ji&q{txiQLqH)XORh zJc3xD(<{m%uzwt_3uFJlROW4vsNDbW+g|Ts+1V;hJfo+M zqjTU*hp999z<=5H8NiqDwJ;Z?-}py>{rd}bi+shYugA`n z?71R-HsbxJKW@3!79162F2As_VBN^sRYM!1c@5kTOzhjSCoX7A6w_=(OaQ0~@WhZf z`eM-G8>!<1AD!~xcTGDh^st7~djga9#ps=pvd45C}^f~Hj;g<#n;8M_^( z64#|~8XEJE6|c8nox$g&yamLtZaWEOKX?g_C&o{uAQIB;zTE8 zrMBX*3Etnprh(9PcK@{h_=A2pfF7*C{h`Ps=f@jim9 z501}!j6z)&3EU9Bl|jMr>^qy$8<~}K_WJbur7y#9z)@+p?NJH?a09jY?0idq6Plvq z&2GCH$d!C|quEWyz#y(0DI*MN3*pq2cId)hb6F&DmJ3P_wGIGhO)Ya^<|8r6nnn!% zHVF(GPsa%DEGw#|>%Rf_mRewF#Xg;Ey05Lxwlvus0-VV@;oXHZ8?Zp-e&52bTjkB= zPdCUo4F8xj&f0~I$tIv}x7iADqQ_NXbspz^<#xeLi;~PpXu7j=KC(m>PLdcWd~qW3 zJBhiW{S?TMf?Rht9W`6#K6$gT|}$hY_Qe5Jrw#m3RL^!l8UGf#&dU$U|NDHoF`C4fx8)P({zN!nOh2tqkn$^9q70Z$|| zIN+&x!6Dx1$;X0UttOw0DQ2wkg+FS3*_}Qf@0OQE$g_6@be|Rbp|rI6^=)iJlZm}6 zsE=8g;|E4MJ6$Vjz=0_IUufVlwkvzG0}I!$6!W1Y>@s3^@1I=7=M(O@PO#Af zjqSj!bm)fx#d?OuUP@>@mZhY$eI-Lg9`&zyz5+(%-crJg?gvv%lZnhH3>Gv(q=3?% z#F{F{J!RWNU0i~vC}4(O;u2n{CEGF|DCY+8gxc<|?frby6nrUjhs{kEiN9y@&nfeI zd3^A|@LTL+f=-F!1G_ZanDcxPoTTm-+%7J9g#XOYxnaeVkA?!~_1Rr@koAv-#v0K) zST`7L;k5CqT0{{HiZ4;eU_U>cK3E%W7onl?!#x8rp*MbC#ebsoBPG^ESLLOUqn5aC zHjpcCLWe8A2W%h$pOF;N5C@asR|x_N)GyJ-6eeZoYZ8~(hA9zGLLxDu2;`x8#fNw< zfICKHy}gw`a=F$Nrc5S>I(dW4<4G0>qHfx>I>SVhfVDY12Mcox=Ixw>F*DKcIOyw} z3@GxlR)i-hTJ!5~Xcz8B1uGi-_q{Hp=AM=XX!stqGplz&sS!CAxBmh$FfORQoaJr- zzg`u8hCV>A`>CW;%x>lTK|BzG!7+ii?2pU>YDF;DATDuygAb)6_Y3O%WCzbCv5vfs zq1b(@baZHAT|Z0vtvpc8q9z|4jSxkZy?XO&~yI{d^tdJT24;4i2|{WCX!gc7tO}N=kDjJt;39MHcZpUT19o|C-n^VFkjl`p7ev zt`GUSO#=IO@s}$&jNE#h@!$#!Xy`~Tei4wRv!{ltf%+*BAmlbs%@kZ8x8kV;OVi1i zgd{ZRkzn2IAWyWrNNkJ(YAHSjM?xl`7Eb~nfiTq@sfuCr$SaouU@7 z9jjlah$cv%L(U}gG+1WN%Q&?jY>s1n3g7J^&nh$ z@dX&?hr!XqsOO4AlS_A2K)mT>)?8P2{{0T8cVKF27j&qo=PViGGs)tGU@F{`_D28i zxZw-3o?X+T|KC1fdvm;B&}=u(e9{npt+miR|*m zrf~|{;p`3QO)Z$mPD-!I&}`i;-yzKW^r`#`@ZkUN&ti<=CytTfq!0fzpYdZGN~09| zNv>lVK*>eKh24^(Eq9+p^+Dm?FSmay=iiDu;c@MQwio#YGA7q(t!z}&d_2d;QVJH(_v)vK<}T(!Rq_>WnV0F?#F_UL;=H!U|rF-27Ok8 z{HETCemZ(Mk!>$3{3(k~u!A`S=`Su1E3T?EIrXoaLr*2|!3!sql#NCzH#vN$5cyrH zzuunvMyiNlBxZY ze&-Px$q{AIln39-U5+R|xaf~#q%&<4HC>yC%ib*D-W%}qd$_{p8DI3#pmduD7O#v1ms>t<^kHYAC&phZT-_)2FNzG}mG9<}Asg%d-> zjdib+i#2knAX4dTXp}?Q=V4d1{U`kzhH8=qDY(fBM;e|KcHw!r*KXn*6BnF(VJ_tF zMF@r!L(d8Am^YrW?4Bb$i48d!k_@AM2Fd3__J616S@;C)x1Ok{R`V(vd>e1vT@>d( zJquR)`Z!ky&z{Ge74=lml^Ac^V~G%`IX&Ay(aUaN60I8)p?PsGWIv#JUc!G**lf?Y zQWclAi9vo^sT&Vfz@K-s@2R9P@z@5y8LMXGD*k$)|X*N-_bLEMP z>=fT`;1{s_Pnd0*;UO?P=WEQ~vpbuF4e?g}YT42Jo4Dow@d>_Ji^0{7Y`vZ(*aSK^ zf1MAwe~s(!*Eqq~sQkwqL#*)Ibn4aW2Ak^RUuAV&y!4+Q;d3#}N6GaIhDUB-d-CKOV69>}_Gd!|; z`v36G|4Ln1!oL}_tmZ%G{@o}36JrOJHf$cxb7^djyStmOuw8jr`@&n&>@NO!P!@tY z01IQnkf(wy{h9PT&N-WGA*n5`Ox#6u|88{{21FVji5p(`=@9NtoR`=xqQbwK%JV0F zW!}MG<^&(iw3U^AyQdZHy6)FV@zhsM;-#fV)`V8FQkLR1K0NY^IqSL*<0%&A@vW!7 zj92deo#lAZvV4;{^^OGDUY|B$MGa#)o-lu_GUOH%v+lzB&x(~4ZimIzdmwZ z*5`AyLIF4H_i@FSN6k$CPiJ2q4rLp*ufo2GB*W zZgO786F-nQ#aBT!ROL0OWHk^!^Y3$Lf|!c$gYV}p$dwl+LoFKjY;U9dn6v*rh9*ch z>z0tLIvz4ZDX1L@UWXf~$Yp%Dy0GZK{>^jv6qDisH;=BXYfFy=u;zW(zJi2dwd@-@ z`*Q=Xyiwf-(DOQu(tR8uoIH33s!Ez95RV^NnQc~srr^x|Xm_ar$M->?# z-@uW-Lxy)gC`t})+r{Ut7Ouxff^#DTjrVo5&E~w>^W|8)0`hwET+!T@&3^5a;~$xpt{s*}r#2$H|=cW!m6A*@n`g>+oA~ zx=a!Zx8B}*`hM18_{G4EsPz1zPJ&R`Ig=se-ZQSPtHtA;cZPi51fMuL0~J^|p3jME z!xiOq`xF8*8dgGYIRDvEmcOX}qxv=|!ooGZ+?U);-Y{}csO5>vuz!mBn|(|AO&28f z;bp*=m%7o|)E^eDlYb+7+xUqObI4ty^Xp)y!KElDzSyvEo$z5d+v93CZz!NMYR#uH zmh@*qFp2~3|mtaGlXLVWN6<*!Eb0Dlr{m zFC4UU?kSL9dcp>ZlW7sijLQWar2oO>Ylh=+ZCiz}Z@c4J36DvjIdv^93Bu+-K7uW8 zaH5Y7^kniOZe16CQ%_?QpH4$&`KqNpd|D=zdGMxV(jN7&r0Xl;BxKDL8PFCf=XsKE zeW}_yhv%-pZvf|p3I8~NR{Aeb$y)hxb~pwcT~ z_|{cmGqE!lO2STL;>6f{DWX1JiZTw)FEeY*O`)?qZzUw2#RhY9FGLY(E4%uJ1Cp2| zHWqESpOc?|@_0SR?F`*DY^uTLcld5oavbz3sQ7ihI4~O++Mt0Ptf(KahLaWnL4V&f z$55%|XknYK7TXFMRzLgB)sKo!;N4sZAv^7m>c`F^s{n4_hCiG;&7z9?2_UAlT|?4r z@-16)MsdEP1ZgL?fE5O#Rfqy4t>ngm^Ag1lu;^ZQ%L<|aEo0ZMvOvrm<#gD z&)&Ez4knq@<0i(7DJLDc#h#^h6E_CLim%v&VG)~M8d=>%k2rC$AlbuD-tkcP8LIHNN!{Li} z!0&6r=qs*RP3QaGV-|aCS~J>r6|`ErJoxujx>Xhmfi5-(;E!#?g2_u!_Kk<(X{%$f zMhcN}5sVZ)*(C>Lz*Zpdu_LYC#3$6^-hJ35Jvn^tfO?gekBDy}tucXtW`uIbN-bJEyj96a4Do zC&Uo6%Lak339(E+eks*|!Za9S$!ZqM999Nvtmu``^#w>8M_sujh(6T!a_&O>#{V>oUB`82+FsdbClDTQ%>JOLMLB zczsfB0<=wAh(bDrwuYi*DpHZ)c=uU46UKjvs|Gjn6ytuYEit4-tUhD8U<}Eqm!L_3WkO*;gX4iTKUMPEWDv@=La@S<^2>5CgY> z>GT7By*&H$b{;oY&~7o{kS>91EaHg@L$vq7WV`Si5bhS1X0_oTKub-5S8ImVHJz7N zYtfAr$C{A-_iD|{(>S>=p#VWjHS@ZfXynfY~@YIq(_1bw{po* z{1r$gyISz*o<^V9PkW}_Emq^STY&J2i@hJ@&vWv0(b0n|_hEVq`$=%YJ1Vw?*YwDV zP-~gw&wHp{8NP-2Qn5$Z3L@}Jhpd{W1eI>B_dVMqo7d!v*1LV}z`-{X2SKRWgm|LO zfKJ!&?2EM3>P@PIPy4PAukYONzN_XfQ=WxrzTJ6>l^2Q?FG)@}MIOyA)oCIB{%zzL zaQ!DaZ08xVC(f7Iur>zf>GwnTcC`H>3}`1g=l_dfzlZ`9Q+#IsdG0HYDpGfgYM6=b zQqi7Edj6kSxet!kH1*x7J#cJx7Mx${auqAKS4bys%moE+v(8NW1Jvl>jiOfv^1xlM zReBU&xAmf+7k~bi4N594Zn4WG&#g*Sa&c}Usv)-!|3?@?P3S-{upEJ<=#=f{Sl~?pSKRZ zn2h1ZMylv4Wy;@cI)kISp<@p%COHJK&bSA#lOnR*3q|A$pBeWCYRHfyFgJ}&d7 zI_GFsi!#(5L$&|_e6u_+H08P%c&0uI#LA4Epv+Q!DYu_x=DqJip)!mOZ5O_~PkW&f ze=@3)$U>w(>C#q_3#*sOF7mZ)d9SnF>ot`y2Ri@!%X@+FfhaDnz{zq^+J<{dKM#Np ziGl7XM2|Yk`Afy>H7B+k`J56NSe6@sXt`X{A&zb<2AL`5Y@*(RKwHYFo%RBU>$U(x zcE20+I(v3%K zFLb1*I&-?Ul|3)r(SM}$M~LBfj0~f+5Pra&v zN98sVtgdjuA- z*D3JG6OEo+U0L0_zkcfn)PbdW02BH7`L;b>$j0Ic7>Msu;ZH zSBQeLSfkD~E?z;-Yy{ZAc}9e-9t&r8=Y@*(S7yE^d$Op}$bNzlT<_%qyRnU6y*CBZ zF8KhrZX*cGvZcnzYffH=@nw%U6a?Ra&>6Drdv|r0=TNZdsSOdr?c9{LE(luafmXEk z2NQV&{>W^ulMQi^kt0>!wLGas-WeBXD;X~2fs@2ZvNxgz%dFV&kQfL!((QB}o$`V- z1=5lnugT!!qFo?<4IdNc;oiE1^OwBDv#k>OkGcAO6d_vc!0Pkz+@iH*HxNTwsg<9v z1u}}j&e^cT=?qF3+-|LP3>*UEz-~j()lX*;Z+I8gV8bAZ*cue!is{h}EzI%?MHqOQR)D#RIx3#u-8r66XE{ z`h_i;lb$l~hTS3jmD+)7m$2^~-i7R4q}D>B+tnn47IMw$-fZ*z5 ziRZ62|O}X3xY3 zj07s7E}VT`>6Z{jk3v*in`u%#|McN=JOi}-GM^)2`JD=-o8 zmu=uqVrTpN%HF^W=S__OIW)(u@DvTLlUh0LecSX0eq>8XXv7=dJ*3(r*3zQKy zOFJudL!7P<>nd2HeG)MU|6NL`*vs~Uk<^W(tM z(c0;Pn;zX6nXn{d*EXOVaevJTWgBuoqnGAsTK_Z!bg?(l=vkP0tHxmP7H+dsq1xJ} z=&+<^k(kV1GMG!GQ9`-K_&|~(_Yzhdf?o`s9Lr8v7GzpHDGA7PvXI77BML`qHJof-pz!+W!0yrPH4OE(2Un%|$p&V~iR+3(`FY{J&-bLXZjlqDVNi%x%7ewSbs7~wa_Qf@L;#3S+c}0c3 zsz|+R;npup^2bNLO!-WY4t$l8?G8cQCP?v*xFm*2u;NV=Ft-j#&iaAw%M2A!PFvRR z8-`b@*IUQb!S@2l9U^!1A^UAgA9O0t+##h1dZ3RFu`lGyWteXNXW)lEB=H5)y*VH&lj_EWQkK;59k?3z8)TX4c&Pd z+oK@xp71cQD|Yn^Jvup@ki!(l^S#M51n@fO+wL|g)>ndm{ZtkH+%$*x;!BFF-ke%G ziuc|EE+v(j4#<$v_#xN}rnT8yq?c28SNSv&0z6f~uVQjJd0OXcq-_@SGRi+-f0-%c zVX&;XPYw$PO)dJGn1Y&wIr*_r!B!a-*GuE$Gc1#r4q*ziUA0p*Bdn@PXH_4jgK0;Z zxz61`;~HKH87gUg8rocAub41Psf_`jVhZN6J9%=xq>tH|TUTRAh1=XqkKYzlcGWFR zY+@XOs9MKWuV+<5LA9yeg?BfK{QB|MQzF~$CVrERr$w!6@}|J*+==!^>(lOl<5IYU z=)-jpf{%d$?j(5rsqBM%z}v~eJ18&bE#aQlSQ3vL!K(xm+oz-?nPj!3XcnZf>s0*P6AQAnRL;b-^mKLCOI&V7NHB` zQ6@dt7xBhn3WKZX6ljR1>yP|%D>Zh*VUqI@?{Ste}HKkvH5bsgO%&&jiWC+=k z{noV!T0E|r-u)kUP;$%|B#vG22S*yx&^hhDrRARr%aq2!!}!sE3c3Sff2uRNlb0?v z@nQ(~AUHZ3#%nu(*yw1IJu1|y%B+Tphs#EOU06K!$42yq=EnlG?fOUP8aVuEEWA%T zG6wF{x}YR8+>1%Lz7OnNeFiOfc?Zw|>>XvDBO8V3>>b6ug+%9I^7bSJ(=qW++Q*nL zaCOlQa(n5)@FDVsgIZyFBaxtAmYW0eObY~<0}#;z?SHp-fQLXb z>l5PJxg37lIFE$a9i5LZ`HdwqNugWgMs$nAJ|a}40#bD zdJ(qToWzn)go_2)@4yI)vD-jkTbjn{SQrK)g@W(t6YI%;#-7;pR=aj2GCF!kB$gC=X43o7mHV~>E>HT1arvr z5_Gbrr?15gB?Eq5hJ%Cx;&`G`l)%YQs>VClWb}jqt7yBby z^F<&bz4XTMdz?i3#_GfcovEL|!sT0HtXc^XGyrqZ?gi%83EhXJd^5yf$7lf>E&wjJ z?I4Hr+Y3Wdd3GdPzE_D23_Kq7SMi0A=l6AO{cJ_AfpGN z=L?OU>V+fYug!*QX1+fg?_5YLx1al)V;A=?U?qCM7yy(W=ARxM`8c=xdLo>U5->%| z9|I}?$kvjk8m5!!(eKUxtzADS?d*-^>tdhsX8Q)w3B<+W*BMa9RXfYbUL6hmW>mBv z*(`)W+yUF9o(v8<)2s5EDHNEuVm7{n9MXx8P3{ZzqGFMLUX^pZ?a%LMdJNpiW@u`i z0O@;zf^x&%Z}`hRsRVA{l3tRH(ad&f4qCRCT-VS3SXU4O1YN`1+7@`lT{%=?fkeKTcsME`o*vRm$YG&QjVR{ zi@jv}xRrpZ^HzZPQc5}WcKp`NDFsAuA@At;U^)c}OXX8Y695b*^dUa(JP!}gi$)Z( zr_gb3eEDhV3V+ZBM&-vZ-wT3R_-eg;%i#h(x8_%c&_7t{!NLKJ1@VbKKoFvFg-`hu z&}D@H1-^io*ABLYJOn*a8bG?EQixFer|16&w+0pDU~b{@*EATlr658E0Q&!{kO2e| zQ>1#J<0e7tQ_Cd%G=3Fgw#~rl$+;|{<<2@#X8CX)_QLXEe)wR!S;=T@A`aOx$d9b^ z^KbELTmMNHbN~b|TR(gMspQ)JuYmmn+wU)(++zsY*!nqn4MLcZAHOh2a$#IR07$!m zQ!u}7HfQs-9VWd9p*EK^LpL9SJYL|y-cw;wlKOUt+H^6!T2njtt?a11_>L2hyU1@` z-VN~pL=b;qdtBOYgB;|Pln|#0vK(W<50M6#pa32a1^g2t1Pr@?hqTr)bcsONdvc=} zNccq{w-)Nu2m}g2m2*$D+x`(IL-*3D#vMWT8zmQB)V~p|hHr0n`o@bIXDOVD>@qA~ zYe+pz_J#s)T2Qf~Vk|cWevgJ}dnAvR%&AK9RGqo7y>tYHqriK`ag@qB~_=`Vo8y_2l40MidWACi10t~3|_K=ekz zqP^KHMs5$m^B`f!4754|MVO1uXNqZTh%HVJ$61$6`0Mu!1m}%pFS+XbS2R|_Lz|nM zyBX3K9U%8z8yX>nW!`JcZJ;D{?Ew#+INYIqUtU1VtOM2)5isWtip<)iAd4dOygb_= zDyUEeqfwGk%grum#M=js6)e-^%a9j)=X(4eMjLQQGqWpOid@UkpmTw$+izmUdZ*(u zm;iKuI@=ar1zeo_$eTC336k)Q#K;av;D-c={(3l$VwTQ`kF`GiP-%cU3NbtpL;HSj zB8e#o^^bH zA%w(YWa>#>aeD>xb$u1^)kC}_-MI>YHXzit&e-*GD8n{h5$9OTBj6^^3QwtdQ3rDp znng`4l24@uH-cuj1^=SE}F{{M>n7%E#z$>ET3Zj+V^y`etsF+VtAc{ifXv zk3KfbP|k84e_klv6nwCHAYk#;kbssi{^YgCMMhSue3eZbsRzFtj=0?jZlNH~yAOVW zC)cc-mte%N@bFp1qM7l&9bX@~JrNZGG@s^%UZwPi4u0u7uEJJmO?dB9xuYCCObX6T+~$YoQdbvFvkGR&N%T# z@Ocik=V=zn3heCwdR*yuRr}BKaJW}w-)rSozEHAzllcI54HD?J2_pdpVg->)`=ujG zhpKR{US_W6Exztuno&nDfRDZm<*)Cu8DvFn;86?pZHv#|!>Q=0$aDP!4h}1|Z&AmJ zGu{pD*Alh_>bM+a=$D-(rt4kfVfrl4?3P+dH#|6Ee=jD+5IT&|Tg|w>Khg7ztx6!4SoZftb37@UBXiQAC<c10T8y^?YZEyhzPENbI^WtEG^ml|g- z)h&Z1FI0a^B}Lf2@5Av&S;KCr=1d{}b$k!Y9zt zI&hi4@KP#9!a~+OxygnP?He5z^dBwJ_ zV`#I0i>ZEaButQ|aou}wKHX#9eZnpnvNy8xlYpzVfl!jn9ha+*goz@{tRlCBxaob* zRW;d(NBCN!T7cS0O{`}zyzB<`jk{5Yh2yloz6M^RbsFgGdJG5a%tZ~0{vjVrF!+l$iddy(_o=+fhdG1XQ(rfZ?zIF9qT;*&W9Z_KUR5r<oqvadR&PwUbTKm>fHgs z+4atG8bbSK)51FSp4A|4vC$5k?A5qt9^*C$FwdR@I{fEojX4$zyAT` zaQtwT&r@}Uf(>sl`Z%%h;C1DBVOE{jy2OlB<`;f$3^*-XlIbTIKh41Rt5V+}9d^2W z0T_Vq5@R%IVtZW;*O9v7v;Nx;#SN&J>gd^xg!ZWLK+Ydf$+I@?i|qg!NitgZ+X+d4 zL#9JlOE%y*wkO{YWj;{7u#(jTlzKkwthzX9Zv(Pv(*+^%xoN1Ue5BbJ(Ro^<&$Hx5aXdmrTi3Y@KCK`=YU3p^ZN;C#SEsL$%AeV za_ZUEAxl7b90#7CG$7lS!M;-$1SSTb9Sqy%l4Kscm9@a*+ic15qtK$#7ZohX~;?u+MNcVQ*Mi9zRslHoM zssq&q&cZgwN45HGS>3#S52HkXrVFnl%q ztQ)#Yzc|y^hf(W+6jy|Q&z9ukWD`o3#hrbAl;07+D!{yHT?fdAS7H|P|HvlBUQL)S`@T{NNSCh%c7=L=ejEVyp`y0{aOIydeSicz3Ut_Q5Eq@ZTsNz$-JsU80R#-AxA&gA zAfQDMTe*#p*6`j{ZKR1yHhZX=tw0&lpk`2GG8!~td3WMV$e|rJf+xx5PI&p4#!>> zqMkyscV@8URJB4x3kH3JDQMu;&%0N^&M4xsXg&e6q%MHX3cWWsXtw8((h|<{5*uNw zwmhUPWND#~mGLd#Dg&U&hx9U`-KrlYV0b=jQ4(}8rc_B$yIyO!KiD-I^k1@(unfRY zM=$n*PQ7?86A;YOv^dh*bZc$oi{9Lb1D6?SY&J-#^^C&YwFT@tE?L)XjoQ0Qb$%in z(opM`2ETh0EJ!CqB&O{*+rrhQaEa{Kuu_HB8#^ngx9uy=O)UT-{|K^Q5aiI_Q^R}p z5lwyK63DnZVSapM`6hg$sc^LFH}aaIDd5?JGQhIaWfvU=uZvazMMP@H%wz$pL%;qa zzw>DgxOzu8z~R7v_^-W0wQX3tcGB z3}xRlUJa!|)2e9H2XZs%yQ5AdLOGxLAX0Ujx#-tuYa%x(o0kjvEKUPop@{17j`LX^ z6G%e}RE8oZ**Lesr_%+%rMQsK!LuAUl993tWCIACPT~k&gO~gJyaU3SRWeH5#Kb~D z{ZV>z-HCbyWmcN9cypm-1d<^TGt}d;{)fvpK!E2$5$>7Cr^Y)r4uI!Ip=B$fxc!Rg z48Je%9xgKJeu^@QxTW7Z?FgH-{Nvi8;_7D438XW}U zj$b4ez2RZ+;ie531m?&9fsL)Thv7}A@WJ&cili3W%K&}nLWcdJ64O^;FyoD3oyPK?9U}d1*I8j z3U##CYe7XPIpR3XOgS^_Ll^cCGC|G4>BgiT4oXee6%bU0GQ=;I=KDT7%0FJfC)?}> z>z`3>hjuo2)72VzP6@M^2l+=K5~#rAT{46Yv95Mu(HUkQXfu%dAmFJ3^Vx!}E5%;r z>WfO;bAghY9+5(L96-T38l!NfYx`2#6?cTjSMYuix^ZDIhCYsvx5zr-vrhHa#%OyS z8W%wgu74(WmuE>5+BEM_!9Zti8Sk%$nLr9aTY7o=CtJQR{R#s~mFk<+VBUm9T{^li z3?6U*Fz(XAC-CT9DF254L1j%^+>4jZgt`4X|Q9N_@?22uwC2QRG)hFy5TEQBr zs_dfl4HL$%j}sbd4rKk~0X%t5sS$=JAztYOy&TFn?-kCs^+`%LK0*HOQ(kLH#5rdz zGyCN4pN2xMDrCHt#cKTpCgZ_19#%>#rXJL4~bWN#%;HI@$-i%4Su_ zV>zh3Y7$d<$`qk`6{baYqN#fp_dB#N@6uIG`Y=M6P_X({-6FRgAt|k6!gaPX9$79I zF*v-VQr0709FxgP9enY`xwM!`b0e-PQw?8k%zHfVAv!;|uMoycmk=#VQzpL$*55W= zCkxBWgF47`YekJZR~gpNWA&+2TCDhQFMppiy>6h6EI+NPzwqn2@%u1>Ba^KG&=a;K zkKez(7+};k%HEY$y8$rn*1<9vxeK{mNF7al+*JIYmvb&fbNGwraeFFn7C&qDf^DRamnk3_5!VZlD6xW52rLu(k9Vh4$VydDr{fC3se(3XP(%!aY z)#@i-sOZ%x_6`;zs$rZgy)rMVOI2zeNHdi!D{|C-x`$3S?-X)1kJCQosA>ue-#YMK zcvzv-NFL>sW7*7ROK8@JXv=Rmn$Xsi&_gQry3Pv*ML&cswS~i0XVUhl&gKcuh*^1r zuky1W$YKfAzEP)$rQ{}F`sGgGXn*Ok=vJSV>$yK`P=VaLSbA+(x0f%bc4W!Dc_N8A z2x5&pkZO_`Sod-{5uhk0IeOU&*u)-1cfu7-^<=tVx_vs;auH@opVgRfHz_BrvR61Ems@a9yqUl)#R#SkDwM?w zVH9ZI{^?fp^T)>d&c?K{D6h$eMjh`x1}D|R>0WI#f$2Pcv>7nOWy7p?v{tZl21Zq^ zEYsaPi<=Ee12i-XlT#y_q^ZxsiR^m!u5FdQ&`{&_Xlc88{ZMX6a3M!oxydJ?`^1ja zS!=LJ$b5CNqL);y$ov>p$~669ke!Y*9)Y`zrY*C&!G$h^L|&$uBn(Dl{4*JJ`8vW( z%2M`u0kEH*xgB`2S}r|%?2Iw_3Dfu8qCeU?MnO5G&CifB=0dmyHnhaYERw^jtU~7f z{yUfEG$Mj3U*3s1no>On%x{&-S@JUrD0xuP=YGT4{Ig_!4Af)J^#x1E2uX7($329C zYpvol%VoyN$=-8N-4`==N_K4$I1k&E41A~=bE%*3lt)X6T6f$*Xp4!3pTzZ)c1OT5 zI~qrCnO=#Rv#P)!J|E5MkzT88+GI6S(fHtd^nl#yDXY!a{f{grQSY>9$<$xK1Gp>C zK&^LWX=5(}rCB7$!~$}59;EZL2Mcq+zPHG4TewER7Ag<)btJ`oDh_0(ix{77ME;A( zfvWR1^feghkYq8{E?TUz6|+R(eoMD*P%;_s8UZNYA6=FD`ab<}L}{;IYt(v)AcP!g z`g2NkoqW1K2;QH_tu6ZvFnoHg*3c-)6n)8>@j$*+bUZlGY$o3%IzHE*f&Q=YiNweK z;P-b9l>69&g0N8pN+M?%@WI8gjrLA`>ak!pgvF8!>iuriLP&1D%X+4Q=i1c zJpLb4n)LcEMh4$}4gG{^@2{UL2rchz!t|Fpk6WN5${$!UvU`L0M26p5lZ}gi7R3r9 zW+$9!dH{F*;Y*KpbFXnq(rZf%^^_m-L)4TjX2MGiBzRfXHg;5kZ}YFJtT5R|oz^pi z63w(EKhED`d>7pz-QMuCg|Mskt)!1>2;tbe+v!@w6~rz#{oM*cJ45cYa}y{h;HVF0 zACBMo7@Ew;)T_ZeL2&P7xo8f-c_DRU#UoWOx8S}OeX@6k18;a!%T?d;H%XjkkiUos zHlgp?su6sW3mJk*H*YT2dgO%B8Iww!RbYC-(}GUJqt2*AX%!_?!~OH29N}p7nb$5u z( None: all_budgets = plot_data["budgets"] all_recalls = plot_data["recall"] - # Trim to the configured max budget so the right edge lands on a clean tick. - cutoff = next((i for i, b in enumerate(all_budgets) if b > _PLOT_MAX_BUDGET), len(all_budgets)) - budgets = all_budgets[:cutoff] - recalls = {m: vs[:cutoff] for m, vs in all_recalls.items()} + budgets = all_budgets + recalls = all_recalls fig, ax = plt.subplots(figsize=(8, 5)) fig.patch.set_facecolor("white") From 1d3d0ca9c896170ecb0777031ef95da2ac548a66 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:47:06 +0200 Subject: [PATCH 15/18] Update token efficiency benchmarks --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e70fe42..e8508d9 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ We benchmark quality and speed across all methods on ~1,250 queries over 63 repo | probe | 0.387 | — | 207 ms | | ripgrep | 0.126 | — | 12 ms | -Semble achieves 99% of the performance of the 137M-parameter [CodeRankEmbed](https://huggingface.co/nomic-ai/CodeRankEmbed) Hybrid, while indexing 218x faster and answering queries 11x faster. +Semble achieves 99% of the performance of the 137M-parameter [CodeRankEmbed](https://huggingface.co/nomic-ai/CodeRankEmbed) Hybrid, while indexing 218x faster and answering queries 11x faster. See [benchmarks](benchmarks/README.md) for per-language results, ablations, and methodology. ### Token efficiency @@ -162,7 +162,7 @@ Agents using grep+read spend most of their context budget on irrelevant code. Se ![Token efficiency: recall vs. retrieved tokens](https://raw.githubusercontent.com/MinishLab/semble/main/assets/images/token_efficiency.png) -At a 2k token budget, semble reaches 94% recall. Grep+read needs a full 100k context window to reach 85%. See [benchmarks](benchmarks/README.md) for per-language results, ablations, and methodology. +At a 2k token budget, semble reaches 94% recall. Grep+read needs a full 100k context window to reach 85%. See [benchmarks](benchmarks/README.md) for details. ## License From 67f0c3e1fad698510be6c44115677ad901129d79 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:52:29 +0200 Subject: [PATCH 16/18] Update token efficiency benchmarks --- README.md | 2 +- benchmarks/README.md | 58 ++++++++++++++++++++++---------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index e8508d9..eb5e813 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ Agents using grep+read spend most of their context budget on irrelevant code. Se ![Token efficiency: recall vs. retrieved tokens](https://raw.githubusercontent.com/MinishLab/semble/main/assets/images/token_efficiency.png) -At a 2k token budget, semble reaches 94% recall. Grep+read needs a full 100k context window to reach 85%. See [benchmarks](benchmarks/README.md) for details. +Semble uses **98% fewer tokens** on average, and reaches 94% recall at a budget of only 2k tokens, while grep+read needs a full 100k context window to reach 85%. See [benchmarks](benchmarks/README.md#token-efficiency) for details. ## License diff --git a/benchmarks/README.md b/benchmarks/README.md index 0d9fe92..ddf3d61 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -3,8 +3,8 @@ Quality and speed benchmarks for `semble`. - [Main results](#main-results) -- [By language](#by-language) - [Token efficiency](#token-efficiency) +- [By language](#by-language) - [Ablations](#ablations) - [Dataset](#dataset) - [Methods](#methods) @@ -34,33 +34,6 @@ The 137M-param CodeRankEmbed Hybrid wins NDCG@10 by 0.008. semble wins index tim NDCG@10 is averaged across all queries. Speed numbers use one repo per language, CPU only: cold-start index time and warm query p50 (median across 5 consecutive runs). -## By language - -NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best score per row is bolded. - -| Language | semble | CRE Hybrid | CRE | ColGREP | grepai | probe | ripgrep | -|---|---:|---:|---:|---:|---:|---:|---:| -| scala | 0.909 | **0.922** | 0.845 | 0.765 | 0.330 | 0.392 | 0.180 | -| cpp | **0.915** | 0.913 | 0.846 | 0.626 | 0.731 | 0.375 | 0.126 | -| ruby | **0.909** | **0.909** | 0.769 | 0.708 | 0.643 | 0.382 | 0.230 | -| elixir | 0.894 | **0.905** | 0.869 | 0.808 | 0.669 | 0.412 | 0.134 | -| javascript | 0.917 | 0.903 | **0.920** | 0.823 | 0.675 | 0.588 | 0.176 | -| zig | **0.913** | 0.901 | 0.807 | 0.474 | 0.755 | 0.369 | 0.000 | -| csharp | 0.885 | **0.889** | 0.743 | 0.614 | 0.277 | 0.392 | 0.117 | -| go | **0.895** | 0.884 | 0.676 | 0.785 | 0.722 | 0.410 | 0.133 | -| python | 0.867 | **0.880** | 0.794 | 0.777 | 0.634 | 0.488 | 0.202 | -| php | 0.858 | **0.874** | 0.758 | 0.663 | 0.402 | 0.340 | 0.123 | -| swift | 0.860 | **0.873** | 0.721 | 0.710 | 0.429 | 0.280 | 0.160 | -| bash | 0.825 | 0.852 | **0.892** | 0.706 | 0.723 | 0.226 | 0.000 | -| lua | 0.823 | **0.847** | 0.803 | 0.798 | 0.699 | 0.336 | 0.000 | -| java | **0.849** | 0.841 | 0.706 | 0.641 | 0.386 | 0.536 | 0.198 | -| kotlin | 0.821 | **0.830** | 0.670 | 0.637 | 0.478 | 0.335 | 0.166 | -| rust | **0.856** | 0.827 | 0.627 | 0.662 | 0.519 | 0.242 | 0.162 | -| c | 0.741 | **0.806** | 0.706 | 0.676 | 0.555 | 0.384 | 0.000 | -| haskell | 0.765 | 0.771 | **0.776** | 0.683 | 0.483 | 0.313 | 0.000 | -| typescript | 0.706 | **0.708** | 0.545 | 0.430 | 0.394 | 0.354 | 0.128 | -| **overall** | **0.854** | **0.862** | **0.765** | **0.693** | **0.561** | **0.387** | **0.126** | - ## Token efficiency Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that workflow and compare it against semble's chunk retrieval across 1,251 queries. @@ -90,10 +63,37 @@ A relevant file is "covered" once any retrieved unit comes from it.
Methodology -semble returns the top-50 ranked chunks. `ripgrep+read` extracts non-stopword tokens from the query, runs `rg --fixed-strings --ignore-case` for each keyword (scoped to the same code-file extensions and ignored directories that semble indexes), then reads matched files in full ranked by how many distinct keywords they contain. Tokens counted with `cl100k_base` via `tiktoken`. Recall curves record cumulative tokens of whole retrieved units without truncation; a relevant file is "covered" once any retrieved unit overlaps its annotated span. +semble returns the top-50 ranked chunks. `ripgrep+read` splits the query into keywords (dropping stopwords and short words), runs `rg --fixed-strings --ignore-case` for each keyword, then reads matched files in full ranked by how many distinct keywords they contain. Both methods search the same set of file types and ignored directories. Tokens are counted with `cl100k_base` via `tiktoken`. A relevant file is "covered" once any retrieved unit overlaps its annotated span.
+## By language + +NDCG@10 per language, sorted by CodeRankEmbed Hybrid (CRE in the table). Best score per row is bolded. + +| Language | semble | CRE Hybrid | CRE | ColGREP | grepai | probe | ripgrep | +|---|---:|---:|---:|---:|---:|---:|---:| +| scala | 0.909 | **0.922** | 0.845 | 0.765 | 0.330 | 0.392 | 0.180 | +| cpp | **0.915** | 0.913 | 0.846 | 0.626 | 0.731 | 0.375 | 0.126 | +| ruby | **0.909** | **0.909** | 0.769 | 0.708 | 0.643 | 0.382 | 0.230 | +| elixir | 0.894 | **0.905** | 0.869 | 0.808 | 0.669 | 0.412 | 0.134 | +| javascript | 0.917 | 0.903 | **0.920** | 0.823 | 0.675 | 0.588 | 0.176 | +| zig | **0.913** | 0.901 | 0.807 | 0.474 | 0.755 | 0.369 | 0.000 | +| csharp | 0.885 | **0.889** | 0.743 | 0.614 | 0.277 | 0.392 | 0.117 | +| go | **0.895** | 0.884 | 0.676 | 0.785 | 0.722 | 0.410 | 0.133 | +| python | 0.867 | **0.880** | 0.794 | 0.777 | 0.634 | 0.488 | 0.202 | +| php | 0.858 | **0.874** | 0.758 | 0.663 | 0.402 | 0.340 | 0.123 | +| swift | 0.860 | **0.873** | 0.721 | 0.710 | 0.429 | 0.280 | 0.160 | +| bash | 0.825 | 0.852 | **0.892** | 0.706 | 0.723 | 0.226 | 0.000 | +| lua | 0.823 | **0.847** | 0.803 | 0.798 | 0.699 | 0.336 | 0.000 | +| java | **0.849** | 0.841 | 0.706 | 0.641 | 0.386 | 0.536 | 0.198 | +| kotlin | 0.821 | **0.830** | 0.670 | 0.637 | 0.478 | 0.335 | 0.166 | +| rust | **0.856** | 0.827 | 0.627 | 0.662 | 0.519 | 0.242 | 0.162 | +| c | 0.741 | **0.806** | 0.706 | 0.676 | 0.555 | 0.384 | 0.000 | +| haskell | 0.765 | 0.771 | **0.776** | 0.683 | 0.483 | 0.313 | 0.000 | +| typescript | 0.706 | **0.708** | 0.545 | 0.430 | 0.394 | 0.354 | 0.128 | +| **overall** | **0.854** | **0.862** | **0.765** | **0.693** | **0.561** | **0.387** | **0.126** | + ## Ablations `raw` returns retrieval scores directly; `+ ranking` feeds them through semble's hybrid ranker. From f636132a53ba752ed18de12d0016fa45c1ded622 Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:53:54 +0200 Subject: [PATCH 17/18] Update token efficiency benchmarks --- benchmarks/README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/benchmarks/README.md b/benchmarks/README.md index ddf3d61..dd1335d 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -36,15 +36,13 @@ NDCG@10 is averaged across all queries. Speed numbers use one repo per language, ## Token efficiency -Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that workflow and compare it against semble's chunk retrieval across 1,251 queries. - -**semble uses 98% fewer tokens than grep+read.** +Coding agents (Claude Code, OpenCode, etc.) typically find code by running `grep` on keywords and reading the matched files. We model that workflow and compare it against semble's chunk retrieval across our full benchmark of 1251 queries. ![Token efficiency: recall vs. retrieved tokens](../assets/images/token_efficiency.png) ### Expected tokens per query -For each query: tokens consumed at first relevant hit, or 32k if the method never finds anything. Averaged across all 1,251 queries. +For each query: tokens consumed at first relevant hit, or 32k if the method never finds anything. Averaged across all 1251 queries. | Method | Expected tokens | Savings | |---|---:|---:| From 67aa8d037a0edb8a0ea3662e6e3d2ff31bfed46f Mon Sep 17 00:00:00 2001 From: Pringled Date: Thu, 30 Apr 2026 08:57:02 +0200 Subject: [PATCH 18/18] Update token efficiency benchmarks --- .../token-efficiency-6d7dea15950e.json | 241 ------------------ 1 file changed, 241 deletions(-) delete mode 100644 benchmarks/results/token-efficiency-6d7dea15950e.json diff --git a/benchmarks/results/token-efficiency-6d7dea15950e.json b/benchmarks/results/token-efficiency-6d7dea15950e.json deleted file mode 100644 index 26374d1..0000000 --- a/benchmarks/results/token-efficiency-6d7dea15950e.json +++ /dev/null @@ -1,241 +0,0 @@ -{ - "tool": "context-efficiency-recall", - "tokenizer": "cl100k_base", - "budgets": [ - 500, - 1000, - 2000, - 4000, - 8000, - 16000, - 32000 - ], - "n_queries": 1251, - "recall_at_budget": { - "semble": { - "500": 0.6859, - "1000": 0.8492, - "2000": 0.9369, - "4000": 0.9762, - "8000": 0.9912, - "16000": 0.996, - "32000": 0.9964 - }, - "grep+read": { - "500": 0.0, - "1000": 0.0072, - "2000": 0.0228, - "4000": 0.042, - "8000": 0.0755, - "16000": 0.1003, - "32000": 0.1251 - } - }, - "first_hit_reduction": { - "grep+read": { - "n_paired": 189.0, - "median_semble_tokens": 275.0, - "median_other_tokens": 7864.0, - "median_reduction": 0.9708, - "mean_reduction": 0.9323, - "semble_better_pct": 1.0, - "expected_cost_at_cap": 29674.5835, - "expected_cost_cap": 32000.0, - "expected_cost_ratio_vs_semble": 52.3008 - }, - "semble": { - "expected_cost_at_cap": 567.3829, - "expected_cost_cap": 32000.0 - } - }, - "plot": { - "budgets": [ - 100, - 111, - 124, - 138, - 154, - 172, - 192, - 215, - 240, - 267, - 298, - 333, - 372, - 415, - 463, - 516, - 576, - 643, - 717, - 801, - 893, - 997, - 1112, - 1241, - 1385, - 1545, - 1724, - 1923, - 2146, - 2395, - 2672, - 2981, - 3326, - 3711, - 4141, - 4620, - 5155, - 5751, - 6417, - 7160, - 7989, - 8913, - 9945, - 11096, - 12380, - 13813, - 15412, - 17196, - 19186, - 21407, - 23884, - 26649, - 29733, - 33174, - 37014, - 41298, - 46077, - 51410, - 57361, - 64000 - ], - "recall": { - "semble": [ - 0.0404, - 0.0484, - 0.0576, - 0.0691, - 0.0815, - 0.1007, - 0.1206, - 0.1525, - 0.1941, - 0.2401, - 0.3183, - 0.4205, - 0.5536, - 0.6383, - 0.6735, - 0.693, - 0.7138, - 0.743, - 0.7716, - 0.792, - 0.8184, - 0.8484, - 0.8628, - 0.878, - 0.8898, - 0.9105, - 0.9213, - 0.9345, - 0.9436, - 0.9515, - 0.9547, - 0.9619, - 0.9667, - 0.9723, - 0.9778, - 0.9817, - 0.984, - 0.986, - 0.9888, - 0.9908, - 0.9912, - 0.9924, - 0.9952, - 0.9952, - 0.996, - 0.996, - 0.996, - 0.996, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964, - 0.9964 - ], - "grep+read": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0008, - 0.0032, - 0.0056, - 0.0064, - 0.0064, - 0.0072, - 0.008, - 0.0124, - 0.014, - 0.014, - 0.0188, - 0.022, - 0.0268, - 0.028, - 0.0312, - 0.0336, - 0.0348, - 0.0396, - 0.0428, - 0.0476, - 0.05, - 0.0548, - 0.0584, - 0.0675, - 0.0755, - 0.0779, - 0.0787, - 0.0859, - 0.0887, - 0.0963, - 0.0979, - 0.1039, - 0.1103, - 0.1147, - 0.1187, - 0.1211, - 0.1251, - 0.1267, - 0.1275, - 0.1299, - 0.1355, - 0.1371, - 0.1411, - 0.1419 - ] - } - } -}