From 7e2ed2345b02b86636c96377fe5760ebbc89b8bc Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Tue, 19 May 2026 11:21:37 +0200 Subject: [PATCH 01/86] Align Actions triggers with the renamed main branch GitHub Actions should only run from the active default branch now that the repo has been renamed to main/dev. This change limits the conda workflow triggers to main for both push and pull_request events, avoiding stale runs from legacy branch names. Constraint: Branch rename already completed on GitHub Rejected: Rely on default-branch behavior alone | too implicit for explicit CI routing Confidence: high Scope-risk: narrow Directive: Keep workflow branch filters in sync with future branch renames Tested: Reviewed workflow diff and verified no other .github/workflows branch selectors remain Not-tested: Live GitHub Actions run after push --- .github/workflows/quest-conda.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/quest-conda.yml b/.github/workflows/quest-conda.yml index abce6a6..e16c0e7 100644 --- a/.github/workflows/quest-conda.yml +++ b/.github/workflows/quest-conda.yml @@ -3,10 +3,14 @@ name: QuEst Conda CI on: workflow_dispatch: push: + branches: + - main paths: - "modules/quest/**" - "modules/quest/.github/workflows/quest-conda.yml" pull_request: + branches: + - main paths: - "modules/quest/**" - "modules/quest/.github/workflows/quest-conda.yml" From 5962ce3b05bdae45dded669f902fa60c56b4ed97 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 18:57:49 +0200 Subject: [PATCH 02/86] chore: modernise .gitignore and ignore run artefacts The old ignore file predates the current tree: it listed the generated Cython sources under quest/lib/, which is gone, and nothing else. Replace it with rules covering the surfaces that actually exist now - Python builds and caches, the Node/Next.js frontend, pixi's materialised .pixi/ environment (pixi.toml and pixi.lock are committed instead), and the usual editor and OS noise. Also ignore simulation output. simulate_project writes jobs// under the working directory whenever save_outputs is true, so anything run from the repo root leaves a directory behind; that had grown to 2292 runs and 32 GB. The scratch files left by manual runs and the molecule viewer are ignored with it. --- .gitignore | 161 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 144 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 96f17b1..12f0c88 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,149 @@ -build +# ========================================== +# Python build, distribution and packaging +# ========================================== +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# ========================================== +# Compiled binaries, shared libraries, Cython +# ========================================== +# Global ignores for dynamic libraries +*.so +*.dylib +*.dll +*.pyd +*.o +*.obj +*.a +*.lib + +# Cython generated C/C++ sources in quest package +quest/**/*.c +quest/**/*.cpp + +# Older specific compiled targets (kept for safety) +_*-darwin.so +_64-linux-gnu.so + +# ========================================== +# Caches, testing, and coverage +# ========================================== +__pycache__/ +*.pyc +*.pyo +.pytest_cache/ +.coverage +.coverage.* +htmlcov/ +.nosetests +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.mypy_cache/ +.dmypy.json +dmypy.json + +# ========================================== +# WebUI & Frontend (Node, Next.js) +# ========================================== +# Next.js build output +.next/ +out/ +*.tsbuildinfo + +# Node dependencies +node_modules/ + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# npm log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# ========================================== +# Virtual environments +# ========================================== +.venv/ +venv/ +env/ +.env/ +ENV/ +env.bak/ +venv.bak/ + +# ========================================== +# IDEs, Editors, and OS-specific files +# ========================================== +.DS_Store +Thumbs.db +.vscode/ +.idea/ +*.suo +*.ntvs* +*.njsproj +*.sln +*.swp *.pro.user *.pro.user.* CMakeLists.txt.user CMakeLists.txt.user.* cmake-build-* -_*-darwin.so -_64-linux-gnu.so -__pycache__ - -quest/lib/fps/fps.cpp -quest/lib/math/functions/rdf.cpp -quest/lib/math/functions/small.cpp -quest/lib/math/functions/rdf.cpython-39-x86_64-linux-gnu.so -quest/lib/fps/fps.cpython-39-x86_64-linux-gnu.so -quest/lib/math/functions/small.cpython-39-x86_64-linux-gnu.so -quest/lib/math/linalg/vector.cpp -quest/lib/tools/dye_diffusion/photon.cpython-39-x86_64-linux-gnu.so -quest/lib/tools/dye_diffusion/photon.cpp -quest/lib/structure/cStructure.cpython-39-x86_64-linux-gnu.so -quest/lib/structure/cStructure.cpp -quest/lib/math/linalg/vector.cpython-39-x86_64-linux-gnu.so + +# ========================================== +# Jupyter Notebooks +# ========================================== +.ipynb_checkpoints/ + +# ========================================== +# Project-specific ignores +# ========================================== +.kilocode/ +.omx/ +.webui-data/ +.antigravity/ +.antigravitycli/ + +# Simulation output. `simulate_project` writes `jobs//` under the current +# working directory whenever `save_outputs` is true, so anything run from the +# repo root leaves a directory behind. Tests should pass `save_outputs=False` +# or a temporary `project_dir` rather than rely on this. +jobs/ + +# Scratch left behind by manual runs and by the molecule viewer. +/out.xyz +/out_slow.xyz +/test.pdb +/test.cif +/webui-viewer-testpdb.png +tests/sim_test.log + + +# ========================================== +# Pixi +# ========================================== +# Environments are reproducible from pixi.toml + pixi.lock, both of which are +# committed. The materialised environment is not. +.pixi/ From 64aaebef4e5743a308d927b6028d0134cf8d50e1 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 18:58:02 +0200 Subject: [PATCH 03/86] docs(okf): add the Open Knowledge Format bundle and CLAUDE.md okf/ is the durable, agent-readable knowledge layer that sits beside the code: plain markdown with YAML frontmatter, grouped as architecture/, subsystems/, workflows/, specs/ and references/ under a root index.md, plus an append-only log.md and a session handover. It records what is not derivable from the source - what actually runs during a simulation, the project-JSON contract every surface shares, the physics and its approximations, the assessment backlog and where the architecture is heading, and the defects that are known but not yet fixed. CLAUDE.md points at it and states the working practices that keep it in step with the tree: it is updated in the same change as the code, never in a later pass. No source changes. --- CLAUDE.md | 134 +++ okf/architecture/index.md | 6 + okf/architecture/job-artefacts.md | 50 + okf/architecture/project-schema.md | 101 ++ okf/architecture/simulation-pipeline.md | 87 ++ okf/architecture/surfaces.md | 65 ++ okf/handover.md | 169 +++ okf/index.md | 28 + okf/log.md | 1289 +++++++++++++++++++++++ okf/overview.md | 77 ++ okf/references/index.md | 6 + okf/references/known-issues.md | 116 ++ okf/references/pet-quenching-theory.md | 80 ++ okf/references/release-state.md | 41 + okf/references/user-docs.md | 35 + okf/specs/assessment.md | 79 ++ okf/specs/imp-tricks-dedup.md | 343 ++++++ okf/specs/index.md | 10 + okf/specs/objectives.md | 139 +++ okf/specs/plugin-integration.md | 234 ++++ okf/specs/structure-io.md | 116 ++ okf/subsystems/accessible-volume.md | 79 ++ okf/subsystems/cli.md | 61 ++ okf/subsystems/core-api.md | 84 ++ okf/subsystems/dye-diffusion.md | 71 ++ okf/subsystems/gui.md | 153 +++ okf/subsystems/i18n.md | 126 +++ okf/subsystems/index.md | 13 + okf/subsystems/photon-decay.md | 76 ++ okf/subsystems/quenching-model.md | 91 ++ okf/subsystems/rpc.md | 88 ++ okf/subsystems/structure-io.md | 65 ++ okf/subsystems/webui.md | 82 ++ okf/workflows/change-tracking.md | 75 ++ okf/workflows/environment.md | 153 +++ okf/workflows/index.md | 5 + okf/workflows/testing.md | 168 +++ 37 files changed, 4595 insertions(+) create mode 100644 CLAUDE.md create mode 100644 okf/architecture/index.md create mode 100644 okf/architecture/job-artefacts.md create mode 100644 okf/architecture/project-schema.md create mode 100644 okf/architecture/simulation-pipeline.md create mode 100644 okf/architecture/surfaces.md create mode 100644 okf/handover.md create mode 100644 okf/index.md create mode 100644 okf/log.md create mode 100644 okf/overview.md create mode 100644 okf/references/index.md create mode 100644 okf/references/known-issues.md create mode 100644 okf/references/pet-quenching-theory.md create mode 100644 okf/references/release-state.md create mode 100644 okf/references/user-docs.md create mode 100644 okf/specs/assessment.md create mode 100644 okf/specs/imp-tricks-dedup.md create mode 100644 okf/specs/index.md create mode 100644 okf/specs/objectives.md create mode 100644 okf/specs/plugin-integration.md create mode 100644 okf/specs/structure-io.md create mode 100644 okf/subsystems/accessible-volume.md create mode 100644 okf/subsystems/cli.md create mode 100644 okf/subsystems/core-api.md create mode 100644 okf/subsystems/dye-diffusion.md create mode 100644 okf/subsystems/gui.md create mode 100644 okf/subsystems/i18n.md create mode 100644 okf/subsystems/index.md create mode 100644 okf/subsystems/photon-decay.md create mode 100644 okf/subsystems/quenching-model.md create mode 100644 okf/subsystems/rpc.md create mode 100644 okf/subsystems/structure-io.md create mode 100644 okf/subsystems/webui.md create mode 100644 okf/workflows/change-tracking.md create mode 100644 okf/workflows/environment.md create mode 100644 okf/workflows/index.md create mode 100644 okf/workflows/testing.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3aa5a63 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,134 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with +code in this repository. + +QuEst (QUenching ESTimation) predicts the fluorescence decay of a dye tethered +to a protein by a flexible linker, from the structure alone — PET quenching by +nearby amino acids, plus optional FRET. + +## Read the OKF bundle first — it is this project's memory + +`okf/` is an **Open Knowledge Format** bundle: plain-markdown concepts with YAML +frontmatter, grouped as `architecture/`, `subsystems/`, `workflows/` and +`references/` under a root `okf/index.md`, plus an append-only `okf/log.md`. +It is the durable, agent-readable knowledge layer that sits beside the code, and +it is where what has been learned about this repository lives. + +**Start at [`okf/index.md`](okf/index.md)**, and read the concept that owns the +area you are about to touch, before reading the source. On a conflict between a +code comment and an OKF concept, OKF wins — it is newer. + +Fast paths: + +- What actually runs during a simulation → [`okf/architecture/simulation-pipeline.md`](okf/architecture/simulation-pipeline.md) +- Where the architecture is heading, and the gap backlog → [`okf/specs/plugin-integration.md`](okf/specs/plugin-integration.md), [`okf/specs/assessment.md`](okf/specs/assessment.md) +- The project-JSON contract every surface shares → [`okf/architecture/project-schema.md`](okf/architecture/project-schema.md) +- The physics and its approximations → [`okf/references/pet-quenching-theory.md`](okf/references/pet-quenching-theory.md) +- Why something is broken → [`okf/references/known-issues.md`](okf/references/known-issues.md) +- What changed recently and why → [`okf/log.md`](okf/log.md) + +## Working practices + +- **Track everything in OKF — no exceptions.** Every change, finding, decision + and dead end goes into the owning concept *and* `okf/log.md`, in the same + change that makes it. That includes packaging, CI, environments and + documentation, not just code: if it is not in OKF it did not happen, because + the next session starts from OKF and nothing else. +- **Keep OKF up to date — always, not at the end.** `okf/` is only worth reading + if it matches the tree, so it is updated *in the same change* as the code, not + in a later cleanup pass. That includes correcting entries that turn out to be + wrong: a confident but stale concept is worse than a missing one. +- **Use the `arm64` conda environment.** + `/Users/tpeulen/mambaforge/envs/arm64/bin/python` is canonical — Python 3.12, + numpy 2.4.6, PyQt5, LabelLib, and a **compiled `IMP.bff`**. The mambaforge + base interpreter is still needed for the web layer (fastapi/playwright are not + in `arm64`), so both have to stay green; the split and what runs where is in + [`okf/workflows/environment.md`](okf/workflows/environment.md). +- **Write to memory as you go.** Every material change updates the OKF concept + that owns the behaviour **and** appends a dated bullet to `okf/log.md`, in the + same change. Anything you *learn* that was not obvious from the code — a + missing dependency, a default chosen by measurement, a kernel that must stay + sequential, a physical assumption — goes into the owning concept, or into + `okf/references/known-issues.md` if it is a defect you cannot fix now. Never + leave a finding only in the chat. Full loop: + [`okf/workflows/change-tracking.md`](okf/workflows/change-tracking.md). +- **Docs are part of the change.** `okf/` is for agents; `doc/` and `README.md` + are for people. Parameter help text is edited in + `quest/settings/parameter_catalog.json` (translations in + `quest/settings/locales/*.json`) and regenerated with **both** + `python doc/generate_parameter_docs.py` and + `python -m quest.gui.generate_view_spec` — the second writes the Qt form's + view spec from the same catalog. Never hand-edit `doc/parameters*.md` or + `quest/gui/quest.view*.json`. Locale files are cached per process, so restart + uvicorn after editing one. +- **Test all three surfaces, every time — library, web UI, and Qt GUI.** They + have diverged before (the GUI shipped different quenching chemistry than the + CLI for as long as nobody looked), so a green unit suite is not verification. + Run `python -m pytest tests/ webui/backend/tests -q -p no:pytest-qt` (the flag + is required — pytest-qt aborts collection without a Qt binding); start the + backend and frontend so `test_webui_e2e.py` runs instead of skipping; and run + `tests/test_gui_widget.py` under + `QT_QPA_PLATFORM=offscreen /Users/tpeulen/mambaforge/envs/arm64/bin/python`. + **Render the GUI and the charts and look at the images yourself** — a missing + control or an acceptor defaulting to a water molecule is invisible to + assertions. uvicorn does not reload: restart it before re-running the browser + suite. Baseline: 179 passed + 2 skipped, and 8 GUI tests. + See [`okf/workflows/testing.md`](okf/workflows/testing.md). +- **General fluorescence machinery belongs in imp-tricks, under `IMP.bff`.** + QuEst is the application — project schema, PET workflow, surfaces, scanning. + Accessible volumes, dye distributions and FRET distance/rate math are general; + before writing any of that here, check whether `IMP.bff` already has it (it + usually does) and prefer depending on it to adding a second copy. Direction + and migration map: [`okf/specs/imp-tricks-dedup.md`](okf/specs/imp-tricks-dedup.md). +- **Keep the optional dependencies optional.** Qt, LabelLib and IMP are all + imported behind `try`/`except` with fallbacks. That is what lets the CLI, the + API and the web backend run in this environment, which has no Qt bindings and + no `IMP.bff`. Do not make any of those imports unconditional. +- **Logic goes in the service layer, not in a surface.** The CLI, the web + backend, the GUI and notebooks are thin wrappers over `quest/core.py` (exposed + as `quest.api`). A feature that exists only in the web UI is a design error. + See [`okf/architecture/surfaces.md`](okf/architecture/surfaces.md). The target + is the ChiSurf plugin split — core / rpc / api / cli / gui, one method + registry behind every surface — so prefer changes that move the tree toward + [`okf/specs/plugin-integration.md`](okf/specs/plugin-integration.md) and close + a row in [`okf/specs/assessment.md`](okf/specs/assessment.md). +- **Do not leave run artefacts in the tree.** `simulate_project` writes + `jobs//` under the current directory; pass `save_outputs=False` or a + temp `project_dir` for tests and bulk work. +- **Change policy.** QuEst is **unreleased** — nothing depends on a published + build, so prefer the clean change over the compatible one: rename freely, + delete unused shims, reshape file formats. This does *not* extend to silently + changing what the science computes, to breaking ChiSurf without recording it, + or to skipping OKF. Full rule: + [`okf/references/release-state.md`](okf/references/release-state.md). +- **Git.** Commit locally; do not push. No commit trailers of any kind — no + `Co-Authored-By`, no tool attribution. The working tree carries other + in-flight work: never `git add -A` / `git commit -a`, and never run + destructive git (`reset --hard`, `restore`, `clean -f`, `stash`, `--force`) + that could discard changes you did not make. + +## Environment and packaging + +**pixi drives everything**, Python included: + +| environment | holds | tasks | +|---|---|---| +| `default` | library, CLI, web backend | `test`, `test-web`, `serve` | +| `desktop` | the above plus Qt | `gui`, `test-gui` | +| `frontend` | the Node toolchain | `dev`, `build`, `typecheck` | +| `build` | rattler-build only | `build-pkg` | + +The conda package is built by **rattler-build** from +`rattler-recipe/recipe.yaml`; the old `conda-recipe/meta.yaml` and its +`conda mambabuild` workflow are gone. CI (`.github/workflows/ci.yml`) runs the +library, backend, GUI, frontend and packaging jobs from those same pixi tasks. + +For day-to-day work on this machine the `arm64` conda environment is still the +canonical interpreter (it has the compiled `IMP.bff`); see +[`okf/workflows/environment.md`](okf/workflows/environment.md). + +## Contact + +Author: Thomas-Otavio Peulen. Repository: +`github.com/Fluorescence-Tools/quest`. diff --git a/okf/architecture/index.md b/okf/architecture/index.md new file mode 100644 index 0000000..90541ff --- /dev/null +++ b/okf/architecture/index.md @@ -0,0 +1,6 @@ +# Architecture + +* [Simulation pipeline](simulation-pipeline.md) - The three stages every run goes through: accessible volume, Brownian diffusion in that volume, photon/decay generation — and where each stage lives in the code. +* [Project schema](project-schema.md) - The project-JSON contract shared by the CLI, the API, the web UI and the GUI, and the parameter catalog that documents it. +* [Surfaces](surfaces.md) - The four user-facing surfaces (Python API, CLI, web UI, Qt GUI) and the rule that they are thin wrappers over one service layer. +* [Job artefacts](job-artefacts.md) - What a run writes to `jobs//`, and why bulk work turns it off. diff --git a/okf/architecture/job-artefacts.md b/okf/architecture/job-artefacts.md new file mode 100644 index 0000000..f52a5a8 --- /dev/null +++ b/okf/architecture/job-artefacts.md @@ -0,0 +1,50 @@ +--- +type: Architecture +title: Job artefacts +description: What a run writes to jobs//, and why bulk work turns it off. +resource: quest/core.py +tags: [outputs, mrc, csv, jobs, performance] +timestamp: '2026-07-26T00:00:00Z' +--- + +# A run is a directory + +`simulate_project` mints a UUID per run and writes everything under +`/jobs//`. `project_dir` defaults to the current working +directory, which is why a repo-root `jobs/` folder accumulates during +development (it is git-ignored; the web backend keeps its own under +`QUEST_WEBUI_DATA_DIR`). + +| File | Content | +|---|---| +| `project.json` | The exact project dict that produced the run — the run is reproducible from it | +| `result.json` | Scalars and curves: quantum yields, lifetime, contact fraction, AV/contact volumes, FRET efficiency, `aa_residence` | +| `decay.csv` | Time axis and donor (and FRET) counts | +| `results.csv` | The scalar metrics in tabular form | +| `aa_residence.csv` | Per-residue-type contact and quenching breakdown | +| `av.mrc`, `acv.mrc` | Accessible volume and accessible **contact** volume as density grids | +| `diffusion_coefficients.mrc`, `quenching_rates.mrc` | The per-voxel physics grids, when present | +| `sampled_dye_density.mrc` | Where the trajectory actually went, voxelised | +| `out.xyz`, `out_slow.xyz` | AV / slow-AV point clouds | +| `trajectory.npy` | The raw walk | + +The `.mrc` writer is hand-rolled in `quest/core.py` (`write_mrc`) — a 1024-byte +MODE 2 header plus float32 data, with the origin in words 50–52 so the grid +lands on the structure in a molecular viewer. + +# `save_outputs=False` is a real optimisation, not a flag + +`simulate_project(..., save_outputs=False)` skips the whole directory *and* the +thinned point clouds. For a residue scan — which reads only the scalar metrics +and `aa_residence` — the artefacts dominate the runtime and nothing ever reads +them. Both `quest scan` and the web `/api/scan` use it. Anything that loops over +sites should too. + +Note that `save_outputs` also drives `save_avs` in the project dict, so the AV +point clouds are not written either. + +# Consequence for the viewer + +Because the full clouds stay on disk, what travels through `result.json` to a 3D +viewer is *thinned* (`trajectory_display_points`, default 2000). A viewer that +needs the full cloud reads the `.xyz`/`.mrc` files from the job directory. diff --git a/okf/architecture/project-schema.md b/okf/architecture/project-schema.md new file mode 100644 index 0000000..adb3a88 --- /dev/null +++ b/okf/architecture/project-schema.md @@ -0,0 +1,101 @@ +--- +type: Specification +title: Project schema +description: The project-JSON contract shared by every QuEst surface, and the parameter catalog that documents it. +resource: quest/cli.py +tags: [schema, project, json, parameters] +timestamp: '2026-07-26T00:00:00Z' +--- + +# One document, every surface + +A QuEst **project** is a plain JSON object. The CLI, the Python API, the web UI +and the Qt GUI all read and write the same document — there is no second format +and no per-surface variant. `quest template [--with-fret]` emits a valid +starter; `quest validate -p project.json` checks one. Both live in +`quest/cli.py` (`_template_project`, `_validate_project`). + +# The document + +```jsonc +{ + "tau0": 4.2, // unquenched donor lifetime, ns + "n_photons": 500000, // photons to collect (photon mode) + "t_max": 16000.0, // diffusion duration, ns + "t_step": 0.032, // diffusion time step, ns + "dg": 0.5, // AV grid spacing, Angstrom + "critical_distance": 8.5, // fallback dye-centre -> quencher radius, A + "slow_radius": 8.5, // stickiness radius around a residue, A + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": { "TRP": {"kQ": …, "quench_radius": …, + "quench_atoms": [...], "slow_factor": …}, … }, + "pdb": "structure.pdb", // path, or a bare 4-character RCSB PDB ID + "attachment": {"chain": "A", "residue": 1, "atom": "CB"}, + "n_bins": 4096, // TAC histogram bins + "parallel_trajectories": -1, // -1 = all cores + "coarse_grained": false, + "random_seed": null, // set for reproducible runs + "decay_mode": "photon", // or "curve" (+ n_curves / dt_tac / n_tac) + "save_avs": false, + "output_file": "out", + "fret": { + "enabled": true, + "dyes": [ {"name": "donor", "D": 7.5, "attachment": {...}, + "av_parameter": {...}, "slow_radius": …, + "amino_acid_interactions": {...}}, + {"name": "acceptor", "D": 7.5, "attachment": {...}, "av_parameter": {...}} ], + "R0_matrix": [[null, 5.5], [5.5, null]] + } +} +``` + +**Required top-level keys** (enforced by `validate`): `tau0`, `n_photons`, +`t_max`, `t_step`, `dg`, `critical_distance`, `av_parameter`, +`amino_acid_interactions`, plus a structure (`pdb` or an override) and at least +one entry in `fret.dyes` carrying a diffusion coefficient `D`. + +# Units: Ångström and nanoseconds, everywhere + +Every length in a project is in **Ångström** — linker geometry, dye radii, +`critical_distance`, `slow_radius`, the grid spacing `dg`, and the Förster radii +in `fret.R0_matrix`. Every time is in **nanoseconds** (`tau0`, `t_max`, +`t_step`), and diffusion coefficients are Ų/ns. + +`R0_matrix` is the one that has bitten: the transfer rate goes as `(R0/r)^6`, so +a Förster radius entered in nanometres is ten times too small and FRET +disappears without an error. `quest/project.py` exposes the template value as +`DEFAULT_FORSTER_RADIUS = 52.0` with the unit stated, and +`tests/test_fret_units.py` pins it. + +# Two rules that keep it coherent + +- **The donor is `fret.dyes[0]`, always** — even when `fret.enabled` is false. + That is where `D`, and optionally a per-dye `slow_radius`, + `amino_acid_interactions`, `av_parameter`, `random_seed` and `coarse_grained` + live. Top-level values are the fallback; the dye entry wins where both exist + (see `build_donor_from_project`). +- **Dotted paths address everything.** The CLI's `--set a.b.c=value` and + `--grid a.b.c=v1,v2` walk the same dotted path into the document, which is why + nesting stays shallow and predictable. New keys should keep that property. + +# The parameter catalog is the single source of truth for help text + +`quest/settings/parameter_catalog.json` maps each dotted parameter id to its +label, category, type, unit and description. It feeds: + +- the web UI's field labels and help badges, +- `doc/parameters.md`, which is **generated** by `doc/generate_parameter_docs.py` + and must never be hand-edited, and +- the `/api/parameter-catalog` endpoint. + +Changing a parameter's meaning means editing the catalog and regenerating the +doc **in the same change** — see +[workflows/change-tracking.md](/workflows/change-tracking.md). + +# Dye presets + +`quest/settings/dye_repository.json` holds per-dye starting values (`tau0`, `D`, +`av_parameter`, `slow_radius`, and a full `amino_acid_interactions` table) for +Alexa488, Alexa594, Cy3, Cy5 and Atto488. The web UI serves them at `/api/dyes` +and can append user dyes there. They are **starting values to be calibrated**, +not constants — see [references/pet-quenching-theory.md](/references/pet-quenching-theory.md). diff --git a/okf/architecture/simulation-pipeline.md b/okf/architecture/simulation-pipeline.md new file mode 100644 index 0000000..63ae4ae --- /dev/null +++ b/okf/architecture/simulation-pipeline.md @@ -0,0 +1,87 @@ +--- +type: Architecture +title: Simulation pipeline +description: The three stages of a QuEst run — accessible volume, Brownian diffusion, photon generation — and where each lives. +resource: quest/core.py +tags: [simulation, accessible-volume, brownian-dynamics, monte-carlo] +timestamp: '2026-07-26T00:00:00Z' +--- + +# The three stages + +Every QuEst run — from the CLI, the API, the web UI or the GUI — is the same +three-stage pipeline, orchestrated by +[`simulate_project`](/subsystems/core-api.md) in `quest/core.py`. + +## 1. Accessible volume (where the dye can be) + +The dye is a sphere on a flexible linker. Given the attachment atom +(chain/residue/atom) and the linker geometry (`linker_length`, `linker_width`, +`radius1..3`), the set of sterically reachable dye-centre positions is +enumerated on a cubic grid of spacing `dg`. + +Two further grids are derived from it, both in `AV.calc_slow_av`: + +- a **slow-factor grid** — near-surface voxels where the dye diffuses more + slowly because of unspecific stickiness, and +- a **k_quench grid** — the per-voxel PET quenching rate, summed over every + residue whose contact sphere covers that voxel. + +Code: [subsystems/accessible-volume.md](/subsystems/accessible-volume.md) +(`quest/lib/fps/__init__.py`, `quest/lib/imp_av.py`). + +## 2. Brownian diffusion (where the dye goes) + +A single long random walk of `t_max / t_step` steps is run *inside* the AV, with +the local diffusion coefficient taken from the slow-factor grid, so the dye +lingers where it sticks. The walk is a numba kernel (`_simulate_traj_grid` / +`_simulate_traj`) and reflects at the AV boundary. + +The trajectory is the object everything downstream reads: quenching is evaluated +per frame, and the residue-resolved contact statistics are run-length analyses +over the same frames. + +Code: [subsystems/dye-diffusion.md](/subsystems/dye-diffusion.md). + +## 3. Photons and the decay (what the experiment would see) + +Walking the trajectory with an excited-state clock produces the fluorescence +decay. Each frame contributes a de-excitation rate `1/tau0 + k_quench(frame)`; +photons are drawn until `n_photons` are collected (photon mode) or the decay +histogram is integrated directly over many curves (curve mode). + +Code: [subsystems/photon-decay.md](/subsystems/photon-decay.md). + +# What comes out + +A [`DecaySimulationResult`](/subsystems/core-api.md): the decay curve, the donor +quantum yield and mean lifetime, the contact fraction, AV/contact volumes, the +optional FRET channel, the thinned trajectory and point clouds a 3D viewer +needs, and `aa_residence` — the per-residue-type breakdown of contact time and +quenching contribution described in +[subsystems/quenching-model.md](/subsystems/quenching-model.md). + +Two flags control how much of that a caller gets, and they are **separate on +purpose**: + +- `save_outputs` — write the job directory (`result.json`, `.mrc` volumes, + `.xyz` clouds, CSV tables) under `jobs//`. +- `render_data` — build the thinned trajectory, autocorrelation and point + clouds that a plot or a 3D viewer consumes. + +They used to be one flag, which conflated *write files?* with *return something +to draw?*. The Qt form passes `save_outputs=False` so an interactive run does not +litter the working directory, and silently lost its trajectory, AV and +autocorrelation plots along with it. A residue scan wants neither and passes +both `False`: thinning point clouds nobody reads, once per residue, is the +overhead the fast path existed to avoid. + +# Two invariants worth keeping + +- **One trajectory, many read-outs.** The decay, the contact fractions, the + residence statistics and the autocorrelation all derive from the *same* walk. + Anything that re-simulates to answer a second question is a bug waiting to + disagree with itself. +- **The grids carry the physics.** Stickiness and quenching are properties of + *voxels*, not of a per-frame distance loop. A new interaction term belongs in + `calc_slow_av`, next to the others. diff --git a/okf/architecture/surfaces.md b/okf/architecture/surfaces.md new file mode 100644 index 0000000..3e7a9dc --- /dev/null +++ b/okf/architecture/surfaces.md @@ -0,0 +1,65 @@ +--- +type: Architecture +title: Surfaces +description: The four user-facing surfaces and the rule that each is a thin wrapper over one service layer. +resource: quest/api.py +tags: [api, cli, webui, gui, layering] +timestamp: '2026-07-26T00:00:00Z' +--- + +# One service layer, four front ends + +``` + CLI web backend Qt GUI notebooks + (quest/cli.py) (webui/backend) (quest_gui.py) (quest.api) + \ | | / + \________________|_________________|_________________/ + | + quest.api -> quest.core + | + DonorDecay / SimulateDiffusion / AV / photon kernels +``` + +`quest/api.py` re-exports from `quest/core.py` (plus `structure_fetch` and +`fps_json`) and is the **stable import surface**: downstream code and the web +backend import `quest.api`, not the internals. `quest/core.py` is where the +logic lives. + +> This page describes the tree as it is. The **target** is the +> core/rpc/api/cli/gui split adopted from the ChiSurf plugin contract — +> [specs/plugin-integration.md](/specs/plugin-integration.md) — with the current +> divergences itemised in [specs/assessment.md](/specs/assessment.md). QuEst is +> also embedded in ChiSurf as its `quenching_estimator` plugin, which today +> reaches only the Qt widget. + +# The layering rule + +A surface parses input, calls the service layer, and formats output. Simulation +logic does not live in a surface. Two consequences that have already been paid +for: + +- The web backend (`webui/backend/app/main.py`) calls `quest.api` and even + reuses the CLI's own `_validate_project` and `_template_project`, so the + browser and the terminal cannot disagree about what a valid project is. +- The Qt GUI class `TransientDecayGenerator` *inherits* `DonorDecay` rather than + wrapping a copy of it, so the widget and the headless run share one model. + +New behaviour therefore lands in `quest/core.py` first, and the surfaces expose +it. A feature that exists only in the web UI is a design error. + +# The surfaces + +| Surface | Entry | Notes | +|---|---|---| +| Python API | `from quest.api import …` | Documented in [subsystems/core-api.md](/subsystems/core-api.md); safe in headless environments | +| CLI | `quest simulate/scan/template/validate/gui` | [subsystems/cli.md](/subsystems/cli.md) | +| Web UI | FastAPI + Next.js (+ Electron shell) | [subsystems/webui.md](/subsystems/webui.md) | +| Qt GUI | `cs.quest`, `quest gui` | Legacy; needs Qt bindings that are **not** in the current env — [subsystems/gui.md](/subsystems/gui.md) | + +# Qt is optional, and the code keeps it that way + +`quest/lib/fps/__init__.py` and `dye_diffusion.py` import `qtpy` inside a +`try`/`except` and fall back to dummy widget bases when no Qt bindings exist. +That is what lets the CLI, the API and the web backend run in an environment +without PyQt — which is exactly the current one. Do not turn those imports into +hard dependencies. diff --git a/okf/handover.md b/okf/handover.md new file mode 100644 index 0000000..1f6d4d0 --- /dev/null +++ b/okf/handover.md @@ -0,0 +1,169 @@ +--- +type: Handover +title: Session handover +description: Where the tree stands, what is uncommitted, which decisions are open, and the traps that cost time — written to be the first thing a fresh session reads after the index. +resource: okf/log.md +tags: [handover, state, open-questions] +timestamp: '2026-07-27T00:00:00Z' +--- + +# Read this, then [`log.md`](log.md) + +Everything below is **uncommitted**. Nothing has been pushed. Two repositories +are dirty; both are green. + +# State + +| | tests | note | +|---|---|---| +| `arm64` (Qt + compiled IMP.bff) | **350 passed, 4 skipped** | canonical interpreter | +| base + web backend | **313 passed, 25 skipped** | no Qt, no compiled `IMP.bff` | +| browser e2e | **26 passed** | needs both servers up | +| notebooks + examples | **16 passed** | `-m notebooks` | +| ChiSurf `quenching_estimator` | **1 passed** | plugin still loads | +| imp-tricks `tests/bff` | **191 passed, 5 failed** | the 5 predate this work — see below | + +All runs above were on a **cold numba cache**. That matters; see Traps. + +## Uncommitted in `quest` (138 paths) + +Five threads landed this session, in order: + +1. **AutoForm migration.** Every `.ui` file is gone. The Qt form is + `quest/gui/quest.view.json`, *generated* from the parameter catalog by + `quest/gui/generate_view_spec.py`, rendered by ChiSurf's AutoForm, bound to + `quest/gui/form_model.py::ProjectFormModel` — whose state *is* a project + dict, so the GUI can no longer drift from the CLI. + [subsystems/gui.md](subsystems/gui.md). +2. **i18n — English, German, French.** `quest/i18n.py` plus + `quest/settings/locales/*.json`. Because the catalog is the single + description, translating it reaches the docs, the Qt form and the web UI at + once. [subsystems/i18n.md](subsystems/i18n.md). +3. **FRET: the acceptor diffuses and sticks**, with its own `D`, `slow_radius` + and interaction table; `k_FRET(t)` uses the instantaneous pair separation. + The old fast-acceptor limit remains as `fret.acceptor_dynamics: "averaged"`. +4. **`render_data` split from `save_outputs`** — they were one flag doing two + jobs, which cost the Qt form its plots. +5. **Structure I/O reduced to one reader**, taking IMP's radii. + [specs/structure-io.md](specs/structure-io.md). This is the one that changes + numbers; see Decisions. + +## Uncommitted in `~/dev/imp-tricks` (4 files) + +Contributed upstream while unblocking QuEst: + +- `src/IMP/bff/av/compute.py` — three fixes: `get_particle_index()` → + a shim accepting `get_index()`; the LabelLib probe accepting `dyeDensityAV1` + (current builds have no `LabelLib.AV`, so a working install was reported + missing); and the attachment atom's own vdW sphere left in the obstacle list, + which made the LabelLib backend return an **empty volume with no error**. +- `src/sitecustomize.py` — extends the `__path__` of subpackages that are + themselves compiled. Without it `import IMP.bff.av` fails however `sys.path` + is arranged, and imp-tricks' own suite could not collect (28 errors). +- `tests/bff/test_label.py`, `tests/bff/test_restraints.py` — two tests + asserted `ImportError` "without a backend" and passed only *because* of the + LabelLib probe bug. They now monkeypatch the flags. + +The 5 remaining imp-tricks failures (`cgdye/rotamer` R0-vs-FRETpredict, +`dye_io` PDB→mmCIF, `polymer` Gaussian-chain PDF) reference none of the changed +code and had never been collected before. Newly *visible*, not newly broken. + +# Decisions taken (2026-07-27) — **not yet implemented** + +The four open questions were answered. Nothing below has been coded; this is +the work list for the next session, in the order it should be done. + +1. **`IMP.bff` becomes the primary AV backend.** Flip `AV_BACKENDS` in + `quest/core/av.py` to `("imp_bff", "labellib")`. LabelLib stays as the + fallback for platforms without a compiled `IMP.bff` — Windows above all. + Expect the suite to move: the two backends agree to a 0.90 ratio on 148l E36 + (136 707 vs 151 869 points, centroids within 0.5 Å), so contact fractions and + quenching numbers shift by roughly that much and every pinned value needs + regenerating. `quest/core/imp_av.py` is already array-based and now has + coverage (`TestTheImpAvBackendRuns`), so the path is exercised — but it has + never been the *default*, and `tests/test_imp_tricks_bridge.py:: + TestTheImpBackendIsNotReadyToBePrimary` exists solely to assert LabelLib is + first. **Delete that class as part of the flip**; it has done its job. + +2. **Do not strip HETATM or water.** Keep IMP's full atom set as steric + obstacles rather than QuEst's ATOM-only selector — `_atom_record_selector` + in `quest/core/pdb.py` goes, and the reader takes what IMP gives it + (1363 atoms on 148l against the current 1322; the extra 63 are `FGA`, `API`, + `DAL`, `MUB`, `NAG`, `BME`). + *Check while implementing:* IMP's own default already excludes water and + hydrogens — `NonWaterNonHydrogenPDBSelector` returns the identical 1363 — so + "don't strip" is satisfied by passing **no** selector. If crystallographic + waters are genuinely wanted as obstacles, that needs + `IMP.atom.NonHydrogenPDBSelector` (1503 atoms) and is a different, stronger + choice: mobile solvent occluding a dye is unusual, and it will shrink the + accessible volume further on top of decision 1. Measure both before picking. + +3. **`allowed_sphere_radius` defaults to 2.1 Å.** Replace + `MIN_IMP_ALLOWED_SPHERE_RADIUS = 2.0` and QuEst's own `0.5` default with a + single value of **2.1**. This is the radius around the attachment atom inside + which obstacles are ignored so the linker can leave the atom it is tied to. + Below ~2 Å the path search starts nowhere and returns an **empty volume with + no error** — imp.bff's own reference test uses 2.0 and expects zero points at + 1.0. 2.1 sits just above that cliff and matches carbon's radius. + +4. **imp-tricks becomes a declared dependency.** Add it to `pyproject.toml` and + `rattler-recipe/recipe.yaml` so it is installed rather than reached through + the `quest/imp_tricks.py` path shim. That unblocks `DUP-01`–`DUP-03`: + QuEst's `AV` class and `imp_av.py` both collapse into + `IMP.bff.av.compute.compute_av`, and `density2points` / + `random_distances` + `av_pair_statistics` can replace the in-tree copies. + The upstream fixes this depends on are in `~/dev/imp-tricks`, **uncommitted** + — they must be committed and released before QuEst can depend on them. + +Sequencing note: 2 and 3 both change the accessible volume, and 1 changes which +code computes it. Do them **one at a time**, re-running and re-baselining +between each, or the resulting number changes cannot be attributed. Decision 4 +is independent and can go first. + +# Next steps, in order + +1. Implement decisions 1–4 above, one at a time, re-baselining between each. +2. `DUP-02`/`DUP-03` (after decision 4): adopt `IMP.bff.av._kernels.density2points` (verified + numerically identical, and a superset — it keeps voxel weights) and + `random_distances` + `av_pair_statistics`. +3. **Do not** adopt upstream's `r_mp`: `av_pair_statistics` returns ⟨R_DA⟩ under + that name (its docstring admits "same as `r_da_mean` here"), which is a + different quantity — 47.65 vs 51.53 Å on 148l E15/E90. QuEst's `dRmp` is + correct and should go *upstream*. +4. Remaining backlog rows: `LAY-04` (`quest.api` is still a re-export shim), + `LAY-07` (three unrelated long-running mechanisms, none cancelable), + `OBJ-01` item 6 (κ² unmodelled), `OBJ-02` (fitting — not started, by + instruction). [specs/assessment.md](specs/assessment.md). +5. Web UI chrome is still partly English — plot card titles, metric row names, + empty states, toolbar. `t()` is wired; it is one key at a time. + +# Traps that cost time here + +- **A warm numba cache hides compile-time failures.** `@njit(cache=True)` + kernels only re-read configuration when they actually compile, so a green + suite proves nothing after touching a jitted module. Clear it: + `find quest -name '__pycache__' -type d -exec sh -c 'rm -f "$1"/*.nbi "$1"/*.nbc' _ {} \;` + `tests/conftest.py` now pins `NUMBA_NUM_THREADS` and `NUMBA_THREADING_LAYER` + for exactly this reason. +- **`Structure(path)` defaults to `make_coarse=True`.** A scratch script + comparing coordinates against a PDB file will look 1.5 Å wrong. Pass + `make_coarse=False`. +- **uvicorn does not reload.** Restart it before any browser run. Locale files + are `lru_cache`d per process, so editing one has no effect until restart. +- **The frontend needs Node ≥ 20**; `/opt/homebrew/bin/node` is 26, the one on + `PATH` is 18.15 and Next refuses to start. +- **`-p no:pytest-qt` only where there is no Qt binding.** The plugin aborts + collection in the base environment, so the flag is required there. In `arm64` + pytest-qt *is* installed and the flag is harmful: it removes the `qtbot` + fixture, which is what made ChiSurf's own chimol widget tests error. Passing + it reflexively to another project's suite will look like that project is + broken. +- **`import IMP.bff` succeeding does not mean the compiled AV exists.** In the + base environment the *source* `IMP.bff` imports (nothing shadows it) while the + C++ `AV` class is absent. Guard on `quest.core.imp_av.HAS_IMP_BFF`. +- **Verify that an edit actually applied.** Three `str.replace` calls in a row + silently no-oped here because the anchor text had already changed, and it only + surfaced as a test failing on a stale value. +- **A backend with no coverage will ship broken code.** `imp_av.py` carried a + `Model.get_particles()` call that does not exist; nothing noticed because + `AV_BACKENDS` starts with LabelLib and no test entered that branch. diff --git a/okf/index.md b/okf/index.md new file mode 100644 index 0000000..50e00d4 --- /dev/null +++ b/okf/index.md @@ -0,0 +1,28 @@ +--- +okf_version: "0.1" +--- + +# QuEst Knowledge Bundle + +An [Open Knowledge Format](https://github.com/GoogleCloudPlatform/knowledge-catalog) +bundle describing the QuEst codebase — the simulation pipeline, its subsystems, +the project-file contract, and the developer workflows. Authored for agents and +humans who need durable context on how this repository is organized. + +This bundle is the project's **persistent memory**: what is learned about the +code, the environment, and the physics is written here rather than left in a +chat log. Start here, not in the source tree. + +# Concepts + +* [**Session handover**](handover.md) - **Read first.** Where the tree stands, what is uncommitted in both repositories, which decisions are waiting on a human, and the traps that cost time. +* [Overview](overview.md) - What QuEst is, the source layout, and the entry points. +* [Update log](log.md) - The running, dated narrative of what changed and why. + +# Subdirectories + +* [architecture](architecture/index.md) - The three-stage simulation pipeline, the project-JSON contract that every surface shares, and the four user-facing surfaces. +* [subsystems](subsystems/index.md) - The major code areas: core service layer, accessible volumes, dye diffusion, the quenching model, photon/decay generation, structure I/O, and the CLI/web/GUI front ends. +* [specs](specs/index.md) - The target architecture — the core/rpc/api/cli/gui split adopted from the ChiSurf plugin contract — and the backlog tracking where today's code diverges from it. +* [workflows](workflows/index.md) - Developer workflows: change tracking (the memory loop), environment, and testing. +* [references](references/index.md) - PET-quenching theory, known issues, and pointers to the maintained user documentation. diff --git a/okf/log.md b/okf/log.md new file mode 100644 index 0000000..ebf4882 --- /dev/null +++ b/okf/log.md @@ -0,0 +1,1289 @@ +# Update Log + +## 2026-07-27 + +* **Four architectural decisions taken, none implemented yet** — written up in + [handover.md](handover.md) as the next session's work list: `IMP.bff` becomes + the primary AV backend with LabelLib the Windows fallback; HETATM and water + are no longer stripped; `allowed_sphere_radius` defaults to 2.1 Å (just above + the ~2 Å cliff below which IMP's path search returns an empty volume without + complaining); and imp-tricks becomes a declared dependency, which unblocks + `DUP-01`–`DUP-03`. Decisions 1–3 each change the accessible volume, so they + must land one at a time with a re-baseline between them, or the number + changes cannot be attributed. Decision 4 depends on the upstream fixes in + `~/dev/imp-tricks` being committed and released first. +* **Radii now come from IMP, and the structure layer is one thin reader** + (`quest/core/pdb.py`, per [specs/structure-io.md](/specs/structure-io.md)). + `read_pdb` already decorates every particle with a radius, so the reader takes + `IMP.core.XYZR(p).get_radius()` and `IMP.atom.Mass(p).get_mass()` directly — + no helper, no fallback table, no `add_radii` call (redundant: the parser has + already done it). `quest/core/elements.py` is **deleted** (271 lines), and + with it the last table that made the two AV backends disagree. The dead + `assignCharge` path went too — no caller ever set it. + **This changes the science.** IMP's radii are CHARMM-style + (`get_all_atom_CHARMM_parameters`): C 2.10, N 1.85, O 1.71 against the + Bondi-ish 1.76 / 1.65 / 1.40 QuEst carried. ~19 % fatter atoms, ~72 % more + excluded volume, and accessible volumes shrink accordingly. On 148l chain E + **only 43 of 151 CB sites remain labelable** — pockets that were open at + Bondi radii are closed at CHARMM ones. Burial is also resolution-dependent: a + site can be labelable at `dg = 1.0` and buried at `0.5`, because the coarser + grid cannot resolve the atoms that close it (mc4r A1). +* **The two AV backends now converge.** Fed the same atom array with the same + radii, IMP.bff and LabelLib give 136 707 vs 151 869 points on 148l E36 — + ratio **0.90**, centroids within 0.5 Å. Before, with QuEst's own radii on one + side and IMP's on the other, the ratio was 0.78 and it was misread as an + algorithmic difference. The residual 10 % is the real algorithmic gap. +* **`imp_av.py` takes the atom array, not a filename.** It builds the IMP model + from `structure.atoms`, so coarse-graining can no longer be discarded and + mmCIF works wherever the reader works. It also shipped a + `Model.get_particles()` call that does not exist — **an entire backend with + no test coverage**, because `AV_BACKENDS` starts with LabelLib and nothing + ever entered that branch. `TestTheImpAvBackendRuns` now exercises it, and + guards on `HAS_IMP_BFF` rather than on `import IMP.bff` succeeding: in the + base environment the *source* `IMP.bff` imports (nothing compiled to shadow + it) while the C++ `AV` class this backend needs is absent. +* **Test baseline regenerated for the new radii.** Sites that no longer have an + accessible volume were replaced everywhere, and the choice is not arbitrary — + each test needs a site that satisfies *its own* assertion: + `test_api` asserts the quenching grid reaches 2.0 /ns with **only TYR** + quenching, so it needs a tyrosine within `critical_distance` (36 or 82 are + the only labelable sites that qualify); `test_simulation_performance` needs + `0 < QY < 1` under its own chemistry (18, 96, 36 — note 118 quenches under + the template project but not under that one); `test_fret_physics` needs a + pair with *intermediate* transfer so the two acceptor regimes can differ + (55→82: E 0.73 trajectory vs 0.77 averaged; the previous pair saturated at + 0.95 and the regimes agreed to within the tolerance). +* **A process note.** Three `str.replace` edits in a row silently no-oped + because the anchor text had already changed, and I only noticed when the test + kept failing on the old value. Assert the replacement changed the file, or + read the line back. +* **Tried to make IMP.bff the primary AV backend. It is not ready, and now we + know exactly why.** Flipping `AV_BACKENDS` and running the suite in `arm64` + produced four failures that are all one root cause: + `quest/core/imp_av.py::build_imp_accessible_volume` **re-reads the structure + file from disk** (`IMP.atom.read_pdb`) instead of using the structure it was + handed. Consequences, both measured: + - a coarse-grained project silently gets the **all-atom** volume — coarse and + all-atom came out byte-identical at 13883.805 ų, which is what + `test_coarse_grained` caught; + - `.cif` projects fail outright, because that re-read is `read_pdb` only + (`test_mc4r`: "No molecule read from file … mc4r_dimer.cif"). + Patching `imp_av.py` is the wrong fix. `IMP.bff.av.compute.compute_av` takes + plain arrays (`atoms_xyz`, `atoms_vdw`, `source_xyz`) and therefore *cannot* + re-read a file or miss an in-memory transformation. Routing through it is the + correct end state; it needs its own `imp_bff` backend fixed upstream first, + which currently resamples a density of the *attachment particle* rather than + the AV, and dies on a missing `mass` attribute before it gets there. + Order reverted to LabelLib-first; four tests in + `test_imp_tricks_bridge.py::TestTheImpBackendIsNotReadyToBePrimary` pin the + two defects so the ordering cannot stay wrong by inertia. +* **The empty IMP volume is solved: `allowed_sphere_radius`.** OKF had carried + this as "a third fault unresolved" since 2026-07-27. It is the radius around + the attachment atom inside which obstacles are ignored so the linker can leave + the atom it is tied to; at QuEst's default of 0.5 Å the attachment atom's own + neighbours block every starting voxel and the path search returns **an empty + volume with no error**. 2.0 Å gives 108 771 points. `MIN_IMP_ALLOWED_SPHERE_RADIUS` + now floors it. Same physical issue as the LabelLib attachment-radius bug fixed + upstream earlier today — LabelLib has no such parameter and zeroes the + attachment atom's radius instead. +* **The two backends disagree by ~20 % on volume.** 148l E15 all-atom, linker + 21.5/0.5, dye 3.5 Å, dg 0.5: IMP.bff ~14 500 ų, LabelLib ~17 500 ų, with + centroids within 0.6 Å — the same place, less of it. Widening + `allowed_sphere_radius` to 6 Å moves IMP only to 14 512 ų, so it is an + algorithmic difference, not a parameter one. It propagates to the contact + fraction and hence to the quenching, so promoting IMP.bff changes results and + must not be done quietly. +* **A false alarm worth recording.** `Structure.__init__` defaults to + `make_coarse=True`, so `Structure(path)` in a scratch script silently returns + a coarse-grained structure — which made QuEst's CB for 148l E15 look 1.5 Å + off the PDB. It is not: with `make_coarse=False` it matches the file exactly + (3.097, 47.598, 53.650), and the simulation path always passes the project's + flag explicitly. The AV comparison had to be redone apples-to-apples. +* **Acted on the imp-tricks evaluation.** Three fixes landed *upstream* in + `~/dev/imp-tricks`, and `compute_av` now reproduces QuEst's accessible volume + **bitwise** (167 196 points on 148l E15, identical after sorting) in both + environments: + `get_particle_index()` → a shim accepting `get_index()` too; the LabelLib + probe accepting `dyeDensityAV1` (current builds have no `LabelLib.AV`, so a + working install was reported missing); and — the reason it returned an empty + volume — the attachment atom's own vdW sphere left in the obstacle list, so + the linker source sat inside an obstacle and LabelLib returned nothing + without complaining. QuEst had always zeroed that radius. + Also upstream: `src/sitecustomize.py` now extends the `__path__` of + subpackages that are themselves compiled, which is why imp-tricks' own test + suite could not import `IMP.bff.av` (28 collection errors → **191 passed, 5 + failed, 24 skipped**); QuEst had solved the same problem privately in + `quest/imp_tricks.py`. Two of its tests asserted `ImportError` "without a + backend" and passed only *because* of the LabelLib probe bug; they now + monkeypatch the flags instead. The 5 residual failures (rotamer R0, dye_io, + polymer PDF) reference none of this and had never been collected before. + `tests/test_imp_tricks_bridge.py::TestTheUpstreamAvMatchesQuEsts` pins the + equivalence — the precondition for deleting QuEst's `AV`. +* **What now blocks `DUP-01` is packaging, not capability.** `IMP.bff.av` + resolves in the base interpreter too (nothing compiled there to shadow it), + so the only thing stopping the deletion is that imp-tricks is a development + path shim rather than a declared dependency. That is a decision about what + QuEst depends on. +* **`quest/core/structure.py`: 623 → 345 lines.** RMSD, clustering, the torsion + subsystem (`coord_i`, `internal_coordinates`, `phi`/`psi`/`omega`/`chi`) and + the geometry primitives behind them had no readers. Three traps, all caught by + *running* rather than reading: "no callers outside this module" is the wrong + question for helpers the class itself calls; cutting a function span up to the + next `def` swallows the module constants that follow it (`a2id`, `res2id`, + `internal_keys`); and the cut left an orphaned `@njit` that silently decorated + the next function written below it, which then failed to type-infer. +* **One `density2points`, not two.** QuEst carried a flat/centre-origin variant + for its own AV and a 3-D/corner-origin one for LabelLib's grid, differing only + by a shift. Now one kernel plus `_points_from_centred_grid`, with the argument + order matching `IMP.bff.av._kernels.density2points` so the eventual swap is a + thin adapter. +* **Re-measured the imp-tricks split, by running it rather than reading it** + ([specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md)). Four findings that + change the plan: + 1. **The blockers are two lines, and they are upstream.** `compute_av` fails + in `arm64` on *both* backends: `av/compute.py:162` calls + `Particle.get_particle_index()` where this IMP has `get_index()`, and + `av/compute.py:231` refuses LabelLib because it looks for `LabelLib.AV` + while the installed LabelLib exposes `dyeDensityAV1`. Its signature is + already the right shape (plain arrays, no IMP particles), so fixing those + two lines deletes QuEst's `imp_av.py` and its `AV` class outright. + 2. **Two duplicates are adoptable today**, nothing blocking: + `IMP.bff.av._kernels.density2points` (numerically identical to QuEst's, + and a superset — arbitrary dimensions, keeps voxel weights, while QuEst + carries *two* lesser copies) and `random_distances` + + `av_pair_statistics` for ⟨R_DA⟩ / ⟨R_DA⟩_E (agree within sampling noise). + 3. **One duplicate points the other way.** `av_pair_statistics` returns + `r_mp` = ⟨R_DA⟩ — its docstring admits "same as `r_da_mean` here" — but + R_mp is |⟨r_D⟩ − ⟨r_A⟩| and cannot be recovered from a distance sample. + On 148l E15/E90: QuEst 47.65 Å, upstream 51.53 Å. QuEst is right; + `dRmp` should be contributed upstream, not deleted. + 4. **`structure.py` is mostly dead.** Zero callers anywhere in the tree for + `rmsd`, `cluster`, `calc_internal_coordinates`, `move_center_of_mass`, + `r2i`, `make_residue_lookup_table`, `get_residue_sequence`, and for the + `Structure` methods `internal_coordinates`, `radius_gyration`, + `update_dist`, `update_coordinates`, `b_factors`, `atom_types`, + `residue_dict`, `n_residues`, `phi`/`psi`/`omega`/`chi`. That is a QuEst + cleanup needing no upstream fix. (One apparent `.phi` hit was in a + vendored `ngl.js` — grep the source tree, not `webui/frontend/public`.) +* **The acceptor diffuses and sticks, with its own dye properties (`OBJ-01` + item 2).** It was a static cloud that the per-frame rate averaged over — the + fast-acceptor limit. It now walks its own accessible volume with its own + `D`, `slow_radius` and `amino_acid_interactions` (each defaulting to the + donor's), and `k_FRET(t)` uses the instantaneous pair separation + (`quest/core/av.py::fret_rate_pair_trace`). The old regime stays reachable as + `fret.acceptor_dynamics: "averaged"`. + **This changes what QuEst computes for existing FRET projects**: on 148l + E15→E90 with a sticky acceptor (D = 2.5 Ų/ns, slow radius 11 Å) E moved + 0.73 → 0.78. Not a bug fix on either side — the two answer different + questions. The cloud is weighted uniformly; a trajectory is weighted by where + the dye dwells, and a sticky dye dwells near the surface. Which way that + moves E depends on the geometry; there is no fixed bias, and an earlier draft + of the docstring claimed one until the numbers said otherwise. + The acceptor's walk carries no quenching: QuEst reports the *donor's* decay, + and the acceptor's own PET would change how bright the acceptor is. Its seed + is offset from the donor's, or the two dyes would move in lockstep. + New catalog entries (translated, as the completeness test demands): + `fret.acceptor_dynamics`, `fret.dyes.1.slow_radius`, + `fret.dyes.1.amino_acid_interactions`. Reachable from the web FRET panel and, + via the generated view spec, from the Qt form. 18 new tests in + `test_fret_physics.py`. +* **A cold numba cache failed the suite, and a warm one hid it.** After editing + `quest/core/av.py`, one full run failed in `density2points_ll` with + `RuntimeError: Cannot set NUMBA_NUM_THREADS to a different value once the + threads have been launched (currently have 7, trying to set 8)`; the next + three passed. It reproduces **exactly** on a cold cache + (`find quest -name '__pycache__' -exec sh -c 'rm -f "$1"/*.nbi "$1"/*.nbc' _ {} \;`) + and never on a warm one, because only a fresh compile makes numba re-read its + configuration. Nothing in QuEst sets the variable — traced with an + `os.environ` watcher and a `set_num_threads` wrapper, both silent — so the + launched count came from elsewhere in the process. Fixed by pinning + `NUMBA_NUM_THREADS` in `tests/conftest.py` beside `NUMBA_THREADING_LAYER`: + an explicit value removes the recomputation. Three cold runs green in both + environments. **A green suite proves nothing about numba here unless the + cache was cold.** +* **FRET is reachable and *tested* on all three surfaces.** It had landed on the + web UI earlier (enable toggle, acceptor site selectors, `R0 [Å]`, and a + browser test that runs a full FRET simulation and asserts `0 < E ≤ 1`), and it + survived the AutoForm rewrite — but every desktop test set + `fret_enabled = False`, so the Qt path was working by inspection only. + `test_gui_simulation.py::TestTheFormRunsFret` closes that: both decays, a + partial efficiency on a chosen site pair, `E = 1 − QY_DA/QY_D` agreeing with + the reported number, a larger R0 transferring more (a nanometre R0 would not), + the toggle gating the channel, and save/load round-tripping the acceptor. + E = 0.77 on 148l E15→E90 at R0 = 52 Å. Still open in + [specs/objectives.md](/specs/objectives.md): the acceptor does not move + (fast-acceptor limit) and κ² is not modelled. +* **`locale.getdefaultlocale()` is removed in Python 3.15**, and QuEst was + calling it — the deprecation warning showed up in the GUI test output the day + it was written. `quest.i18n.system_locale()` now reads `LC_ALL`, `LC_MESSAGES`, + `LANG`, `LANGUAGE` directly, which is all that function did anyway; + `locale.getlocale()` is *not* a substitute, since it reports the current + locale, `(None, None)` until something calls `setlocale`. `LANG=C` means "no + localisation", not "a language", so it resolves to English. +* **English, German and French (`quest/i18n.py`).** Because the catalog is the + single description of every parameter, translating *it* translates the docs, + the Qt form and the web UI at once — no gettext, no per-surface dictionary. + `quest/settings/locales/{en,de,fr}.json` hold the translated labels and + descriptions plus a `ui` section for everything that is not a parameter. + `python -m quest.gui.generate_view_spec` now writes one view spec per language + and `doc/generate_parameter_docs.py` one doc page per language; + `/api/parameter-catalog?locale=` and a new `/api/i18n` (RPC: `quest.locales`, + and `locale` on `quest.parameter_catalog`) serve the browser, which has a + language selector in the header. Full picture: + [subsystems/i18n.md](/subsystems/i18n.md). +* **The backend defaults to English, not to the server's locale.** A shared + backend answering in whatever language its host machine is configured for + would be a surprise no client asked for; `resolve_locale()` (env → OS → + English) is for the *desktop*, and the RPC handlers deliberately do not call + it. Pinned by a test that sets `QUEST_LOCALE=de` and asserts the RPC still + answers in English. +* **German column headers did not fit the quencher table.** Every assertion was + green; rendering the German form and looking at it showed "Löschrate kQ + (1/ns)" clipped to "öschrate kQ (1/n". Table headers now use their own short + `table.*` strings and keep the full wording as the tooltip. The reason + CLAUDE.md says to look at the images. +* **Locale files are cached per process**, so editing one while uvicorn runs + changes nothing until it restarts — the same trap as uvicorn not reloading, + and it cost one confused round of browser checks. Recorded in + [subsystems/i18n.md](/subsystems/i18n.md); `i18n.clear_cache()` exists for + tests. +* **The `.ui` files are gone; the Qt form is generated (`LAY-06`, `LAY-10`, + `LAY-11` all closed).** `quest/gui/quest.view.json` is generated from + `quest/settings/parameter_catalog.json` by `quest/gui/generate_view_spec.py` + and rendered by ChiSurf's `AutoForm`. Deleted: `dye_diffusion2.ui`, + `pdb_widget.ui`, `ui/av_property.ui`, `ui/dye_diffusion.ui`, + `ui/dye_diffusion3.ui`, `widgets.py`, `dye_diffusion.json`, and + `ui/rescource_rc.py` (98 kB of generated base64 that nothing imported); the + window icon survives as `quest/gui/icons/dye-diffusion.ico`. + `dye_widget.py` went from 1,899 lines to ~130. The quencher table now edits + `amino_acid_interactions` directly (that is LAY-10 — there is no legacy + `{residue: {atoms, kQ}}` shape left to disagree), and the three plots are + `plot` sections rendered through `chiplot` (LAY-11 — QuEst owns no plotting + code at all). Details in [subsystems/gui.md](/subsystems/gui.md). +* **The form's state *is* a project (`quest/gui/form_model.py`).** The old + widget kept state in ~40 Qt controls and converted to a project dict and back + by hand — and the conversion is exactly where the GUI drifted from the CLI + before (it once shipped different quenching chemistry). `ProjectFormModel` + presents a project dict as flat attributes, so what the desktop saves is + byte-for-byte what `quest simulate` runs and the web UI posts. It imports no + Qt: `tests/test_form_model.py` runs in the base environment, which has no Qt + binding, with a subprocess guardrail that importing it pulls none in. +* **One description per parameter, now including the desktop.** The catalog + already generated `doc/parameters.md` and fed the web UI; it generates the Qt + form too. `tests/test_view_spec.py` regenerates in memory and fails if the + committed `quest.view.json` differs; `tests/test_form_model.py` fails if the + catalog documents a parameter the form does not bind, or the reverse. A new + input can no longer reach the docs and the web UI while missing from the + desktop. Also normalised two catalog entries that said `"Angstrom"` where + every other said `"Å"`, and regenerated `doc/parameters.md` (which was stale + by 323 lines). +* **`save_outputs` was doing two jobs, and the GUI lost its plots to it.** + Writing `jobs//` and building the thinned trajectory/AV clouds were + behind the same flag. The Qt form passes `save_outputs=False` so an + interactive run leaves nothing behind — and silently got no trajectory, AV or + autocorrelation data to plot. `simulate_project` now takes a separate + `render_data` (default `True`); `quest/scan.py` passes `render_data=False`, + which is what actually wanted the fast path. Found by a GUI test, not by + reading the code. +* **`tests/test_gui_simulation.py` was testing an unquenched site.** It labelled + 148l chain E residue 55, where nothing quenches: QY came out exactly 1.0 and + the assertion `0 < QY <= 1` passed anyway. Moved to residue 15 (one of + `QUENCHED_SITES` in `test_simulation_performance.py`) and tightened to + `0 < QY < 1`, so the test now fails if the quenching path breaks. +* **The AutoForm seam exists in the tree (`LAY-06`).** + `quest/gui/autoform_panel.py::build_method_panel(name)` renders any of the + eleven methods declared in `quest/manifest.json` through ChiSurf's + `AutoForm.from_rpc_method`, and the form it returns yields + `model.params()` shaped exactly like the RPC params — so a panel and its + handler cannot drift apart, and the parameter half of the form needs no + QuEst-side UI code. Additive on purpose: `dye_diffusion2.ui` still loads, + because the manifest cannot describe the structure picker, the quencher + table, the plots or the 3D view. Those need a `quest.view.json` scheme + (AutoForm has `path_list` and `state_table` for the first two); the `.ui` + files go when it covers them. Four tests added + (`tests/test_chisurf_autoform.py::TestQuestPanelHelper`), including one that + asserts the helper lists *exactly* what the manifest declares, so adding a + method without a renderable schema fails. +* **`tests/test_pdb_id_support.py` imported FastAPI unguarded**, so it aborted + collection of the whole suite in `arm64` — which has IMP and Qt but not the + web extra. Now an `importorskip`, matching every other optional-dependency + test. This was masked until the full `tests/` tree was run in `arm64`. +* **The Qt GUI uses chimol, and now finds it by itself.** QuEst's own PyMOL + viewer was deleted earlier today; what remained was that chimol was only + discovered when ChiSurf happened to be on `sys.path`, so the default silently + fell back to the placeholder. `quest/gui/dye_widget.py` now calls + `enable_chisurf()` at import — the same bridge everything else uses — and the + viewer preference defaults to `chimol` rather than `pymol`, which named a + widget that no longer exists. + + Verified from `/tmp`, with no `PYTHONPATH` set: `_HAS_CHIMOL` is true and the + live widget reports `_ChimolAdapter`. 208 tests pass in `arm64`. + + +* **QuEst now resolves to this checkout from anywhere — and that immediately + found a break.** The base environment's editable install mapped `quest` to + `chisurf/modules/quest/quest`, a separate older checkout, via a meta-path + finder that outranks the current directory; `arm64` had no QuEst installed and + worked only because the shell sat in the repo. Both are fixed: the editable + install re-points here, and `arm64` gets a `quest-src.pth`. Verified from + `/tmp` in both. + + `chisurf/modules/quest` is a **git submodule with its own `.git`**, so it was + *not* replaced by a symlink — it may carry unpushed work, and deleting a + checkout to save a path lookup is the wrong trade. It is simply no longer what + gets imported. + + With the live tree actually in play, ChiSurf's `quenching_estimator` plugin + failed to import: it still referenced `quest.lib.tools.dye_diffusion`, removed + by today's relocation. Pointed at `quest.gui`; **46 ChiSurf plugin tests pass** + (quenching_estimator + fps_json_editor). The breakage had existed all day and + was masked by the stale copy — which is the argument for linking the two + repositories rather than vendoring a snapshot. + + +* **Three follow-ups recorded rather than started** (end of a long session; a + half-done UI migration is worse than none): + delete the `.ui` files in favour of AutoForm over the manifest, render the Qt + plots through ChiSurf's `chiplot` instead of hand-built pyqtgraph (`LAY-11`), + and verify that ChiSurf's own test runs use the live `src` checkout rather + than its stale installed copy. All three are written up with what is already + known in [plugin-integration.md](/specs/plugin-integration.md). + + +* **The 3D viewer now says what its colours mean.** Magenta spheres marked the + quenching centres — the same atoms the simulation uses — but nothing on screen + said so, which made the most informative thing in the view read as decoration. + A three-line legend (quenching centre / labeling site / accessible volume) + sits bottom-left of the stage, `pointer-events: none` so it never intercepts a + drag. Verified in the browser; 22 browser tests still pass. + + Deliberately **not** changed: the default labeling site of `1 MET`. It looked + wrong next to a "pick the largest chain" comment, but it is a legitimate site + with a CB, and every alternative available client-side (middle of the chain, + first non-terminal residue) is arbitrary. A real improvement would rank sites + by solvent exposure, which is a simulation-side feature, not a default. + + +* **Examples finished, and tested by running them.** `02_fret_pair.py` (donor + and acceptor, efficiency, E(t), and a check that a smaller R0 transfers less) + and `03_labeling_scan.py` (four candidate sites ranked by yield, lifetime, + contact and dominant quencher) join `01_donor_quenching.py`. The scan output + is the argument for the whole tool in four lines: + + ``` + site QY tau [ns] contact quenched by + E:15 0.997 4.19 0.2% TYR 100% + E:55 0.988 4.17 0.6% PRO 60% + E:100 0.731 4.02 27.2% TRP 96% + E:132 0.967 4.14 2.5% TYR 79% + ``` + + Writing 02 caught a real trap: E(t) computed from the first histogram bins + came out as **-11**, because the leading bins carry the excitation spike where + the ratio of two decays means nothing. The window now starts at 1 ns, and the + reason is in the code. + + `tests/test_examples.py` runs each script as its docstring says to and + requires it to print something and to document how it is run — carrying the + `notebooks` marker, so it is deselected by default and runs under + `pixi run test-notebooks` with the notebooks. 7 tests. + + +* **Recorded the release state** ([release-state.md](/references/release-state.md)): + QuEst is unreleased, so breaking changes are free — rename, delete, reshape + formats, no deprecation periods, no compatibility branches. The page is + explicit about the three things this does *not* license: silent changes to the + science, breaking ChiSurf without saying so, and skipping OKF. `CLAUDE.md` + points at it. + +* **Web backend tidied against the domain it now delegates to.** `main.py` went + from 500 to 373 lines: `POST /api/dyes` had its own read-merge-write of the + dye library *and* its own defaults, both of which `quest.settings.save_dye` + already does — it now delegates and maps `ValueError`/`OSError` onto 400/500. + With that gone, `DEFAULT_DYE_STICKINESS`, `_with_dye_stickiness_defaults`, + `_with_dye_library_defaults` and `DYE_REPOSITORY_PATH` were dead and were + deleted, as were the direct imports of `quest.core.dye_diffusion` internals + (`DEFAULT_QUENCHER_ATOMS`, `REFERENCE_PET_QUENCHING`, + `STANDARD_AMINO_ACID_RESIDUES`) that `quest.settings.quenching_defaults()` + replaced, and the unused `PARAMETER_CATALOG_PATH`. The backend no longer + reaches past the facade for anything but `REPO_ROOT`, which it needs for the + job directories. + + 16 backend tests and 22 browser tests pass against the restarted server. + + +* **Web UI: verified working, and one leak fixed.** The browser suite passes + (22), and a screenshot confirms the real thing — upload, viewer, labeling + controls, FRET panel. Looking at it showed a defect no assertion covered: the + structure was displayed as + `3b7f5e05-43eb-49fb-8e0d-214d60de8bf7_148l.pdb` in **three** places — the + topbar status, the STRUCTURE card and the viewer footer. Uploads are stored as + `_` so two users cannot collide, and that bookkeeping was reaching + the user. + + `POST /api/structure/metadata` now reports the uploaded name. All three + display sites read `metadata.filename`, so one backend change fixed all of + them, and a backend test pins it. + + +* **Fixed the browser-suite failure, and it was not the browser.** After the + day's changes the 22 Playwright tests passed alone but failed at the end of a + combined run with a bare `Page crashed`. Bisected: the pair + `test_pdb_id_support.py` + `test_webui_e2e.py` reproduces it in 13 s, and + `CHISURF_ROOT=/nonexistent` makes the same pair pass — so the first suspect was + the ChiSurf import that `conftest.py` had started doing, which drags in + tttrlib, mdtraj, pandas and pyarrow. + + That was half of it. ChiSurf is now imported **only where a Qt binding exists**, + which is the only place it is used (the AutoForm tests) and the only place the + SWIG import-order fix matters — the web environment gains nothing from it and + pays a large footprint. But the full suite still crashed Chromium, because the + cause is cumulative: IMP, numba, FastAPI and four executed notebooks in one + interpreter leave too little for a renderer. + + So the separation the pixi tasks already implied is now **enforced**: the + browser tests carry a `browser` marker, `pyproject.toml` sets + `addopts = "-m 'not browser'"`, and `pixi run test-e2e` asks for them + explicitly. A combined run now reports **201 passed, 22 deselected** rather + than 22 red — and "deselected" is honest in a way that skipping would not be, + because it names a suite that still has to be run. + + Verified: base combined **201 passed, 22 deselected**; browser in its own + process **22 passed**; `arm64` **220 passed**. + + +* **The notebooks work again — and now they are tested by being run.** Every + notebook in the folder imported `mfm`, a package that has not existed for + years, and the test suite was green anyway because it only asserted that each + file *had cells*. Documentation that claims to work, and does not, is worse + than none. + + Rewritten on the current API, from the science the old ones contained: + + - `01_quenching.ipynb` — the donor decay, quantum yield, contact fraction and + the per-residue attribution, contrasting a site next to a tryptophan with + one that barely quenches. + - `02_fret.ipynb` — donor and FRET decays, the efficiency, **E(t) = f_DA/f_D0**, + and a check that shrinking R0 reduces transfer. + - `03_et_distance_distribution.ipynb` — the E(t)-paper analysis: deconvolve + E(t) into p(R_DA) with a transfer matrix and non-negative least squares plus + a smoothness penalty (the old `mfm.fluorescence.calc_transfer_matrix` and + `solve_nnls` are a few lines of NumPy/SciPy). It then **cross-checks the + recovered distance against ⟨R_DA⟩_E computed from the accessible volumes** — + two independent routes to the same number, which is the point of the + exercise. + - `04_diffusion_modulated_fret.ipynb` — the Haas-Steinberg PDE notebook, + renumbered into the series with text explaining what it adds: it takes p(R) + as given and integrates directly, where QuEst answers the same question by + Monte Carlo. + + Eight stale files removed: the three `mfm` ones, two empty, one with invalid + JSON, and two duplicates (`... (1).ipynb`, `... (2).ipynb`). + + Shared setup lives in `notebooks/quest_notebook.py` — checkout discovery, the + example structure, and `quick_project` / `fret_project` builders — so the four + notebooks do not each repeat it. + + `tests/test_notebooks.py` now **executes** each notebook through nbclient and + additionally requires it to carry prose and a title. Nine tests, 23 s. + + +* **Packaging and CI migrated to pixi + rattler-build.** `pixi.toml` grew four + Python environments beside the existing Node one — `default` (library, CLI, + web backend), `desktop` (adds Qt), `frontend`, and a `build` environment + holding nothing but rattler-build, so CI does not solve the science stack + merely to package it. Tasks: `test`, `test-web`, `test-gui`, `test-e2e`, + `serve`, `gui`, `build-pkg`. Verified with `pixi task list`; all twenty + resolve. + + `rattler-recipe/recipe.yaml` replaces `conda-recipe/meta.yaml`. The old recipe + had gone stale in a way that mattered: its entry point was + `quest=quest.quest_gui:start_gui`, a module that no longer exists and which + was in any case the *GUI* bound to the plain `quest` command. The new one + declares `quest = quest.cli:cli` and `cs.quest = quest.gui:start_gui`, adds + IMP (now the structure reader, not only the AV backend), requires numpy >= 2, + and tests the built package by importing `quest.api`/`core`/`backend` and + actually running `quest --help` and `quest template`. + + **The old CI had stopped running at all**: every trigger was filtered on + `paths: modules/quest/**`, the path QuEst has when vendored inside ChiSurf, + which matches nothing in this repository. `.github/workflows/ci.yml` replaces + it with four jobs — library+backend across three OSes, the Qt GUI offscreen + (with the X libraries a headless Qt still needs), the frontend typecheck and + build, and the rattler package as an artifact. It also exports + `NUMBA_THREADING_LAYER=omp`, the setting that stops the interpreter aborting + when ChiSurf's tttrlib OpenMP runtime meets numba's. + + Neither the recipe nor the workflow can be executed here — no rattler-build in + either environment, and no GitHub runner — so both are **unverified beyond + parsing**: the manifest through `pixi task list`, the workflow through a YAML + load. First CI run should be treated as the real test. + + +* **The RCSB fetch is now shared, in ChiSurf core.** Moved out of the + `fps_json_editor` plugin into **`chisurf/core/fio/structure/fetch.py`** — + library code, wanted by more than one plugin. The move also merged the two + behaviours: ChiSurf's version only tried `.pdb`, QuEst's fell through to + `.cif` for entries too large to have a PDB file, and the shared one does the + latter. The plugin re-exports from core and keeps its own cache directory, so + its 45 tests still pass. + + QuEst's `structure_fetch.download_pdb_id` delegates to it whenever a ChiSurf + checkout is reachable, keeping its own implementation as the standalone + fallback. The two tests that cover that fallback now pin themselves to it + explicitly, rather than silently testing whichever path happened to be live. + + This follows the user's ruling that **plugins may depend on ChiSurf core and + on core plugins** — which is what made the sharing legitimate rather than a + coupling hack. + +* **Correction to yesterday's claim: MRC writing is *not* duplicated.** + ChiSurf's `save_av_mrc` voxelises a **point cloud** through `IMP.em`; QuEst's + `write_mrc` writes an already-computed **density grid** (the AV, the ACV, the + diffusion-coefficient and quenching-rate grids). Same file format, different + inputs — not a drop-in, and not a duplicate. `DUP-07` is narrowed to fps.json + payload handling, which does still overlap. + +* Suites after the day's relocation: **216 passed, 1 skipped** in `arm64`, + **222 passed** in base, **22 passed** for the browser suite. Note again that + uvicorn does not reload — the browser suite reported 22 failures until the + backend was restarted on the relocated package. + + +* **`quest/lib` is gone; the domain is `quest/core/`.** Ten modules relocated + and renamed for what they are — `simulation`, `dye_diffusion`, `photon`, `av`, + `structure`, `pdb`, `elements`, `imp_av`, `fps_json`, `io` — with + `quest/core/__init__.py` keeping the service-layer surface (`simulate_project` + and friends) so `from quest.core import …` still reads the same. The tree now + says what the architecture is: `core/` the domain, `backend/` the RPC, + `gui/` the form, `cli.py`, `api.py`, `manifest.json` — the layout ChiSurf's + own plugins use (`burst_selection` is the fullest example: `api/ backend/ + cli/ gui/ server/ manifest.json`). + +* **The PDB parser is IMP's now (`DUP-06` closed for reading).** + `quest/core/pdb.py` went from ~400 hand-written lines of PDB/PQR/mmCIF + parsing to a reader over `IMP.atom.read_pdb` / `read_mmcif`. IMP is present in + **both** environments (2.24 in `arm64`, 2.17 in base), so this needed no new + dependency. + + Two details decided the swap rather than assumed it. **Selection:** none of + IMP's stock selectors matches what QuEst read — `AllPDBSelector` gives 1525 + atoms on 148L, `NonWater*` 1363, while QuEst's parser accepted **ATOM records + only**, 1322. A five-line `PDBSelector` subclass reproduces exactly 1322, and + it has to answer both APIs: IMP 2.17 hands `get_is_selected` a raw line, 2.24 + a `PDBRecord`. **Radii:** IMP assigns CHARMM-style values (N 1.85 Å) where + QuEst uses Bondi-style (N 1.65 Å), and the radius is what the accessible + volume tests against — so the parsing is IMP's and the chemistry stays + QuEst's. Verified field by field against the old parser on 148L: chain, + res_id, res_name, atom_name, element, radius and mass **identical**, + coordinates within 4e-06 Å. + + Two problems surfaced and were fixed: IMP builds decorators through SWIG, + which is **not thread-safe** (a scan's worker pool hit *"Wrong number or type + of arguments for overloaded function 'new_Atom'"*), and parsing became the + dominant cost because a scan re-reads the structure per site. One lock plus a + small parse cache fixed both — and made the suite **faster than before the + swap**: base 70 s → 20 s. + +* **ChiSurf now runs in QuEst's test process, and the abort is understood.** + Importing ChiSurf is harmless; *building its Qt forms and then running QuEst's + numba-parallel kernels* aborted the interpreter. The cause is the threading + layer: ChiSurf brings tttrlib with its own OpenMP runtime, and numba's + **`workqueue`** layer in the same process aborts, while **`omp`** and `tbb` + are stable. `tests/conftest.py` now sets `NUMBA_THREADING_LAYER=omp`, exports + `CHISURF_ROOT` and `IMP_TRICKS_SRC`, and imports ChiSurf **before** anything + touches IMP. The AutoForm tests are back in-process: 216 passed in `arm64`. + +* **More duplication found, this time against ChiSurf (`DUP-07`).** Its + `fps_json_editor` plugin carries `payload.py` (fps.json normalise/validate), + `pdb.py` (RCSB download and cache) and `mrc.py` (`save_av_mrc`) — the same + three things as `quest/core/fps_json.py`, `quest/structure_fetch.py` and + `write_mrc`. It cannot be consumed where it is: a plugin is not a library, and + QuEst's domain importing another plugin would couple them through the host's + plugin tree and pull tttrlib/mdtraj/pandas into a headless run. They belong in + `chisurf.core.*`; then QuEst deletes its copies. + +* Suites: **216 passed, 1 skipped** in `arm64` (library + Qt GUI + IMP + + AutoForm in-process) and **222 passed** in base; the browser suite passes + **22** when the servers are up and it is not racing a backend restart. + + +* **More of `quest/lib` removed by relying on the host (7673 → 4460 lines).** + With the presentation arrow reversed, three things stopped being QuEst's job: + + - **`lib/math`** — 38 lines of FFT autocorrelation. ChiSurf has + `core.math.signal.autocorr`, but importing a host application to correlate + an array is absurd, so the twelve lines that matter are now inlined in + `quest/core.py` beside their only caller and the module is gone. Removing a + module, not adding a dependency. + - **`gui/plots/MolView.py`** (415 lines of embedded PyMOL) — ChiSurf's chimol + renders the same thing. Deleted; the viewer now comes from the host, and + `_NoMolView` says so plainly when there is no host instead of letting the + calls fail one at a time. + - **`gui/plots/lineplot.py`, `plotbase.py`, `genealogy.py`** and their `.ui` + files — zero references. Deleted. + + **Deleting QuEst's viewer exposed two dormant bugs in the chimol adapter**, + which had never run because the PyMOL fallback always won: + `_ChimolAdapter.cmd` was a property returning `self.cmd` (instant + `RecursionError`), shadowing the correct one defined earlier in the same + class; and `_ChimolCmdShim` had no `orient()`, which the form calls on every + 3D update. Both fixed — the chimol path now works for the first time. + +* **The suite runs in three configurations, all green**: `arm64` standalone + (204 passed, no host — null viewer), `arm64` with the ChiSurf checkout on the + path (204 passed — chimol viewer *and* AutoForm), and base with the web layer + (222 passed). + +* **ChiSurf must not be imported into QuEst's test process.** The first version + of `tests/test_chisurf_autoform.py` imported it at collection, which pulls + tttrlib, mdtraj, pandas and pyarrow into the interpreter; the run then + **aborted** (`Fatal Python error: Aborted`) once the numba-parallel simulation + kernels ran alongside IMP and Qt. Plain import order is not the problem — + `IMP` then `chisurf` and the reverse both import cleanly — so the renderer now + runs in a **subprocess** and reports back as JSON. That is also the more + honest test: it checks that a host can render QuEst, not that the two + libraries can share an interpreter. + +* **Still redundant, and blocked on one decision: `lib/io/PDB.py` + + `lib/common.py` (~670 lines).** Both ChiSurf + (`core.fio.structure.coordinates`) and IMP (`IMP.atom.read_pdb`) can read a + structure, so QuEst's parser is a third copy. Neither is a free swap: + ChiSurf is absent from `arm64` unless `CHISURF_ROOT` is set and drags + tttrlib/mdtraj/pandas into every headless simulation for the sake of a PDB + parse; IMP is absent from the base environment, which is where the web layer + runs. **Recommendation: IMP.atom**, since QuEst already depends on IMP for + accessible volumes and it costs nothing extra in the environment that does the + science — but it means the web/base environment needs IMP, which is a real + installation decision rather than a refactor. + + +* **The dependency arrow is reversed for presentation, and the UI dedup is + proven.** QuEst may now import ChiSurf — optionally — so the host's + **AutoForm** renders QuEst's forms instead of QuEst carrying `.ui` files and + hand-built Qt widgets. The fluorescence arrow is unchanged: QuEst → imp-tricks, + never the reverse. + + The lever is that `AutoForm.from_rpc_method()` consumes an `rpc_methods` entry + **from `quest/manifest.json`** — the very declaration a host reads to learn + what QuEst offers. QuEst already ships all eleven methods with full JSON-Schema + parameters, so the same artefact serves as the UI description: one declaration, + not two. Verified in `arm64` with the ChiSurf checkout on the path — every one + of the eleven renders; `quest.simulate` comes out as project / pdb_path / + nbins / tac_range / project_dir plus a `save_outputs` checkbox, with **no + QuEst-side UI code**. Screenshotted and read back through + `form.model.params()`. + + `quest/chisurf_host.py` reaches the checkout the same way `quest.imp_tricks` + does (source tree, `CHISURF_ROOT`, never fatal), and deliberately **never + overrides a ChiSurf already imported** — a host that loaded QuEst as a plugin + is already running its own copy. Nothing outside `quest.gui` imports it, so + QuEst still runs standalone; the in-tree form remains the fallback. + + Environment note worth keeping: no environment has both out of the box. `arm64` + has Qt and IMP but no ChiSurf; the `chisurf` env's installed ChiSurf predates + AutoForm; base has ChiSurf but no Qt. `PYTHONPATH=~/dev/chisurf` (or + `CHISURF_ROOT`) closes it in `arm64`, which is now the documented way to run + the AutoForm tests. `tests/test_chisurf_autoform.py` skips cleanly without it. + + Staged from here, not big-bang: the manifest covers parameter entry; the + structure picker, quencher table, plots and 3D view still need a + `quest.view.json` scheme before the `.ui` files and the hand-built form can be + deleted (LAY-06, now in progress). + + +* **`quest/lib` slimmed from 7673 to 4511 lines, and the legacy `lib.*` import + spelling is gone (LAY-08).** The library was a self-contained toolkit + shadowing both imp-tricks and ChiSurf; a minimal one is legitimate for a + standalone app, but this was neither minimal nor compatible with either. + + **The Qt parts left**: `lib/plots/`, `lib/widgets.py`, `lib/ui/` and + `lib/genealogy.py` (~2400 lines) moved to `quest/gui/`, where their only + callers already were. The orphaned `avWidget.ui` went with the dead + `AvWidget`. + + **668 unreachable lines were deleted**, found by a reachability analysis from + the real entry points rather than by eye: `AvPotential` (an AV restraint — + `IMP.bff.restraints` territory), the unused `Pdb` wrapper, three curve + utilities in `datatools`, nine structure-analysis functions (`Universe`, + RMSD, superposition, clustering, internal coordinates — IMP/ChiSurf work), + and the two legacy boolean-collision photon kernels superseded by + `simulate_photon_trace_rate`. + + **The `lib.*` spelling is retired.** Every internal import is now + `quest.lib.…` and `quest/__init__.py` no longer injects the package directory + onto `sys.path`. This was not cosmetic: with both spellings live, + `lib.structure.Structure` and `quest.lib.structure.Structure` were **two + different classes**, so an `isinstance` check across the boundary failed and a + `Structure` was wrapped twice — a real `TypeError` that surfaced the moment + the GUI moved to `quest.gui`. + + The full module-by-module verdict — keep, move, or blocked on imp-tricks — is + in [imp-tricks-dedup](/specs/imp-tricks-dedup.md). + +* Suites after the slimming: **202 passed, 1 skipped** in `arm64` (library + + Qt GUI + IMP) and **222 passed, 3 skipped** in base (library + web backend + + browser). + + +* **LAY-02 closed, then made structural: the GUI and the domain are separate + files, and importing QuEst no longer imports Qt.** Two steps. + + First the class split. `TransientDecayGenerator` stopped inheriting + `DonorDecay`; it now **builds** one per run from the form + (`build_model()`, driven by an explicit `MODEL_ARGUMENT_SOURCES` table mapping + the model's 28 constructor arguments to the 17 Qt-backed properties and 11 + plain attributes that supply them) and reads results back through delegating + properties. Rebuilding per run is deliberate: the controls are the authority, + so a stale model can never be what gets simulated. + + Then the file split, which the class split made possible: 1600 lines of widget + moved to **`quest/gui/dye_widget.py`**, `quest_gui.py` became + `quest/gui/app.py`, the `.ui` and settings resources moved with them, and + `quest/lib/tools/` stopped re-exporting the widget — which was what dragged Qt + into every import of the library. The dead `AvWidget` in `quest/lib/fps` went + too; it was unused and the only reason that module imported a GUI toolkit. + + The last Qt in the domain was a **`QProgressDialog` driven from inside + `DonorDecay.update_all`** — the simulation rendering its own UI. It now takes + a `progress(fraction, message)` callback; the widget passes one that drives + the dialog. A subprocess guardrail asserts that importing `quest.api`, + `quest.backend`, `quest.core` and `quest.lib.tools` loads **no** Qt binding, + so "the service layer is GUI-free" is now checked rather than intended. + + Verified before and after by 11 characterisation tests written first + (`tests/test_gui_simulation.py`), plus a rendered screenshot of a real run: + decay drawn, QY 0.91, 16.2 % contact. + +* **Two GUI defects the characterisation tests exposed.** + `PDBSelector.chain_id`, `.residue_id` and `.atom_name` had setters that were + literally `pass` — so nothing could select a labeling site programmatically, + and **loading a saved project silently ignored its donor and acceptor sites**. + They now select by index (which is also what repopulates the dependent + combos); picking a value the structure does not contain is refused rather than + accepted as free text. Separately, `quantum_yield` raised `ZeroDivisionError` + when the photon count was zero — reachable from the GUI, since its spin box + counts photons in *millions* and rounds 4 000 to 0.00. + +* **Examples started.** `examples/01_donor_quenching.py` runs in ~3 s and shows + the whole story at one site: decay, quantum yield, mean lifetime, contact + fraction, and which residue types did the quenching. It labels T4 lysozyme + residue 100, next to a tryptophan, where the answer is unambiguous — + QY 0.73, 27 % contact, **96 % of the quenching from TRP**. `examples/_common.py` + puts the repo root first on `sys.path`, because this machine has `quest` + installed editable from *another checkout* (`chisurf/modules/quest`) and an + example run from `examples/` would otherwise silently exercise that one. + + +* **LAY-09 closed, and with it LAY-03: the RPC surface is complete at eleven + methods.** Two capabilities existed only inside the web backend and were + therefore reachable only from a browser. Both are now domain modules: + + - `quest/structure_info.py::structure_metadata` — the ~150-line PDB/mmCIF + chain–residue–atom extraction that populates labeling-site pickers, moved + verbatim (extracted programmatically rather than retyped) and given a real + error for a missing file; + - `quest/jobs.py` — listing, summarising, reading and archiving the + `jobs//` directories, including the paging clamp and the rule that a + run *is* a UUID directory (anything else in `jobs/` is ignored rather than + half-parsed). + + `quest.structure.metadata`, `quest.jobs.list` and `quest.jobs.get` are + registered and declared in the manifest, so **the eleven methods in the + registry, in `METHODS`, and in `manifest.json` now agree** — which the + manifest tests enforce. The FastAPI routes became adapters; the ZIP download + route lost its hand-rolled archiver to `jobs.archive_job`, which also fixed a + latent oddity — the archive no longer risks containing a previous copy of + itself. + + 14 new domain tests replace what could previously only be exercised through + HTTP. One backend test pointed at `backend_main.MAX_JOB_LIST_LIMIT`, which now + lives in `quest.jobs`; updated rather than deleted. + +* **imp-tricks now works from source in both environments, with no install.** + ChiSurf's mechanism turned out to be two things: imp-tricks ships a + `sitecustomize.py` that extends `IMP.__path__` when `src` is on `PYTHONPATH`, + and its release installer does `pip install --no-deps`. The first + is enough for subpackages IMP does not ship (`IMP.cgmol`, `IMP.finite`, …) but + **not** for `IMP.bff`: a compiled regular package beats a namespace directory + of the same name whatever the path order, so `import IMP.bff.av` still fails. + A real install *was* tried in `arm64`, confirmed working, and then **reverted** + on the user's instruction — imp-tricks is changing, so the source tree is what + has to work. + + `quest.lib.imp_av` therefore calls `enable_imp_tricks()` **on import**, which + extends both `IMP.__path__` and the compiled `IMP.bff.__path__`. Importing + QuEst is now enough to reach `IMP.bff.av`, `IMP.bff.distance_metrics` and + `IMP.cgmol.*` from the live checkout — verified in `arm64` (compiled + `IMP.bff.AV` still present alongside) and in base (no compiled bff at all). + +* **But imp-tricks' own AV cannot be used yet, and now we know exactly why.** + Calling `IMP.bff.av.compute_av` on 148L in `arm64` fails on **both** backends, + each from version skew inside imp-tricks: + + - `labellib` — its guard requires `LabelLib.AV`; the installed LabelLib + exposes only `dyeDensityAV1` (which is what QuEst's own working path calls), + so the backend declares itself unavailable; + - `imp_bff` — `'Particle' object has no attribute 'get_particle_index'`; + IMP 2.24 spells it `get_index()`. + + So `DUP-01` — delete QuEst's duplicate and delegate to `compute_av` — is + **blocked on imp-tricks**, not on QuEst, and the fix belongs in that + repository. Recorded with the evidence in + [imp-tricks-dedup](/specs/imp-tricks-dedup.md) and + [known-issues](/references/known-issues.md). The symmetry is worth stating: + *both* codebases carry an IMP AV integration written against an API that has + moved, and in both cases it went unnoticed because the environment that would + exercise it was not the one being tested. + + Two new tests pin the distinction that caused the original mess — + `HAS_IMP_BFF` (compiled decorator) is **not** the same question as "is + imp-tricks' `compute_av` importable", and `imp_tricks_av_available()` now + answers the second one explicitly. + +* **Ran the suite in the canonical `arm64` environment for the first time: 34 + failures.** The user identified `/Users/tpeulen/mambaforge/envs/arm64/bin/python` + as the environment to use — Python 3.12, numpy 2.4.6, PyQt5, LabelLib **and a + compiled `IMP.bff`** (IMP 2.24). That last one matters: `HAS_IMP_BFF` is true + there, so QuEst selected its IMP accessible-volume backend, a path that had + never executed anywhere. It does not work. Three faults: + + 1. `path_map.get_path_map_header()` raises `AttributeError` — IMP 2.24 binds + it to a C symbol absent from the compiled `_IMP_bff`. **Fixed** by using the + writable accessor, which is bound to a different symbol. + 2. `get_xyz_density()` returns a NumPy array that the code truth-tested. + **Fixed.** + 3. With those out of the way the backend returns an **empty** volume: every + tile's `PM_TILE_PATH_LENGTH` is the 50000 "unreachable" sentinel. Stopped + there rather than reverse-engineering IMP's current contract. + + So **backend selection is now explicit**: `resolve_av_backend()` defaults to + **LabelLib** — what QuEst has always actually run and what its tests pin — with + IMP.bff opt-in through `QUEST_AV_BACKEND=imp_bff`. An unavailable or + misspelled backend raises immediately, naming the usable ones, instead of + producing an empty volume later; `AV.av_backend` records the choice. This is + the strongest argument yet for + [imp-tricks-dedup](/specs/imp-tricks-dedup.md): the duplicated integration was + broken and invisible, because the environment that would have exercised it was + never the one being tested. 34 failures → 1. + +* **The last failure was a genuinely flaky test, and pre-existing.** + `test_an_unseeded_project_still_varies` compared `quantum_yield_donor` across + four unseeded runs — but at a site where the dye rarely reaches a quencher the + yield saturates at exactly 1.0, so four independent runs legitimately report + the same scalar. Confirmed by isolating it: the flake occurs with *and* + without today's changes. It now compares the **decay curves**, which differ + every run because the photon arrival times do — a sharper statement of "the + Monte-Carlo run did not repeat". Stable over three consecutive runs in both + environments. + + While chasing it, a real defect surfaced in `arm64`: unseeded runs there were + **byte-identical** every time, because numba initialises each worker thread's + RNG state deterministically per process — four "independent" runs returning + the same answer reads as precision that is not there. + `_seed_worker_threads()` now seeds one prange iteration per thread from + `os.urandom` before each unseeded trace, which keeps the fast parallel kernel + *and* restores independence. Seeded runs are untouched and still reproduce. + +* **imp-tricks can be spliced into the live interpreter** — + `quest/imp_tricks.py::enable_imp_tricks()`, at the user's request. The obvious + approach does not work: imp-tricks ships `IMP//` as *namespace* + directories, and in `arm64` the compiled `IMP` and `IMP.bff` are **regular** + packages that shadow them completely, so `PYTHONPATH` alone leaves + `import IMP.bff.av` failing. The helper appends to the already-imported + package's `__path__` instead, so the checkout's `IMP.bff.av` and + `IMP.bff.distance_metrics` resolve *alongside* the compiled `IMP.bff.AV` + rather than replacing it. Verified in both environments (compiled `AV` still + present in `arm64` afterwards), idempotent, and returns `[]` instead of + raising when there is no checkout. Six tests. + +* **Environment and testing concepts rewritten around the two-interpreter + reality.** `arm64` is canonical and the only place Qt *and* IMP.bff exist, but + it has **no fastapi/uvicorn/playwright**, so the web suites still run in the + mambaforge base interpreter. Both must be green, and the commands for each are + in [workflows/testing.md](/workflows/testing.md). Running only the base + environment hides real breakage — that is precisely how the IMP backend stayed + broken. `CLAUDE.md` now says to use `arm64`, and — at the user's instruction — + that **OKF is updated in the same change as the code, always**, including + correcting entries that turn out to be wrong. + +* Suites: **186 passed, 1 skipped** in `arm64` (library + Qt GUI, IMP present) + and **221 passed, 2 skipped** in base (library + web backend + browser, servers + up and restarted after the route changes). + +* **FRET now follows the diffusion (OBJ-01 items 1–4).** `calc_fret_rate` + reduced both accessible volumes to **one scalar** rate and added it to every + frame, so the FRET channel was completely independent of the trajectory QuEst + exists to simulate — the donor could be anywhere and transfer would not + change. It is replaced by `calc_fret_rate_trace`, a per-frame rate + + k_FRET(t) = (1/tau0) · ⟨ (R0 / |r_D(t) − r_A|)^6 ⟩_A + + computed by a new numba kernel `fps.fret_rate_trace` (parallel over frames, + acceptor cloud subsampled by an even stride to bound the `n_frames × + n_acceptor` cost). The donor is resolved in time; the acceptor is averaged + over its volume, which is the fast-acceptor limit and is now stated as such + rather than implied. `calc_photons_fret` adds `k_quench + k_fret` frame by + frame — parallel de-excitation channels — and feeds the existing photon + kernel. + + On T4L E55 → E132 the efficiency moves **0.377 → 0.662** at the same R0: the + rate average over ⟨(R0/r)^6⟩ is not the efficiency implied by ⟨R_DA⟩_E, and + only the former uses the simulated dynamics. + + Two more OBJ-01 items closed with it. **One efficiency definition**: the + analytic `_fret_efficiency` (from ⟨R_DA⟩_E, ignoring quenching entirely) took + precedence over the photon-based one whenever it had been computed, and the + two disagreed; it is deleted, `fret_efficiency` is now always + `1 − QY_DA/QY_D`, and `rda_mean_e()` survives purely as a diagnostic distance + nothing consumes. **No more silent degradation**: a missing acceptor raised + nothing and produced a donor-only result inside a bare `except Exception`; it + now raises with an error naming what to set. + + Also handled: both clouds hold dye *centres* and can overlap in space, where + `(R0/r)^6` diverges. The distance is floored at the sum of the two dye radii, + since the spheres cannot interpenetrate. + + `tests/test_fret_physics.py` (14 cases) pins the kernel against the Förster + relation — rate at r = R0 is exactly 1/tau0, twice the distance is 64× slower, + the *rate* is averaged over the acceptor cloud rather than the distance, + coincident clouds stay finite — and pins the regression itself: the rate + **varies along the trajectory** by more than 1.5×, which the old scalar could + never do. + +* **LAY-05 closed: QuEst declares itself.** `quest/manifest.json` gives the + identity, entry points (`gui`, `cli`, `services`) and all eight RPC methods + with params/result schemas and `long_running` flags — what a host reads to + learn what QuEst offers **without importing it**. Five tests keep it honest: + the declared method set must equal the registry exactly, summaries must match, + every method must document its shapes, the long-running pair must be flagged, + and the entry points must resolve. Version is checked against + `pyproject.toml`. (Note: the ChiSurf-side `quenching_estimator` plugin folder + still has no manifest of its own — that is a change in the other repository + and was deliberately not made from here.) + +* **Wrote the imp-tricks dependency direction to OKF, at the user's + instruction**: [specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md). + **General fluorescence machinery belongs in imp-tricks under `IMP.bff`**; + QuEst is the application on top — project schema, PET workflow, surfaces, + scanning, artefacts. The arrow points one way: nothing in imp-tricks may + depend on QuEst. + + Surveying `~/dev/imp-tricks/src/IMP/bff/` showed the overlap is already large: + `av.compute_av` performs **the same IMP.bff → LabelLib → raise dispatch QuEst + reimplements** (plus a `backend=` override QuEst lacks); `av.BasicAV`/`ACV` + model AV and contact volumes; `av._kernels` has `density2points`, + `average_distance`, `mean_fret_distance`, `split_av_acv`; + `distance_metrics.av_pair_statistics` returns ⟨R_DA⟩, R_mp, R_E and ⟨E⟩ in one + weighted pass where QuEst has three separately-resampling functions; and + `cgdye.analysis.fret` already handles **κ²** and exact efficiencies from rate + matrices. Six rows opened as `DUP-01`…`DUP-06`. The `fret_rate_trace` written + today is itself general code in the wrong repository (`DUP-03`) — its natural + home is beside `cgdye.analysis.fret`, which would bring κ² with it, the thing + OBJ-01 item 6 still wants. + + **Corrected a known-issue while checking this.** The recorded reason the + preferred AV backend never runs — "`IMP.bff` is missing" — was only half of + it. `IMP.bff` is a *namespace package provided by imp-tricks*: with + `PYTHONPATH=~/dev/imp-tricks/src` it imports and exposes `av.compute_av` and + `distance_metrics`. QuEst still would not use it, because + `HAS_IMP_BFF = hasattr(IMP.bff, "AV")` gates on a **compiled top-level + attribute the package does not have**. So there are two compounding faults: + imp-tricks is not installed, and the capability check asks the wrong question. + +* Suites: **199 passed, 2 skipped** (library + backend + browser, servers up, + backend restarted after the FRET change so the browser really exercised it) + and **8 passed** for the Qt GUI. + +## 2026-07-26 + +* **The Qt GUI was simulating different physics from every other surface.** + Rendering the widget headlessly for the first time (the default interpreter + has no Qt; the `arm64` and `chisurf` conda environments do, and both import + quest straight from this tree) and **reading the screenshot** showed a + quencher table listing *MET with atom CB* — which the domain model puts on SD. + `dye_diffusion.json` turned out to carry a legacy chemistry block: PRO, MET, + TRP, TYR all on **CB**, a single global `kQ = 2.0`, `critical_distance = 6.5`, + and no HIS or CYS at all. The CLI, API and web UI meanwhile run the + residue-resolved model (TRP 3.5 on the indole ring, TYR 2.0 on the phenol, + MET 1.67 on SD, HIS 1.0, CYS 0.8, PRO 2.0). **The same project gave different + answers depending on which surface you opened it in.** + + The settings file now describes the *session* only — paths, times, photon + counts. `default_quencher_table()` derives the chemistry from the same + `REFERENCE_PET_QUENCHING` and `DEFAULT_QUENCHER_ATOMS` everything else uses, + and the widget fills `quencher` from it unless a user's own settings file says + otherwise; `critical_distance` moved 6.5 → 8.5 to match the project template. + Verified in the re-rendered GUI: TRP with the indole atoms at 3.5, quench + radius 8.50. The residual divergence — the legacy `quencher` shape has no + per-residue radius or stickiness, and the widget still runs + `stickiness_mode="global"` — is now **LAY-10**. + +* **FRET is reachable from the browser for the first time.** The web UI had *no + FRET controls at all*: it could plot a FRET curve, but nothing could switch + FRET on, choose an acceptor site, or set R0 (`projectHelpers.ts` shipped + `R0_matrix: []`). The Qt GUI had acceptor geometry but no R0 either. Both now + have it — an `R0 [Å]` spin box in the Qt FRET group, and a FRET acceptor panel + in the web UI with an enable toggle, chain/residue/atom selectors, R0 and the + acceptor diffusion coefficient. + + **A full FRET run now works end to end in the browser**: T4L donor E55, + acceptor auto-seeded, donor QY 0.911 → FRET QY 0.416, **E = 0.553**, with both + decays drawn. I screenshotted the chart and looked at it: the two curves are + clearly separated, the FRET channel decaying much faster, which is what E≈0.55 + should look like. + + Looking at that screenshot also caught a bug the assertions had passed: the + acceptor seeded on **`542 HOH` atom O** — a water molecule — because "last + residue of the chain" is a water in most structures. `lastLabelableResidue` + now walks back to the last residue with a CB (162 LYS in 148L), and an e2e + case pins that a water is never chosen. + +* **Testing is now defined as all three surfaces.** Recorded in + [workflows/testing.md](/workflows/testing.md) and `CLAUDE.md`: library + web + backend, the browser suite with both servers up, and the Qt widget under + `QT_QPA_PLATFORM=offscreen` in the `arm64` environment — plus the rule to + render the GUI and the charts and *read the images*, which is what found both + defects above. New `tests/test_gui_widget.py` (8 cases: quencher atoms and + rates match the reference chemistry, all PET-active residues present, contact + radius 8.5, the R0 control edits the model and round-trips into a project, + its range covers Ångström values, and the widget paints); it skips where Qt is + absent. Two Qt-free guardrails in `test_service_layer.py` pin that the GUI + settings file carries no chemistry and that the derived table matches the + reference. Five new e2e cases cover the FRET panel and a full FRET run. + + Suites: **179 passed, 2 skipped** (library + backend + browser, servers up) + and **8 passed** for the GUI. Also noted: uvicorn does not reload, so a + backend change needs a restart before the browser suite means anything. + +* **R0 is in Ångström, and the template no longer switches FRET off.** The unit + question raised by yesterday's finding is settled by the user: Ångström, like + every other length in a project. `template_project` wrote + `R0_matrix: 5.5` — a nanometre value — into a field consumed as Ångström, so a + template-derived FRET project ran at a transfer rate of order 1e-6 and + reported no transfer, with no error anywhere. It now writes + `DEFAULT_FORSTER_RADIUS = 52.0`, a named constant in `quest/project.py` whose + docstring states the unit and the failure mode. + + Measured end to end on T4L (148L), donor E55 → acceptor E132: **E = 0.377** + (donor QY 0.940, donor-with-acceptor QY 0.585). At the old value the same + geometry gives E < 1e-4 — indistinguishable from having no acceptor. + + The unit is now written down where people and agents actually look: a new + `fret.R0_matrix` entry in `quest/settings/parameter_catalog.json` (regenerated + into `doc/parameters.md`), a units section in + [architecture/project-schema.md](/architecture/project-schema.md), and + comments at the two consuming sites — `calc_fret_rate`, where R0 meets the + Ångström AV clouds, and `RDAMeanE`, which also gained a docstring saying it + returns the *Förster-averaged* distance and is not interchangeable with + `RDAMean` or `dRmp`. + + **The tests were the reason this survived**: `test_use_case_fret` and + `test_simulate_project_with_fret` assert `0 <= E <= 1`, which is true of every + number the model can emit. `tests/test_fret_units.py` (5 cases) now pins the + unit instead of the range — R0 within the 20–80 Å band a real pair occupies, + the matrix symmetric with an empty diagonal, no matrix without an acceptor, + `build_donor_from_project` actually picking the value up, and the Förster + relation giving E = 0.5 at r = R0 while a nanometre value gives < 1e-4 at 40 Å. + + Still open, tracked in [OBJ-01](/specs/objectives.md): the web UI has no R0 + field at all — `projectHelpers.ts` ships `R0_matrix: []`, so a project built in + the browser silently uses the 52 Å code default and a user cannot enter the + Förster radius of their actual dye pair. Suite: 171 passed, 1 skipped. + +* **LAY-01 closed: project logic left the CLI, and a triplicated scan + implementation collapsed into one.** `template_project`, `validate_project` + and `ProjectValidationError` now live in `quest/project.py` and are exported + from `quest.api`. The CLI keeps `_validate_project` as a four-line translator + to `ClickException`, so its behaviour and tests are unchanged; the web backend + no longer imports `quest.cli` at all; and `quest/lib/fps_json.py` — a + *library* module that was importing the CLI — now calls the domain. + + Chasing that import surfaced the real damage: **three copies** of "simulate one + labeling site and report it" (CLI `scan`, the web backend's `simulate_site`, + and `run_fps_scan`), which had **already drifted**. The library copy omitted + `dominant_quencher`, `dominant_quencher_fraction` and `quenchers`, so + `api.run_fps_scan` silently reported less than `quest scan` did; and the CLI + copy wrote fps.json AV overrides into the project without also applying them to + `av_parameter`, so per-site linker geometry was partly ignored. All three now + call `quest/scan.py::simulate_site`, which also fixes both defects. Concurrency + stays with the callers, because how many sites run at once is a transport + concern (the web backend keeps its GIL-aware `SCAN_WORKERS` pool). + +* **LAY-03 in progress: QuEst has an RPC surface.** `quest/backend/` adds a + `ServiceDispatcher`, an `InProcessClient` and `register_services(dispatcher)` + registering **eight methods** — `quest.template`, `quest.validate`, + `quest.simulate`, `quest.scan`, `quest.parameter_catalog`, `quest.dyes.list`, + `quest.dyes.save`, `quest.quenching_defaults` — behind one envelope + (`{"ok": True, "result"}` / `{"ok": False, "error"}`). Registration is + duck-typed on `register(name, handler)`, so ChiSurf's own dispatcher works + without QuEst importing the host. Re-registering a name raises rather than + overwriting: a silent overwrite would make which implementation runs depend on + import order. + + Two shared definitions came out of it. `quest/settings/__init__.py` now loads + the parameter catalog and dye library **package-relative** — the web backend + had been resolving them through a `parents[3]` repo-root guess with a + cwd-relative fallback, which cannot work from an installed wheel or a frozen + bundle. And `result_payload()` is now the single definition of a simulation + result on the wire, used by both `quest.simulate` and `POST /api/simulate`. + `quest.structure.metadata` and `quest.jobs.*` are **not** registered yet: their + implementations are still inside the web backend (now tracked as LAY-09). + +* **Three pre-existing backend test failures fixed.** + `webui/backend/tests/test_backend_api.py::TestTopQuenchers` called + `backend_main._top_quenchers`, which has not existed since `top_quenchers` + moved into `quest.core` — the tests had never been updated and the whole class + was erroring. They now call the real name and pass. + +* **Suites: 166 passed, 1 skipped**, with the web UI running + (`tests/` + `webui/backend/tests/`, `-p no:pytest-qt`). The 16 browser tests + were re-run against a **restarted** backend afterwards — uvicorn does not + reload, so the first green run had exercised the pre-refactor process — and + passed 16/16 against the new code, including the scan workflow that now goes + through the shared `simulate_site` and the simulate route that now returns + `result_payload`. New: `tests/test_service_layer.py` (19 cases) covering the + envelope, the registry, the method behaviours, the scan record shape, and + three layering guardrails (no surface imports another surface's helpers; the + library never imports the CLI; the service layer imports no Qt). + +* **Objectives recorded** in [specs/objectives.md](/specs/objectives.md), at the + user's request and deliberately **not implemented**: + + **OBJ-01 — make FRET first class.** It is degraded, not dead: two tests pass + and the T4L project gives E = 0.96 at R0 = 52 Å. But `calc_fret_rate` computes + **one scalar** `k_fret` from ⟨R_DA⟩_E over the *static* AV clouds and adds it + to every frame, so the donor's diffusion — the entire point of QuEst — does not + modulate FRET at all; the acceptor never moves; `fret_efficiency` has two + definitions that can disagree (analytic 0.9598 vs photon-based 0.9578 in the + same run, and the analytic one ignores quenching); a failure to build the + acceptor degrades **silently** to a donor-only result inside a bare + `except Exception`; and R0 has no parameter-catalog entry, so it is neither + documented nor editable in the UI. + + While measuring that, found a concrete defect now in + [known-issues](/references/known-issues.md): the shipped template writes + `R0_matrix: 5.5`, which `calc_fret_rate` consumes as Ångström — at realistic + D–A distances that is a transfer rate of ~1e-6, i.e. **no FRET**. 5.5 is a + plausible Förster radius in *nanometres*, so it reads as a unit mismatch. The + tests miss it because they only assert `0 <= E <= 1`. + + **OBJ-02 — fit dye parameters to measured decays.** Load an experimental decay + and optimise `kQ`, contact radii, `slow_factor`, `D` and linker geometry until + the simulation describes it — turning the shipped chemistry from "starting + values" into calibrated ones. Two routes: rely on the host's fitting/sampling + stack as a first-class ChiSurf plugin (preferred — it already has optimisers, + error analysis, global analysis and IRF/background handling), or implement an + optimiser in QuEst. The user's observation that **first-class plugin status + serves this objective** is now written into the plugin-integration spec: the + RPC/manifest split is what lets a host drive QuEst as a *model* instead of + launching it as a *window*. The spec also lists what this implies for work done + before it starts — cheap repeatable parameterised runs, controllable noise, + name-addressable parameters, and a decay comparable to a measured curve. + +* **The web UI layer is verified for the first time in this environment: 16/16 + browser tests pass.** Brought the stack up — `uvicorn + webui.backend.app.main:app` on :8000 and `pixi run -e frontend dev` on :3000 + (Next.js 16.2.6, ready in 357 ms; the frontend proxies `/api/*` and `/health` + to the backend via `next.config.ts` rewrites) — and ran + `tests/test_webui_e2e.py`: **16 passed in 26 s**, no console errors, no + horizontal overflow. That covers page rendering, the quenching editor + (PET-active filter, kQ editing, atom editing and restore, clear/reset), the + full upload → simulate → read-results workflow including that quench shares + sum to 100 %, the scan workflow with dominant-quencher reporting and column + filtering, and the run-picker's server-side cap. Combined with the 116 unit + tests, **132 of the repository's tests now pass with nothing failing**. + + One trap worth recording: `--timeout=` is not available — pytest-timeout is not + installed, and passing it makes pytest exit with an argument error that looks + like a test failure. + +* **Adopted the ChiSurf plugin split as QuEst's target architecture, and opened + the gap backlog.** New [specs](/specs/index.md) group: + [plugin-integration.md](/specs/plugin-integration.md) is the north star — + `core/` (Qt-free domain) → `backend/services.py` (named RPC methods with one + `{"ok", "result"|"error"}` shape) → facade → thin `cli/` and `gui/`, with a + `manifest.json` declaring identity, entry points and method shapes, and a + declarative view spec. The reference implementation studied was + `chisurf/plugins/fcs/fcs_calculator/`. + + The method table falls out of what the FastAPI backend already exposes — nine + routes map one-to-one onto `quest.simulate`, `quest.scan`, `quest.validate`, + `quest.template`, `quest.parameter_catalog`, `quest.dyes.*`, + `quest.quenching_defaults`, `quest.structure.metadata`, `quest.jobs.*` — which + is the evidence that this surface is real and merely under-spelled. QuEst is + unusually cheap to convert because its boundary contract is already plain + serializable data ([the project JSON](/architecture/project-schema.md)) and its + parameter catalog is already half a view spec. + + [assessment.md](/specs/assessment.md) itemises **8 open gaps**, verified + against the tree rather than guessed: the web backend importing the *private* + CLI helpers `_validate_project`/`_template_project` at four call sites + (LAY-01); `TransientDecayGenerator` inheriting `DonorDecay`, so the Qt widget + *is* the model (LAY-02); no RPC registry at all (LAY-03); `quest.api` being a + re-export shim that callers reach past anyway (LAY-04); the ChiSurf + `quenching_estimator` plugin shipping **no `manifest.json`** — only + `__init__.py`, `README.md` and `test/`, so it loads through the host's legacy + AST discovery, exactly the case ChiSurf's own plugin spec complains about + (LAY-05); two hand-built forms describing the same parameters (LAY-06); three + different long-running mechanisms, none cancelable from outside (LAY-07); and + the `sys.path` injection that would collide inside a host application + (LAY-08). Migration order is in the spec; nothing was implemented yet. + +* **Created the QuEst OKF bundle — the repository now has a persistent memory + layer.** `okf/` is an Open Knowledge Format bundle modelled on the sibling + ChiSurf repository's: plain-markdown concepts with YAML frontmatter, grouped + as [architecture](/architecture/index.md), [subsystems](/subsystems/index.md), + [workflows](/workflows/index.md) and [references](/references/index.md) under + a root [index](/index.md), plus this append-only log. A root `CLAUDE.md` points + every session at it and states the loop in + [workflows/change-tracking.md](/workflows/change-tracking.md): update the + owning concept, append here, keep `doc/` in step, commit. + + The bundle was **populated from the code**, not from the README: the + three-stage pipeline and its invariants, the project-JSON contract and the + parameter catalog that documents it, the four surfaces over one service layer, + the job-artefact layout, and one concept per subsystem (core service layer, + accessible volume, dye diffusion, quenching model, photons/decay, structure + I/O, CLI, web UI, Qt GUI). + + Things worth having written down that are not obvious from the source: + the AV backend priority is **IMP.bff → LabelLib → RuntimeError** and is not + configurable; quenching centres sit on the redox-active moiety while + stickiness stays on the residue, which is why `calc_slow_av` takes two sets of + centres; quenching rates **add** across overlapping contacts while stickiness + factors **multiply**; the photon seed is deliberately offset from the walk's + (`base + 7919 mod 2³¹−1`) so photons do not replay the trajectory they score; + `update_all` avoids `gc.collect()` because the ~20 ms it cost is paid hundreds + of times by a scan; `save_outputs=False` exists because job artefacts dominate + scan runtime; and `quest/__init__.py` inserts the package directory onto + `sys.path`, which is what makes the legacy `import lib.fps` spellings resolve. + +* **Environment and suite state recorded as a baseline.** Suite: + **116 passed, 17 skipped** in ~20 s, via + `python -m pytest tests/ -q -p no:pytest-qt`. The flag is mandatory here — no + Qt binding is installed and pytest-qt otherwise aborts collection before any + test runs; `-p no:qt` does not match the plugin name. Of the skips, 16 are the + Playwright web-UI tests, which skip unless the backend and frontend are + already running: **a green run does not mean the browser layer was + exercised.** Interpreter: mambaforge CPython 3.10.14 with numpy 1.26.4; + LabelLib, numba, fastapi and playwright present; `IMP.bff` and PyQt5 absent. + +* **Six known issues captured** in + [references/known-issues.md](/references/known-issues.md) rather than left in + a chat log: `IMP.bff` missing so the preferred AV backend silently never runs; + `pyproject.toml` declaring `numpy>=2.0` while the installed IMP extensions are + compiled against numpy 1.x and abort under numpy 2 (the failure is recorded in + `tests/sim_test.log`); the pytest-qt collection abort; 806 stray `jobs/` + run directories and 30 `.coverage.*` files accumulating in the working tree + because `simulate_project` writes to `cwd` and `quest/utils.py` installs a + Python-2-era coverage hook; and README links pointing at the vendored + `modules/quest/notebooks/…` path that only exists inside the ChiSurf tree. + +* **State of the tree at bundle creation.** The working tree carries a large + amount of uncommitted work — 20 modified files (~4.2k insertions, notably + `dye_diffusion.py`, `core.py`, `fps/__init__.py`, `cli.py`) plus untracked + `webui/`, `quest/structure_fetch.py`, `quest/settings/*.json`, `pixi.toml` and + twelve new test modules. None of it was committed as part of creating this + bundle. Anything that touches git here must assume other work is in flight + ([workflows/change-tracking.md](/workflows/change-tracking.md)). diff --git a/okf/overview.md b/okf/overview.md new file mode 100644 index 0000000..db25d96 --- /dev/null +++ b/okf/overview.md @@ -0,0 +1,77 @@ +--- +type: Codebase +title: QuEst +description: Structure-based simulator of dynamic PET quenching and FRET for dyes tethered to proteins by flexible linkers. +resource: https://github.com/Fluorescence-Tools/quest +tags: [fluorescence, pet-quenching, fret, accessible-volume, brownian-dynamics, python] +timestamp: '2026-07-26T00:00:00Z' +--- + +# What it is + +QuEst (QUenching ESTimation) predicts the fluorescence decay of a dye tethered +to a protein by a flexible linker, from the protein structure alone. It models +photo-induced electron transfer (PET) quenching by nearby amino acids and, +optionally, FRET to a second dye. The method is described in +[Peulen et al., J. Phys. Chem. B 2017](https://doi.org/10.1021/acs.jpcb.7b03441). + +The simulation runs in three stages — accessible volume, Brownian diffusion, +photon generation — described in +[architecture/simulation-pipeline.md](/architecture/simulation-pipeline.md). + +Its practical uses are choosing labeling positions for FRET experiments, and +calibrating accessible *contact* volumes (ACVs) against a measured donor +lifetime. + +# Source layout + +| Path | Role | +|------|------| +| `quest/core.py` | The headless service layer: `load_project`, `build_donor_from_project`, `simulate_project`, residue-resolved quenching analysis, MRC/grid writers | +| `quest/api.py` | Thin public re-export of `core` + structure fetch + FPS scan; the stable import surface | +| `quest/cli.py` | The Click CLI (`quest simulate/scan/template/validate/gui`) | +| `quest/structure_fetch.py` | Resolve a path *or* a bare 4-character RCSB PDB ID, with an on-disk cache | +| `quest/quest_gui.py` | Entry point for the legacy Qt GUI | +| `quest/lib/fps/` | Accessible-volume calculation, the AV grid kernels, and the diffusion trajectory kernels (numba) | +| `quest/lib/imp_av.py` | Optional IMP.bff accessible-volume backend | +| `quest/lib/tools/dye_diffusion/` | `SimulateDiffusion` + `DonorDecay` — the simulation objects; also the Qt widget `TransientDecayGenerator` | +| `quest/lib/tools/dye_diffusion/photon.py` | Numba photon-trace and decay-histogram kernels | +| `quest/lib/io/`, `quest/lib/structure/` | PDB/CIF/PQR parsing and the `Structure` object (incl. coarse-graining) | +| `quest/settings/` | `parameter_catalog.json` (parameter help, one source of truth) and `dye_repository.json` (dye presets) | +| `webui/backend/` | FastAPI service wrapping the same `quest.api` calls | +| `webui/frontend/` | Next.js UI (Node toolchain via pixi) | +| `webui/desktop/` | Electron shell around the local backend + frontend | +| `doc/` | User documentation; `doc/parameters.md` is **generated** from the parameter catalog | +| `notebooks/` | Library-usage examples | +| `okf/` | This knowledge bundle — the durable memory layer | + +# Entry points + +- `quest simulate|scan|template|validate|gui` — the CLI (`quest.cli:cli`). +- `from quest.api import load_project, simulate_project` — the Python API. +- `cs.quest` / `quest gui` — the legacy Qt GUI (`quest.quest_gui:start_gui`). +- `uvicorn webui.backend.app.main:app` + `pixi run -e frontend dev` — the web UI. + +# Relationship to imp-tricks + +General fluorescence and structural machinery — accessible volumes, dye +distributions, FRET distance metrics and rates — belongs in the sibling +**imp-tricks** repository under `IMP.bff`, and QuEst depends on it rather than +carrying its own copy. QuEst today duplicates a good deal of it; the direction +and the migration map are in +[specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md). + +# Where to go next + +- The [simulation pipeline](/architecture/simulation-pipeline.md) — what actually + runs when a project is simulated. +- The [project schema](/architecture/project-schema.md) — the JSON contract every + surface reads and writes. +- The [subsystems](/subsystems/index.md) — the code areas. +- The [workflows](/workflows/index.md) — environment, testing, and how changes + get recorded. + +# Citations + +[1] Peulen, Opanasyuk & Seidel, *J. Phys. Chem. B* **121**, 8211–8241 (2017), [doi:10.1021/acs.jpcb.7b03441](https://doi.org/10.1021/acs.jpcb.7b03441) +[2] Dimura et al., *Curr. Opin. Struct. Biol.* **40**, 163–185 (2016), [doi:10.1016/j.sbi.2016.11.012](https://doi.org/10.1016/j.sbi.2016.11.012) diff --git a/okf/references/index.md b/okf/references/index.md new file mode 100644 index 0000000..06ecc67 --- /dev/null +++ b/okf/references/index.md @@ -0,0 +1,6 @@ +# References + +* [PET quenching theory](pet-quenching-theory.md) - The physics QuEst implements, the approximations it makes, and what the numbers can and cannot be trusted to mean. +* [Release state](release-state.md) - QuEst is unreleased: breaking changes are free, and what that does *not* license. +* [Known issues](known-issues.md) - Defects and environment problems that are real, understood, and not yet fixed. +* [User documentation](user-docs.md) - Where the human-facing manual lives and which parts are generated. diff --git a/okf/references/known-issues.md b/okf/references/known-issues.md new file mode 100644 index 0000000..0308ced --- /dev/null +++ b/okf/references/known-issues.md @@ -0,0 +1,116 @@ +--- +type: Reference +title: Known issues +description: Defects and environment problems that are real, understood, and not yet fixed. +resource: okf/log.md +tags: [known-issues, environment, technical-debt] +timestamp: '2026-07-26T00:00:00Z' +--- + +Each entry states what is wrong, how it shows up, and what the fix would be. +Verified on 2026-07-26 unless noted. Remove an entry when it is fixed, and say +so in [okf/log.md](../log.md). + +# Environment + +## QuEst's IMP.bff accessible-volume backend does not work + +Discovered on 2026-07-27, the first time the suite ran in the canonical `arm64` +environment — which has a **compiled `IMP.bff`** (IMP 2.24), so +`HAS_IMP_BFF` is true there and QuEst selected the IMP path. **34 tests +failed.** Three distinct faults, in order of discovery: + +1. `path_map.get_path_map_header()` raises `AttributeError` — IMP 2.24 binds it + to a C symbol (`DensityMap_get_path_map_header`) that is absent from the + compiled `_IMP_bff`. **Fixed** by falling back to the writable accessor, + which is bound to a different symbol. +2. `path_map.get_xyz_density()` returns a NumPy array, and the code truth-tested + it (`if xyz_density:`) → `ValueError`. **Fixed.** +3. **Not fixed:** with both API faults out of the way the backend returns an + *empty* accessible volume. `PM_TILE_ACCESSIBLE_DENSITY` filtered by the + documented value range yields zero tiles, and every tile's + `PM_TILE_PATH_LENGTH` is the 50000 "unreachable" sentinel — the path search + is not producing a reachable region at all. Reverse-engineering the current + contract was stopped deliberately. + +Because the backend is unusable, **selection no longer prefers it silently**: +`resolve_av_backend()` defaults to LabelLib — the implementation QuEst has +always actually run and the one its tests pin — and IMP.bff is opt-in via +`QUEST_AV_BACKEND=imp_bff`, which now fails loudly with the list of usable +backends instead of producing an empty volume. + +*Fix:* do not repair QuEst's hand-rolled integration. Call +`IMP.bff.av.compute_av` from imp-tricks, which performs the same backend +dispatch and is maintained against IMP's API. `DUP-01`/`DUP-02` in +[specs/assessment.md](/specs/assessment.md); +direction in [specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md). + +## imp-tricks' own AV backends do not run in `arm64` either + +Verified 2026-07-27 by calling `IMP.bff.av.compute_av` from the checkout: + +- `backend="labellib"` — its guard requires `LabelLib.AV`; the installed + LabelLib has only `dyeDensityAV1`, so the backend reports itself unavailable + (and would call a missing function if forced). +- `backend="imp_bff"` — `'Particle' object has no attribute + 'get_particle_index'`; IMP 2.24 spells it `get_index()`. + +Both are version skew in **imp-tricks**, not in QuEst, and both must be fixed +there before `DUP-01` (delegating QuEst's AV to `compute_av`) can land. Until +then QuEst's LabelLib path — which matches the installed LabelLib — is the only +working accessible-volume implementation on this machine. + +*Not* an issue: reaching imp-tricks from source. `quest.imp_tricks` splices the +checkout in automatically, deliberately **without installing** it, since the +source tree is what is changing +([workflows/environment.md](/workflows/environment.md)). + +## `pyproject.toml` requires `numpy>=2.0`; the working env has numpy 1.26.4 + +The declared floor is not met by the interpreter QuEst actually runs on, and +that is currently the right way round: `tests/sim_test.log` records the failure +mode under numpy 2.2.6 — the installed IMP extension modules are compiled +against numpy 1.x and abort with "A module that was compiled using NumPy 1.x +cannot be run in NumPy 2.2.6". *Fix:* either rebuild IMP against numpy 2, or +relax the declared floor to match what is supported. Right now the metadata +promises something the stack cannot deliver. + +## `pytest` cannot collect without `-p no:pytest-qt` + +No Qt binding is installed, and pytest-qt aborts the entire session at +collection. Every test invocation in this repo must pass `-p no:pytest-qt` +(the plugin name; `-p no:qt` does not match). *Fix:* install a Qt binding, or +make the plugin a conditional dev dependency. + +# Repository hygiene + +## Simulation output accumulates in the working tree + +`jobs/` at the repo root had grown to **2292** run directories and **32 GB** by +the time it was measured, alongside the `out.xyz`, `out_slow.xyz`, `test.pdb`, +`test.cif`, `tests/sim_test.log` and `webui-viewer-testpdb.png` leftovers. +`simulate_project` writes to `Path.cwd()/jobs/` whenever `save_outputs` is +true, so any run or test started from the repo root leaves one behind. + +**Half fixed.** All of those paths are now in `.gitignore`, so they can no +longer be committed by accident — but the accumulation itself is unchanged, and +the directory still has to be emptied by hand. The real fix is on the writing +side: tests and bulk work must pass `save_outputs=False` or a temporary +`project_dir` ([workflows/testing.md](/workflows/testing.md)). + +## 30 `.coverage.*` files in the repo root + +`quest/utils.py` installs a `sitecustomize.py` coverage hook when `coverage` is +already imported, writing its data file into `os.getcwd()`. They are git-ignored +but never cleaned up. *Fix:* point the hook at a temp directory, or drop it — +it is Python-2-era plumbing (the same module still patches +`unittest.TestCase` for "Python 2.6"). + +# Documentation + +## README points at a vendored path that does not exist here + +The notebook links read `modules/quest/notebooks/…`, which is the path QuEst has +when it is vendored inside the sibling ChiSurf tree, not in this standalone +repository (`notebooks/…`). The Travis badge at the top is also dead and still +references the pre-rename `master` branch. diff --git a/okf/references/pet-quenching-theory.md b/okf/references/pet-quenching-theory.md new file mode 100644 index 0000000..e16e166 --- /dev/null +++ b/okf/references/pet-quenching-theory.md @@ -0,0 +1,80 @@ +--- +type: Reference +title: PET quenching theory +description: The physics QuEst implements, the approximations it makes, and what its numbers can and cannot be trusted to mean. +resource: https://doi.org/10.1021/acs.jpcb.7b03441 +tags: [pet, photophysics, fret, theory, approximations] +timestamp: '2026-07-26T00:00:00Z' +--- + +# The model + +A dye tethered by a flexible linker samples an accessible volume around its +attachment point. While it is in van der Waals contact with an electron-rich +side chain, photo-induced electron transfer (PET) opens a non-radiative channel: +the excited-state decay rate becomes + +``` +k(t) = 1/tau0 + k_Q(r(t)) +``` + +with `k_Q` a **step function** of position — the residue's `kQ` inside its +contact radius, zero outside — summed over all residues in contact. Averaging +over a Brownian trajectory in the accessible volume gives the observable decay, +which is generally multi-exponential even though the underlying photophysics has +one unquenched lifetime. + +PET is a short-range, wavefunction-overlap process; its rate falls off roughly +exponentially with distance over ~1 Å. A step function at contact is therefore a +crude but defensible stand-in: the process is essentially all-or-nothing at the +distances the dye actually samples. + +Residue reactivity for a xanthene dye follows the reference ordering +TRP > PRO ≈ TYR > MET > HIS > CYS (values in `REFERENCE_PET_QUENCHING`). + +# Why the diffusion matters + +If quenching were fast compared to the dye's exploration of its volume, the +decay would report on the *equilibrium* fraction of quenched configurations. It +is not: contact events last nanoseconds and the walk is diffusive, so the decay +depends on the **dynamics** — how often the dye reaches a quencher and how long +it stays. That is why QuEst simulates a trajectory rather than integrating over +the AV, and why the slow-factor grid (unspecific stickiness near the surface) is +not a cosmetic detail: it changes the residence times that set the decay. + +The same trajectory yields the accessible **contact** volume (ACV) — the +fraction of the AV in which the dye is surface-associated — which is the +quantity a measured donor lifetime can calibrate. + +# Approximations, stated plainly + +From the README's warnings, restated as modelling assumptions: + +1. **The dye is one sphere.** No orientation, no internal structure, no + dye–protein chemistry beyond a contact radius. +2. **The protein is a single rigid structure.** No side-chain rearrangement, no + backbone dynamics, no conformational ensemble. +3. **No specific interactions.** Binding pockets, stacking geometries and + electrostatic steering are absent; the only "affinity" is the isotropic + `slow_factor`. +4. **Parameters are transferable starting values, not constants.** The reference + `kQ` and contact distances are for a xanthene dye and are meant to be + calibrated against measured lifetimes. +5. **Precision is not accuracy.** The simulation returns tightly reproducible + numbers; their agreement with experiment is a separate question. + +The honest use of a QuEst number is comparative — this labeling site versus that +one, this ACV calibration versus that one — rather than absolute. + +# FRET + +With a second dye, the donor–acceptor distance is sampled from the two AV point +clouds and converted to a rate through `R0`. `RDAMeanE` (the Förster-weighted +average) is the quantity that corresponds to a FRET-efficiency measurement; +`RDAMean` and `dRmp` (mean-position distance) are different averages and are not +interchangeable with it. + +# Citations + +[1] Peulen, Opanasyuk & Seidel, "Combining Graphical and Analytical Methods with Molecular Simulations…", *J. Phys. Chem. B* **121**, 8211–8241 (2017), [doi:10.1021/acs.jpcb.7b03441](https://doi.org/10.1021/acs.jpcb.7b03441) — the QuEst method paper. +[2] Dimura et al., "Quantitative FRET studies and integrative modeling…", *Curr. Opin. Struct. Biol.* **40**, 163–185 (2016), [doi:10.1016/j.sbi.2016.11.012](https://doi.org/10.1016/j.sbi.2016.11.012) — accessible contact volumes. diff --git a/okf/references/release-state.md b/okf/references/release-state.md new file mode 100644 index 0000000..213c0a1 --- /dev/null +++ b/okf/references/release-state.md @@ -0,0 +1,41 @@ +--- +type: Reference +title: Release state +description: QuEst is unreleased — breaking changes are free, and backwards compatibility is not a constraint. +resource: pyproject.toml +tags: [process, versioning, compatibility] +timestamp: '2026-07-27T00:00:00Z' +--- + +# QuEst is not released + +There are no users on a published build, so **there is nothing to stay +compatible with**. Prefer the clean change over the compatible one: + +- Rename anything. Module paths, function names, project keys, RPC method names + and manifest fields may all change; no deprecation period is owed. +- Delete anything unused. Shims, aliases and "kept for compatibility" wrappers + are debt with no creditor. `quest/lib` was removed outright on 2026-07-27 for + exactly this reason. +- Change file formats. The project JSON, `fps.json` handling and the job + directory layout can be reshaped when the current shape is wrong — the + `R0_matrix` unit fix landed as a straight correction rather than a migration. +- No back-compat branches in code. A second code path "for old projects" is a + second thing to test and a second thing to get wrong. + +What this does **not** license: + +- **Silent behaviour changes in the science.** Renaming a function is free; + quietly changing what a simulation computes is not. When the physics moves, + measure it, say so in [the log](../log.md), and pin it with a test — as with + the per-frame FRET rate (E 0.377 → 0.662) and the IMP reader (verified + field-for-field *identical* before it was accepted). +- **Breaking a sibling repository without saying so.** ChiSurf imports QuEst. + Changes that move an entry point are fine, but they must be recorded so the + host can follow — the GUI entry point moved to `quest.gui:TransientDecayGenerator` + on 2026-07-27 and the manifest was updated in the same change. +- **Leaving OKF behind.** The freedom to change fast only works if what changed + is written down. + +Revisit this page the moment a version is published; from then on the rules +invert. diff --git a/okf/references/user-docs.md b/okf/references/user-docs.md new file mode 100644 index 0000000..8abd2d1 --- /dev/null +++ b/okf/references/user-docs.md @@ -0,0 +1,35 @@ +--- +type: Reference +title: User documentation +description: Where the human-facing manual lives and which parts are generated. +resource: doc/index.md +tags: [documentation, generated] +timestamp: '2026-07-26T00:00:00Z' +--- + +`okf/` is the knowledge layer for agents. `doc/` and `README.md` are the manual +for people, and a change to user-visible behaviour updates both +([workflows/change-tracking.md](/workflows/change-tracking.md)). + +| Path | Content | Generated? | +|---|---|---| +| `README.md` | Project overview, install, quickstart for every surface, citations | hand-written | +| `doc/index.md` | Documentation entry point | hand-written | +| `doc/cli.md` | CLI reference | hand-written | +| `doc/quenching_manual.md` | The quenching model explained for users | hand-written | +| `doc/parameters.md` | Full parameter reference | **generated** | +| `doc/generate_parameter_docs.py` | The generator | — | +| `doc/img/`, `doc/logo.png` | Figures | — | +| `notebooks/` | Library-usage examples, checked by `tests/test_notebooks.py` | — | + +# The generated page + +`doc/parameters.md` is produced from `quest/settings/parameter_catalog.json`: + +```bash +python doc/generate_parameter_docs.py +``` + +Edit the catalog, then regenerate. Hand edits to `doc/parameters.md` are +overwritten and will also drift from the web UI, which reads the same catalog +([architecture/project-schema.md](/architecture/project-schema.md)). diff --git a/okf/specs/assessment.md b/okf/specs/assessment.md new file mode 100644 index 0000000..dc4d9c5 --- /dev/null +++ b/okf/specs/assessment.md @@ -0,0 +1,79 @@ +--- +type: Specification +title: Assessment +description: The gap backlog — where the current tree diverges from the target architecture, itemised with ids and status. +resource: okf/specs/plugin-integration.md +tags: [backlog, assessment, layering, technical-debt] +timestamp: '2026-07-26T00:00:00Z' +--- + +Gaps between the tree and +[the target split](plugin-integration.md). Each row is a discrete, landable +unit. Update the row and the totals in the same change that closes it, and say +so in [okf/log.md](../log.md). + +**Status: 9 of 11 closed** (opened 2026-07-26; LAY-02, LAY-03, LAY-05, LAY-08 and +LAY-09 closed 2026-07-27; LAY-06, LAY-10 and LAY-11 closed 2026-07-27 by the +AutoForm migration). Open: LAY-04 (`quest.api` is still a re-export shim) and +LAY-07 (three unrelated long-running mechanisms, none cancelable). + +| Id | Severity | Status | Gap | +|---|---|---|---| +| LAY-01 | high | **closed 2026-07-26** | ~~The web backend imports **private CLI helpers**.~~ Project template and validation now live in [`quest/project.py`](/subsystems/core-api.md) (`template_project`, `validate_project`, `ProjectValidationError`), exported from `quest.api`. The CLI keeps `_validate_project` as a thin translator to `ClickException`; the web backend and `quest/lib/fps_json.py` — which imported the CLI *from inside the library* — now call the domain. Guardrail: `tests/test_service_layer.py::TestLayering`. | +| LAY-02 | high | **closed 2026-07-27** | ~~The GUI owns a domain object.~~ `TransientDecayGenerator` no longer inherits `DonorDecay`. It **builds** one per run from the form (`build_model()`, driven by `MODEL_ARGUMENT_SOURCES`) and reads results back through delegating properties. The model is a plain object with no Qt in it; a guardrail test asserts `DonorDecay not in TransientDecayGenerator.__mro__`. Behaviour is unchanged, pinned by 11 characterisation tests written before the change. | +| LAY-03 | high | **closed 2026-07-27** | ~~No RPC registry.~~ `quest/backend/` provides a `ServiceDispatcher`, an `InProcessClient` and a duck-typed `register_services(dispatcher)` registering **all eleven** methods behind one `{"ok", "result"\|"error"}` envelope. The last three (`quest.structure.metadata`, `quest.jobs.list`, `quest.jobs.get`) landed with LAY-09. | +| LAY-04 | medium | open | **`quest.api` is a re-export shim, not a facade.** It re-exports names from `quest.core`; it is not verb-oriented and has no local/remote resolution. Callers reach past it: the web backend imports `quest.lib.tools.dye_diffusion.dye_diffusion` and `quest.core` directly. | +| LAY-10 | medium | **closed** (2026-07-27) | **The GUI edited a legacy quenching shape.** `DonorDecay.quencher` (`{residue: {atoms, kQ}}`) carried no per-residue contact radius and no per-residue stickiness, so the Qt table could not express what `amino_acid_interactions` does, and the widget ran `stickiness_mode="global"` while every other surface ran `"amino_acid"`. Closed by the AutoForm migration, not by a fix to the old table: the form's state *is* the project, so its quencher table edits `amino_acid_interactions` directly — kQ, contact radius, quenching atoms and slow factor per residue. There is no second shape left to disagree. | +| LAY-09 | medium | **closed 2026-07-27** | ~~Domain logic living in the web backend.~~ The PDB/CIF chain–residue parser moved to `quest/structure_info.py::structure_metadata`, and job listing/reading/archiving to `quest/jobs.py`. The routes are now adapters; the capabilities are reachable from the CLI, notebooks and a host, and are covered by 14 domain tests instead of only through HTTP. | +| LAY-05 | medium | **closed 2026-07-27** | ~~QuEst declares nothing.~~ `quest/manifest.json` carries the identity, the `gui`/`cli`/`services` entry points and all eleven RPC methods with params/result schemas and `long_running` flags; five tests fail if it and the registry disagree. **Still open elsewhere:** the ChiSurf-side plugin folder has no manifest of its own — `chisurf/plugins/quenching_estimator/` contains only `__init__.py`, `README.md` and `test/`, so it loads through the host's legacy AST-based discovery and declares no entry points, no RPC methods, and no state schema. This is exactly the "one first-class plugin has no manifest at all" case ChiSurf's own plugin spec calls out. | +| LAY-11 | medium | **closed** (2026-07-27) | **The Qt form drew its own plots.** It built pyqtgraph widgets by hand for the decay, the trajectory and the autocorrelation. Closed with LAY-06, as predicted: the three plots are now `plot` sections in `quest.view.json`, rendered by AutoForm through ChiSurf's `chiplot`, and QuEst supplies only the data (`decay_series`, `trajectory_series`, `autocorrelation_series` on the form model). QuEst owns no plotting code at all. | +| LAY-06 | medium | **closed** (2026-07-27) | ~~No declarative view spec.~~ The Qt form is `quest/gui/quest.view.json`, **generated** from `quest/settings/parameter_catalog.json` by `quest/gui/generate_view_spec.py` and rendered by ChiSurf's `AutoForm`. Every `.ui` file is gone — `dye_diffusion2.ui`, `pdb_widget.ui`, `ui/*.ui` — and with them the 1,899-line widget, `widgets.py` and the 98 kB generated Qt resource module; `quest/gui/dye_widget.py` is now ~130 lines that put an AutoForm in a QWidget. The form binds to `quest.gui.form_model.ProjectFormModel`, whose state **is** a project dict, so the hand-written `to_project_dict`/`load_project_dict` pair — where the GUI drifted from the CLI before — no longer exists. `quest/gui/autoform_panel.py` remains for rendering a single RPC method's parameters from the manifest. Covered by `tests/test_view_spec.py`, `tests/test_form_model.py`, `tests/test_gui_widget.py` and `tests/test_gui_simulation.py`. | +| LAY-07 | medium | open | **Long-running work has three mechanisms.** A thread pool in the web backend, a blocking call in the CLI, a `QProgressDialog` in the GUI. None is cancelable from outside; a scan cannot be observed or stopped through any programmatic surface. | +| LAY-08 | low | **closed 2026-07-27** | ~~`sys.path` injection.~~ Every internal import is spelled `quest.lib.…` and `quest/__init__.py` no longer touches `sys.path`. This was not merely cosmetic: `lib.structure.Structure` and `quest.lib.structure.Structure` were **two different classes**, so an `isinstance` check across the boundary failed and a `Structure` got wrapped twice. | + +# Deduplication against imp-tricks + +Target: [imp-tricks-dedup.md](imp-tricks-dedup.md). General fluorescence +machinery belongs in `IMP.bff`; QuEst carries a second copy of much of it. + +| Id | Severity | Status | Gap | +|---|---|---|---| +| DUP-01 | high | **unblocked** (2026-07-27) | **The AV backend dispatch exists twice.** `AV.__init__` + `quest/lib/imp_av.py` reimplement `IMP.bff.av.compute_av`, down to the same backend ordering — and QuEst's copy **does not work**: in `arm64`, where a compiled `IMP.bff` exists, neither backend of `compute_av` runs: `av/compute.py:162` calls `Particle.get_particle_index()` (this IMP spells it `get_index()`), and `av/compute.py:231` rejects LabelLib because it looks for `LabelLib.AV` while this LabelLib exposes `dyeDensityAV1`. Both are one-line fixes **in imp-tricks**, and they unblock the largest deletion QuEst has left. Selection now defaults to LabelLib explicitly (`resolve_av_backend`, `QUEST_AV_BACKEND`, `AV.av_backend`), which contains the damage but does not remove the duplicate. | +| DUP-02 | high | open | **The capability check asks the wrong question.** `HAS_IMP_BFF = hasattr(IMP.bff, "AV")` looks for a compiled attribute; the imp-tricks package exposes its AV at `IMP.bff.av.compute_av`. Partially addressed: the backend is now chosen explicitly rather than by this flag alone. `quest.imp_tricks.enable_imp_tricks()` makes a checkout importable (a compiled `IMP.bff` shadows it otherwise), but imp-tricks is still **not installed** in any environment. | +| DUP-03 | medium | open | **`fret_rate_trace` is general code in the wrong repository.** Donor trajectory + acceptor cloud + R0 → per-frame rate is fluorescence machinery. It belongs with `IMP.bff.cgdye.analysis.fret`, which additionally handles κ² — the thing QuEst's version lacks. | +| DUP-04 | medium | **partly reversed** (2026-07-27) | **Distance metrics are duplicated.** ⟨R_DA⟩ and ⟨R_DA⟩_E: adopt `random_distances` + `av_pair_statistics` — verified to agree with `RDAMean`/`RDAMeanE` within sampling noise, and nothing blocks it. **`dRmp` goes the other way:** upstream's `r_mp` returns ⟨R_DA⟩ (its own docstring says "same as `r_da_mean` here"), which is a different quantity — 47.65 vs 51.53 Å on 148l E15/E90 — and it cannot be computed from a distance sample at all. QuEst's implementation is the correct one and should be contributed upstream. | +| DUP-05 | low | open | **Grid and geometry kernels are duplicated**: `density2points`, `subav`/contact-volume splitting, `asa`/`spherePoints` all have homes in `IMP.bff.av._kernels` / `IMP.cgmol.sterics`. | +| DUP-07 | medium | **partly closed 2026-07-27** | ~~RCSB fetching duplicated with ChiSurf.~~ Moved into `chisurf/core/fio/structure/fetch.py` (merging QuEst's `.cif` fallback into it), re-exported by the `fps_json_editor` plugin, and QuEst delegates to it when a checkout is reachable. **Remaining:** fps.json payload handling — ChiSurf's `payload.py` drags its `FpsJsonModel` along, so moving it to core is the next step. **Not a duplicate after all:** MRC writing — ChiSurf voxelises point clouds via `IMP.em`, QuEst writes precomputed density grids. | +| DUP-06 | low | open | **QuEst carries its own PDB/CIF parser and `Structure`.** Predates the IMP dependency; long-term this is IMP's job. | + +# Severity + +- **high** — blocks the integration outright, or is an active layering + violation that new code will copy. +- **medium** — real duplication or a missing contract; costs correctness over + time rather than today. +- **low** — a hazard that has not bitten yet. + +# Notes + +The cheap half is done: project logic is in the domain (LAY-01), the method +surface is complete and declared (LAY-03, LAY-05), and the capabilities that +only the browser could reach are now domain functions (LAY-09). + +**LAY-02 is closed**, so the model is a plain object on every surface and a host +can drive it without a form — the structural prerequisite for +[OBJ-02](objectives.md). LAY-04 (a real facade) is the natural next step, and +LAY-10 is now cheap: the widget builds its model through one place +(`build_model`), so switching the quencher table to `amino_acid_interactions` +touches that method and the table, not the whole widget. + +Closing LAY-01 also removed a **triplicated** implementation of "simulate one +labeling site and report it": the CLI, the web backend and +`quest/lib/fps_json.py` each had their own copy, and they had drifted — the +library's copy omitted the quencher attribution the other two reported, and the +CLI's copy dropped the fps.json AV overrides into the project without also +applying them to `av_parameter`. All three now call `quest.scan.simulate_site`. + +None of these are correctness bugs in the simulation. For those see +[references/known-issues.md](/references/known-issues.md); for where QuEst is +headed scientifically see [objectives.md](objectives.md). diff --git a/okf/specs/imp-tricks-dedup.md b/okf/specs/imp-tricks-dedup.md new file mode 100644 index 0000000..3745036 --- /dev/null +++ b/okf/specs/imp-tricks-dedup.md @@ -0,0 +1,343 @@ +--- +type: Specification +title: Deduplication against imp-tricks +description: General fluorescence and structural machinery belongs in imp-tricks under IMP.bff; QuEst is the application on top of it. +resource: https://github.com/fluorescence-tools/imp-tricks +tags: [target, dedup, imp, imp-bff, layering, accessible-volume] +timestamp: '2026-07-27T00:00:00Z' +--- + +> Target. Companion to [plugin-integration.md](plugin-integration.md): that one +> is about *how QuEst is called*, this one is about *what QuEst should own*. + +# The rule + +**General fluorescence machinery lives in imp-tricks, under `IMP.bff`.** +QuEst depends on it rather than carrying its own copy. Anything that is not +specific to "estimate PET quenching for this project document" is a candidate to +move: accessible volumes, dye distributions, FRET distance metrics and rates, +labelling geometry, structure handling. + +What stays in QuEst: + +- the [project schema](/architecture/project-schema.md) and its validation, +- the PET-quenching *workflow* — grids, trajectory, photon generation, residue + attribution — insofar as it is not already in `IMP.bff`, +- the [surfaces](/architecture/surfaces.md): CLI, web UI, Qt GUI, RPC, +- scanning, [job artefacts](/architecture/job-artefacts.md), the parameter + catalog and dye library. + +Nothing in imp-tricks may depend on QuEst. The arrow points one way. + +# What imp-tricks already has + +Checked against `~/dev/imp-tricks/src/IMP/bff/` on 2026-07-27: + +| Module | Provides | +|---|---| +| `IMP.bff.av.compute_av` | AV from atoms + attachment site, **with the same IMP.bff → LabelLib backend dispatch QuEst reimplements** (`_av_imp_bff`, `_av_labellib`), and an explicit `backend=` override QuEst lacks | +| `IMP.bff.av.BasicAV` / `ACV` | AV and accessible **contact** volume objects: point clouds, density grids, mean position, slow centres, trapped fraction | +| `IMP.bff.av._kernels` | `density2points`, `random_distances`, `average_distance`, `mean_fret_distance`, `weighted_mean`, `split_av_acv` | +| `IMP.bff.distance_metrics` | `fret_efficiency`, `distance_from_fret_efficiency`, `av_pair_statistics` (⟨R_DA⟩, R_mp, R_E, ⟨E⟩ in one pass), `chi2_score` | +| `IMP.bff.cgdye` | Coarse-grained dye simulation: labelling, rotamers, sampling, and `analysis/fret.py` with **κ²-aware** rates and an exact efficiency from a rate matrix | +| `IMP.bff.polymer`, `.distributions`, `.label`, `.restraints` | Chain models, distance distributions, labelling, restraints | + +# Historical: what `quest/lib` was, module by module + +`quest/lib` no longer exists — it became `quest/core/` on 2026-07-27. The audit +below is kept because it records *why* each piece survived or died; the current +verdict is the re-measured one further down. + +A minimal in-tree library is legitimate — QuEst must run standalone — but it has +to be *minimal*, and today's is neither that nor compatible with the two +libraries it shadows. Audited 2026-07-27: + +| Module | Lines | Verdict | +|---|---|---| +| `lib/tools/dye_diffusion/` | ~1700 | **Keep.** This is QuEst: the PET workflow, `SimulateDiffusion`, `DonorDecay`, the photon kernels. | +| `lib/fps/` | ~1190 | **Mostly duplicate** of `IMP.bff.av` + `IMP.bff.distance_metrics` (`DUP-01`, `DUP-03`–`DUP-05`). Blocked on imp-tricks. `AvPotential` was dead and is gone. | +| `lib/structure/Structure.py` | ~640 | **Keep the reader, drop the analysis.** RMSD, superposition, clustering, internal coordinates and `Universe` were unreachable and are gone — that is IMP/ChiSurf work. What remains is the atom array QuEst simulates on. | +| `lib/io/PDB.py` | ~400 | **Duplicate** of IMP's readers *and* ChiSurf's `core.fio.structure.coordinates` (`DUP-06`) — a third copy. Blocked on a dependency decision, not on code: IMP is missing from the base environment (where the web layer runs), and ChiSurf is missing from `arm64` and would pull tttrlib/mdtraj/pandas into every simulation. Recommended home: **IMP.atom**. | +| `lib/common.py` | 271 | Chemical reference data (atomic weights, VDW radii, charges) for the parser. Moves out with `DUP-06`. | +| ~~`lib/math/`~~ | — | **Gone.** The twelve lines of FFT autocorrelation are inlined in `quest/core.py`; ChiSurf's `core.math.signal.autocorr` is the same thing, but a headless run must not import a host application for a primitive. | +| `lib/imp_av.py` | ~200 | The broken IMP integration (`DUP-01`/`DUP-02`). Delete when `compute_av` works. | +| `lib/fps_json.py` | 112 | fps.json labeling files. QuEst-specific enough to keep. | +| ~~`lib/plots/`, `lib/widgets.py`, `lib/ui/`, `lib/genealogy.py`~~ | ~2400 | **Moved to `quest/gui/`** — they were Qt, used only by the form. | + +`quest/lib` went from **7673 to 4511 lines** on 2026-07-27: ~2400 moved to +`quest/gui/`, and **668 lines of unreachable code deleted** (found by +reachability analysis from the real entry points, not by eye). + +# Duplication against ChiSurf + +The presentation arrow points at ChiSurf, so its code is fair game too. Three +QuEst modules are shadowed by ChiSurf's **`fps_json_editor` plugin** +(`chisurf/plugins/modelling/fps_json_editor/core/`): + +| QuEst | ChiSurf equivalent | +|---|---| +| `quest/core/fps_json.py` — load and normalise fps.json positions | `core/payload.py` — `normalize_payload`, `validate_payload`, `summarize_payload` | +| `quest/structure_fetch.py` — RCSB download and cache | `core/pdb.py` — `download_pdb_file`, `default_cache_dir`, `pdb_source_url` | +| `write_mrc` in `quest/core/simulation.py` | `core/mrc.py` — `save_av_mrc` | + +**It cannot be consumed as it stands.** All three live inside a ChiSurf +*plugin*, and a plugin is not a library: QuEst's domain importing +`chisurf.plugins.modelling.fps_json_editor.core.payload` would couple two +plugins through the host's plugin tree, and would drag the whole ChiSurf import +(tttrlib, mdtraj, pandas) into a headless simulation. + +The fix belongs on the ChiSurf side: fps.json handling, RCSB fetching and MRC +writing are **library** concerns, so they belong in `chisurf.core.*` (or, for +the labelling parts, imp-tricks). Once they are there, QuEst deletes its copies. +Recorded as `DUP-07`. + +# Verdict, module by module (re-measured 2026-07-27) + +Everything below was **run**, not read: imports attempted, kernels compared +numerically, the AV built both ways. The evidence is in `okf/log.md` for the +same date. + +## Stays in QuEst — it *is* the application + +| module | lines | why it stays | +|---|---|---| +| `dye_diffusion.py` | 1551 | The PET quenching model, sticky diffusion grids, `DonorDecay`. This is the science QuEst exists for; nothing upstream has it. | +| `simulation.py` | 1323 | Project → result orchestration, `aa_residence`, job artefacts. Application logic. | +| `photon.py` | 212 | Monte-Carlo photon trace against a per-frame quenching rate. Coupled to the quenching trajectory model. | +| `pdb.py` | 228 | Already delegates to `IMP.atom.read_pdb`; what remains is QuEst's radii, the parse cache and the SWIG lock. | +| `fps_json.py` | 112 | Scan glue. The payload half already moved to `chisurf.core`. | + +## Belongs in imp-tricks — and is adoptable **today** + +| what | upstream | evidence | +|---|---|---| +| `density2points` **and** `density2points_ll` (two copies!) | `IMP.bff.av._kernels.density2points` | Numerically identical on a test grid. Theirs is a strict superset: arbitrary grid dimensions and it keeps the per-voxel weight, which QuEst throws away. QuEst carries a flat/centre-origin variant *and* a 3-D/corner-origin one; upstream needs neither. | +| `RDAMean`, `RDAMeanE`, `_ran_dist` | `random_distances` + `av_pair_statistics` | Agree within sampling noise on 148l E15/E90: ⟨R_DA⟩ 51.56 vs 51.53 Å, ⟨R_DA⟩_E 51.36 vs 51.53 Å. | + +Neither is blocked by anything. `IMP.bff.av._kernels` and +`IMP.bff.distance_metrics` import and run in `arm64` today. + +## Unblocked 2026-07-27 — fixed upstream + +The three faults below were fixed **in imp-tricks**, and +`IMP.bff.av.compute.compute_av` now reproduces QuEst's accessible volume +**bitwise** on 148l E15 (167 196 points, identical after sorting). Pinned by +`tests/test_imp_tricks_bridge.py::TestTheUpstreamAvMatchesQuEsts`, which skips +where LabelLib or the checkout is missing. + +1. `av/compute.py` — `Particle.get_particle_index()` did not exist on this IMP, + which spells it `get_index()`. Now goes through a `_particle_index()` shim + that accepts either, because the two spellings are both in the wild. +2. `av/compute.py` — the LabelLib probe required `LabelLib.AV`. Current LabelLib + exposes only the `dyeDensityAV1` kernel, so a perfectly working install was + reported as missing and the backend was unreachable. The probe now accepts + either, and `_av_labellib` drives `dyeDensityAV1` when the high-level entry + point is absent, converting its centre-origin Fortran grid to the + corner-origin convention `density2points` expects. +3. `av/compute.py` — **the reason it returned an empty volume**: the attachment + atom's own van-der-Waals sphere was left in the obstacle list. The linker + starts *at* that atom, so the source sits inside an obstacle and LabelLib + returns nothing — no error, just an empty cloud. QuEst had always zeroed it; + upstream had not. + +Two more upstream fixes went with them: + +- `src/sitecustomize.py` extended `IMP.__path__` but not the `__path__` of + subpackages that are **also compiled and installed**. `IMP.bff` is a regular + package whose `__path__` points at site-packages, so Python never consulted + `IMP.__path__` for its children and `import IMP.bff.av` failed however + `sys.path` was arranged — imp-tricks' own test suite could not import its own + AV code (28 collection errors). QuEst had solved this independently in + `quest/imp_tricks.py`; the same handling is now upstream. Its `bff` suite goes + from *uncollectable* to **191 passed, 5 failed, 24 skipped**. +- Two tests asserted `ImportError` "without a backend" and passed only *because* + of fault 2 — a usable LabelLib was being reported as missing. They now + monkeypatch the availability flags to create the condition they describe. + +The 5 remaining failures (`cgdye/rotamer` R0-vs-FRETpredict, `dye_io` +PDB→mmCIF, `polymer` Gaussian-chain PDF) touch none of this — zero references to +`av.compute`, LabelLib or `compute_av` — and had never run before, since the +suite could not be collected. Newly *visible*, not newly broken. + +## What still stops the deletion: packaging, not capability + +`IMP.bff.av` resolves in **both** environments once the checkout is on the path — +including the base interpreter, where there is no compiled `IMP.bff` to shadow +it. So the barrier is no longer "it does not work". It is that imp-tricks is a +development path shim (`quest/imp_tricks.py`), not a declared dependency: +deleting QuEst's `AV` today would break any install that does not happen to have +a checkout. Declaring it in `pyproject.toml` and the rattler recipe is the next +step, and it is a decision about what QuEst depends on, not a code change. + +## Superseded — the original diagnosis, for reference + +`AV` (in `av.py`) and `imp_av.py` should both become +`IMP.bff.av.compute.compute_av`, whose signature is already the right shape — +plain arrays (`atoms_xyz`, `atoms_vdw`, `source_xyz`), no IMP particles. It +cannot compute an AV in `arm64` by **either** backend: + +- `compute.py:162` — `ca_p.get_particle_index()`. The compiled IMP here spells + it `get_index()`. `AttributeError`. +- `compute.py:231` — the LabelLib backend refuses with "LabelLib is required". + LabelLib *is* installed; it exposes `dyeDensityAV1` / `dyeDensityAV1_arr`, + and imp-tricks looks for `LabelLib.AV`. + +Both are one-liners **in imp-tricks**. Until they are fixed, QuEst keeps its own +AV and the duplication stands — this is the single change that unblocks the +largest deletion (`DUP-01`, `DUP-02`, and `imp_av.py` entirely). + +## The arrow points the other way — QuEst is right, upstream is wrong + +`av_pair_statistics` returns four numbers, and its second, `r_mp`, is +documented as *"Distance between mean positions (same as `r_da_mean` here)"* — +it returns `r_da_mean` again. **R_mp is not ⟨R_DA⟩.** R_mp is +|⟨r_D⟩ − ⟨r_A⟩|, the distance between the two cloud centroids, and it cannot be +recovered from a sample of pair distances at all: the sampling destroys the +information. Measured on 148l E15/E90, QuEst's `dRmp` gives **47.65 Å** and +upstream's `r_mp` gives **51.53 Å** — 8 % apart, and the smaller number is the +correct one. + +So `dRmp` does not get deleted. It gets **contributed upstream**, and +`av_pair_statistics` should either take the two clouds or stop claiming to +return R_mp. Anyone who trusted that field has a systematically wrong R_mp. + +## Deleted 2026-07-27 — dead weight, now gone + +`structure.py` went **623 → 345 lines**. What went: `rmsd`, `cluster`, +`calc_internal_coordinates`, `move_center_of_mass`'s geometry primitives +(`_norm`, `_angle`, `_dihedral`, `r2i`), and the whole torsion subsystem — +`coord_i`, `internal_coordinates`, and the `phi`/`psi`/`omega`/`chi` accessors, +which nothing read. What stayed: the constructor, `to_coarse` (reached through +`make_coarse=`), `xyz`, `vdw`, `atoms`, `residue_names`, `residue_ids`, `write`, +and the three helpers the class itself calls. + +**A caution learned doing it.** "No callers outside this module" is the wrong +question for a module-level helper: `make_residue_lookup_table`, +`get_residue_sequence` and `move_center_of_mass` had none, and are called from +`Structure.__init__`. Deleting them broke construction immediately. A second +trap: cutting a function span up to the next `def`/`class` swallows the +module-level constants that follow it — `a2id`, `res2id`, `internal_keys` went +with the first cut. And a third: the deletion left an orphaned `@njit` that +silently decorated the next function added below it. Each was caught by running +the code, none by reading the diff. + +The original survey, for reference: + +- module level, zero callers: `rmsd`, `cluster`, `calc_internal_coordinates`, + `move_center_of_mass`, `r2i`, `make_residue_lookup_table`, + `get_residue_sequence`; +- `Structure` methods, zero callers: `internal_coordinates`, + `radius_gyration`, `update_dist`, `update_coordinates`, `b_factors`, + `atom_types`, `residue_dict`, `n_residues`, and the `phi`/`psi`/`omega`/`chi` + torsion accessors. + +What is live: the constructor, `to_coarse` (through `make_coarse=`), `xyz`, +`vdw`, `atoms`, `residue_names`, `residue_ids`, `write`. This is a QuEst-side +cleanup with no upstream dependency — it does not need imp-tricks fixed first. + +## No counterpart yet + +`fret_rate_trace` and `fret_rate_pair_trace` have none. +`IMP.bff.cgdye.analysis.fret` computes *efficiencies* (and κ², which QuEst +lacks — `OBJ-01` item 6), not a per-frame rate along a trajectory. The right +home eventually, but that is a new function upstream, not a move. + +## Order of work, cheapest first + +1. Delete the dead half of `structure.py`. No dependency on anything. +2. Adopt `_kernels.density2points` and drop both QuEst copies. +3. Adopt `random_distances` + `av_pair_statistics` for ⟨R_DA⟩ and ⟨R_DA⟩_E, + keeping `dRmp` local until upstream is fixed. +4. Fix the two imp-tricks lines; then delete `imp_av.py` and QuEst's `AV`. +5. Move the FRET rate kernel up once κ² is wanted. + +# Do not install it — work from `src` + +imp-tricks is under active development, so the **source tree is what has to +work**; an installed copy goes stale the moment the checkout changes. A real +`pip install` was tried and reverted for exactly that reason. + +# Reaching a checkout from the live interpreter + +`quest.imp_tricks.enable_imp_tricks()` splices a checkout in at runtime +(`~/dev/imp-tricks/src`, or `$IMP_TRICKS_SRC`), returning the subpackages it +made importable. **It runs automatically** when `quest.lib.imp_av` is imported — +which every QuEst entry point does — so using QuEst is enough to reach +`IMP.bff.av`, `IMP.bff.distance_metrics` and `IMP.cgmol.*` from source, in both +environments. It is never fatal: no checkout means an empty list. + +This mirrors what imp-tricks does for itself: it ships a `sitecustomize.py` +that extends `IMP.__path__` when `src` is on `PYTHONPATH`, which is how ChiSurf +consumes it. That mechanism is enough for subpackages IMP does not ship +(`IMP.cgmol`, `IMP.finite`, …) but **not** for `IMP.bff`, because a compiled +regular package always beats a namespace directory of the same name no matter +which comes first on the path. Reaching `IMP.bff.av` needs the *subpackage's* +`__path__` extended too, which is what the helper adds. + +**`PYTHONPATH` alone is not enough.** imp-tricks ships `IMP//` as +*namespace* directories. In the base environment, where nothing else provides +`IMP.bff`, adding `src` to the path works. In the canonical `arm64` +environment, `IMP` and `IMP.bff` are **compiled regular packages** with their +own `__init__.py`, and a regular package shadows a namespace directory of the +same name completely — `import IMP.bff.av` fails no matter what is on the path. + +The helper therefore appends to the *already-imported* package's `__path__`, +which is where Python looks for submodules. The checkout's `IMP.bff.av` and +`IMP.bff.distance_metrics` then resolve **alongside** the compiled +`IMP.bff.AV`, not instead of it. Verified in both environments; idempotent; a +missing checkout returns `[]` rather than raising. + +# The capability check is looking for the wrong thing + +`quest/lib/imp_av.py` decides whether the preferred backend exists with: + +```python +HAS_IMP_BFF = hasattr(IMP.bff, "AV") +``` + +`IMP.bff` here is the **namespace package from imp-tricks**, not a compiled +module — with `PYTHONPATH=~/dev/imp-tricks/src` it imports fine, exposes +`IMP.bff.av.compute_av` and `IMP.bff.distance_metrics`, and has **no top-level +`AV` attribute**. So QuEst concludes "IMP.bff is unavailable" and falls back to +LabelLib even when imp-tricks is present and could serve the request. + +Two separate things to fix, in this order: + +1. **Install imp-tricks into the environment** (it is not installed here; only + the path trick works), and +2. **ask for the capability, not the attribute** — call + `IMP.bff.av.compute_av`, which already performs the backend dispatch itself. + +Until then the LabelLib path is what actually runs — now **by explicit default** +rather than by accident, since QuEst's own IMP integration turned out to return +an empty accessible volume when it finally got selected in `arm64`. That is the +strongest argument for this whole document: the duplicated integration was +broken and nobody could tell, because the environment that would have exercised +it was never the one being tested. See +[references/known-issues.md](/references/known-issues.md). + +# Rules for the migration + +1. **Move, don't copy.** A symbol lands in `IMP.bff` and QuEst imports it; two + maintained copies is the state being fixed, not a milestone toward it. +2. **Keep the LabelLib fallback reachable.** QuEst must still run where the + compiled IMP is absent — that is the current development environment. +3. **Migrate behind QuEst's own names first** where a signature differs, so the + swap is one edit and one test run rather than a rewrite of call sites. +4. **The tests move with the code.** `tests/test_grid_kernels.py` and + `tests/test_fret_physics.py` pin behaviour that will live in imp-tricks; + their assertions belong beside the implementation, with QuEst keeping only + an integration-level check. +5. **Nothing moves without a green run on both sides** — QuEst's suites and + imp-tricks' (`PYTHONPATH=src` from its root). + +# Where the FRET rate trace should land + +`fret_rate_trace` computes `k_FRET(t) = (1/tau0)·⟨(R0/|r_D(t) − r_A|)^6⟩_A` +for a donor trajectory against an acceptor cloud. `IMP.bff.distance_metrics` +already owns the static counterparts, and `IMP.bff.cgdye.analysis.fret` owns +κ²-aware rates and exact efficiencies from rate matrices — **that module is the +natural home**, and merging into it would bring κ² with it, which QuEst's +implementation lacks ([objectives.md](objectives.md) OBJ-01 item 6). + +Tracked as `DUP-03` in [assessment.md](assessment.md). diff --git a/okf/specs/index.md b/okf/specs/index.md new file mode 100644 index 0000000..65bbd3a --- /dev/null +++ b/okf/specs/index.md @@ -0,0 +1,10 @@ +# Specs + +Target ("north star") architecture for QuEst, and the backlog tracking where +today's code diverges from it. Consult these before large refactors — a change +that moves the tree toward the target is worth more than one that merely works. + +* [Objectives](objectives.md) - Where QuEst is going scientifically: FRET as a first-class observable, and fitting dye parameters to measured decays. Not implemented — shape new work so these get cheaper, not harder. +* [Plugin integration — target](plugin-integration.md) - The core / rpc / api / cli / gui split QuEst adopts from the ChiSurf plugin contract, so the same code serves the CLI, the web UI, the desktop GUI, and a ChiSurf plugin without a second implementation. +* [Deduplication against imp-tricks](imp-tricks-dedup.md) - General fluorescence machinery belongs in imp-tricks under `IMP.bff`; QuEst is the application on top of it. What already exists there, what QuEst duplicates, and the rules for moving it. +* [Assessment](assessment.md) - The gap backlog: where the current tree diverges from the target, itemised with ids and status. diff --git a/okf/specs/objectives.md b/okf/specs/objectives.md new file mode 100644 index 0000000..adbf119 --- /dev/null +++ b/okf/specs/objectives.md @@ -0,0 +1,139 @@ +--- +type: Specification +title: Objectives +description: Where QuEst is going as a scientific tool — restoring FRET as a first-class observable, and fitting dye parameters to measured decays. +resource: okf/specs/plugin-integration.md +tags: [objectives, roadmap, fret, optimization, fitting] +timestamp: '2026-07-26T00:00:00Z' +--- + +The scientific direction, as distinct from +[the architectural target](plugin-integration.md). **Nothing here is +implemented yet.** They are recorded so that every refactor and every new +feature is shaped to make them cheaper rather than harder — a change that +blocks one of these is the wrong change, even if it is locally tidy. + +# OBJ-01 — FRET as a first-class simulated observable + +QuEst simulated FRET historically, and the machinery is still present: +`DonorDecay.calc_acceptor_av`, `calc_fret_rate`, `calc_photons_fret`, +`get_histogram_fret`, and the `fret` block of the +[project schema](/architecture/project-schema.md). Two tests exercise it +(`test_use_cases.py::test_use_case_fret`, `test_api.py::test_simulate_project_with_fret`) +and it does produce a second decay curve. **It is not dead — it is degraded**, +and the degradations are quiet ones. + +Measured on 2026-07-26 with the T4L test project at R0 = 52 Å: donor QY 0.9944, +FRET-channel QY 0.042, E = 0.96. So the path runs end to end. + +What is wrong with it today: + +1. ~~**FRET does not see the diffusion.**~~ **Done 2026-07-27.** + `calc_fret_rate_trace` evaluates `k_FRET(t) = (1/tau0)·⟨(R0/|r_D(t) − r_A|)^6⟩_A` + per frame; the donor is resolved in time and the acceptor averaged over its + volume. E on T4L E55→E132 moved 0.377 → 0.662 as a result. +2. ~~**The acceptor never moves.**~~ **Done 2026-07-27.** The acceptor is a dye + in its own right: it walks its own accessible volume with its own diffusion + coefficient, its own slowing radius and its own per-residue interaction + table, and `k_FRET(t)` uses the instantaneous separation of the two + trajectories (`fret_rate_pair_trace`). The fast-acceptor limit is still + reachable as `fret.acceptor_dynamics: "averaged"`. **The default changed**, + so FRET numbers move: on 148l E15→E90 with a sticky acceptor + (D = 2.5 Ų/ns, slow radius 11 Å) E went 0.73 → 0.78. The two differ because + a cloud is weighted uniformly while a trajectory is weighted by where the + dye dwells — the direction depends on geometry, not on a fixed bias. +3. ~~**`fret_efficiency` has two definitions.**~~ **Done 2026-07-27.** The + analytic one is deleted; efficiency is always `1 − QY_DA/QY_D` from the two + simulated decays. `rda_mean_e()` remains a diagnostic distance only. +4. ~~**Failure is silent.**~~ **Done 2026-07-27.** A missing acceptor raises with + a message naming what to set, instead of yielding a donor-only result. +5. ~~**R0 is barely reachable.**~~ **Done 2026-07-26.** The unit is settled + (Ångström), documented in the parameter catalog, and editable in both UIs: + an `R0 [Å]` spin box in the Qt FRET group and an `R0 [Å]` field in the web + UI's FRET acceptor panel, which also gained the enable toggle and acceptor + site selectors it never had. A browser FRET run now reports E = 0.55 on T4L. +6. **No orientation factor.** κ² is not modelled, and no averaging regime is + chosen or documented. + +"Working" means, at minimum: a per-frame D–A distance, one definition of +efficiency, an error when the acceptor cannot be built, R0 in the catalog and +the UI, and a test that pins a known geometry to a known efficiency rather than +asserting `0 <= E <= 1`. + +**Reachability, confirmed 2026-07-27 after the AutoForm migration.** FRET is +live on all three surfaces and each is covered by a test that *runs* it, not +merely one that builds a project: + +| surface | how it is reached | test | +|---|---|---| +| library / CLI | the `fret` block of the project | `test_fret_physics.py`, `test_fret_units.py` | +| web UI | enable toggle, acceptor chain/residue/atom selectors, `R0 [Å]` | `test_webui_e2e.py::TestFretPanel` (5) and `::TestFretSimulation` — a full browser run asserting `0 < E ≤ 1` | +| Qt form | the FRET panel of `quest.view.json`, bound to the same keys | `test_gui_simulation.py::TestTheFormRunsFret` (8) | + +The desktop tests were the gap: the rebuilt form bound FRET through the shared +project keys, but every GUI test set `fret_enabled = False`, so nothing ran it. +They now pin both decays, an efficiency strictly between 0 and 1 on a chosen +site pair, `E = 1 − QY_DA/QY_D` agreeing with the reported value, a larger R0 +transferring more (a nanometre R0 would not), the toggle actually gating the +channel, and a FRET project surviving save/load. Measured E = 0.77 on +148l E15→E90 at R0 = 52 Å. + +**Progress.** *2026-07-26* — reachability: R0 in the catalog and both UIs, the +web UI can switch FRET on and choose an acceptor site, the unit mismatch that +zeroed transfer is fixed, and a full FRET run works from the browser. +*2026-07-27* — the physics of items 1, 3 and 4: a per-frame transfer rate, one +efficiency definition, and a loud failure when the acceptor is missing; then +item 2, a diffusing and sticking acceptor with per-dye properties. + +**Remaining: item 6** — κ² is not modelled. `IMP.bff.cgdye.analysis.fret` already handles κ², which is one more +reason the rate kernel should move there +([imp-tricks-dedup.md](imp-tricks-dedup.md), `DUP-03`). + +# OBJ-02 — Fit dye parameters to measured decays + +The direction that makes QuEst quantitative rather than illustrative: + +> experiment on a system → optimise the model parameters until the simulation +> describes the measurement. + +Concretely: load a measured fluorescence decay, vary the dye and quenching +parameters (`kQ` per residue type, contact radii, `slow_factor`, the diffusion +coefficient, linker geometry), and find the values that reproduce it. The +shipped chemistry is explicitly *starting values to be calibrated* +([references/pet-quenching-theory.md](/references/pet-quenching-theory.md)) — +this objective is what turns them into calibrated ones, and it is the same loop +that would calibrate an accessible contact volume against a donor lifetime. + +Two routes, not yet chosen: + +- **Rely on the host.** As a first-class ChiSurf plugin, QuEst reaches an + existing fitting and sampling stack — optimisers, error analysis, global + analysis over several datasets, and a decay-data model that already knows + about IRFs, background and scatter. QuEst would contribute a *model* whose + parameters the host varies. This is the reason + [plugin-integration.md](plugin-integration.md) matters beyond tidiness: the + RPC/manifest split is what lets the host drive QuEst as a model rather than + launch it as a window. +- **Own optimiser.** Keeps QuEst standalone at the cost of reimplementing + fitting, uncertainties and data handling. + +The host route is preferred on present evidence; the decision should be recorded +here when it is made. + +## What this implies for work done before it starts + +- **A simulation must be callable as a function of its parameters**, cheaply and + repeatedly. `save_outputs=False` already exists for that reason; anything that + makes a run write, log or allocate unconditionally works against it. +- **Runs must be reproducible.** Seeding is already threaded through the walk + and the photon trace ([subsystems/dye-diffusion.md](/subsystems/dye-diffusion.md)); + an optimiser needs the noise to be controllable, or it will chase Monte-Carlo + scatter. +- **Parameters need to be addressable by name.** The dotted paths of the project + schema are already the right shape for "vary `amino_acid_interactions.TRP.kQ`". +- **The decay is the fit target**, so it must be comparable to a measured curve: + the same time axis, and eventually convolution with an IRF plus background. + That machinery exists in the host — another argument for the plugin route. +- **The service layer is how a fitter drives QuEst.** `quest.simulate` returning + a plain payload ([subsystems/core-api.md](/subsystems/core-api.md)) is already + most of the interface an optimiser needs. diff --git a/okf/specs/plugin-integration.md b/okf/specs/plugin-integration.md new file mode 100644 index 0000000..1d777bc --- /dev/null +++ b/okf/specs/plugin-integration.md @@ -0,0 +1,234 @@ +--- +type: Specification +title: Plugin integration — target +description: The core / rpc / api / cli / gui split QuEst adopts from the ChiSurf plugin contract, so one implementation serves every surface. +resource: quest/ +tags: [target, architecture, plugin, rpc, layering, chisurf] +timestamp: '2026-07-26T00:00:00Z' +--- + +> The target. Current shape: [architecture/surfaces.md](/architecture/surfaces.md). +> Current-state gaps: [assessment.md](assessment.md). + +# Why + +Beyond keeping the surfaces in step, this split is the **enabler for +[OBJ-02](objectives.md)**: a host application can only drive QuEst as a fittable +model — varying parameters, scoring the decay against a measurement — if QuEst +exposes named operations over plain data. Today it exposes a window. + +QuEst has four surfaces today and is *also* embedded in the sibling ChiSurf +application as its `quenching_estimator` plugin. That plugin is currently a bare +Qt wrapper: it imports `quest.lib.tools.dye_diffusion.TransientDecayGenerator` +and puts it in a `QMainWindow`. Nothing of QuEst's headless capability — +simulate, scan, validate, the parameter catalog, the dye library — is reachable +from ChiSurf's RPC layer, its CLI, or its automation. The plugin also ships no +`manifest.json`, so it loads through ChiSurf's legacy AST-based discovery path. + +ChiSurf's own plugins solve this with a layered split that QuEst should adopt. +The payoff is not tidiness: it is that **one implementation serves the QuEst +CLI, the QuEst web UI, the QuEst desktop GUI, and the ChiSurf plugin** — with +the same method names, the same shapes, and the same error contract. + +# The split + +The reference layout, as used by ChiSurf plugins (e.g. +`chisurf/plugins/fcs/fcs_calculator/`): + +```text +manifest.json identity, entrypoints (gui / cli / services), rpc_methods +core/ Qt-free, host-free domain code — the algorithms +backend/services.py RPC handlers: register_services(dispatcher) +backend/state.py session state owned by the service layer +cli/main.py CLI entry point -> calls core (or the facade) +gui/client.py the client wrapper — the ONLY way the GUI reaches the backend +.view.json declarative form/panel description rendered by the host +test/ +README.md +``` + +The layering rule, in one line each: + +- **core** knows nothing about Qt, HTTP, ChiSurf, or the CLI. Pure functions and + domain objects over plain data. +- **backend** exposes core as named RPC methods returning a single shape: + `{"ok": True, "result": …}` or `{"ok": False, "error": …}`. It is the only + writer of session state. +- **api / facade** is the one door presentation calls. It resolves in-process or + remote *internally* — callers never branch on "am I local". +- **cli** parses arguments and formats output. No domain logic. +- **gui** renders and calls `client.call("quest.", params)`. It never + imports a domain object. + +Everything crossing the boundary is plain serializable data with stable +identifiers; live domain objects do not cross. + +# QuEst's method surface + +The RPC methods fall out of what the FastAPI backend already exposes — which is +the evidence that this surface is the real one, it is just currently spelled +only as HTTP routes: + +| RPC method | Today's spelling | Long-running | +|---|---|---| +| `quest.simulate` | `POST /api/simulate` | yes, cancelable | +| `quest.scan` | `POST /api/scan` | yes, cancelable | +| `quest.validate` | `POST /api/validate` → `cli._validate_project` | no | +| `quest.template` | `GET /api/template` → `cli._template_project` | no | +| `quest.parameter_catalog` | `GET /api/parameter-catalog` | no | +| `quest.dyes.list` / `quest.dyes.save` | `GET`/`POST /api/dyes` | no | +| `quest.quenching_defaults` | `GET /api/quenching-defaults` | no | +| `quest.structure.metadata` | `POST /api/structure/metadata` | no | +| `quest.jobs.list` / `quest.jobs.get` | `GET /api/jobs`, `/api/jobs/{id}` | no | + +Each carries documented params/result shapes in the manifest. The web backend +then becomes a **transport over the registry** rather than a parallel +implementation of it — one place to add a method, four places it appears. + +`quest.simulate` and `quest.scan` are the long-running pair and need the uniform +start / observe / cancel mechanism, not three ad-hoc ones (a thread pool in the +web backend, a blocking call in the CLI, a `QProgressDialog` in the GUI). + +# Target layout for this repository + +```text +quest/ + manifest.json id "quest", entrypoints, rpc_methods, state schema + core/ the domain, Qt-free + simulation.py simulate_project & the pipeline (today: core.py) + analysis.py residue attribution, autocorrelation + project.py the project schema: template, validate, normalise + grids.py MRC + density writers + backend/services.py register_services(dispatcher) -> the table above + api.py the facade: verb-oriented, plain data in and out + cli/ Click commands -> facade + gui/ widget + client.py + quest.view.json declarative parameter form, generated from the catalog +``` + +Two QuEst-specific notes: + +- **The parameter catalog is already half of a view spec.** + `quest/settings/parameter_catalog.json` carries label, category, type, unit and + description per dotted parameter id, and both the web UI and the docs render + from it. Generating `quest.view.json` from the catalog — rather than + hand-writing a second description of the same fields — keeps the Qt form, the + browser form, and the docs from drifting. +- **The project JSON is already the boundary contract.** + [architecture/project-schema.md](/architecture/project-schema.md) is plain + serializable data with dotted addressing. It crosses the wire unchanged; there + is no object to marshal. That is why this split is cheap for QuEst. + +# The dependency arrow, and where it points + +Two different directions, decided deliberately: + +- **Fluorescence machinery: QuEst → imp-tricks.** Accessible volumes, distance + metrics, dye models. QuEst must never be imported by imp-tricks + ([imp-tricks-dedup.md](imp-tricks-dedup.md)). +- **Presentation: QuEst → ChiSurf.** The host's **AutoForm** renders QuEst's + control panels, so QuEst stops carrying `.ui` files and hand-built Qt forms. + +The second is the reversal of the earlier "QuEst never imports the host" rule, +and it is what makes the UI deduplication possible at all: without it, a +declarative form means QuEst reimplementing a form renderer. + +**It is optional, and that is what keeps QuEst standalone.** ChiSurf is reached +through `quest.chisurf_host.enable_chisurf()` — a source checkout, resolved from +`CHISURF_ROOT`, never fatal, and never overriding a ChiSurf already imported by a +host that loaded QuEst as a plugin. Nothing outside `quest.gui` imports it. + +## AutoForm renders the manifest QuEst already ships + +`AutoForm.from_rpc_method(entry)` takes an `rpc_methods` entry from +`quest/manifest.json` and produces a bound Qt form: labels, types, defaults, +JSON-Schema `description`s as tooltips, and the entered values read back with +`form.model.params()`. QuEst already declares all eleven methods with full +parameter schemas, so **the declaration a host reads to learn what QuEst offers +is also the UI description** — one artefact, not two. + +Demonstrated 2026-07-27 in `arm64` with the ChiSurf checkout on the path: every +one of the eleven declarations renders, `quest.simulate` showing +project / pdb_path / nbins / tac_range / project_dir plus a `save_outputs` +checkbox, with no QuEst-side UI code. Pinned by +`tests/test_chisurf_autoform.py` (14 cases), which skips where Qt or the +checkout is absent. + +## The `.ui` files are gone (2026-07-27) + +The migration ran in the three stages planned here, and finished: + +1. Render the parameter groups from the manifest — `quest/gui/autoform_panel.py`, + still there for rendering one RPC method's parameters. +2. Author the rest as a view scheme — `quest/gui/quest.view.json`, **generated** + from the parameter catalog by `quest/gui/generate_view_spec.py`. AutoForm's + own section types cover everything QuEst needed: `value kind=file` for the + structure picker, an editable `table` for the quencher chemistry, the + `chimol` custom section for the 3D view, and `plot` sections (chiplot) for + the decay, trajectory and autocorrelation. +3. Delete the `.ui` files and the hand-built form. Done — 1,899 lines of widget + became ~130. + +There is no in-tree fallback renderer: where ChiSurf is absent, the desktop +surface says so and the CLI, API and web backend carry on unaffected. That is a +deliberate consequence of the reversed presentation arrow — one renderer, not +two that can disagree. See [subsystems/gui.md](/subsystems/gui.md). + +## The remaining hand-built pieces, and where each one goes + +Three instructions arrived for this migration and are recorded here rather than +started, because each is a substantial change and half of one is worse than +none: + +1. **Delete the `.ui` files.** `quest/gui/dye_diffusion2.ui`, `pdb_widget.ui` + and `ui/*.ui` describe the same parameters the manifest already declares. + `AutoForm.from_rpc_method` covers the parameter groups today (proven); the + structure picker, quencher table and plots need a `quest.view.json` scheme + first — AutoForm has section types for tables, and `path_list`/`state_table` + look like the right primitives for the picker and the quencher grid. +2. **Plot through `chisurf/gui/chiplot/`.** The widget hand-builds pyqtgraph + plots for the decay, the trajectory and the autocorrelation; ChiSurf's own + tools use chiplot, so QuEst carrying a third plotting style is the same + duplication as the molecule viewer was. Tracked as `LAY-11`. +3. **Check ChiSurf tests run against the current `src`.** QuEst reaches ChiSurf + through a checkout (`CHISURF_ROOT`), and the `chisurf` conda environment's + *installed* copy predates AutoForm — so a ChiSurf test run there may be + exercising a stale package, exactly the trap that hid QuEst's own broken IMP + backend. Worth verifying on the ChiSurf side before either project relies on + the other's test results. + +# Rules + +1. `core/` MUST NOT import Qt, FastAPI, Click, or ChiSurf. +2. Presentation (CLI, web, GUI, plugin) MUST reach the domain through the facade + or the RPC client — never by importing `quest.lib.*` internals, and never by + importing another surface's private helpers. +3. Every operation is reachable under exactly one name. A second spelling is a + second contract to keep in step. +4. Local and remote results for the same method MUST have the same shape, and + failure MUST be distinguishable from success by the contract, not by sniffing + fields. +5. The plugin declares itself in a `manifest.json` that validates against the + host's schema — identity, entry points, RPC methods with their shapes. +6. Long-running work uses one mechanism to start, observe and cancel it. +7. The GUI may own its own windows and widgets; it MUST NOT own domain objects. + +# Migration order + +Each step is independently valuable and leaves the tree working: + +1. **Move project logic out of the CLI.** `_validate_project` and + `_template_project` become `quest.core.project.validate/template`; the CLI and + the web backend both call that. Removes the web backend's import of a private + CLI function (`LAY-01`). +2. **Add `backend/services.py`** with the method table above, wrapping the + facade. The FastAPI routes become thin adapters onto it (`LAY-03`). +3. **Add `manifest.json`** and point its `gui`/`cli`/`services` entry points at + the real ones, so ChiSurf discovers QuEst the same way it discovers every + other plugin (`LAY-05`). +4. **Give the GUI a client.** `TransientDecayGenerator` stops inheriting + `DonorDecay` and holds a client instead (`LAY-02`) — the largest step, and the + one that finally makes the Qt widget testable headlessly. +5. **Generate `quest.view.json` from the parameter catalog** (`LAY-06`). + +Progress is tracked in [assessment.md](assessment.md). diff --git a/okf/specs/structure-io.md b/okf/specs/structure-io.md new file mode 100644 index 0000000..2e45a2c --- /dev/null +++ b/okf/specs/structure-io.md @@ -0,0 +1,116 @@ +--- +type: Specification +title: One seam for structure input +description: Every structure enters QuEst through a single loader that yields an atom array; nothing downstream ever sees a filename or a format. +resource: quest/core/pdb.py +tags: [io, structure, pdb, cif, radii, architecture] +timestamp: '2026-07-27T00:00:00Z' +--- + +# The rule + +**One module turns a structure *source* into an atom array. Everything else +takes the array.** No other code opens a structure file, knows a format, or +decides a radius. + +A "source" is any of: a path to PDB/mmCIF, a four-character RCSB ID, bytes, or +an already-parsed structure. A caller says *what* it wants labelled; it never +says *how to read it*. + +# Why — three bugs from one cause, all found 2026-07-27 + +Every structure-input defect this project has hit is the same shape: something +downstream re-derived the structure instead of being handed it. + +1. **`imp_av.py` re-reads the file.** `build_imp_accessible_volume` calls + `IMP.atom.read_pdb(path)` rather than using the structure it was given, so a + coarse-grained project silently gets the **all-atom** volume — coarse and + all-atom measured byte-identical at 13883.805 ų. +2. **The same re-read is `read_pdb` only**, so `.cif` projects fail outright + under that backend ("No molecule read from file … mc4r_dimer.cif") while + working perfectly through `quest/core/pdb.py`, which handles mmCIF. One + format, two answers, depending on which backend you happened to pick. +3. **Two radius tables.** LabelLib was fed QuEst's Bondi-like radii (C 1.76, + N 1.65, O 1.40) and IMP.bff its own (C 2.10, N 1.85, O 1.71) — 19 % larger + carbon, **72 % more excluded volume**, and hence AVs differing by ~20 % + (14 500 vs 17 500 ų on 148l E15). That was misread for a whole session as an + *algorithmic* difference between the backends. It was an input difference. + The backends agree on where the dye is (centroids within 0.6 Å); they were + never asked the same question. + +The same argument applies to `fps.json`: the format is somebody else's standard +and it will change. One reader, one writer, one place to fix. + +# The seam + + load_structure(source, *, coarse=False, radii=..., selector=...) -> Atoms + +`Atoms` is the structured array QuEst already simulates on — `coord`, `radius`, +`atom_name`, `res_name`, `res_id`, `chain`, `mass`. Downstream consumers take +that array and nothing else: + +| consumer | takes today | must take | +|---|---|---| +| `AV` / LabelLib backend | a `Structure` | the array | +| `imp_av.py` | **a filename** | the array | +| `IMP.bff.av.compute_av` | already arrays ✔ | — | +| quenching / diffusion grids | a `Structure` | the array | + +`compute_av`'s signature (`atoms_xyz`, `atoms_vdw`, `source_xyz`) is the model +to copy: a function that takes coordinates *cannot* re-read a file, miss a +coarse-graining, or disagree about a format. + +# Reading is IMP's job; radii are QuEst's decision + +Two separable things that got conflated: + +- **Parsing** — use IMP. It handles mmCIF, altlocs, insertion codes and hetero + records, and it is maintained. QuEst's own parser should go. +- **Radii** — inherit IMP's. **Decided 2026-07-27 and implemented**: the reader + takes `IMP.core.XYZR(p).get_radius()` off the particle IMP decorated, and + `quest/core/elements.py` is gone. (An earlier draft of this spec argued the + opposite — keep a QuEst table because IMP's are ~19 % larger than the + Bondi-like values the FPS convention assumes. That was overruled: one source + of radii matters more than matching the older convention, and having two was + what made the backends look like they disagreed.) + + The cost is real and measured: IMP's are CHARMM-style (C 2.10 Å against + 1.76), so accessible volumes shrink and **only 43 of 151 CB sites on 148l + chain E remain labelable**. Numbers are no longer comparable to published FPS + work computed at Bondi radii. Both backends are fed the same array, so the + backend choice is availability only — IMP.bff preferred, LabelLib where + IMP.bff is not built (Windows). + +**Decided 2026-07-27: HETATM and water are not stripped.** A bound ligand +occludes the dye, so the loader keeps IMP's full atom set rather than QuEst's +ATOM-only selector — 1363 atoms on 148l against 1322, the extra 63 being `FGA`, +`API`, `DAL`, `MUB`, `NAG` and `BME`. Not yet implemented; see +[handover](../handover.md). + +One thing to settle while implementing it: IMP's *default* read already omits +water and hydrogens (`NonWaterNonHydrogenPDBSelector` returns the same 1363), so +passing no selector satisfies "keep the ligands". Keeping crystallographic +waters as steric obstacles as well is a stronger and more unusual choice — +mobile solvent does not normally occlude a dye — and needs +`NonHydrogenPDBSelector` (1503 atoms). Measure both. + +# Done, and what remains + +Done 2026-07-27: + +- `quest/core/elements.py` **deleted** (271 lines) — radii and masses come off + the IMP particle, and the `assignCharge` path it also served had no caller. +- `quest/core/structure.py` 623 → ~345 lines: RMSD, clustering and the torsion + subsystem had no readers. +- `imp_av.py` takes the atom array; its file handling is gone, which fixed both + the discarded coarse-graining and the mmCIF failure above. +- The acceptance test passed: with identical radii the two backends converge to + a **0.90 ratio** on 148l E36, centroids within 0.5 Å. Before, with a table + each, it was 0.78 — and that gap was misread as algorithmic. + +Remaining: + +1. The loader still has no single `load_structure(...)` entry point; `AV` and + the quenching grids still take a `Structure` rather than an array. +2. Same treatment for `fps.json`: one reader, one writer. +3. The decisions in [handover](../handover.md) — none implemented. diff --git a/okf/subsystems/accessible-volume.md b/okf/subsystems/accessible-volume.md new file mode 100644 index 0000000..511bed4 --- /dev/null +++ b/okf/subsystems/accessible-volume.md @@ -0,0 +1,79 @@ +--- +type: Subsystem +title: Accessible volume +description: AV enumeration, the IMP.bff/LabelLib backend split, and the derived slow-factor and quenching-rate grids. +resource: quest/lib/fps/__init__.py +tags: [accessible-volume, av, grid, numba, labellib, imp] +timestamp: '2026-07-26T00:00:00Z' +--- + +# What the AV is + +The set of positions the dye **centre** can occupy: reachable from the +attachment atom along a linker of `linker_length` × `linker_width`, without the +dye sphere (`radius1`, or `radius1..3` for AV3) overlapping protein atoms. +Represented as a cubic density grid of spacing `dg` plus the corresponding point +cloud. `quest/lib/fps/__init__.py::AV` owns it. + +# Backend selection + +`resolve_av_backend(preference)` decides, from the `av_backend` argument, else +the `QUEST_AV_BACKEND` environment variable, else `"auto"`: + +| Value | Behaviour | +|---|---| +| `"labellib"` | `calculate1R` (AV1) / `calculate3R` (AV3), thin wrappers over `ll.dyeDensityAV*` | +| `"imp_bff"` | `quest/lib/imp_av.py::build_imp_accessible_volume` — **currently broken**, see below | +| `"auto"` (default) | LabelLib if available, else IMP.bff, else `RuntimeError` | + +An unavailable or misspelled backend raises immediately, naming what *is* +usable, rather than failing later with an empty volume. `AV.av_backend` records +which one ran, and `verbose=True` prints it. + +`simulation_type='AV3'` only takes effect on the LabelLib path. + +**LabelLib is preferred on purpose.** It is the implementation QuEst has always +actually run — every environment without a compiled `IMP.bff` fell back to it — +and the one the tests pin. Preferring IMP.bff silently meant that in the one +environment where it *is* present (`arm64`), QuEst selected a backend that +returns an empty accessible volume; 34 tests failed the first time the suite ran +there. See [references/known-issues.md](/references/known-issues.md). + +> The whole dance already exists as `IMP.bff.av.compute_av`, with the same +> ordering, an explicit `backend=` override, and maintenance against IMP's +> current API. QuEst should call it rather than carry a second copy — +> [specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md). + +An empty AV raises with a diagnostic naming the residue ("might be buried inside +the protein"), because a zero-point volume otherwise fails much later and much +less legibly. + +# The three grids + +`AV.calc_slow_av` derives everything the diffusion stage needs, in one place: + +| Grid | Built by | Meaning | +|---|---|---| +| `density_fast` | AV backend | the accessible volume itself | +| `density_slow` | `subav` | the accessible **contact** volume (ACV) — voxels within `slow_radius` of a slow centre | +| `slow_factor_grid` | `_slow_factor_grid` | per-voxel diffusion scaling; overlapping centres **multiply** | +| `k_quench_grid` | `_additive_factor_grid` | per-voxel PET rate; overlapping centres **add** | + +`slow_centers` and `quench_centers` are passed separately, with their own radii, +so stickiness can sit on the residue while quenching sits on its redox-active +moiety ([quenching-model.md](quenching-model.md)). + +# Kernels + +All hot loops are `@njit` in `quest/lib/fps/__init__.py`, most with +`parallel=True`: `_density2points`, `_subav`, `_slow_factor_grid`, +`_additive_factor_grid`, `_center_grid_indices`, `_ran_dist` (RDA sampling), +`_asa` (solvent accessibility), and the trajectory kernels `_simulate_traj` / +`_simulate_traj_grid`. `tests/test_grid_kernels.py` pins their equivalence and +behaviour — that is the file to extend when a kernel changes. + +# FRET distance observables + +`RDAMeanE` (⟨R_DA⟩_E via a Förster-averaged sample), `RDAMean` and `dRmp` +(mean-position distance) sample pairs of AV point clouds. `R0` comes from the +project's `fret.R0_matrix`. diff --git a/okf/subsystems/cli.md b/okf/subsystems/cli.md new file mode 100644 index 0000000..c187569 --- /dev/null +++ b/okf/subsystems/cli.md @@ -0,0 +1,61 @@ +--- +type: Subsystem +title: CLI +description: quest simulate/scan/template/validate/gui, dotted-path overrides and grid sweeps. +resource: quest/cli.py +tags: [cli, click, batch] +timestamp: '2026-07-26T00:00:00Z' +--- + +# Commands + +```bash +quest template --with-fret > project.quest.json # emit a valid starter +quest validate -p project.quest.json # check required keys + structure +quest simulate -p project.quest.json -o decay.csv # one run +quest scan -p project.quest.json -l fps.json -o scan.json # one run per labeling site +quest gui # launch the Qt GUI +``` + +Entry point `quest = quest.cli:cli` (Click group). Output format follows the +`-o` extension: `.csv` or `.json`. + +# Overrides and sweeps + +- `--set a.b.c=value` — override any project field by dotted path. Values are + parsed as JSON when possible, so `--set fret.enabled=true` and + `--set attachment.residue=42` do the right thing. +- `--grid a.b.c=v1,v2,v3` — sweep. Multiple `--grid` options form the + **Cartesian product**, and each run's output path is tagged with the values + that produced it (`_resolve_output_path` / `_sanitize_tag_value`). + +`_set_path`, `_clone_with_overrides`, `_expand_grid`, `_cartesian` and +`_build_runs` implement this; they operate on the plain project dict and are the +reason the [project schema](/architecture/project-schema.md) keeps dotted paths +addressable. + +# `scan` + +Takes a project **and** an `fps.json` labeling file, then simulates every +position in it, reporting per site: lifetime, quantum yield, contact fraction, +AV and contact volumes, contact-to-free ratio, and the dominant quencher with +its `quench_rate_fraction` (from `top_quenchers`). Progress is a `tqdm` bar. + +Two design points: + +- **Failures are data, not exits.** A site that raises is recorded with + `status: "failed"` and the error string, with the metric fields present and + null. A buried residue must not abort a 300-site scan. +- **`save_outputs=False`.** The scan reads only scalars and `aa_residence`; the + job directory would dominate the runtime + ([job-artefacts.md](/architecture/job-artefacts.md)). + +`tests/test_scan_reporting.py` pins both the quencher attribution and the +failure diagnostics. + +# Validation + +`_validate_project` is shared with the web backend, so the browser and the +terminal agree on what a valid project is. It checks the required keys, resolves +the structure (path **or** PDB ID), requires a donor dye with `D`, and sanity +checks `t_max > t_start`. diff --git a/okf/subsystems/core-api.md b/okf/subsystems/core-api.md new file mode 100644 index 0000000..c7d62a0 --- /dev/null +++ b/okf/subsystems/core-api.md @@ -0,0 +1,84 @@ +--- +type: Subsystem +title: Core service layer +description: quest/core.py and the quest.api re-export — project loading, simulate_project, DecaySimulationResult, residue-resolved analysis. +resource: quest/core.py +tags: [api, service-layer, headless] +timestamp: '2026-07-26T00:00:00Z' +--- + +# The public surface + +```python +from quest.api import ( + load_project, build_donor_from_project, simulate_project, + DecaySimulationResult, top_quenchers, + template_project, validate_project, ProjectValidationError, + is_pdb_id, download_pdb_id, resolve_structure_path, + load_fps_json, normalize_to_fps_positions, run_fps_scan, +) +``` + +Neighbouring domain modules, reachable directly: + +| Module | Owns | +|---|---| +| `quest/project.py` | The project document: `template_project`, `validate_project`, `ProjectValidationError`, `REQUIRED_TOP_LEVEL_KEYS` | +| `quest/scan.py` | One labeling site: `site_project`, `simulate_site` (never raises), `scan_positions` | +| `quest/settings/` | The shipped data: `parameter_catalog()`, `dye_repository()`, `save_dye()`, `quenching_defaults()`, resolved package-relative | +| `quest/structure_info.py` | `structure_metadata(path)` — chains, residues and atom names a dye could attach to (PDB and mmCIF) | +| `quest/jobs.py` | Past runs: `list_jobs`, `job_summary`, `read_job`, `archive_job`, and `is_job_id` (a run is a UUID directory) | +| `quest/imp_tricks.py` | `enable_imp_tricks()` — splice an imp-tricks checkout into the live interpreter | +| `quest/backend/` | The RPC surface: `ServiceDispatcher`, `InProcessClient`, `register_services`, `result_payload` | + +`quest/api.py` is a re-export shim; the implementation is `quest/core.py` +(plus `structure_fetch.py` and `lib/fps_json.py`). Import from `quest.api` in +new code — see [architecture/surfaces.md](/architecture/surfaces.md). + +None of it touches Qt, so it is safe in notebooks, servers and CI. + +# The three calls that matter + +| Call | Does | +|---|---| +| `load_project(path)` | JSON → mutable dict. Nothing more; there is no project class | +| `build_donor_from_project(project, pdb_path=None)` | dict → configured `DonorDecay`. This is where the top-level-vs-dye-entry precedence lives | +| `simulate_project(project, …)` | The whole pipeline; returns `DecaySimulationResult` | + +`simulate_project` keyword arguments worth knowing: `nbins`, `tac_range`, +`mode`/`n_curves`/`dt_tac`/`n_tac` (see [photon-decay.md](photon-decay.md)), +`project_dir`, and `save_outputs` +([architecture/job-artefacts.md](/architecture/job-artefacts.md)). + +# `DecaySimulationResult` + +A dataclass, not a dict: + +- decay — `time`, `donor_counts`, `fret_counts` +- scalars — `quantum_yield_donor`, `quantum_yield_fret`, `fret_efficiency`, + `collisions_fraction`, `lifetime_donor`, `av_volume`, `contact_volume`, + `contact_to_free_ratio` +- trajectory — `trajectory_distance_to_mean`, `trajectory_time_ns`, + `trajectory_autocorr`, `trajectory_autocorr_lag_ns` (thinned for display) +- clouds — `trajectory_points`, `av_points`, `acv_points` (thinned) +- provenance — `project`, `job_id` +- attribution — `aa_residence` ([quenching-model.md](quenching-model.md)) + +# Analysis helpers in `core.py` + +- `calculate_aa_quenching`, `calculate_aa_residence`, `_residue_type_metrics`, + `aa_residence_from_model` — the residue-resolved statistics. +- `autocorr_to_tau_window` — autocorrelates the full distance-to-mean series and + truncates to a `tau0`-scaled lag window (correlate everything, thin only what + is plotted). +- `sampled_density_grid`, `diffusion_coefficient_grid`, `write_mrc` — the + voxel outputs. +- `_subsample_points` — the one place display thinning happens. + +# FPS-JSON scanning + +`quest/lib/fps_json.py` reads an `fps.json` labeling file +(`load_fps_json`), normalises its entries to positions +(`normalize_to_fps_positions`) and runs one simulation per site +(`run_fps_scan`). This is what `quest scan` and the web `/api/scan` drive; +they run with `save_outputs=False`. diff --git a/okf/subsystems/dye-diffusion.md b/okf/subsystems/dye-diffusion.md new file mode 100644 index 0000000..667a7af --- /dev/null +++ b/okf/subsystems/dye-diffusion.md @@ -0,0 +1,71 @@ +--- +type: Subsystem +title: Dye diffusion +description: SimulateDiffusion and DonorDecay — the Brownian walk inside the AV and the model object that owns a run. +resource: quest/lib/tools/dye_diffusion/dye_diffusion.py +tags: [brownian-dynamics, trajectory, donor-decay, numba] +timestamp: '2026-07-26T00:00:00Z' +--- + +# `DonorDecay` — the model object + +One instance owns a whole simulation: structure, AV, diffusion, photons, and the +optional FRET channel. `update_all()` runs the sequence: + +1. `calc_av()` — the accessible volume +2. `_calc_slow_av()` — the ACV, the slow-factor grid, the k_quench grid +3. `simulate_diffusion()` — the Brownian walk +4. `diffusion.critical_distance = …` — resolve which frames count as contact +5. `calc_photons()` — the decay + +If a Qt application happens to be running it drives a progress dialog; headless +it is a plain sequence. `update_all` deliberately does **not** call +`gc.collect()`: the grids it replaces are refcounted NumPy buffers freed on +rebind, and a forced collection cost ~20 ms per run — which a residue scan pays +hundreds of times. + +`TransientDecayGenerator` (the Qt widget) *inherits* `DonorDecay`, so the GUI and +the headless path share one model rather than two implementations. + +# `SimulateDiffusion` — the walk + +Constructed from the `AV`, it runs `fps.simulate_traj` and keeps: + +- `_traj` — the (n_frames, 3) walk; +- `k_quench` — the per-frame quenching rate, read out of the AV's `k_quench` + grid along the trajectory; +- `quenched` / `_is_quenched` — the boolean contact trace; +- `distance_to_mean`, `mean` — the observables the trajectory plots use. + +Two kernels back it: `_simulate_traj_grid` (a spatial slow-factor grid, the +amino-acid stickiness mode) and `_simulate_traj` (a scalar slow factor over a +binary slow-AV, the older mode). `DonorDecay.simulate_diffusion` picks the grid +variant whenever `stickiness_mode == 'amino_acid'` and the AV carries a +`slow_factor_grid`. + +When `k_quench` is available the contact trace is derived from it +(`k_quench > 0`) rather than from a distance loop, which keeps the decay and the +contact statistics consistent with the grids by construction. + +# Reproducibility and parallelism + +- `random_seed` in the project (or on the donor dye) seeds the walk. It is + honoured by both trajectory kernels. +- The photon trace uses a **different but derived** seed + (`_photon_seed`, base + 7919 mod 2³¹−1) so the photon draws do not replay the + same sequence as the trajectory they score. With no seed set it returns + `None`, which keeps the faster multi-threaded photon kernel in play. +- `parallel_trajectories` (project key, `-1` = all cores, capped by + `MAX_PARALLEL_TRAJECTORIES = 8`) runs independent walks concurrently. +- `_preserved_numba_environment()` exists because numba resolves settings such + as `NUMBA_NUM_THREADS` **once at import time** — the context manager keeps a + temporary change from leaking into the rest of the process. + +`tests/test_simulation_performance.py` covers the scan fast path and seeded +reproducibility; treat it as the guard when touching any of the above. + +# Coarse graining + +`coarse_grained: true` (project or donor dye) makes `DonorDecay.structure` build +its `Structure` with `make_coarse=True` — fewer atoms in the steric test, faster +AV, coarser contacts. Covered by `tests/test_coarse_grained.py`. diff --git a/okf/subsystems/gui.md b/okf/subsystems/gui.md new file mode 100644 index 0000000..ab6d72e --- /dev/null +++ b/okf/subsystems/gui.md @@ -0,0 +1,153 @@ +--- +type: Subsystem +title: Qt GUI +description: The desktop form — generated from the parameter catalog, rendered by ChiSurf's AutoForm, bound to a project dict. +resource: quest/gui/ +tags: [qt, gui, autoform, view-spec] +timestamp: '2026-07-27T00:00:00Z' +--- + +# What it is + +`quest/gui/` is four small files and one generated one: + +| file | what it is | +|---|---| +| `form_model.py` | `ProjectFormModel` — the state. **Qt-free.** | +| `quest.view.json` | the layout. **Generated**; never hand-edit. | +| `generate_view_spec.py` | the generator, run by hand like `doc/generate_parameter_docs.py`. | +| `dye_widget.py` | ~130 lines: puts an AutoForm in a `QWidget`. | +| `app.py` | the standalone window and its menu bar. | +| `autoform_panel.py` | renders one RPC method's parameters from `manifest.json`. | + +Entry points: `quest gui` (CLI subcommand), the `cs.quest` gui-script, and +ChiSurf's `quenching_estimator` plugin, which puts `TransientDecayGenerator` in +a `QMainWindow` and connects its File menu to `onLoadPDB`, `onSaveProject` and +`onLoadProject`. + +# The form's state is a project — there is no conversion + +`ProjectFormModel` presents a project dict as flat attributes. `model.tau0 = 3.5` +writes `project["tau0"]`; `model.acceptor_chain = "B"` writes +`project["fret"]["dyes"][1]["attachment"]["chain"]`. :data:`FIELD_PATHS` is that +map, and the attribute names are the catalog's own paths, shortened where they +hurt (`av_parameter.` → `av_`, `fret.dyes.1.` → `acceptor_`). + +This is the whole reason the migration was worth doing. The old widget kept its +state in ~40 Qt controls and converted to a project on the way out +(`to_project_dict`) and back on the way in (`load_project_dict`) — two +hand-written directions, and **the conversion is where the GUI drifted away from +the CLI**. It once shipped an entirely different quenching chemistry. There is +now no conversion step in which to drift: what the form saves is byte-for-byte +what `quest simulate` runs and what the web UI posts. + +Two consequences worth knowing: + +- The model imports no Qt, so it is testable — and usable — headless. + `tests/test_form_model.py` runs in the *base* environment, which has no Qt + binding at all, and a subprocess guardrail asserts importing it pulls none in. +- Save/load is `save_project` / `load_project`, writing plain project JSON. + AutoForm's generic `save_state`/`load_state` also work, but the project file + is the one that means something to another surface. + +# The layout is generated from the parameter catalog + +`quest/settings/parameter_catalog.json` already named every input by its project +path and carried its label, type, unit and description; `doc/parameters.md` and +the web UI were generated from it. `generate_view_spec.py` now generates the Qt +form from it too, so a parameter is described **once**: + + python -m quest.gui.generate_view_spec + +What the generator derives: one panel per catalog *category*, one field per +parameter, labels with units, descriptions as tooltips. What is authored in the +generator: the arrangement — which panels share a dock, where the 3D view and +the plots sit, what the toolbar does. Those are judgements about a form, not +facts about a parameter. + +One spec is generated per language — `quest.view.json`, +`quest.view.de.json`, `quest.view.fr.json` — and `ProjectFormModel(locale=…)` +picks the matching one ([subsystems/i18n.md](/subsystems/i18n.md)). + +`tests/test_view_spec.py` regenerates in memory and fails if any committed file +differs, and `tests/test_form_model.py` fails if the catalog documents a +parameter the form does not bind (or the reverse). A new input therefore cannot +reach the docs and the web UI while quietly missing from the desktop. + +Single-column panels throughout: the parameter dock is narrow by default and +QuEst's labels are long ("Donor diffusion coefficient (Ų/ns)"), so two columns +clipped the field being typed in. + +# QuEst owns no Qt widgets and no plotting code + +Everything the form draws is an AutoForm section type: + +- the structure picker — `value` of `kind: "file"`; +- the quencher table — an editable `table` over `quencher_rows`, writing back + through `update_quencher_cell`; +- the 3D view — the `chimol` custom section, bound to `preview_models`; +- the three plots (decay, trajectory, autocorrelation) — `plot` sections, + rendered through ChiSurf's `chiplot`. QuEst supplies only series data + (`decay_series`, `trajectory_series`, `autocorrelation_series`). + +That closed `LAY-06`, `LAY-10` and `LAY-11` in one change, and deleted: +`dye_diffusion2.ui`, `pdb_widget.ui`, `ui/av_property.ui`, `ui/dye_diffusion.ui`, +`ui/dye_diffusion3.ui`, `widgets.py` (`PDBSelector`), `dye_diffusion.json` and +`ui/rescource_rc.py` (98 kB of generated base64). The window icon survives as a +plain file, `quest/gui/icons/dye-diffusion.ico`. + +# The quencher table edits the real chemistry + +`LAY-10` was that the Qt table bound to `DonorDecay.quencher` +(`{residue: {atoms, kQ}}`), which has no per-residue contact radius and no +per-residue stickiness — so the desktop could not express what +`amino_acid_interactions` does, and ran `stickiness_mode="global"` while every +other surface ran `"amino_acid"`. The table now edits `amino_acid_interactions` +itself: kQ, contact radius, quenching atoms and slow factor, per residue. There +is no second shape left to disagree. + +A blank contact radius means **null** — "fall back to `critical_distance`" — not +zero, which would switch quenching off. Bad input in a cell is dropped rather +than raised: the user is mid-typing, and a traceback out of a cell editor is not +a useful way to say "not a number". + +# Running goes through the service layer + +The ▶ button calls `ProjectFormModel.run_simulation()`, which calls +`quest.api.simulate_project(project, save_outputs=False)` — the same entry point +the CLI and the web backend use. The form contributes no physics of its own; +that is the rule the old GUI broke. + +`save_outputs=False` keeps a GUI run from writing `jobs//` into whatever +directory the app started in. That flag used to *also* suppress the thinned +trajectory and point clouds, so the desktop silently had no plots to draw; +`render_data` is now a separate parameter (see +[simulation-pipeline](/architecture/simulation-pipeline.md)). + +The run is synchronous and blocks the form — `LAY-07`, still open. + +# ChiSurf is required for the desktop surface, and only for it + +QuEst's Qt form is rendered by the host. Without a ChiSurf checkout there is no +form: `dye_widget.py` shows a panel saying so, because there is no second +in-tree renderer to fall back to and an empty window explains nothing. The host +is found through `quest.chisurf_host.enable_chisurf()`, so no caller has to set +`PYTHONPATH`. + +This does **not** weaken the optional-Qt rule. Qt lives in `quest/gui/` and +nowhere else; the domain (`quest/core/`), the service layer and the web backend +import no Qt binding — checked by a subprocess guardrail in +`tests/test_service_layer.py`. That is what lets the CLI, the API and the web +backend run in the base environment, where **PyQt5 is not installed**. + +Practical consequences: + +- The GUI cannot be launched or screenshotted from the *default* interpreter; + the `arm64` and `chisurf` conda environments have PyQt5 and import quest from + this tree ([workflows/testing.md](/workflows/testing.md)). +- `pytest` needs `-p no:pytest-qt` where no binding exists, because the plugin + aborts collection. +- `quest/gui/__init__.py` resolves the Qt-bearing names lazily, so + `from quest.gui.form_model import ProjectFormModel` works with no Qt at all. +- A change that makes a `qtpy` import unconditional breaks the headless + surfaces. Do not. diff --git a/okf/subsystems/i18n.md b/okf/subsystems/i18n.md new file mode 100644 index 0000000..6264dae --- /dev/null +++ b/okf/subsystems/i18n.md @@ -0,0 +1,126 @@ +--- +type: Subsystem +title: Translations +description: English, German and French — translated once in the parameter catalog's locale files, consumed by the docs, the Qt form and the web UI. +resource: quest/i18n.py +tags: [i18n, locales, catalog, gui, webui, docs] +timestamp: '2026-07-27T00:00:00Z' +--- + +# Why this is small + +QuEst describes each parameter exactly once, in +`quest/settings/parameter_catalog.json`, and everything a user reads is +generated from it: `doc/parameters.md`, the web UI's labels and help badges, and +— since the AutoForm migration — the Qt form. Translating the catalog therefore +translates all three. There is no gettext, no `.po` files and no per-surface +dictionary, because there is no per-surface text. + +# Where the strings live + +`quest/settings/locales/.json`, beside the catalog they translate: + +| key | holds | +|---|---| +| `parameters` | per catalog path, a translated `label` and `description` | +| `categories` | the catalog's category names | +| `ui` | everything that is *not* a parameter: panel titles, buttons, plot axes, dialog captions, the help text, the doc-page chrome, the web chrome | + +`en.json` carries only `ui` and `categories` — the catalog itself *is* English, +so repeating it would create a second English to drift from the first. + +Fallbacks are per key, in both directions: an untranslated parameter keeps its +English text, an unknown `ui` key renders as the key. A partial translation is +useful and must never be an error. + +# Choosing a language + +`quest.i18n.resolve_locale()` prefers an explicit argument, then `QUEST_LOCALE`, +then the operating system's language, then English. The system language is read +from `LC_ALL` / `LC_MESSAGES` / `LANG` / `LANGUAGE` directly — *not* through +`locale.getdefaultlocale()`, which is removed in Python 3.15 and only read those +anyway; `locale.getlocale()` is no substitute, as it reports the current locale, +`(None, None)` until something calls `setlocale`. `LANG=C` means "no +localisation", not "a language", so it yields English. `de_DE.UTF-8` normalises to +`de`; an unknown code resolves to English rather than raising — a user with +`LANG=cs_CZ` wants QuEst to start, not to explain itself. + +**The backend does not do this.** `/api/parameter-catalog` and +`quest.parameter_catalog` default to *English*, not to the server's locale: a +shared backend must not answer differently depending on how the machine it runs +on happens to be configured. The browser asks for a language explicitly. + +# What each surface does + +**Qt form.** One generated view spec per language — `quest.view.json`, +`quest.view.de.json`, `quest.view.fr.json` — written by +`python -m quest.gui.generate_view_spec`. `ProjectFormModel(locale=…)` picks the +matching file, falling back to English if that language's spec was never +generated. `TransientDecayGenerator(locale=…)` and `QuEstWindow(locale=…)` pass +it through; with nothing passed, `QUEST_LOCALE` decides. + +**Docs.** `python doc/generate_parameter_docs.py` writes `doc/parameters.md` +plus `doc/parameters.de.md` and `doc/parameters.fr.md`, including the page +chrome (headings, table columns). + +**Web.** `/api/parameter-catalog?locale=de` returns the translated catalog and +`/api/i18n?locale=de` returns the available languages plus the `ui` strings. +The React context holds the locale, refetches both when it changes, remembers +the choice in `localStorage`, and starts from `navigator.language` when there is +a translation for it. The header has the selector. + +In English the web UI keeps its **hand-written** field labels (`t max [ns]` +rather than `Simulation time`): they are terser than the catalog's prose and +were chosen for that layout. In any other language there is no hand-written +label to prefer, so `fieldLabel()` uses the catalog's translation. + +# What is *not* translated, deliberately + +- **Units.** Å is Å in every language. A translated unit symbol would be wrong. +- **Project keys.** Descriptions name real keys (`critical_distance`, + `slow_factor`); those survive translation, and a test checks it. +- **The citation.** It is copied verbatim into a manuscript. +- **The project JSON.** A project saved in German is byte-identical to the same + project saved in English — pinned by a test. Language changes what a user + reads, never what QuEst computes. + +# Table headers get their own strings + +The quencher table uses short `table.*` keys rather than the catalog's form +labels. A column header has a column's worth of room, and *Löschrate kQ (1/ns)* +does not fit in it; the full wording stays as the tooltip, where it is readable. +This was found by rendering the German form and looking at it — the assertions +were all green. + +# Gotchas + +- **Locale files are cached per process** (`lru_cache` in `quest/i18n.py`). + Editing one while uvicorn is running has no effect until it restarts — the + same class of trap as [uvicorn not reloading](/workflows/testing.md). Tests + that write locale files call `i18n.clear_cache()`. +- **Regenerate after editing.** A locale file edit is not visible in the Qt form + or the docs until `python -m quest.gui.generate_view_spec` and + `python doc/generate_parameter_docs.py` have run. `tests/test_view_spec.py` + fails when a committed spec is stale, so this cannot be forgotten silently. + +# Adding a language + +1. Copy `quest/settings/locales/de.json`, translate `parameters`, `categories` + and `ui`, set `locale` and `name` (the name **in that language** — a picker + that says "German" is unreadable to the reader who needs it). +2. Run the two generators above. +3. `pytest tests/test_i18n.py tests/test_view_spec.py`. The completeness tests + are parametrised over whatever locale files exist, so the new language is + checked automatically: every parameter translated, no invented ones, the `ui` + key set identical to English, `{placeholders}` preserved. + +# Coverage today + +Complete: every parameter label and description, every category, the whole Qt +form, the generated docs, and the web UI's parameter labels, help badges, title, +tagline, tabs, sidebar headings and language selector. + +Still English in the browser: the plot card titles ("Decay Curve", "Quenching by +residue type"), the derived-quantity row names, the empty-state messages and the +toolbar buttons. These are hardcoded in the React components; `t()` is in the +context and wiring them is mechanical, one key at a time. diff --git a/okf/subsystems/index.md b/okf/subsystems/index.md new file mode 100644 index 0000000..fdbdb7b --- /dev/null +++ b/okf/subsystems/index.md @@ -0,0 +1,13 @@ +# Subsystems + +* [Core service layer](core-api.md) - `quest/core.py` and the `quest.api` re-export: project loading, `simulate_project`, `DecaySimulationResult`, residue-resolved analysis, plus the `project`/`scan`/`settings` domain modules. +* [RPC service layer](rpc.md) - `quest/backend/`: the named methods every surface shares, the result envelope, and how a host application registers them. +* [Accessible volume](accessible-volume.md) - AV enumeration, the IMP.bff/LabelLib backend split, and the derived slow-factor and quenching-rate grids. +* [Dye diffusion](dye-diffusion.md) - `SimulateDiffusion` and `DonorDecay`: the Brownian walk in the AV and the model object that owns a run. +* [Quenching model](quenching-model.md) - Residue-type-specific PET quenching: contact radii, quenching centres, additive rates, multiplicative stickiness, and the per-type attribution. +* [Photons & decay](photon-decay.md) - The numba photon-trace kernels and the photon/curve decay modes. +* [Structure I/O](structure-io.md) - PDB/CIF/PQR parsing, the `Structure` object, coarse-graining, and PDB-ID fetching. +* [CLI](cli.md) - `quest simulate/scan/template/validate/gui`, dotted-path overrides and grid sweeps. +* [Web UI](webui.md) - The FastAPI backend, the Next.js frontend, and the Electron shell. +* [Qt GUI](gui.md) - The legacy desktop GUI and its optional-Qt story. +* [Translations](i18n.md) - English, German and French, translated once in the catalog's locale files and consumed by the docs, the Qt form and the web UI. diff --git a/okf/subsystems/photon-decay.md b/okf/subsystems/photon-decay.md new file mode 100644 index 0000000..c26fe3b --- /dev/null +++ b/okf/subsystems/photon-decay.md @@ -0,0 +1,76 @@ +--- +type: Subsystem +title: Photons & decay +description: The numba photon-trace kernels and the two decay modes (photon, curve). +resource: quest/lib/tools/dye_diffusion/photon.py +tags: [monte-carlo, photons, decay, tcspc, numba] +timestamp: '2026-07-26T00:00:00Z' +--- + +# From trajectory to decay curve + +The excited dye de-excites at rate `1/tau0 + k_quench(t)`, where `k_quench` is +read frame by frame off the trajectory. Everything in +`quest/lib/tools/dye_diffusion/photon.py` is a numba kernel over that array. + +| Function | Use | +|---|---| +| `simulate_photon_trace_rate` | The production path — a per-frame **rate** trace; used by `DonorDecay.calc_photons` | +| `simulate_photon_trace_kQ` | Boolean collision trace × a single `kQ` | +| `simulate_photon_trace` | Legacy binary-quenching variant | +| `simulate_decay_quench` | Integrates a decay histogram over `n_curves` — the "curve" mode | + +`_simulate_trace_rate` is `parallel=True`; `_simulate_trace_rate_seeded` is the +sequential, reproducible variant, chosen when the project sets a `random_seed`. +The walk starts at a random frame offset (`_photon_rate_walk`) so photons sample +the trajectory rather than always its beginning. + +# Two decay modes + +`simulate_project(mode=…)`, or `project["decay_mode"]`: + +- **`"photon"`** (default) — Monte-Carlo photon trace, histogrammed into + `n_bins` over `tac_range`. The donor quantum yield is the fluorescent fraction + of the absorbed photons. +- **`"curve"`** — legacy accumulation. `_curve_decay_from_model` integrates the + decay over `n_curves` curves at bin width `dt_tac` with `n_tac` bins; when + `dt_tac` and `n_tac` are both given and the caller did not override + `tac_range`, the range is derived as `(0, dt_tac × n_tac)`. `n_curves` also + scales the effective `n_photons`. + +Curve mode falls back to the plain histogram if the model has no usable +diffusion object — a deliberate degradation, not an error path. + +# FRET channel + +When `fret.enabled`, `DonorDecay` computes the acceptor AV and then a **rate per +trajectory frame** (`calc_fret_rate_trace`): + +``` +k_FRET(t) = (1/tau0) · ⟨ (R0 / |r_D(t) − r_A|)^6 ⟩_A +``` + +The donor is resolved in time — which is the reason its diffusion is simulated +at all — and the acceptor is averaged over its accessible volume, i.e. the +fast-acceptor limit (not valid for an immobilised acceptor). Quenching and +transfer are parallel de-excitation channels, so `calc_photons_fret` adds +`k_quench + k_fret` frame by frame and feeds the same photon kernel as the donor +channel. + +Two things this fixed, both silent before: the rate was a **single scalar** from +⟨R_DA⟩_E over the static clouds, making the FRET channel independent of the +diffusion; and a missing acceptor produced a donor-only result inside a bare +`except`. It now raises. + +`fret_efficiency` has **one** definition, `1 − QY_DA/QY_D`, taken from the two +simulated decays. `rda_mean_e()` remains available as a *diagnostic* distance — +what a FRET-efficiency measurement would report — but nothing in the simulation +consumes it. + +Both clouds hold dye *centres* and can overlap, where `(R0/r)^6` would diverge; +the distance is floored at the sum of the two dye radii, since the spheres +cannot interpenetrate. + +The kernel (`quest/lib/fps/fret_rate_trace`) is general fluorescence machinery +and is slated to move into imp-tricks — +[specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md), `DUP-03`. diff --git a/okf/subsystems/quenching-model.md b/okf/subsystems/quenching-model.md new file mode 100644 index 0000000..205d6bc --- /dev/null +++ b/okf/subsystems/quenching-model.md @@ -0,0 +1,91 @@ +--- +type: Subsystem +title: Quenching model +description: Residue-type-specific PET quenching — contact radii, quenching centres, additive rates, multiplicative stickiness, and per-type attribution. +resource: quest/lib/tools/dye_diffusion/dye_diffusion.py +tags: [pet, quenching, amino-acids, physics] +timestamp: '2026-07-26T00:00:00Z' +--- + +# Four numbers per residue type + +Quenching is resolved per residue *type*, through the +`amino_acid_interactions` table in the project (editable per dye in the web UI +under *Adv. Settings -> Amino-acid specific quenching*): + +| Field | Meaning | +| --- | --- | +| `kQ` | Quenching rate, 1/ns, applied while the dye is in contact | +| `quench_radius` | Contact radius, Å, from the **dye centre** to the residue's quenching centre; `null` inherits the project-wide `critical_distance` | +| `quench_atoms` | Atom names whose centroid defines the **quenching centre** | +| `slow_factor` | Diffusion scaling in [0, 1] — unspecific stickiness near the residue | + +Defaults live in `dye_diffusion.py` as `DEFAULT_QUENCHER_ATOMS`, +`REFERENCE_PET_QUENCHING` and `default_amino_acid_interactions()`. + +# The quenching centre is the redox-active moiety, not CB + +`DEFAULT_QUENCHER_ATOMS` puts the quencher on the group that actually mediates +electron transfer: the indole ring for TRP, the phenol ring for TYR, the +imidazole ring for HIS, SD for MET, SG for CYS. For tryptophan this moves the +centre ~3.3 Å away from CB — at contact distances of a few Å that is not a +detail. Residues with no known PET-active group fall back to a side-chain stub +so a user-supplied rate still has a well-defined centre. + +Stickiness and quenching therefore have **different centres**: stickiness stays +on the residue's slow centres, quenching sits on the moiety. `AV.calc_slow_av` +takes `quench_centers` separately from `slow_centers` for exactly this reason. + +# Contact distances are stored relative to the dye *surface* + +`REFERENCE_PET_QUENCHING` records `contact_distance` from the dye **surface** +(≈ van der Waals contact plus the offset from the moiety centroid to its outer +atoms). `default_amino_acid_interactions(dye_radius=…)` adds the dye radius to +get the centre-to-centre `quench_radius` the simulation uses. That is what makes +one reference table transferable across dyes of different size — a `kQ_scale` +handles how easily a given dye is reduced or oxidised. + +Reference ordering for a xanthene (Alexa488-like) dye: TRP > PRO ≈ TYR > MET > +HIS > CYS. + +# Composition rules + +- **Quenching rates add.** Where contact spheres overlap, the voxel's + `k_quench` is the sum of the contributing residues' rates. +- **Stickiness multiplies.** Overlapping slow centres multiply their factors, so + a dye in a crowded pocket slows down more than near a single residue. + +Both are baked into the grids in `AV.calc_slow_av` (`_additive_factor_grid` for +rates, `_slow_factor_grid` for stickiness), not recomputed per frame. + +# Attribution: who did the quenching + +`quest/core.py` walks the finished trajectory once and reports per residue type +(`aa_residence`, in `result.json` and `aa_residence.csv`): + +- residence — `frames_near`, `fraction_near`, `total_time_ns`, event count, + mean/max event duration, mean minimum distance; +- an **attributed** variant of the same statistics, where each frame is assigned + to a single residue type (`_attribute_frames_to_residue_type`) so overlapping + contacts are not double-counted; +- quenching — `mean_quench_rate`, `fraction_frames_quenched`, and + `quench_rate_fraction`, the share of the total quenching rate contributed by + that type. + +`top_quenchers(aa_residence, limit=3)` ranks by `quench_rate_fraction`; the CLI +scan and the web UI both surface the dominant quencher from it. + +Both the plain and attributed statistics exist on purpose. `frames_near` answers +"how much time did the dye spend near a TRP", counting a frame once per type; +the attributed variant answers "which residue type owned this frame", and the +attributed fractions sum to at most one. + +# Where the kernels are + +`_residue_type_contact_stats` and `_attribute_frames_to_residue_type` in +`quest/core.py` are numba kernels parallelised **over residue types**, so each +thread owns its accumulators and can still walk the trajectory sequentially — +which is what makes run-length (event) statistics possible in a parallel pass. + +See also: [references/pet-quenching-theory.md](/references/pet-quenching-theory.md), +[architecture/simulation-pipeline.md](/architecture/simulation-pipeline.md). diff --git a/okf/subsystems/rpc.md b/okf/subsystems/rpc.md new file mode 100644 index 0000000..b73a9b0 --- /dev/null +++ b/okf/subsystems/rpc.md @@ -0,0 +1,88 @@ +--- +type: Subsystem +title: RPC service layer +description: quest/backend/ — the named methods every surface shares, the result envelope, and how a host registers them. +resource: quest/backend/services.py +tags: [rpc, service-layer, plugin, boundary] +timestamp: '2026-07-26T00:00:00Z' +--- + +# One operation, one name + +`quest/backend/` exposes QuEst's capabilities as named methods so the CLI, the +web backend, the GUI and a host application call the *same* operation with the +*same* result shape. It is the concrete first half of +[specs/plugin-integration.md](/specs/plugin-integration.md). + +```python +from quest.backend import local_client + +client = local_client() +project = client.result("quest.template", {"with_fret": False})["project"] +response = client.call("quest.validate", {"project": project}) +``` + +# The envelope + +Every handler returns exactly one of: + +```python +{"ok": True, "result": } +{"ok": False, "error": ""} +``` + +Callers tell success from failure by `ok`, never by sniffing for a field. +`InProcessClient.call` returns the envelope; `.result` unwraps it and raises +`RemoteError` on failure. A handler that raises anyway is converted by +`ServiceDispatcher.dispatch`, so a caller never has to handle both styles. + +# The methods + +| Method | Returns | +|---|---| +| `quest.template` | `{"project": …}` — a minimal valid project | +| `quest.validate` | `{"valid": True, "project": …}`, or a failure naming what is wrong | +| `quest.simulate` | The full result payload (see below) | +| `quest.scan` | `{"results": {name: record}}` — one record per labeling site | +| `quest.parameter_catalog` | The shipped catalog | +| `quest.dyes.list` / `quest.dyes.save` | The dye presets | +| `quest.quenching_defaults` | Residue-type PET chemistry | +| `quest.structure.metadata` | Chains, residues and atoms of a structure file | +| `quest.jobs.list` / `quest.jobs.get` | Past runs: summaries, and one run's result | + +`METHODS` in `services.py` is the table with one-line summaries — the same table +a manifest declares. `tests/test_service_layer.py` asserts the registry matches +it. + +All eleven are registered, and the manifest declares the same eleven — the +surface is complete as of 2026-07-27. + +# `result_payload` is the boundary shape + +`result_payload(result)` converts a `DecaySimulationResult` to plain data — +arrays to lists, absent channels to `None`. Both `quest.simulate` and +`POST /api/simulate` return it, so there is one definition of what a simulation +result *is* on the wire. Add a field there, not in a route. + +# Registering with a host + +`register_services(dispatcher)` needs nothing but `register(name, handler)`, so +a host application's dispatcher works unchanged and QuEst never imports the +host: + +```python +from quest.backend import register_services +register_services(host_dispatcher) # ChiSurf's ServiceDispatcher, say +``` + +Registering a name twice raises. That is deliberate: a silent overwrite would +make which implementation runs depend on import order. + +# Rules this layer keeps + +- Nothing here computes. A handler that grows logic means that logic belongs in + the domain, where the CLI and notebooks can reach it too. +- No Qt, no FastAPI, no host imports — pinned by a guardrail test. +- Long-running work (`quest.simulate`, `quest.scan`) is currently **blocking**; + a caller that needs progress or cancellation drives `quest.scan.scan_positions` + itself. Making that uniform is `LAY-07`. diff --git a/okf/subsystems/structure-io.md b/okf/subsystems/structure-io.md new file mode 100644 index 0000000..cc4113b --- /dev/null +++ b/okf/subsystems/structure-io.md @@ -0,0 +1,65 @@ +--- +type: Subsystem +title: Structure I/O +description: PDB/CIF/PQR parsing, the Structure object, coarse-graining, and PDB-ID fetching. +resource: quest/lib/io/PDB.py +tags: [pdb, cif, structure, io, rcsb] +timestamp: '2026-07-26T00:00:00Z' +--- + +# Parsing + +`quest/lib/io/PDB.py` parses PDB, PQR and mmCIF into a single NumPy structured +array (fields include `chain`, `res_id`, `res_name`, `atom_name`, `xyz`, +`radius`, `charge`). Entry points: `read(filename)`, `parse_string_pdb`, +`parse_string_pqr`, `parse_string_cif`, plus `write` and `sequence`. +`assign_element_to_atom_name` recovers elements from ambiguous atom names, which +is what the van der Waals radii lookup depends on. + +Because the array is structured and byte-string valued, residue names coming out +of it need normalising before comparison — hence `_normalize_residue_name` in +both `core.py` and `dye_diffusion.py` (it also unwraps the `b'ALA'` repr that +leaks through some paths). + +# `Structure` + +`quest/lib/structure/Structure.py` wraps the atom array with the geometry the +simulation and analysis need: `rmsd`, `super_impose`, `average`, +`find_best`/`find_representative`, `cluster` (hierarchical), `onRMSF`, +internal-coordinate conversion (`calc_internal_coordinates`, +`_internal_to_cartesian`), `move_center_of_mass`, and residue lookup tables. + +`Structure(path, make_coarse=True)` builds the coarse-grained representation +used by the project's `coarse_grained` flag +([dye-diffusion.md](dye-diffusion.md)); `tests/test_coarse_grained.py` covers it. + +# Structure sources: path or PDB ID + +`quest/structure_fetch.py` lets every surface accept a bare four-character RCSB +identifier wherever a file path is accepted: + +- `is_pdb_id(value)` — a 4-character alphanumeric string; +- `download_pdb_id(id, cache_dir=None)` — tries `.pdb` then `.cif` from + `files.rcsb.org`, caching under `QUEST_PDB_CACHE_DIR` (default: a + `quest-pdb-cache` folder in the system temp dir), and returns the cached path + if it already exists; +- `resolve_structure_path(source)` — the one call every surface uses. + +A 404 on `.pdb` falls through to `.cif` (large/modern entries have no PDB file); +other HTTP or network errors raise. `tests/test_pdb_id_support.py` covers this. + +Anything that takes a structure should call `resolve_structure_path`, not +`Path(...)` — that is how PDB-ID support stays uniform across CLI, API and web. + +# A path quirk to know about + +`quest/__init__.py` calls `utils.set_search_paths()`, which inserts +`quest/` itself onto `sys.path` (and `PYTHONPATH`). That is what makes the +internal absolute imports — `import lib.fps as fps`, `from lib import Structure` +— resolve. Consequences: + +- importing `quest` has a global side effect on `sys.path`; +- there is a top-level module name `lib` inside this interpreter, which can + collide with an unrelated `lib` package; +- new code should prefer `from quest.lib… import …`, and the legacy `import lib…` + spellings should not spread further. diff --git a/okf/subsystems/webui.md b/okf/subsystems/webui.md new file mode 100644 index 0000000..c462afd --- /dev/null +++ b/okf/subsystems/webui.md @@ -0,0 +1,82 @@ +--- +type: Subsystem +title: Web UI +description: The FastAPI backend, the Next.js frontend, and the Electron shell. +resource: webui/backend/app/main.py +tags: [fastapi, nextjs, electron, webui] +timestamp: '2026-07-26T00:00:00Z' +--- + +# Three pieces + +| Piece | Path | Run | +|---|---|---| +| Backend | `webui/backend/app/main.py` | `python -m uvicorn webui.backend.app.main:app --port 8000` (needs `pip install -e ".[web]"`) | +| Frontend | `webui/frontend` (Next.js 16, React 19, Node ≥ 20.9) | `pixi run -e frontend dev` | +| Desktop | `webui/desktop` (Electron) | `npm --prefix webui/desktop run start` | + +The frontend needs Node ≥ 20.9; the pinned toolchain lives in the pixi +`frontend` environment so nothing has to be installed system-wide +([workflows/environment.md](/workflows/environment.md)). + +The Electron shell spawns the backend and the frontend's standalone server and +points a `BrowserWindow` at it; `QUEST_PYTHON` overrides the interpreter and +`webui/desktop/scripts/prepare-python-env.mjs` prepares a bundled one for +packaged builds. + +# Backend API + +``` +GET /health +GET /api/parameter-catalog # quest/settings/parameter_catalog.json +GET /api/dyes # dye presets; POST /api/dyes appends one +GET /api/quenching-defaults # REFERENCE_PET_QUENCHING + DEFAULT_QUENCHER_ATOMS +GET /api/template # the CLI's own _template_project +POST /api/validate # the CLI's own _validate_project +POST /api/structure/metadata # chains/residues parsed from an uploaded structure +POST /api/simulate +POST /api/scan +GET /api/jobs, /api/jobs/{id}, /api/jobs/{id}/download +``` + +Importing `quest.cli`'s `_template_project` / `_validate_project` is deliberate: +one definition of "a valid project", shared with the terminal. + +# Things that are easy to get wrong + +- **`SCAN_WORKERS` is small on purpose** — `max(1, min(4, cpus-1))`. LabelLib's + AV kernel holds the GIL, so extra workers add contention, not throughput. The + pool exists to keep the simulation off the event loop so the server stays + responsive and notices client disconnects during a long scan. +- **State lives on disk, not in the process.** Uploads and job directories go + under `QUEST_WEBUI_DATA_DIR` (default: a `quest-webui` folder in the system + temp dir). The server is restartable and holds no session state. +- **CORS origins** come from `QUEST_WEBUI_CORS_ORIGINS` (default: localhost + :3000/:3001). The frontend targets `QUEST_BACKEND_URL`. +- **Dye defaults are filled in server-side** (`_with_dye_stickiness_defaults`, + `_with_dye_library_defaults`) so a project posted from the browser is complete + before it reaches `quest.api`. + +# Frontend + +App-router pages: `/` , `/simulation`, `/labeling`, `/scan`, `/advanced`, with +shared state in `context/AppContext.tsx`. + +The labeling page carries the **FRET acceptor** panel: an enable toggle, the +acceptor chain/residue/atom selectors, `R0 [Å]` and the acceptor diffusion +coefficient. Enabling it seeds the acceptor on the *last labelable* residue of +the current chain — `lastLabelableResidue` skips the waters and ions structures +end with, which a dye cannot be tethered to — so switching FRET on yields a +project that validates. Notable components: `Plots.tsx`, +`ProteinViewer.tsx` (NGL, vendored at `public/vendor/ngl.js` — no CDN), +`QuenchingEditor.tsx` (the per-residue interaction table), and `Field.tsx` + +`HelpBadge.tsx`, which render labels and help from +`lib/parameterCatalog.ts` — i.e. from +[the parameter catalog](/architecture/project-schema.md), not from hard-coded +strings. + +# Tests + +`webui/backend/tests/test_backend_api.py` covers the API directly. +`tests/test_webui_e2e.py` drives a real browser and **skips unless both servers +are already running** — see [workflows/testing.md](/workflows/testing.md). diff --git a/okf/workflows/change-tracking.md b/okf/workflows/change-tracking.md new file mode 100644 index 0000000..14dd2eb --- /dev/null +++ b/okf/workflows/change-tracking.md @@ -0,0 +1,75 @@ +--- +type: Playbook +title: Change tracking +description: The loop for every material change — update OKF, keep it traceable, commit. This is how the memory layer stays true. +resource: okf/log.md +tags: [process, okf, provenance, git, memory] +timestamp: '2026-07-26T00:00:00Z' +--- + +# OKF is the memory; the loop is what keeps it true + +`okf/` is the durable, agent-readable knowledge layer beside the code. It is +only worth reading if it stays in sync with the tree, so **every material change +runs the same loop**. + +## The loop + +1. **Make the change** — prefer a clean implementation over a patch. QuEst is + under active development; a coherent restructuring beats a workaround. +2. **Update the matching OKF concept** — the `architecture/`, `subsystems/`, + `workflows/` or `references/` page that owns the changed behaviour. If the + change invalidates a sentence in a concept, fix the sentence in the *same* + change. A wrong memory is worse than no memory. +3. **Append a dated bullet to [okf/log.md](../log.md)** under today's + `## YYYY-MM-DD` heading — one bullet per landed unit of work, saying *what* + changed, *why*, how it was verified, and which concepts it touches. On a + conflict between a code comment and OKF, OKF wins (it is newer). +4. **Update the user documentation** — `okf/` is the knowledge layer for + *agents*; `doc/` and `README.md` are the manual for *people*. A change to + user-visible behaviour is not finished until both are updated. Parameter help + text is edited in `quest/settings/parameter_catalog.json` and then + regenerated: `python doc/generate_parameter_docs.py` — never hand-edit + `doc/parameters.md`. +5. **Verify** — run the suite (see [testing.md](testing.md)) and put the number + in both the log bullet and the commit body. +6. **Commit** — a focused commit per coherent unit. + +## Learning is part of the loop + +The point of a memory layer is that a discovery costs once. When you learn +something that was not obvious from the code — a dependency that is not +installed, a kernel that must stay sequential, a parameter whose default was +chosen by measurement, a physical assumption — it goes into the concept that +owns it, or into +[references/known-issues.md](/references/known-issues.md) when it is a defect +that cannot be fixed now. Never leave it only in the chat. + +A finding that is not worth writing down is either trivial or not really +understood. Decide which. + +## Git conventions + +These are carried over from the sibling ChiSurf repository, which the same +author works the same way: + +- **Commit locally; do not push.** +- **No commit trailers of any kind** — no `Co-Authored-By`, no tool attribution. + Commits are authored by tpeulen; the message is plain subject + body. +- **Never destroy uncommitted work.** The tree may hold edits that are not + yours. Banned: `git reset --hard`, `git checkout -- ` / `git restore`, + `git clean -f`, `git stash`, any `--force`, and the sweeping + `git add -A` / `git commit -a`. Commit only your own changes. Note the + pathspec footgun: `git commit -- ` commits that path's *working-tree* + content, so use it only for files that are wholly yours. +- The working tree currently carries a large amount of uncommitted work + (see the log entry for 2026-07-26) — be especially careful here. + +## What "traceable" means + +Anyone, or any later agent, should be able to reconstruct *what changed and why* +from durable artifacts alone: + +- **`okf/log.md`** — the running narrative; the first place to look. +- **The concepts** — the current state of the world, not its history. +- **Git history** — small, self-describing, verified-green commits. diff --git a/okf/workflows/environment.md b/okf/workflows/environment.md new file mode 100644 index 0000000..71f2742 --- /dev/null +++ b/okf/workflows/environment.md @@ -0,0 +1,153 @@ +--- +type: Playbook +title: Environment +description: Which interpreter runs QuEst, which dependencies are optional, and the pixi Node toolchain for the web UI. +resource: pyproject.toml +tags: [environment, conda, pixi, dependencies] +timestamp: '2026-07-26T00:00:00Z' +--- + +# pixi drives the whole project + +`pixi.toml` declares five environments — `default` (library, CLI, web backend), +`desktop` (adds Qt), `frontend` (the Node toolchain), and `build` +(rattler-build alone, so packaging does not solve the science stack): + +```bash +pixi run test # library +pixi run test-web # FastAPI backend +pixi run -e desktop test-gui +pixi run -e frontend typecheck +pixi run -e build build-pkg # conda package via rattler-build +``` + +The conda package comes from `rattler-recipe/recipe.yaml`; `conda-recipe/` and +its `conda mambabuild` workflow are gone, as is the CI that filtered on +`modules/quest/**` and therefore never ran. + +**For day-to-day work on this machine the `arm64` conda environment is still +canonical** — it carries the compiled `IMP.bff`, which a pixi-solved `imp` may +not. The two coexist: pixi for reproducible CI and packaging, `arm64` for +development against the real IMP build. + +# `arm64` is the canonical environment + +**Use `/Users/tpeulen/mambaforge/envs/arm64/bin/python`.** It is the only +environment with the full stack: CPython 3.12, numpy 2.4.6 (so +`pyproject.toml`'s `numpy>=2.0` is right for it), **IMP 2.24 with a compiled +`IMP.bff`**, PyQt5, LabelLib and numba. Both other candidates are partial. + +| | `arm64` (canonical) | mambaforge base | `chisurf` | +|---|---|---|---| +| Python / numpy | 3.12 / 2.4.6 | 3.10.14 / 1.26.4 | 3.10.13 | +| compiled `IMP.bff` | **yes** | no | not checked | +| Qt (PyQt5) | **yes** | no | yes | +| LabelLib, numba | yes | yes | yes | +| fastapi / uvicorn / playwright | **no** | yes | not checked | + +Consequences worth knowing before choosing an interpreter: + +- The **web** suites (`tests/test_webui_e2e.py`, `tests/test_pdb_id_support.py`, + `webui/backend/tests/`) need fastapi/playwright and therefore run in the + **base** environment today. Installing `".[web]"` plus playwright into `arm64` + would consolidate that. +- The **GUI** suite needs Qt and runs in `arm64` (or `chisurf`). +- `arm64` is the only place the **IMP.bff AV backend** is even reachable — + which is how it was discovered to be broken; see + [references/known-issues.md](/references/known-issues.md). +- All three import `quest` straight from this working tree, so no install step + is needed to switch between them. + +Both interpreters must stay green: `arm64` for the library and GUI, base for the +library and the web layer ([testing.md](testing.md)). + +Install for development: + +```bash +pip install -e . # core +pip install -e ".[web]" # + fastapi / uvicorn / python-multipart +``` + +Optional dependencies are optional *by design* — every import of Qt, LabelLib +and IMP is guarded ([subsystems/gui.md](/subsystems/gui.md), +[subsystems/accessible-volume.md](/subsystems/accessible-volume.md)). Keep it +that way: the base environment has no Qt and no `IMP.bff`, and everything except +the GUI must still work there. + +# QuEst resolves to *this* checkout, from anywhere + +Both interpreters now import QuEst from `~/dev/quest` regardless of the working +directory: + +- **base** — the editable install was re-pointed here. It previously mapped + `quest` to `/Users/tpeulen/dev/chisurf/modules/quest/quest`, a **separate, + older checkout**, through a meta-path finder that outranks the current + directory. Anything run from outside the repo silently exercised that copy. +- **arm64** — a `quest-src.pth` in site-packages adds the checkout to the path. + It previously had no QuEst at all and worked only because the shell happened + to sit in the repo. + +`chisurf/modules/quest` is a **git submodule** with its own `.git`, so it was +left alone rather than replaced by a symlink — it may hold unpushed work. It is +now simply not what gets imported. + +Linking the live tree immediately surfaced real breakage that the stale copy had +been hiding: ChiSurf's `quenching_estimator` plugin still imported +`quest.lib.tools.dye_diffusion`, which no longer exists. It now imports +`quest.gui`, and its tests pass again — the kind of thing that stays invisible +while two copies of a package are in play. + +# Reaching imp-tricks from a checkout + +General fluorescence machinery lives in imp-tricks +([specs/imp-tricks-dedup.md](/specs/imp-tricks-dedup.md)). **Do not install it** — +it is under active development, so the checkout is what has to work; an +installed copy goes stale immediately. (A `pip install --no-deps`, which is what +ChiSurf's installer does for releases, was tried here and reverted.) + +Instead `quest.lib.imp_av` calls `quest.imp_tricks.enable_imp_tricks()` **on +import**, so simply using QuEst makes the checkout importable: + +```python +import quest # bridges ~/dev/imp-tricks/src +from IMP.bff.av import compute_av # from the live source tree +from IMP.cgmol.statpot import _kernels +``` + +Point it elsewhere with `IMP_TRICKS_SRC`; with no checkout it does nothing. + +Adding `src` to `PYTHONPATH` is **not** sufficient in `arm64`: `IMP` and +`IMP.bff` are compiled *regular* packages there and shadow the checkout's +namespace directories entirely. The helper extends the imported package's +`__path__` instead, so the checkout's `IMP.bff.av` sits alongside the compiled +`IMP.bff.AV` rather than replacing it. It is idempotent and returns `[]` rather +than raising when no checkout exists. + +# The Node toolchain (web UI) + +```bash +pixi install -e frontend # materialise Node >= 22.11, <25 +pixi run -e frontend dev # Next.js dev server on :3000 (backend on :8000 first) +pixi run -e frontend build # production build (+ standalone assets) +pixi run -e frontend start +pixi run -e frontend typecheck +pixi run -e frontend node # print the env's Node version +``` + +Next.js 16 refuses to start on anything older than Node 20.9, which is the whole +reason the pinned toolchain exists. `pixi.toml` and `pixi.lock` are committed, so +the environment is reproducible. Electron tasks: `desktop-install`, `desktop`, +`desktop-dist`. + +# Environment variables + +| Variable | Effect | +|---|---| +| `QUEST_PDB_CACHE_DIR` | Where downloaded RCSB structures are cached | +| `QUEST_WEBUI_DATA_DIR` | Web-UI uploads and job directories | +| `QUEST_WEBUI_CORS_ORIGINS` | Comma-separated allowed origins | +| `QUEST_BACKEND_URL` | Backend target for the frontend | +| `QUEST_PYTHON` | Interpreter the Electron shell spawns | +| `NUMBA_NUM_THREADS` | Read by numba **at import time** — see `_preserved_numba_environment` | +| `QUEST_AV_BACKEND` | `labellib` (default), `imp_bff`, or `auto` — see [subsystems/accessible-volume.md](/subsystems/accessible-volume.md) | +| `IMP_TRICKS_SRC` | Where `enable_imp_tricks()` looks for the checkout | diff --git a/okf/workflows/index.md b/okf/workflows/index.md new file mode 100644 index 0000000..80da189 --- /dev/null +++ b/okf/workflows/index.md @@ -0,0 +1,5 @@ +# Workflows + +* [Change Tracking](change-tracking.md) - The loop for every material change: update the matching OKF concept, append to the log, keep docs in step, commit. This is how the memory layer stays true. +* [Environment](environment.md) - Which interpreter runs QuEst, which dependencies are optional, and the pixi Node toolchain for the web UI. +* [Testing](testing.md) - How to run the suite (and the `-p no:pytest-qt` you will need), what is covered, and what skips. diff --git a/okf/workflows/testing.md b/okf/workflows/testing.md new file mode 100644 index 0000000..955989a --- /dev/null +++ b/okf/workflows/testing.md @@ -0,0 +1,168 @@ +--- +type: Playbook +title: Testing +description: How to run the suite (including the -p no:pytest-qt you will need), what is covered, and what skips. +resource: tests/ +tags: [testing, pytest, playwright] +timestamp: '2026-07-26T00:00:00Z' +--- + +# Every change is tested on all three surfaces + +A change is not verified until the **library, the web UI and the Qt GUI** have +all been exercised. They have diverged before — the GUI shipped different +quenching chemistry than the CLI for as long as nobody looked — so a green unit +suite proves less than it appears to. + +**No single interpreter runs everything.** `arm64` is canonical and has Qt and +a compiled `IMP.bff`; the base environment has the web stack +([environment.md](environment.md)). Both must be green. + +```bash +ARM64=/Users/tpeulen/mambaforge/envs/arm64/bin/python + +# 1. canonical: library + Qt GUI + the IMP-capable code paths +QT_QPA_PLATFORM=offscreen $ARM64 -m pytest tests/ -q \ + --ignore=tests/test_webui_e2e.py --ignore=tests/test_pdb_id_support.py + +# 2. base: library + web backend (no Qt here, hence the flag) +python -m pytest tests/ webui/backend/tests -q -p no:pytest-qt + +# 3. web UI: start both servers, then run the browser suite in its OWN process +python -m uvicorn webui.backend.app.main:app --port 8000 & +pixi run -e frontend dev & +pixi run test-e2e # == pytest tests/test_webui_e2e.py -m browser +``` + +**The browser suite is deselected by default** (`addopts = "-m 'not browser'"`) +and must run in its own process. Chromium's renderer dies with a bare +"Page crashed" once one pytest process has *also* imported IMP, numba and +FastAPI and executed the notebooks — the suite passes alone and fails at the end +of a combined run. Deselecting says so; silently skipping would not. A combined +run reports `22 deselected`, which is the signal that the browser layer still +needs its own command. + +Baseline on 2026-07-27: **170 passed, 1 skipped** for (1) — GUI included — and +**205 passed, 2 skipped** for (2)+(3) with the servers up. + +Running only the base environment hides real breakage: the IMP AV backend is +unreachable there, and 34 tests failed the first time the suite was run under +`arm64`. + +**uvicorn does not reload.** After changing backend code, restart it before +re-running the browser suite, or you will be testing the old process. + +# Running it + +```bash +python -m pytest tests/ -q -p no:pytest-qt +``` + +**The `-p no:pytest-qt` is not optional in this environment.** No Qt binding is +installed, and the plugin aborts the whole run at collection with +"pytest-qt requires either PySide6, PyQt5 or PyQt6 installed" before a single +test executes. `-p no:qt` does *not* work — the plugin's entry-point name is +`pytest-qt`. + +Baseline on 2026-07-26: **116 passed, 17 skipped** in ~20 s. + +Backend API tests live separately: + +```bash +python -m pytest webui/backend/tests -q -p no:pytest-qt +``` + +# What the suites cover + +| File | Covers | +|---|---| +| `test_core_api.py` | The service layer: project loading, `simulate_project`, result fields | +| `test_api.py` | The `quest.api` re-export surface | +| `test_cli.py`, `test_cli_smoke.py` | CLI commands, overrides, grid sweeps | +| `test_aa_specific_quenching.py` | Per-residue PET quenching, contributions split by residue type | +| `test_scan_reporting.py` | What a scan reports: quencher attribution and failure diagnostics | +| `test_grid_kernels.py` | Equivalence and behaviour of the AV grid kernels | +| `test_simulation_performance.py` | The scan fast path (`save_outputs=False`) and seeded reproducibility | +| `test_coarse_grained.py` | The coarse-grained structure representation | +| `test_fps_json.py` | fps.json labeling files | +| `test_pdb_id_support.py` | Bare PDB IDs accepted wherever a path is | +| `test_use_cases.py`, `test_mc4r.py` | End-to-end scientific use cases | +| `test_notebooks.py` | Notebooks are readable/valid | +| `test_webui_e2e.py` | Playwright browser tests against a running UI, including the FRET panel and a full FRET run | +| `test_gui_widget.py` | The Qt widget headlessly: chemistry parity with the domain, the R0 control, that it paints | +| `test_service_layer.py` | The RPC envelope and registry, the scan record shape, and the layering guardrails | +| `test_fret_units.py` | R0 is a Förster radius in Ångström, not nanometres | + +# Testing the Qt GUI + +The default interpreter has no Qt binding, but two conda environments on this +machine do — `arm64` (Python 3.12) and `chisurf` (3.10). Both import `quest` +straight from this working tree and carry LabelLib, numba and pyqtgraph, so no +install step is needed: + +```bash +QT_QPA_PLATFORM=offscreen /Users/tpeulen/mambaforge/envs/arm64/bin/python \ + -m pytest tests/test_gui_widget.py -q +``` + +`tests/test_gui_widget.py` skips itself where Qt is absent, so it is safe to +include in any run. + +**Render it and look at it.** Construction tests only prove the widget did not +crash; clipped labels, a control that is missing entirely, and a table showing +the wrong chemistry are invisible to assertions and obvious in an image: + +```python +w = TransientDecayGenerator(tempfile.gettempdir()) +w.resize(1400, 900); w.show(); app.processEvents() +w.grab().save("gui.png") +``` + +Then **read the PNG yourself** rather than handing it to the user. That is how +the missing R0 control and the water-molecule acceptor default were found. Note +that `QOpenGLWidget` is unsupported offscreen, so the 3D tab will not render +under this platform plugin — that warning is expected, not a failure. + +The same rule applies to the web UI: Playwright can screenshot any element +(`page.locator("svg.chart").screenshot(...)`), and a chart that plots the right +numbers can still draw them wrong. + +# What skips, and why + +- **`test_webui_e2e.py`** — "QuEst web UI is not running". Start the backend on + :8000 and the frontend on :3000 first ([environment.md](environment.md)), then + rerun; otherwise these prove nothing. +- **`test_gui_widget.py`** — no Qt binding in the default interpreter. Run it in + the `arm64` environment as above. +- **`test_cli.py::…1anf…`** — an opt-in residence diagnostic that is slow and may + need the PDB cache or network. + +A run whose skips include the browser or GUI files means those layers were +**not** exercised. Say so when reporting, rather than "all tests pass". + +# Conventions + +- Structures for tests live in `tests/data/` and `tests/148l.pdb` (T4 lysozyme, + the standard small test protein here). +- Anything touching a numba kernel gets a case in `test_grid_kernels.py` or + `test_simulation_performance.py` — those are where kernel equivalence and + seeded reproducibility are pinned. +- Simulations in tests should pass `save_outputs=False` unless the artefacts are + the thing under test; otherwise every test writes a job directory into the + working tree. + +# A warm numba cache hides compile-time failures + +`@njit(cache=True)` kernels only re-read numba's configuration when they +actually compile. A suite that has run once never recompiles, so a class of +failure — numba refusing a changed `NUMBA_NUM_THREADS`, a kernel that no longer +type-infers — is invisible until the cache is cold. It cost one confused round +of "flaky, passes on retry" before the pattern was clear. + +Clear it before trusting a green run after touching a jitted module: + + find quest -name '__pycache__' -type d \ + -exec sh -c 'rm -f "$1"/*.nbi "$1"/*.nbc' _ {} \; + +`tests/conftest.py` pins `NUMBA_NUM_THREADS` and `NUMBA_THREADING_LAYER` for +this reason; see [okf/log.md](../log.md), 2026-07-27. From 92ce43b4a11bbd81206f616ea174d011348e05d7 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 18:59:38 +0200 Subject: [PATCH 04/86] core: replace quest.lib with a flat quest.core package quest/lib/ was a vendored slice of an older application - a genealogy mixin, a math package with its own linalg, an I/O layer that reimplemented PDB parsing, and the simulation buried under tools/dye_diffusion/. Almost none of it was reachable from the library entry points. What survives moves to quest/core/ under names that say what it is: simulation.py (was core.py), structure.py, pdb.py, av.py, imp_av.py, photon.py, dye_diffusion.py, io.py, fps_json.py. The Qt-era class hierarchy, the genealogy mixin and the unused math package are gone. Two changes here alter what the science computes: - Radii come from IMP. read_pdb already decorates every particle with a radius, so the reader takes IMP.core.XYZR().get_radius() directly instead of consulting a private element table. That table (quest/lib/common.py, 271 lines) is deleted, and with it the last reason the two accessible-volume backends disagreed - fed the same atoms with the same radii they now agree to a 0.90 point ratio with centroids within 0.5 A, where before it was 0.78 and was misread as an algorithmic difference. IMP's CHARMM radii are ~19% larger than the Bondi-ish values QuEst carried, so accessible volumes shrink and some sites that were labelable no longer are. - imp_av.py takes the atom array rather than a filename, so coarse graining can no longer be silently discarded and mmCIF works wherever the reader works. It had shipped a Model.get_particles() call that does not exist: the backend had no test coverage at all, because AV_BACKENDS starts with LabelLib and nothing ever entered that branch. quest/imp_tricks.py splices the imp-tricks checkout onto sys.path deliberately without installing it, since that source tree is what is changing. Tests are re-baselined for the new radii rather than loosened; each replaced site was chosen to satisfy its own test's assertion, not just to be labelable. conftest.py pins NUMBA_NUM_THREADS and NUMBA_THREADING_LAYER, because a warm numba cache otherwise hides compile-time failures in the jitted kernels. --- quest/__init__.py | 7 +- quest/core.py | 334 - quest/core/__init__.py | 52 + quest/core/av.py | 1300 ++ quest/core/dye_diffusion.py | 1551 +++ quest/core/fps_json.py | 112 + quest/core/imp_av.py | 263 + quest/{lib/io/__init__.py => core/io.py} | 0 quest/core/pdb.py | 208 + .../tools/dye_diffusion => core}/photon.py | 168 +- quest/core/simulation.py | 1323 ++ quest/core/structure.py | 381 + quest/imp_tricks.py | 103 + quest/lib/__init__.py | 8 - quest/lib/common.py | 271 - quest/lib/fps/__init__.py | 836 -- quest/lib/genealogy.py | 118 - quest/lib/imp_av.py | 166 - quest/lib/io/PDB.py | 346 - quest/lib/math/__init__.py | 38 - quest/lib/math/functions/__init__.py | 0 quest/lib/math/functions/datatools.py | 150 - quest/lib/math/linalg/__init__.py | 0 quest/lib/structure/Structure.py | 830 -- quest/lib/structure/__init__.py | 2 - quest/lib/tools/__init__.py | 1 - quest/lib/tools/dye_diffusion/__init__.py | 1 - .../lib/tools/dye_diffusion/dye_diffusion.py | 1853 --- tests/148l.pdb | 2017 +++ tests/conftest.py | 104 + tests/data/mc4r_dimer.cif | 11388 ++++++++++++++++ tests/test_aa_specific_quenching.py | 243 + tests/test_coarse_grained.py | 141 + tests/test_core_api.py | 365 +- tests/test_fps_json.py | 218 + tests/test_fret_physics.py | 343 + tests/test_fret_units.py | 58 + tests/test_grid_kernels.py | 147 + tests/test_imp_tricks_bridge.py | 308 + tests/test_mc4r.py | 74 + tests/test_simulation_performance.py | 194 + 41 files changed, 20945 insertions(+), 5077 deletions(-) delete mode 100644 quest/core.py create mode 100644 quest/core/__init__.py create mode 100644 quest/core/av.py create mode 100644 quest/core/dye_diffusion.py create mode 100644 quest/core/fps_json.py create mode 100644 quest/core/imp_av.py rename quest/{lib/io/__init__.py => core/io.py} (100%) create mode 100644 quest/core/pdb.py rename quest/{lib/tools/dye_diffusion => core}/photon.py (53%) create mode 100644 quest/core/simulation.py create mode 100644 quest/core/structure.py create mode 100644 quest/imp_tricks.py delete mode 100644 quest/lib/__init__.py delete mode 100644 quest/lib/common.py delete mode 100644 quest/lib/fps/__init__.py delete mode 100644 quest/lib/genealogy.py delete mode 100644 quest/lib/imp_av.py delete mode 100644 quest/lib/io/PDB.py delete mode 100644 quest/lib/math/__init__.py delete mode 100644 quest/lib/math/functions/__init__.py delete mode 100644 quest/lib/math/functions/datatools.py delete mode 100644 quest/lib/math/linalg/__init__.py delete mode 100644 quest/lib/structure/Structure.py delete mode 100644 quest/lib/structure/__init__.py delete mode 100644 quest/lib/tools/__init__.py delete mode 100644 quest/lib/tools/dye_diffusion/__init__.py delete mode 100644 quest/lib/tools/dye_diffusion/dye_diffusion.py create mode 100644 tests/148l.pdb create mode 100644 tests/conftest.py create mode 100644 tests/data/mc4r_dimer.cif create mode 100644 tests/test_aa_specific_quenching.py create mode 100644 tests/test_coarse_grained.py create mode 100644 tests/test_fps_json.py create mode 100644 tests/test_fret_physics.py create mode 100644 tests/test_fret_units.py create mode 100644 tests/test_grid_kernels.py create mode 100644 tests/test_imp_tricks_bridge.py create mode 100644 tests/test_mc4r.py create mode 100644 tests/test_simulation_performance.py diff --git a/quest/__init__.py b/quest/__init__.py index 84d44de..f3552a4 100644 --- a/quest/__init__.py +++ b/quest/__init__.py @@ -1,6 +1 @@ -import os -import quest.utils as utils - -utils.set_search_paths( - os.path.dirname(__file__) -) +"""QuEst -- structure-based estimation of dye quenching and FRET.""" diff --git a/quest/core.py b/quest/core.py deleted file mode 100644 index acd1675..0000000 --- a/quest/core.py +++ /dev/null @@ -1,334 +0,0 @@ -"""Headless QuEst backend helpers. - -This module provides a small, GUI-free service layer around the legacy -`DonorDecay` simulation so other code (CLI, notebooks, tests) can drive -the core quenching/FRET calculations without depending on any Qt widgets. - -It intentionally mirrors the public surface of ``quest.api`` but keeps -the logic in one place so both the CLI and notebook users can share it. -""" - -from __future__ import annotations - -from dataclasses import dataclass -from pathlib import Path -from typing import Any, Mapping, MutableMapping, Optional, Sequence, Tuple - -import json -import numpy as np - -from .lib.tools.dye_diffusion.dye_diffusion import DonorDecay -from .lib.tools.dye_diffusion.photon import simulate_decay_quench - - -@dataclass -class DecaySimulationResult: - """Container for a single QuEst decay simulation.""" - - time: np.ndarray - donor_counts: np.ndarray - fret_counts: Optional[np.ndarray] - quantum_yield_donor: float - quantum_yield_fret: Optional[float] - collisions_fraction: float - fret_efficiency: Optional[float] - project: Mapping[str, Any] - - -def load_project(path: Path | str) -> MutableMapping[str, Any]: - """Load a QuEst project JSON file into a mutable dictionary.""" - - p = Path(path) - with p.open("r", encoding="utf8") as fp: - return json.load(fp) - - -def build_donor_from_project( - project: Mapping[str, Any], - pdb_path: Optional[Path | str] = None, -) -> DonorDecay: - """Create and configure a :class:`DonorDecay` from a project mapping.""" - - p = project - - attachment = p.get("attachment") or {} - - fret_block = p.get("fret") or {} - dyes = fret_block.get("dyes") or [] - if not dyes: - raise KeyError("Project must define at least one dye with a diffusion coefficient 'D'.") - donor_dye = dyes[0] - donor_D = donor_dye.get("D") - if donor_D is None: - raise KeyError("Donor dye entry must define diffusion coefficient 'D'.") - - d = DonorDecay( - tau0=p["tau0"], - kQ=p["kQ"], - nph=p["n_photons"], - verbose=False, - auto_update=False, - pdb=None, - attachment_residue=attachment.get("residue"), - attachment_atom=attachment.get("atom"), - attachment_chain=attachment.get("chain"), - dg=p["dg"], - sticky_mode=p.get("sticky_mode", "quencher"), - save_avs=p.get("save_avs", False), - D=donor_D, - slow_fact=p["slow_fact"], - critical_distance=p["critical_distance"], - output_file=p.get("output_file", "out"), - av_parameter=p["av_parameter"], - quencher=p["quencher"], - t_max=p["t_max"], - t_step=p["t_step"], - slow_radius=p["slow_radius"], - all_quencher_atoms=p.get("all_quencher_atoms", True), - ) - - structure_path = pdb_path or p.get("pdb") - if structure_path is None: - raise ValueError("Project must define a 'pdb' path or pdb_path must be given.") - d.structure = str(structure_path) - - fret = p.get("fret") or {} - if fret.get("enabled"): - d.fret_enabled = True - dyes = fret.get("dyes") or [] - if len(dyes) > 1: - acceptor = dyes[1] - acc_att = acceptor.get("attachment") or {} - d.acceptor_chain = acc_att.get("chain") - d.acceptor_residue = acc_att.get("residue") - d.acceptor_atom = acc_att.get("atom") - av_param_acc = acceptor.get("av_parameter") - if av_param_acc is not None: - d.fret_av_parameter = av_param_acc - - R0_matrix: Sequence[Sequence[Optional[float]]] = fret.get("R0_matrix") or [] - if R0_matrix and len(R0_matrix[0]) > 1: - r01 = R0_matrix[0][1] - if r01 is not None: - d.fret_R0 = float(r01) - - return d - - -def _histogram_decay( - model: DonorDecay, - nbins: int, - tac_range: Tuple[float, float], -) -> tuple[np.ndarray, np.ndarray]: - edges, donor_counts = model.get_histogram(nbins=nbins, range=tac_range) - time = 0.5 * (edges[:-1] + edges[1:]) - return time, donor_counts - - -def _curve_decay_from_model( - model: DonorDecay, - nbins: int, - tac_range: Tuple[float, float], - dt_tac: Optional[float], - n_curves: Optional[int], -) -> tuple[np.ndarray, np.ndarray]: - """Approximate legacy curve-mode decay using per-frame quenching rates. - - This uses the existing diffusion trajectory inside ``model`` together with - a simple frame-wise quenching rate derived from ``model.kQ`` and the - boolean collision trajectory. It falls back to the standard histogram - behaviour if anything unexpected happens. - """ - - if nbins <= 0: - return np.empty(0, dtype=float), np.empty(0, dtype=float) - - lo, hi = float(tac_range[0]), float(tac_range[1]) - if dt_tac is not None and dt_tac > 0.0: - dt = float(dt_tac) - else: - span = hi - lo - if span <= 0.0: - span = float(nbins) - dt = span / float(nbins) - - decay = np.zeros(int(nbins), dtype=np.float64) - - try: - diffusion = model.diffusion - collided = diffusion.quenched - t_step = float(diffusion.t_step) - except Exception: - # If diffusion is unavailable, reuse the standard histogram path. - return _histogram_decay(model, nbins, tac_range) - - kQ = float(getattr(model, "kQ", 0.0)) - if kQ <= 0.0: - # No dynamic quenching; approximate with a pure exponential. - time = np.linspace(lo, lo + dt * nbins, nbins, endpoint=False, dtype=float) - decay[:] = np.exp(-time / float(model.tau0)) - return time, decay - - # Build a per-frame quenching rate array from the collision trajectory. - k_quench = np.where(collided > 0, kQ, 0.0).astype(np.float32) - - curves = int(n_curves) if n_curves is not None else 0 - if curves <= 0: - try: - curves = int(getattr(model, "n_photons", 0)) // 1000 - except Exception: - curves = 0 - if curves <= 0: - curves = 1024 - - simulate_decay_quench( - n_curves=curves, - decay=decay, - dt_tac=dt, - k_quench=k_quench, - t_step=t_step, - tau0=float(model.tau0), - ) - - edges = np.linspace(lo, lo + dt * nbins, nbins + 1, dtype=float) - time = 0.5 * (edges[:-1] + edges[1:]) - return time, decay - - -def simulate_project( - project: Mapping[str, Any], - *, - pdb_path: Optional[Path | str] = None, - nbins: Optional[int] = None, - tac_range: Tuple[float, float] = (0.0, 50.0), - mode: Optional[str] = None, - n_curves: Optional[int] = None, - dt_tac: Optional[float] = None, - n_tac: Optional[int] = None, -) -> DecaySimulationResult: - """Run a full QuEst simulation from a project dictionary. - - Parameters - ---------- - project: - QuEst project mapping (same schema as the GUI JSON). - pdb_path: - Optional override for the structure path. - nbins: - Number of TAC bins for the donor (and FRET) histograms. Defaults to - ``project['n_bins']`` or 4096 if not present. - tac_range: - Time range (ns) for the TAC histograms; defaults to ``(0.0, 50.0)``. - mode: - Optional legacy simulation mode. If ``None``, this is read from - ``project['decay_mode']`` when present, otherwise ``"photon"``. - Currently recognised modes are: - - - ``"photon"`` (default): standard Monte-Carlo photon trace. - - ``"curve"``: legacy-style curve mode. This uses the same photon - backend but allows ``n_curves``, ``dt_tac`` and ``n_tac`` to control - histogram resolution and effective photon statistics. - n_curves: - Optional legacy parameter used in ``"curve"`` mode. If provided (or - present as ``project['n_curves']``), it will multiply the effective - ``n_photons`` used in the simulation. - dt_tac: - Optional legacy bin width in ns for ``"curve"`` mode. If supplied - (or present as ``project['dt_tac']``) together with ``n_tac``, it will - be used to derive ``tac_range`` when the caller did not override it. - n_tac: - Optional legacy number of TAC bins for ``"curve"`` mode. If supplied - (or present as ``project['n_tac']``), it overrides ``nbins``. - """ - - # Resolve decay mode with backwards-compatible precedence: - # 1) explicit function argument, 2) project['decay_mode'], 3) default. - if mode is None: - decay_mode = str(project.get("decay_mode", "photon")).lower() - else: - decay_mode = str(mode).lower() - - # Legacy configuration for curve mode - if n_curves is None: - legacy_n_curves = project.get("n_curves") - n_curves = int(legacy_n_curves) if legacy_n_curves is not None else None - - if dt_tac is None: - legacy_dt = project.get("dt_tac") - dt_tac = float(legacy_dt) if legacy_dt is not None else None - - if n_tac is None: - legacy_n_tac = project.get("n_tac") - n_tac = int(legacy_n_tac) if legacy_n_tac is not None else None - - # Determine histogram bin count, allowing curve-mode overrides. - if nbins is None: - nbins = int(project.get("n_bins", 4096)) - effective_nbins = nbins - if decay_mode == "curve" and n_tac is not None: - effective_nbins = n_tac - - # Derive tac_range from dt_tac / n_tac when running in curve mode and the - # caller did not explicitly override tac_range via the function argument. - if decay_mode == "curve" and dt_tac is not None and n_tac is not None: - # Only adjust if tac_range still at its default and the project did - # not provide an explicit tac_range. - project_has_tac_range = "tac_range" in project - if tac_range == (0.0, 50.0) and not project_has_tac_range: - tac_range = (0.0, float(dt_tac) * float(n_tac)) - - model = build_donor_from_project(project, pdb_path=pdb_path) - - # In curve mode, optionally scale photon statistics by n_curves to mimic - # the legacy behaviour where multiple curves were accumulated. This only - # affects the stochastic photon-based quantities (e.g. quantum yield), not - # the deterministic curve integration below. - if decay_mode == "curve" and n_curves is not None: - try: - model.n_photons = int(model.n_photons) * int(n_curves) - except Exception: - # If anything unexpected happens, fall back to the original count. - pass - - model.update_all(verbose=False) - - if decay_mode == "curve": - time, donor_counts = _curve_decay_from_model( - model, - effective_nbins, - tac_range, - dt_tac, - n_curves, - ) - else: - time, donor_counts = _histogram_decay(model, effective_nbins, tac_range) - - fret_counts: Optional[np.ndarray] = None - qy_fret: Optional[float] = None - fret_eff: Optional[float] = None - - if getattr(model, "fret_enabled", False): - xf, yf = model.get_histogram_fret(nbins=effective_nbins, range=tac_range) - if xf is not None and yf is not None: - fret_counts = yf - qy_fret = model.quantum_yield_fret - fret_eff = model.fret_efficiency - - return DecaySimulationResult( - time=time, - donor_counts=donor_counts, - fret_counts=fret_counts, - quantum_yield_donor=model.quantum_yield, - quantum_yield_fret=qy_fret, - collisions_fraction=model.collisions, - fret_efficiency=fret_eff, - project=project, - ) - - -__all__ = [ - "DecaySimulationResult", - "load_project", - "build_donor_from_project", - "simulate_project", -] diff --git a/quest/core/__init__.py b/quest/core/__init__.py new file mode 100644 index 0000000..08ef037 --- /dev/null +++ b/quest/core/__init__.py @@ -0,0 +1,52 @@ +"""QuEst's domain: the simulation and everything it needs, Qt-free and host-free. + +Relocated from the old in-tree ``quest/lib`` toolkit, which mixed the PET +workflow with a general-purpose structure library shadowing imp-tricks and +ChiSurf (okf/specs/imp-tricks-dedup.md). + +============================ ==================================================== +module owns +============================ ==================================================== +:mod:`~quest.core.simulation` the pipeline: ``simulate_project`` and the analysis +:mod:`~quest.core.dye_diffusion` ``SimulateDiffusion``, ``DonorDecay``, PET chemistry +:mod:`~quest.core.photon` photon-trace and decay kernels +:mod:`~quest.core.av` accessible volumes, grids, FRET rate traces +:mod:`~quest.core.structure` the ``Structure`` object +:mod:`~quest.core.pdb` structure reading, through IMP +:mod:`~quest.core.imp_av` the IMP.bff accessible-volume backend +:mod:`~quest.core.fps_json` fps.json labeling files +:mod:`~quest.core.io` point-cloud output +============================ ==================================================== +""" + +from .simulation import ( # noqa: F401 + DecaySimulationResult, + aa_residence_from_model, + autocorr, + autocorr_to_tau_window, + build_donor_from_project, + calculate_aa_quenching, + calculate_aa_residence, + diffusion_coefficient_grid, + load_project, + sampled_density_grid, + simulate_project, + top_quenchers, + write_mrc, +) + +__all__ = [ + "DecaySimulationResult", + "aa_residence_from_model", + "autocorr", + "autocorr_to_tau_window", + "build_donor_from_project", + "calculate_aa_quenching", + "calculate_aa_residence", + "diffusion_coefficient_grid", + "load_project", + "sampled_density_grid", + "simulate_project", + "top_quenchers", + "write_mrc", +] diff --git a/quest/core/av.py b/quest/core/av.py new file mode 100644 index 0000000..06ef4fb --- /dev/null +++ b/quest/core/av.py @@ -0,0 +1,1300 @@ +import os.path +import json +import os +from collections import OrderedDict + +import numpy as np +from numba import njit, prange +# Qt-free: the accessible-volume widget that used to live here was unused, and +# it was the only reason this module imported a GUI toolkit. + +from . import pdb as PDB +from .structure import Structure +from .io import write_xyz + +try: + import LabelLib as ll + HAS_LABELLIB = True +except Exception: # pragma: no cover - optional dependency + HAS_LABELLIB = False + +from .imp_av import ( + HAS_IMP_BFF, + build_imp_accessible_volume, +) + + +#: Accessible-volume backends, in the order ``"auto"`` prefers them. +#: +#: LabelLib is first because it is the implementation QuEst has always actually +#: run. **The intended order is IMP.bff first, LabelLib as the fallback for +#: platforms without a compiled IMP.bff (Windows).** It is not that order yet, +#: because QuEst's own IMP integration (`imp_av.py`) is not fit to be primary — +#: measured 2026-07-27 by making it primary and running the suite: +#: +#: * **It ignores the structure it is handed.** `build_imp_accessible_volume` +#: re-reads the file from disk with `IMP.atom.read_pdb`, so any in-memory +#: change is discarded: a coarse-grained project silently gets the all-atom +#: volume (`test_coarse_grained` — coarse and all-atom came out *identical*, +#: 13883.805 A^3 both). +#: * **It cannot read mmCIF.** That re-read is `read_pdb` only, so a `.cif` +#: project fails outright (`test_mc4r`: "No molecule read from file"). +#: * The two backends also disagree on volume by ~20 % on 148l E15 — same place +#: (centroids within 0.6 A), less of it — which is an algorithmic difference, +#: not a parameter one, and it propagates to the contact fraction. +#: +#: The fix is not to patch `imp_av.py`: it is to route through +#: `IMP.bff.av.compute.compute_av`, which takes plain arrays and therefore +#: *cannot* re-read a file or miss a coarse-graining. That needs its `imp_bff` +#: backend fixed upstream first (see okf/specs/imp-tricks-dedup.md). +AV_BACKENDS = ("labellib", "imp_bff") + +#: Smallest `allowed_sphere_radius` that IMP.bff's path search can start from. +#: +#: The parameter is the radius around the attachment atom inside which obstacles +#: are ignored, so the linker can leave the atom it is tied to. Below ~2 A the +#: attachment atom's own neighbours block every starting voxel and the search +#: returns an **empty volume with no error** -- which is exactly what QuEst's +#: IMP backend did for months while the default was 0.5. LabelLib has no such +#: parameter; it zeroes the attachment atom's radius instead. +MIN_IMP_ALLOWED_SPHERE_RADIUS = 2.0 + + +def available_av_backends(): + """Return the accessible-volume backends usable in this interpreter.""" + available = [] + if HAS_LABELLIB: + available.append("labellib") + if HAS_IMP_BFF: + available.append("imp_bff") + return available + + +def resolve_av_backend(preference=None): + """Pick the accessible-volume backend to use. + + Parameters + ---------- + preference : str, optional + ``"labellib"``, ``"imp_bff"``, or ``"auto"``. Defaults to the + ``QUEST_AV_BACKEND`` environment variable, else ``"auto"``. + + Raises + ------ + ValueError + If the name is not a known backend. + RuntimeError + If the requested backend -- or, for ``"auto"``, any backend -- is + unavailable. The message says which ones are, rather than failing later + with an empty volume. + """ + choice = str(preference or os.environ.get("QUEST_AV_BACKEND") or "auto").strip().lower() + available = available_av_backends() + + if choice == "auto": + for backend in AV_BACKENDS: + if backend in available: + return backend + raise RuntimeError( + "No accessible-volume backend is available. Install LabelLib " + "(preferred) or an IMP build providing IMP.bff." + ) + + if choice not in AV_BACKENDS: + raise ValueError( + f"Unknown accessible-volume backend {choice!r}; expected one of " + f"{', '.join(AV_BACKENDS)} or 'auto'." + ) + if choice not in available: + raise RuntimeError( + f"Accessible-volume backend {choice!r} was requested but is not " + f"available; usable backends here: {', '.join(available) or 'none'}." + ) + return choice + + +# Numba-accelerated kernels (flattened from fps.py) +def _points_from_centred_grid(density, ng, dg, centre): + """Point cloud of a cubic grid described by its *centre* rather than a corner. + + QuEst's own AV carries ``x0`` (the attachment point, at the middle voxel); + LabelLib reports a corner. One kernel, two conventions, one shift. + + Plain Python on purpose: it does arithmetic on three numbers and then calls + the jitted kernel. Compiling *this* would only make it unable to see + :func:`density2points` as anything but an untyped global. + """ + origin = np.asarray(centre, dtype=np.float64) - (ng - 1) / 2.0 * float(dg) + return density2points(ng, ng, ng, dg, density, origin) + + +@njit(cache=True, parallel=True) +def _ran_dist(av1_points, av2_points, distances, n_samples): + lp1 = av1_points.shape[0] + lp2 = av2_points.shape[0] + for i in prange(n_samples): + i1 = int(np.random.random() * lp1) + i2 = int(np.random.random() * lp2) + d0 = av1_points[i1, 0] - av2_points[i2, 0] + d1 = av1_points[i1, 1] - av2_points[i2, 1] + d2 = av1_points[i1, 2] - av2_points[i2, 2] + distances[i] = np.sqrt(d0 * d0 + d1 * d1 + d2 * d2) + + +def RDAMeanE(av1, av2, R0: float = 52.0, nSamples: int = 50_000): + """Forster-averaged donor-acceptor distance _E, in Angstrom. + + ``R0`` is in Angstrom, matching the AV point clouds. This is the average a + FRET-efficiency measurement reports; it is not interchangeable with the + plain mean distance :func:`RDAMean` or the mean-position distance + :func:`dRmp`. + """ + distances = np.empty(nSamples, dtype=np.float64) + _ran_dist(av1.points, av2.points, distances, nSamples) + Esum = np.mean(1.0 / (1.0 + (distances / R0) ** 6.0)) + return (1.0 / Esum - 1.0) ** (1.0 / 6.0) * R0 + + +@njit(cache=True, parallel=True) +def _fret_rate_trace(trajectory, acceptor_points, R0, tau0, r_min2): + n_frames = trajectory.shape[0] + n_acceptor = acceptor_points.shape[0] + rates = np.empty(n_frames, dtype=np.float64) + R0_6 = R0 ** 6 + inv_tau0 = 1.0 / tau0 + for frame in prange(n_frames): + px = trajectory[frame, 0] + py = trajectory[frame, 1] + pz = trajectory[frame, 2] + total = 0.0 + for j in range(n_acceptor): + dx = px - acceptor_points[j, 0] + dy = py - acceptor_points[j, 1] + dz = pz - acceptor_points[j, 2] + r2 = dx * dx + dy * dy + dz * dz + if r2 < r_min2: + r2 = r_min2 + total += R0_6 / (r2 * r2 * r2) + rates[frame] = inv_tau0 * total / n_acceptor + return rates + + +@njit(cache=True, parallel=True) +def _fret_rate_pair_trace(donor, acceptor, R0, tau0, r_min2): + n_frames = donor.shape[0] + rates = np.empty(n_frames, dtype=np.float64) + R0_6 = R0 ** 6 + inv_tau0 = 1.0 / tau0 + for frame in prange(n_frames): + dx = donor[frame, 0] - acceptor[frame, 0] + dy = donor[frame, 1] - acceptor[frame, 1] + dz = donor[frame, 2] - acceptor[frame, 2] + r2 = dx * dx + dy * dy + dz * dz + if r2 < r_min2: + r2 = r_min2 + rates[frame] = inv_tau0 * R0_6 / (r2 * r2 * r2) + return rates + + +def fret_rate_pair_trace( + donor_trajectory, + acceptor_trajectory, + R0: float, + tau0: float, + r_min: float = 7.0, +): + """Per-frame FRET rate (1/ns) from *two* trajectories. + + Both dyes are resolved in time:: + + k_FRET(t) = (1/tau0) * (R0 / |r_D(t) - r_A(t)|)^6 + + This is the general case. :func:`fret_rate_trace` averages the acceptor over + its accessible volume instead, which is the *fast-acceptor limit* — correct + only when the acceptor explores its volume quickly compared with the donor's + excited-state lifetime. + + The two do not agree, and the reason is **occupancy**, not the averaging + order. The cloud is weighted uniformly: every accessible voxel counts the + same. A trajectory is weighted by where the dye actually spends its time, + and a sticky dye dwells near the protein surface rather than out in the + free volume. Which way that moves the efficiency depends on the geometry — + it is not a fixed bias. On 148l E15→E90 with a sticky acceptor + (D = 2.5 Ų/ns, slow radius 11 Å) it raised E from 0.73 to 0.78, because + the sticky region there lies toward the donor. + + The two walks are independent, so pairing frame *i* with frame *i* samples + the joint distribution correctly **provided both were simulated on the same + time base** — same ``t_step`` and same number of frames. The caller is + responsible for that; a mismatch raises. + + Parameters + ---------- + donor_trajectory, acceptor_trajectory : array_like, shape (n_frames, 3) + Dye centre positions in Angstrom, frame-aligned. + R0 : float + Forster radius in Angstrom. + tau0 : float + Unquenched donor lifetime in nanoseconds. + r_min : float + Closest approach of the two dye centres, in Angstrom. Two dye spheres + cannot interpenetrate, and ``(R0/r)^6`` diverges if they are allowed to. + + Returns + ------- + numpy.ndarray + Rates in 1/ns, one per frame. + """ + donor = np.ascontiguousarray(donor_trajectory, dtype=np.float64).reshape((-1, 3)) + acceptor = np.ascontiguousarray(acceptor_trajectory, dtype=np.float64).reshape((-1, 3)) + if donor.shape[0] == 0 or acceptor.shape[0] == 0: + raise ValueError("Both trajectories must have frames to pair.") + if tau0 <= 0.0: + raise ValueError("tau0 must be positive to derive a FRET rate.") + if donor.shape[0] != acceptor.shape[0]: + # Truncating would silently change the sampled time window; a caller + # that meant to do that should say so. + raise ValueError( + "Donor and acceptor trajectories must have the same number of " + f"frames to pair ({donor.shape[0]} vs {acceptor.shape[0]}); " + "simulate both dyes with the same t_max and t_step." + ) + r_min = max(float(r_min), 1e-6) + return _fret_rate_pair_trace(donor, acceptor, float(R0), float(tau0), r_min * r_min) + + +def fret_rate_trace( + trajectory, + acceptor_points, + R0: float, + tau0: float, + r_min: float = 7.0, + max_acceptor_points: int = 512, +): + """Per-frame FRET rate (1/ns) along a donor trajectory. + + For every donor position the transfer rate is averaged over the acceptor's + accessible volume:: + + k_FRET(t) = (1/tau0) * < (R0 / |r_D(t) - r_A|)^6 >_A + + This resolves the donor in time -- the point of simulating its diffusion at + all -- while treating the acceptor as sampling its own volume quickly + compared with the donor's excited-state lifetime. That is the fast-acceptor + limit; it is not valid if the acceptor is immobilised. + + Parameters + ---------- + trajectory : array_like, shape (n_frames, 3) + Donor positions in Angstrom. + acceptor_points : array_like, shape (n, 3) + Acceptor accessible-volume cloud in Angstrom. + R0 : float + Forster radius in Angstrom. + tau0 : float + Unquenched donor lifetime in nanoseconds. + r_min : float + Closest approach of the two dye centres, in Angstrom. Both clouds are + centre positions and can overlap in space, where ``(R0/r)^6`` would + otherwise diverge; two dye spheres cannot actually interpenetrate, so + the distance is floored at the sum of their radii. + max_acceptor_points : int + Cap on the acceptor points averaged over, taken by an even stride. The + average converges long before the full cloud, and the cost is + ``n_frames * n_acceptor``. + + Returns + ------- + numpy.ndarray + Rates in 1/ns, one per frame. + """ + trajectory = np.ascontiguousarray(trajectory, dtype=np.float64).reshape((-1, 3)) + points = np.ascontiguousarray(acceptor_points, dtype=np.float64).reshape((-1, 3)) + if points.shape[0] == 0: + raise ValueError("Acceptor accessible volume is empty; cannot compute FRET rates.") + if tau0 <= 0.0: + raise ValueError("tau0 must be positive to derive a FRET rate.") + if points.shape[0] > max_acceptor_points: + stride = int(np.ceil(points.shape[0] / float(max_acceptor_points))) + points = np.ascontiguousarray(points[::stride]) + r_min = max(float(r_min), 1e-6) + return _fret_rate_trace(trajectory, points, float(R0), float(tau0), r_min * r_min) + + +def RDAMean(av1, av2, nSamples: int = 50_000): + distances = np.empty(nSamples, dtype=np.float64) + _ran_dist(av1.points, av2.points, distances, nSamples) + return float(np.mean(distances)) + + +def dRmp(av1, av2): + return float(np.sqrt(((av1.Rmp - av2.Rmp) ** 2).sum())) + + +@njit(cache=True) +def _center_grid_indices(rs, r0, dg, ng, radius): + """Voxel coordinates and integer radii of the sphere centres.""" + n = rs.shape[0] + ix0 = np.empty(n, dtype=np.int64) + iy0 = np.empty(n, dtype=np.int64) + iz0 = np.empty(n, dtype=np.int64) + radius_idx = np.empty(n, dtype=np.int64) + offset = (ng - 1) // 2 + for i in range(n): + ix0[i] = int((rs[i, 0] - r0[0]) / dg) + offset + iy0[i] = int((rs[i, 1] - r0[1]) / dg) + offset + iz0[i] = int((rs[i, 2] - r0[2]) / dg) + offset + radius_idx[i] = int(radius[i] / dg) + return ix0, iy0, iz0, radius_idx + + +# The three grid kernels below only visit the voxels inside each centre's +# bounding box instead of testing every voxel against every centre. The outer +# loop stays over x-slabs so the work is parallel and free of write races. +@njit(cache=True, parallel=True) +def _subav(density, ng, slow_radius, rs, r0, dg): + subav_density = density.copy() + n_slow_center = rs.shape[0] + ix0s, iy0s, iz0s, radius_idxs = _center_grid_indices(rs, r0, dg, ng, slow_radius) + + for ix in prange(ng): + is_slow = np.zeros((ng, ng), dtype=np.uint8) + for isa in range(n_slow_center): + r_idx = radius_idxs[isa] + dx = ix - ix0s[isa] + remaining = r_idx * r_idx - dx * dx + if remaining <= 0: + continue + iy0 = iy0s[isa] + iz0 = iz0s[isa] + y_lo = max(0, iy0 - r_idx) + y_hi = min(ng - 1, iy0 + r_idx) + for iy in range(y_lo, y_hi + 1): + dy = iy - iy0 + span2 = remaining - dy * dy + if span2 <= 0: + continue + span = int(np.sqrt(span2)) + # The membership test is strict (d^2 < r^2), so drop the + # boundary voxel when span2 is a perfect square. + if span * span >= span2: + span -= 1 + if span < 0: + continue + z_lo = max(0, iz0 - span) + z_hi = min(ng - 1, iz0 + span) + for iz in range(z_lo, z_hi + 1): + is_slow[iy, iz] = 1 + for iy in range(ng): + for iz in range(ng): + if is_slow[iy, iz] == 0: + subav_density[ix, iy, iz] = 0 + return subav_density + + +def subav(density, ng, dg, slow_radius, rs, r0): + return _subav( + np.asarray(density, dtype=np.uint8), + int(ng), + np.asarray(slow_radius, dtype=np.float64), + np.asarray(rs, dtype=np.float64), + np.asarray(r0, dtype=np.float64), + float(dg), + ) + + +@njit(cache=True, parallel=True) +def _slow_factor_grid(density, ng, slow_radius, rs, r0, dg, slow_fact): + factors = np.ones(density.shape, dtype=np.float64) + n_slow_center = rs.shape[0] + ix0s, iy0s, iz0s, radius_idxs = _center_grid_indices(rs, r0, dg, ng, slow_radius) + + for ix in prange(ng): + slab = np.ones((ng, ng), dtype=np.float64) + touched = False + for isa in range(n_slow_center): + r_idx = radius_idxs[isa] + dx = ix - ix0s[isa] + remaining = r_idx * r_idx - dx * dx + if remaining <= 0: + continue + factor = slow_fact[isa] + iy0 = iy0s[isa] + iz0 = iz0s[isa] + y_lo = max(0, iy0 - r_idx) + y_hi = min(ng - 1, iy0 + r_idx) + for iy in range(y_lo, y_hi + 1): + dy = iy - iy0 + span2 = remaining - dy * dy + if span2 <= 0: + continue + span = int(np.sqrt(span2)) + # The membership test is strict (d^2 < r^2), so drop the + # boundary voxel when span2 is a perfect square. + if span * span >= span2: + span -= 1 + if span < 0: + continue + z_lo = max(0, iz0 - span) + z_hi = min(ng - 1, iz0 + span) + for iz in range(z_lo, z_hi + 1): + slab[iy, iz] *= factor + touched = True + if touched: + for iy in range(ng): + for iz in range(ng): + if density[ix, iy, iz] != 0: + factors[ix, iy, iz] = slab[iy, iz] + return factors + + +@njit(cache=True, parallel=True) +def _additive_factor_grid(density, ng, radius, rs, r0, dg, values): + factors = np.zeros(density.shape, dtype=np.float64) + n_center = rs.shape[0] + ix0s, iy0s, iz0s, radius_idxs = _center_grid_indices(rs, r0, dg, ng, radius) + + for ix in prange(ng): + slab = np.zeros((ng, ng), dtype=np.float64) + touched = False + for isa in range(n_center): + value = values[isa] + if value == 0.0: + continue + r_idx = radius_idxs[isa] + dx = ix - ix0s[isa] + remaining = r_idx * r_idx - dx * dx + if remaining <= 0: + continue + iy0 = iy0s[isa] + iz0 = iz0s[isa] + y_lo = max(0, iy0 - r_idx) + y_hi = min(ng - 1, iy0 + r_idx) + for iy in range(y_lo, y_hi + 1): + dy = iy - iy0 + span2 = remaining - dy * dy + if span2 <= 0: + continue + span = int(np.sqrt(span2)) + # The membership test is strict (d^2 < r^2), so drop the + # boundary voxel when span2 is a perfect square. + if span * span >= span2: + span -= 1 + if span < 0: + continue + z_lo = max(0, iz0 - span) + z_hi = min(ng - 1, iz0 + span) + for iz in range(z_lo, z_hi + 1): + slab[iy, iz] += value + touched = True + if touched: + for iy in range(ng): + for iz in range(ng): + if density[ix, iy, iz] != 0: + factors[ix, iy, iz] = slab[iy, iz] + return factors + + +def slow_factor_grid(density, ng, dg, slow_radius, rs, r0, slow_fact): + return _slow_factor_grid( + np.asarray(density, dtype=np.uint8), + int(ng), + np.asarray(slow_radius, dtype=np.float64), + np.asarray(rs, dtype=np.float64), + np.asarray(r0, dtype=np.float64), + float(dg), + np.asarray(slow_fact, dtype=np.float64), + ) + + +def additive_factor_grid(density, ng, dg, radius, rs, r0, values): + return _additive_factor_grid( + np.asarray(density, dtype=np.uint8), + int(ng), + np.asarray(radius, dtype=np.float64), + np.asarray(rs, dtype=np.float64), + np.asarray(r0, dtype=np.float64), + float(dg), + np.asarray(values, dtype=np.float64), + ) + + +# Sequential on purpose: the random walk is a strict chain of dependent steps, +# so parallel=True buys no speed-up and splits the random draws across threads, +# which makes `random_seed` non-reproducible. +# +# ``nogil`` is what makes running *whole* trajectories concurrently worthwhile: +# without it the callers' thread pools serialise on the GIL. Numba's RNG state +# is thread-local, so each worker still reproduces its own ``random_seed``. +@njit(cache=True, nogil=True) +def _simulate_traj(d, ds, dg, t_max, t_step, D, slow_fact, random_seed): + if random_seed >= 0: + np.random.seed(random_seed) + n_samples = int(t_max / t_step) + ng = d.shape[0] + sigma = np.sqrt(2 * D * 3 * t_step) / dg + pos = np.zeros((n_samples, 3), dtype=np.float64) + accepted = np.zeros(n_samples, dtype=np.uint8) + r = np.random.normal(0.0, sigma, size=(n_samples, 3)) + slow_fact_sqrt = np.sqrt(slow_fact) + + # pick a starting point in AV + found = False + for _ in range(1000): + x_idx = np.random.randint(0, ng) + y_idx = np.random.randint(0, ng) + z_idx = np.random.randint(0, ng) + if d[x_idx, y_idx, z_idx] > 0: + pos[0, 0] = x_idx + pos[0, 1] = y_idx + pos[0, 2] = z_idx + found = True + break + if not found: + return pos, accepted, 0, 0 + + n_accepted = 1 + n_rejected = 0 + i_accepted = 0 + accepted[0] = 1 + for i in range(1, n_samples): + x_idx = int(pos[i_accepted, 0]) + y_idx = int(pos[i_accepted, 1]) + z_idx = int(pos[i_accepted, 2]) + if ds[x_idx, y_idx, z_idx] > 0: + r[i, 0] *= slow_fact_sqrt + r[i, 1] *= slow_fact_sqrt + r[i, 2] *= slow_fact_sqrt + + pos[i, 0] = pos[i_accepted, 0] + r[i, 0] + pos[i, 1] = pos[i_accepted, 1] + r[i, 1] + pos[i, 2] = pos[i_accepted, 2] + r[i, 2] + + x_idx = int(pos[i, 0]) + y_idx = int(pos[i, 1]) + z_idx = int(pos[i, 2]) + if 0 <= x_idx < ng and 0 <= y_idx < ng and 0 <= z_idx < ng and d[x_idx, y_idx, z_idx] > 0: + i_accepted = i + n_accepted += 1 + accepted[i] = 1 + else: + pos[i, 0] = pos[i_accepted, 0] + pos[i, 1] = pos[i_accepted, 1] + pos[i, 2] = pos[i_accepted, 2] + n_rejected += 1 + accepted[i] = 0 + return (pos - (ng - 1) / 2.0) * dg, accepted, n_accepted, n_rejected + + +# Sequential on purpose, and ``nogil`` for concurrency: see `_simulate_traj`. +@njit(cache=True, nogil=True) +def _simulate_traj_grid(d, slow_factor, dg, t_max, t_step, D, random_seed): + if random_seed >= 0: + np.random.seed(random_seed) + n_samples = int(t_max / t_step) + ng = d.shape[0] + sigma = np.sqrt(2 * D * 3 * t_step) / dg + pos = np.zeros((n_samples, 3), dtype=np.float64) + accepted = np.zeros(n_samples, dtype=np.uint8) + r = np.random.normal(0.0, sigma, size=(n_samples, 3)) + + found = False + for _ in range(1000): + x_idx = np.random.randint(0, ng) + y_idx = np.random.randint(0, ng) + z_idx = np.random.randint(0, ng) + if d[x_idx, y_idx, z_idx] > 0: + pos[0, 0] = x_idx + pos[0, 1] = y_idx + pos[0, 2] = z_idx + found = True + break + if not found: + return pos, accepted, 0, 0 + + n_accepted = 1 + n_rejected = 0 + i_accepted = 0 + accepted[0] = 1 + for i in range(1, n_samples): + x_idx = int(pos[i_accepted, 0]) + y_idx = int(pos[i_accepted, 1]) + z_idx = int(pos[i_accepted, 2]) + factor = slow_factor[x_idx, y_idx, z_idx] + if factor < 1.0: + factor_sqrt = np.sqrt(factor) + r[i, 0] *= factor_sqrt + r[i, 1] *= factor_sqrt + r[i, 2] *= factor_sqrt + + pos[i, 0] = pos[i_accepted, 0] + r[i, 0] + pos[i, 1] = pos[i_accepted, 1] + r[i, 1] + pos[i, 2] = pos[i_accepted, 2] + r[i, 2] + + x_idx = int(pos[i, 0]) + y_idx = int(pos[i, 1]) + z_idx = int(pos[i, 2]) + if 0 <= x_idx < ng and 0 <= y_idx < ng and 0 <= z_idx < ng and d[x_idx, y_idx, z_idx] > 0: + i_accepted = i + n_accepted += 1 + accepted[i] = 1 + else: + pos[i, 0] = pos[i_accepted, 0] + pos[i, 1] = pos[i_accepted, 1] + pos[i, 2] = pos[i_accepted, 2] + n_rejected += 1 + accepted[i] = 0 + return (pos - (ng - 1) / 2.0) * dg, accepted, n_accepted, n_rejected + + +def simulate_traj(d, ds, dg, t_max, t_step, D, slow_fact, random_seed=None): + seed = -1 if random_seed is None else int(random_seed) + slow_fact_array = np.asarray(slow_fact) + if slow_fact_array.ndim == 3: + return _simulate_traj_grid( + np.asarray(d, dtype=np.uint8), + np.asarray(slow_fact, dtype=np.float64), + float(dg), + float(t_max), + float(t_step), + float(D), + seed, + ) + return _simulate_traj( + np.asarray(d, dtype=np.uint8), + np.asarray(ds, dtype=np.uint8), + float(dg), + float(t_max), + float(t_step), + float(D), + float(slow_fact), + seed, + ) + + +def spherePoints(nSphere: int): + inc = np.pi * (3.0 - np.sqrt(5.0)) + offset = 2.0 / float(nSphere) + k_vals = np.arange(nSphere, dtype=np.float32) + y = k_vals * offset - 1.0 + (offset / 2.0) + rd = np.sqrt(1.0 - y * y) + phi = k_vals * inc + x = np.cos(phi) * rd + z = np.sin(phi) * rd + return np.stack([x, y, z], axis=1).astype(np.float32) + + +@njit(cache=True) +def _asa(r, vdw, probe_atom_indices, sphere_points, probe, radius): + nSphere = sphere_points.shape[0] + n_probe_atoms = probe_atom_indices.shape[0] + n_atoms = r.shape[0] + if n_probe_atoms == 0 or nSphere == 0 or n_atoms == 0: + return np.zeros(n_probe_atoms, dtype=np.float32) + + neighbor_indices = np.zeros(n_atoms, dtype=np.uint32) + probe_atom_asa = np.zeros(n_probe_atoms, dtype=np.float32) + c = 4.0 * np.pi / float(nSphere) + for i in range(n_probe_atoms): + probe_atom_index = probe_atom_indices[i] + n_neighbor = 0 + aX, aY, aZ = r[probe_atom_index] + for atom_index in range(n_atoms): + if probe_atom_index != atom_index: + bX, bY, bZ = r[atom_index] + dist2 = (aX - bX) ** 2 + (aY - bY) ** 2 + (aZ - bZ) ** 2 + if dist2 < 2 * (vdw[probe_atom_index] + probe): + neighbor_indices[n_neighbor] = atom_index + n_neighbor += 1 + + n_accessible_point = 0 + for j in range(nSphere): + is_accessible = True + aX = sphere_points[j, 0] * radius + r[probe_atom_index, 0] + aY = sphere_points[j, 1] * radius + r[probe_atom_index, 1] + aZ = sphere_points[j, 2] * radius + r[probe_atom_index, 2] + for k in range(n_neighbor): + bX, bY, bZ = r[neighbor_indices[k]] + dist2 = (aX - bX) ** 2 + (aY - bY) ** 2 + (aZ - bZ) ** 2 + if dist2 < (radius + probe) * (radius + probe): + is_accessible = False + break + if is_accessible: + n_accessible_point += 1 + probe_atom_asa[i] = c * n_accessible_point * vdw[probe_atom_index] ** 2 + return probe_atom_asa + + +def asa(r, vdw, probe_atom_indices, sphere_points, probe=1.0, radius=2.5): + r = np.asarray(r, dtype=np.float32) + vdw = np.asarray(vdw, dtype=np.float32) + probe_atom_indices = np.asarray(probe_atom_indices, dtype=np.uint32) + if sphere_points is None or np.asarray(sphere_points).ndim != 2: + sphere_points = spherePoints(590) + sphere_points = np.asarray(sphere_points, dtype=np.float32) + return _asa(r, vdw, probe_atom_indices, sphere_points, float(probe), float(radius)) + + +# ``nogil`` so that callers scanning many labelling sites in parallel are not +# serialised here -- this loop visits every voxel of the LabelLib grid and used +# to be the single most expensive step of a site simulation. +@njit(cache=True, nogil=True) +def _density2points(nx, ny, nz, dg, density, r0): + points = np.empty((nx * ny * nz, 3), dtype=np.float64) + iat = 0 + for iz in range(nz): + for iy in range(ny): + for ix in range(nx): + if density[ix, iy, iz] <= 0.0: + continue + points[iat, 0] = ix * dg + r0[0] + points[iat, 1] = iy * dg + r0[1] + points[iat, 2] = iz * dg + r0[2] + iat += 1 + return points[:iat] + + +def density2points(nx, ny, nz, dg, density, r0): + """Occupied voxels of a density grid, as an (n, 3) cloud in Angstrom. + + *r0* is the centre of voxel ``(0, 0, 0)``. A grid described by its *centre* + is the same thing with the origin shifted by ``-(n - 1) / 2 * dg`` per axis; + :func:`_points_from_centred_grid` does that, so this stays one kernel. + + There used to be two of these — a flat, centre-origin one for the in-tree AV + and this corner-origin one for LabelLib's grid — differing only in that + shift, which is not a reason for a second implementation of the same loop. + + The argument order matches `IMP.bff.av._kernels.density2points`, which is + where this belongs once imp-tricks is a real dependency rather than a + development path shim. Upstream's is a superset: it also keeps the per-voxel + weight, which QuEst discards. See + [imp-tricks-dedup](../../okf/specs/imp-tricks-dedup.md). + """ + # Keep whatever memory layout the caller has: the loop runs ``ix`` innermost, + # so the Fortran-ordered grid LabelLib produces is already the cache-friendly + # one and copying it to C order would only add a pass over every voxel. + return _density2points( + int(nx), int(ny), int(nz), + float(dg), + np.asarray(density, dtype=np.float64), + np.asarray(r0, dtype=np.float64), + ) + + +def calculate1R(l: float, + w: float, + r: float, + atom_i: int, + x: np.array, + y: np.array, + z: np.array, + vdw: np.array, + linkersphere: float = 0.5, + linknodes: int = 3, + vdwRMax: float = 1.8, + dg: float = 0.5, + verbose: bool = False + ): + """ + :param l: linker length + :param w: linker width + :param r: dye-radius + :param atom_i: attachment-atom index + :param x: Cartesian coordinates of atoms (x) + :param y: Cartesian coordinates of atoms (y) + :param z: Cartesian coordinates of atoms (z) + :param vdw: Van der Waals radii (same length as number of atoms) + :param linkersphere: Initial linker-sphere to start search of allowed dye positions (not used anymore) + :param linknodes: By default 3 (not used anymore) + :param vdwRMax: Maximal Van der Waals radius (not used anymore) + :param dg: Resolution of accessible volume in Angstrom + :param verbose: If true informative output is printed on std-out + :return: + """ + if verbose: + print("AV: calculate1R") + n_atoms = len(vdw) + x0, y0, z0 = x[atom_i], y[atom_i], z[atom_i] + r0 = np.array([x0, y0, z0]) + + vdw_copy = np.copy(vdw) + vdw_copy[atom_i] = 0.0 + atoms = np.vstack([x, y, z, vdw_copy]) + source = r0 + av1 = ll.dyeDensityAV1( + atoms, + source, + l, w, r, dg + ) + nx, ny, nz = av1.shape + # LabelLib hands back a plain Python list of nx*ny*nz floats. ``fromiter`` + # with an explicit count preallocates and skips the type probing np.array + # does, which is worth ~5 ms on a typical 92^3 grid. + grid = av1.grid + g = np.fromiter(grid, dtype=np.float64, count=len(grid)).reshape([nx, ny, nz], order='F') + if verbose: + print(nx, ny, nz, dg, dg, dg, x0, y0, z0) + ox = x0 - (nx - 1) / 2.0 * dg + oy = y0 - (ny - 1) / 2.0 * dg + oz = z0 - (nz - 1) / 2.0 * dg + points = density2points(nx, ny, nz, dg, g, (ox, oy, oz)) + g[g < 0] = 0 + g[g > 0] = 1 + density = g.astype(np.uint8) + ng = nx + + if verbose: + print("Number of atoms: %i" % n_atoms) + print("Attachment atom coordinates: %s" % r0) + + return points, density, ng, r0 + + +class AV(object): + + def __init__(self, structure, residue_seq_number=None, atom_name=None, chain_identifier=None, + linker_length=20.0, linker_width=0.5, radius1=5.0, + radius2=4.5, radius3=3.5, simulation_grid_resolution=0.5, save_av=False, output_file='out', + attachment_atom_index=None, verbose=False, allowed_sphere_radius=0.5, + simulation_type='AV1', position_name=None, residue_name=None, + av_backend=None): + + """ + Parameters + ---------- + :param structure: Structure of str + either string with path of pdb-file or pdb object + :param residue_seq_number: + :param atom_name: + :param chain_identifier: + :param linker_length: + :param linker_width: + :param radius1: + :param radius2: + :param radius3: + :param simulation_grid_resolution: + :param save_av: + :param output_file: + :param attachment_atom_index: + :param verbose: + :param allowed_sphere_radius: + :param simulation_type: + :param position_name: + :param residue_name: + :raise ValueError: + + Examples + -------- + Calculating accessible volume using provided pdb-file + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> residue_number = 18 + >>> atom_name = 'CB' + >>> attachment_atom = 1 + >>> av = lib.fps.AV(pdb_filename, attachment_atom=1, verbose=True) + + Calculating accessible volume using provided Structure object + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av = lib.fps.AV(structure, attachment_atom=1, verbose=True) + Calculating accessible volume + ----------------------------- + Loading PDB + Calculating initial-AV + Linker-length : 20.00 + Linker-width : 0.50 + Linker-radius : 5.00 + Attachment-atom: 1 + AV-resolution : 0.50 + AV: calculate1R + Number of atoms: 2647 + Attachment atom: [ 33.28 58.678 40.397] + Points in AV: 111911 + Points in total-AV: 111911 + + Using residue_seq_number and atom_name to calculate accessible volume, this also works without + chain_identifier. However, only if a single-chain is present. + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av = lib.fps.AV(structure, residue_seq_number=11, atom_name='CB', verbose=True) + + If save_av is True the calculated accessible volume is save to disk. The filename of the calculated + accessible volume is determined by output_file + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av = lib.fps.AV(structure, residue_seq_number=11, atom_name='CB', verbose=True, save_av=True, output_file='test') + Calculating accessible volume + ----------------------------- + Loading PDB + Calculating initial-AV + Linker-length : 20.00 + Linker-width : 0.50 + Linker-radius : 5.00 + Attachment-atom: 174 + AV-resolution : 0.50 + AV: calculate1R + Number of atoms: 2647 + Attachment atom: [ 41.606 44.953 36.625] + Points in AV: 22212 + Points in total-AV: 22212 + + write_xyz + --------- + Filename: test.xyz + ------------------- + + """ + self.verbose = verbose + self.points_slow = None + self.position_name = position_name + self.residue_name = residue_name + if verbose: + print("") + print("Calculating accessible volume") + print("-----------------------------") + if isinstance(structure, Structure): + atoms = structure.atoms + else: + if verbose: + print("Loading PDB") + atoms = PDB.read(structure, verbose=verbose) + x = atoms['coord'][:, 0] + y = atoms['coord'][:, 1] + z = atoms['coord'][:, 2] + vdw = atoms['radius'] + self.structure = structure + self.dg = simulation_grid_resolution + self.output_file = output_file + + # Determine Labeling position + if verbose: + print("Labeling position") + print("Chain ID: %s" % chain_identifier) + print("Residue seq. number: %s" % residue_seq_number) + print("Residue name: %s" % residue_name) + print("Atom name: %s" % atom_name) + + def _decode(value): + if isinstance(value, bytes): + return value.decode().strip() + if isinstance(value, np.bytes_): + return value.tobytes().decode().strip() + if isinstance(value, np.str_): + return str(value).strip() + return str(value).strip() + + if attachment_atom_index is None: + if residue_seq_number is None or atom_name is None: + raise ValueError("either attachment_atom number or residue and atom_name have to be provided.") + self.attachment_residue = residue_seq_number + self.attachment_atom = atom_name + if chain_identifier is None: + attachment_atom_index = np.where((atoms['res_id'] == residue_seq_number) & + (atoms['atom_name'] == atom_name))[0] + else: + attachment_atom_index = np.where((atoms['res_id'] == residue_seq_number) & + (atoms['atom_name'] == atom_name) & + (atoms['chain'] == chain_identifier))[0] + if len(attachment_atom_index) != 1: + # Name the selection: a project with two dyes hits this for the + # acceptor as readily as for the donor, and the bare message + # gave no way to tell which one was wrong. + site = "%s%s:%s" % ( + "" if chain_identifier is None else "%s:" % chain_identifier, + residue_seq_number, + atom_name, + ) + if len(attachment_atom_index) == 0: + raise ValueError( + "No attachment atom %s in the structure." % site + ) + raise ValueError( + "Attachment atom %s is ambiguous: it matches %d atoms." + % (site, len(attachment_atom_index)) + ) + else: + attachment_atom_index = attachment_atom_index[0] + if verbose: + print("Atom index: %s" %attachment_atom_index) + else: + if residue_seq_number is None: + residue_seq_number = int(atoms['res_id'][attachment_atom_index]) + if atom_name is None: + atom_name = _decode(atoms['atom_name'][attachment_atom_index]) + if chain_identifier is None: + chain_identifier = _decode(atoms['chain'][attachment_atom_index]) + self.attachment_residue = residue_seq_number + self.attachment_atom = atom_name + + if verbose: + print("Calculating initial-AV") + print("Linker-length : %.2f" % linker_length) + print("Linker-width : %.2f" % linker_width) + print("Linker-radius : %.2f" % radius1) + print("Attachment-atom: %i" % attachment_atom_index) + print("AV-resolution : %.2f" % simulation_grid_resolution) + backend = resolve_av_backend(av_backend) + self.av_backend = backend + if verbose: + print("AV backend : %s" % backend) + if backend == "imp_bff": + av_result = build_imp_accessible_volume( + structure=structure, + residue_seq_number=residue_seq_number, + atom_name=atom_name, + chain_identifier=chain_identifier, + linker_length=linker_length, + linker_width=linker_width, + radii=(radius1, radius2, radius3), + allowed_sphere_radius=max( + float(allowed_sphere_radius), MIN_IMP_ALLOWED_SPHERE_RADIUS + ), + simulation_grid_resolution=simulation_grid_resolution, + ) + density = av_result.density + ng = av_result.grid_size + x0 = av_result.attachment_point + npm = int((ng - 1) // 2) + n = density.sum() + points = _points_from_centred_grid( + density.reshape(ng, ng, ng), ng, simulation_grid_resolution, x0 + ) + else: + if simulation_type == 'AV3': + points, density, ng, x0 = calculate3R( + linker_length, + linker_width, + radius1, + radius2, + radius3, + attachment_atom_index, + x, + y, + z, + vdw, + dg=simulation_grid_resolution, + verbose=verbose, + linkersphere=allowed_sphere_radius, + ) + else: + points, density, ng, x0 = calculate1R( + linker_length, + linker_width, + radius1, + attachment_atom_index, + x, + y, + z, + vdw, + verbose=verbose, + linkersphere=allowed_sphere_radius, + dg=simulation_grid_resolution, + ) + + self.ng = ng + self.points = points + if len(points) == 0: + chain_str = f" on chain '{chain_identifier}'" if chain_identifier else "" + raise ValueError( + f"Accessible Volume is empty (0 points). Residue {residue_seq_number} ({atom_name}){chain_str} " + f"might be buried inside the protein." + ) + self.points_fast = points.copy() + self.density_fast = density + self.density_slow = None + self.slow_factor_grid = None + self.k_quench_grid = None + self.density = density + self.x0 = x0 + if verbose: + print("Points in total-AV: %i" % density.sum()) + if save_av: + write_xyz(output_file + '.xyz', points, verbose=verbose) + + def calc_slow_av( + self, slow_centers=None, slow_radius=None, save=True, verbose=True, replace_density=False, + slow_fact=None, quench_radius=None, k_quench=None, quench_centers=None): + """ + Calculates a subav given the accessible volume determined during class initiation. + : list/numpy array of points dimension (npoints, 3) + + + Parameters + ---------- + :param slow_centers : array_like + A list of Cartesian coordinated representing the slow centers. The shape should be (n,3) + where n is the number of slow centers. + :param slow_radius : array_like, or float + A list of radii the shape + :param slow_fact : array_like, float, or None + Optional per-center diffusion scaling factors used to build a + spatial slow-factor grid. Points affected by overlapping centers + multiply all contributing factors. + :param quench_centers : array_like, or None + Optional Cartesian coordinates of the quenching centres, shape + (n, 3), matching ``k_quench``. Defaults to ``slow_centers``. Passing + separate centres lets the quenching rate be evaluated at each + residue's redox-active moiety while stickiness stays on CB. + :param quench_radius : array_like, float, or None + Contact radius per quenching centre. Defaults to ``slow_radius``. + :param k_quench : array_like, float, or None + Quenching rate contributed by each centre inside its contact + radius. Contributions of overlapping centres add up. + :param replace_density : bool + If replace_density is True the AV-density will be replaced by the density of the slow + accessible volume + :param verbose : bool + :param save : bool + If save is True the slow-accessible volume is saved to an xyz-file with the suffix '_slow' + + """ + verbose = verbose or self.verbose + if verbose: + print("Calculating slow-AV:") + print(slow_centers) + if isinstance(slow_radius, (int, float)): + slow_radii = np.ones(slow_centers.shape[0])*slow_radius + elif len(slow_radius) != slow_centers.shape[0]: + raise ValueError("The size of the slow_radius doesnt match the number of slow_centers") + else: + slow_radii = np.asarray(slow_radius, dtype=np.float64) + + if slow_fact is None: + slow_facts = None + elif isinstance(slow_fact, (int, float)): + slow_facts = np.ones(slow_centers.shape[0], dtype=np.float64) * float(slow_fact) + elif len(slow_fact) != slow_centers.shape[0]: + raise ValueError("The size of the slow_fact doesnt match the number of slow_centers") + else: + slow_facts = np.asarray(slow_fact, dtype=np.float64) + + if quench_centers is None: + quench_points = slow_centers + else: + quench_points = np.asarray(quench_centers, dtype=np.float64).reshape((-1, 3)) + if quench_points.shape[0] != slow_centers.shape[0]: + raise ValueError("The number of quench_centers doesnt match the number of slow_centers") + + if quench_radius is None: + quench_radii = slow_radii + elif isinstance(quench_radius, (int, float)): + quench_radii = np.ones(quench_points.shape[0]) * quench_radius + elif len(quench_radius) != quench_points.shape[0]: + raise ValueError("The size of the quench_radius doesnt match the number of quench_centers") + else: + quench_radii = np.asarray(quench_radius, dtype=np.float64) + + if k_quench is None: + k_quench_values = None + elif isinstance(k_quench, (int, float)): + k_quench_values = np.ones(quench_points.shape[0], dtype=np.float64) * float(k_quench) + elif len(k_quench) != quench_points.shape[0]: + raise ValueError("The size of the k_quench doesnt match the number of quench_centers") + else: + k_quench_values = np.asarray(k_quench, dtype=np.float64) + + if verbose or self.verbose: + print("Calculating slow AV") + print("slow centers: \n%s" % slow_centers) + + ng = int(self.ng) + npm = int((ng - 1) // 2) + density = self.density_fast + dg = self.dg + x0 = self.x0 + slow_density = subav(density, ng, dg, slow_radii, slow_centers, x0) + n = slow_density.sum() + points = _points_from_centred_grid(slow_density.reshape(ng, ng, ng), ng, dg, x0) + if slow_facts is None: + self.slow_factor_grid = None + else: + self.slow_factor_grid = slow_factor_grid(density, ng, dg, slow_radii, slow_centers, x0, slow_facts) + if k_quench_values is None: + self.k_quench_grid = None + else: + self.k_quench_grid = additive_factor_grid(density, ng, dg, quench_radii, quench_points, x0, k_quench_values) + if verbose or self.verbose: + print("Points in slow-AV: %i" % n) + if save: + write_xyz(self.output_file + '_slow.xyz', points, verbose=verbose) + self.density_slow = slow_density + self.points_slow = points + if replace_density: + self.density = slow_density + + @property + def Rmp(self): + return self.points.mean(axis=0) + + def dRmp(self, av): + """ + Calculate the distance between the mean positions with respect to the accessible volume `av` + + Parameters + ---------- + av : accessible volume object + + Example + ------- + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') + >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') + >>> av1.dRmp(av2) + """ + return dRmp(self, av) + + def dRDA(self, av): + """ + Calculate the mean distance to the second accessible volume `av` + + Parameters + ---------- + av : accessible volume object + + Example + ------- + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') + >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') + >>> av1.dRDA(av2) + """ + return RDAMean(self, av) + + + def dRDAE(self, av): + """ + Calculate the FRET-averaged mean distance to the second accessible volume `av` + + Parameters + ---------- + av : accessible volume object + + Example + ------- + >>> >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' + >>> structure = lib.Structure(pdb_filename) + >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') + >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') + >>> av1.dRDAE(av2) + """ + return RDAMeanE(self, av) + + def __repr__(self): + s = '\n' + s += 'Accessible Volume\n' + s += '-----------------\n' + s += 'Attachment residue: %s\n' % self.attachment_residue + s += 'Attachment atom: %s\n' % self.attachment_atom + s += '\n' + s += 'Fast-AV:\n' + s += 'n-points: %s\n' % self.points_fast.shape[0] + if self.points_slow is not None: + s += 'Slow-AV:\n' + s += 'n-points: %s\n' % self.points_slow.shape[0] + else: + s += 'Slow-AV: not calculated' + return s + + diff --git a/quest/core/dye_diffusion.py b/quest/core/dye_diffusion.py new file mode 100644 index 0000000..4f83c2b --- /dev/null +++ b/quest/core/dye_diffusion.py @@ -0,0 +1,1551 @@ +import time +import os +import contextlib +from collections import OrderedDict +from concurrent.futures import ThreadPoolExecutor +import json +import tempfile +from pathlib import Path +import inspect + +import numpy as np +import numexpr as ne + +# No Qt in this module: the desktop form lives in `quest.gui`, and a headless +# run must not pay for a GUI toolkit it never uses. Progress is reported through +# a callback (see DonorDecay.update_all), not by driving a dialog from inside +# the simulation (okf/specs/plugin-integration.md). + +from . import photon + +from . import pdb as PDB +from .structure import Structure +from . import av as fps +from .av import AV +from .io import write_xyz + + +STANDARD_AMINO_ACID_RESIDUES = ( + "ALA", "ARG", "ASN", "ASP", "CYS", + "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", + "SER", "THR", "TRP", "TYR", "VAL", +) + +#: Atoms carrying the redox-active moiety that mediates photo-induced electron +#: transfer (PET) for each residue type. The quenching centre of a residue is +#: the centroid of whichever of these atoms are present in the structure, which +#: places the quencher on the actual reactive group (indole/phenol/imidazole +#: ring, thioether or thiol sulfur) instead of on CB. Residues without a known +#: PET-active group fall back to their side-chain stub so that a user-supplied +#: rate still has a well-defined centre. +DEFAULT_QUENCHER_ATOMS = OrderedDict(( + ("ALA", ("CB",)), + ("ARG", ("CZ", "NE", "NH1", "NH2")), + ("ASN", ("CG", "OD1", "ND2")), + ("ASP", ("CG", "OD1", "OD2")), + ("CYS", ("SG",)), + ("GLN", ("CD", "OE1", "NE2")), + ("GLU", ("CD", "OE1", "OE2")), + ("GLY", ("CA",)), + ("HIS", ("CG", "ND1", "CD2", "CE1", "NE2")), + ("ILE", ("CB",)), + ("LEU", ("CB",)), + ("LYS", ("NZ",)), + ("MET", ("SD",)), + ("PHE", ("CG", "CD1", "CD2", "CE1", "CE2", "CZ")), + ("PRO", ("N", "CB", "CG", "CD")), + ("SER", ("OG",)), + ("THR", ("OG1",)), + ("TRP", ("CD2", "CE2", "CE3", "CZ2", "CZ3", "CH2", "NE1", "CG", "CD1")), + ("TYR", ("CG", "CD1", "CD2", "CE1", "CE2", "CZ", "OH")), + ("VAL", ("CB",)), +)) + +#: Default dye radius (Angstrom) used to convert surface contact distances into +#: the centre-to-centre radii the simulation works with. +DEFAULT_DYE_RADIUS = 3.5 + +#: Reference photo-induced electron transfer parameters for a xanthene dye +#: (Alexa488-like) in contact with each residue type. Only residues with a +#: redox-active side chain quench; everything else stays at zero and can be +#: enabled by the user. +#: +#: ``kQ`` is the quenching rate (1/ns) applied while the dye is in contact. +#: ``contact_distance`` is the distance from the *dye surface* to the residue's +#: quenching centre at which PET still occurs -- roughly van der Waals contact +#: (~3.5 A) plus the offset from the moiety centroid to its outer atoms (~1.4 A +#: for the aromatic rings, zero for the single-atom sulfur centres). Expressing +#: it relative to the dye surface keeps the table transferable between dyes of +#: different size; the simulation adds the dye radius to obtain the +#: centre-to-centre ``quench_radius``. +#: +#: These are starting values meant to be calibrated against measured lifetimes, +#: not fixed constants -- see Peulen et al., J. Phys. Chem. B 2017, 121, 8211. +REFERENCE_PET_QUENCHING = OrderedDict(( + ("TRP", {"kQ": 3.5, "contact_distance": 5.0}), + ("TYR", {"kQ": 2.0, "contact_distance": 5.0}), + ("MET", {"kQ": 1.67, "contact_distance": 3.5}), + ("HIS", {"kQ": 1.0, "contact_distance": 4.7}), + ("CYS", {"kQ": 0.8, "contact_distance": 3.5}), + ("PRO", {"kQ": 2.0, "contact_distance": 4.0}), +)) + + +def default_quencher_table(): + """Reference PET chemistry in the legacy ``quencher`` shape the GUI edits. + + The Qt widget's quencher table is bound to ``DonorDecay.quencher`` + (``{residue: {"atoms": [...], "kQ": float}}``), which predates the + residue-resolved :func:`default_amino_acid_interactions` model used by the + CLI, the API and the web UI. Deriving the table from the same reference + chemistry keeps the GUI from simulating something different: quenchers sit + on the redox-active moiety, and each residue carries its own rate. + + The remaining difference is that this shape has no per-residue contact + radius or stickiness -- those stay global in the legacy path. + """ + return OrderedDict( + ( + residue, + { + "atoms": list(DEFAULT_QUENCHER_ATOMS[residue]), + "kQ": float(reference["kQ"]), + }, + ) + for residue, reference in REFERENCE_PET_QUENCHING.items() + ) + + +def default_amino_acid_interactions(kQ_scale=1.0, slow_factor=1.0, dye_radius=DEFAULT_DYE_RADIUS): + """Build a full interaction table from the reference PET chemistry. + + :param kQ_scale: float + Dye-specific multiplier applied to every reference ``kQ``. Dyes that + are harder to reduce/oxidise use a value below one. + :param slow_factor: float + Diffusion scaling applied near every residue (unspecific stickiness). + :param dye_radius: float + Radius of the dye sphere in Angstrom. The trajectory tracks the dye + centre, so the reference surface contact distances are offset by this + radius to yield centre-to-centre quench radii. + """ + radius = max(0.0, float(dye_radius)) + table = normalize_amino_acid_interactions() + for residue, params in table.items(): + params["slow_factor"] = _clamp_slow_factor(slow_factor) + reference = REFERENCE_PET_QUENCHING.get(residue) + if reference is None: + continue + params["kQ"] = max(0.0, float(reference["kQ"]) * float(kQ_scale)) + params["quench_radius"] = _normalize_quench_radius( + radius + float(reference["contact_distance"]) + ) + return table + + +DEFAULT_AMINO_ACID_SLOW_FACTS = OrderedDict((res, 1.0) for res in STANDARD_AMINO_ACID_RESIDUES) +DEFAULT_AMINO_ACID_INTERACTIONS = OrderedDict( + ( + res, + { + "slow_factor": 1.0, + "kQ": 0.0, + # ``None`` means "inherit the project-wide critical_distance". + "quench_radius": None, + "quench_atoms": list(DEFAULT_QUENCHER_ATOMS[res]), + }, + ) + for res in STANDARD_AMINO_ACID_RESIDUES +) +MAX_PARALLEL_TRAJECTORIES = 8 + + +def _normalize_residue_name(value): + if isinstance(value, bytes): + return value.decode("ascii", errors="ignore").strip().upper() + return str(value).strip().upper() + + +def _clamp_slow_factor(value): + return min(1.0, max(0.0, float(value))) + + +def _normalize_quench_radius(value): + """Return a positive quench radius, or ``None`` to inherit the global one.""" + if value is None: + return None + try: + radius = float(value) + except (TypeError, ValueError): + return None + if not np.isfinite(radius) or radius <= 0.0: + return None + return radius + + +def _normalize_quench_atoms(value, default): + """Return a de-duplicated tuple of atom names, falling back to ``default``.""" + if value is None: + return list(default) + if isinstance(value, (str, bytes)): + value = [value] + atoms = [] + for atom in value: + name = _normalize_residue_name(atom) + if name and name not in atoms: + atoms.append(name) + return atoms or list(default) + + +def normalize_amino_acid_slow_facts(value=None): + normalized = OrderedDict(DEFAULT_AMINO_ACID_SLOW_FACTS) + if not value: + return normalized + for residue, factor in value.items(): + normalized[_normalize_residue_name(residue)] = _clamp_slow_factor(factor) + return normalized + + +def normalize_amino_acid_interactions(value=None): + """Return the full per-residue interaction table with defaults filled in. + + Each entry carries the four quantities that make quenching residue-type + specific: + + ``slow_factor`` + How much the residue slows the diffusing dye down (unspecific + stickiness), between 0 and 1. + ``kQ`` + Quenching rate in 1/ns applied while the dye is in contact. + ``quench_radius`` + Contact radius in Angstrom, measured from the dye *centre* to the + residue's quenching centre. ``None`` inherits the project-wide + ``critical_distance``. + ``quench_atoms`` + Atom names whose centroid defines the quenching centre. + """ + normalized = OrderedDict( + (res, dict(params, quench_atoms=list(params["quench_atoms"]))) + for res, params in DEFAULT_AMINO_ACID_INTERACTIONS.items() + ) + if not value: + return normalized + for residue, params in value.items(): + name = _normalize_residue_name(residue) + defaults = normalized.get(name) or { + "slow_factor": 1.0, + "kQ": 0.0, + "quench_radius": None, + "quench_atoms": list(DEFAULT_QUENCHER_ATOMS.get(name, ("CB",))), + } + if isinstance(params, dict): + slow_factor = params.get("slow_factor", defaults["slow_factor"]) + kQ = params.get("kQ", defaults["kQ"]) + quench_radius = params.get("quench_radius", defaults["quench_radius"]) + quench_atoms = params.get("quench_atoms", defaults["quench_atoms"]) + else: + # Legacy format: a bare number meant the slow factor. + slow_factor = params + kQ = defaults["kQ"] + quench_radius = defaults["quench_radius"] + quench_atoms = defaults["quench_atoms"] + normalized[name] = { + "slow_factor": _clamp_slow_factor(slow_factor), + "kQ": max(0.0, float(kQ)), + "quench_radius": _normalize_quench_radius(quench_radius), + "quench_atoms": _normalize_quench_atoms( + quench_atoms, DEFAULT_QUENCHER_ATOMS.get(name, ("CB",)) + ), + } + return normalized + + +@contextlib.contextmanager +def _preserved_numba_environment(): + """Keep ``NUMBA_*`` environment variables stable across third-party imports. + + Numba resolves settings such as ``NUMBA_NUM_THREADS`` once, at import time, + and raises ``RuntimeError`` if a later configuration reload observes a + different value. Optional integrations (e.g. ChiSurf) set those variables + when they are imported, which would otherwise break every subsequent + ``@njit(parallel=True)`` compilation in this process. + """ + snapshot = {key: value for key, value in os.environ.items() if key.startswith("NUMBA_")} + try: + yield + finally: + for key in [key for key in os.environ if key.startswith("NUMBA_")]: + if key not in snapshot: + del os.environ[key] + os.environ.update(snapshot) + + + + +def selection2atom_idx(pdb, res_types, verbose=False): + """ + Lookup atom-idx using residues: + a = {'TRP': 'CA'} + selection2atom_idx(pdb, a, all_atoms=False) + returns all CA atoms of TRP in the PDB + + selection2atom_idx(pdb, a, all_atoms=True) + returns all atoms of TRP in the PDB + + """ + if verbose: + print("selection2atom_idx") + atom_idx = OrderedDict() + for residue_key in res_types: + atoms = [] + for atom_name in res_types[residue_key]: + atoms.append(np.where((pdb['res_name'] == residue_key) & (pdb['atom_name'] == atom_name))[0]) + if len(atoms) > 0: + atom_idx[residue_key] = np.array(np.hstack(atoms), dtype=np.uint32) + else: + atom_idx[residue_key] = np.array([], dtype=np.uint32) + return atom_idx + + +def save_hist(filename, x, y, verbose=False): + """ + Saves data x, y to file in histogram-format (csv). x and y + should have the same lenght. + :param filename: string + Target filename + :param x: array + :param y: array + :param verbose: bool + """ + if verbose: + print("Writing histogram to file: %s" % filename) + fp = open(filename, 'w') + for p in zip(x, y): + fp.write('%.3f\t%i\n' % (p[0], p[1])) + fp.close() + + +def is_quenched(distance2, critical_distance, verbose=False): + """ + square of distance to quencher + """ + critical_distance2 = critical_distance**2 + collided = np.less(distance2, critical_distance2) + re = collided.sum(axis=0).T + if verbose: + print("Determine if frame is quenched") + nq = re.sum() + nt = re.shape[0] + print("Quenched frames: %s/%s, %.2f%%" % (nq, nt, float(nq) / nt * 100.0)) + return np.asarray(re, dtype=np.uint8) + + +def get_quencher_coordinates(pdb, quencher, verbose=True, all_atoms=True): + """ + returns coordinates and indices of all atoms of certain + residue type. + pdb: is a numpy-pdb array as returned by PDB.read + """ + if verbose: + print("Finding quenchers") + print(quencher) + atom_idx = selection2atom_idx(pdb, quencher) + coordinates = OrderedDict() + for res_key in quencher: + coordinates[res_key] = pdb['coord'][atom_idx[res_key]] + if verbose: + print("Quencher atom-indeces: \n %s" % atom_idx) + print("Quencher coordinates: \n %s" % coordinates) + return coordinates + + +class SimulateDiffusion(object): + + @property + def mean(self): + traj = self._traj + mean = traj.mean(axis=0) + return mean + + @property + def distance_to_mean(self): + mean = self.mean + dm = np.linalg.norm(self._traj - mean, axis=1) + return dm + + @property + def traj(self): + if self.quencher is None: + raise ValueError("Set quenching residues") + if self._traj is None: + raise ValueError("Run simulation first.") + if self._critical_distance is None: + raise ValueError("Set critical quenching distance") + return self._traj, self._is_quenched + + @property + def critical_distance(self): + return self._critical_distance + + @property + def quencher_distances(self): + if self._quencher_distances is None: + raise ValueError("Set quencher first.") + return self._quencher_distances + + @critical_distance.setter + def critical_distance(self, v): + self._critical_distance = v + if self._k_quench_grid_trace is not None: + self._is_quenched = self._k_quench_grid_trace > 0.0 + return + if not self.quencher: + if self._traj is not None: + self._is_quenched = np.zeros(self._traj.shape[0], dtype=bool) + return + self._is_quenched = is_quenched(self.quencher_distances, self._critical_distance, self.verbose) + + @property + def quenched(self): + if self._is_quenched is None: + raise ValueError("Run simulation first and set critical distance") + return self._is_quenched + + def save_trajectory(self, filename, skip): + write_xyz(filename, (self._traj)[::skip]) + + def __init__(self, av, quencher, output_file='out', verbose=False, + critical_distance=None, asa_calc=False, asa_n_sphere_point=590, asa_probe_radius=0.5, + trajectory_suffix='_traj.xyz', all_quencher_atoms=True): + """ + + :param av: + :param quencher: + :param output_file: + :param verbose: + :param critical_distance: + :param asa_calc: bool + By default False. If True the ASA of the residues is calculated + :param asa_n_sphere_point: int + By default 590. The number of sphere-points around each atoms used for the calculationg + of the ASA. + :param asa_probe_radius: + :param trajectory_suffix: + :param all_quencher_atoms: + pdb_file: pdb-file of the structure + """ + if verbose: + print("") + print("Simulate Diffusion") + print("-----------------") + self.av = av + self.all_quencher_atoms = all_quencher_atoms + + # ASA of residues + self.asa_calc = asa_calc + self.asa_n_sphere_point = asa_n_sphere_point + self.asa_probe_radius = asa_probe_radius + self.asa_n_sphere_point = asa_n_sphere_point + self.asa_sphere_points = fps.spherePoints(asa_n_sphere_point) if asa_calc else None + self._asa = None + + self.pdb = av.structure.atoms + self.verbose = verbose + av_fast, av_slow, x0, dg = av.density_fast, av.density_slow, av.x0, av.dg + self.dg = dg + self.x0 = x0 + self.output_file = output_file + self.av_fast = av_fast + self.av_slow = av_slow + self.t_step = None + self._traj = None + self._critical_distance = critical_distance + + self._quencher = None + self._quencher_coordinates = None + self._quencher_distances = None + self._is_quenched = None + self._k_quench_grid_trace = None + self._kQ = None + self._quencher_row_ranges = {} + if self._has_k_quench_grid(): + self._quencher = OrderedDict() + self._quencher_atom_indices = OrderedDict() + self._quencher_coordinates = OrderedDict() + elif not quencher: + self._quencher = OrderedDict() + self._quencher_atom_indices = OrderedDict() + self._quencher_coordinates = OrderedDict() + self._is_quenched = np.zeros(0, dtype=bool) + else: + self.quencher = quencher + + self.trajectory_suffix = trajectory_suffix + + def _has_k_quench_grid(self): + k_quench_grid = getattr(self.av, "k_quench_grid", None) + return k_quench_grid is not None and np.any(np.asarray(k_quench_grid) > 0.0) + + def get_quencher_distance2(self, quencher_coordinates, verbose=False): + """ + quencher_coordinates: a list or 2D array containing positions of the quenchers + `critical_distance`: flurophoreq gets quenched below the critical distance + """ + verbose = self.verbose or verbose + m, n = self._traj.shape[0], quencher_coordinates.shape[0] + dist = np.zeros((n, m), dtype=np.float16) + traj = self._traj + if verbose: + print("") + print("Calculating quencher distances") + print("Total quenching atoms: %s" % n) + for i, quencher_position in enumerate(quencher_coordinates): + dist[i] = ne.evaluate("sum((traj - quencher_position)**2, axis=1)") + return dist + + @property + def quencher(self): + return self._quencher + + @quencher.setter + def quencher(self, quencher): + normalized_quencher = OrderedDict() + for res_key, val in quencher.items(): + if isinstance(val, dict): + normalized_quencher[res_key] = { + "atoms": list(val.get("atoms", [])), + "kQ": float(val.get("kQ", 2.0)) + } + else: + # Legacy format: list of atoms + normalized_quencher[res_key] = { + "atoms": list(val), + "kQ": 2.0 + } + + if self.all_quencher_atoms: + pdb = self.pdb + for residue_key in normalized_quencher: + atoms_idx = np.where(pdb['res_name'] == residue_key)[0] + all_atoms = list(set(pdb[atoms_idx]['atom_name'])) + normalized_quencher[residue_key]["atoms"] = all_atoms + + self._quencher = normalized_quencher + + # helper dict mapping residue_key to list of atoms + atom_mapping = OrderedDict() + for res_key, val in self._quencher.items(): + atom_mapping[res_key] = val["atoms"] + + self._quencher_atom_indices = selection2atom_idx(self.pdb, atom_mapping) + if self.verbose: + print("_quencher_atom_indices") + print(self._quencher_atom_indices) + + if self.verbose: + print("Calculating ASA of quenchers.") + print("radii:") + print(self.av.atoms['radius']) + print("coordinates:") + print(self.av.atoms['coord']) + print("Quencher atom-indices") + print(self._quencher_atom_indices) + + quencher_atom_index_array = np.hstack([v.flatten() for v in list(self._quencher_atom_indices.values())]) + asa_v = fps.asa(self.av.structure.atoms['coord'], self.av.structure.atoms['radius'], quencher_atom_index_array, + self.asa_sphere_points, self.asa_probe_radius) + + asa_it = (x for x in asa_v) + asa = OrderedDict() + for res_key in self._quencher_atom_indices: + asa[res_key] = [next(asa_it) for idx in self._quencher_atom_indices[res_key]] + self._asa = asa + if self.verbose: + print("Accessible surface area:") + print(self._asa) + self._quencher_coordinates = get_quencher_coordinates(self.pdb, atom_mapping, verbose=self.verbose) + if self.verbose: + print("Quencher coordinates:") + print(self._quencher_coordinates) + + start_row = 0 + self._quencher_row_ranges = {} + for res_key, coords in self._quencher_coordinates.items(): + n_rows = coords.shape[0] + self._quencher_row_ranges[res_key] = (start_row, start_row + n_rows) + start_row += n_rows + + @property + def k_quench(self): + if self._k_quench_grid_trace is not None: + return self._k_quench_grid_trace + if not self.quencher and self._traj is not None: + return np.zeros(self._traj.shape[0], dtype=np.float32) + if self._is_quenched is None or self._quencher_distances is None: + raise ValueError("Run simulation first and set critical distance") + critical_distance2 = self._critical_distance**2 + collided = np.less(self._quencher_distances, critical_distance2) + n_frames = collided.shape[1] + k_quench = np.zeros(n_frames, dtype=np.float32) + for res_key, (start, end) in self._quencher_row_ranges.items(): + if start == end: + continue + res_collided = np.any(collided[start:end, :], axis=0) + res_kQ = self._quencher[res_key]["kQ"] + k_quench += np.where(res_collided, res_kQ, 0.0).astype(np.float32) + return k_quench + + def _sample_grid_at_trajectory(self, grid): + if self._traj is None: + raise ValueError("Run simulation first.") + values = np.asarray(grid, dtype=np.float32) + shape = values.shape + center_index = (np.asarray(shape, dtype=np.float64) - 1.0) / 2.0 + indices = np.trunc((self._traj - self.x0) / float(self.dg) + center_index).astype(np.int64) + inside = np.ones(indices.shape[0], dtype=bool) + for axis, size in enumerate(shape): + inside &= (indices[:, axis] >= 0) & (indices[:, axis] < size) + out = np.zeros(indices.shape[0], dtype=np.float32) + if np.any(inside): + out[inside] = values[tuple(indices[inside].T)] + return out + + @property + def kQ(self): + return self._kQ + + @staticmethod + def _trajectory_seeds(random_seed, n_trajectories): + if random_seed is None: + if n_trajectories <= 1: + return [None] + return [ + int(seed) + for seed in np.random.SeedSequence().generate_state(n_trajectories, dtype=np.uint32) + ] + + base_seed = int(random_seed) + max_seed = (2 ** 31) - 1 + return [int((base_seed + idx * 104729) % max_seed) for idx in range(n_trajectories)] + + @staticmethod + def _resolve_parallel_trajectories(parallel_trajectories): + requested = -1 if parallel_trajectories is None else int(parallel_trajectories) + if requested == -1: + return max(1, min(os.cpu_count() or 1, MAX_PARALLEL_TRAJECTORIES)) + return max(1, min(requested, MAX_PARALLEL_TRAJECTORIES)) + + @staticmethod + def _simulate_single_trajectory(density, slow_density, dg, slow_fact, t_step, t_max, D, random_seed): + return fps.simulate_traj( + density, + slow_density, + dg, + slow_fact=slow_fact, + t_step=t_step, + t_max=t_max, + D=D, + random_seed=random_seed, + ) + + @property + def quencher_atom_indices(self): + return self._quencher_atom_indices + + @property + def quencher_coordinates(self): + return np.vstack(list(self._quencher_coordinates.values())) + + @property + def quencher_asa(self): + if self._asa is None: + raise ValueError("Set quencher property quencher_atom_indices first.") + + @property + def quencher_atom_indices(self): + return self._quencher_atom_indeces + + @quencher_atom_indices.setter + def quencher_atom_indices(self, atom_indices): + if not isinstance(atom_indices, list): + raise ValueError("Quencher indeces have to be a list of integers") + atom_indices = np.array(self._quencher_atom_indices, dtype=np.uint32) + self._quencher_atom_indeces = atom_indices + + def run( + self, D=40.0, slow_fact=0.01, t_step=0.002, t_max=10000, + save_traj=False, save_j=50, verbose=True, random_seed=None, + parallel_trajectories=-1, **kwargs): + """ + + :param D: float + diffusion coefficient of dye in Ang**2/ns + :param slow_fact: float + The diffusion coefficient of the dye within the slow-accessible volume is slower by a factor of slow_fact. + :param t_step: float + The time-step of the simulation in nano-seconds + :param t_max: float + The maximum time of the simulation in nano-seconds + :param save_traj: bool + If True the trajectory is saved to self.output_file+'_traj.xyz'. Default value True + :param save_j: int + Only every save_j frame of the trajectory is saved. + :param verbose: + :param random_seed: + Optional seed for deterministic trajectory diagnostics. + :param parallel_trajectories: + Number of independent Brownian dynamics trajectories to run and + concatenate for downstream photon sampling. Use -1 for all CPU cores, + capped at 8. + """ + verbose = verbose or self.verbose + self.t_step = t_step + dg = self.dg + density, slow_density = self.av_fast, self.av_slow + n_trajectories = self._resolve_parallel_trajectories(parallel_trajectories) + if verbose: + print("Simulate dye-trajectory") + print("Simulation time [us]: %.2f" % (t_max / 1000)) + print("Time-step [ps]: %.2f" % (t_step * 1000)) + print("Number of steps: %.2f" % int((t_max / t_step))) + print("Parallel trajectories: %i" % n_trajectories) + print("AV-grid parameter [Ang]: %.2f" % dg) + print("Diff coeff. [Ang/ns2]: %.2f" % D) + print("Shape-AV slow (x,y,z): %s %s %s" % (slow_density.shape)) + print("Shape-AV fast (x,y,z): %s %s %s" % (density.shape)) + print("------") + start = time.process_time() + seeds = self._trajectory_seeds(random_seed, n_trajectories) + if n_trajectories == 1: + results = [ + self._simulate_single_trajectory( + density, slow_density, dg, slow_fact, t_step, t_max, D, seeds[0] + ) + ] + else: + with ThreadPoolExecutor(max_workers=n_trajectories) as executor: + futures = [ + executor.submit( + self._simulate_single_trajectory, + density, + slow_density, + dg, + slow_fact, + t_step, + t_max, + D, + seed, + ) + for seed in seeds + ] + results = [future.result() for future in futures] + + successful = [result for result in results if result[2] > 0] + if not successful: + self._traj = None + return + trajectories = [result[0] for result in successful] + traj = np.concatenate(trajectories, axis=0) if len(trajectories) > 1 else trajectories[0] + n_accepted = int(sum(result[2] for result in successful)) + n_rejected = int(sum(result[3] for result in successful)) + traj += self.x0 + self._traj = traj + k_quench_grid = getattr(self.av, "k_quench_grid", None) + if self._has_k_quench_grid(): + self._k_quench_grid_trace = self._sample_grid_at_trajectory(k_quench_grid) + self._is_quenched = self._k_quench_grid_trace > 0.0 + + if verbose: + print("Accepted steps: %i" % n_accepted) + print("Rejected steps: %i" % n_rejected) + end = time.process_time() + if verbose: + print("time spent: %.2gs" % (end-start)) + print("n_accepted: %s" % n_accepted) + print("-----------------------") + print("Attachment point: %s" % self.x0) + print("Mean dye-position: %s" % self.mean) + + if save_traj: + self.save_trajectory(self.output_file+self.trajectory_suffix, save_j) + if not self._has_k_quench_grid(): + if self.quencher: + self._quencher_distances = self.get_quencher_distance2(self.quencher_coordinates, verbose) + else: + self._is_quenched = np.zeros(self._traj.shape[0], dtype=bool) + if verbose: + print("Quencher distances:") + if self._quencher_distances is not None: + print("Quencher distances shape: %s, %s" % self._quencher_distances.shape) + print(self._quencher_distances) + + +class DonorDecay(object): + + def __init__(self, tau0=None, kQ=1.0, nph=0, verbose=False, auto_update=False, pdb=None, + attachment_residue=None, attachment_atom=None, attachment_chain=None, dg=0.5, sticky_mode='quencher', + save_avs=True, D=None, slow_fact=0.05, critical_distance=None, output_file='out', + av_parameter={'linker_length': 20.0, 'linker_width': 0.5, 'radius1': 5.0}, + quencher={'TRP': ['CB'], 'TYR': ['CB'], 'HIS': ['CB']}, t_max=10000.0, t_step=0.004, + slow_radius=10.0, all_quencher_atoms=True, stickiness_mode='global', + amino_acid_slow_facts=None, amino_acid_interactions=None, random_seed=None, + parallel_trajectories=-1, coarse_grained=False, + acceptor_D=None, acceptor_slow_fact=None, acceptor_slow_radius=None, + acceptor_amino_acid_interactions=None, acceptor_dynamics="trajectory"): + """ + quenching trajectory as calculated by SimulateDiffusion.quenched + :param tau0: float + :param kQ: float + :param nph: + :param verbose: bool + :param auto_update: + :param pdb: + :param attachment_residue: string + :param attachment_atom: int + :param attachment_chain: string + :param dg: float + :param sticky_mode: + :param save_avs: bool + :param D: float + :param slow_fact: float + :param critical_distance: float + :param output_file: string + :param av_parameter: + :param quencher: + :param t_max: float + :param t_step: float + :param slow_radius: float + :param all_quencher_atoms: + :param stickiness_mode: + :param amino_acid_slow_facts: + :param amino_acid_interactions: + :param random_seed: + Optional seed for deterministic trajectory diagnostics. + :param parallel_trajectories: + Number of independent diffusion trajectories to run and combine + before photon sampling. Use -1 for all CPU cores, capped at 8. + :param coarse_grained: bool + Reduce the structure to backbone plus CB before simulating, with CB + moved to the side-chain centre of mass. This shrinks the atom count + used for the accessible volume considerably. Note that side-chain + atoms are then absent, so every residue's quenching centre falls + back to its CB - which, sitting at the side-chain centre of mass, is + a reasonable stand-in for the redox-active moiety. + """ + self.verbose = verbose + self._av = None + self._diffusion = None + self.tau0 = tau0 + self.n_photons = nph + self.kQ = kQ + self.auto_update = auto_update + self._photon_trace = None + self._pdb = pdb + self.attachment_residue = attachment_residue + self.attachment_atom = attachment_atom + self.attachment_chain = attachment_chain + self.diffusion_coefficient = D + self.slow_fact = _clamp_slow_factor(slow_fact) + self.dg = dg + self.save_avs = save_avs + self.critical_distance = critical_distance + self.output_file = output_file + self.av_parameter = av_parameter + self.quencher = quencher + self.t_max = t_max + self.t_step = t_step + self.sticky_mode = sticky_mode + self.slow_radius = slow_radius + self.all_quencher_atoms = all_quencher_atoms + self.stickiness_mode = stickiness_mode + self.amino_acid_slow_facts = normalize_amino_acid_slow_facts(amino_acid_slow_facts) + + # The acceptor is a *different dye*: its own diffusion coefficient, its + # own stickiness radius and its own per-residue interaction table. A + # cyanine and a rhodamine do not stick to the same residues to the same + # degree, and modelling them with one table was silently wrong. Each + # falls back to the donor's value, so a project that says nothing about + # the acceptor behaves as it did before. + self.acceptor_diffusion_coefficient = acceptor_D + self.acceptor_slow_fact = acceptor_slow_fact + self.acceptor_slow_radius = acceptor_slow_radius + self.acceptor_amino_acid_interactions = ( + normalize_amino_acid_interactions(acceptor_amino_acid_interactions) + if acceptor_amino_acid_interactions is not None + else None + ) + #: ``"trajectory"`` simulates the acceptor's walk and pairs it with the + #: donor's frame by frame; ``"averaged"`` is the fast-acceptor limit, + #: averaging over its static cloud. + self.acceptor_dynamics = acceptor_dynamics + self._acceptor_diffusion = None + self.amino_acid_interactions = normalize_amino_acid_interactions(amino_acid_interactions) + self.random_seed = random_seed + self.parallel_trajectories = int(-1 if parallel_trajectories is None else parallel_trajectories) + self.coarse_grained = bool(coarse_grained) + self._structure = None + self._residue_site_cache = None + self.fret_enabled = False + self.fret_R0 = None + self.acceptor_chain = None + self.acceptor_residue = None + self.acceptor_atom = None + self.fret_av_parameter = None + self._acceptor_av = None + self._photon_trace_fret = None + + def __str__(self): + s = '' + return s + + @property + def quantum_yield(self): + dt, n = self.photon_trace + n_ph = self.n_photons + if n_ph <= 0: + # The GUI spin box counts photons in millions, so a user can ask for + # 0.00 M. That is an empty simulation, not a crash. + return 0.0 + n_f = n.sum() + return float(n_f) / n_ph + + @property + def diffusion(self): + if self._diffusion is None: + self.simulate_diffusion() + return self._diffusion + + @property + def slow_center(self): + coordinates, _residue_names = self.slow_center_data + return coordinates + + @property + def slow_center_data(self): + slow_centers, _quench_centers, residue_names = self.residue_site_data + return slow_centers, residue_names + + @property + def quench_center_data(self): + _slow_centers, quench_centers, residue_names = self.residue_site_data + return quench_centers, residue_names + + @property + def residue_site_data(self): + """Return ``(slow_centers, quench_centers, residue_names)`` per residue. + + The *slow* centre is the coarse side-chain position (CB, else CA) that + drives the unspecific stickiness model. The *quench* centre is the + centroid of the residue's PET-active atoms (see + ``DEFAULT_QUENCHER_ATOMS`` and the per-residue ``quench_atoms`` + override), so quenching is evaluated at the reactive moiety rather than + at CB. + """ + cached = getattr(self, "_residue_site_cache", None) + cache_key = (id(self._structure), self._quench_atoms_cache_key()) + if cached is not None and cached[0] == cache_key: + return cached[1] + + atoms = self.structure.atoms + residue_keys = OrderedDict() + for idx, atom in enumerate(atoms): + key = ( + _normalize_residue_name(atom["chain"]), + int(atom["res_id"]), + _normalize_residue_name(atom["res_name"]), + ) + residue_keys.setdefault(key, []).append(idx) + + slow_centers = [] + quench_centers = [] + residue_names = [] + for (_chain, _res_id, res_name), indices in residue_keys.items(): + block = atoms[np.asarray(indices, dtype=np.int64)] + atom_names = [_normalize_residue_name(name) for name in block["atom_name"]] + coords = np.asarray(block["coord"], dtype=np.float64) + residue_name = _normalize_residue_name(res_name) + + if "CB" in atom_names: + selected = atom_names.index("CB") + elif "CA" in atom_names: + selected = atom_names.index("CA") + else: + selected = 0 + slow_center = coords[selected] + + wanted = self._quench_atoms_for_residue(residue_name) + matched = [i for i, name in enumerate(atom_names) if name in wanted] + quench_center = coords[matched].mean(axis=0) if matched else slow_center + + slow_centers.append(slow_center) + quench_centers.append(quench_center) + residue_names.append(residue_name) + + result = ( + np.asarray(slow_centers, dtype=np.float64), + np.asarray(quench_centers, dtype=np.float64), + residue_names, + ) + self._residue_site_cache = (cache_key, result) + return result + + def _quench_atoms_cache_key(self): + return tuple( + (residue, tuple(params.get("quench_atoms") or ())) + for residue, params in self.amino_acid_interactions.items() + ) + + def _quench_atoms_for_residue(self, residue_name): + params = self.amino_acid_interactions.get(_normalize_residue_name(residue_name)) + if params is None: + return frozenset(DEFAULT_QUENCHER_ATOMS.get(residue_name, ("CB",))) + return frozenset(params.get("quench_atoms") or ("CB",)) + + @property + def slow_center_slow_fact(self): + _coordinates, residue_names = self.slow_center_data + return self._slow_facts_for_residue_names(residue_names) + + _INTERACTION_FALLBACK = { + "slow_factor": 1.0, + "kQ": 0.0, + "quench_radius": None, + "quench_atoms": ("CB",), + } + + def _interaction_for_residue(self, residue_name, interactions=None): + table = self.amino_acid_interactions if interactions is None else interactions + return table.get( + _normalize_residue_name(residue_name), self._INTERACTION_FALLBACK + ) + + @property + def acceptor_interactions(self): + """The acceptor's interaction table, defaulting to the donor's. + + A project that never mentions the acceptor's chemistry gets the donor's, + which is what QuEst always did — but the two are now separable, because + different dyes stick to different residues by different amounts. + """ + if self.acceptor_amino_acid_interactions is not None: + return self.acceptor_amino_acid_interactions + return self.amino_acid_interactions + + @property + def acceptor_slow_radius_value(self): + if self.acceptor_slow_radius is not None: + return float(self.acceptor_slow_radius) + return float(self.slow_radius) + + @property + def acceptor_diffusion_coefficient_value(self): + if self.acceptor_diffusion_coefficient is not None: + return float(self.acceptor_diffusion_coefficient) + return float(self.diffusion_coefficient) + + @property + def acceptor_slow_fact_value(self): + if self.acceptor_slow_fact is not None: + return _clamp_slow_factor(self.acceptor_slow_fact) + return self.slow_fact + + def _slow_facts_for_residue_names(self, residue_names, interactions=None): + return np.asarray( + [ + self._interaction_for_residue(res, interactions)["slow_factor"] + for res in residue_names + ], + dtype=np.float64, + ) + + def _kq_for_residue_names(self, residue_names): + return np.asarray( + [self._interaction_for_residue(res)["kQ"] for res in residue_names], + dtype=np.float64, + ) + + def _quench_radii_for_residue_names(self, residue_names): + """Per-residue contact radius, falling back to the global critical distance.""" + default_radius = float(self.critical_distance or 0.0) + return np.asarray( + [ + ( + default_radius + if self._interaction_for_residue(res).get("quench_radius") is None + else float(self._interaction_for_residue(res)["quench_radius"]) + ) + for res in residue_names + ], + dtype=np.float64, + ) + + @property + def k_quench(self): + return self.diffusion.k_quench + + def _calc_slow_av(self, verbose=False): + """Build the stickiness and quenching grids for the current AV.""" + slow_centers, quench_centers, residue_names = self.residue_site_data + self._av.calc_slow_av( + save=self.save_avs, + slow_centers=slow_centers, + slow_radius=self.slow_radius, + verbose=verbose or self.verbose, + slow_fact=self._slow_facts_for_residue_names(residue_names), + quench_centers=quench_centers, + quench_radius=self._quench_radii_for_residue_names(residue_names), + k_quench=self._kq_for_residue_names(residue_names), + ) + + @property + def av(self): + if self._av is None: + self.calc_av() + self._calc_slow_av() + return self._av + + @property + def photon_trace(self): + if self._photon_trace is None: + self.calc_photons() + return self._photon_trace + + @property + def collisions(self): + return float(self.diffusion.quenched.sum()) / self.diffusion.quenched.shape[0] + + @property + def structure(self): + return self._structure + + @structure.setter + def structure(self, v): + # Accept a path or an already-parsed Structure: the GUI parses once and + # hands the same object to every model it builds, and parsing 1500 atoms + # again per run is pure cost. + # auto_update=False: QuEst never edits torsion angles, so the internal + # coordinate build is pure overhead. + self._structure = ( + v if isinstance(v, Structure) + else Structure(v, make_coarse=self.coarse_grained, auto_update=False) + ) + self._residue_site_cache = None + tf = tempfile.NamedTemporaryFile(suffix=".pdb") + self._tmp_file = tf.name + tf.close() + self._structure.write(self._tmp_file) + + def calc_av(self, verbose=False): + verbose = verbose or self.verbose + dg = self.dg + residue = self.attachment_residue + attachment_atom = self.attachment_atom + chain = self.attachment_chain + structure = self.structure + av = AV(structure, residue_seq_number=residue, atom_name=attachment_atom, chain_identifier=chain, + simulation_grid_resolution=dg, save_av=self.save_avs, verbose=verbose, + output_file=self.output_file, **self.av_parameter) + self._av = av + + def simulate_diffusion(self, verbose=False, plot_traj=False): + all_quencher_atoms = self.all_quencher_atoms + verbose = verbose or self.verbose + av = self.av + D = self.diffusion_coefficient + slow_fact = self.slow_fact + if self.stickiness_mode == 'amino_acid': + slow_fact = getattr(av, 'slow_factor_grid', None) + if slow_fact is None: + slow_fact = self.slow_fact + diffusion = SimulateDiffusion(av, quencher=self.quencher, verbose=verbose, all_quencher_atoms=all_quencher_atoms) + diffusion.run( + D=D, + verbose=verbose, + slow_fact=slow_fact, + t_max=self.t_max, + t_step=self.t_step, + random_seed=self.random_seed, + parallel_trajectories=self.parallel_trajectories, + ) + self._diffusion = diffusion + success = diffusion._traj is not None + return success + + def _photon_seed(self): + """Seed for the photon trace, derived from but distinct from the walk's. + + Returns ``None`` when the project sets no ``random_seed``, which keeps + the faster multi-threaded photon kernel in play. Offsetting the base + seed stops the photon trace from replaying the same draw sequence as + the diffusion trajectory it is scored against. + """ + if getattr(self, "random_seed", None) is None: + return None + return int((int(self.random_seed) + 7919) % ((2 ** 31) - 1)) + + def calc_photons(self, verbose=False, donor_traj=None, kQ=None): + """ + `n_ph`: number of generated photons + `pq`: quenching probability if distance of fluorphore is below the `critical_distance` + """ + verbose = verbose or self.verbose + n_photons = self.n_photons + tau0 = self.tau0 + if donor_traj is None: + donor_traj = self.diffusion + + k_quench = donor_traj.k_quench + + if verbose: + print("") + print("Simulating decay:") + print("----------------") + print("Number of excitation photons: %s" % n_photons) + print("Number of frames : %s" % k_quench.shape[0]) + print("Quencher-wise kQ rates used.") + + t_step = donor_traj.t_step + dts, phs = photon.simulate_photon_trace_rate( + n_ph=n_photons, kQ=k_quench, t_step=t_step, tau0=tau0, + random_seed=self._photon_seed(), + ) + + n_photons = phs.shape[0] + n_f = phs.sum() + if verbose or self.verbose: + print("Number of absorbed photons: %s" % (n_photons)) + print("Number of fluorescent photons: %s" % (n_f)) + print("Quantum yield: %.2f" % (float(n_f) / n_photons)) + self._photon_trace = dts, phs + + def get_histogram(self, nbins=4096, range=(0, 50)): + dts, nph = self.photon_trace + y, x = np.histogram(dts, range=range, bins=nbins) + return x, y + + def save_histogram(self, filename='hist.txt', verbose=False, nbins=4096, range=(0, 50)): + verbose = verbose or self.verbose + x, y, = self.get_histogram(nbins, range) + save_hist(filename, x, y, verbose) + + def calc_acceptor_av(self, verbose=False): + verbose = verbose or self.verbose + if self._structure is None: + return None + residue = self.acceptor_residue + atom = self.acceptor_atom + chain = self.acceptor_chain + if residue is None or atom is None: + return None + params = self.fret_av_parameter if self.fret_av_parameter is not None else self.av_parameter + try: + av = AV(self.structure, residue_seq_number=residue, atom_name=atom, chain_identifier=chain, + simulation_grid_resolution=self.dg, save_av=self.save_avs, verbose=verbose, + output_file=self.output_file + '_A', **params) + except ValueError as error: + # Say which dye is at fault. A scan moves the donor from site to + # site but leaves the acceptor where the project put it, so a stale + # acceptor makes every single site fail for a reason that looks + # like it is about the site being scanned. + raise ValueError("Acceptor dye: %s" % error) from error + # Stickiness from the *acceptor's* table and radius, not the donor's. + # This used to pass `self.slow_center` / `self.slow_radius`, so the + # acceptor inherited the donor's adhesion whatever dye it was. + slow_centers, _quench_centers, residue_names = self.residue_site_data + av.calc_slow_av( + save=self.save_avs, + slow_centers=slow_centers, + slow_radius=self.acceptor_slow_radius_value, + verbose=verbose, + slow_fact=self._slow_facts_for_residue_names( + residue_names, self.acceptor_interactions + ), + ) + self._acceptor_av = av + self._acceptor_diffusion = None # its walk belongs to this volume + return av + + @property + def acceptor_av(self): + if self._acceptor_av is None: + self.calc_acceptor_av() + return self._acceptor_av + + @property + def acceptor_diffusion(self): + """The acceptor's Brownian walk, simulated on first use.""" + if self._acceptor_diffusion is None: + self.simulate_acceptor_diffusion() + return self._acceptor_diffusion + + def simulate_acceptor_diffusion(self, verbose=False): + """Walk the acceptor through its own accessible volume. + + Same machinery as the donor, with the acceptor's diffusion coefficient + and stickiness — but no quenching: the acceptor's own PET quenching + would change how bright *it* is, and QuEst reports the donor's decay. + What the FRET rate needs from this is positions. + + The two walks must share a time base to be paired frame by frame, so + `t_max` and `t_step` are the project's, not per dye. The seed is offset + from the donor's: two dyes driven by the same random stream would move + in lockstep, which is not two independent walks. + """ + verbose = verbose or self.verbose + av = self.acceptor_av + if av is None: + raise ValueError( + "FRET is enabled but the acceptor dye is not defined: set its " + "chain, residue and atom (fret.dyes[1].attachment)." + ) + + slow_fact = self.acceptor_slow_fact_value + if self.stickiness_mode == "amino_acid": + grid = getattr(av, "slow_factor_grid", None) + if grid is not None: + slow_fact = grid + + seed = self.random_seed + if seed is not None: + seed = int((int(seed) + 104729) % ((2 ** 31) - 1)) + + diffusion = SimulateDiffusion(av, quencher={}, verbose=verbose, + all_quencher_atoms=self.all_quencher_atoms) + diffusion.run( + D=self.acceptor_diffusion_coefficient_value, + verbose=verbose, + slow_fact=slow_fact, + t_max=self.t_max, + t_step=self.t_step, + random_seed=seed, + parallel_trajectories=self.parallel_trajectories, + ) + self._acceptor_diffusion = diffusion + return diffusion._traj is not None + + @property + def fret_R0_angstrom(self): + """Forster radius in Angstrom, falling back to a typical xanthene pair.""" + return float(self.fret_R0) if self.fret_R0 is not None else 52.0 + + def rda_mean_e(self, n_samples=50000): + """Forster-averaged donor-acceptor distance _E, in Angstrom. + + A diagnostic over the two static clouds -- what a FRET-efficiency + measurement reports as a distance. The simulation itself does not use + it: the decay comes from the per-frame rate in + :meth:`calc_fret_rate_trace`. + """ + acceptor_av = self._acceptor_av if self._acceptor_av is not None else self.calc_acceptor_av() + if acceptor_av is None: + return None + return float(fps.RDAMeanE(self.av, acceptor_av, self.fret_R0_angstrom, n_samples)) + + def calc_fret_rate_trace(self, verbose=False): + """FRET rate for every frame, in 1/ns. + + Two regimes, chosen by :attr:`acceptor_dynamics`: + + ``"trajectory"`` (default) + Both dyes diffuse and stick, each with its own diffusion + coefficient and interaction table, and the rate uses their + instantaneous separation:: + + k_FRET(t) = (1/tau0) * (R0 / |r_D(t) - r_A(t)|)^6 + + ``"averaged"`` + The acceptor is averaged over its accessible volume — the + *fast-acceptor limit*, valid when it explores that volume quickly + compared with the donor's excited-state lifetime, and wrong when it + is immobilised. + + The two are not interchangeable: ``<(R0/r)^6>`` over a cloud is not + ``(R0/)^6``, and averaging first weights close approaches heavily. + """ + verbose = verbose or self.verbose + acceptor_av = self._acceptor_av if self._acceptor_av is not None else self.calc_acceptor_av(verbose=verbose) + if acceptor_av is None: + raise ValueError( + "FRET is enabled but the acceptor dye is not defined: set its " + "chain, residue and atom (fret.dyes[1].attachment)." + ) + + trajectory = getattr(self.diffusion, "_traj", None) + if trajectory is None: + raise ValueError("Run the diffusion simulation before computing FRET rates.") + + # Both dyes are *centres*, so the closest physical approach is the sum + # of the two radii — two spheres cannot interpenetrate, and (R0/r)^6 + # diverges if they are allowed to. + donor_radius = float((self.av_parameter or {}).get("radius1", DEFAULT_DYE_RADIUS)) + acceptor_params = self.fret_av_parameter if self.fret_av_parameter is not None else self.av_parameter + acceptor_radius = float((acceptor_params or {}).get("radius1", DEFAULT_DYE_RADIUS)) + r_min = donor_radius + acceptor_radius + + if str(self.acceptor_dynamics).lower() == "averaged": + rates = fps.fret_rate_trace( + trajectory, + acceptor_av.points, + R0=self.fret_R0_angstrom, + tau0=self.tau0, + r_min=r_min, + ) + else: + acceptor_trajectory = getattr(self.acceptor_diffusion, "_traj", None) + if acceptor_trajectory is None: + raise ValueError( + "The acceptor trajectory could not be simulated; set " + "fret.acceptor_dynamics to 'averaged' to use its accessible " + "volume instead." + ) + rates = fps.fret_rate_pair_trace( + trajectory, + acceptor_trajectory, + R0=self.fret_R0_angstrom, + tau0=self.tau0, + r_min=r_min, + ) + if verbose: + print("FRET rate: mean %.4f 1/ns over %i frames" % (rates.mean(), rates.shape[0])) + return rates + + def calc_photons_fret(self, verbose=False): + verbose = verbose or self.verbose + if not getattr(self, "fret_enabled", False): + self._photon_trace_fret = None + return + k_fret = self.calc_fret_rate_trace(verbose=verbose) + donor_traj = self.diffusion + k_quench = donor_traj.k_quench + t_step = donor_traj.t_step + n_photons = self.n_photons + # Quenching and transfer are parallel de-excitation channels, so their + # rates add frame by frame. + k_total = (np.asarray(k_quench, dtype=np.float64) + k_fret).astype(np.float32) + dts, phs = photon.simulate_photon_trace_rate( + n_ph=n_photons, kQ=k_total, t_step=t_step, tau0=self.tau0, + random_seed=self._photon_seed(), + ) + self._photon_trace_fret = dts, phs + + @property + def photon_trace_fret(self): + if self._photon_trace_fret is None: + self.calc_photons_fret() + return self._photon_trace_fret + + @property + def quantum_yield_fret(self): + if self._photon_trace_fret is None: + self.calc_photons_fret() + if self._photon_trace_fret is None: + return 0.0 + dt, n = self._photon_trace_fret + n_ph = self.n_photons + if n_ph <= 0: + return 0.0 + n_f = n.sum() + return float(n_f) / n_ph + + @property + def fret_efficiency(self): + """Transfer efficiency from the two simulated decays: 1 - QY_DA/QY_D. + + One definition, deliberately. There used to be a second -- analytic, + from _E over the static clouds -- which ignored quenching and + silently took precedence over this one whenever it had been computed. + The two disagreed, and only this one reflects what the simulation + actually produced. + """ + qy_d = self.quantum_yield + qy_da = self.quantum_yield_fret + if qy_d <= 0: + return 0.0 + return max(0.0, 1.0 - qy_da / qy_d) + + def get_histogram_fret(self, nbins=4096, range=(0, 50)): + if self._photon_trace_fret is None: + self.calc_photons_fret() + if self._photon_trace_fret is None: + return None, None + dts, nph = self._photon_trace_fret + y, x = np.histogram(dts, range=range, bins=nbins) + return x, y + + def update_all(self, verbose=False, progress=None): + """Run the whole pipeline: AV, contact volume, diffusion, photons. + + Parameters + ---------- + verbose : bool + Print stage-by-stage detail. + progress : callable, optional + ``progress(fraction, message)`` called as each stage starts, with + *fraction* in [0, 1]. This is how a UI shows progress **without the + model knowing what a UI is** -- it used to drive a + ``QProgressDialog`` directly, which put Qt in the middle of the + simulation. + + Returns + ------- + bool + Whether a trajectory was produced. + """ + verbose = verbose or self.verbose + # No explicit gc.collect() here: the grids and trajectories this method + # replaces are plain refcounted NumPy buffers, so they are freed as soon + # as the attributes are rebound. Forcing a full generational collection + # cost ~20 ms per run, which a residue scan pays hundreds of times. + if verbose: + print("Updating simulation") + + def report(fraction, message): + if progress is not None: + progress(fraction, message) + + report(0.0, "Initializing simulation...") + + report(0.2, "Calculating accessible volume (AV)...") + self.calc_av(verbose=verbose) + + report(0.4, "Calculating slow AV (ACV)...") + self._calc_slow_av(verbose=verbose) + + report(0.6, "Simulating dye diffusion...") + success = self.simulate_diffusion(verbose=verbose) + if not success: + if verbose: + print("Trajectory calculation failed.") + return False + + report(0.8, "Calculating quencher distances...") + self.diffusion.critical_distance = self.critical_distance + + report(1.0, "Simulating photon decay trace...") + self.calc_photons(verbose=verbose) + return True + + +def _get_dye_repository_path(): + # Try importing quest first + try: + import quest + if hasattr(quest, '__file__') and quest.__file__: + path = os.path.join(os.path.dirname(quest.__file__), "settings", "dye_repository.json") + if os.path.exists(path): + return path + except Exception: + pass + + # Try relative to this file + try: + path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))), "settings", "dye_repository.json") + if os.path.exists(path): + return path + except Exception: + pass + + # Try cwd + path = os.path.join("quest", "settings", "dye_repository.json") + return path diff --git a/quest/core/fps_json.py b/quest/core/fps_json.py new file mode 100644 index 0000000..9061b9c --- /dev/null +++ b/quest/core/fps_json.py @@ -0,0 +1,112 @@ +import json +from pathlib import Path +from typing import Any, Dict, Generator, Tuple, Union, Optional +import numpy as np + +def load_fps_json(path_or_dict: Union[Path, str, dict]) -> dict: + """Load and parse an fps.json file or dictionary, validating its structure.""" + if isinstance(path_or_dict, (Path, str)): + with open(path_or_dict, "r", encoding="utf-8") as f: + data = json.load(f) + elif isinstance(path_or_dict, dict): + data = path_or_dict + else: + raise TypeError("Expected path or dict for fps.json data.") + + if "Positions" not in data: + raise ValueError("fps.json structure must contain a 'Positions' key.") + + return data + +def normalize_to_fps_positions(sites_list_or_dict: Any, project: dict) -> dict: + """Normalize a list of sites or a dictionary containing 'Positions' to standard fps.json structure.""" + if isinstance(sites_list_or_dict, dict) and "Positions" in sites_list_or_dict: + return sites_list_or_dict + + # Otherwise, it might be a dictionary that is just the raw Positions map, or a list of sites. + if isinstance(sites_list_or_dict, dict): + # If it looks like a Positions map directly (where values have residue_seq_number or similar) + first_val = next(iter(sites_list_or_dict.values())) if sites_list_or_dict else None + if first_val and isinstance(first_val, dict) and ("residue_seq_number" in first_val or "residue" in first_val): + return {"Positions": sites_list_or_dict} + # Otherwise, try to convert it + raise ValueError("Invalid dictionary structure for sites. Expected 'Positions' key or a positions map.") + + if not isinstance(sites_list_or_dict, list): + raise TypeError("Sites must be a list or a dict conforming to fps.json format.") + + positions = {} + for idx, site in enumerate(sites_list_or_dict): + chain = site.get("chain", "") or site.get("chain_identifier", "") + res = site.get("residue") or site.get("residue_seq_number") + if res is None: + raise ValueError(f"Site entry at index {idx} must define a 'residue' or 'residue_seq_number'.") + res = int(res) + atom = site.get("atom", "CB") or site.get("atom_name", "CB") + res_name = site.get("residue_name", "") + + # Determine the name: use name/key if present, or construct res+chain + name = site.get("name") or site.get("key") or f"{res}{chain}" or f"site_{idx}" + + av_param = project.get("av_parameter", {}) + if not isinstance(av_param, dict): + av_param = {} + + positions[name] = { + "chain_identifier": chain, + "residue_seq_number": res, + "atom_name": atom, + "residue_name": res_name, + "linker_length": float(project.get("linker_length") or av_param.get("linker_length") or 20.0), + "linker_width": float(project.get("linker_width") or av_param.get("linker_width") or 0.5), + "radius1": float(project.get("radius1") or av_param.get("radius1") or 3.5), + "radius2": float(project.get("radius2") or av_param.get("radius2") or 4.5), + "radius3": float(project.get("radius3") or av_param.get("radius3") or 3.5), + "simulation_grid_resolution": float(project.get("dg") or project.get("simulation_grid_resolution") or 1.5), + "simulation_type": project.get("simulation_type") or "AV1", + "allowed_sphere_radius": float(project.get("allowed_sphere_radius") or 0.5), + "anchor_atoms": project.get("anchor_atoms", ""), + "chain_weighting": project.get("chain_weighting", False), + "contact_volume_thickness": float(project.get("contact_volume_thickness", 0.0)), + "contact_volume_trapped_fraction": float(project.get("contact_volume_trapped_fraction", -1.0)), + "min_sphere_volume_fraction": float(project.get("min_sphere_volume_fraction", 0.0)), + "strip_mask": project.get("strip_mask", ""), + } + + return {"Positions": positions} + +def run_fps_scan( + fps_data: dict, + pdb_path: Optional[Union[Path, str]], + project: dict, + nbins: Optional[int] = None, + tac_range: Tuple[float, float] = (0.0, 50.0), + project_dir: Optional[Union[Path, str]] = None, +) -> Generator[dict, None, dict]: + """Simulate every position in *fps_data*, yielding one record per site. + + Yields the same record shape the CLI and the web UI report — including the + quencher attribution — because all three go through + :func:`quest.scan.simulate_site`. Returns the records keyed by position + name. + """ + import tempfile + + from quest.scan import scan_positions + + positions = fps_data.get("Positions", {}) + p_dir = Path(project_dir) if project_dir is not None else Path(tempfile.gettempdir()) + + results: Dict[str, Any] = {} + for res in scan_positions( + project, + positions, + pdb_path=pdb_path, + nbins=nbins, + tac_range=tac_range, + project_dir=p_dir, + ): + results[res["name"]] = res + yield res + + return results diff --git a/quest/core/imp_av.py b/quest/core/imp_av.py new file mode 100644 index 0000000..5fd5b93 --- /dev/null +++ b/quest/core/imp_av.py @@ -0,0 +1,263 @@ +from __future__ import annotations + +import contextlib +import os +import tempfile +from dataclasses import dataclass +from typing import Iterable, Tuple + +import numpy as np + +try: # pragma: no cover - development convenience + # Splice an imp-tricks checkout in before probing IMP, so its pure-Python + # extensions (IMP.bff.av, IMP.bff.distance_metrics, IMP.cgmol.*) are + # importable from source without installing anything. imp-tricks is under + # active development, so the source tree -- not an installed copy -- is the + # thing that has to work. + from ..imp_tricks import enable_imp_tricks + + IMP_TRICKS_ENABLED = enable_imp_tricks() +except Exception: # pragma: no cover - never fatal + IMP_TRICKS_ENABLED = [] + +try: # pragma: no cover - optional heavy dependency + import IMP + import IMP.algebra + import IMP.atom + import IMP.bff + import IMP.core + import IMP.em + + #: True when the *compiled* IMP.bff AV decorator is present. Note this is a + #: different thing from imp-tricks' pure-Python ``IMP.bff.av`` module; see + #: okf/specs/imp-tricks-dedup.md. + HAS_IMP_BFF = hasattr(IMP.bff, "AV") +except Exception: # pragma: no cover - keep optional dependency lazy + HAS_IMP_BFF = False + + +def imp_tricks_av_available() -> bool: + """Whether imp-tricks' maintained ``compute_av`` can be imported.""" + try: # pragma: no cover - depends on the checkout + from IMP.bff.av import compute_av # noqa: F401 + except Exception: + return False + return True + + +@dataclass +class IMPAccessibleVolumeResult: + points: np.ndarray + density: np.ndarray + grid_size: int + attachment_point: np.ndarray + + +def _ensure_pdb_path(structure) -> Tuple[str, contextlib.AbstractContextManager]: + """Return a context manager yielding a pdb path for IMP.""" + if isinstance(structure, str) and os.path.isfile(structure): + @contextlib.contextmanager + def _existing(): + yield structure + + return structure, _existing() + + if hasattr(structure, "filename") and structure.filename and os.path.isfile( + structure.filename + ): + @contextlib.contextmanager + def _filename(): + yield structure.filename + + return structure.filename, _filename() + + if hasattr(structure, "write"): + @contextlib.contextmanager + def _tmp(): + fd, tmp_path = tempfile.mkstemp(suffix=".pdb") + os.close(fd) + structure.write(tmp_path) + try: + yield tmp_path + finally: + with contextlib.suppress(FileNotFoundError): + os.remove(tmp_path) + + return "", _tmp() + + raise ValueError("Structure must be a filepath or provide a write() method.") + + +def _select_attachment_particle( + hierarchy: "IMP.atom.Hierarchy", + residue_seq_number: int, + atom_name: str, + chain_identifier: str | None, +) -> "IMP.Particle": + selection = IMP.atom.Selection(hierarchy) + if chain_identifier: + selection.set_chain_id(chain_identifier) + if residue_seq_number is not None: + selection.set_residue_index(int(residue_seq_number)) + if atom_name: + selection.set_atom_type(IMP.atom.AtomType(str(atom_name))) + particles = selection.get_selected_particles() + if not particles: + raise ValueError( + f"Unable to locate attachment site {chain_identifier}:{residue_seq_number}:{atom_name}" + ) + return particles[0] + + +def _path_map_header(path_map: "IMP.bff.PathMap"): + """Return the PathMapHeader, tolerating an incomplete SWIG build. + + IMP 2.24 ships ``PathMap.get_path_map_header`` bound to a C symbol + (``DensityMap_get_path_map_header``) that is **not in the compiled + ``_IMP_bff``**, so calling it raises ``AttributeError``. The writable + accessor is bound to a different symbol and works, and the header is only + read here. Without this the whole IMP AV backend is unusable — which went + unnoticed because environments without IMP.bff fall back to LabelLib. + """ + try: + return path_map.get_path_map_header() + except AttributeError: + return path_map.get_path_map_header_writable() + + +def _path_map_density_to_grid(path_map: "IMP.bff.PathMap") -> Tuple[np.ndarray, int]: + header = path_map.get_header() + nx, ny, nz = header.get_nx(), header.get_ny(), header.get_nz() + if not (nx == ny == nz): + raise ValueError( + "IMP PathMap grid is not cubic; Quest requires equal nx, ny, nz." + ) + tile_values: Iterable[float] = path_map.get_tile_values( + IMP.bff.PM_TILE_ACCESSIBLE_DENSITY, + ( + 0.0, + _path_map_header(path_map).get_max_path_length(), + ), + ) + density = np.asarray(tile_values, dtype=np.float32).reshape((nx, ny, nz), order="C") + density = np.where(density > 0.0, 1, 0).astype(np.uint8) + return density, nx + + +def _model_from_atoms(atoms) -> Tuple["IMP.Model", list, np.ndarray]: + """Build an IMP model from QuEst's atom array. + + The array is the single source of truth (okf/specs/structure-io.md): its + coordinates, its radii, its atom set. Re-reading the file here — which this + function used to do — silently discarded every in-memory transformation, so + a coarse-grained project got the all-atom volume, and `.cif` projects failed + because that re-read was `read_pdb` only. + + Radii come from the array, **not** from IMP: IMP's defaults are ~19 % larger + than the Bondi-like values the FPS/LabelLib convention assumes, and letting + the two backends use different radii is what made them disagree by ~20 % on + volume. + """ + model = IMP.Model() + root = IMP.atom.Hierarchy.setup_particle(IMP.Particle(model)) + coords = np.ascontiguousarray(atoms["coord"], dtype=np.float64) + radii = np.ascontiguousarray(atoms["radius"], dtype=np.float64) + # Keep the particles we made: they are what the attachment index refers to. + # Reaching back into the model by position instead is how this went wrong + # once already — `Model` has no `get_particles()`, and even if it did, the + # ordering would be an assumption rather than a fact. + particles = [] + for index in range(coords.shape[0]): + particle = IMP.Particle(model) + xyzr = IMP.core.XYZR.setup_particle(particle) + xyzr.set_coordinates(IMP.algebra.Vector3D(*coords[index])) + xyzr.set_radius(float(radii[index])) + child = IMP.atom.Hierarchy.setup_particle(particle) + child.set_name(f"atom_{index}") + root.add_child(child) + particles.append(particle) + return model, particles, coords + + +def _attachment_index(atoms, residue_seq_number, atom_name, chain_identifier) -> int: + """Row of the atom array carrying the labelling site.""" + + def text(values): + return np.array([ + value.decode().strip() if isinstance(value, bytes) else str(value).strip() + for value in values + ]) + + mask = np.ones(atoms.shape[0], dtype=bool) + if chain_identifier: + mask &= text(atoms["chain"]) == str(chain_identifier).strip() + if residue_seq_number is not None: + mask &= atoms["res_id"] == int(residue_seq_number) + if atom_name: + mask &= text(atoms["atom_name"]) == str(atom_name).strip() + found = np.flatnonzero(mask) + if not found.size: + raise ValueError( + f"Unable to locate attachment site " + f"{chain_identifier}:{residue_seq_number}:{atom_name}" + ) + return int(found[0]) + + +def build_imp_accessible_volume( + structure, + residue_seq_number: int, + atom_name: str, + chain_identifier: str | None, + linker_length: float, + linker_width: float, + radii: Tuple[float, float, float], + allowed_sphere_radius: float, + simulation_grid_resolution: float, +) -> IMPAccessibleVolumeResult: + if not HAS_IMP_BFF: + raise RuntimeError( + "IMP.bff is required to calculate accessible volumes. " + "Install the imp-bff package to enable this feature." + ) + + atoms = structure.atoms + model, particles, coords = _model_from_atoms(atoms) + index = _attachment_index(atoms, residue_seq_number, atom_name, chain_identifier) + source_particle = particles[index] + + av_particle = IMP.Particle(model) + IMP.bff.AV.do_setup_particle( + model, + av_particle, + source_particle, + linker_length=linker_length, + linker_width=linker_width, + radii=radii, + # Below ~2 A the attachment atom's own neighbours block every starting + # voxel and the path search returns an empty volume with no error; + # imp.bff's own reference test uses 2.0 and expects zero points at 1.0. + allowed_sphere_radius=allowed_sphere_radius, + contact_volume_thickness=0.0, + contact_volume_trapped_fraction=-1, + simulation_grid_resolution=simulation_grid_resolution, + ) + av = IMP.bff.AV(model, av_particle) + av.resample() + + path_map = av.get_map() + density, grid_size = _path_map_density_to_grid(path_map) + xyz_density = np.asarray(path_map.get_xyz_density(), dtype=np.float64) + if xyz_density.size: + points = np.ascontiguousarray( + xyz_density.reshape((-1, xyz_density.shape[-1]))[:, :3] + ) + else: + points = np.zeros((0, 3), dtype=np.float64) + + return IMPAccessibleVolumeResult( + points=points, + density=density, + grid_size=int(grid_size), + attachment_point=coords[index], + ) diff --git a/quest/lib/io/__init__.py b/quest/core/io.py similarity index 100% rename from quest/lib/io/__init__.py rename to quest/core/io.py diff --git a/quest/core/pdb.py b/quest/core/pdb.py new file mode 100644 index 0000000..913d9a8 --- /dev/null +++ b/quest/core/pdb.py @@ -0,0 +1,208 @@ +import os +import locale +import threading +import numpy as np + + +keys = ['i', 'chain', 'res_id', 'res_name', + 'atom_id', 'atom_name', 'element', + 'coord', + 'charge', 'radius', 'bfactor', 'mass'] + +formats = ['i4', '|U1', 'i4', '|U5', + 'i4', '|U5', '|U1', + '3f8', + 'f8', 'f8', 'f8', 'f8'] + + + + +def sequence(structure, use_atoms=False): + """ + ParseModel the SEQRES entries in a pdb file. If this fails, use the ATOM + entries. Return dictionary of sequences keyed to chain and type of + sequence used. + :param structure: a `Structure` object + :param use_atoms: boolean + """ + # Try using SEQRES + pdb = open(structure.filename, 'r').readlines() + # get residue-sequence + seq = [l for l in pdb if l[0:6] == "SEQRES"] + if len(seq) != 0 and not use_atoms: + chain_dict = dict([(l[11], []) for l in seq]) + for c in list(chain_dict.keys()): + chain_seq = [l[19:70].split() for l in seq if l[11] == c] + for x in chain_seq: + chain_dict[c].extend(x) + else: + # Check to see if there are multiple models. If there are, only look + # at the first model. + models = [i for i, l in enumerate(pdb) if l.startswith("MODEL")] + if len(models) > 1: + pdb = pdb[models[0]:models[1]] + atoms = [l for l in pdb if l[0:6] == "ATOM " and l[13:16] == "CA "] + chain_dict = dict([(l[21], []) for l in atoms]) + for c in list(chain_dict.keys()): + chain_dict[c] = [l[17:20] for l in atoms if l[21] == c] + return chain_dict + + + + + + + + + + + + +def write(filename, atoms=None, append=False): + """ + Writes a structured numpy array containing the PDB-info to a + PDB-file + :param filename: target-filename + :param atoms: structured numpy array + """ + mode = 'a+' if append else 'w+' + if atoms is not None: + fp = open(filename, mode) + # http://cupnet.net/pdb_format/ + al = ["%-6s%5d %4s%1s%3s %1s%4d%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2s\n" % + ("ATOM ", at['atom_id'], at['atom_name'], " ", at['res_name'], at['chain'], at['res_id'], " ", + at['coord'][0], at['coord'][1], at['coord'][2], 0.0, at['bfactor'], at['element'], " ") + for at in atoms + ] + if mode == 'a+': + fp.write('MODEL') + fp.write("".join(al)) + if mode == 'a+': + fp.write('ENDMDL') + fp.close() + + +#: IMP builds decorator objects through SWIG, which is not safe to do from +#: several threads at once — a scan running sites in a pool hit +#: "Wrong number or type of arguments for overloaded function 'new_Atom'". +#: One lock around the parse, and a cache so a scan parses each structure once +#: instead of once per site. +_PARSE_LOCK = threading.Lock() +_PARSE_CACHE: dict[tuple, np.ndarray] = {} +_PARSE_CACHE_LIMIT = 8 + + +def _cache_key(path: str): + try: + stat = os.stat(path) + except OSError: + return None + return (os.path.abspath(path), stat.st_mtime_ns, stat.st_size) + + +def _atom_record_selector(): + """IMP selector accepting exactly the records QuEst's parser accepted. + + QuEst has always read **ATOM records only** — HETATM waters, ions and + ligands were never part of the steric environment the dye diffuses through. + None of IMP's stock selectors expresses that (`AllPDBSelector` keeps + everything, `NonWater*` still keeps ligands), and the difference is not + cosmetic: on 148L it is 1322 atoms versus 1525, which would move every + accessible volume. + """ + import IMP.atom + + class _AtomRecords(IMP.atom.PDBSelector): + def __init__(self): + IMP.atom.PDBSelector.__init__(self, "ATOM records") + + def get_is_selected(self, record): + # IMP hands this a raw line (2.17) or a PDBRecord (2.24); the + # newer object answers the question directly. + if hasattr(record, "get_is_atom"): + return bool(record.get_is_atom()) + return str(record).startswith("ATOM") + + return _AtomRecords() + + +def read(filename, **kwargs): + """Read a structure into QuEst's atom array, using IMP as the parser. + + Returns a NumPy structured array with the fields in :data:`keys`. PDB and + mmCIF are both handled by IMP (``IMP.atom.read_pdb`` / ``read_mmcif``); + QuEst no longer carries its own parser for either. + + Only ATOM records are read, which is what QuEst's own parser did; see + :func:`_atom_record_selector` for why no stock IMP selector will do. + + Raises + ------ + ImportError + If IMP is unavailable. QuEst needs it for accessible volumes anyway. + """ + verbose = kwargs.get("verbose", True) + path = str(filename) + if verbose: + directory, base_name = os.path.split(path) + print("======================================") + print("Filename: %s" % path) + print("Path: %s" % directory) + + key = _cache_key(path) + if key is not None: + cached = _PARSE_CACHE.get(key) + if cached is not None: + # A copy: callers treat the array as theirs to modify. + return cached.copy() + + with _PARSE_LOCK: + atoms = _read_with_imp(path) + + if key is not None: + if len(_PARSE_CACHE) >= _PARSE_CACHE_LIMIT: + _PARSE_CACHE.clear() + _PARSE_CACHE[key] = atoms + return atoms.copy() + + +def _read_with_imp(path): + """Parse *path* into QuEst's atom array. Call under :data:`_PARSE_LOCK`.""" + import IMP + import IMP.atom + import IMP.core + + model = IMP.Model() + selector = _atom_record_selector() + if path.lower().endswith((".cif", ".mmcif")): + hierarchy = IMP.atom.read_mmcif(path, model, selector) + else: + hierarchy = IMP.atom.read_pdb(path, model, selector) + + leaves = IMP.atom.get_leaves(hierarchy) + atoms = np.zeros(len(leaves), dtype={"names": keys, "formats": formats}) + element_table = IMP.atom.get_element_table() + + for index, leaf in enumerate(leaves): + particle = leaf.get_particle() + atom = IMP.atom.Atom(particle) + residue = IMP.atom.Residue(IMP.atom.get_residue(atom)) + chain = IMP.atom.Chain(IMP.atom.get_chain(residue)) + element = element_table.get_name(atom.get_element()) + radius = IMP.core.XYZR(particle).get_radius() + mass = IMP.atom.Mass(particle).get_mass() + + atoms["i"][index] = index + atoms["chain"][index] = chain.get_id() + atoms["res_id"][index] = residue.get_index() + atoms["res_name"][index] = residue.get_residue_type().get_string() + atoms["atom_id"][index] = index + atoms["atom_name"][index] = atom.get_atom_type().get_string().strip() + atoms["element"][index] = element + atoms["coord"][index] = list(IMP.core.XYZ(particle).get_coordinates()) + atoms["bfactor"][index] = atom.get_temperature_factor() + atoms["radius"][index] = radius + atoms["mass"][index] = mass + + return atoms + diff --git a/quest/lib/tools/dye_diffusion/photon.py b/quest/core/photon.py similarity index 53% rename from quest/lib/tools/dye_diffusion/photon.py rename to quest/core/photon.py index 54bbe8a..712480c 100644 --- a/quest/lib/tools/dye_diffusion/photon.py +++ b/quest/core/photon.py @@ -1,13 +1,16 @@ -"""Pure Python/Numba implementations of photon trace simulation. +"""Photon-trace and decay-curve kernels (numba). -This replaces the former Cython module ``photon.pyx`` but keeps the same -public API: ``simulate_photon_trace``, ``simulate_photon_trace_kQ`` and -``simulate_photon_trace_rate``. +Two entry points, both driven by a *per-frame quenching rate* array: +``simulate_photon_trace_rate`` samples individual photons, and +``simulate_decay_quench`` integrates a decay curve directly. The older +boolean-collision variants were removed once nothing called them. """ from __future__ import annotations +import os from typing import Tuple +import numba import numpy as np from numba import njit, prange @@ -26,127 +29,65 @@ def _log_exp_wait(tau0: float) -> float: return np.log(1.0 / (_ranf() + _EPS)) * tau0 -@njit(cache=True, parallel=True) -def _simulate_trace( - n_ph: int, - collided: np.ndarray, - quenching_prob: float, - t_step: float, - tau0: float, -) -> Tuple[np.ndarray, np.ndarray]: - dts = np.zeros(n_ph, dtype=np.float64) - phs = np.zeros(n_ph, dtype=np.uint8) - n_frames = collided.shape[0] - shift_nbrs = np.random.randint(0, n_frames // 2 if n_frames > 1 else 1, n_ph) - - if quenching_prob == 0.0: - for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 - return dts, phs - - if quenching_prob >= 1.0: - for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 - n_step = int(dts[i] / t_step) - shift_nbr = shift_nbrs[i] - for j in range(shift_nbr, shift_nbr + n_step): - if j >= collided.shape[0]: - break - if collided[j]: - dts[i] = 0.0 - phs[i] = 0 - break - return dts, phs - - for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 - n_step = int(dts[i] / t_step) - shift_nbr = shift_nbrs[i] - for j in range(shift_nbr, shift_nbr + n_step): - if j >= collided.shape[0]: - break - if collided[j] and _ranf() < quenching_prob: - dts[i] = 0.0 - phs[i] = 0 - break - return dts, phs +@njit(cache=True, nogil=True) +def _photon_rate_walk(kq, t_step, tau0, shift_nbr, n_frames): + """Emit one photon: sample its lifetime, then race it against quenching.""" + dt = _log_exp_wait(tau0) + n_step = int(dt / t_step) + for j in range(shift_nbr, shift_nbr + n_step): + if _ranf() < kq[j % n_frames] * t_step: + return 0.0, np.uint8(0) + return dt, np.uint8(1) -def simulate_photon_trace( - n_ph: int, - collided: np.ndarray, - quenching_prob: float = 0.5, - t_step: float = 0.01, - tau0: float = 0.25, -): - return _simulate_trace(n_ph, np.asarray(collided, dtype=np.uint8), quenching_prob, t_step, tau0) +@njit(cache=True, parallel=True) +def _seed_worker_threads(base_seed: int) -> None: + """Give every numba worker thread a fresh RNG state. + + Numba keeps one RNG state per thread and initialises it deterministically, + so an *unseeded* run repeats itself for the whole life of the process -- + four Monte-Carlo runs in a row return byte-identical results, which reads + as precision that is not there. Seeding one iteration per thread reaches + each thread's own state. + """ + for index in prange(numba.get_num_threads()): + np.random.seed(base_seed + index) @njit(cache=True, parallel=True) -def _simulate_trace_kq( - n_ph: int, collided: np.ndarray, kq: float, t_step: float, tau0: float +def _simulate_trace_rate( + n_ph: int, kq: np.ndarray, t_step: float, tau0: float ) -> Tuple[np.ndarray, np.ndarray]: dts = np.zeros(n_ph, dtype=np.float64) phs = np.zeros(n_ph, dtype=np.uint8) - n_frames = collided.shape[0] - shift_nbrs = np.random.randint(0, n_frames // 2 if n_frames > 1 else 1, n_ph) - p_quench = kq * t_step - - if kq == 0.0: - for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 + n_frames = kq.shape[0] + if n_frames == 0: return dts, phs + shift_nbrs = np.random.randint(0, n_frames if n_frames > 1 else 1, n_ph) for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 - n_step = int(dts[i] / t_step) - shift_nbr = shift_nbrs[i] - for j in range(shift_nbr, shift_nbr + n_step): - if j >= collided.shape[0]: - break - if collided[j] and _ranf() < p_quench: - dts[i] = 0.0 - phs[i] = 0 - break + dts[i], phs[i] = _photon_rate_walk(kq, t_step, tau0, shift_nbrs[i], n_frames) return dts, phs -def simulate_photon_trace_kQ( - n_ph: int, - collided: np.ndarray, - kQ: float = 0.5, - t_step: float = 0.01, - tau0: float = 0.25, -): - return _simulate_trace_kq(n_ph, np.asarray(collided, dtype=np.uint8), kQ, t_step, tau0) - - -@njit(cache=True, parallel=True) -def _simulate_trace_rate( - n_ph: int, kq: np.ndarray, t_step: float, tau0: float +# Seeded counterpart of `_simulate_trace_rate`. It has to stay sequential: +# under `parallel=True` numba keeps one RNG state per thread and hands +# iterations to whichever thread is free, so the draws a photon sees would +# depend on the scheduler and the seed would not pin the result down. +@njit(cache=True, nogil=True) +def _simulate_trace_rate_seeded( + n_ph: int, kq: np.ndarray, t_step: float, tau0: float, random_seed: int ) -> Tuple[np.ndarray, np.ndarray]: + np.random.seed(random_seed) dts = np.zeros(n_ph, dtype=np.float64) phs = np.zeros(n_ph, dtype=np.uint8) n_frames = kq.shape[0] - shift_nbrs = np.random.randint(0, n_frames // 2 if n_frames > 1 else 1, n_ph) + if n_frames == 0: + return dts, phs + shift_nbrs = np.random.randint(0, n_frames if n_frames > 1 else 1, n_ph) - for i in prange(n_ph): - dts[i] = _log_exp_wait(tau0) - phs[i] = 1 - n_step = int(dts[i] / t_step) - shift_nbr = shift_nbrs[i] - for j in range(shift_nbr, shift_nbr + n_step): - if j >= kq.shape[0]: - break - if _ranf() < kq[j] * t_step: - dts[i] = 0.0 - phs[i] = 0 - break + for i in range(n_ph): + dts[i], phs[i] = _photon_rate_walk(kq, t_step, tau0, shift_nbrs[i], n_frames) return dts, phs @@ -155,8 +96,20 @@ def simulate_photon_trace_rate( kQ: np.ndarray, t_step: float = 0.01, tau0: float = 0.25, + random_seed: int | None = None, ): - return _simulate_trace_rate(n_ph, np.asarray(kQ, dtype=np.float32), t_step, tau0) + """Monte-Carlo photon trace against a per-frame quenching rate. + + Passing ``random_seed`` makes the trace reproducible, at the cost of + running single-threaded; see `_simulate_trace_rate_seeded`. + """ + kq = np.asarray(kQ, dtype=np.float32) + if random_seed is None: + # Draw the thread seeds from the OS so consecutive unseeded runs are + # genuinely independent samples, not the same one four times. + _seed_worker_threads(int.from_bytes(os.urandom(4), "little")) + return _simulate_trace_rate(n_ph, kq, t_step, tau0) + return _simulate_trace_rate_seeded(n_ph, kq, t_step, tau0, int(random_seed)) @njit(cache=True, parallel=True) @@ -257,4 +210,3 @@ def simulate_decay_quench( float(t_step), float(tau0), ) - diff --git a/quest/core/simulation.py b/quest/core/simulation.py new file mode 100644 index 0000000..6294867 --- /dev/null +++ b/quest/core/simulation.py @@ -0,0 +1,1323 @@ +"""Headless QuEst backend helpers. + +This module provides a small, GUI-free service layer around the legacy +`DonorDecay` simulation so other code (CLI, notebooks, tests) can drive +the core quenching/FRET calculations without depending on any Qt widgets. + +It intentionally mirrors the public surface of ``quest.api`` but keeps +the logic in one place so both the CLI and notebook users can share it. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Mapping, MutableMapping, Optional, Sequence, Tuple + +import csv +import json +import struct +import numpy as np +from numba import njit, prange + +from .dye_diffusion import DonorDecay, normalize_amino_acid_interactions +from .photon import simulate_decay_quench +from ..structure_fetch import resolve_structure_path + + +def autocorr(x: np.ndarray, axis: int = 0, normalize: bool = True) -> np.ndarray: + """Normalised autocorrelation of a series, via FFT. + + Twelve lines of NumPy, kept here beside its only caller rather than in a + module of its own. ChiSurf has `chisurf.core.math.signal.autocorr`; QuEst + does not import it, because a headless simulation should not load a host + application to correlate an array. + """ + x = np.asarray(x) + if x.size == 0: + return np.array([], dtype=x.dtype) + n = x.shape[axis] + centred = x - np.mean(x, axis=axis) + # Pad to 2N so the FFT gives the linear, not the circular, correlation. + spectrum = np.fft.fft(centred, n=2 * n, axis=axis) + index = [slice(None)] * x.ndim + index[axis] = slice(0, n) + acf = np.fft.ifft(spectrum * np.conjugate(spectrum), axis=axis)[tuple(index)].real + if not normalize: + return acf + index[axis] = 0 + return acf / acf[tuple(index)] + + +def write_mrc(filename: Path | str, grid: np.ndarray, dg: float, origin: np.ndarray) -> None: + """Write a 3D density grid (NumPy array) to an MRC file.""" + grid = np.ascontiguousarray(grid, dtype=np.float32) + nx, ny, nz = grid.shape + + header = bytearray(1024) + + # Word 1-3: NC, NR, NS (columns, rows, sections) + struct.pack_into(' np.ndarray: + """Return a voxel-count density grid for sampled dye positions.""" + + grid = np.zeros(shape, dtype=np.float32) + samples = np.asarray(points, dtype=np.float64) + if samples.size == 0: + return grid + samples = samples.reshape((-1, 3)) + + center_index = (np.asarray(shape, dtype=np.float64) - 1.0) / 2.0 + indices = np.trunc((samples - np.asarray(center, dtype=np.float64)) / float(dg) + center_index).astype(np.int64) + inside = np.isfinite(samples).all(axis=1) + for axis, size in enumerate(shape): + inside &= (indices[:, axis] >= 0) & (indices[:, axis] < size) + if allowed_density is not None: + allowed = np.asarray(allowed_density) + candidate = indices[inside] + allowed_mask = allowed[tuple(candidate.T)] > 0 + inside_indices = np.flatnonzero(inside) + inside[inside_indices] = allowed_mask + accepted = indices[inside] + if len(accepted): + np.add.at(grid, tuple(accepted.T), 1.0) + return grid + + +def diffusion_coefficient_grid( + density: np.ndarray, + *, + diffusion_coefficient: float, + slow_factor_grid: np.ndarray | None = None, + slow_density: np.ndarray | None = None, + slow_factor: float = 1.0, +) -> np.ndarray: + """Return the local diffusion coefficient for each AV voxel.""" + + accessible = np.asarray(density) > 0 + coefficients = np.zeros(accessible.shape, dtype=np.float32) + coefficients[accessible] = float(diffusion_coefficient) + + if slow_factor_grid is not None: + factors = np.asarray(slow_factor_grid, dtype=np.float32) + if factors.shape != coefficients.shape: + raise ValueError("slow_factor_grid shape must match density shape") + coefficients[accessible] = float(diffusion_coefficient) * factors[accessible] + return coefficients + + if slow_density is not None: + slow = (np.asarray(slow_density) > 0) & accessible + coefficients[slow] = float(diffusion_coefficient) * float(slow_factor) + return coefficients + + +def _normalize_residue_name(value: Any) -> str: + if isinstance(value, bytes): + return value.decode("ascii", errors="ignore").strip().upper() + text = str(value).strip().upper() + if text.startswith("B'") and text.endswith("'"): + return text[2:-1].strip().upper() + return text + + +@njit(cache=True) +def _run_length_stats(mask): + """Return ``(event_count, total_frames, max_run)`` for a boolean sequence.""" + event_count = 0 + total = 0 + longest = 0 + current = 0 + for index in range(mask.shape[0]): + if mask[index]: + current += 1 + total += 1 + elif current: + event_count += 1 + if current > longest: + longest = current + current = 0 + if current: + event_count += 1 + if current > longest: + longest = current + return event_count, total, longest + + +@njit(cache=True, parallel=True) +def _residue_type_contact_stats( + trajectory, + slow_centers, + quench_centers, + center_type, + slow_radius, + quench_radius, + quench_rate, + n_types, +): + """Per residue type: proximity, residence events and quenching contribution. + + Parallelised over residue types so each thread owns its own accumulators and + can walk the trajectory sequentially to measure contact events. + """ + n_frames = trajectory.shape[0] + n_centers = slow_centers.shape[0] + + frames_near = np.zeros(n_types, dtype=np.int64) + distance_sum = np.zeros(n_types, dtype=np.float64) + event_count = np.zeros(n_types, dtype=np.int64) + max_event = np.zeros(n_types, dtype=np.int64) + quench_rate_sum = np.zeros(n_types, dtype=np.float64) + quench_frames = np.zeros(n_types, dtype=np.int64) + + for type_id in prange(n_types): + slow_radius2 = slow_radius[type_id] * slow_radius[type_id] + quench_radius2 = quench_radius[type_id] * quench_radius[type_id] + rate = quench_rate[type_id] + run = 0 + for frame in range(n_frames): + px = trajectory[frame, 0] + py = trajectory[frame, 1] + pz = trajectory[frame, 2] + + nearest2 = np.inf + contacts = 0 + for center in range(n_centers): + if center_type[center] != type_id: + continue + + dx = px - slow_centers[center, 0] + dy = py - slow_centers[center, 1] + dz = pz - slow_centers[center, 2] + d2 = dx * dx + dy * dy + dz * dz + if d2 < nearest2: + nearest2 = d2 + + qx = px - quench_centers[center, 0] + qy = py - quench_centers[center, 1] + qz = pz - quench_centers[center, 2] + q2 = qx * qx + qy * qy + qz * qz + if q2 <= quench_radius2: + contacts += 1 + + distance_sum[type_id] += np.sqrt(nearest2) + if contacts > 0: + quench_rate_sum[type_id] += contacts * rate + quench_frames[type_id] += 1 + + if nearest2 <= slow_radius2: + frames_near[type_id] += 1 + run += 1 + elif run: + event_count[type_id] += 1 + if run > max_event[type_id]: + max_event[type_id] = run + run = 0 + if run: + event_count[type_id] += 1 + if run > max_event[type_id]: + max_event[type_id] = run + + return frames_near, distance_sum, event_count, max_event, quench_rate_sum, quench_frames + + +@njit(cache=True, parallel=True) +def _attribute_frames_to_residue_type( + trajectory, slow_centers, center_type, center_factor, radius +): + """Assign each frame to the residue type it is most strongly slowed by. + + Ties on the slowing factor are broken by distance; frames with no centre in + range get ``-1``. + """ + n_frames = trajectory.shape[0] + n_centers = slow_centers.shape[0] + radius2 = radius * radius + assigned = np.full(n_frames, -1, dtype=np.int64) + + for frame in prange(n_frames): + px = trajectory[frame, 0] + py = trajectory[frame, 1] + pz = trajectory[frame, 2] + best_factor = np.inf + best_distance = np.inf + best_type = -1 + for center in range(n_centers): + dx = px - slow_centers[center, 0] + dy = py - slow_centers[center, 1] + dz = pz - slow_centers[center, 2] + d2 = dx * dx + dy * dy + dz * dz + if d2 > radius2: + continue + factor = center_factor[center] + if factor < best_factor or (factor == best_factor and d2 < best_distance): + best_factor = factor + best_distance = d2 + best_type = center_type[center] + assigned[frame] = best_type + return assigned + + +def _true_run_lengths(mask: np.ndarray) -> list[int]: + runs: list[int] = [] + current = 0 + for value in mask: + if bool(value): + current += 1 + elif current: + runs.append(current) + current = 0 + if current: + runs.append(current) + return runs + + +def autocorr_to_tau_window( + values: np.ndarray | Sequence[float], + *, + tau0: float, + t_step: float, + tau_factor: float = 10.0, +) -> np.ndarray: + """Return autocorrelation lags from 0 through approximately ``tau_factor * tau0``.""" + + series = np.asarray(values) + if len(series) == 0: + return autocorr(series) + + tau0 = float(tau0) + t_step = float(t_step) + tau_factor = float(tau_factor) + if tau0 <= 0.0 or t_step <= 0.0 or tau_factor <= 0.0: + return autocorr(series) + + max_lag_frames = int(np.ceil((tau_factor * tau0) / t_step)) + lag_count = min(len(series), max_lag_frames + 1) + if series.ndim != 1 or lag_count >= len(series): + return autocorr(series)[:lag_count] + + centered = np.asarray(series, dtype=np.float64) - float(np.mean(series)) + denominator = float(np.dot(centered, centered)) + if denominator == 0.0: + return autocorr(series)[:lag_count] + + # Linear (not circular) autocorrelation via FFT: pad to at least 2N so the + # wrap-around terms fall outside the window we keep. + size = int(1 << int(np.ceil(np.log2(2 * len(centered))))) + spectrum = np.fft.rfft(centered, n=size) + correlation = np.fft.irfft(spectrum * np.conjugate(spectrum), n=size)[:lag_count] + return correlation / denominator + + +def _flatten_center_groups( + centers_by_residue: Mapping[str, Any], + quench_centers_by_residue: Mapping[str, Any] | None = None, +) -> tuple[list[str], np.ndarray, np.ndarray, np.ndarray]: + """Flatten ``{residue: centers}`` groups into kernel-friendly arrays.""" + + names: list[str] = [] + slow_blocks: list[np.ndarray] = [] + quench_blocks: list[np.ndarray] = [] + type_ids: list[np.ndarray] = [] + + for residue_name in sorted(centers_by_residue): + normalized_name = _normalize_residue_name(residue_name) + slow = np.asarray(centers_by_residue[residue_name], dtype=np.float64).reshape((-1, 3)) + if slow.size == 0: + continue + if quench_centers_by_residue is None: + quench = slow + else: + quench = np.asarray( + quench_centers_by_residue.get(residue_name, slow), dtype=np.float64 + ).reshape((-1, 3)) + if quench.shape[0] != slow.shape[0]: + raise ValueError( + f"quench centers for {normalized_name} do not match the slow centers" + ) + type_ids.append(np.full(slow.shape[0], len(names), dtype=np.int64)) + names.append(normalized_name) + slow_blocks.append(slow) + quench_blocks.append(quench) + + if not names: + empty = np.empty((0, 3), dtype=np.float64) + return [], empty, empty, np.empty(0, dtype=np.int64) + return names, np.vstack(slow_blocks), np.vstack(quench_blocks), np.concatenate(type_ids) + + +def _subsample_points(points: Any, limit: int, decimals: int | None = None) -> Optional[np.ndarray]: + """Evenly thin a point cloud down to at most ``limit`` points. + + ``decimals`` rounds the result, which keeps the JSON payload small; use it + only for data headed to a plot or 3D viewer, never for derived quantities. + """ + if points is None: + return None + array = np.asarray(points) + if limit > 0 and len(array) > limit: + indices = np.linspace(0, len(array) - 1, limit, dtype=np.int64) + array = array[indices] + if decimals is not None and np.issubdtype(array.dtype, np.floating): + array = np.round(array, decimals) + return array + + +def _as_trajectory(trajectory: Any) -> np.ndarray: + if trajectory is None: + return np.empty((0, 3), dtype=np.float64) + return np.ascontiguousarray( + np.asarray(trajectory, dtype=np.float64).reshape((-1, 3)) + ) + + +def calculate_aa_quenching( + trajectory: np.ndarray | Sequence[Sequence[float]] | None, + quench_centers_by_residue: Mapping[str, np.ndarray | Sequence[Sequence[float]]], + *, + quench_radii: Mapping[str, float], + quench_rates: Mapping[str, float], + chunk_size: int = 4096, +) -> dict[str, dict[str, float]]: + """Decompose the time-averaged quenching rate by residue type. + + The total quenching rate experienced by the dye is the sum of the rates + contributed by every quenching centre within its contact radius, so it + splits exactly into per-residue-type contributions. Returns, per residue + type, the mean contributed rate (1/ns), the fraction of the total, and the + fraction of frames in which that residue type quenched at all. + + ``chunk_size`` is accepted for backwards compatibility and ignored. + """ + + samples = _as_trajectory(trajectory) + if samples.shape[0] == 0: + return {} + + names, slow_centers, quench_centers, center_type = _flatten_center_groups( + quench_centers_by_residue, quench_centers_by_residue + ) + if not names: + return {} + + radii = np.asarray( + [float(quench_radii.get(name, 0.0) or 0.0) for name in names], dtype=np.float64 + ) + rates = np.asarray( + [float(quench_rates.get(name, 0.0) or 0.0) for name in names], dtype=np.float64 + ) + + _near, _distance, _events, _max_event, rate_sum, quench_frames = _residue_type_contact_stats( + samples, + slow_centers, + quench_centers, + center_type, + np.zeros(len(names), dtype=np.float64), + radii, + rates, + len(names), + ) + + frame_count = float(samples.shape[0]) + contributions: dict[str, dict[str, float]] = {} + for index, name in enumerate(names): + if rates[index] <= 0.0 or radii[index] <= 0.0: + continue + contributions[name] = { + "mean_quench_rate": float(rate_sum[index]) / frame_count, + "fraction_frames_quenched": float(quench_frames[index]) / frame_count, + } + + total = sum(item["mean_quench_rate"] for item in contributions.values()) + for item in contributions.values(): + item["quench_rate_fraction"] = item["mean_quench_rate"] / total if total > 0.0 else 0.0 + return contributions + + +def calculate_aa_residence( + trajectory: np.ndarray | Sequence[Sequence[float]] | None, + centers_by_residue: Mapping[str, np.ndarray | Sequence[Sequence[float]]], + *, + t_step: float, + radius: float, + effective_slow_factors: Mapping[str, float | None] | None = None, + chunk_size: int = 4096, +) -> list[dict[str, Any]]: + """Calculate dye residence statistics near residue-type center groups. + + ``chunk_size`` is accepted for backwards compatibility and ignored. + """ + + return _residue_type_metrics( + trajectory, + centers_by_residue, + t_step=t_step, + radius=radius, + effective_slow_factors=effective_slow_factors, + ) + + +def _residue_type_metrics( + trajectory: np.ndarray | Sequence[Sequence[float]] | None, + centers_by_residue: Mapping[str, Any], + *, + t_step: float, + radius: float, + effective_slow_factors: Mapping[str, float | None] | None = None, + quench_centers_by_residue: Mapping[str, Any] | None = None, + quench_radii: Mapping[str, float] | None = None, + quench_rates: Mapping[str, float] | None = None, +) -> list[dict[str, Any]]: + """Residence and (optionally) quenching metrics, in a single trajectory pass.""" + + samples = _as_trajectory(trajectory) + frame_count = int(samples.shape[0]) + radius = float(radius) + t_step = float(t_step) + slow_factors = effective_slow_factors or {} + quench_radii = quench_radii or {} + quench_rates = quench_rates or {} + + names, slow_centers, quench_centers, center_type = _flatten_center_groups( + centers_by_residue, quench_centers_by_residue + ) + if not names: + return [] + + center_counts = np.bincount(center_type, minlength=len(names)) + radii = np.asarray( + [float(quench_radii.get(name, 0.0) or 0.0) for name in names], dtype=np.float64 + ) + rates = np.asarray( + [float(quench_rates.get(name, 0.0) or 0.0) for name in names], dtype=np.float64 + ) + + if frame_count: + ( + frames_near, + distance_sum, + event_count, + max_event, + rate_sum, + quench_frames, + ) = _residue_type_contact_stats( + samples, + slow_centers, + quench_centers, + center_type, + np.full(len(names), radius, dtype=np.float64), + radii, + rates, + len(names), + ) + + center_factor = np.asarray( + [ + 1.0 if slow_factors.get(names[type_id]) is None else float(slow_factors[names[type_id]]) + for type_id in center_type + ], + dtype=np.float64, + ) + assigned = _attribute_frames_to_residue_type( + samples, slow_centers, center_type, center_factor, radius + ) + else: + zeros = np.zeros(len(names), dtype=np.int64) + frames_near = zeros + distance_sum = np.zeros(len(names), dtype=np.float64) + event_count = zeros + max_event = zeros + rate_sum = np.zeros(len(names), dtype=np.float64) + quench_frames = zeros + assigned = np.empty(0, dtype=np.int64) + + total_quench_rate = float(rate_sum.sum()) + + rows: list[dict[str, Any]] = [] + for index, name in enumerate(names): + near_frames = int(frames_near[index]) + events = int(event_count[index]) + mean_event_frames = near_frames / events if events else 0.0 + + attributed_mask = assigned == index + attributed_events, attributed_frames, attributed_max = ( + _run_length_stats(attributed_mask) if frame_count else (0, 0, 0) + ) + attributed_mean = attributed_frames / attributed_events if attributed_events else 0.0 + + rows.append( + { + "residue_name": name, + "center_count": int(center_counts[index]), + "effective_slow_factor": slow_factors.get(name), + "frames_near": near_frames, + "fraction_near": near_frames / frame_count if frame_count else 0.0, + "total_time_ns": near_frames * t_step, + "event_count": events, + "mean_event_time_ns": mean_event_frames * t_step, + "max_event_time_ns": int(max_event[index]) * t_step, + "mean_min_distance_angstrom": ( + float(distance_sum[index]) / frame_count if frame_count else None + ), + "attributed_frames_near": int(attributed_frames), + "attributed_fraction_near": attributed_frames / frame_count if frame_count else 0.0, + "attributed_total_time_ns": attributed_frames * t_step, + "attributed_event_count": int(attributed_events), + "attributed_mean_event_time_ns": attributed_mean * t_step, + "attributed_max_event_time_ns": int(attributed_max) * t_step, + "kQ": float(rates[index]), + "quench_radius": float(radii[index]), + "mean_quench_rate": float(rate_sum[index]) / frame_count if frame_count else 0.0, + "quench_rate_fraction": ( + float(rate_sum[index]) / total_quench_rate if total_quench_rate > 0.0 else 0.0 + ), + "fraction_frames_quenched": ( + float(quench_frames[index]) / frame_count if frame_count else 0.0 + ), + } + ) + return rows + + +def top_quenchers(aa_residence: Any, limit: int = 3) -> list[dict[str, Any]]: + """Residue types that actually quenched at a site, strongest first. + + Lets a scan answer "is this site quenched, and by what?" without carrying + the whole residence table for every scanned position. + """ + + rows = [row for row in (aa_residence or []) if (row.get("mean_quench_rate") or 0.0) > 0.0] + rows.sort(key=lambda row: row.get("quench_rate_fraction") or 0.0, reverse=True) + return [ + { + "residue_name": row["residue_name"], + "quench_rate_fraction": row.get("quench_rate_fraction"), + "mean_quench_rate": row.get("mean_quench_rate"), + } + for row in rows[:limit] + ] + + +def aa_residence_from_model(model: DonorDecay) -> list[dict[str, Any]]: + """Return residue-type residence metrics for a completed donor model.""" + + raw_trajectory = getattr(getattr(model, "diffusion", None), "_traj", None) + if raw_trajectory is None: + return [] + + try: + centers, quench_centers, residue_names = model.residue_site_data + except Exception: + return [] + + centers_by_residue: dict[str, list[np.ndarray]] = {} + quench_centers_by_residue: dict[str, list[np.ndarray]] = {} + for center, quench_center, residue_name in zip( + np.asarray(centers, dtype=np.float64), + np.asarray(quench_centers, dtype=np.float64), + residue_names, + ): + normalized_name = _normalize_residue_name(residue_name) + centers_by_residue.setdefault(normalized_name, []).append(center) + quench_centers_by_residue.setdefault(normalized_name, []).append(quench_center) + + effective_slow_factors: dict[str, float | None] = {} + quench_rates: dict[str, float] = {} + quench_radii: dict[str, float] = {} + for residue_name in centers_by_residue: + try: + effective_slow_factors[residue_name] = float(model._slow_facts_for_residue_names([residue_name])[0]) + except Exception: + effective_slow_factors[residue_name] = None + try: + quench_rates[residue_name] = float(model._kq_for_residue_names([residue_name])[0]) + quench_radii[residue_name] = float(model._quench_radii_for_residue_names([residue_name])[0]) + except Exception: + quench_rates[residue_name] = 0.0 + quench_radii[residue_name] = 0.0 + + return _residue_type_metrics( + raw_trajectory, + {name: np.vstack(points) for name, points in centers_by_residue.items()}, + t_step=float(getattr(model, "t_step", 0.0) or 0.0), + radius=float(getattr(model, "slow_radius", 0.0) or 0.0), + effective_slow_factors=effective_slow_factors, + quench_centers_by_residue={ + name: np.vstack(points) for name, points in quench_centers_by_residue.items() + }, + quench_radii=quench_radii, + quench_rates=quench_rates, + ) + + +@dataclass +class DecaySimulationResult: + """Container for a single QuEst decay simulation.""" + + time: np.ndarray + donor_counts: np.ndarray + fret_counts: Optional[np.ndarray] + quantum_yield_donor: float + quantum_yield_fret: Optional[float] + collisions_fraction: float + fret_efficiency: Optional[float] + project: Mapping[str, Any] + trajectory_distance_to_mean: Optional[np.ndarray] = None + trajectory_time_ns: Optional[np.ndarray] = None + trajectory_autocorr: Optional[np.ndarray] = None + trajectory_autocorr_lag_ns: Optional[np.ndarray] = None + trajectory_points: Optional[np.ndarray] = None + av_points: Optional[np.ndarray] = None + acv_points: Optional[np.ndarray] = None + job_id: Optional[str] = None + lifetime_donor: Optional[float] = None + av_volume: Optional[float] = None + contact_volume: Optional[float] = None + contact_to_free_ratio: Optional[float] = None + aa_residence: Optional[list[dict[str, Any]]] = None + + +def load_project(path: Path | str) -> MutableMapping[str, Any]: + """Load a QuEst project JSON file into a mutable dictionary.""" + + p = Path(path) + with p.open("r", encoding="utf8") as fp: + return json.load(fp) + + +def build_donor_from_project( + project: Mapping[str, Any], + pdb_path: Optional[Path | str] = None, +) -> DonorDecay: + """Create and configure a :class:`DonorDecay` from a project mapping.""" + + p = project + + attachment = p.get("attachment") or {} + + fret_block = p.get("fret") or {} + dyes = fret_block.get("dyes") or [] + if not dyes: + raise KeyError("Project must define at least one dye with a diffusion coefficient 'D'.") + donor_dye = dyes[0] + donor_D = donor_dye.get("D") + if donor_D is None: + raise KeyError("Donor dye entry must define diffusion coefficient 'D'.") + slow_radius = p.get("slow_radius", donor_dye.get("slow_radius", 8.5)) + amino_acid_interactions = p.get("amino_acid_interactions", donor_dye.get("amino_acid_interactions")) + parallel_trajectories = p.get("parallel_trajectories", -1) + if parallel_trajectories is None: + parallel_trajectories = -1 + + d = DonorDecay( + tau0=p["tau0"], + kQ=p.get("kQ", 0.0), + nph=p["n_photons"], + verbose=False, + auto_update=False, + pdb=None, + attachment_residue=attachment.get("residue"), + attachment_atom=attachment.get("atom"), + attachment_chain=attachment.get("chain"), + dg=p["dg"], + sticky_mode="surface", + save_avs=p.get("save_avs", False), + D=donor_D, + slow_fact=1.0, + critical_distance=p["critical_distance"], + output_file=p.get("output_file", "out"), + av_parameter=p["av_parameter"], + quencher={}, + t_max=p["t_max"], + t_step=p["t_step"], + slow_radius=slow_radius, + all_quencher_atoms=False, + stickiness_mode="amino_acid", + amino_acid_interactions=amino_acid_interactions, + random_seed=donor_dye.get("random_seed", p.get("random_seed")), + parallel_trajectories=int(parallel_trajectories), + coarse_grained=bool(p.get("coarse_grained", donor_dye.get("coarse_grained", False))), + ) + + structure_source = pdb_path or p.get("pdb") + if structure_source is None: + raise ValueError("Project must define a 'pdb' path or pdb_path must be given.") + d.structure = str(resolve_structure_path(structure_source)) + + fret = p.get("fret") or {} + if fret.get("enabled"): + d.fret_enabled = True + dyes = fret.get("dyes") or [] + if len(dyes) > 1: + acceptor = dyes[1] + acc_att = acceptor.get("attachment") or {} + d.acceptor_chain = acc_att.get("chain") + d.acceptor_residue = acc_att.get("residue") + d.acceptor_atom = acc_att.get("atom") + av_param_acc = acceptor.get("av_parameter") + if av_param_acc is not None: + d.fret_av_parameter = av_param_acc + + # The acceptor is its own dye. Its diffusion coefficient, stickiness + # radius and per-residue interaction table are read from its own + # entry; each falls back to the donor's when absent, so a project + # that says nothing about acceptor chemistry behaves as before. + if acceptor.get("D") is not None: + d.acceptor_diffusion_coefficient = float(acceptor["D"]) + if acceptor.get("slow_radius") is not None: + d.acceptor_slow_radius = float(acceptor["slow_radius"]) + if acceptor.get("slow_fact") is not None: + d.acceptor_slow_fact = float(acceptor["slow_fact"]) + if acceptor.get("amino_acid_interactions") is not None: + d.acceptor_amino_acid_interactions = normalize_amino_acid_interactions( + acceptor["amino_acid_interactions"] + ) + + # Whether the acceptor diffuses too, or is averaged over its volume. + dynamics = fret.get("acceptor_dynamics") + if dynamics is not None: + allowed = ("trajectory", "averaged") + if str(dynamics).lower() not in allowed: + raise ValueError( + f"fret.acceptor_dynamics must be one of {allowed}, got {dynamics!r}" + ) + d.acceptor_dynamics = str(dynamics).lower() + + # Forster radii in Angstrom; the donor->acceptor cell is the one used. + R0_matrix: Sequence[Sequence[Optional[float]]] = fret.get("R0_matrix") or [] + if R0_matrix and len(R0_matrix[0]) > 1: + r01 = R0_matrix[0][1] + if r01 is not None: + d.fret_R0 = float(r01) + + return d + + +def _histogram_decay( + model: DonorDecay, + nbins: int, + tac_range: Tuple[float, float], +) -> tuple[np.ndarray, np.ndarray]: + edges, donor_counts = model.get_histogram(nbins=nbins, range=tac_range) + time = 0.5 * (edges[:-1] + edges[1:]) + return time, donor_counts + + +def _curve_decay_from_model( + model: DonorDecay, + nbins: int, + tac_range: Tuple[float, float], + dt_tac: Optional[float], + n_curves: Optional[int], +) -> tuple[np.ndarray, np.ndarray]: + """Approximate legacy curve-mode decay using per-frame quenching rates. + + This uses the existing diffusion trajectory inside ``model`` together with + a simple frame-wise quenching rate derived from ``model.kQ`` and the + boolean collision trajectory. It falls back to the standard histogram + behaviour if anything unexpected happens. + """ + + if nbins <= 0: + return np.empty(0, dtype=float), np.empty(0, dtype=float) + + lo, hi = float(tac_range[0]), float(tac_range[1]) + if dt_tac is not None and dt_tac > 0.0: + dt = float(dt_tac) + else: + span = hi - lo + if span <= 0.0: + span = float(nbins) + dt = span / float(nbins) + + decay = np.zeros(int(nbins), dtype=np.float64) + + try: + diffusion = model.diffusion + collided = diffusion.quenched + t_step = float(diffusion.t_step) + except Exception: + # If diffusion is unavailable, reuse the standard histogram path. + return _histogram_decay(model, nbins, tac_range) + + # Build a per-frame quenching rate array from the collision trajectory. + try: + k_quench = diffusion.k_quench + except Exception: + kQ = float(getattr(model, "kQ", 2.0)) + k_quench = np.where(collided > 0, kQ, 0.0).astype(np.float32) + + curves = int(n_curves) if n_curves is not None else 0 + if curves <= 0: + try: + curves = int(getattr(model, "n_photons", 0)) // 1000 + except Exception: + curves = 0 + if curves <= 0: + curves = 1024 + + simulate_decay_quench( + n_curves=curves, + decay=decay, + dt_tac=dt, + k_quench=k_quench, + t_step=t_step, + tau0=float(model.tau0), + ) + + edges = np.linspace(lo, lo + dt * nbins, nbins + 1, dtype=float) + time = 0.5 * (edges[:-1] + edges[1:]) + return time, decay + + +def simulate_project( + project: Mapping[str, Any], + *, + pdb_path: Optional[Path | str] = None, + nbins: Optional[int] = None, + tac_range: Tuple[float, float] = (0.0, 50.0), + mode: Optional[str] = None, + n_curves: Optional[int] = None, + dt_tac: Optional[float] = None, + n_tac: Optional[int] = None, + project_dir: Optional[Path | str] = None, + save_outputs: bool = True, + render_data: Optional[bool] = None, +) -> DecaySimulationResult: + """Run a full QuEst simulation from a project dictionary. + + Parameters + ---------- + project: + QuEst project mapping (same schema as the GUI JSON). + pdb_path: + Optional override for the structure path. + nbins: + Number of TAC bins for the donor (and FRET) histograms. Defaults to + ``project['n_bins']`` or 4096 if not present. + tac_range: + Time range (ns) for the TAC histograms; defaults to ``(0.0, 50.0)``. + mode: + Optional legacy simulation mode. If ``None``, this is read from + ``project['decay_mode']`` when present, otherwise ``"photon"``. + Currently recognised modes are: + + - ``"photon"`` (default): standard Monte-Carlo photon trace. + - ``"curve"``: legacy-style curve mode. This uses the same photon + backend but allows ``n_curves``, ``dt_tac`` and ``n_tac`` to control + histogram resolution and effective photon statistics. + n_curves: + Optional legacy parameter used in ``"curve"`` mode. If provided (or + present as ``project['n_curves']``), it will multiply the effective + ``n_photons`` used in the simulation. + dt_tac: + Optional legacy bin width in ns for ``"curve"`` mode. If supplied + (or present as ``project['dt_tac']``) together with ``n_tac``, it will + be used to derive ``tac_range`` when the caller did not override it. + n_tac: + Optional legacy number of TAC bins for ``"curve"`` mode. If supplied + (or present as ``project['n_tac']``), it overrides ``nbins``. + project_dir: + Optional project directory (base path for output jobs). + save_outputs: + Write the per-run job directory: ``result.json``, the ``.mrc`` volumes, + the ``.xyz`` point clouds, the CSV tables. Set to ``False`` for bulk + work such as a residue scan, and for interactive runs that must not + litter the working directory. + render_data: + Build the thinned trajectory, autocorrelation and point clouds that a + plot or a 3D viewer needs. Defaults to ``True``. + + This used to be part of ``save_outputs``, which conflated two unrelated + questions — *write files?* and *return something to draw?*. The Qt form + passes ``save_outputs=False`` so a GUI run leaves nothing behind, and + silently lost its trajectory and AV plots with it. A scan wants neither + and should pass ``render_data=False``: thinning point clouds it never + reads is pure overhead when the same structure is simulated once per + residue. + """ + if render_data is None: + render_data = True + + # Resolve decay mode with backwards-compatible precedence: + # 1) explicit function argument, 2) project['decay_mode'], 3) default. + if mode is None: + decay_mode = str(project.get("decay_mode", "photon")).lower() + else: + decay_mode = str(mode).lower() + + # Legacy configuration for curve mode + if n_curves is None: + legacy_n_curves = project.get("n_curves") + n_curves = int(legacy_n_curves) if legacy_n_curves is not None else None + + if dt_tac is None: + legacy_dt = project.get("dt_tac") + dt_tac = float(legacy_dt) if legacy_dt is not None else None + + if n_tac is None: + legacy_n_tac = project.get("n_tac") + n_tac = int(legacy_n_tac) if legacy_n_tac is not None else None + + # Determine histogram bin count, allowing curve-mode overrides. + if nbins is None: + nbins = int(project.get("n_bins", 4096)) + effective_nbins = nbins + if decay_mode == "curve" and n_tac is not None: + effective_nbins = n_tac + + # Derive tac_range from dt_tac / n_tac when running in curve mode and the + # caller did not explicitly override tac_range via the function argument. + if decay_mode == "curve" and dt_tac is not None and n_tac is not None: + # Only adjust if tac_range still at its default and the project did + # not provide an explicit tac_range. + project_has_tac_range = "tac_range" in project + if tac_range == (0.0, 50.0) and not project_has_tac_range: + tac_range = (0.0, float(dt_tac) * float(n_tac)) + + # Generate unique job folder under project_dir + import uuid + p_dir = Path(project_dir) if project_dir is not None else Path.cwd() + job_name = str(uuid.uuid4()) + job_dir = p_dir / "jobs" / job_name + if save_outputs: + job_dir.mkdir(parents=True, exist_ok=True) + + project_dict = dict(project) + project_dict["save_avs"] = save_outputs + project_dict["output_file"] = str(job_dir / "out") + parallel_trajectories = project_dict.get("parallel_trajectories", -1) + project_dict["parallel_trajectories"] = int(-1 if parallel_trajectories is None else parallel_trajectories) + + model = build_donor_from_project(project_dict, pdb_path=pdb_path) + + # In curve mode, optionally scale photon statistics by n_curves to mimic + # the legacy behaviour where multiple curves were accumulated. This only + # affects the stochastic photon-based quantities (e.g. quantum yield), not + # the deterministic curve integration below. + if decay_mode == "curve" and n_curves is not None: + try: + model.n_photons = int(model.n_photons) * int(n_curves) + except Exception: + # If anything unexpected happens, fall back to the original count. + pass + + model.update_all(verbose=False) + + if decay_mode == "curve": + time, donor_counts = _curve_decay_from_model( + model, + effective_nbins, + tac_range, + dt_tac, + n_curves, + ) + else: + time, donor_counts = _histogram_decay(model, effective_nbins, tac_range) + + fret_counts: Optional[np.ndarray] = None + qy_fret: Optional[float] = None + fret_eff: Optional[float] = None + + if getattr(model, "fret_enabled", False): + xf, yf = model.get_histogram_fret(nbins=effective_nbins, range=tac_range) + if xf is not None and yf is not None: + fret_counts = yf + qy_fret = model.quantum_yield_fret + fret_eff = model.fret_efficiency + + trajectory_distance_to_mean: Optional[np.ndarray] = None + trajectory_time_ns: Optional[np.ndarray] = None + trajectory_autocorr: Optional[np.ndarray] = None + trajectory_autocorr_lag_ns: Optional[np.ndarray] = None + trajectory_points: Optional[np.ndarray] = None + av_points: Optional[np.ndarray] = None + acv_points: Optional[np.ndarray] = None + aa_residence: list[dict[str, Any]] = [] + try: + if render_data and hasattr(model, "diffusion") and model.diffusion is not None: + max_trajectory_points = int(project_dict.get("trajectory_display_points", 2000)) + t_step_ns = float( + getattr(model.diffusion, "t_step", project_dict.get("t_step", 0.0)) or 0.0 + ) + distances = model.diffusion.distance_to_mean + if distances is not None: + # Correlate the full series, then thin only what gets plotted. + trajectory_autocorr = autocorr_to_tau_window( + distances, + tau0=float(getattr(model, "tau0", project_dict.get("tau0", 0.0)) or 0.0), + t_step=t_step_ns, + ) + trajectory_autocorr_lag_ns = np.arange(len(trajectory_autocorr)) * t_step_ns + frame_times = np.arange(len(distances)) * t_step_ns + trajectory_distance_to_mean = _subsample_points( + distances, max_trajectory_points, decimals=3 + ) + trajectory_time_ns = _subsample_points( + frame_times, max_trajectory_points, decimals=3 + ) + raw_trajectory = getattr(model.diffusion, "_traj", None) + if raw_trajectory is not None and len(raw_trajectory) > 0: + trajectory_points = _subsample_points( + raw_trajectory, max_trajectory_points, decimals=2 + ) + if render_data and hasattr(model, "av") and model.av is not None: + # The full clouds stay on disk as .xyz/.mrc; what travels through + # JSON to a 3D viewer is capped, since a browser cannot usefully + # draw hundreds of thousands of points anyway. + max_render_points = int(project_dict.get("render_display_points", 25000)) + av_points = _subsample_points(model.av.points_fast, max_render_points, decimals=2) + acv_points = _subsample_points(model.av.points_slow, max_render_points, decimals=2) + aa_residence = aa_residence_from_model(model) + except Exception: + pass + + # Save the result to job_dir / "result.json" + def _make_json_serializable(obj: Any) -> Any: + if isinstance(obj, dict): + return {k: _make_json_serializable(v) for k, v in obj.items()} + elif isinstance(obj, (list, tuple)): + return [_make_json_serializable(x) for x in obj] + elif isinstance(obj, Path): + return str(obj) + elif isinstance(obj, np.ndarray): + return obj.tolist() + elif isinstance(obj, (np.integer, int)): + return int(obj) + elif isinstance(obj, (np.floating, float)): + return float(obj) + return obj + + try: + dts, phs = model.photon_trace + lifetime_donor = float(np.mean(dts[phs == 1])) if np.sum(phs) > 0 else 0.0 + except Exception: + lifetime_donor = 0.0 + + # Calculate AV and contact volume metrics in Ang3. These must come from the + # complete point clouds, not the thinned copies shipped to the viewer. + dg = float(project_dict.get("dg") or (project_dict.get("av_parameter") or {}).get("simulation_grid_resolution") or 0.5) + dg3 = dg ** 3 + full_av_points = getattr(getattr(model, "av", None), "points_fast", None) + full_acv_points = getattr(getattr(model, "av", None), "points_slow", None) + av_volume = float(len(full_av_points)) * dg3 if full_av_points is not None else None + contact_volume = float(len(full_acv_points)) * dg3 if full_acv_points is not None else None + if av_volume is not None and contact_volume is not None: + free_av_volume = av_volume - contact_volume + contact_to_free_ratio = contact_volume / free_av_volume if free_av_volume > 0.0 else 0.0 + else: + contact_to_free_ratio = None + + res_dict = {} if not save_outputs else { + "job_id": job_name, + "time_ns": time.tolist() if hasattr(time, "tolist") else list(time), + "donor_counts": donor_counts.tolist() if hasattr(donor_counts, "tolist") else list(donor_counts), + "fret_counts": None if fret_counts is None else (fret_counts.tolist() if hasattr(fret_counts, "tolist") else list(fret_counts)), + "quantum_yield_donor": float(model.quantum_yield), + "quantum_yield_fret": float(qy_fret) if qy_fret is not None else None, + "collisions_fraction": float(model.collisions), + "fret_efficiency": float(fret_eff) if fret_eff is not None else None, + "project": _make_json_serializable(project_dict), + "trajectory_distance_to_mean": None if trajectory_distance_to_mean is None else (trajectory_distance_to_mean.tolist() if hasattr(trajectory_distance_to_mean, "tolist") else list(trajectory_distance_to_mean)), + "trajectory_autocorr": None if trajectory_autocorr is None else (trajectory_autocorr.tolist() if hasattr(trajectory_autocorr, "tolist") else list(trajectory_autocorr)), + "trajectory_time_ns": None if trajectory_time_ns is None else (trajectory_time_ns.tolist() if hasattr(trajectory_time_ns, "tolist") else list(trajectory_time_ns)), + "trajectory_autocorr_lag_ns": None if trajectory_autocorr_lag_ns is None else (trajectory_autocorr_lag_ns.tolist() if hasattr(trajectory_autocorr_lag_ns, "tolist") else list(trajectory_autocorr_lag_ns)), + "trajectory_points": None if trajectory_points is None else (trajectory_points.tolist() if hasattr(trajectory_points, "tolist") else list(trajectory_points)), + "av_points": None if av_points is None else (av_points.tolist() if hasattr(av_points, "tolist") else list(av_points)), + "acv_points": None if acv_points is None else (acv_points.tolist() if hasattr(acv_points, "tolist") else list(acv_points)), + "lifetime_donor": lifetime_donor, + "av_volume": av_volume, + "contact_volume": contact_volume, + "contact_to_free_ratio": contact_to_free_ratio, + "aa_residence": aa_residence, + } + if save_outputs: + try: + with open(job_dir / "result.json", "w", encoding="utf8") as f: + json.dump(res_dict, f, indent=2) + except Exception: + pass + + if save_outputs: + # Save individual results in the job folder + try: + # Save trajectory.npy + if hasattr(model, "diffusion") and model.diffusion is not None and model.diffusion._traj is not None: + np.save(job_dir / "trajectory.npy", model.diffusion._traj) + + # Save av.mrc and acv.mrc + if hasattr(model, "av") and model.av is not None: + av_obj = model.av + if hasattr(av_obj, "density_fast") and av_obj.density_fast is not None: + write_mrc(job_dir / "av.mrc", av_obj.density_fast, av_obj.dg, av_obj.x0) + diffusion_grid = diffusion_coefficient_grid( + av_obj.density_fast, + diffusion_coefficient=float(model.diffusion_coefficient), + slow_factor_grid=getattr(av_obj, "slow_factor_grid", None), + slow_density=getattr(av_obj, "density_slow", None), + slow_factor=float(model.slow_fact), + ) + write_mrc(job_dir / "diffusion_coefficients.mrc", diffusion_grid, av_obj.dg, av_obj.x0) + if getattr(av_obj, "k_quench_grid", None) is not None: + write_mrc(job_dir / "quenching_rates.mrc", av_obj.k_quench_grid, av_obj.dg, av_obj.x0) + if hasattr(av_obj, "density_slow") and av_obj.density_slow is not None: + write_mrc(job_dir / "acv.mrc", av_obj.density_slow, av_obj.dg, av_obj.x0) + if ( + hasattr(model, "diffusion") + and model.diffusion is not None + and getattr(model.diffusion, "_traj", None) is not None + and hasattr(av_obj, "density_fast") + and av_obj.density_fast is not None + ): + dye_density = sampled_density_grid( + model.diffusion._traj, + shape=av_obj.density_fast.shape, + dg=av_obj.dg, + center=av_obj.x0, + allowed_density=av_obj.density_fast, + ) + write_mrc(job_dir / "sampled_dye_density.mrc", dye_density, av_obj.dg, av_obj.x0) + + # Save decay.csv + decay_file = job_dir / "decay.csv" + with open(decay_file, "w", encoding="utf-8") as f: + if fret_counts is not None: + f.write("time_ns,donor_counts,fret_counts\n") + for t, d, fr in zip(time, donor_counts, fret_counts): + f.write(f"{t:.4f},{d:.4f},{fr:.4f}\n") + else: + f.write("time_ns,donor_counts\n") + for t, d in zip(time, donor_counts): + f.write(f"{t:.4f},{d:.4f}\n") + + # Save results.csv + results_file = job_dir / "results.csv" + with open(results_file, "w", encoding="utf-8") as f: + f.write("Parameter,Value\n") + f.write(f"quantum_yield_donor,{float(model.quantum_yield)}\n") + if qy_fret is not None: + f.write(f"quantum_yield_fret,{float(qy_fret)}\n") + f.write(f"collisions_fraction,{float(model.collisions)}\n") + if fret_eff is not None: + f.write(f"fret_efficiency,{float(fret_eff)}\n") + f.write(f"lifetime_donor,{float(lifetime_donor)}\n") + if av_volume is not None: + f.write(f"av_volume,{float(av_volume)}\n") + if contact_volume is not None: + f.write(f"contact_volume,{float(contact_volume)}\n") + if contact_to_free_ratio is not None: + f.write(f"contact_to_free_ratio,{float(contact_to_free_ratio)}\n") + + aa_residence_file = job_dir / "aa_residence.csv" + with open(aa_residence_file, "w", newline="", encoding="utf-8") as f: + fieldnames = [ + "residue_name", + "center_count", + "effective_slow_factor", + "frames_near", + "fraction_near", + "total_time_ns", + "event_count", + "mean_event_time_ns", + "max_event_time_ns", + "mean_min_distance_angstrom", + "attributed_frames_near", + "attributed_fraction_near", + "attributed_total_time_ns", + "attributed_event_count", + "attributed_mean_event_time_ns", + "attributed_max_event_time_ns", + "kQ", + "quench_radius", + "mean_quench_rate", + "quench_rate_fraction", + "fraction_frames_quenched", + ] + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(aa_residence) + + # Save project.json + with open(job_dir / "project.json", "w", encoding="utf8") as f: + json.dump(_make_json_serializable(project_dict), f, indent=2) + except Exception as e: + print("Failed to save individual zip files:", e) + + return DecaySimulationResult( + time=time, + donor_counts=donor_counts, + fret_counts=fret_counts, + quantum_yield_donor=model.quantum_yield, + quantum_yield_fret=qy_fret, + collisions_fraction=model.collisions, + fret_efficiency=fret_eff, + project=project, + trajectory_distance_to_mean=trajectory_distance_to_mean, + trajectory_time_ns=trajectory_time_ns, + trajectory_autocorr=trajectory_autocorr, + trajectory_autocorr_lag_ns=trajectory_autocorr_lag_ns, + trajectory_points=trajectory_points, + av_points=av_points, + acv_points=acv_points, + job_id=job_name, + lifetime_donor=lifetime_donor, + av_volume=av_volume, + contact_volume=contact_volume, + contact_to_free_ratio=contact_to_free_ratio, + aa_residence=aa_residence, + ) + + +__all__ = [ + "DecaySimulationResult", + "sampled_density_grid", + "diffusion_coefficient_grid", + "autocorr_to_tau_window", + "calculate_aa_quenching", + "calculate_aa_residence", + "aa_residence_from_model", + "load_project", + "build_donor_from_project", + "simulate_project", +] diff --git a/quest/core/structure.py b/quest/core/structure.py new file mode 100644 index 0000000..109460c --- /dev/null +++ b/quest/core/structure.py @@ -0,0 +1,381 @@ +import os +from copy import deepcopy, copy +from collections import OrderedDict +import tempfile + +import numpy as np + +from . import pdb as PDB + +import os.path + + +clusterCriteria = ['maxclust', 'inconsistent', 'distance'] + + +#: Backbone atom slots for the per-residue lookup table below. Only these +#: positions are indexed; a residue's remaining side-chain atoms are found by +#: name when they are needed, not tabulated here. +internal_atom_numbers = [ + ('N', 0), + ('CA', 1), + ('C', 2), + ('O', 3), + ('CB', 4), + ('H', 5), + ('CG', 6), + ('CD', 7), +] + +#: The residues QuEst indexes, in a fixed order — `res2id` turns a three-letter +#: code into the integer `Structure.residue_types` carries. PRO is the one with +#: extra entries, because its ring closes through CG and CD. +residue_atoms_internal = OrderedDict( + [ + (residue, ['N', 'C', 'CA', 'CB', 'O', 'H']) + for residue in ( + 'CYS', 'MET', 'PHE', 'ILE', 'LEU', 'VAL', 'TRP', 'TYR', 'ALA', + 'THR', 'SER', 'GLN', 'ASN', 'GLU', 'ASP', 'HIS', 'ARG', 'LYS', + ) + ] + + [ + ('GLY', ['N', 'C', 'CA', 'O', 'H']), + ('PRO', ['N', 'C', 'CA', 'CB', 'O', 'H', 'CG', 'CD']), + ] +) + +a2id = dict(internal_atom_numbers) +id2a = {number: name for name, number in internal_atom_numbers} +res2id = {residue: index for index, residue in enumerate(residue_atoms_internal)} + + +#: Helpers the `Structure` class itself needs. Everything else that used to live +#: at module level here — RMSD, clustering, torsion/internal coordinates, +#: `r2i`, and the geometry primitives behind them — had no caller anywhere in +#: QuEst and is gone. That is IMP's and ChiSurf's work, not a simulation +#: engine's (okf/specs/imp-tricks-dedup.md). + + +def move_center_of_mass(structure, all_atoms): + for i, res in enumerate(structure.residue_ids): + at_nbr = np.where(all_atoms['res_id'] == res)[0] + cb_nbr = structure.l_cb[i] + if cb_nbr > 0: + cb = structure.atoms[cb_nbr] + cb['coord'] *= cb['mass'] + for at in at_nbr: + atom = all_atoms[at] + residue_name = atom['res_name'] + if atom['atom_name'] not in residue_atoms_internal[residue_name]: + cb['coord'] += atom['coord'] * atom['mass'] + cb['mass'] += atom['mass'] + cb['coord'] /= cb['mass'] + structure.atoms[cb_nbr] = cb + +def make_residue_lookup_table(structure): + l_residue = np.zeros((structure.n_residues, structure.max_atom_residue), dtype=np.int32) - 1 + n = 0 + res_dict = structure.residue_dict + for residue in list(res_dict.values()): + for atom in list(residue.values()): + atom_name = atom['atom_name'] + if atom_name in list(a2id.keys()): + l_residue[n, a2id[atom_name]] = atom['i'] + n += 1 + l_ca = l_residue[:, a2id['CA']] + l_cb = l_residue[:, a2id['CB']] + l_c = l_residue[:, a2id['C']] + l_n = l_residue[:, a2id['N']] + l_h = l_residue[:, a2id['H']] + return l_residue, l_ca, l_cb, l_c, l_n, l_h + +def get_residue_sequence(structure): + try: + residue_dict = structure.residue_dict + return [residue_dict[key]['C']['res_name'] for key in list(residue_dict.keys())] + except KeyError: + return structure.io.sequence(structure) + + +class Structure(object): + + max_atom_residue = 16 + + def __init__(self, filename=None, make_coarse=True, verbose=False, auto_update=True): + """ + + Attributes + ---------- + max_atom_residue : int + Maximum atoms per residue. The maximum atoms per residue have to be limited, because of the + residue/atom lookup tables. By default maximum 16 atoms per residue are allowed. + + xyz : numpy-array + The xyz-attribute is an array of the cartesian coordinates represented by the attribute atom + + residue_names: list + residue names is a list of the residue-names. Here the residues are represented by the same + name as the initial PDB-file, usually 3-letter amino-acid code. The residue_names attribute + may look like: ['TYR', 'HIS', 'ARG'] + + n_atoms: int + The number of atoms + + b_factos: array + An array of the b-factors. + + radius_gyration: float + The attribute radius_gyration returns the radius of gyration of the structure. The radius of gyration + is given by: rG = (np.sqrt((coord - rM) ** 2).sum(axis=1)).mean() + Here rM are the mean coordinates of the structure. + + + Parameters + ---------- + :param filename: str + Path to the pdb file on disk + :param make_coarse: bool + Conversion to coarse representation using internal coordinates. Side-chains are + not considered. The Cbeta-atoms is moved to center of mass of the side-chain. + :param verbose: bool + print output to stdout + :param auto_update: bool + update cartesian-coordiantes automatically after change of internal coordinates. + This only applies for coarse-grained coordinates + + Examples + -------- + >>> >>> s_coarse = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=True) + ====================================== + Filename: /sample_data/structure/HM_1FN5_Naming.pdb + Path: /sample_data/structure + Number of atoms: 9316 + -------------------------------------- + Atoms internal: 3457 + -------------------------------------- + >>> print s_coarse + ATOM 2274 O ALA 386 52.927 10.468 -17.263 0.00 0.00 O + ATOM 2275 CB ALA 386 53.143 12.198 -14.414 0.00 0.00 C + >>> s_coarse.omega *= 0.0 + >>> s_coarse.omega += 3.14 + >>> print s_coarse + ATOM 2273 C ALA 386 47.799 59.970 21.123 0.00 0.00 C + ATOM 2274 O ALA 386 47.600 59.096 20.280 0.00 0.00 O + >>> s_coarse.write('test_out.pdb') + >>> s_aa = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=False) + >>> print s_aa + ATOM 9312 H MET 583 40.848 10.075 17.847 0.00 0.00 H + ATOM 9313 HA MET 583 40.666 8.204 15.667 0.00 0.00 H + ATOM 9314 HB3 MET 583 38.898 7.206 16.889 0.00 0.00 H + ATOM 9315 HB2 MET 583 38.796 8.525 17.846 0.00 0.00 H + >>> print s_aa.omega + array([], dtype=float64) + >>> s_aa.to_coarse() + >>> print s_aa + ATOM 3451 CA MET 583 40.059 8.800 16.208 0.00 0.00 C + ATOM 3452 C MET 583 38.993 9.376 15.256 0.00 0.00 C + ATOM 3453 O MET 583 38.405 10.421 15.616 0.00 0.00 O + ATOM 3454 CB MET 583 39.408 7.952 17.308 0.00 0.00 C + ATOM 3455 H MET 583 40.848 10.075 17.847 0.00 0.00 H + print s_aa.omega + array([ 0. , 3.09665806, -3.08322105, 3.13562203, 3.09102453,...]) + """ + + super(Structure, self).__init__() + self.is_coarse = make_coarse + self.verbose = verbose + self.auto_update = auto_update + self.io = PDB + + if filename is not None: + self.filename = filename + + #################################################### + ###### PREPARE COORDINATES ###### + #################################################### + self.atoms = self.io.read(filename, verbose=self.verbose) + + #################################################### + ###### LOOKUP TABLES ###### + #################################################### + self.l_res, self.l_ca, self.l_cb, self.l_c, self.l_n, self.l_h = make_residue_lookup_table(self) + self.residue_types = np.array([res2id[res] for res in list(self.atoms['res_name']) + if res in list(res2id.keys())], dtype=np.int32) + self.dist_ca = np.zeros((self.n_residues, self.n_residues), dtype=np.float64) + + + self.sequence = get_residue_sequence(self) + + if make_coarse: + self.to_coarse() + + def to_coarse(self): + """ + Converts the structure-instance into a coarse structure. + + Examples + -------- + + >>> s_aa = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=False) + >>> print s_aa + ATOM 9312 H MET 583 40.848 10.075 17.847 0.00 0.00 H + ATOM 9313 HA MET 583 40.666 8.204 15.667 0.00 0.00 H + ATOM 9314 HB3 MET 583 38.898 7.206 16.889 0.00 0.00 H + ATOM 9315 HB2 MET 583 38.796 8.525 17.846 0.00 0.00 H + >>> s_aa.to_coarse() + >>> print s_aa + ATOM 3451 CA MET 583 40.059 8.800 16.208 0.00 0.00 C + ATOM 3452 C MET 583 38.993 9.376 15.256 0.00 0.00 C + ATOM 3453 O MET 583 38.405 10.421 15.616 0.00 0.00 O + ATOM 3454 CB MET 583 39.408 7.952 17.308 0.00 0.00 C + ATOM 3455 H MET 583 40.848 10.075 17.847 0.00 0.00 H + print s_aa.omega + array([ 0. , 3.09665806, -3.08322105, 3.13562203, 3.09102453,...]) + """ + self.is_coarse = True + + #################################################### + ###### TAKE ONLY INTERNAL ATOMS ###### + #################################################### + all_atoms = np.copy(self.atoms) + tmp = [atom for atom in all_atoms if atom['atom_name'] in residue_atoms_internal[atom['res_name']]] + atoms = np.empty(len(tmp), dtype={'names': PDB.keys, 'formats': PDB.formats}) + atoms[:] = tmp + atoms['i'] = np.arange(atoms.shape[0]) + atoms['atom_id'] = np.arange(atoms.shape[0]) + self.atoms = atoms + + #################################################### + ###### LOOKUP TABLES ###### + #################################################### + self.l_res, self.l_ca, self.l_cb, self.l_c, self.l_n, self.l_h = make_residue_lookup_table(self) + tmp = [res2id[res] for res in list(self.atoms['res_name']) if res in list(res2id.keys())] + self.residue_types = np.array(tmp, dtype=np.int32) + self.dist_ca = np.zeros((self.n_residues, self.n_residues), dtype=np.float64) + + #################################################### + ###### REASSIGN COORDINATES ###### + #################################################### + move_center_of_mass(self, all_atoms) + + self.sequence = get_residue_sequence(self) + + @property + def xyz(self): + return self.atoms['coord'] + + @xyz.setter + def xyz(self, v): + self.atoms['coord'] = v + + @property + def vdw(self): + return self.atoms['radius'] + + @vdw.setter + def vdw(self, v): + self.atoms['radius'] = v + + @property + def residue_names(self): + res_name = list(set(self.atoms['res_name'])) + res_name.sort() + return res_name + + @property + def residue_dict(self): + residue_dict = OrderedDict() + for res in list(set(self.atoms['res_id'])): + at_nbr = np.where(self.atoms['res_id'] == res) + residue_dict[res] = OrderedDict() + for atom in self.atoms[at_nbr]: + residue_dict[res][atom['atom_name']] = atom + return residue_dict + + @property # OK + def n_atoms(self): + return len(self.atoms) + + @property # OK + def n_residues(self): + return len(self.residue_ids) + + @property # OK + def atom_types(self): + return set(self.atoms['atom_name']) + + @property # OK + def residue_ids(self): + residue_ids = list(set(self.atoms['res_id'])) + return residue_ids + + @property # OK + def b_factors(self): + bfac = self.atoms[self.l_ca]['bfactor'] + return bfac + + @property + def radius_gyration(self): + coord = self.xyz + rM = coord[:, :].mean(axis=0) + rG = (np.sqrt((coord - rM) ** 2).sum(axis=1)).mean() + return float(rG) + + def update_coordinates(self): + if self.auto_update: + self.update() + + def update_dist(self): + raise NotImplementedError( + "CA-distance matrices require the cStructure extension, which is not " + "part of QuEst. Compute distances from Structure.xyz instead." + ) + + def update(self, start_point=0): + """Rebuild cartesian coordinates from the internal (torsion) ones. + + Requires the cStructure extension module, which QuEst does not ship. + Coarse-graining does not depend on this: it writes cartesian + coordinates directly. + """ + raise NotImplementedError( + "Rebuilding cartesian coordinates from torsion angles requires the " + "cStructure extension, which is not part of QuEst." + ) + + def write(self, filename=None, append=False): + if filename is None: + filename = self.filename + aw = np.copy(self.atoms) + aw['coord'] = self.xyz + self.io.write(filename, aw, append=append) + + def __str__(self): + if self.atoms is None: + return "" + else: + s = "" + for at in self.atoms: + s += "%-6s%5d %4s%1s%3s %1s%4d%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2s\n" % \ + ("ATOM ", + at['atom_id'], at['atom_name'], " ", at['res_name'], at['chain'], + at['res_id'], " ", + at['coord'][0], at['coord'][1], at['coord'][2], + 0.0, 0.0, " ", at['element']) + return s + + def __deepcopy__(self, memo): + new = copy(self) + new.atoms = np.copy(self.atoms) + new.dist_ca = np.copy(self.dist_ca) + new.filename = copy(self.filename) + new.io = self.io + + new.l_ca = deepcopy(self.l_ca) + new.l_cb = deepcopy(self.l_cb) + new.l_c = deepcopy(self.l_c) + new.l_n = deepcopy(self.l_n) + new.l_h = deepcopy(self.l_h) + new.l_res = deepcopy(self.l_res) + + return new diff --git a/quest/imp_tricks.py b/quest/imp_tricks.py new file mode 100644 index 0000000..bbc12aa --- /dev/null +++ b/quest/imp_tricks.py @@ -0,0 +1,103 @@ +"""Make an imp-tricks checkout importable in the live interpreter. + +imp-tricks ships its extensions as ``IMP.`` namespace directories under +``src/``. Adding ``src`` to ``sys.path`` is enough **only** when IMP itself is +absent or is a namespace package. In an environment with a compiled IMP — the +`arm64` conda environment here — ``IMP`` and ``IMP.bff`` are *regular* packages +with their own ``__init__.py``, so they shadow the checkout completely and +``import IMP.bff.av`` fails no matter what is on the path. + +The fix is to extend the already-imported package's ``__path__``, which is where +Python looks for submodules. That is what :func:`enable_imp_tricks` does, so +``IMP.bff.av`` and ``IMP.bff.distance_metrics`` from the checkout sit alongside +the compiled ``IMP.bff.AV`` rather than replacing it. + +This is a development convenience. Installing imp-tricks properly is the real +answer; see [okf/specs/imp-tricks-dedup.md]. +""" + +from __future__ import annotations + +import importlib +import os +import sys +from pathlib import Path +from typing import Iterable + +__all__ = ["DEFAULT_IMP_TRICKS_SRC", "imp_tricks_src", "enable_imp_tricks"] + +#: Where the checkout is expected when nothing says otherwise. +DEFAULT_IMP_TRICKS_SRC = Path.home() / "dev" / "imp-tricks" / "src" + + +def imp_tricks_src(path: Path | str | None = None) -> Path | None: + """Return the imp-tricks ``src`` directory, or ``None`` if there is none. + + Resolution order: the *path* argument, the ``IMP_TRICKS_SRC`` environment + variable, then :data:`DEFAULT_IMP_TRICKS_SRC`. + """ + + candidate = path or os.environ.get("IMP_TRICKS_SRC") or DEFAULT_IMP_TRICKS_SRC + resolved = Path(candidate).expanduser() + if (resolved / "IMP").is_dir(): + return resolved + return None + + +def _subpackages(src: Path) -> Iterable[str]: + for entry in sorted((src / "IMP").iterdir()): + if entry.is_dir() and not entry.name.startswith((".", "__")): + yield entry.name + + +def enable_imp_tricks(path: Path | str | None = None) -> list[str]: + """Splice an imp-tricks checkout into the importable ``IMP`` package. + + Returns the fully-qualified names that became importable (for example + ``["IMP.bff", "IMP.cgmol"]``). Returns an empty list when no checkout is + found — this is a convenience, never a hard requirement, so it does not + raise. + + Idempotent: re-running adds nothing a second time. + """ + + src = imp_tricks_src(path) + if src is None: + return [] + + enabled: list[str] = [] + + try: + imp_module = importlib.import_module("IMP") + except Exception: + # No IMP at all: the plain path trick is enough, since the checkout's + # IMP/ directory then becomes the namespace package itself. + if str(src) not in sys.path: + sys.path.insert(0, str(src)) + return [f"IMP.{name}" for name in _subpackages(src)] + + imp_path = getattr(imp_module, "__path__", None) + if imp_path is None: + return [] + + if str(src / "IMP") not in list(imp_path): + imp_path.append(str(src / "IMP")) + + for name in _subpackages(src): + target = src / "IMP" / name + try: + submodule = importlib.import_module(f"IMP.{name}") + except Exception: + # Not yet imported and not importable on its own: extending IMP's + # __path__ above is all that is needed for it to be found later. + enabled.append(f"IMP.{name}") + continue + + sub_path = getattr(submodule, "__path__", None) + if sub_path is not None and str(target) not in list(sub_path): + # A compiled package of the same name is already loaded; extend it + # so the checkout's submodules resolve underneath it. + sub_path.append(str(target)) + enabled.append(f"IMP.{name}") + + return enabled diff --git a/quest/lib/__init__.py b/quest/lib/__init__.py deleted file mode 100644 index 87d8b2b..0000000 --- a/quest/lib/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import os.path -package_directory = os.path.dirname(os.path.abspath(__file__)) -from .genealogy import * -from .structure import * -from . import math -from . import ui -from . import io -from . import tools diff --git a/quest/lib/common.py b/quest/lib/common.py deleted file mode 100644 index 9c1c927..0000000 --- a/quest/lib/common.py +++ /dev/null @@ -1,271 +0,0 @@ -""" -common.py - -Common data for all scripts in the SuRF-toolbox. In the common -library all kinds of constants are defined. For instance colors -in plots but also constants as the Avogadros number. -""" - -supported_coordinate_files = ['PDB', 'PQR'] - -# --------------------------------------------------------------------------- # -# Chemical data -# --------------------------------------------------------------------------- # -constants = {'kappa2': 2. / 3., - 'Na': 6.0221415e23, # Avogadro's number - particles / mol - 'nH2O': 1.33, # refractiveIndexWater - 'kB': 1.3806503e-23, # Boltzmann constant m2 kg/(s2 K) - 'T': 298.0} # Temperature in Kelvin - -# Dictionary of maximum bonds -MAX_BONDS = {'H': 1, - 'C': 4, - 'O': 3, - 'N': 4, - 'P': 5 -} - -# For Center of Mass Calculation. -# Taken from http://www.chem.qmul.ac.uk/iupac/AtWt/ & PyMol -atom_weights = { - 'H': 1.00794, - 'He': 4.002602, - 'Li': 6.941, - 'Be': 9.012182, - 'B': 10.811, - 'C': 12.0107, - 'N': 14.0067, - 'O': 15.9994, - 'F': 18.9984032, - 'Ne': 20.1797, - 'Na': 22.989770, - 'Mg': 24.3050, - 'Al': 26.981538, - 'Si': 28.0855, - 'P': 30.973761, - 'S': 32.065, - 'Cl': 35.453, - 'Ar': 39.948, - 'K': 39.0983, - 'Ca': 40.078, - 'Sc': 44.955910, - 'Ti': 47.867, - 'V': 50.9415, - 'Cr': 51.9961, - 'Mn': 54.938049, - 'Fe': 55.845, - 'Co': 58.933200, - 'Ni': 58.6934, - 'Cu': 63.546, - 'Zn': 65.39, - 'Ga': 69.723, - 'Ge': 72.64, - 'As': 74.92160, - 'Se': 78.96, - 'Br': 79.904, - 'Kr': 83.80, - 'Rb': 85.4678, - 'Sr': 87.62, - 'Y': 88.90585, - 'Zr': 91.224, - 'Nb': 92.90638, - 'Mo': 95.94, - 'Tc': 98.0, - 'Ru': 101.07, - 'Rh': 102.90550, - 'Pd': 106.42, - 'Ag': 107.8682, - 'Cd': 112.411, - 'In': 114.818, - 'Sn': 118.710, - 'Sb': 121.760, - 'Te': 127.60, - 'I': 126.90447, - 'Xe': 131.293, - 'Cs': 132.90545, - 'Ba': 137.327, - 'La': 138.9055, - 'Ce': 140.116, - 'Pr': 140.90765, - 'Nd': 144.24, - 'Pm': 145.0, - 'Sm': 150.36, - 'Eu': 151.964, - 'Gd': 157.25, - 'Tb': 158.92534, - 'Dy': 162.50, - 'Ho': 164.93032, - 'Er': 167.259, - 'Tm': 168.93421, - 'Yb': 173.04, - 'Lu': 174.967, - 'Hf': 178.49, - 'Ta': 180.9479, - 'W': 183.84, - 'Re': 186.207, - 'Os': 190.23, - 'Ir': 192.217, - 'Pt': 195.078, - 'Au': 196.96655, - 'Hg': 200.59, - 'Tl': 204.3833, - 'Pb': 207.2, - 'Bi': 208.98038, - 'Po': 208.98, - 'At': 209.99, - 'Rn': 222.02, - 'Fr': 223.02, - 'Ra': 226.03, - 'Ac': 227.03, - 'Th': 232.0381, - 'Pa': 231.03588, - 'U': 238.02891, - 'Np': 237.05, - 'Pu': 244.06, - 'Am': 243.06, - 'Cm': 247.07, - 'Bk': 247.07, - 'Cf': 251.08, - 'Es': 252.08, - 'Fm': 257.10, - 'Md': 258.10, - 'No': 259.10, - 'Lr': 262.11, - 'Rf': 261.11, - 'Db': 262.11, - 'Sg': 266.12, - 'Bh': 264.12, - 'Hs': 269.13, - 'Mt': 268.14, -} - - -# Dictionary of pKa values and un-protonated charge state. -PKA_DICT = {"ASP": 4.0, - "CYS": 8.5, - "GLU": 4.4, - "TYR": 10.0, - "CTERM": 3.1, - "ARG": 12.0, - "HIS": 6.5, - "LYS": 10.4, - "NTERM": 8.0} - -CHARGE_DICT = {"ASP": -1., - "CYS": -1., - "GLU": -1., - "TYR": -1., - "CTERM": -1., - "ARG": 1., - "HIS": 1., - "LYS": 1., - "NTERM": 1.} - -# Atom on which to place charge -TITR_ATOM = {"ASP": "CG ", - "GLU": "CD ", - "TYR": "OH ", - "ARG": "CZ ", - "HIS": "NE2", - "LYS": "NZ "} - -# Atom on which to place charge (in coarse mode always Cb for now) -TITR_ATOM_COARSE = {"ASP": "CB", - "GLU": "CB", - "TYR": "CB", - "ARG": "CB", - "HIS": "CB", - "LYS": "CB", - "CYS": "CB"} - -# Dictionary of amino acid molecular weights. The the molecular weight of water -# should be subtracted for each peptide bond to calculate a protein molecular -# weight. -MW_DICT = {"ALA": 89.09, - "ARG": 174.20, - "ASN": 132.12, - "ASP": 133.10, - "ASX": 132.61, - "CYS": 121.15, - "GLN": 146.15, - "GLU": 147.13, - "GLX": 146.64, - "GLY": 75.07, - "HIS": 155.16, - "ILE": 131.17, - "LEU": 131.17, - "LYS": 146.19, - "MET": 149.21, - "PHE": 165.19, - "PRO": 115.13, - "SER": 105.09, - "THR": 119.12, - "TRP": 204.23, - "TYR": 181.19, - "VAL": 117.15, - "IVA": 85.12, - "STA": 157.15, - "ACE": 43.30} -MW_H2O = 18.0 - -# Dictionary of van der Waal radii -VDW_DICT = {"CA": 1.870, "C": 1.760, "O": 1.400, - "AD": 1.700, "AD": 1.700, "AE": 1.700, "AE": 1.700, "C0": 1.870, - "CB": 1.870, "CD": 1.870, "CG": 1.870, "CE": 1.870, "CH": 1.760, "CZ": 1.870, - "CR": 3.5, # coarse grained Carbon/Calpha - "C": 1.76, - # Nitrogen - "N": 1.650, "ND": 1.650, "NE": 1.650, "NZ": 1.650, "NH": 1.650, - # Oxygen - "OD": 1.400, "O": 1.400, "OE": 1.400, "OG": 1.400, "OXT": 1.400, - "OH": 1.400, "OP": 1.400, - # Sulphur - "SD": 1.850, "S": 1.850, "SG": 1.850, - # Hydrogen - "H": 1.1, "HB": 1.1, "HD": 1.1, "HG": 1.1, "HE": 1.1, - "HZ": 1.1, "CH": 1.1, "HH": 1.1, "HA": 1.1, "HT": 1.1, - # Phosphor - "P": 1.900} - -# --------------------------------------------------------------------------- # -# Amino acid name data -# DON'T CHANGE ORDER!!! -# --------------------------------------------------------------------------- # - -_aa_index = [('ALA', 'A'), # 0 - ('CYS', 'C'), # 1 - ('ASP', 'D'), # 2 - ('GLU', 'E'), # 3 - ('PHE', 'F'), # 4 - ('GLY', 'G'), # 5 - ('HIS', 'H'), # 6 - ('ILE', 'I'), # 7 - ('LYS', 'K'), # 8 - ('LEU', 'L'), # 9 - ('MET', 'M'), # 10 - ('ASN', 'N'), # 11 - ('PRO', 'P'), # 12 - ('GLN', 'Q'), # 13 - ('ARG', 'R'), # 14 - ('SER', 'S'), # 15 - ('THR', 'T'), # 16 - ('VAL', 'V'), # 17 - ('TRP', 'W'), # 18 - ('TYR', 'Y'), # 19 - ('cisPro', 'cP'), # 20 - ('transPro', 'tP'), # 21 - ('CYX', 'C'), # 22 in Amber CYS with disulfide-bridge - ('HIE', 'H'), # 22 in Amber CYS with disulfide-bridge -] - -AA3_TO_AA1 = dict(_aa_index) -AA1_TO_AA3 = dict([(aa[1], aa[0]) for aa in _aa_index]) -AA3_TO_ID = dict([(aa[0], i) for i, aa in enumerate(_aa_index)]) - -# --------------------------------------------------------------------------- # -# PDB record data -# --------------------------------------------------------------------------- # - -# Types of coordinate entries -COORD_RECORDS = ["ATOM ", "HETATM"] - diff --git a/quest/lib/fps/__init__.py b/quest/lib/fps/__init__.py deleted file mode 100644 index 2e069f4..0000000 --- a/quest/lib/fps/__init__.py +++ /dev/null @@ -1,836 +0,0 @@ -import os.path -import json -import os -from collections import OrderedDict - -import numpy as np -from numba import njit, prange -from qtpy import QtGui, QtCore, QtWidgets, uic -from lib.io import PDB -from lib.structure import Structure -from lib.io import write_xyz - -try: - import LabelLib as ll - HAS_LABELLIB = True -except Exception: # pragma: no cover - optional dependency - HAS_LABELLIB = False - -from quest.lib.imp_av import ( - HAS_IMP_BFF, - build_imp_accessible_volume, -) - - -# Numba-accelerated kernels (flattened from fps.py) -@njit(cache=True) -def _density2points(n, npm, dg, density, r0, ng): - r = np.empty((n, 3), dtype=np.float64) - gd = np.arange(-npm, npm, dtype=np.float64) * dg - n_out = 0 - for ix in range(-npm, npm): - offset = ng * (ng * (ix + npm)) + npm - for iy in range(-npm, npm): - for iz in range(-npm, npm): - if density[iz + offset] > 0: - r[n_out, 0] = gd[ix + npm] + r0[0] - r[n_out, 1] = gd[iy + npm] + r0[1] - r[n_out, 2] = gd[iz + npm] + r0[2] - n_out += 1 - offset += ng - return r[:n_out] - - -def density2points(n, npm, dg, density, r0, ng): - return _density2points( - int(n), - int(npm), - float(dg), - np.asarray(density, dtype=np.float64), - np.asarray(r0, dtype=np.float64), - int(ng), - ) - - -@njit(cache=True, parallel=True) -def _ran_dist(av1_points, av2_points, distances, n_samples): - lp1 = av1_points.shape[0] - lp2 = av2_points.shape[0] - for i in prange(n_samples): - i1 = int(np.random.random() * lp1) - i2 = int(np.random.random() * lp2) - d0 = av1_points[i1, 0] - av2_points[i2, 0] - d1 = av1_points[i1, 1] - av2_points[i2, 1] - d2 = av1_points[i1, 2] - av2_points[i2, 2] - distances[i] = np.sqrt(d0 * d0 + d1 * d1 + d2 * d2) - - -def RDAMeanE(av1, av2, R0: float = 52.0, nSamples: int = 50_000): - distances = np.empty(nSamples, dtype=np.float64) - _ran_dist(av1.points, av2.points, distances, nSamples) - Esum = np.mean(1.0 / (1.0 + (distances / R0) ** 6.0)) - return (1.0 / Esum - 1.0) ** (1.0 / 6.0) * R0 - - -def RDAMean(av1, av2, nSamples: int = 50_000): - distances = np.empty(nSamples, dtype=np.float64) - _ran_dist(av1.points, av2.points, distances, nSamples) - return float(np.mean(distances)) - - -def dRmp(av1, av2): - return float(np.sqrt(((av1.Rmp - av2.Rmp) ** 2).sum())) - - -@njit(cache=True, parallel=True) -def _subav(density, ng, slow_radius, rs, r0, dg): - subav_density = density.copy() - n_slow_center = rs.shape[0] - for ix in prange(ng): - for iy in range(ng): - for iz in range(ng): - if subav_density[ix, iy, iz] == 0: - continue - is_slow = 0 - for isa in range(n_slow_center): - ix0 = int(((rs[isa, 0] - r0[0]) / dg)) + (ng - 1) // 2 - iy0 = int(((rs[isa, 1] - r0[1]) / dg)) + (ng - 1) // 2 - iz0 = int(((rs[isa, 2] - r0[2]) / dg)) + (ng - 1) // 2 - slow_radius_idx = int(slow_radius[isa] / dg) - dx = ix - ix0 - dy = iy - iy0 - dz = iz - iz0 - if dx * dx + dy * dy + dz * dz < slow_radius_idx * slow_radius_idx: - is_slow = 1 - break - if is_slow == 0: - subav_density[ix, iy, iz] = 0 - return subav_density - - -def subav(density, ng, dg, slow_radius, rs, r0): - return _subav( - np.asarray(density, dtype=np.uint8), - int(ng), - np.asarray(slow_radius, dtype=np.float64), - np.asarray(rs, dtype=np.float64), - np.asarray(r0, dtype=np.float64), - float(dg), - ) - - -@njit(cache=True, parallel=True) -def _simulate_traj(d, ds, dg, t_max, t_step, D, slow_fact): - n_samples = int(t_max / t_step) - ng = d.shape[0] - sigma = np.sqrt(2 * D * 3 * t_step) / dg - pos = np.zeros((n_samples, 3), dtype=np.float64) - accepted = np.zeros(n_samples, dtype=np.uint8) - r = np.random.normal(0.0, sigma, size=(n_samples, 3)) - slow_fact_sqrt = np.sqrt(slow_fact) - - # pick a starting point in AV - found = False - for _ in range(1000): - x_idx = np.random.randint(0, ng) - y_idx = np.random.randint(0, ng) - z_idx = np.random.randint(0, ng) - if d[x_idx, y_idx, z_idx] > 0: - pos[0, 0] = x_idx - pos[0, 1] = y_idx - pos[0, 2] = z_idx - found = True - break - if not found: - return pos, accepted, 0, 0 - - n_accepted = 1 - n_rejected = 0 - i_accepted = 0 - for i in range(n_samples): - x_idx = int(pos[i_accepted, 0]) - y_idx = int(pos[i_accepted, 1]) - z_idx = int(pos[i_accepted, 2]) - if ds[x_idx, y_idx, z_idx] > 0: - r[i, 0] *= slow_fact_sqrt - r[i, 1] *= slow_fact_sqrt - r[i, 2] *= slow_fact_sqrt - - pos[i, 0] = pos[i_accepted, 0] + r[i, 0] - pos[i, 1] = pos[i_accepted, 1] + r[i, 1] - pos[i, 2] = pos[i_accepted, 2] + r[i, 2] - - x_idx = int(pos[i, 0]) - y_idx = int(pos[i, 1]) - z_idx = int(pos[i, 2]) - if 0 <= x_idx < ng and 0 <= y_idx < ng and 0 <= z_idx < ng and d[x_idx, y_idx, z_idx] > 0: - i_accepted = i - n_accepted += 1 - accepted[i] = 1 - else: - n_rejected += 1 - accepted[i] = 0 - return (pos - (ng - 1) / 2.0) * dg, accepted, n_accepted, n_rejected - - -def simulate_traj(d, ds, dg, t_max, t_step, D, slow_fact): - return _simulate_traj( - np.asarray(d, dtype=np.uint8), - np.asarray(ds, dtype=np.uint8), - float(dg), - float(t_max), - float(t_step), - float(D), - float(slow_fact), - ) - - -def spherePoints(nSphere: int): - inc = np.pi * (3.0 - np.sqrt(5.0)) - offset = 2.0 / float(nSphere) - k_vals = np.arange(nSphere, dtype=np.float32) - y = k_vals * offset - 1.0 + (offset / 2.0) - rd = np.sqrt(1.0 - y * y) - phi = k_vals * inc - x = np.cos(phi) * rd - z = np.sin(phi) * rd - return np.stack([x, y, z], axis=1).astype(np.float32) - - -@njit(cache=True) -def _asa(r, vdw, probe_atom_indices, sphere_points, probe, radius): - nSphere = sphere_points.shape[0] - n_probe_atoms = probe_atom_indices.shape[0] - n_atoms = r.shape[0] - if n_probe_atoms == 0 or nSphere == 0 or n_atoms == 0: - return np.zeros(n_probe_atoms, dtype=np.float32) - - neighbor_indices = np.zeros(n_atoms, dtype=np.uint32) - probe_atom_asa = np.zeros(n_probe_atoms, dtype=np.float32) - c = 4.0 * np.pi / float(nSphere) - for i in range(n_probe_atoms): - probe_atom_index = probe_atom_indices[i] - n_neighbor = 0 - aX, aY, aZ = r[probe_atom_index] - for atom_index in range(n_atoms): - if probe_atom_index != atom_index: - bX, bY, bZ = r[atom_index] - dist2 = (aX - bX) ** 2 + (aY - bY) ** 2 + (aZ - bZ) ** 2 - if dist2 < 2 * (vdw[probe_atom_index] + probe): - neighbor_indices[n_neighbor] = atom_index - n_neighbor += 1 - - n_accessible_point = 0 - for j in range(nSphere): - is_accessible = True - aX = sphere_points[j, 0] * radius + r[probe_atom_index, 0] - aY = sphere_points[j, 1] * radius + r[probe_atom_index, 1] - aZ = sphere_points[j, 2] * radius + r[probe_atom_index, 2] - for k in range(n_neighbor): - bX, bY, bZ = r[neighbor_indices[k]] - dist2 = (aX - bX) ** 2 + (aY - bY) ** 2 + (aZ - bZ) ** 2 - if dist2 < (radius + probe) * (radius + probe): - is_accessible = False - break - if is_accessible: - n_accessible_point += 1 - probe_atom_asa[i] = c * n_accessible_point * vdw[probe_atom_index] ** 2 - return probe_atom_asa - - -def asa(r, vdw, probe_atom_indices, sphere_points, probe=1.0, radius=2.5): - r = np.asarray(r, dtype=np.float32) - vdw = np.asarray(vdw, dtype=np.float32) - probe_atom_indices = np.asarray(probe_atom_indices, dtype=np.uint32) - if sphere_points is None or np.asarray(sphere_points).ndim != 2: - sphere_points = spherePoints(590) - sphere_points = np.asarray(sphere_points, dtype=np.float32) - return _asa(r, vdw, probe_atom_indices, sphere_points, float(probe), float(radius)) - - -def density2points_ll(nx, ny, nz, g, dx, dy, dz, ox, oy, oz): - points = np.empty((nx*ny*nz, 3), dtype=np.float64) - iat = 0 - for iz in range(nz): - for iy in range(ny): - for ix in range(nx): - val = g[ix, iy, iz] - if val <= 0.0: - continue - iat += 1 - points[iat][0] = ix * dx + ox - points[iat][1] = iy * dy + oy - points[iat][2] = iz * dz + oz - return points[:iat] - - -def calculate1R(l: float, - w: float, - r: float, - atom_i: int, - x: np.array, - y: np.array, - z: np.array, - vdw: np.array, - linkersphere: float = 0.5, - linknodes: int = 3, - vdwRMax: float = 1.8, - dg: float = 0.5, - verbose: bool = False - ): - """ - :param l: linker length - :param w: linker width - :param r: dye-radius - :param atom_i: attachment-atom index - :param x: Cartesian coordinates of atoms (x) - :param y: Cartesian coordinates of atoms (y) - :param z: Cartesian coordinates of atoms (z) - :param vdw: Van der Waals radii (same length as number of atoms) - :param linkersphere: Initial linker-sphere to start search of allowed dye positions (not used anymore) - :param linknodes: By default 3 (not used anymore) - :param vdwRMax: Maximal Van der Waals radius (not used anymore) - :param dg: Resolution of accessible volume in Angstrom - :param verbose: If true informative output is printed on std-out - :return: - """ - if verbose: - print("AV: calculate1R") - n_atoms = len(vdw) - x0, y0, z0 = x[atom_i], y[atom_i], z[atom_i] - r0 = np.array([x0, y0, z0]) - - vdw_copy = np.copy(vdw) - vdw_copy[atom_i] = 0.0 - atoms = np.vstack([x, y, z, vdw_copy]) - source = r0 - av1 = ll.dyeDensityAV1( - atoms, - source, - l, w, r, dg - ) - nx, ny, nz = av1.shape - g = np.array(av1.grid).reshape([nx, ny, nz], order='F') - print(nx, ny, nz, dg, dg, dg, x0, y0, z0) - points = density2points_ll(nx, ny, nz, g, dg, dg, dg, x0, y0, z0) - g[g < 0] = 0 - g[g > 0] = 1 - density = g.astype(np.uint8) - ng = nx - - if verbose: - print("Number of atoms: %i" % n_atoms) - print("Attachment atom coordinates: %s" % r0) - - return points, density, ng, r0 - - -class AV(object): - - def __init__(self, structure, residue_seq_number=None, atom_name=None, chain_identifier=None, - linker_length=20.0, linker_width=0.5, radius1=5.0, - radius2=4.5, radius3=3.5, simulation_grid_resolution=0.5, save_av=False, output_file='out', - attachment_atom_index=None, verbose=False, allowed_sphere_radius=0.5, - simulation_type='AV1', position_name=None, residue_name=None): - - """ - Parameters - ---------- - :param structure: Structure of str - either string with path of pdb-file or pdb object - :param residue_seq_number: - :param atom_name: - :param chain_identifier: - :param linker_length: - :param linker_width: - :param radius1: - :param radius2: - :param radius3: - :param simulation_grid_resolution: - :param save_av: - :param output_file: - :param attachment_atom_index: - :param verbose: - :param allowed_sphere_radius: - :param simulation_type: - :param position_name: - :param residue_name: - :raise ValueError: - - Examples - -------- - Calculating accessible volume using provided pdb-file - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> residue_number = 18 - >>> atom_name = 'CB' - >>> attachment_atom = 1 - >>> av = lib.fps.AV(pdb_filename, attachment_atom=1, verbose=True) - - Calculating accessible volume using provided Structure object - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av = lib.fps.AV(structure, attachment_atom=1, verbose=True) - Calculating accessible volume - ----------------------------- - Loading PDB - Calculating initial-AV - Linker-length : 20.00 - Linker-width : 0.50 - Linker-radius : 5.00 - Attachment-atom: 1 - AV-resolution : 0.50 - AV: calculate1R - Number of atoms: 2647 - Attachment atom: [ 33.28 58.678 40.397] - Points in AV: 111911 - Points in total-AV: 111911 - - Using residue_seq_number and atom_name to calculate accessible volume, this also works without - chain_identifier. However, only if a single-chain is present. - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av = lib.fps.AV(structure, residue_seq_number=11, atom_name='CB', verbose=True) - - If save_av is True the calculated accessible volume is save to disk. The filename of the calculated - accessible volume is determined by output_file - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av = lib.fps.AV(structure, residue_seq_number=11, atom_name='CB', verbose=True, save_av=True, output_file='test') - Calculating accessible volume - ----------------------------- - Loading PDB - Calculating initial-AV - Linker-length : 20.00 - Linker-width : 0.50 - Linker-radius : 5.00 - Attachment-atom: 174 - AV-resolution : 0.50 - AV: calculate1R - Number of atoms: 2647 - Attachment atom: [ 41.606 44.953 36.625] - Points in AV: 22212 - Points in total-AV: 22212 - - write_xyz - --------- - Filename: test.xyz - ------------------- - - """ - self.verbose = verbose - self.points_slow = None - self.position_name = position_name - self.residue_name = residue_name - if verbose: - print("") - print("Calculating accessible volume") - print("-----------------------------") - if isinstance(structure, Structure): - atoms = structure.atoms - else: - if verbose: - print("Loading PDB") - atoms = PDB.read(structure, verbose=verbose) - x = atoms['coord'][:, 0] - y = atoms['coord'][:, 1] - z = atoms['coord'][:, 2] - vdw = atoms['radius'] - self.structure = structure - self.dg = simulation_grid_resolution - self.output_file = output_file - - # Determine Labeling position - if verbose: - print("Labeling position") - print("Chain ID: %s" % chain_identifier) - print("Residue seq. number: %s" % residue_seq_number) - print("Residue name: %s" % residue_name) - print("Atom name: %s" % atom_name) - - def _decode(value): - if isinstance(value, bytes): - return value.decode().strip() - if isinstance(value, np.bytes_): - return value.tobytes().decode().strip() - if isinstance(value, np.str_): - return str(value).strip() - return str(value).strip() - - if attachment_atom_index is None: - if residue_seq_number is None or atom_name is None: - raise ValueError("either attachment_atom number or residue and atom_name have to be provided.") - self.attachment_residue = residue_seq_number - self.attachment_atom = atom_name - if chain_identifier is None: - attachment_atom_index = np.where((atoms['res_id'] == residue_seq_number) & - (atoms['atom_name'] == atom_name))[0] - else: - attachment_atom_index = np.where((atoms['res_id'] == residue_seq_number) & - (atoms['atom_name'] == atom_name) & - (atoms['chain'] == chain_identifier))[0] - if len(attachment_atom_index) != 1: - raise ValueError("Invalid selection of attachment atom") - else: - attachment_atom_index = attachment_atom_index[0] - if verbose: - print("Atom index: %s" %attachment_atom_index) - else: - if residue_seq_number is None: - residue_seq_number = int(atoms['res_id'][attachment_atom_index]) - if atom_name is None: - atom_name = _decode(atoms['atom_name'][attachment_atom_index]) - if chain_identifier is None: - chain_identifier = _decode(atoms['chain'][attachment_atom_index]) - self.attachment_residue = residue_seq_number - self.attachment_atom = atom_name - - if verbose: - print("Calculating initial-AV") - print("Linker-length : %.2f" % linker_length) - print("Linker-width : %.2f" % linker_width) - print("Linker-radius : %.2f" % radius1) - print("Attachment-atom: %i" % attachment_atom_index) - print("AV-resolution : %.2f" % simulation_grid_resolution) - if HAS_IMP_BFF: - av_result = build_imp_accessible_volume( - structure=structure, - residue_seq_number=residue_seq_number, - atom_name=atom_name, - chain_identifier=chain_identifier, - linker_length=linker_length, - linker_width=linker_width, - radii=(radius1, radius2, radius3), - allowed_sphere_radius=allowed_sphere_radius, - simulation_grid_resolution=simulation_grid_resolution, - ) - points = av_result.points if av_result.points.size else np.zeros((0, 3), dtype=np.float64) - density = av_result.density - ng = av_result.grid_size - x0 = av_result.attachment_point - elif HAS_LABELLIB: - if simulation_type == 'AV3': - points, density, ng, x0 = calculate3R( - linker_length, - linker_width, - radius1, - radius2, - radius3, - attachment_atom_index, - x, - y, - z, - vdw, - dg=simulation_grid_resolution, - verbose=verbose, - linkersphere=allowed_sphere_radius, - ) - else: - points, density, ng, x0 = calculate1R( - linker_length, - linker_width, - radius1, - attachment_atom_index, - x, - y, - z, - vdw, - verbose=verbose, - linkersphere=allowed_sphere_radius, - dg=simulation_grid_resolution, - ) - else: - raise RuntimeError( - "Neither IMP.bff nor LabelLib are available to compute accessible volumes. " - "Install IMP.bff (preferred) or LabelLib." - ) - - self.ng = ng - self.points = points - self.points_fast = points.copy() - self.density_fast = density - self.density_slow = None - self.density = density - self.x0 = x0 - if verbose: - print("Points in total-AV: %i" % density.sum()) - if save_av: - write_xyz(output_file + '.xyz', points, verbose=verbose) - - def calc_slow_av(self, slow_centers=None, slow_radius=None, save=True, verbose=True, replace_density=False): - """ - Calculates a subav given the accessible volume determined during class initiation. - : list/numpy array of points dimension (npoints, 3) - - - Parameters - ---------- - :param slow_centers : array_like - A list of Cartesian coordinated representing the slow centers. The shape should be (n,3) - where n is the number of slow centers. - :param slow_radius : array_like, or float - A list of radii the shape - :param replace_density : bool - If replace_density is True the AV-density will be replaced by the density of the slow - accessible volume - :param verbose : bool - :param save : bool - If save is True the slow-accessible volume is saved to an xyz-file with the suffix '_slow' - - """ - verbose = verbose or self.verbose - if verbose: - print("Calculating slow-AV:") - print(slow_centers) - if isinstance(slow_radius, (int, float)): - slow_radii = np.ones(slow_centers.shape[0])*slow_radius - elif len(slow_radius) != slow_centers.shape[0]: - raise ValueError("The size of the slow_radius doesnt match the number of slow_centers") - - if verbose or self.verbose: - print("Calculating slow AV") - print("slow centers: \n%s" % slow_centers) - - ng = int(self.ng) - npm = int((ng - 1) // 2) - density = self.density_fast - dg = self.dg - x0 = self.x0 - slow_density = subav(density, ng, dg, slow_radii, slow_centers, x0) - n = slow_density.sum() - points = density2points(n, npm, dg, slow_density.reshape(ng*ng*ng), x0, ng) - if verbose or self.verbose: - print("Points in slow-AV: %i" % n) - if save: - write_xyz(self.output_file + '_slow.xyz', points, verbose=verbose) - self.density_slow = slow_density - self.points_slow = points - if replace_density: - self.density = slow_density - - @property - def Rmp(self): - return self.points.mean(axis=0) - - def dRmp(self, av): - """ - Calculate the distance between the mean positions with respect to the accessible volume `av` - - Parameters - ---------- - av : accessible volume object - - Example - ------- - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') - >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') - >>> av1.dRmp(av2) - """ - return dRmp(self, av) - - def dRDA(self, av): - """ - Calculate the mean distance to the second accessible volume `av` - - Parameters - ---------- - av : accessible volume object - - Example - ------- - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') - >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') - >>> av1.dRDA(av2) - """ - return RDAMean(self, av) - - - def dRDAE(self, av): - """ - Calculate the FRET-averaged mean distance to the second accessible volume `av` - - Parameters - ---------- - av : accessible volume object - - Example - ------- - >>> import lib - >>> pdb_filename = '/sample_data/structure/T4L_Topology.pdb' - >>> structure = lib.Structure(pdb_filename) - >>> av1 = lib.fps.AV(structure, residue_seq_number=72, atom_name='CB') - >>> av2 = lib.fps.AV(structure, residue_seq_number=134, atom_name='CB') - >>> av1.dRDAE(av2) - """ - return RDAMeanE(self, av) - - def __repr__(self): - s = '\n' - s += 'Accessible Volume\n' - s += '-----------------\n' - s += 'Attachment residue: %s\n' % self.attachment_residue - s += 'Attachment atom: %s\n' % self.attachment_atom - s += '\n' - s += 'Fast-AV:\n' - s += 'n-points: %s\n' % self.points_fast.shape[0] - if self.points_slow is not None: - s += 'Slow-AV:\n' - s += 'n-points: %s\n' % self.points_slow.shape[0] - else: - s += 'Slow-AV: not calculated' - return s - - -class AvPotential(object): - - name = 'Av' - - def __init__(self, distances=None, positions=None, av_samples=10000, min_av=150, verbose=False): - """ - parameters should be a dictionary determining the - system (labeling positions etc.) - >>> import json - >>> labeling_file = './sample_data/model/labeling.json' - >>> labeling = json.load(open(labeling_file, 'r')) - >>> distances = labeling['Distances'] - >>> positions = labeling['Positions'] - >>> import lib - >>> av_potential = lib.fps.AvPotential(distances=distances, positions=positions) - >>> structure = lib.Structure('/sample_data/model/HM_1FN5_Naming.pdb') - >>> av_potential.getChi2(structure) - """ - self.verbose = verbose - self.distances = distances - self.positions = positions - self.n_av_samples = av_samples - self.min_av = min_av - self.avs = OrderedDict() - - @property - def structure(self): - return self._structure - - @structure.setter - def structure(self, structure): - self._structure = structure - self.calc_avs() - - def calc_avs(self): - if self.positions is None: - raise ValueError("Positions not set unable to calculate AVs") - arguments = [ - dict( - {'structure': self.structure, - 'verbose': self.verbose, - }, - **self.positions[position_key] - ) - for position_key in self.positions - ] - avs = map(lambda x: AV(**x), arguments) - for i, position_key in enumerate(self.positions): - self.avs[position_key] = avs[i] - - def calc_distances(self, structure=None, verbose=False): - verbose = verbose or self.verbose - if isinstance(structure, Structure): - self.structure = structure - for distance_key in self.distances: - distance = self.distances[distance_key] - av1 = self.avs[distance['position1_name']] - av2 = self.avs[distance['position2_name']] - distance_type = distance['distance_type'] - R0 = distance['Forster_radius'] - if distance_type == 'RDAMean': - d12 = RDAMean(av1, av2, self.n_av_samples) - elif distance_type == 'Rmp': - d12 = dRmp(av1, av2) - elif distance_type == 'RDAMeanE': - d12 = RDAMeanE(av1, av2, R0, self.n_av_samples) - distance['model_distance'] = d12 - if verbose: - print("-------------") - print("Distance: %s" % distance_key) - print("Forster-Radius %.1f" % distance['Forster_radius']) - print("Distance type: %s" % distance_type) - print("Model distance: %.1f" % d12) - print("Experimental distance: %.1f (-%.1f, +%.1f)" % (distance['distance'], - distance['error_neg'], distance['error_pos'])) - - def getChi2(self, structure=None, reduced=False, verbose=False): - verbose = self.verbose or verbose - if isinstance(structure, Structure): - self.structure = structure - - chi2 = 0.0 - self.calc_distances(verbose=verbose) - for distance in list(self.distances.values()): - dm = distance['model_distance'] - de = distance['distance'] - error_neg = distance['error_neg'] - error_pos = distance['error_pos'] - d = dm - de - chi2 += (d / error_neg)**2 if d < 0 else (d / error_pos)**2 - if reduced: - return chi2 / (len(list(self.distances.keys())) - 1.0) - else: - return chi2 - - def getEnergy(self, structure=None): - if isinstance(structure, Structure): - self.structure = structure - return self.getChi2() - - -class AvWidget(AvPotential, QtWidgets.QWidget): - - def __init__(self, parent=None): - QtWidgets.QWidget.__init__(self, parent=parent) - uic.loadUi('./lib/fps/avWidget.ui', self) - AvPotential.__init__(self) - self._filename = None - self.connect(self.actionOpenLabeling, QtCore.SIGNAL("triggered()"), self.onLoadAvJSON) - - def onLoadAvJSON(self): - self.filename = str(QtWidgets.QFileDialog.getOpenFileName(None, 'Open FRET-JSON', '', 'link file (*.fps.json)')[0]) - - @property - def filename(self): - return self._filename - - @filename.setter - def filename(self, v): - if os.path.isfile(v): - self._filename = v - p = json.load(open(v)) - self.distances = p["Distances"] - self.positions = p["Positions"] - else: - v = 'None' - self.lineEdit_2.setText(v) - - @property - def n_av_samples(self): - return int(self.spinBox_2.value()) - - @n_av_samples.setter - def n_av_samples(self, v): - return self.spinBox_2.setValue(int(v)) - - @property - def min_av(self): - return int(self.spinBox_2.value()) - - @min_av.setter - def min_av(self, v): - return self.spinBox.setValue(int(v)) - diff --git a/quest/lib/genealogy.py b/quest/lib/genealogy.py deleted file mode 100644 index 49caa2b..0000000 --- a/quest/lib/genealogy.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -import uuid - - -class Genealogy(object): - """ - Directed tree. - """ - - def __init__(self, parents=[]): - object.__init__(self) - self._parents = parents - self._children = [] - self.id = uuid.uuid1() - - def name_dict(self): - """ - returns a dict as -as_dict- however - """ - - def as_dict(self): - dict = {self: self.get_children()} - for child in self.get_children(): - dict.update(child.as_dict()) - return dict - - def from_dict(self, dict): - for child in dict[self]: - child.link(self) - child.from_dict(dict) - - def is_root(self): - return len(self._parents) == 0 - - def get_parents(self): - return self._parents - - def get_children(self): - return list(self._children) - - def get_siblings(self): - if self.is_root(): - return [] - siblings = [p.get_children() for p in self.get_parents()] - siblings.remove(self) - return siblings - - def get_ancestors(self, n_generations=1): - if self.is_root() or n_generations < 1: return [] - parents = self.get_parents() - ancestors = [parents] - for p in parents: - ancestors += p.get_ancestors(n_generations - 1) - return ancestors - - def get_descendants(self, n_generations=None): - descendants = [self] - if n_generations is None: - for child in self.get_children(): - descendants += child.get_descendants() - return descendants - else: - if n_generations > 0: - for child in self.get_children(): - descendants += child.get_descendants(n_generations=n_generations - 1) - return descendants - - def is_child(self, group): - return group in self.get_children() - - def has_children(self): - return len(self.get_children()) > 0 - - def link(self, parents): - self._p_changed = 1 - if type(parents) != list: - parents = [parents] - elif parents is None: - return - self._parents = parents - for parent in parents: - parent._children.append(self) - - def unlink(self): - self._p_changed = 1 - if not self.is_root(): - for parent in self._parents: - parent._children.remove(self) - - def trace_back(self): - trace = [self] - generation = self - while not generation.is_root(): - generation = generation.get_parents() - trace.insert(0, generation) - return trace - - def _new_id(self): - self._p_changed = 1 - self.id = uuid.uuid1() - - def __iter__(self): - # http://stackoverflow.com/questions/5434400/python-is-it-possible-to-make-a-class-iterable-using-the-standard-syntax - for each in self.get_children(): - yield each - #for each in self.__dict__.keys(): - # yield self.__getattribute__(each) - - def __getitem__(self, key): - if isinstance(key, int): - return self.get_children()[key] - else: - start = 0 if key.start is None else key.start - stop = None if key.stop is None else key.stop - step = 1 if key.step is None else key.step - return self.get_children()[start:stop:step] - - diff --git a/quest/lib/imp_av.py b/quest/lib/imp_av.py deleted file mode 100644 index 627e470..0000000 --- a/quest/lib/imp_av.py +++ /dev/null @@ -1,166 +0,0 @@ -from __future__ import annotations - -import contextlib -import os -import tempfile -from dataclasses import dataclass -from typing import Iterable, Tuple - -import numpy as np - -try: # pragma: no cover - optional heavy dependency - import IMP - import IMP.algebra - import IMP.atom - import IMP.bff - import IMP.core - import IMP.em - - HAS_IMP_BFF = True -except Exception: # pragma: no cover - keep optional dependency lazy - HAS_IMP_BFF = False - - -@dataclass -class IMPAccessibleVolumeResult: - points: np.ndarray - density: np.ndarray - grid_size: int - attachment_point: np.ndarray - - -def _ensure_pdb_path(structure) -> Tuple[str, contextlib.AbstractContextManager]: - """Return a context manager yielding a pdb path for IMP.""" - if isinstance(structure, str) and os.path.isfile(structure): - @contextlib.contextmanager - def _existing(): - yield structure - - return structure, _existing() - - if hasattr(structure, "filename") and structure.filename and os.path.isfile( - structure.filename - ): - @contextlib.contextmanager - def _filename(): - yield structure.filename - - return structure.filename, _filename() - - if hasattr(structure, "write"): - @contextlib.contextmanager - def _tmp(): - fd, tmp_path = tempfile.mkstemp(suffix=".pdb") - os.close(fd) - structure.write(tmp_path) - try: - yield tmp_path - finally: - with contextlib.suppress(FileNotFoundError): - os.remove(tmp_path) - - return "", _tmp() - - raise ValueError("Structure must be a filepath or provide a write() method.") - - -def _select_attachment_particle( - hierarchy: "IMP.atom.Hierarchy", - residue_seq_number: int, - atom_name: str, - chain_identifier: str | None, -) -> "IMP.Particle": - selection = IMP.atom.Selection(hierarchy) - if chain_identifier: - selection.set_chain_id(chain_identifier) - if residue_seq_number is not None: - selection.set_residue_index(int(residue_seq_number)) - if atom_name: - selection.set_atom_type(IMP.atom.AtomType(str(atom_name))) - particles = selection.get_selected_particles() - if not particles: - raise ValueError( - f"Unable to locate attachment site {chain_identifier}:{residue_seq_number}:{atom_name}" - ) - return particles[0] - - -def _path_map_density_to_grid(path_map: "IMP.bff.PathMap") -> Tuple[np.ndarray, int]: - header = path_map.get_header() - nx, ny, nz = header.get_nx(), header.get_ny(), header.get_nz() - if not (nx == ny == nz): - raise ValueError( - "IMP PathMap grid is not cubic; Quest requires equal nx, ny, nz." - ) - tile_values: Iterable[float] = path_map.get_tile_values( - IMP.bff.PM_TILE_ACCESSIBLE_DENSITY, - ( - 0.0, - path_map.get_path_map_header().get_max_path_length(), - ), - ) - density = np.asarray(tile_values, dtype=np.float32).reshape((nx, ny, nz), order="C") - density = np.where(density > 0.0, 1, 0).astype(np.uint8) - return density, nx - - -def build_imp_accessible_volume( - structure, - residue_seq_number: int, - atom_name: str, - chain_identifier: str | None, - linker_length: float, - linker_width: float, - radii: Tuple[float, float, float], - allowed_sphere_radius: float, - simulation_grid_resolution: float, -) -> IMPAccessibleVolumeResult: - if not HAS_IMP_BFF: - raise RuntimeError( - "IMP.bff is required to calculate accessible volumes. " - "Install the imp-bff package to enable this feature." - ) - - pdb_hint, ctx_mgr = _ensure_pdb_path(structure) - with ctx_mgr as pdb_path: - path_to_use = pdb_hint or pdb_path - if not path_to_use: - path_to_use = pdb_path - model = IMP.Model() - hierarchy = IMP.atom.read_pdb(path_to_use, model) - attachment_particle = _select_attachment_particle( - hierarchy, residue_seq_number, atom_name, chain_identifier - ) - - av_particle = IMP.Particle(model) - build_kwargs = dict( - linker_length=linker_length, - linker_width=linker_width, - radii=radii, - allowed_sphere_radius=allowed_sphere_radius, - contact_volume_thickness=0.0, - contact_volume_trapped_fraction=-1, - simulation_grid_resolution=simulation_grid_resolution, - ) - IMP.bff.AV.do_setup_particle(model, av_particle, attachment_particle, **build_kwargs) - av = IMP.bff.AV(model, av_particle) - av.resample() - - path_map = av.get_map() - density, grid_size = _path_map_density_to_grid(path_map) - xyz_density = path_map.get_xyz_density() - if xyz_density: - points = np.asarray( - [[vec[0], vec[1], vec[2]] for vec in xyz_density], dtype=np.float64 - ) - else: - points = np.zeros((0, 3), dtype=np.float64) - - attachment_point = np.asarray(av.get_source_coordinates(), dtype=np.float64) - - return IMPAccessibleVolumeResult( - points=points, - density=density, - grid_size=int(grid_size), - attachment_point=attachment_point, - ) diff --git a/quest/lib/io/PDB.py b/quest/lib/io/PDB.py deleted file mode 100644 index 36dca24..0000000 --- a/quest/lib/io/PDB.py +++ /dev/null @@ -1,346 +0,0 @@ -import os -import locale -import numpy as np -import lib.common as common - - -keys = ['i', 'chain', 'res_id', 'res_name', - 'atom_id', 'atom_name', 'element', - 'coord', - 'charge', 'radius', 'bfactor', 'mass'] - -formats = ['i4', '|U1', 'i4', '|U5', - 'i4', '|U5', '|U1', - '3f8', - 'f8', 'f8', 'f8', 'f8'] - - -def assign_element_to_atom_name( - atom_name: str -): - """Tries to guess element from atom name if not recognised. - - :param atom_name: string - - Examples - -------- - - >>> assign_element_to_atom_name('CA') - C - """ - element = "" - if atom_name.upper() not in common.atom_weights: - # Inorganic elements have their name shifted left by one position - # (is a convention in PDB, but not part of the standard). - # isdigit() check on last two characters to avoid mis-assignment of - # hydrogens atoms (GLN HE21 for example) - # Hs may have digit in [0] - putative_element = atom_name[1] if atom_name[0].isdigit() else atom_name[0] - if putative_element.capitalize() in common.atom_weights.keys(): - element = putative_element - return element - - -def sequence(structure, use_atoms=False): - """ - ParseModel the SEQRES entries in a pdb file. If this fails, use the ATOM - entries. Return dictionary of sequences keyed to chain and type of - sequence used. - :param structure: a `Structure` object - :param use_atoms: boolean - """ - # Try using SEQRES - pdb = open(structure.filename, 'r').readlines() - # get residue-sequence - seq = [l for l in pdb if l[0:6] == "SEQRES"] - if len(seq) != 0 and not use_atoms: - chain_dict = dict([(l[11], []) for l in seq]) - for c in list(chain_dict.keys()): - chain_seq = [l[19:70].split() for l in seq if l[11] == c] - for x in chain_seq: - chain_dict[c].extend(x) - else: - # Check to see if there are multiple models. If there are, only look - # at the first model. - models = [i for i, l in enumerate(pdb) if l.startswith("MODEL")] - if len(models) > 1: - pdb = pdb[models[0]:models[1]] - atoms = [l for l in pdb if l[0:6] == "ATOM " and l[13:16] == "CA "] - chain_dict = dict([(l[21], []) for l in atoms]) - for c in list(chain_dict.keys()): - chain_dict[c] = [l[17:20] for l in atoms if l[21] == c] - return chain_dict - - - -def parse_string_pdb(string, assignCharge=False, **kwargs): - rows = string.splitlines() - verbose = kwargs.get('verbose', True) - atoms = np.zeros(len(rows), dtype={'names': keys, 'formats': formats}) - ni = 0 - for line in rows: - if line.startswith('ATOM'): - atom_name = line[12:16].strip().upper() - atoms['i'][ni] = ni - atoms['chain'][ni] = line[21] - atoms['res_name'][ni] = line[17:20].strip().upper() - atoms['atom_name'][ni] = atom_name - atoms['res_id'][ni] = line[22:26] - atoms['atom_id'][ni] = line[6:11] - atoms['coord'][ni][0] = line[30:38] - atoms['coord'][ni][1] = line[38:46] - atoms['coord'][ni][2] = line[46:54] - atoms['bfactor'][ni] = line[60:65] - atoms['element'][ni] = assign_element_to_atom_name(atom_name) - try: - if assignCharge: - if atoms['res_name'][ni] in common.CHARGE_DICT: - if atoms['atom_name'][ni] == common.TITR_ATOM_COARSE[atoms['res_name'][ni]]: - atoms['charge'][ni] = common.CHARGE_DICT[atoms['res_name'][ni]] - atoms['mass'][ni] = common.atom_weights[atoms['element'][ni]] - atoms['radius'][ni] = common.VDW_DICT[atoms['element'][ni]] - except KeyError: - print("Cloud not assign parameters to: %s" % line) - ni += 1 - atoms = atoms[:ni] - if verbose: - print("Number of atoms: %s" % (ni + 1)) - return atoms - - -def parse_string_pqr(string, **kwargs): - rows = string.splitlines() - verbose = kwargs.get('verbose', True) - atoms = np.zeros(len(rows), dtype={'names': keys, 'formats': formats}) - ni = 0 - - for line in rows: - if line[:4] == "ATOM" or line[:6] == "HETATM": - # Extract x, y, z, r from pqr to xyzr file - atom_name = line[12:16].strip().upper() - atoms['i'][ni] = ni - atoms['chain'][ni] = line[21] - atoms['atom_name'][ni] = atom_name.upper() - atoms['res_name'][ni] = line[17:20].strip().upper() - atoms['res_id'][ni] = line[21:27] - atoms['atom_id'][ni] = line[6:11] - atoms['coord'][ni][0] = "%10.5f" % float(line[30:38].strip()) - atoms['coord'][ni][1] = "%10.5f" % float(line[38:46].strip()) - atoms['coord'][ni][2] = "%10.5f" % float(line[46:54].strip()) - atoms['radius'][ni] = "%10.5f" % float(line[63:70].strip()) - atoms['element'][ni] = assign_element_to_atom_name(atom_name) - atoms['charge'][ni] = "%10.5f" % float(line[55:62].strip()) - ni += 1 - - atoms = atoms[:ni] - if verbose: - print("Number of atoms: %s" % (ni + 1)) - return atoms - - -def assign_element_to_atom_name( - atom_name: str -): - """Tries to guess element from atom name if not recognised. - - :param atom_name: string - - Examples - -------- - - >>> assign_element_to_atom_name('CA') - C - """ - if atom_name.upper() not in common.atom_weights: - # Inorganic elements have their name shifted left by one position - # (is a convention in PDB, but not part of the standard). - # isdigit() check on last two characters to avoid mis-assignment of - # hydrogens atoms (GLN HE21 for example) - # Hs may have digit in [0] - putative_element = atom_name[1] if str(atom_name[0]).isdigit() else atom_name[0] - if putative_element.capitalize() in common.atom_weights: - atom_name = putative_element - else: - atom_name = "" - return atom_name - - -def read(filename, assignCharge=False, **kwargs): - """ Open pdb_file and read each line into pdb (a list of lines) - - :param filename: - :return: - numpy structured array containing the PDB info and VdW-radii and charges - - Examples - -------- - - >>> pdb_file = './sample_data/model/hgbp1/hGBP1_closed.pdb' - >>> pdb = mfm.io.pdb_file.read(pdb_file, verbose=True) - >>> pdb[:5] - array([ (0, ' ', 7, 'MET', 1, 'N', 'N', [72.739, -17.501, 8.879], 0.0, 1.65, 0.0, 14.0067), - (1, ' ', 7, 'MET', 2, 'CA', 'C', [73.841, -17.042, 9.747], 0.0, 1.76, 0.0, 12.0107), - (2, ' ', 7, 'MET', 3, 'C', 'C', [74.361, -18.178, 10.643], 0.0, 1.76, 0.0, 12.0107), - (3, ' ', 7, 'MET', 4, 'O', 'O', [73.642, -18.708, 11.489], 0.0, 1.4, 0.0, 15.9994), - (4, ' ', 7, 'MET', 5, 'CB', 'C', [73.384, -15.89, 10.649], 0.0, 1.76, 0.0, 12.0107)], - dtype=[('i', ' 1: - pdb = pdb[models[0]:models[1]] - atoms = [l for l in pdb if l[0:6] == "ATOM " and l[13:16] == "CA "] - chain_dict = dict([(l[21], []) for l in atoms]) - for c in list(chain_dict.keys()): - chain_dict[c] = [l[17:20] for l in atoms if l[21] == c] - return chain_dict - - def writeData(self, filename, atoms=None, append=False): - """ - :param filename: - :param atoms: - :return: - """ - mode = 'a+' if append else 'w+' - if atoms is not None: - fp = open(filename, mode) - # http://cupnet.net/pdb_format/ - al = ["%-6s%5d %4s%1s%3s %1s%4d%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2s\n" % - ("ATOM ", at['atom_id'], at['atom_name'], " ", at['res_name'], at['chain'], at['res_id'], " ", - at['coord'][0], at['coord'][1], at['coord'][2], 0.0, at['bfactor'], at['element'], " ") - for at in atoms - ] - if mode == 'a+': - fp.write('MODEL') - fp.write("".join(al)) - if mode == 'a+': - fp.write('ENDMDL') - fp.close() - - def readData(self, filename, assignCharge=True): - """ - Open pdb_file and read each line into pdb (a list of lines) - :param filename: - :return: - """ - self.filename = filename - assignCharge = int(self.assignCharge) if assignCharge is None else assignCharge - if not os.path.isfile(filename): - raise ValueError("") - f = open(filename, 'r') - rows = f.readlines() - f.close() - atoms = np.empty(len(rows), dtype={'names': keys, 'formats': formats}) - ni = 0 - for line in rows: - if line[0:6] == "ATOM ": - atom_name = line[12:16].strip().upper() - atoms['i'][ni] = ni - atoms['chain'][ni] = line[21] - atoms['res_name'][ni] = line[17:20].strip().upper() - atoms['atom_name'][ni] = atom_name.strip().upper() - atoms['res_id'][ni] = line[22:26] - atoms['atom_id'][ni] = line[6:11] - atoms['coord'][ni][0] = line[30:38] - atoms['coord'][ni][1] = line[38:46] - atoms['coord'][ni][2] = line[46:54] - atoms['bfactor'][ni] = line[60:65] - if assignCharge: - try: - if atoms['res_name'][ni] in common.CHARGE_DICT: - if atoms['atom_name'][ni] == common.TITR_ATOM_COARSE[atoms['res_name'][ni]]: - atoms['charge'][ni] = common.CHARGE_DICT[atoms['res_name'][ni]] - atoms['element'][ni] = assign_element(atoms['atom_name'][ni]) - atoms['mass'][ni] = common.atom_weights[atoms['element'][ni]] - atoms['radius'][ni] = common.VDW_DICT[atoms['element'][ni]] - except KeyError: - print("Cloud not assign parameters to: %s" % line) - ni += 1 - path, baseName = os.path.split(filename) - if self.verbose: - print("======================================") - print("Filename: %s" % filename) - print("Path: %s" % path) - print("Number of atoms: %s" % (ni + 1)) - print("--------------------------------------") - return atoms[:ni] diff --git a/quest/lib/math/__init__.py b/quest/lib/math/__init__.py deleted file mode 100644 index 50437b3..0000000 --- a/quest/lib/math/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -import numpy as np - - -def xcorr_fft( - in_1: np.ndarray, - in_2: np.ndarray, - axis: int = 0, - normalize: bool = True, -) -> np.ndarray: - """Cross-correlation via FFT.""" - if len(in_1) == 0 or len(in_2) == 0: - return np.array([], dtype=in_1.dtype) - - c = in_1 - d = in_2 - n = c.shape[axis] - m = [slice(None)] * len(c.shape) - - f1 = np.fft.fft(c - np.mean(c, axis=axis), n=2 * n, axis=axis) - f2 = np.fft.fft(d - np.mean(d, axis=axis), n=2 * n, axis=axis) - - m[axis] = slice(0, n) - acf = np.fft.ifft(f1 * np.conjugate(f2), axis=axis)[m[axis]].real - m[axis] = 0 - return acf / acf[m[axis]] if normalize else acf - - -def autocorr( - x: np.ndarray, - axis: int = 0, - normalize: bool = True, -) -> np.ndarray: - """Autocorrelation of a time series using FFT.""" - if len(x) == 0: - return np.array([], dtype=x.dtype) - return xcorr_fft(in_1=x, in_2=x, axis=axis, normalize=normalize) - - diff --git a/quest/lib/math/functions/__init__.py b/quest/lib/math/functions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/quest/lib/math/functions/datatools.py b/quest/lib/math/functions/datatools.py deleted file mode 100644 index 671eec8..0000000 --- a/quest/lib/math/functions/datatools.py +++ /dev/null @@ -1,150 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Tue Feb 22 15:41:12 2011 - -@author: thomas -""" -import copy - -import numpy - - -def hist2func(x, H, binEdges): - """ - Example: - import numpy - import matplotlib.pylab as p - - H = numpy.array([0,2,1]) - binEdges = numpy.array([0,5,10,15]) - - x = numpy.linspace(-5, 20, 50) - y = hist2func(x, H, binEdges) - - p.plot(x,y) - p.show() - """ - if type(x) == float or numpy.float: - x = numpy.array([x]) - if type(x) == list: - x = numpy.array(x).flatten() - re = [] - if type(x) == numpy.ndarray: - for xi in x.flatten(): - if xi>max(binEdges) or xi < min(binEdges): - re.append(0.0) - else: - sel = numpy.where(xi rng[1] - m1 = m1l + m1u - x1.mask = m1 - y1.mask = m1 - - m2l = x2.data < rng[0] - m2u = x2.data > rng[1] - m2 = m2l + m2u - x2.mask = m2 - y2.mask = m2 - - # create new lists: overlap - o and rest -r - # overlap - ox1 = x1.compressed() - oy1 = y1.compressed() - ox2 = x2.compressed() - oy2 = y2.compressed() - - return (ox1, oy1), (ox2, oy2) - - -def align_x_spacing(dataset1, dataset2, method = 'linear-close'): - (ox1, oy1), (ox2, oy2) = dataset1, dataset2 - #Assume that data is more or less equaliy spaced - # t- template array, r - rescale array - if len(ox1) tx[j]: - rx2 = rxi - ry2 = ry[i] - if ry2-ry1 != 0 and rx1-rx2 != 0: - m = (ry2-ry1)/(rx1-rx2) - ny[j] = m*tx[j] + ry1 - m * rx1 - else: - ny[j] = ry1 - j += 1 - elif rxi == tx[j]: - ny[j] = ry[i] - j += 1 - else: - ry1 = ry[i] - rx1 = rx[i] - else: - ny[j] = ry[i:].means() - - if cm == "r1": - rx1 = nx - ry1 = ny - rx2 = tx - ry2 = ty - elif cm == "r2": - rx2 = nx - ry2 = ny - rx1 = tx - ry1 = ty - return ((rx1, ry1), (rx2, ry2)) - diff --git a/quest/lib/math/linalg/__init__.py b/quest/lib/math/linalg/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/quest/lib/structure/Structure.py b/quest/lib/structure/Structure.py deleted file mode 100644 index d5b893b..0000000 --- a/quest/lib/structure/Structure.py +++ /dev/null @@ -1,830 +0,0 @@ -import os -from copy import deepcopy, copy -from collections import OrderedDict -import tempfile - -import numpy as np - -import lib -from lib.io.PDB import Pdb - -import os.path - - -clusterCriteria = ['maxclust', 'inconsistent', 'distance'] - - -def onRMSF(structures, selectedNbrs, atomName=None, weights=None): - """ - Calcualtes the root mean square deviation with respect to the average structure - for a given set of structures. The structures do not have to be aligned. - :param structures: a list of structure object of type Structure - :param selectedNbrs: list of integers with the selected structures out of the structure list - :param atomName: atom-name used for calcualtion (e.g. 'CA') if not specified all atoms are used - :return: - """ - print("onRMSF") - if weights is None: - print("using no weights") - weights = np.ones(len(selectedNbrs), dtype=np.float32) - else: - print("using weights") - weights /= sum(weights) - candidateStructures = [deepcopy(structures[i]) for i in selectedNbrs] - print("calculating average structure as a reference") - reference = average(candidateStructures, weights=weights) - print("aligning selected structures with respect to reference") - for s in candidateStructures: - super_impose(reference, s) - print("Getting %s-atoms of reference" % atomName) - ar = reference.getAtoms(atomName=atomName) - cr = ar['coord'] - msf = np.zeros(len(ar), dtype=np.float32) - for i, s in enumerate(candidateStructures): - a = s.getAtoms(atomName=atomName) - ca = a['coord'] - msf += weights[i] * np.sum((cr - ca) ** 2, axis=1) - return np.sqrt(msf) - - -def rmsd(sa, sb, atom_indices=None): - """ - Takes two structures and returns the rmsd-value - >>> import lib - >>> t = lib.TrajectoryFile('./sample_data/structure/2807_8_9_b.h5', mode='r', stride=1) - >>> s1 = t[10] - >>> s1 - - >>> s2 = t[0] - >>> s2 - - >>> rmsd(s1, s2) - 6.960082250440536 - """ - if atom_indices is not None: - a = sa.xyz[atom_indices] - b = sb.xyz[atom_indices] - else: - a = sa.xyz - b = sb.xyz - rmsd = np.sqrt(1. / a.shape[0] * ((a - b) ** 2).sum()) - return float(rmsd) - - -def find_representative(trajectory, cl): - """ - :param trajectory: a list of structures - :param c: a list of numbers (positions in structures) belonging to one cluster - :return: index of representative structure of cluster - """ - structuresInCluster = [trajectory[i] for i in cl] - averageStructureInCluster = average(structuresInCluster) - idx, representativeStructureInCluster = find_best(averageStructureInCluster, structuresInCluster) - idxOfRepresentativeStructure = cl[idx] - return idxOfRepresentativeStructure - - -def cluster(structures, threshold=5000, criterion='maxclust', Z=None, distances=None, directory=None): - # http://www.mathworks.de/de/help/stats/hierarchical-clustering.html - print("Performing cluster-analysis") - k = 0 - #start_time = time.time() - nStructures = len(structures) - if distances is None: - distances = np.empty(nStructures * (nStructures - 1) / 2) - for i in range(nStructures): - for j in range(i + 1, nStructures): - distances[k] = rmsd(structures[j], structures[i]) - k += 1 - m = (nStructures * nStructures - 1) / 2 - print('RMSD computation %s/%s : %.1f%%' % (k, m, float(k) / m * 100.0)) - if directory is not None: - print("Saving distance-matrix") - np.save(directory + '/' + 'clDistances.npy', distances) - - print('mean pairwise distance ', np.mean(distances)) - print('stddev pairwise distance', np.std(distances)) - - if Z is None: - # run hierarchical clustering on the distance matrix - print('\n\nRunning hierarchical clustering (UPGMA)...') - Z = hclust.linkage(distances, method='average', preserve_input=True) - # get flat clusters from the linkage matrix corresponding to states - if directory is not None: - print("Saving cluster-results") - np.save(directory + '/' + 'clLinkage.npy', Z) - - print('\n\nFlattening the clusters...') - assignments = fcluster(Z, t=threshold, criterion=criterion) - cl = dict() - for c in np.unique(assignments): - cl[c] = [] - for i, a in enumerate(assignments): - cl[a] += [i] - #print "Needed time: %.3f seconds" % (time.time() - start_time) - print('Number of clusters found', len(np.unique(assignments))) - return Z, cl, assignments, distances - - -def findSmallestCluster(clusters): - print("findSmallestCluster") - minCl = list(clusters.keys())[0] - for clName in clusters: - if len(clusters[clName]) < len(clusters[minCl]): - minCl = clName - return minCl - - -def super_impose(structure_ref, structure_align, atom_indices=None): - if atom_indices is not None: - a_atoms = structure_align.xyz[atom_indices] - r_atoms = structure_ref.xyz[atom_indices] - else: - a_atoms = structure_align.xyz - r_atoms = structure_ref.xyz - - # Center coordinates - n = r_atoms.shape[0] - av1 = a_atoms.sum(axis=0) / n - av2 = r_atoms.sum(axis=0) / n - re = structure_ref.xyz - av2 - al = structure_align.xyz - av1 - - # Calculate rotation matrix - a = np.dot(np.transpose(al), re) - u, d, vt = np.linalg.svd(a) - - rot = np.transpose(np.dot(np.transpose(vt), np.transpose(u))) - if np.linalg.det(rot) < 0: - vt[2] = -vt[2] - rot = np.transpose(np.dot(np.transpose(vt), np.transpose(u))) - - # Rotate structure - structure_align.xyz = np.dot(al, rot) - - -def average(structures, weights=None, write=True, filename=None): - """ - Calculates weighted average of a list of structures. - saves to filename if write is True - if filename not provided makes new "average.pdb" file in temp-folder - of the system - - Example: - >>> import lib - >>> t = lib.TrajectoryFile('./sample_data/structure/2807_8_9_b.h5', mode='r', stride=1) - >>> avg = t.average - >>> avg - - >>> avg.filename - 'c:\\users\\peulen\\appdata\\local\\temp\\average.pdb' - """ - if weights is None: - weights = np.ones(len(structures), dtype=np.float64) - weights /= weights.sum() - else: - weights = np.array(weights) - avg = Structure() - avg.atoms = np.copy(structures[0].atoms) - avg.xyz *= 0.0 - for i, s in enumerate(structures): - avg.xyz += weights[i] * s.xyz - filename = os.path.join(tempfile.tempdir, "average.pdb") if filename is None else filename - if write: - avg.filename = filename - avg.write() - return avg - - -def find_best(target, reference, atom_indices=None): - """ - target and reference are both of type mdtraj.Trajectory - reference is of length 1, target of arbitrary length - - returns a Structure object and the index within the trajectory - - >>> import lib - >>> t = t = lib.TrajectoryFile('./sample_data/structure/2807_8_9_b.h5', mode='r', stride=1) - >>> find_best(t.mdtraj, t.mdtraj[2]) - (2, - ) - """ - rmsds = mdtraj.rmsd(target, reference, atom_indices=atom_indices) - iMin = np.argmin(rmsds) - return iMin, target[iMin] - - -class Universe(object): - def __init__(self, structure=None): - self.structures = [] if structure is None else [structure] - self.potentials = [] - self.scaling = [] - self.Es = [] - - def addPotential(self, potential, scale=1.0): - print("addPotential") - self.potentials.append(potential) - self.scaling.append(scale) - - def removePotential(self, potentialNbr=None): - print("removePotential") - if potentialNbr == -1: - self.potentials.pop() - self.scaling.pop() - else: - self.potentials.pop(potentialNbr) - self.scaling.pop(potentialNbr) - - def clearPotentials(self): - self.potentials = [] - self.scaling = [] - - def getEnergy(self, structure=None): - if isinstance(structure, Structure): - for p in self.potentials: - p.structure = structure - Es = self.getEnergies() - E = Es.sum() - self.E = E - if E < -10000: - print(Es) - return E - - def getEnergies(self, structure=None): - if isinstance(structure, Structure): - for p in self.potentials: - p.structure = structure - - scales = np.array(self.scaling) - Es = np.array([pot.getEnergy() for pot in self.potentials]) - self.Es = np.dot(scales, Es) - return Es - - -internal_atom_numbers = [ - ('N', 0), - ('CA', 1), - ('C', 2), - ('O', 3), - ('CB', 4), - ('H', 5), - ('CG', 6), - ('CD', 7), -] - -residue_atoms_internal = OrderedDict([ - ('CYS', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('MET', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('PHE', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('ILE', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('LEU', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('VAL', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('TRP', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('TYR', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('ALA', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('GLY', ['N', 'C', 'CA', 'O', 'H']), - ('THR', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('SER', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('GLN', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('ASN', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('GLU', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('ASP', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('HIS', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('ARG', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('LYS', ['N', 'C', 'CA', 'CB', 'O', 'H']), - ('PRO', ['N', 'C', 'CA', 'CB', 'O', 'H', 'CG', 'CD']), -] -) - -cartesian_keys = ['i', 'chain', 'res_id', 'res_name', 'atom_id', 'atom_name', 'element', 'coord', - 'charge', 'radius', 'bfactor'] - -cartesian_formats = ['i4', '|S1', 'i4', '|S5', 'i4', '|S5', '|S1', '3f8', 'f4int', 'f4', 'f4'] - -internal_keys = ['i', 'ib', 'ia', 'id', 'b', 'a', 'd'] -internal_formats = ['i4', 'i4', 'i4', 'i4', 'f8', 'f8', 'f8'] - - -def _norm(vec): - return float(np.linalg.norm(vec)) - - -def _angle(a, b, c): - r12 = a - b - r23 = c - b - r12n = _norm(r12) - r23n = _norm(r23) - return float(np.arccos(np.dot(r12, r23) / (r12n * r23n))) - - -def _dihedral(v1, v2, v3, v4): - b1 = v1 - v2 - b2 = v2 - v3 - b3 = v3 - v4 - n1 = np.cross(b1, b2) - n2 = np.cross(b2, b3) - m1 = np.cross(b2, n1) - n1_inv = 1.0 / np.linalg.norm(n1) - n2_inv = 1.0 / np.linalg.norm(n2) - m1_inv = 1.0 / np.linalg.norm(m1) - cos_phi = np.dot(n1, n2) * (n1_inv * n2_inv) - sin_phi = np.dot(m1, n2) * (m1_inv * n2_inv) - cos_phi = np.clip(cos_phi, -1.0, 1.0) - sin_phi = np.clip(sin_phi, -1.0, 1.0) - return float(-np.arctan2(sin_phi, cos_phi)) - - -def _atom_dist(aDist, resLookUp, xyz, aID): - n_residues = resLookUp.shape[0] - for i in range(n_residues): - ia1 = resLookUp[i, aID] - if ia1 < 0: - continue - a1 = xyz[ia1, 0] - a2 = xyz[ia1, 1] - a3 = xyz[ia1, 2] - for j in range(i, n_residues): - ia2 = resLookUp[j, aID] - if ia2 < 0: - continue - b1 = xyz[ia2, 0] - a1 - b2 = xyz[ia2, 1] - a2 - b3 = xyz[ia2, 2] - a3 - d12 = float(np.sqrt(b1 * b1 + b2 * b2 + b3 * b3)) - aDist[i, j] = d12 - aDist[j, i] = d12 - return aDist - - -def _internal_to_cartesian(internal_coordinates, r, startPoint=0): - b = internal_coordinates["b"] - a = internal_coordinates["a"] - d = internal_coordinates["d"] - ans = internal_coordinates["i"] - ib = internal_coordinates["ib"] - ia = internal_coordinates["ia"] - id_ = internal_coordinates["id"] - - nAtoms = internal_coordinates.shape[0] - p = np.zeros((nAtoms, 3), dtype=float) - sin_theta = np.sin(a) - cos_theta = np.cos(a) - sin_phi = np.sin(d) - cos_phi = np.cos(d) - p[:, 0] = b * sin_theta * sin_phi - p[:, 1] = b * sin_theta * cos_phi - p[:, 2] = b * cos_theta - - for i in range(nAtoms): - if ib[i] != 0 and ia[i] != 0 and id_[i] != 0: - ab = r[ib[i]] - r[ia[i]] - bc = r[ia[i]] - r[id_[i]] - nab = np.linalg.norm(ab) - nbc = np.linalg.norm(bc) - if nab == 0 or nbc == 0: - continue - ab /= nab - bc /= nbc - v = np.cross(ab, bc) - cos_alpha = np.dot(ab, bc) - sin_alpha = np.sqrt(max(1.0 - cos_alpha * cos_alpha, 0.0)) - if sin_alpha == 0: - continue - v /= sin_alpha - u = np.cross(v, ab) - r[ans[i], 0] = r[ib[i], 0] + v[0] * p[i, 0] + u[0] * p[i, 1] - ab[0] * p[i, 2] - r[ans[i], 1] = r[ib[i], 1] + v[1] * p[i, 0] + u[1] * p[i, 1] - ab[1] * p[i, 2] - r[ans[i], 2] = r[ib[i], 2] + v[2] * p[i, 0] + u[2] * p[i, 1] - ab[2] * p[i, 2] - return r - -a2id = dict(internal_atom_numbers) -id2a = dict([(a[1], a[0]) for a in internal_atom_numbers]) -res2id = dict([(aa, i) for i, aa in enumerate(residue_atoms_internal)]) - - -def r2i(coord_i, a1, a2, a3, an, ai): - """ - Cartisian coordinates to internal-coordinates - """ - vn = an['coord'] - v1 = a1['coord'] - v2 = a2['coord'] - v3 = a3['coord'] - b = _norm(v3 - vn) - a = _angle(v2, v3, vn) - d = _dihedral(v1, v2, v3, vn) - coord_i[ai] = an['i'], a3['i'], a2['i'], a1['i'], b, a, d - return ai + 1 - - -def move_center_of_mass(structure, all_atoms): - for i, res in enumerate(structure.residue_ids): - at_nbr = np.where(all_atoms['res_id'] == res)[0] - cb_nbr = structure.l_cb[i] - if cb_nbr > 0: - cb = structure.atoms[cb_nbr] - cb['coord'] *= cb['mass'] - for at in at_nbr: - atom = all_atoms[at] - residue_name = atom['res_name'] - if atom['atom_name'] not in residue_atoms_internal[residue_name]: - cb['coord'] += atom['coord'] * atom['mass'] - cb['mass'] += atom['mass'] - cb['coord'] /= cb['mass'] - structure.atoms[cb_nbr] = cb - - -def calc_internal_coordinates(structure): - structure.coord_i = np.zeros(structure.atoms.shape[0], dtype={'names': internal_keys, 'formats': internal_formats}) - rp, ai = None, 0 - res_nr = 0 - for rn in list(structure.residue_dict.values()): - res_nr += 1 - # BACKBONE - if rp is None: - structure.coord_i[ai] = rn['N']['i'], 0, 0, 0, 0.0, 0.0, 0.0 - ai += 1 - structure.coord_i[ai] = rn['CA']['i'], rn['N']['i'], 0, 0, \ - _norm(rn['N']['coord'] - rn['CA']['coord']), 0.0, 0.0 - ai += 1 - structure.coord_i[ai] = rn['C']['i'], rn['CA']['i'], rn['N']['i'], 0, \ - _norm(rn['CA']['coord'] - rn['C']['coord']), \ - _angle(rn['C']['coord'], rn['CA']['coord'], rn['N']['coord']), \ - 0.0 - ai += 1 - else: - ai = r2i(structure.coord_i, rp['N'], rp['CA'], rp['C'], rn['N'], ai) - ai = r2i(structure.coord_i, rp['CA'], rp['C'], rn['N'], rn['CA'], ai) - ai = r2i(structure.coord_i, rp['C'], rn['N'], rn['CA'], rn['C'], ai) - ai = r2i(structure.coord_i, rn['N'], rn['CA'], rn['C'], rn['O'], ai) # O - # SIDECHAIN - resName = rn['CA']['res_name'] - if resName != 'GLY': - ai = r2i(structure.coord_i, rn['O'], rn['C'], rn['CA'], rn['CB'], ai) # CB - if resName != 'PRO': - ai = r2i(structure.coord_i, rn['N'], rn['CA'], rn['C'], rn['H'], ai) # H - else: - ai = r2i(structure.coord_i, rn['N'], rn['CA'], rn['CB'], rn['CG'], ai) # CG - ai = r2i(structure.coord_i, rn['CA'], rn['CB'], rn['CG'], rn['CD'], ai) # CD - rp = rn - print("Atoms internal: %s" % (ai + 1)) - print("--------------------------------------") - structure.coord_i = structure.coord_i[:ai] - structure._phi_indices = [list(structure.coord_i['i']).index(x) for x in structure.l_c] - structure._omega_indices = [list(structure.coord_i['i']).index(x) for x in structure.l_ca] - structure._psi_indices = [list(structure.coord_i['i']).index(x) for x in structure.l_n] - structure._chi_indices = [list(structure.coord_i['i']).index(x) for x in structure.l_cb if x >= 0] - - -def make_residue_lookup_table(structure): - l_residue = np.zeros((structure.n_residues, structure.max_atom_residue), dtype=np.int32) - 1 - n = 0 - res_dict = structure.residue_dict - for residue in list(res_dict.values()): - for atom in list(residue.values()): - atom_name = atom['atom_name'] - if atom_name in list(a2id.keys()): - l_residue[n, a2id[atom_name]] = atom['i'] - n += 1 - l_ca = l_residue[:, a2id['CA']] - l_cb = l_residue[:, a2id['CB']] - l_c = l_residue[:, a2id['C']] - l_n = l_residue[:, a2id['N']] - l_h = l_residue[:, a2id['H']] - return l_residue, l_ca, l_cb, l_c, l_n, l_h - - -def get_residue_sequence(structure): - try: - residue_dict = structure.residue_dict - return [residue_dict[key]['C']['res_name'] for key in list(residue_dict.keys())] - except KeyError: - return structure.io.sequence(structure) - - -class Structure(object): - - max_atom_residue = 16 - - def __init__(self, filename=None, make_coarse=True, verbose=False, auto_update=True): - """ - - Attributes - ---------- - max_atom_residue : int - Maximum atoms per residue. The maximum atoms per residue have to be limited, because of the - residue/atom lookup tables. By default maximum 16 atoms per residue are allowed. - - xyz : numpy-array - The xyz-attribute is an array of the cartesian coordinates represented by the attribute atom - - residue_names: list - residue names is a list of the residue-names. Here the residues are represented by the same - name as the initial PDB-file, usually 3-letter amino-acid code. The residue_names attribute - may look like: ['TYR', 'HIS', 'ARG'] - - n_atoms: int - The number of atoms - - b_factos: array - An array of the b-factors. - - radius_gyration: float - The attribute radius_gyration returns the radius of gyration of the structure. The radius of gyration - is given by: rG = (np.sqrt((coord - rM) ** 2).sum(axis=1)).mean() - Here rM are the mean coordinates of the structure. - - - Parameters - ---------- - :param filename: str - Path to the pdb file on disk - :param make_coarse: bool - Conversion to coarse representation using internal coordinates. Side-chains are - not considered. The Cbeta-atoms is moved to center of mass of the side-chain. - :param verbose: bool - print output to stdout - :param auto_update: bool - update cartesian-coordiantes automatically after change of internal coordinates. - This only applies for coarse-grained coordinates - - Examples - -------- - >>> import lib - >>> s_coarse = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=True) - ====================================== - Filename: /sample_data/structure/HM_1FN5_Naming.pdb - Path: /sample_data/structure - Number of atoms: 9316 - -------------------------------------- - Atoms internal: 3457 - -------------------------------------- - >>> print s_coarse - ATOM 2274 O ALA 386 52.927 10.468 -17.263 0.00 0.00 O - ATOM 2275 CB ALA 386 53.143 12.198 -14.414 0.00 0.00 C - >>> s_coarse.omega *= 0.0 - >>> s_coarse.omega += 3.14 - >>> print s_coarse - ATOM 2273 C ALA 386 47.799 59.970 21.123 0.00 0.00 C - ATOM 2274 O ALA 386 47.600 59.096 20.280 0.00 0.00 O - >>> s_coarse.write('test_out.pdb') - >>> s_aa = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=False) - >>> print s_aa - ATOM 9312 H MET 583 40.848 10.075 17.847 0.00 0.00 H - ATOM 9313 HA MET 583 40.666 8.204 15.667 0.00 0.00 H - ATOM 9314 HB3 MET 583 38.898 7.206 16.889 0.00 0.00 H - ATOM 9315 HB2 MET 583 38.796 8.525 17.846 0.00 0.00 H - >>> print s_aa.omega - array([], dtype=float64) - >>> s_aa.to_coarse() - >>> print s_aa - ATOM 3451 CA MET 583 40.059 8.800 16.208 0.00 0.00 C - ATOM 3452 C MET 583 38.993 9.376 15.256 0.00 0.00 C - ATOM 3453 O MET 583 38.405 10.421 15.616 0.00 0.00 O - ATOM 3454 CB MET 583 39.408 7.952 17.308 0.00 0.00 C - ATOM 3455 H MET 583 40.848 10.075 17.847 0.00 0.00 H - print s_aa.omega - array([ 0. , 3.09665806, -3.08322105, 3.13562203, 3.09102453,...]) - """ - - super(Structure, self).__init__() - self.is_coarse = make_coarse - self.verbose = verbose - self.auto_update = auto_update - self.io = lib.io.PDB - - if filename is not None: - self.filename = filename - - #################################################### - ###### PREPARE COORDINATES ###### - #################################################### - self.atoms = self.io.read(filename, verbose=self.verbose) - self.coord_i = np.zeros(self.atoms.shape[0], dtype={'names': internal_keys, - 'formats': internal_formats}) - - #################################################### - ###### LOOKUP TABLES ###### - #################################################### - self.l_res, self.l_ca, self.l_cb, self.l_c, self.l_n, self.l_h = make_residue_lookup_table(self) - self.residue_types = np.array([res2id[res] for res in list(self.atoms['res_name']) - if res in list(res2id.keys())], dtype=np.int32) - self.dist_ca = np.zeros((self.n_residues, self.n_residues), dtype=np.float64) - - self._phi_indices = [] - self._omega_indices = [] - self._psi_indices = [] - self._chi_indices = [] - - self.sequence = get_residue_sequence(self) - - if make_coarse: - self.to_coarse() - - def to_coarse(self): - """ - Converts the structure-instance into a coarse structure. - - Examples - -------- - - >>> s_aa = lib.Structure('/sample_data/structure/HM_1FN5_Naming.pdb', verbose=True, make_coarse=False) - >>> print s_aa - ATOM 9312 H MET 583 40.848 10.075 17.847 0.00 0.00 H - ATOM 9313 HA MET 583 40.666 8.204 15.667 0.00 0.00 H - ATOM 9314 HB3 MET 583 38.898 7.206 16.889 0.00 0.00 H - ATOM 9315 HB2 MET 583 38.796 8.525 17.846 0.00 0.00 H - >>> s_aa.to_coarse() - >>> print s_aa - ATOM 3451 CA MET 583 40.059 8.800 16.208 0.00 0.00 C - ATOM 3452 C MET 583 38.993 9.376 15.256 0.00 0.00 C - ATOM 3453 O MET 583 38.405 10.421 15.616 0.00 0.00 O - ATOM 3454 CB MET 583 39.408 7.952 17.308 0.00 0.00 C - ATOM 3455 H MET 583 40.848 10.075 17.847 0.00 0.00 H - print s_aa.omega - array([ 0. , 3.09665806, -3.08322105, 3.13562203, 3.09102453,...]) - """ - self.is_coarse = True - - #################################################### - ###### TAKE ONLY INTERNAL ATOMS ###### - #################################################### - all_atoms = np.copy(self.atoms) - tmp = [atom for atom in all_atoms if atom['atom_name'] in residue_atoms_internal[atom['res_name']]] - atoms = np.empty(len(tmp), dtype={'names': lib.io.PDB.keys, 'formats': lib.io.PDB.formats}) - atoms[:] = tmp - atoms['i'] = np.arange(atoms.shape[0]) - atoms['atom_id'] = np.arange(atoms.shape[0]) - self.atoms = atoms - - #################################################### - ###### LOOKUP TABLES ###### - #################################################### - self.l_res, self.l_ca, self.l_cb, self.l_c, self.l_n, self.l_h = make_residue_lookup_table(self) - tmp = [res2id[res] for res in list(self.atoms['res_name']) if res in list(res2id.keys())] - self.residue_types = np.array(tmp, dtype=np.int32) - self.dist_ca = np.zeros((self.n_residues, self.n_residues), dtype=np.float64) - - #################################################### - ###### REASSIGN COORDINATES ###### - #################################################### - move_center_of_mass(self, all_atoms) - - #################################################### - ###### INTERNAL COORDINATES ###### - #################################################### - self.coord_i = np.zeros(self.atoms.shape[0], dtype={'names': internal_keys, 'formats': internal_formats}) - calc_internal_coordinates(self) - self.update_coordinates() - self.sequence = get_residue_sequence(self) - - @property - def internal_coordinates(self): - return self.coord_i - - @property - def xyz(self): - return self.atoms['coord'] - - @xyz.setter - def xyz(self, v): - self.atoms['coord'] = v - - @property - def vdw(self): - return self.atoms['radius'] - - @vdw.setter - def vdw(self, v): - self.atoms['radius'] = v - - @property - def residue_names(self): - res_name = list(set(self.atoms['res_name'])) - res_name.sort() - return res_name - - @property - def residue_dict(self): - residue_dict = OrderedDict() - for res in list(set(self.atoms['res_id'])): - at_nbr = np.where(self.atoms['res_id'] == res) - residue_dict[res] = OrderedDict() - for atom in self.atoms[at_nbr]: - residue_dict[res][atom['atom_name']] = atom - return residue_dict - - @property # OK - def n_atoms(self): - return len(self.atoms) - - @property # OK - def n_residues(self): - return len(self.residue_ids) - - @property # OK - def atom_types(self): - return set(self.atoms['atom_name']) - - @property # OK - def residue_ids(self): - residue_ids = list(set(self.atoms['res_id'])) - return residue_ids - - @property # OK - def b_factors(self): - bfac = self.atoms[self.l_ca]['bfactor'] - return bfac - - @property - def radius_gyration(self): - coord = self.xyz - rM = coord[:, :].mean(axis=0) - rG = (np.sqrt((coord - rM) ** 2).sum(axis=1)).mean() - return float(rG) - - def update_coordinates(self): - if self.auto_update: - self.update() - - def update_dist(self): - #cStructure.atom_dist(self.dist_ca, self.l_res, self.atoms, a2id['CA']) - cStructure.atom_dist(self.dist_ca, self.l_res, self.xyz, a2id['CA']) - - def update(self, start_point=0): - cStructure.internal_to_cartesian(self.internal_coordinates, self.xyz, start_point) - self.update_dist() - - @property - def phi(self): - return self.internal_coordinates[self._phi_indices]['d'] - - @phi.setter - def phi(self, v): - self.internal_coordinates['d'][self._phi_indices] = v - self.update_coordinates() - - @property - def omega(self): - return self.internal_coordinates[self._omega_indices]['d'] - - @omega.setter - def omega(self, v): - self.internal_coordinates['d'][self._omega_indices] = v - self.update_coordinates() - - @property - def chi(self): - return self.internal_coordinates[self._chi_indices]['d'] - - @chi.setter - def chi(self, v): - self.internal_coordinates['d'][self._chi_indices] = v - self.update_coordinates() - - @property - def psi(self): - return self.internal_coordinates[self._psi_indices]['d'] - - @psi.setter - def psi(self, v): - self.internal_coordinates['d'][self._psi_indices] = v - self.update_coordinates() - - def write(self, filename=None, append=False): - if filename is None: - filename = self.filename - aw = np.copy(self.atoms) - aw['coord'] = self.xyz - self.io.write(filename, aw, append=append) - - def __str__(self): - if self.atoms is None: - return "" - else: - s = "" - for at in self.atoms: - s += "%-6s%5d %4s%1s%3s %1s%4d%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2s\n" % \ - ("ATOM ", - at['atom_id'], at['atom_name'], " ", at['res_name'], at['chain'], - at['res_id'], " ", - at['coord'][0], at['coord'][1], at['coord'][2], - 0.0, 0.0, " ", at['element']) - return s - - def __deepcopy__(self, memo): - new = copy(self) - new.atoms = np.copy(self.atoms) - new.dist_ca = np.copy(self.dist_ca) - new.filename = copy(self.filename) - new.coord_i = np.copy(self.internal_coordinates) - new.io = self.io - - new.l_ca = deepcopy(self.l_ca) - new.l_cb = deepcopy(self.l_cb) - new.l_c = deepcopy(self.l_c) - new.l_n = deepcopy(self.l_n) - new.l_h = deepcopy(self.l_h) - new.l_res = deepcopy(self.l_res) - - return new diff --git a/quest/lib/structure/__init__.py b/quest/lib/structure/__init__.py deleted file mode 100644 index 0f714a2..0000000 --- a/quest/lib/structure/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -__author__ = 'thomas' -from .Structure import * \ No newline at end of file diff --git a/quest/lib/tools/__init__.py b/quest/lib/tools/__init__.py deleted file mode 100644 index 0a512e5..0000000 --- a/quest/lib/tools/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .dye_diffusion import TransientDecayGenerator diff --git a/quest/lib/tools/dye_diffusion/__init__.py b/quest/lib/tools/dye_diffusion/__init__.py deleted file mode 100644 index 5976f5a..0000000 --- a/quest/lib/tools/dye_diffusion/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .dye_diffusion import TransientDecayGenerator \ No newline at end of file diff --git a/quest/lib/tools/dye_diffusion/dye_diffusion.py b/quest/lib/tools/dye_diffusion/dye_diffusion.py deleted file mode 100644 index 364036c..0000000 --- a/quest/lib/tools/dye_diffusion/dye_diffusion.py +++ /dev/null @@ -1,1853 +0,0 @@ -import time -import os -from collections import OrderedDict -import gc -import json -import tempfile -from pathlib import Path -import inspect - -import numpy as np -import numexpr as ne -from qtpy import QtGui, QtCore, QtWidgets, uic -import pyqtgraph as pg - -from . import photon - -import lib.io.PDB as PDB -from lib import Structure -import lib.fps as fps -from lib.plots.MolView import MolQtWidget -from lib.math import autocorr -from lib.widgets import PDBSelector -from lib.fps import AV, write_xyz -import os -from pathlib import Path - -# Optional Chimol viewer (fallback to PyMOL if unavailable or disabled). -# ChiSurf setting: gui.mol_viewer in settings_chisurf.yaml (pymol|chimol). -try: - import chisurf.settings as _cs_settings # type: ignore -except Exception: - _cs_settings = None - -_quest_viewer_pref = None -if _cs_settings is not None: - try: - _quest_viewer_pref = ( - str(_cs_settings.gui.get("mol_viewer", "pymol")) # type: ignore[attr-defined] - .lower() - .strip() - ) - except Exception: - _quest_viewer_pref = None -if not _quest_viewer_pref or _quest_viewer_pref not in ("pymol", "chimol"): - _quest_viewer_pref = "pymol" - -try: - if _quest_viewer_pref == "chimol": - from chisurf.plugins.chimol.chimol.renderer.view import MolView as _ChimolMolView - from chisurf.plugins.chimol.chimol.io import load_structure_payload as _chimol_load_structure_payload - - _HAS_CHIMOL = True - else: - _ChimolMolView = None - _chimol_load_structure_payload = None - _HAS_CHIMOL = False -except Exception: - _ChimolMolView = None - _chimol_load_structure_payload = None - _HAS_CHIMOL = False - - -class _ChimolCmdShim: - """Minimal shim to satisfy .pymol.cmd.do/orient calls.""" - - def __init__(self, adapter): - self._adapter = adapter - - def do(self, command: str): - cmd = (command or "").strip().lower() - if cmd == "orient": - try: - self._adapter.orient() - except Exception: - pass - # Other PyMOL commands are ignored in Chimol mode. - - # Compatibility for pymol.cmd.set(...) used nowhere else here. - def set(self, *_, **__): - return None - - def delete(self, *_, **__): - return None - - -class _ChimolAdapter(QtWidgets.QWidget): - """Lightweight adapter exposing the subset of PyMOL-like API we need.""" - - def __init__(self, parent=None): - super().__init__(parent) - self.viewer = _ChimolMolView(self) - self._cmd = _ChimolCmdShim(self) - self._objects: list[str] = [] - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - layout.addWidget(self.viewer) - - @property - def pymol(self): - return self - - @property - def cmd(self): - return self._cmd - - def reset(self): - for obj_id in list(getattr(self.viewer, "_objects", {}).keys()): - try: - self.viewer.remove_object(obj_id) - except Exception: - pass - self._objects.clear() - - def orient(self): - try: - self.viewer.reset_view() - except Exception: - pass - - def openFile(self, path, frame=None, mode=None, object_name=None, verbose=False): - try: - structure, coords = _chimol_load_structure_payload(Path(path)) - except Exception: - structure, coords = None, None - name = object_name or Path(path).stem - obj_id = None - try: - if structure is not None: - obj_id = self.viewer.add_structure(structure, name=name, source_path=str(path)) - elif coords is not None: - obj_id = self.viewer.add_coordinates(coords, name=name, source_path=str(path)) - except Exception: - obj_id = None - - if obj_id: - self._objects.append(obj_id) - return obj_id - - # PyMOL API compatibility - @property - def cmd(self): - return self.cmd - - - -def selection2atom_idx(pdb, res_types, verbose=False): - """ - Lookup atom-idx using residues: - a = {'TRP': 'CA'} - selection2atom_idx(pdb, a, all_atoms=False) - returns all CA atoms of TRP in the PDB - - selection2atom_idx(pdb, a, all_atoms=True) - returns all atoms of TRP in the PDB - - """ - if verbose: - print("selection2atom_idx") - atom_idx = OrderedDict() - for residue_key in res_types: - atoms = [] - for atom_name in res_types[residue_key]: - atoms.append(np.where((pdb['res_name'] == residue_key) & (pdb['atom_name'] == atom_name))[0]) - if len(atoms) > 0: - atom_idx[residue_key] = np.array(np.hstack(atoms), dtype=np.uint32) - else: - atom_idx[residue_key] = np.array([], dtype=np.uint32) - return atom_idx - - -def save_hist(filename, x, y, verbose=False): - """ - Saves data x, y to file in histogram-format (csv). x and y - should have the same lenght. - :param filename: string - Target filename - :param x: array - :param y: array - :param verbose: bool - """ - if verbose: - print("Writing histogram to file: %s" % filename) - fp = open(filename, 'w') - for p in zip(x, y): - fp.write('%.3f\t%i\n' % (p[0], p[1])) - fp.close() - - -def is_quenched(distance2, critical_distance, verbose=False): - """ - square of distance to quencher - """ - critical_distance2 = critical_distance**2 - collided = np.less(distance2, critical_distance2) - re = collided.sum(axis=0).T - if verbose: - print("Determine if frame is quenched") - nq = re.sum() - nt = re.shape[0] - print("Quenched frames: %s/%s, %.2f%%" % (nq, nt, float(nq) / nt * 100.0)) - return np.asarray(re, dtype=np.uint8) - - -def get_quencher_coordinates(pdb, quencher, verbose=True, all_atoms=True): - """ - returns coordinates and indices of all atoms of certain - residue type. - pdb: is a numpy-pdb array as returned by PDB.read - """ - if verbose: - print("Finding quenchers") - print(quencher) - atom_idx = selection2atom_idx(pdb, quencher) - coordinates = OrderedDict() - for res_key in quencher: - coordinates[res_key] = pdb['coord'][atom_idx[res_key]] - if verbose: - print("Quencher atom-indeces: \n %s" % atom_idx) - print("Quencher coordinates: \n %s" % coordinates) - return coordinates - - -class SimulateDiffusion(object): - - @property - def mean(self): - traj = self._traj - mean = traj.mean(axis=0) - return mean - - @property - def distance_to_mean(self): - mean = self.mean - dm = np.linalg.norm(self._traj - mean, axis=1) - return dm - - @property - def traj(self): - if self.quencher is None: - raise ValueError("Set quenching residues") - if self._traj is None: - raise ValueError("Run simulation first.") - if self._critical_distance is None: - raise ValueError("Set critical quenching distance") - return self._traj, self._is_quenched - - @property - def critical_distance(self): - return self._critical_distance - - @property - def quencher_distances(self): - if self._quencher_distances is None: - raise ValueError("Set quencher first.") - return self._quencher_distances - - @critical_distance.setter - def critical_distance(self, v): - self._critical_distance = v - self._is_quenched = is_quenched(self.quencher_distances, self._critical_distance, self.verbose) - - @property - def quenched(self): - if self._is_quenched is None: - raise ValueError("Run simulation first and set critical distance") - return self._is_quenched - - def save_trajectory(self, filename, skip): - write_xyz(filename, (self._traj)[::skip]) - - def __init__(self, av, quencher, output_file='out', verbose=False, - critical_distance=None, asa_calc=False, asa_n_sphere_point=590, asa_probe_radius=0.5, - trajectory_suffix='_traj.xyz', all_quencher_atoms=True): - """ - - :param av: - :param quencher: - :param output_file: - :param verbose: - :param critical_distance: - :param asa_calc: bool - By default False. If True the ASA of the residues is calculated - :param asa_n_sphere_point: int - By default 590. The number of sphere-points around each atoms used for the calculationg - of the ASA. - :param asa_probe_radius: - :param trajectory_suffix: - :param all_quencher_atoms: - pdb_file: pdb-file of the structure - """ - if verbose: - print("") - print("Simulate Diffusion") - print("-----------------") - self.av = av - self.all_quencher_atoms = all_quencher_atoms - - # ASA of residues - self.asa_calc = asa_calc - self.asa_n_sphere_point = asa_n_sphere_point - self.asa_probe_radius = asa_probe_radius - self.asa_n_sphere_point = asa_n_sphere_point - self.asa_sphere_points = fps.spherePoints(asa_n_sphere_point) if asa_calc else None - self._asa = None - - self.pdb = av.structure.atoms - self.verbose = verbose - av_fast, av_slow, x0, dg = av.density_fast, av.density_slow, av.x0, av.dg - self.dg = dg - self.x0 = x0 - self.output_file = output_file - self.av_fast = av_fast - self.av_slow = av_slow - self.t_step = None - self._traj = None - self._critical_distance = critical_distance - - self._quencher = None - self._quencher_coordinates = None - self._is_quenched = None - self._kQ = None - self.quencher = quencher - - self.trajectory_suffix = trajectory_suffix - - def get_quencher_distance2(self, quencher_coordinates, verbose=False): - """ - quencher_coordinates: a list or 2D array containing positions of the quenchers - `critical_distance`: flurophoreq gets quenched below the critical distance - """ - verbose = self.verbose or verbose - m, n = self._traj.shape[0], quencher_coordinates.shape[0] - dist = np.zeros((n, m), dtype=np.float16) - traj = self._traj - if verbose: - print("") - print("Calculating quencher distances") - print("Total quenching atoms: %s" % n) - for i, quencher_position in enumerate(quencher_coordinates): - dist[i] = ne.evaluate("sum((traj - quencher_position)**2, axis=1)") - return dist - - @property - def quencher(self): - return self._quencher - - @quencher.setter - def quencher(self, quencher): - if self.all_quencher_atoms: - q_new = OrderedDict() - pdb = self.pdb - for residue_key in quencher: - atoms_idx = np.where(pdb['res_name'] == residue_key)[0] - q_new[residue_key] = list(set(pdb[atoms_idx]['atom_name'])) - quencher = q_new - self._quencher = quencher - self._quencher_atom_indices = selection2atom_idx(self.pdb, quencher) - if self.verbose: - print("_quencher_atom_indices") - print(self._quencher_atom_indices) - - if self.verbose: - print("Calculating ASA of quenchers.") - print("radii:") - print(self.av.atoms['radius']) - print("coordinates:") - print(self.av.atoms['coord']) - print("Quencher atom-indices") - print(self._quencher_atom_indices) - - quencher_atom_index_array = np.hstack([v.flatten() for v in list(self._quencher_atom_indices.values())]) - asa_v = fps.asa(self.av.structure.atoms['coord'], self.av.structure.atoms['radius'], quencher_atom_index_array, - self.asa_sphere_points, self.asa_probe_radius) - - asa_it = (x for x in asa_v) - asa = OrderedDict() - for res_key in self._quencher_atom_indices: - asa[res_key] = [next(asa_it) for idx in self._quencher_atom_indices[res_key]] - self._asa = asa - if self.verbose: - print("Accessible surface area:") - print(self._asa) - self._quencher_coordinates = get_quencher_coordinates(self.pdb, quencher, verbose=self.verbose) - if self.verbose: - print("Quencher coordinates:") - print(self._quencher_coordinates) - - @property - def kQ(self): - return self._kQ - - @property - def quencher_atom_indices(self): - return self._quencher_atom_indices - - @property - def quencher_coordinates(self): - return np.vstack(list(self._quencher_coordinates.values())) - - @property - def quencher_asa(self): - if self._asa is None: - raise ValueError("Set quencher property quencher_atom_indices first.") - - @property - def quencher_atom_indices(self): - return self._quencher_atom_indeces - - @quencher_atom_indices.setter - def quencher_atom_indices(self, atom_indices): - if not isinstance(atom_indices, list): - raise ValueError("Quencher indeces have to be a list of integers") - atom_indices = np.array(self._quencher_atom_indices, dtype=np.uint32) - self._quencher_atom_indeces = atom_indices - - def run(self, D=40.0, slow_fact=0.01, t_step=0.002, t_max=10000, save_traj=False, save_j=50, verbose=True, **kwargs): - """ - - :param D: float - diffusion coefficient of dye in Ang**2/ns - :param slow_fact: float - The diffusion coefficient of the dye within the slow-accessible volume is slower by a factor of slow_fact. - :param t_step: float - The time-step of the simulation in nano-seconds - :param t_max: float - The maximum time of the simulation in nano-seconds - :param save_traj: bool - If True the trajectory is saved to self.output_file+'_traj.xyz'. Default value True - :param save_j: int - Only every save_j frame of the trajectory is saved. - :param verbose: - """ - verbose = verbose or self.verbose - self.t_step = t_step - dg = self.dg - density, slow_density = self.av_fast, self.av_slow - if verbose: - print("Simulate dye-trajectory") - print("Simulation time [us]: %.2f" % (t_max / 1000)) - print("Time-step [ps]: %.2f" % (t_step * 1000)) - print("Number of steps: %.2f" % int((t_max / t_step))) - print("AV-grid parameter [Ang]: %.2f" % dg) - print("Diff coeff. [Ang/ns2]: %.2f" % D) - print("Shape-AV slow (x,y,z): %s %s %s" % (slow_density.shape)) - print("Shape-AV fast (x,y,z): %s %s %s" % (density.shape)) - print("------") - start = time.process_time() - traj, a, n_accepted, n_rejected = fps.simulate_traj( - density, slow_density, dg, - slow_fact=slow_fact, t_step=t_step, t_max=t_max, D=D - ) - if n_accepted < 0: - self._traj = None - return - traj += self.x0 - self._traj = traj - - if verbose: - print("Accepted steps: %i" % n_accepted) - print("Rejected steps: %i" % n_rejected) - end = time.process_time() - if verbose: - print("time spent: %.2gs" % (end-start)) - print("n_accepted: %s" % n_accepted) - print("-----------------------") - print("Attachment point: %s" % self.x0) - print("Mean dye-position: %s" % self.mean) - - if save_traj: - self.save_trajectory(self.output_file+self.trajectory_suffix, save_j) - self._quencher_distances = self.get_quencher_distance2(self.quencher_coordinates, verbose) - if verbose: - print("Quencher distances:") - print("Quencher distances shape: %s, %s" % self._quencher_distances.shape) - print(self._quencher_distances) - - -class DonorDecay(object): - - def __init__(self, tau0=None, kQ=1.0, nph=0, verbose=False, auto_update=False, pdb=None, - attachment_residue=None, attachment_atom=None, attachment_chain=None, dg=0.5, sticky_mode='quencher', - save_avs=True, D=None, slow_fact=0.05, critical_distance=None, output_file='out', - av_parameter={'linker_length': 20.0, 'linker_width': 0.5, 'radius1': 5.0}, - quencher={'TRP': ['CB'], 'TYR': ['CB'], 'HIS': ['CB']}, t_max=10000.0, t_step=0.004, - slow_radius=10.0, all_quencher_atoms=True): - """ - quenching trajectory as calculated by SimulateDiffusion.quenched - :param tau0: float - :param kQ: float - :param nph: - :param verbose: bool - :param auto_update: - :param pdb: - :param attachment_residue: string - :param attachment_atom: int - :param attachment_chain: string - :param dg: float - :param sticky_mode: - :param save_avs: bool - :param D: float - :param slow_fact: float - :param critical_distance: float - :param output_file: string - :param av_parameter: - :param quencher: - :param t_max: float - :param t_step: float - :param slow_radius: float - :param all_quencher_atoms: - """ - self.verbose = verbose - self._av = None - self._diffusion = None - self.tau0 = tau0 - self.n_photons = nph - self.kQ = kQ - self.auto_update = auto_update - self._photon_trace = None - self._pdb = pdb - self.attachment_residue = attachment_residue - self.attachment_atom = attachment_atom - self.attachment_chain = attachment_chain - self.diffusion_coefficient = D - self.slow_fact = slow_fact - self.dg = dg - self.save_avs = save_avs - self.critical_distance = critical_distance - self.output_file = output_file - self.av_parameter = av_parameter - self.quencher = quencher - self.t_max = t_max - self.t_step = t_step - self.sticky_mode = sticky_mode - self.slow_radius = slow_radius - self.all_quencher_atoms = all_quencher_atoms - self._structure = None - self.fret_enabled = False - self.fret_R0 = None - self.acceptor_chain = None - self.acceptor_residue = None - self.acceptor_atom = None - self.fret_av_parameter = None - self._acceptor_av = None - self._photon_trace_fret = None - self._fret_efficiency = None - - def __str__(self): - s = '' - return s - - @property - def quantum_yield(self): - dt, n = self.photon_trace - n_ph = self.n_photons - n_f = n.sum() - return float(n_f) / n_ph - - @property - def diffusion(self): - if self._diffusion is None: - self.simulate_diffusion() - return self._diffusion - - @property - def slow_center(self): - if self.sticky_mode == 'quencher': - coordinates = get_quencher_coordinates(self.structure.atoms, self.quencher) - s = [np.vstack(coordinates[res_key]) for res_key in coordinates if len(coordinates[res_key]) > 0] - coordinates = np.vstack(s) - elif self.sticky_mode == 'surface': - slow_atoms = np.where(self.structure.atoms['atom_name'] == 'CB')[0] - coordinates = self.structure.atoms['coord'][slow_atoms] - return coordinates - - @property - def av(self): - if self._av is None: - self.calc_av() - self._av.calc_slow_av(save=self.save_avs, slow_centers=self.slow_center, - slow_radius=self.slow_radius, verbose=self.verbose) - return self._av - - @property - def photon_trace(self): - if self._photon_trace is None: - self.calc_photons() - return self._photon_trace - - @property - def collisions(self): - return float(self.diffusion.quenched.sum()) / self.diffusion.quenched.shape[0] - - @property - def structure(self): - return self._structure - - @structure.setter - def structure(self, v): - self._structure = Structure(v, make_coarse=False) - tf = tempfile.NamedTemporaryFile(suffix=".pdb") - self._tmp_file = tf.name - tf.close() - self._structure.write(self._tmp_file) - - def calc_av(self, verbose=False): - verbose = verbose or self.verbose - dg = self.dg - residue = self.attachment_residue - attachment_atom = self.attachment_atom - chain = self.attachment_chain - structure = self.structure - av = AV(structure, residue_seq_number=residue, atom_name=attachment_atom, chain_identifier=chain, - simulation_grid_resolution=dg, save_av=self.save_avs, verbose=verbose, - output_file=self.output_file, **self.av_parameter) - self._av = av - - def simulate_diffusion(self, verbose=False, plot_traj=False): - all_quencher_atoms = self.all_quencher_atoms - verbose = verbose or self.verbose - av = self.av - D = self.diffusion_coefficient - slow_fact = self.slow_fact - diffusion = SimulateDiffusion(av, quencher=self.quencher, verbose=verbose, all_quencher_atoms=all_quencher_atoms) - diffusion.run(D=D, slow_fact=slow_fact, t_max=self.t_max, t_step=self.t_step) - self._diffusion = diffusion - success = diffusion._traj is not None - return success - - def calc_photons(self, verbose=False, donor_traj=None, kQ=None): - """ - `n_ph`: number of generated photons - `pq`: quenching probability if distance of fluorphore is below the `critical_distance` - """ - verbose = verbose or self.verbose - n_photons = self.n_photons - if kQ is None: - kQ = self.kQ - tau0 = self.tau0 - if donor_traj is None: - donor_traj = self.diffusion - is_collided = donor_traj.quenched - if verbose: - print("") - print("Simulating decay:") - print("----------------") - print("Number of excitation photons: %s" % n_photons) - print("Number of frames : %s" % is_collided.shape[0]) - print("Number of collisions: %s" % is_collided.sum()) - print("Quenching constant kQ[1/ns]: %s" % kQ) - - t_step = donor_traj.t_step - #dts, phs = photon.simulate_photon_trace(n_ph=n_photons, collided=is_collided, - # quenching_prob=kQ, t_step=t_step, tau0=tau0) - dts, phs = photon.simulate_photon_trace_kQ(n_ph=n_photons, collided=is_collided, kQ=kQ, t_step=t_step, tau0=tau0) - - #kQ = donor_traj.kQ - #dts, phs = photon.simulate_photon_trace(n_ph=n_photons, kQ=kQ, t_step=t_step, tau0=tau0) - - n_photons = phs.shape[0] - n_f = phs.sum() - if verbose or self.verbose: - print("Number of absorbed photons: %s" % (n_photons)) - print("Number of fluorescent photons: %s" % (n_f)) - print("Quantum yield: %.2f" % (float(n_f) / n_photons)) - self._photon_trace = dts, phs - - def get_histogram(self, nbins=4096, range=(0, 50)): - dts, nph = self.photon_trace - y, x = np.histogram(dts, range=range, bins=nbins) - return x, y - - def save_histogram(self, filename='hist.txt', verbose=False, nbins=4096, range=(0, 50)): - verbose = verbose or self.verbose - x, y, = self.get_histogram(nbins, range) - save_hist(filename, x, y, verbose) - - def calc_acceptor_av(self, verbose=False): - verbose = verbose or self.verbose - if self._structure is None: - return None - residue = self.acceptor_residue - atom = self.acceptor_atom - chain = self.acceptor_chain - if residue is None or atom is None: - return None - params = self.fret_av_parameter if self.fret_av_parameter is not None else self.av_parameter - av = AV(self.structure, residue_seq_number=residue, atom_name=atom, chain_identifier=chain, - simulation_grid_resolution=self.dg, save_av=self.save_avs, verbose=verbose, - output_file=self.output_file + '_A', **params) - av.calc_slow_av(save=self.save_avs, slow_centers=self.slow_center, - slow_radius=self.slow_radius, verbose=verbose) - self._acceptor_av = av - return av - - def calc_fret_rate(self, verbose=False, n_samples=50000): - if not getattr(self, "fret_enabled", False): - return None - verbose = verbose or self.verbose - donor_av = self.av - acceptor_av = self._acceptor_av if self._acceptor_av is not None else self.calc_acceptor_av(verbose=verbose) - if acceptor_av is None: - return None - R0 = self.fret_R0 if self.fret_R0 is not None else 52.0 - try: - r_eff = float(fps.RDAMeanE(donor_av, acceptor_av, R0, n_samples)) - except Exception: - return None - if r_eff <= 0: - return None - k_fret = (1.0 / self.tau0) * (R0 / r_eff) ** 6 - self._fret_efficiency = 1.0 / (1.0 + (r_eff / R0) ** 6) - return k_fret - - def calc_photons_fret(self, verbose=False): - verbose = verbose or self.verbose - if not getattr(self, "fret_enabled", False): - self._photon_trace_fret = None - return - k_fret = self.calc_fret_rate(verbose=verbose) - if k_fret is None: - self._photon_trace_fret = None - return - donor_traj = self.diffusion - collided = donor_traj.quenched - t_step = donor_traj.t_step - n_photons = self.n_photons - k_total = np.where(collided > 0, self.kQ + k_fret, k_fret).astype(np.float32) - dts, phs = photon.simulate_photon_trace_rate(n_ph=n_photons, kQ=k_total, t_step=t_step, tau0=self.tau0) - self._photon_trace_fret = dts, phs - - @property - def photon_trace_fret(self): - if self._photon_trace_fret is None: - self.calc_photons_fret() - return self._photon_trace_fret - - @property - def quantum_yield_fret(self): - if self._photon_trace_fret is None: - self.calc_photons_fret() - if self._photon_trace_fret is None: - return 0.0 - dt, n = self._photon_trace_fret - n_ph = self.n_photons - n_f = n.sum() - return float(n_f) / n_ph - - @property - def fret_efficiency(self): - if self._fret_efficiency is not None: - return self._fret_efficiency - qy_d = self.quantum_yield - qy_da = self.quantum_yield_fret - if qy_d <= 0: - return 0.0 - return 1.0 - qy_da / qy_d - - def get_histogram_fret(self, nbins=4096, range=(0, 50)): - if self._photon_trace_fret is None: - self.calc_photons_fret() - if self._photon_trace_fret is None: - return None, None - dts, nph = self._photon_trace_fret - y, x = np.histogram(dts, range=range, bins=nbins) - return x, y - - def update_all(self, verbose=False): - verbose = verbose or self.verbose - gc.collect() - if verbose: - print("Updating simulation") - print("Calculating normal-AV") - self.calc_av(verbose=verbose) - if verbose: - print("Calculating slow-AV") - self._av.calc_slow_av(save=self.save_avs, slow_radius=self.slow_radius, slow_centers=self.slow_center) - if verbose: - print("Simulating diffusion") - success = self.simulate_diffusion(verbose=verbose) - print("success:", success) - if success: - if verbose: - print("Determining quencher distances.") - self.diffusion.critical_distance = self.critical_distance - if verbose: - print("Simulating decay") - self.calc_photons(verbose=verbose) - return True - else: - print("Trajectory calculation failed.") - return False - - -class TransientDecayGenerator(QtWidgets.QWidget, DonorDecay): - - name = "Lifetime-Calculator" - - def __init__( - self, - verbose=False, - settings_file=None - ): - super(TransientDecayGenerator, self).__init__() - uic.loadUi( - os.path.join( - os.path.dirname( - __file__ - ), - 'dye_diffusion2.ui' - ), - self - ) - if settings_file is None: - settings_file = os.path.join( - os.path.dirname( - __file__ - ), - 'dye_diffusion.json' - ) - - # Donor and acceptor label controls side-by-side - self.donor_groupbox = QtWidgets.QGroupBox("Donor", self.groupBox) - self.donor_groupbox.setSizePolicy( - QtWidgets.QSizePolicy.Expanding, - QtWidgets.QSizePolicy.Preferred - ) - donor_layout = QtWidgets.QGridLayout(self.donor_groupbox) - - # Donor attachment selector (chain / residue / atom) - self.pdb_selector = PDBSelector() - donor_layout.addWidget(self.pdb_selector, 0, 0, 1, 2) - - # Move donor AV parameter widgets (Length/Width/Radius/dg) into the Donor box. - # These widgets are created by dye_diffusion2.ui and originally live in - # the right-hand column of the Label group; reparenting them here keeps - # behavior identical but with a cleaner layout. - try: - donor_layout.addWidget(self.label_4, 1, 0) - donor_layout.addWidget(self.doubleSpinBox, 1, 1) - - donor_layout.addWidget(self.label_5, 2, 0) - donor_layout.addWidget(self.doubleSpinBox_2, 2, 1) - - donor_layout.addWidget(self.label_6, 3, 0) - donor_layout.addWidget(self.doubleSpinBox_3, 3, 1) - - donor_layout.addWidget(self.label_23, 4, 0) - donor_layout.addWidget(self.doubleSpinBox_17, 4, 1) - - # Donor photophysics: tau0 and diffusion coefficient D - donor_layout.addWidget(self.label_12, 5, 0) - donor_layout.addWidget(self.doubleSpinBox_8, 5, 1) - - donor_layout.addWidget(self.label_7, 6, 0) - donor_layout.addWidget(self.doubleSpinBox_4, 6, 1) - except AttributeError: - # If any of these widgets are missing, leave the original layout. - pass - - # FRET acceptor: checkable group box with its own PDB selector and AV params - self.fret_groupbox = QtWidgets.QGroupBox("FRET acceptor", self.groupBox) - self.fret_groupbox.setSizePolicy( - QtWidgets.QSizePolicy.Expanding, - QtWidgets.QSizePolicy.Preferred - ) - self.fret_groupbox.setCheckable(True) - self.fret_groupbox.setChecked(False) - - fret_layout = QtWidgets.QGridLayout(self.fret_groupbox) - - # Acceptor attachment selector (chain / residue / atom) - self.acceptor_selector = PDBSelector(show_labels=False) - fret_layout.addWidget(self.acceptor_selector, 0, 0, 1, 2) - - # Acceptor AV parameters: length / width / radius, mirroring donor UI - label_len = QtWidgets.QLabel("Length", self.fret_groupbox) - self.fret_len_spin = QtWidgets.QDoubleSpinBox(self.fret_groupbox) - self.fret_len_spin.setMinimum(1.0) - self.fret_len_spin.setMaximum(100.0) - self.fret_len_spin.setSingleStep(0.5) - self.fret_len_spin.setValue(float(self.doubleSpinBox.value())) - fret_layout.addWidget(label_len, 1, 0) - fret_layout.addWidget(self.fret_len_spin, 1, 1) - - label_wid = QtWidgets.QLabel("Width", self.fret_groupbox) - self.fret_wid_spin = QtWidgets.QDoubleSpinBox(self.fret_groupbox) - self.fret_wid_spin.setMinimum(0.1) - self.fret_wid_spin.setMaximum(10.0) - self.fret_wid_spin.setSingleStep(0.1) - self.fret_wid_spin.setValue(float(self.doubleSpinBox_2.value())) - fret_layout.addWidget(label_wid, 2, 0) - fret_layout.addWidget(self.fret_wid_spin, 2, 1) - - label_rad = QtWidgets.QLabel("Radius", self.fret_groupbox) - self.fret_rad_spin = QtWidgets.QDoubleSpinBox(self.fret_groupbox) - self.fret_rad_spin.setMinimum(0.1) - self.fret_rad_spin.setMaximum(50.0) - self.fret_rad_spin.setSingleStep(0.25) - self.fret_rad_spin.setValue(float(self.doubleSpinBox_3.value())) - fret_layout.addWidget(label_rad, 3, 0) - fret_layout.addWidget(self.fret_rad_spin, 3, 1) - - # Acceptor dg: share the same grid parameter as the donor (doubleSpinBox_17) - label_dg = QtWidgets.QLabel("dg", self.fret_groupbox) - self.fret_dg_spin = QtWidgets.QDoubleSpinBox(self.fret_groupbox) - self.fret_dg_spin.setMinimum(self.doubleSpinBox_17.minimum()) - self.fret_dg_spin.setMaximum(self.doubleSpinBox_17.maximum()) - self.fret_dg_spin.setSingleStep(self.doubleSpinBox_17.singleStep()) - self.fret_dg_spin.setValue(float(self.doubleSpinBox_17.value())) - fret_layout.addWidget(label_dg, 4, 0) - fret_layout.addWidget(self.fret_dg_spin, 4, 1) - try: - self.fret_dg_spin.valueChanged.connect(self.onFretDgChanged) - except Exception: - pass - - # Acceptor diffusion coefficient D_A (independent of donor D) - label_D = QtWidgets.QLabel("D [A2/ns]", self.fret_groupbox) - self.fret_D_spin = QtWidgets.QDoubleSpinBox(self.fret_groupbox) - try: - self.fret_D_spin.setDecimals(self.doubleSpinBox_4.decimals()) - self.fret_D_spin.setMinimum(self.doubleSpinBox_4.minimum()) - self.fret_D_spin.setMaximum(self.doubleSpinBox_4.maximum()) - self.fret_D_spin.setSingleStep(self.doubleSpinBox_4.singleStep()) - self.fret_D_spin.setValue(float(self.doubleSpinBox_4.value())) - except AttributeError: - pass - fret_layout.addWidget(label_D, 5, 0) - fret_layout.addWidget(self.fret_D_spin, 5, 1) - - # Place donor and acceptor group boxes next to each other - donor_acceptor_layout = QtWidgets.QHBoxLayout() - donor_acceptor_layout.addWidget(self.donor_groupbox) - donor_acceptor_layout.addWidget(self.fret_groupbox) - donor_acceptor_layout.setStretch(0, 1) - donor_acceptor_layout.setStretch(1, 1) - self.verticalLayout_10.addLayout(donor_acceptor_layout) - try: - self.gridLayout.setColumnStretch(0, 1) - self.gridLayout.setColumnStretch(1, 0) - self.gridLayout.setColumnStretch(2, 0) - self.gridLayout.setColumnStretch(3, 0) - except AttributeError: - pass - - # The original "Dye" group box only contained tau0 and donor D, which - # are now moved into the Donor group box; hide the empty container. - try: - self.groupBox_3.hide() - except AttributeError: - pass - - # Backwards-compatible alias: existing code checks self.fret_checkbox.isChecked() - self.fret_checkbox = self.fret_groupbox - try: - self.fret_groupbox.toggled.connect(self.onFretToggled) - except AttributeError: - pass - self._settings_file = None - self.settings_file = settings_file - fp = open(settings_file) - settings = json.load(fp) - fp.close() - - DonorDecay.__init__(self, **settings) - ## User-interface - self.actionLoad_PDB.triggered.connect(self.onLoadPDB) - self.actionLoad_settings.triggered.connect(self.onLoadSettings) - - self.doubleSpinBox_6.valueChanged.connect(self.onSimulationTimeChanged) - self.doubleSpinBox_7.valueChanged.connect(self.onSimulationDtChanged) - self.pushButton_3.clicked.connect(self.update_all) - self.pushButton_4.clicked.connect(self.onSaveHist) - self.pushButton_5.clicked.connect(self.onSaveAV) - - self.tmp_dir = tempfile.gettempdir() - print("Temporary Directory: %s" % self.tmp_dir) - - ## Decay-Curve - decay_plot = pg.PlotWidget(title="Decay") - decay_plot.setLabel('bottom', 'time [ns]') - decay_plot.setLabel('left', 'counts') - decay_plot.setLogMode(False, True) - # Histogram (measured decay) in red, donor-only in cyan, FRET in magenta - self.hist_curve = decay_plot.plot([], [], pen=pg.mkPen(color='r', width=1)) - self.unquenched_curve = decay_plot.plot([], [], pen=pg.mkPen(color='c', width=1)) - self.fret_curve = decay_plot.plot([], [], pen=pg.mkPen(color='m', width=1)) - self.plot_decay = decay_plot - self.verticalLayout_2.addWidget(decay_plot) - - ## Diffusion-Trajectory-Curve - traj_plot = pg.PlotWidget(title="Trajectory") - traj_plot.setLabel('bottom', 'time [ns]') - traj_plot.setLabel('left', '|R-|') - self.diffusion_curve = traj_plot.plot([], [], pen=pg.mkPen(color='b', width=1)) - self.plot_diffusion = traj_plot - self.verticalLayout_6.addWidget(traj_plot) - - auto_plot = pg.PlotWidget(title="Auto-correlation") - auto_plot.setLabel('bottom', 'corr. time [ns]') - auto_plot.setLabel('left', 'A.Corr.(|R-|)') - auto_plot.setLogMode(True, False) - self.diffusion_autocorrelation = auto_plot.plot([], [], pen=pg.mkPen(color='r', width=1)) - self.plot_autocorr = auto_plot - self.verticalLayout_6.addWidget(auto_plot) - - ## Protein Structure - self.viewer_backend = (_quest_viewer_pref if _HAS_CHIMOL else "pymol") - self.molview = self._build_molview_widget() - self.verticalLayout_4.addWidget(self.molview) - self._chimol_object_id = None - - self.diff_file = None - self.av_slow_file = None - self.av_fast_file = None - self.acceptor_av_slow_file = None - self.acceptor_av_fast_file = None - - try: - self.label_fret = QtWidgets.QLabel("E(FRET)", self.groupBox_7) - self.doubleSpinBox_fret = QtWidgets.QDoubleSpinBox(self.groupBox_7) - self.doubleSpinBox_fret.setReadOnly(True) - self.doubleSpinBox_fret.setMaximum(1.0) - self.gridLayout_7.addWidget(self.label_fret, 3, 0) - self.gridLayout_7.addWidget(self.doubleSpinBox_fret, 3, 1) - except AttributeError: - pass - - try: - self.actionSave_project.triggered.connect(self.onSaveProject) - self.actionLoad_project.triggered.connect(self.onLoadProject) - except AttributeError: - pass - - def _build_molview_widget(self): - """Construct 3D viewer based on ChiSurf setting (pymol|chimol).""" - if self.viewer_backend == "chimol" and _HAS_CHIMOL: - return _ChimolAdapter(self) - return MolQtWidget(self, enableUi=False) - - def onSaveHist(self, verbose=False): - verbose = self.verbose or verbose - filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File', '.') - self.save_histogram(filename=filename, verbose=verbose) - - def molview_highlight_quencher(self): - quencher = self.quencher - pymol = self.molview.pymol - for res_name in quencher: - pymol.cmd.do("hide lines, resn %s" % res_name) - pymol.cmd.do("show sticks, resn %s" % res_name) - pymol.cmd.do("color red, resn %s" % res_name) - - def onLoadSettings(self): - print("onLoadSettings") - print("Setting File: %s" % self.settings_file) - - @property - def settings_file(self): - return self._settings_file - - @settings_file.setter - def settings_file(self, v): - self.lineEdit_2.setText(v) - - @property - def load_3d_av(self): - return bool(self.checkBox_3.isChecked()) - - def update_3D(self, load_av=False): - load_av = load_av or self.load_3d_av - self.molview.reset() - if self.pdb_filename is not None: - self.molview.openFile(self._tmp_file, frame=1, mode='cartoon', object_name='p') - self.molview.pymol.cmd.do("hide all") - self.molview.pymol.cmd.do("show spheres, p") - self.molview.pymol.cmd.do("color gray, p") - - # Remove previously drawn AV objects to prevent stale visuals - try: - self.molview.pymol.cmd.delete("av") - self.molview.pymol.cmd.delete("sticky_av") - self.molview.pymol.cmd.delete("acceptor_av") - self.molview.pymol.cmd.delete("acceptor_av_slow") - except Exception: - pass - - if self.diff_file is not None: - self.molview.openFile(self.diff_file, frame=1, object_name='trajectory') - self.molview.pymol.cmd.do("color green, trajectory") - self.molview.pymol.cmd.do("set sphere_scale, 0.2, trajectory") - if load_av: - if self.av_slow_file is not None: - self.molview.openFile(self.av_slow_file, frame=1, object_name='sticky_av') - self.molview.pymol.cmd.do("color cyan, sticky_av") - self.molview.pymol.cmd.do("show spheres, sticky_av") - - if self.av_fast_file is not None: - self.molview.openFile(self.av_fast_file, frame=1, object_name='av') - self.molview.pymol.cmd.do("color cyan, av") - self.molview.pymol.cmd.do("show spheres, av") - - if self.acceptor_av_slow_file is not None: - self.molview.openFile(self.acceptor_av_slow_file, frame=1, object_name='acceptor_av_slow') - self.molview.pymol.cmd.do("color magenta, acceptor_av_slow") - self.molview.pymol.cmd.do("show spheres, acceptor_av_slow") - - if self.acceptor_av_fast_file is not None: - self.molview.openFile(self.acceptor_av_fast_file, frame=1, object_name='acceptor_av') - self.molview.pymol.cmd.do("color magenta, acceptor_av") - self.molview.pymol.cmd.do("show spheres, acceptor_av") - self.molview.pymol.cmd.orient() - - self.molview_highlight_quencher() - - def update_trajectory_curve(self): - y = self.diffusion.distance_to_mean - x = np.linspace(0, self.t_max, y.shape[0]) - self.diffusion_curve.setData(x, y) - auto_corr = autocorr(y) - self.diffusion_autocorrelation.setData(x, auto_corr) - self.plot_autocorr.enableAutoRange(True, True) - self.plot_autocorr.autoRange() - self.plot_diffusion.enableAutoRange(True, True) - self.plot_diffusion.autoRange() - - def update_decay_histogram(self): - x, y = self.get_histogram(nbins=self.nBins) - y[y < 0.001] = 0.001 - self.hist_curve.setData(x[1:], y + 1.0) - yu = np.exp(-x/self.tau0) * y[1] - self.unquenched_curve.setData(x, yu + 1.0) - if getattr(self, "fret_checkbox", None) is not None and self.fret_checkbox.isChecked(): - xf, yf = self.get_histogram_fret(nbins=self.nBins) - if xf is not None: - yf[yf < 0.001] = 0.001 - self.fret_curve.setData(xf[1:], yf + 1.0) - else: - self.fret_curve.setData([], []) - self.plot_decay.enableAutoRange(True, True) - self.plot_decay.autoRange() - - def update_all(self, verbose=False): - success = DonorDecay.update_all(self) - if success: - self.doubleSpinBox_16.setValue(self.quantum_yield) - self.doubleSpinBox_15.setValue(self.collisions * 100.0) - if getattr(self, "fret_checkbox", None) is not None and self.fret_checkbox.isChecked(): - self.fret_enabled = True - self.acceptor_chain = getattr(self.acceptor_selector, "chain_id", None) - self.acceptor_residue = getattr(self.acceptor_selector, "residue_id", None) - self.acceptor_atom = getattr(self.acceptor_selector, "atom_name", None) - # Sync acceptor AV parameters from the FRET group box controls - try: - self.fret_av_parameter = { - 'linker_length': float(self.fret_len_spin.value()), - 'linker_width': float(self.fret_wid_spin.value()), - 'radius1': float(self.fret_rad_spin.value()), - } - except AttributeError: - self.fret_av_parameter = None - self.calc_acceptor_av(verbose=verbose) - self.acceptor_av_slow_file, self.acceptor_av_fast_file = self.save_av( - 'acceptor', - self._acceptor_av, - directory=self.tmp_dir, - verbose=verbose, - ) - self.calc_photons_fret(verbose=verbose) - try: - if hasattr(self, "doubleSpinBox_fret") and self.fret_efficiency is not None: - self.doubleSpinBox_fret.setValue(self.fret_efficiency) - except AttributeError: - pass - else: - self.fret_enabled = False - self._photon_trace_fret = None - self.acceptor_av_slow_file = None - self.acceptor_av_fast_file = None - diff_file, av_slow_file, av_fast_file = self.onSaveAV(directory=self.tmp_dir) - self.diff_file = diff_file - self.av_slow_file = av_slow_file - self.av_fast_file = av_fast_file - self.update_3D() - self.update_decay_histogram() - self.update_trajectory_curve() - # After a successful simulation, show the Decay tab (index 1) - try: - self.tabWidget.setCurrentIndex(1) - except Exception: - pass - else: - # Display a message box in case of failure - msg_box = QtWidgets.QMessageBox() - msg_box.setIcon(QtWidgets.QMessageBox.Warning) - msg_box.setWindowTitle("Trajectory Calculation Failed") - msg_box.setText("The trajectory calculation failed. Possible reason: Inaccessible labeling location.") - msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok) - msg_box.exec_() - - def save_av(self, dye_name, av_obj, verbose=False, directory=None): - if av_obj is None: - return None, None - verbose = self.verbose or verbose - if directory is None: - directory = self.tmp_dir if hasattr(self, "tmp_dir") and self.tmp_dir else tempfile.gettempdir() - safe_name = (dye_name or "").strip().lower() - suffix = f"_{safe_name}" if safe_name else "" - base = os.path.join(directory, f"{self.filename_prefix}{suffix}") - slow_file = base + '_av_slow.xyz' - fast_file = base + '_av_fast.xyz' - if verbose: - print(f"Saving {dye_name or 'AV'} files to {directory}") - print(" slow AV ->", slow_file) - print(" fast AV ->", fast_file) - write_xyz(slow_file, av_obj.points_slow) - write_xyz(fast_file, av_obj.points_fast) - return slow_file, fast_file - - def onSaveAV(self, verbose=False, directory=None): - verbose = self.verbose or verbose - if verbose: - print("\nWriting AVs to directory") - print("-------------------------") - if directory is None: - directory = str(QtWidgets.QFileDialog.getExistingDirectory(self, 'Choose directory', '.')) - if verbose: - print("Directory: %s" % directory) - print("Filename-Prefix: %s" % str(self.filename_prefix)) - diff_file = os.path.join(directory, self.filename_prefix+self.diffusion.trajectory_suffix) - if verbose: - print("Saving trajectory...") - print("Trajectory filename: %s" % diff_file) - print("Skipping every %i frame." % self.skip_frame) - self.diffusion.save_trajectory(diff_file, self.skip_frame) - - donor_slow, donor_fast = self.save_av('donor', self.av, verbose=verbose, directory=directory) - return diff_file, donor_slow, donor_fast - - def to_project_dict(self): - project = OrderedDict() - - # Input data - project['pdb'] = self.pdb_filename or None - project['attachment'] = { - 'chain': self.attachment_chain, - 'residue': self.attachment_residue, - 'atom': self.attachment_atom, - } - - # Accessible volume / dye parameters - project['av_parameter'] = self.av_parameter - project['dg'] = self.dg - project['slow_radius'] = self.slow_radius - - # Simulation settings - project['t_max'] = self.t_max - project['t_step'] = self.t_step - project['n_photons'] = self.n_photons - project['n_bins'] = self.nBins - project['skip_frame'] = self.skip_frame - - # Photophysics / quenching - project['tau0'] = self.tau0 - project['kQ'] = self.kQ - project['slow_fact'] = self.slow_fact - project['critical_distance'] = self.critical_distance - project['quencher'] = self.quencher - - # Output / bookkeeping - project['output_file'] = self.filename_prefix - project['save_avs'] = self.save_avs - project['all_quencher_atoms'] = self.all_quencher_atoms - project['sticky_mode'] = self.sticky_mode - - fret = OrderedDict() - fret['enabled'] = bool(getattr(self, "fret_checkbox", None) is not None and self.fret_checkbox.isChecked()) - - dyes = [] - - donor = OrderedDict() - donor_attachment = OrderedDict() - donor_attachment['chain'] = self.attachment_chain - donor_attachment['residue'] = self.attachment_residue - donor_attachment['atom'] = self.attachment_atom - donor['name'] = 'D0' - donor['role'] = 'donor' - donor['attachment'] = donor_attachment - donor['av_parameter'] = self.av_parameter - # Store donor diffusion coefficient explicitly with the donor dye - donor['D'] = float(self.diffusion_coefficient) - dyes.append(donor) - - acceptor = OrderedDict() - acceptor_attachment = OrderedDict() - if hasattr(self, "acceptor_selector"): - acceptor_attachment['chain'] = self.acceptor_selector.chain_id - acceptor_attachment['residue'] = self.acceptor_selector.residue_id - acceptor_attachment['atom'] = self.acceptor_selector.atom_name - else: - acceptor_attachment['chain'] = None - acceptor_attachment['residue'] = None - acceptor_attachment['atom'] = None - acceptor['name'] = 'A0' - acceptor['role'] = 'acceptor' - acceptor['attachment'] = acceptor_attachment - - # Ensure FRET AV parameters reflect the current UI when FRET is enabled - if getattr(self, "fret_checkbox", None) is not None and self.fret_checkbox.isChecked(): - try: - self.fret_av_parameter = { - 'linker_length': float(self.fret_len_spin.value()), - 'linker_width': float(self.fret_wid_spin.value()), - 'radius1': float(self.fret_rad_spin.value()), - } - except AttributeError: - self.fret_av_parameter = None - else: - self.fret_av_parameter = None - - acceptor['av_parameter'] = self.fret_av_parameter if self.fret_av_parameter is not None else self.av_parameter - - # Store acceptor diffusion coefficient; default to donor D if no - # separate value is provided. - acc_D = None - try: - if hasattr(self, "fret_D_spin"): - acc_D = float(self.fret_D_spin.value()) - except Exception: - acc_D = None - if acc_D is None: - acc_D = float(self.diffusion_coefficient) - acceptor['D'] = acc_D - dyes.append(acceptor) - - fret['dyes'] = dyes - - if self.fret_R0 is not None: - R0_matrix = [ - [None, self.fret_R0], - [self.fret_R0, None] - ] - else: - R0_matrix = [ - [None, None], - [None, None] - ] - fret['R0_matrix'] = R0_matrix - - project['fret'] = fret - - return project - - def load_project_dict(self, settings): - if settings is None: - return - - # Input data - pdb_path = settings.get('pdb') - if pdb_path: - self.pdb_filename = pdb_path - try: - self.structure = pdb_path - self.pdb_selector.atoms = self.structure.atoms - if hasattr(self, "acceptor_selector"): - try: - self.acceptor_selector.atoms = self.structure.atoms - except Exception: - pass - self.tmp_dir = tempfile.gettempdir() - self.update_3D() - except Exception as e: - print("Failed to load PDB from project:", e) - - attachment = settings.get('attachment', {}) - try: - self.attachment_chain = attachment.get('chain', self.attachment_chain) - self.attachment_residue = attachment.get('residue', self.attachment_residue) - self.attachment_atom = attachment.get('atom', self.attachment_atom) - except Exception as e: - print("Failed to restore attachment from project:", e) - - # Accessible volume / dye parameters - if 'av_parameter' in settings: - try: - self.av_parameter = settings['av_parameter'] - except Exception as e: - print("Failed to restore av_parameter from project:", e) - - self.dg = settings.get('dg', self.dg) - self.slow_radius = settings.get('slow_radius', self.slow_radius) - - # Simulation settings - self.t_max = settings.get('t_max', self.t_max) - self.t_step = settings.get('t_step', self.t_step) - self.n_photons = settings.get('n_photons', self.n_photons) - try: - if 'n_bins' in settings: - self.spinBox_2.setValue(int(settings['n_bins'])) - except AttributeError: - pass - try: - if 'skip_frame' in settings: - self.spinBox_3.setValue(int(settings['skip_frame'])) - except AttributeError: - pass - - # Photophysics / quenching - self.tau0 = settings.get('tau0', self.tau0) - - # Donor diffusion coefficient: prefer per-dye value in fret.dyes[0]['D'] - donor_D = None - fret_settings_for_D = settings.get('fret') - if isinstance(fret_settings_for_D, dict): - dyes_for_D = fret_settings_for_D.get('dyes') - if isinstance(dyes_for_D, (list, tuple)) and len(dyes_for_D) > 0: - donor_D = dyes_for_D[0].get('D', None) - if donor_D is None: - # Legacy projects may still store a top-level 'D' - donor_D = settings.get('D', self.diffusion_coefficient) - self.diffusion_coefficient = donor_D - - self.kQ = settings.get('kQ', self.kQ) - self.slow_fact = settings.get('slow_fact', self.slow_fact) - self.critical_distance = settings.get('critical_distance', self.critical_distance) - if 'quencher' in settings: - self.quencher = settings['quencher'] - - # Output / bookkeeping - if 'output_file' in settings: - try: - self.lineEdit_5.setText(str(settings['output_file'])) - except AttributeError: - pass - self.save_avs = settings.get('save_avs', self.save_avs) - self.all_quencher_atoms = settings.get('all_quencher_atoms', self.all_quencher_atoms) - self.sticky_mode = settings.get('sticky_mode', self.sticky_mode) - - fret_settings = settings.get('fret') - if fret_settings: - try: - if getattr(self, "fret_checkbox", None) is not None: - self.fret_checkbox.setChecked(bool(fret_settings.get('enabled', self.fret_checkbox.isChecked()))) - except AttributeError: - pass - - dyes = fret_settings.get('dyes') - R0_matrix = fret_settings.get('R0_matrix') - - if isinstance(dyes, (list, tuple)) and len(dyes) >= 2: - acceptor = dyes[1] - acc_att = acceptor.get('attachment', {}) - try: - if hasattr(self, "acceptor_selector"): - if 'chain' in acc_att: - self.acceptor_selector.chain_id = acc_att.get('chain') - if 'residue' in acc_att: - self.acceptor_selector.residue_id = acc_att.get('residue') - if 'atom' in acc_att: - self.acceptor_selector.atom_name = acc_att.get('atom') - except Exception: - pass - av_param_acc = acceptor.get('av_parameter') - if av_param_acc is not None: - self.fret_av_parameter = av_param_acc - try: - self.fret_len_spin.setValue(float(av_param_acc.get('linker_length', self.doubleSpinBox.value()))) - self.fret_wid_spin.setValue(float(av_param_acc.get('linker_width', self.doubleSpinBox_2.value()))) - self.fret_rad_spin.setValue(float(av_param_acc.get('radius1', self.doubleSpinBox_3.value()))) - except AttributeError: - pass - - # Restore acceptor diffusion coefficient if present - try: - acc_D = acceptor.get('D', None) - if acc_D is not None and hasattr(self, "fret_D_spin"): - self.fret_D_spin.setValue(float(acc_D)) - except Exception: - pass - - if isinstance(R0_matrix, (list, tuple)) and len(R0_matrix) > 0: - row0 = R0_matrix[0] - if isinstance(row0, (list, tuple)) and len(row0) > 1: - self.fret_R0 = row0[1] - - def onSaveProject(self): - filename, _ = QtWidgets.QFileDialog.getSaveFileName( - self, - 'Save project', - '.', - 'QuEst project (*.quest.json);;JSON (*.json);;All files (*)' - ) - if not filename: - return - project = self.to_project_dict() - try: - with open(filename, 'w') as fp: - json.dump(project, fp, indent=2, sort_keys=True) - print("Saved project to", filename) - except IOError as e: - msg_box = QtWidgets.QMessageBox(self) - msg_box.setIcon(QtWidgets.QMessageBox.Warning) - msg_box.setWindowTitle("Save project failed") - msg_box.setText("Could not write project file:\n%s" % e) - msg_box.exec_() - - def onLoadProject(self): - filename, _ = QtWidgets.QFileDialog.getOpenFileName( - self, - 'Load project', - '.', - 'QuEst project (*.quest.json);;JSON (*.json);;All files (*)' - ) - if not filename: - return - try: - with open(filename) as fp: - settings = json.load(fp, object_pairs_hook=OrderedDict) - except (IOError, ValueError) as e: - msg_box = QtWidgets.QMessageBox(self) - msg_box.setIcon(QtWidgets.QMessageBox.Warning) - msg_box.setWindowTitle("Load project failed") - msg_box.setText("Could not read project file:\n%s" % e) - msg_box.exec_() - return - - self.load_project_dict(settings) - # Optionally, update all outputs based on loaded settings - # but do not run a full simulation automatically to keep CLI parity - - @property - def all_quencher_atoms(self): - return not bool(self.groupBox_5.isChecked()) - - @all_quencher_atoms.setter - def all_quencher_atoms(self, v): - try: - self.groupBox_5.setChecked(not v) - except AttributeError: - pass - - @property - def filename_prefix(self): - return str(self.lineEdit_5.text()) - - @property - def skip_frame(self): - return int(self.spinBox_3.value()) - - @property - def n_frames(self): - return int(self.spinBox.value()) - - def onSimulationDtChanged(self): - time_steps = self.t_max / self.t_step - self.spinBox.setValue(int(time_steps)) - - def onSimulationTimeChanged(self): - time_steps = self.t_max / self.t_step - self.spinBox.setValue(int(time_steps)) - - def onLoadPDB(self): - self.pdb_filename = str(QtWidgets.QFileDialog.getOpenFileName(None, 'Open PDB-File', '', 'PDB-files (*.pdb)')[0]) - self.structure = self.pdb_filename - self.pdb_selector.atoms = self.structure.atoms - # Keep acceptor selector in sync with the donor when available - if hasattr(self, "acceptor_selector"): - try: - self.acceptor_selector.atoms = self.structure.atoms - except Exception: - pass - self.tmp_dir = tempfile.gettempdir() - self.update_3D() - # When a new PDB is opened, switch to the 3D view tab (index 2) - try: - self.tabWidget.setCurrentIndex(2) - except Exception: - pass - - def onFretToggled(self, checked): - """Handle enabling/disabling of the FRET acceptor controls. - - When enabled, ensure the acceptor selector is populated with the - current structure atoms so that chain/residue/atom choices match - the donor selector. - """ - - if not hasattr(self, "acceptor_selector"): - return - - # Enable/disable the selector and AV parameter widgets - for w in ( - getattr(self, "acceptor_selector", None), - getattr(self, "fret_len_spin", None), - getattr(self, "fret_wid_spin", None), - getattr(self, "fret_rad_spin", None), - getattr(self, "fret_dg_spin", None), - getattr(self, "fret_D_spin", None), - ): - if w is not None: - try: - w.setEnabled(checked) - except Exception: - pass - - # When enabling, ensure the selector is populated once a structure - # is available so that the user can pick residues/atoms immediately. - if checked and getattr(self, "structure", None) is not None: - try: - if getattr(self.acceptor_selector, "atoms", None) is None: - self.acceptor_selector.atoms = self.structure.atoms - except Exception: - pass - - def onFretDgChanged(self, value): - """Keep donor and acceptor dg parameters in sync.""" - - try: - self.doubleSpinBox_17.setValue(float(value)) - except Exception: - pass - - @property - def dg(self): - return float(self.doubleSpinBox_17.value()) - - @dg.setter - def dg(self, v): - try: - v_f = float(v) - self.doubleSpinBox_17.setValue(v_f) - if hasattr(self, "fret_dg_spin"): - self.fret_dg_spin.setValue(v_f) - except AttributeError: - pass - - @property - def slow_radius(self): - return float(self.doubleSpinBox_10.value()) - - @slow_radius.setter - def slow_radius(self, v): - try: - self.doubleSpinBox_10.setValue(v) - except AttributeError: - pass - - @property - def nBins(self): - return int(self.spinBox_2.value()) - - @property - def n_photons(self): - return int(self.doubleSpinBox_11.value() * 1e6) - - @n_photons.setter - def n_photons(self, v): - try: - self.doubleSpinBox_11.setValue(v / 1e6) - except AttributeError: - pass - - @property - def quencher(self): - """ - dict of atom names, dict keys are residue types - """ - p = OrderedDict() - for qn in str(self.lineEdit_3.text()).split(): - p[qn] = ['CB'] - return p - - @quencher.setter - def quencher(self, v): - s = "" - for resID in list(v.keys()): - s += " "+resID - try: - self.lineEdit_3.setText(s) - except AttributeError: - pass - - @property - def sticky_mode(self): - if self.radioButton.isChecked(): - return 'surface' - elif self.radioButton_2.isChecked(): - return 'quencher' - - @sticky_mode.setter - def sticky_mode(self, v): - try: - print("set sticky: ") - if v == 'surface': - print("surface") - self.radioButton.setChecked(True) - self.radioButton_2.setChecked(False) - elif v == 'quencher': - print("quencher") - self.radioButton.setChecked(False) - self.radioButton_2.setChecked(True) - except AttributeError: - pass - - @property - def av_parameter(self): - p = OrderedDict() - p['linker_length'] = float(self.doubleSpinBox.value()) - p['linker_width'] = float(self.doubleSpinBox_2.value()) - p['radius1'] = float(self.doubleSpinBox_3.value()) - return p - - @av_parameter.setter - def av_parameter(self, d): - try: - self.doubleSpinBox.setValue(d['linker_length']) - self.doubleSpinBox_2.setValue(d['linker_width']) - self.doubleSpinBox_3.setValue(d['radius1']) - except AttributeError: - pass - - @property - def critical_distance(self): - return float(self.doubleSpinBox_12.value()) - - @critical_distance.setter - def critical_distance(self, v): - try: - self.doubleSpinBox_12.setValue(float(v)) - except AttributeError: - pass - - @property - def slow_fact(self): - return float(self.doubleSpinBox_5.value()) - - @slow_fact.setter - def slow_fact(self, v): - try: - self.doubleSpinBox_5.setValue(float(v)) - except AttributeError: - pass - - @property - def t_max(self): - """ - simulation time in nano-seconds - """ - return float(self.doubleSpinBox_6.value()) * 1000.0 - - @t_max.setter - def t_max(self, v): - try: - self.onSimulationTimeChanged() - self.doubleSpinBox_6.setValue(float(v / 1000.0)) - except AttributeError: - pass - - @property - def t_step(self): - """ - time-step in nano-seconds - """ - return float(self.doubleSpinBox_7.value()) / 1000.0 - - @t_step.setter - def t_step(self, v): - try: - self.onSimulationTimeChanged() - self.doubleSpinBox_7.setValue(float(v * 1000.0)) - except AttributeError: - pass - - @property - def diffusion_coefficient(self): - return float(self.doubleSpinBox_4.value()) - - @diffusion_coefficient.setter - def diffusion_coefficient(self, v): - try: - self.doubleSpinBox_4.setValue(v) - except AttributeError: - pass - - @property - def kQ(self): - return float(self.doubleSpinBox_9.value()) - - @kQ.setter - def kQ(self, v): - try: - self.doubleSpinBox_9.setValue(float(v)) - except AttributeError: - pass - - @property - def tau0(self): - return float(self.doubleSpinBox_8.value()) - - @tau0.setter - def tau0(self, v): - try: - self.doubleSpinBox_8.setValue(float(v)) - except AttributeError: - pass - - @property - def attachment_chain(self): - return self.pdb_selector.chain_id - - @attachment_chain.setter - def attachment_chain(self, v): - try: - self.pdb_selector.chain_id = v - except AttributeError: - pass - - @property - def attachment_residue(self): - return self.pdb_selector.residue_id - - @attachment_residue.setter - def attachment_residue(self, v): - try: - self.pdb_selector.residue_id = v - except AttributeError: - pass - - @property - def attachment_atom(self): - return self.pdb_selector.atom_name - - @attachment_atom.setter - def attachment_atom(self, v): - try: - self.pdb_selector.atom_name = v - except AttributeError: - pass - - @property - def pdb_filename(self): - return str(self.lineEdit.text()) - - @pdb_filename.setter - def pdb_filename(self, value): - try: - self.lineEdit.setText(value) - except AttributeError: - pass - - diff --git a/tests/148l.pdb b/tests/148l.pdb new file mode 100644 index 0000000..0ae28e8 --- /dev/null +++ b/tests/148l.pdb @@ -0,0 +1,2017 @@ +HEADER HYDROLASE/HYDROLASE SUBSTRATE 27-OCT-93 148L +TITLE A COVALENT ENZYME-SUBSTRATE INTERMEDIATE WITH SACCHARIDE DISTORTION IN +TITLE 2 A MUTANT T4 LYSOZYME +COMPND MOL_ID: 1; +COMPND 2 MOLECULE: T4 LYSOZYME; +COMPND 3 CHAIN: E; +COMPND 4 EC: 3.2.1.17; +COMPND 5 ENGINEERED: YES; +COMPND 6 MOL_ID: 2; +COMPND 7 MOLECULE: SUBSTRATE CLEAVED FROM CELL WALL OF ESCHERICHIA COLI; +COMPND 8 CHAIN: S +SOURCE MOL_ID: 1; +SOURCE 2 ORGANISM_SCIENTIFIC: ENTEROBACTERIA PHAGE T4; +SOURCE 3 ORGANISM_TAXID: 10665; +SOURCE 4 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; +SOURCE 5 EXPRESSION_SYSTEM_PLASMID: M13; +SOURCE 6 MOL_ID: 2; +SOURCE 7 ORGANISM_SCIENTIFIC: ESCHERICHIA COLI; +SOURCE 8 ORGANISM_TAXID: 562; +SOURCE 9 TISSUE: CELL WALL +KEYWDS O-GLYCOSYL, HYDROLASE-HYDROLASE SUBSTRATE COMPLEX +EXPDTA X-RAY DIFFRACTION +AUTHOR R.KUROKI,L.H.WEAVER,B.W.MATTHEWS +REVDAT 7 15-NOV-23 148L 1 HETSYN LINK ATOM +REVDAT 6 29-JUL-20 148L 1 COMPND REMARK SEQADV HETNAM +REVDAT 6 2 1 LINK SITE ATOM +REVDAT 5 29-NOV-17 148L 1 HELIX +REVDAT 4 27-JUL-11 148L 1 HETNAM HETSYN REMARK +REVDAT 3 13-JUL-11 148L 1 VERSN +REVDAT 2 24-FEB-09 148L 1 VERSN +REVDAT 1 30-APR-94 148L 0 +JRNL AUTH R.KUROKI,L.H.WEAVER,B.W.MATTHEWS +JRNL TITL A COVALENT ENZYME-SUBSTRATE INTERMEDIATE WITH SACCHARIDE +JRNL TITL 2 DISTORTION IN A MUTANT T4 LYSOZYME. +JRNL REF SCIENCE V. 262 2030 1993 +JRNL REFN ISSN 0036-8075 +JRNL PMID 8266098 +REMARK 1 +REMARK 1 REFERENCE 1 +REMARK 1 AUTH L.H.WEAVER,B.W.MATTHEWS +REMARK 1 TITL STRUCTURE OF BACTERIOPHAGE T4 LYSOZYME REFINED AT 1.7 +REMARK 1 TITL 2 ANGSTROMS RESOLUTION +REMARK 1 REF J.MOL.BIOL. V. 193 189 1987 +REMARK 1 REFN ISSN 0022-2836 +REMARK 2 +REMARK 2 RESOLUTION. 1.90 ANGSTROMS. +REMARK 3 +REMARK 3 REFINEMENT. +REMARK 3 PROGRAM : TNT +REMARK 3 AUTHORS : TRONRUD,TEN EYCK,MATTHEWS +REMARK 3 +REMARK 3 DATA USED IN REFINEMENT. +REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.90 +REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 20.00 +REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000 +REMARK 3 COMPLETENESS FOR RANGE (%) : NULL +REMARK 3 NUMBER OF REFLECTIONS : 11889 +REMARK 3 +REMARK 3 USING DATA ABOVE SIGMA CUTOFF. +REMARK 3 CROSS-VALIDATION METHOD : NULL +REMARK 3 FREE R VALUE TEST SET SELECTION : NULL +REMARK 3 R VALUE (WORKING + TEST SET) : 0.168 +REMARK 3 R VALUE (WORKING SET) : NULL +REMARK 3 FREE R VALUE : NULL +REMARK 3 FREE R VALUE TEST SET SIZE (%) : NULL +REMARK 3 FREE R VALUE TEST SET COUNT : NULL +REMARK 3 +REMARK 3 USING ALL DATA, NO SIGMA CUTOFF. +REMARK 3 R VALUE (WORKING + TEST SET, NO CUTOFF) : NULL +REMARK 3 R VALUE (WORKING SET, NO CUTOFF) : NULL +REMARK 3 FREE R VALUE (NO CUTOFF) : NULL +REMARK 3 FREE R VALUE TEST SET SIZE (%, NO CUTOFF) : NULL +REMARK 3 FREE R VALUE TEST SET COUNT (NO CUTOFF) : NULL +REMARK 3 TOTAL NUMBER OF REFLECTIONS (NO CUTOFF) : NULL +REMARK 3 +REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. +REMARK 3 PROTEIN ATOMS : 1327 +REMARK 3 NUCLEIC ACID ATOMS : 0 +REMARK 3 HETEROGEN ATOMS : 36 +REMARK 3 SOLVENT ATOMS : 140 +REMARK 3 +REMARK 3 WILSON B VALUE (FROM FCALC, A**2) : NULL +REMARK 3 +REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. RMS WEIGHT COUNT +REMARK 3 BOND LENGTHS (A) : 0.014 ; NULL ; NULL +REMARK 3 BOND ANGLES (DEGREES) : 2.700 ; NULL ; NULL +REMARK 3 TORSION ANGLES (DEGREES) : NULL ; NULL ; NULL +REMARK 3 PSEUDOROTATION ANGLES (DEGREES) : NULL ; NULL ; NULL +REMARK 3 TRIGONAL CARBON PLANES (A) : NULL ; NULL ; NULL +REMARK 3 GENERAL PLANES (A) : NULL ; NULL ; NULL +REMARK 3 ISOTROPIC THERMAL FACTORS (A**2) : NULL ; NULL ; NULL +REMARK 3 NON-BONDED CONTACTS (A) : NULL ; NULL ; NULL +REMARK 3 +REMARK 3 INCORRECT CHIRAL-CENTERS (COUNT) : NULL +REMARK 3 +REMARK 3 BULK SOLVENT MODELING. +REMARK 3 METHOD USED : NULL +REMARK 3 KSOL : NULL +REMARK 3 BSOL : NULL +REMARK 3 +REMARK 3 RESTRAINT LIBRARIES. +REMARK 3 STEREOCHEMISTRY : NULL +REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS : NULL +REMARK 3 +REMARK 3 OTHER REFINEMENT REMARKS: +REMARK 3 RESIDUES 162 - 164 IN WILD-TYPE AND ALL MUTANT LYSOZYMES +REMARK 3 ARE EXTREMELY MOBILE. THUS THE COORDINATES FOR THESE +REMARK 3 RESIDUES ARE VERY UNRELIABLE. THIS ENTRY DOES NOT INCLUDE +REMARK 3 RESIDUES 163 AND 164. +REMARK 3 +REMARK 3 MUTANT SPACE GROUP, P 21 21 2, IS NONISOMORPHOUS TO WILD +REMARK 3 TYPE. STARTING COORDINATES WERE BASED ON THE WILD-TYPE +REMARK 3 MODEL. +REMARK 4 +REMARK 4 148L COMPLIES WITH FORMAT V. 3.30, 13-JUL-11 +REMARK 100 +REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY BNL. +REMARK 100 THE DEPOSITION ID IS D_1000170110. +REMARK 200 +REMARK 200 EXPERIMENTAL DETAILS +REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION +REMARK 200 DATE OF DATA COLLECTION : NULL +REMARK 200 TEMPERATURE (KELVIN) : NULL +REMARK 200 PH : NULL +REMARK 200 NUMBER OF CRYSTALS USED : NULL +REMARK 200 +REMARK 200 SYNCHROTRON (Y/N) : NULL +REMARK 200 RADIATION SOURCE : NULL +REMARK 200 BEAMLINE : NULL +REMARK 200 X-RAY GENERATOR MODEL : NULL +REMARK 200 MONOCHROMATIC OR LAUE (M/L) : NULL +REMARK 200 WAVELENGTH OR RANGE (A) : NULL +REMARK 200 MONOCHROMATOR : NULL +REMARK 200 OPTICS : NULL +REMARK 200 +REMARK 200 DETECTOR TYPE : NULL +REMARK 200 DETECTOR MANUFACTURER : NULL +REMARK 200 INTENSITY-INTEGRATION SOFTWARE : NULL +REMARK 200 DATA SCALING SOFTWARE : NULL +REMARK 200 +REMARK 200 NUMBER OF UNIQUE REFLECTIONS : NULL +REMARK 200 RESOLUTION RANGE HIGH (A) : NULL +REMARK 200 RESOLUTION RANGE LOW (A) : NULL +REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL +REMARK 200 +REMARK 200 OVERALL. +REMARK 200 COMPLETENESS FOR RANGE (%) : NULL +REMARK 200 DATA REDUNDANCY : NULL +REMARK 200 R MERGE (I) : NULL +REMARK 200 R SYM (I) : NULL +REMARK 200 FOR THE DATA SET : NULL +REMARK 200 +REMARK 200 IN THE HIGHEST RESOLUTION SHELL. +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : NULL +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : NULL +REMARK 200 COMPLETENESS FOR SHELL (%) : NULL +REMARK 200 DATA REDUNDANCY IN SHELL : NULL +REMARK 200 R MERGE FOR SHELL (I) : NULL +REMARK 200 R SYM FOR SHELL (I) : NULL +REMARK 200 FOR SHELL : NULL +REMARK 200 +REMARK 200 DIFFRACTION PROTOCOL: NULL +REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: NULL +REMARK 200 SOFTWARE USED: NULL +REMARK 200 STARTING MODEL: NULL +REMARK 200 +REMARK 200 REMARK: NULL +REMARK 280 +REMARK 280 CRYSTAL +REMARK 280 SOLVENT CONTENT, VS (%): 43.25 +REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 2.17 +REMARK 280 +REMARK 280 CRYSTALLIZATION CONDITIONS: NULL +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY +REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 21 21 2 +REMARK 290 +REMARK 290 SYMOP SYMMETRY +REMARK 290 NNNMMM OPERATOR +REMARK 290 1555 X,Y,Z +REMARK 290 2555 -X,-Y,Z +REMARK 290 3555 -X+1/2,Y+1/2,-Z +REMARK 290 4555 X+1/2,-Y+1/2,-Z +REMARK 290 +REMARK 290 WHERE NNN -> OPERATOR NUMBER +REMARK 290 MMM -> TRANSLATION VECTOR +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS +REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM +REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY +REMARK 290 RELATED MOLECULES. +REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 0.00000 +REMARK 290 SMTRY1 3 -1.000000 0.000000 0.000000 25.45000 +REMARK 290 SMTRY2 3 0.000000 1.000000 0.000000 33.65000 +REMARK 290 SMTRY3 3 0.000000 0.000000 -1.000000 0.00000 +REMARK 290 SMTRY1 4 1.000000 0.000000 0.000000 25.45000 +REMARK 290 SMTRY2 4 0.000000 -1.000000 0.000000 33.65000 +REMARK 290 SMTRY3 4 0.000000 0.000000 -1.000000 0.00000 +REMARK 290 +REMARK 290 REMARK: NULL +REMARK 300 +REMARK 300 BIOMOLECULE: 1 +REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM +REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN +REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON +REMARK 300 BURIED SURFACE AREA. +REMARK 350 +REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN +REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE +REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS +REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND +REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. +REMARK 350 +REMARK 350 BIOMOLECULE: 1 +REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: DIMERIC +REMARK 350 APPLY THE FOLLOWING TO CHAINS: E, S, A +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 465 +REMARK 465 MISSING RESIDUES +REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE +REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.) +REMARK 465 +REMARK 465 M RES C SSSEQI +REMARK 465 LEU E 164 +REMARK 470 +REMARK 470 MISSING ATOM +REMARK 470 THE FOLLOWING RESIDUES HAVE MISSING ATOMS (M=MODEL NUMBER; +REMARK 470 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE NUMBER; +REMARK 470 I=INSERTION CODE): +REMARK 470 M RES CSSEQI ATOMS +REMARK 470 ASN E 163 CA C O CB CG OD1 ND2 +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: CLOSE CONTACTS IN SAME ASYMMETRIC UNIT +REMARK 500 +REMARK 500 THE FOLLOWING ATOMS ARE IN CLOSE CONTACT. +REMARK 500 +REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI DISTANCE +REMARK 500 OE2 GLU E 26 O5 MUB A 1 2.17 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: CLOSE CONTACTS +REMARK 500 +REMARK 500 THE FOLLOWING ATOMS THAT ARE RELATED BY CRYSTALLOGRAPHIC +REMARK 500 SYMMETRY ARE IN CLOSE CONTACT. AN ATOM LOCATED WITHIN 0.15 +REMARK 500 ANGSTROMS OF A SYMMETRY RELATED ATOM IS ASSUMED TO BE ON A +REMARK 500 SPECIAL POSITION AND IS, THEREFORE, LISTED IN REMARK 375 +REMARK 500 INSTEAD OF REMARK 500. ATOMS WITH NON-BLANK ALTERNATE +REMARK 500 LOCATION INDICATORS ARE NOT INCLUDED IN THE CALCULATIONS. +REMARK 500 +REMARK 500 DISTANCE CUTOFF: +REMARK 500 2.2 ANGSTROMS FOR CONTACTS NOT INVOLVING HYDROGEN ATOMS +REMARK 500 1.6 ANGSTROMS FOR CONTACTS INVOLVING HYDROGEN ATOMS +REMARK 500 +REMARK 500 ATM1 RES C SSEQI ATM2 RES C SSEQI SSYMOP DISTANCE +REMARK 500 S2 BME E 174 S2 BME E 174 2565 2.04 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: COVALENT BOND LENGTHS +REMARK 500 +REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES +REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE +REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT: (10X,I3,1X,2(A3,1X,A1,I4,A1,1X,A4,3X),1X,F6.3) +REMARK 500 +REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 +REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 +REMARK 500 +REMARK 500 M RES CSSEQI ATM1 RES CSSEQI ATM2 DEVIATION +REMARK 500 GLU E 11 CD GLU E 11 OE1 0.068 +REMARK 500 GLU E 62 CD GLU E 62 OE2 0.074 +REMARK 500 GLU E 64 CD GLU E 64 OE1 0.069 +REMARK 500 GLU E 108 CD GLU E 108 OE2 0.069 +REMARK 500 GLU E 128 CD GLU E 128 OE2 0.075 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: COVALENT BOND ANGLES +REMARK 500 +REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES +REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE +REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1) +REMARK 500 +REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 +REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 +REMARK 500 +REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3 +REMARK 500 ARG E 14 NE - CZ - NH2 ANGL. DEV. = -3.8 DEGREES +REMARK 500 ASP E 47 CB - CG - OD1 ANGL. DEV. = 6.3 DEGREES +REMARK 500 ASP E 47 CB - CG - OD2 ANGL. DEV. = -7.7 DEGREES +REMARK 500 ASP E 61 CB - CG - OD2 ANGL. DEV. = -6.2 DEGREES +REMARK 500 ASP E 72 CB - CG - OD1 ANGL. DEV. = 6.9 DEGREES +REMARK 500 ARG E 76 CD - NE - CZ ANGL. DEV. = 10.8 DEGREES +REMARK 500 ARG E 76 NE - CZ - NH1 ANGL. DEV. = 7.4 DEGREES +REMARK 500 ARG E 76 NE - CZ - NH2 ANGL. DEV. = -5.6 DEGREES +REMARK 500 ARG E 80 NE - CZ - NH1 ANGL. DEV. = -3.5 DEGREES +REMARK 500 ARG E 80 NE - CZ - NH2 ANGL. DEV. = 4.6 DEGREES +REMARK 500 ASP E 92 CB - CG - OD1 ANGL. DEV. = -6.2 DEGREES +REMARK 500 ASP E 92 CB - CG - OD2 ANGL. DEV. = 7.3 DEGREES +REMARK 500 ARG E 119 NE - CZ - NH1 ANGL. DEV. = 3.4 DEGREES +REMARK 500 ARG E 125 NE - CZ - NH1 ANGL. DEV. = 4.8 DEGREES +REMARK 500 ASP E 127 CB - CG - OD2 ANGL. DEV. = -6.6 DEGREES +REMARK 500 ARG E 137 NE - CZ - NH2 ANGL. DEV. = 3.7 DEGREES +REMARK 500 ARG E 145 CG - CD - NE ANGL. DEV. = 13.4 DEGREES +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: TORSION ANGLES +REMARK 500 +REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS: +REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER; +REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2) +REMARK 500 +REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI- +REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400 +REMARK 500 +REMARK 500 M RES CSSEQI PSI PHI +REMARK 500 ILE E 29 79.13 -105.16 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 700 +REMARK 700 SHEET +REMARK 700 THERE ARE SEVERAL SUBTLE ASPECTS OF THE SECONDARY STRUCTURE +REMARK 700 OF THIS MOLECULE WHICH CANNOT CONVENIENTLY BE REPRESENTED +REMARK 700 IN THE HELIX AND SHEET RECORDS BELOW. THESE ASPECTS +REMARK 700 INFLUENCE THE REPRESENTATION OF HELIX 6 AND STRAND 3 OF +REMARK 700 SHEET *S1*. THE PAPER J.MOL.BIOL., V. 118, P. 81, 1978 +REMARK 700 BE CONSULTED FOR THESE SUBTLETIES. +DBREF 148L E 1 164 UNP P00720 LYCV_BPT4 1 164 +DBREF 148L S 166 170 PDB 148L 148L 166 170 +SEQADV 148L GLU E 26 UNP P00720 THR 26 CONFLICT +SEQADV 148L THR E 54 UNP P00720 CYS 54 CONFLICT +SEQADV 148L ALA E 97 UNP P00720 CYS 97 CONFLICT +SEQRES 1 E 164 MET ASN ILE PHE GLU MET LEU ARG ILE ASP GLU GLY LEU +SEQRES 2 E 164 ARG LEU LYS ILE TYR LYS ASP THR GLU GLY TYR TYR GLU +SEQRES 3 E 164 ILE GLY ILE GLY HIS LEU LEU THR LYS SER PRO SER LEU +SEQRES 4 E 164 ASN ALA ALA LYS SER GLU LEU ASP LYS ALA ILE GLY ARG +SEQRES 5 E 164 ASN THR ASN GLY VAL ILE THR LYS ASP GLU ALA GLU LYS +SEQRES 6 E 164 LEU PHE ASN GLN ASP VAL ASP ALA ALA VAL ARG GLY ILE +SEQRES 7 E 164 LEU ARG ASN ALA LYS LEU LYS PRO VAL TYR ASP SER LEU +SEQRES 8 E 164 ASP ALA VAL ARG ARG ALA ALA LEU ILE ASN MET VAL PHE +SEQRES 9 E 164 GLN MET GLY GLU THR GLY VAL ALA GLY PHE THR ASN SER +SEQRES 10 E 164 LEU ARG MET LEU GLN GLN LYS ARG TRP ASP GLU ALA ALA +SEQRES 11 E 164 VAL ASN LEU ALA LYS SER ARG TRP TYR ASN GLN THR PRO +SEQRES 12 E 164 ASN ARG ALA LYS ARG VAL ILE THR THR PHE ARG THR GLY +SEQRES 13 E 164 THR TRP ASP ALA TYR LYS ASN LEU +SEQRES 1 S 4 ALA FGA API DAL +MODRES 148L API S 169 LYS 2,6-DIAMINOPIMELIC ACID +HET FGA S 167 9 +HET API S 169 12 +HET DAL S 170 6 +HET MUB A 1 18 +HET NAG A 2 14 +HET BME E 174 4 +HETNAM FGA GAMMA-D-GLUTAMIC ACID +HETNAM API 2,6-DIAMINOPIMELIC ACID +HETNAM DAL D-ALANINE +HETNAM MUB N-ACETYL-ALPHA-MURAMIC ACID +HETNAM NAG 2-ACETAMIDO-2-DEOXY-BETA-D-GLUCOPYRANOSE +HETNAM BME BETA-MERCAPTOETHANOL +HETSYN FGA D-GLUTAMIC ACID +HETSYN MUB N-ACETYL-MURAMIC ACID; N-ACETYLMURAMIC ACID +HETSYN NAG N-ACETYL-BETA-D-GLUCOSAMINE; 2-ACETAMIDO-2-DEOXY-BETA- +HETSYN 2 NAG D-GLUCOSE; 2-ACETAMIDO-2-DEOXY-D-GLUCOSE; 2-ACETAMIDO- +HETSYN 3 NAG 2-DEOXY-GLUCOSE; N-ACETYL-D-GLUCOSAMINE +FORMUL 2 FGA C5 H9 N O4 +FORMUL 2 API C7 H14 N2 O4 +FORMUL 2 DAL C3 H7 N O2 +FORMUL 3 MUB C11 H19 N O8 +FORMUL 3 NAG C8 H15 N O6 +FORMUL 4 BME C2 H6 O S +FORMUL 5 HOH *140(H2 O) +HELIX 1 H1 ILE E 3 GLU E 11 1 9 +HELIX 2 H2 LEU E 39 ILE E 50 1 12 +HELIX 3 H3 LYS E 60 ARG E 80 1 21 +HELIX 4 H4 ALA E 82 SER E 90 1 9 +HELIX 5 H5 ALA E 93 MET E 106 1 14 +HELIX 6 H6 GLU E 108 GLY E 113 1 6 +HELIX 7 H7 THR E 115 GLN E 123 1 9 +HELIX 8 H8 TRP E 126 ALA E 134 1 9 +HELIX 9 H9 ARG E 137 GLN E 141 1 5 +HELIX 10 H10 PRO E 143 THR E 155 1 13 +SHEET 1 A 3 ARG E 14 LYS E 19 0 +SHEET 2 A 3 TYR E 25 GLY E 28 -1 N GLU E 26 O TYR E 18 +SHEET 3 A 3 HIS E 31 THR E 34 -1 N HIS E 31 O ILE E 27 +LINK OE2 GLU E 26 C1 MUB A 1 1555 1555 1.51 +LINK C ALA S 166 N FGA S 167 1555 1555 1.34 +LINK N ALA S 166 C10 MUB A 1 1555 1555 1.35 +LINK CD FGA S 167 N API S 169 1555 1555 1.30 +LINK C API S 169 N DAL S 170 1555 1555 1.31 +LINK O4 MUB A 1 C1 NAG A 2 1555 1555 1.39 +CRYST1 50.900 67.300 49.600 90.00 90.00 90.00 P 21 21 2 4 +ORIGX1 1.000000 0.000000 0.000000 0.00000 +ORIGX2 0.000000 1.000000 0.000000 0.00000 +ORIGX3 0.000000 0.000000 1.000000 0.00000 +SCALE1 0.019646 0.000000 0.000000 0.00000 +SCALE2 0.000000 0.014859 0.000000 0.00000 +SCALE3 0.000000 0.000000 0.020161 0.00000 +ATOM 1 N MET E 1 7.710 28.561 39.546 1.00 41.09 N +ATOM 2 CA MET E 1 8.253 29.664 38.758 1.00 41.86 C +ATOM 3 C MET E 1 7.445 30.133 37.548 1.00 20.43 C +ATOM 4 O MET E 1 7.189 29.466 36.540 1.00 22.92 O +ATOM 5 CB MET E 1 9.738 29.578 38.445 1.00 58.33 C +ATOM 6 CG MET E 1 10.256 30.962 38.143 1.00 37.04 C +ATOM 7 SD MET E 1 10.845 31.785 39.624 1.00 48.15 S +ATOM 8 CE MET E 1 11.874 30.541 40.499 1.00 21.12 C +ATOM 9 N ASN E 2 7.052 31.375 37.689 1.00 21.39 N +ATOM 10 CA ASN E 2 6.241 32.049 36.726 1.00 15.43 C +ATOM 11 C ASN E 2 6.409 33.548 36.940 1.00 11.71 C +ATOM 12 O ASN E 2 7.078 33.999 37.893 1.00 9.28 O +ATOM 13 CB ASN E 2 4.771 31.575 36.910 1.00 10.59 C +ATOM 14 CG ASN E 2 4.284 31.871 38.305 1.00 17.17 C +ATOM 15 OD1 ASN E 2 4.413 32.997 38.793 1.00 20.35 O +ATOM 16 ND2 ASN E 2 3.872 30.857 39.020 1.00 13.86 N +ATOM 17 N ILE E 3 5.739 34.298 36.056 1.00 14.08 N +ATOM 18 CA ILE E 3 5.768 35.759 36.111 1.00 10.83 C +ATOM 19 C ILE E 3 5.518 36.364 37.488 1.00 9.59 C +ATOM 20 O ILE E 3 6.217 37.286 37.861 1.00 11.37 O +ATOM 21 CB ILE E 3 4.933 36.389 35.001 1.00 13.23 C +ATOM 22 CG1 ILE E 3 5.138 37.899 35.089 1.00 11.53 C +ATOM 23 CG2 ILE E 3 3.449 36.064 35.230 1.00 12.95 C +ATOM 24 CD1 ILE E 3 6.522 38.291 34.603 1.00 11.29 C +ATOM 25 N PHE E 4 4.507 35.854 38.224 1.00 11.91 N +ATOM 26 CA PHE E 4 4.144 36.258 39.575 1.00 7.14 C +ATOM 27 C PHE E 4 5.305 36.089 40.541 1.00 9.18 C +ATOM 28 O PHE E 4 5.662 37.000 41.282 1.00 12.86 O +ATOM 29 CB PHE E 4 2.847 35.538 40.037 1.00 13.56 C +ATOM 30 CG PHE E 4 1.593 35.933 39.287 1.00 13.95 C +ATOM 31 CD1 PHE E 4 0.968 37.166 39.520 1.00 11.65 C +ATOM 32 CD2 PHE E 4 1.043 35.105 38.304 1.00 13.28 C +ATOM 33 CE1 PHE E 4 -0.183 37.605 38.866 1.00 11.96 C +ATOM 34 CE2 PHE E 4 -0.121 35.514 37.644 1.00 13.80 C +ATOM 35 CZ PHE E 4 -0.732 36.740 37.917 1.00 14.04 C +ATOM 36 N GLU E 5 5.970 34.937 40.505 1.00 15.01 N +ATOM 37 CA GLU E 5 7.121 34.670 41.351 1.00 10.34 C +ATOM 38 C GLU E 5 8.342 35.468 40.880 1.00 11.99 C +ATOM 39 O GLU E 5 9.106 36.011 41.657 1.00 8.94 O +ATOM 40 CB GLU E 5 7.454 33.157 41.354 1.00 12.85 C +ATOM 41 CG GLU E 5 6.292 32.337 41.946 1.00 21.84 C +ATOM 42 CD GLU E 5 6.372 32.337 43.444 1.00 36.84 C +ATOM 43 OE1 GLU E 5 7.389 31.605 43.846 1.00 36.94 O +ATOM 44 OE2 GLU E 5 5.591 32.920 44.185 1.00 31.93 O +ATOM 45 N MET E 6 8.553 35.553 39.585 1.00 4.89 N +ATOM 46 CA MET E 6 9.698 36.273 39.083 1.00 3.91 C +ATOM 47 C MET E 6 9.646 37.740 39.534 1.00 11.21 C +ATOM 48 O MET E 6 10.651 38.274 40.012 1.00 11.37 O +ATOM 49 CB MET E 6 9.536 36.222 37.557 1.00 4.36 C +ATOM 50 CG MET E 6 10.698 36.738 36.742 1.00 6.96 C +ATOM 51 SD MET E 6 10.198 36.960 35.042 1.00 8.24 S +ATOM 52 CE MET E 6 11.793 37.011 34.185 1.00 10.88 C +ATOM 53 N LEU E 7 8.476 38.392 39.371 1.00 12.09 N +ATOM 54 CA LEU E 7 8.272 39.796 39.698 1.00 17.55 C +ATOM 55 C LEU E 7 8.452 40.126 41.181 1.00 15.26 C +ATOM 56 O LEU E 7 8.967 41.181 41.564 1.00 16.80 O +ATOM 57 CB LEU E 7 6.962 40.314 39.083 1.00 4.67 C +ATOM 58 CG LEU E 7 7.109 40.606 37.622 1.00 7.62 C +ATOM 59 CD1 LEU E 7 5.767 41.053 37.003 1.00 7.75 C +ATOM 60 CD2 LEU E 7 8.121 41.728 37.481 1.00 8.86 C +ATOM 61 N AARG E 8 8.035 39.160 42.018 0.50 13.23 N +ATOM 62 N BARG E 8 8.044 39.155 41.997 0.50 13.61 N +ATOM 63 CA AARG E 8 8.127 39.236 43.461 0.50 17.43 C +ATOM 64 CA BARG E 8 8.147 39.257 43.425 0.50 18.13 C +ATOM 65 C AARG E 8 9.583 39.296 43.812 0.50 17.73 C +ATOM 66 C BARG E 8 9.593 39.308 43.798 0.50 18.26 C +ATOM 67 O AARG E 8 9.982 40.041 44.697 0.50 17.12 O +ATOM 68 O BARG E 8 9.992 40.060 44.678 0.50 17.48 O +ATOM 69 CB AARG E 8 7.496 38.048 44.172 0.50 10.52 C +ATOM 70 CB BARG E 8 7.424 38.149 44.151 0.50 11.18 C +ATOM 71 CG AARG E 8 6.003 38.205 44.435 0.50 13.11 C +ATOM 72 CG BARG E 8 6.595 38.761 45.256 0.50 29.45 C +ATOM 73 CD AARG E 8 5.381 37.051 45.208 0.50 13.08 C +ATOM 74 CD BARG E 8 7.363 39.885 45.936 0.50 34.27 C +ATOM 75 NE AARG E 8 4.018 36.784 44.768 0.50 10.86 N +ATOM 76 NE BARG E 8 7.435 39.755 47.390 0.50 14.11 N +ATOM 77 CZ AARG E 8 2.942 37.301 45.339 0.50 20.03 C +ATOM 78 CZ BARG E 8 8.567 39.604 48.090 0.50 36.80 C +ATOM 79 NH1AARG E 8 3.027 38.105 46.395 0.50 5.15 N +ATOM 80 NH1BARG E 8 9.736 39.540 47.446 0.50 30.39 N +ATOM 81 NH2AARG E 8 1.751 36.988 44.822 0.50 28.15 N +ATOM 82 NH2BARG E 8 8.574 39.498 49.418 0.50 10.66 N +ATOM 83 N ILE E 9 10.392 38.522 43.100 1.00 15.28 N +ATOM 84 CA ILE E 9 11.813 38.550 43.372 1.00 11.28 C +ATOM 85 C ILE E 9 12.345 39.923 42.934 1.00 21.78 C +ATOM 86 O ILE E 9 12.969 40.658 43.679 1.00 16.25 O +ATOM 87 CB ILE E 9 12.507 37.358 42.687 1.00 19.89 C +ATOM 88 CG1 ILE E 9 12.153 36.109 43.474 1.00 18.73 C +ATOM 89 CG2 ILE E 9 14.011 37.473 42.603 1.00 9.48 C +ATOM 90 CD1 ILE E 9 12.391 34.821 42.746 1.00 17.42 C +ATOM 91 N ASP E 10 12.080 40.283 41.676 1.00 18.23 N +ATOM 92 CA ASP E 10 12.548 41.549 41.146 1.00 7.06 C +ATOM 93 C ASP E 10 12.033 42.763 41.923 1.00 19.86 C +ATOM 94 O ASP E 10 12.783 43.674 42.225 1.00 20.10 O +ATOM 95 CB ASP E 10 12.144 41.649 39.670 1.00 13.03 C +ATOM 96 CG ASP E 10 13.073 40.773 38.934 1.00 8.86 C +ATOM 97 OD1 ASP E 10 14.135 40.466 39.398 1.00 10.48 O +ATOM 98 OD2 ASP E 10 12.594 40.345 37.789 1.00 9.33 O +ATOM 99 N GLU E 11 10.751 42.850 42.264 1.00 12.24 N +ATOM 100 CA GLU E 11 10.337 44.066 42.970 1.00 14.65 C +ATOM 101 C GLU E 11 10.360 44.134 44.502 1.00 17.79 C +ATOM 102 O GLU E 11 10.384 45.210 45.081 1.00 15.01 O +ATOM 103 CB GLU E 11 8.922 44.499 42.531 1.00 14.36 C +ATOM 104 CG GLU E 11 8.681 44.578 41.016 1.00 12.87 C +ATOM 105 CD GLU E 11 9.399 45.704 40.343 1.00 21.79 C +ATOM 106 OE1 GLU E 11 9.951 46.570 41.173 1.00 20.27 O +ATOM 107 OE2 GLU E 11 9.464 45.768 39.150 1.00 15.04 O +ATOM 108 N GLY E 12 10.261 43.030 45.222 1.00 11.22 N +ATOM 109 CA GLY E 12 10.172 43.120 46.652 1.00 16.92 C +ATOM 110 C GLY E 12 8.731 43.503 47.031 1.00 17.61 C +ATOM 111 O GLY E 12 7.868 43.592 46.188 1.00 18.68 O +ATOM 112 N LEU E 13 8.476 43.772 48.306 1.00 16.75 N +ATOM 113 CA LEU E 13 7.176 44.144 48.827 1.00 16.74 C +ATOM 114 C LEU E 13 7.402 45.112 49.957 1.00 22.06 C +ATOM 115 O LEU E 13 8.090 44.780 50.938 1.00 26.59 O +ATOM 116 CB LEU E 13 6.421 42.878 49.310 1.00 19.08 C +ATOM 117 CG LEU E 13 5.018 43.097 49.853 1.00 18.97 C +ATOM 118 CD1 LEU E 13 4.024 43.404 48.756 1.00 19.39 C +ATOM 119 CD2 LEU E 13 4.596 41.829 50.566 1.00 25.49 C +ATOM 120 N ARG E 14 6.844 46.311 49.785 1.00 16.12 N +ATOM 121 CA ARG E 14 6.906 47.447 50.703 1.00 17.44 C +ATOM 122 C ARG E 14 5.522 47.984 50.878 1.00 15.67 C +ATOM 123 O ARG E 14 4.837 48.249 49.887 1.00 15.10 O +ATOM 124 CB ARG E 14 7.976 48.490 50.339 1.00 17.60 C +ATOM 125 CG ARG E 14 9.328 47.772 50.455 1.00 23.08 C +ATOM 126 CD ARG E 14 10.580 48.552 50.095 1.00 25.33 C +ATOM 127 NE ARG E 14 10.912 48.268 48.702 1.00 32.76 N +ATOM 128 CZ ARG E 14 11.927 48.776 48.037 1.00 44.82 C +ATOM 129 NH1 ARG E 14 12.793 49.626 48.595 1.00 25.46 N +ATOM 130 NH2 ARG E 14 12.053 48.400 46.769 1.00 40.18 N +ATOM 131 N LEU E 15 5.088 48.057 52.162 1.00 17.56 N +ATOM 132 CA LEU E 15 3.741 48.482 52.550 1.00 16.12 C +ATOM 133 C LEU E 15 3.583 49.976 52.741 1.00 19.74 C +ATOM 134 O LEU E 15 2.509 50.532 52.925 1.00 20.60 O +ATOM 135 CB LEU E 15 3.097 47.598 53.650 1.00 17.89 C +ATOM 136 CG LEU E 15 2.974 46.102 53.255 1.00 17.44 C +ATOM 137 CD1 LEU E 15 2.419 45.316 54.441 1.00 29.01 C +ATOM 138 CD2 LEU E 15 2.016 45.883 52.081 1.00 13.50 C +ATOM 139 N LYS E 16 4.723 50.624 52.656 1.00 25.86 N +ATOM 140 CA LYS E 16 4.890 52.063 52.773 1.00 17.01 C +ATOM 141 C LYS E 16 5.462 52.597 51.457 1.00 21.05 C +ATOM 142 O LYS E 16 6.324 51.947 50.889 1.00 18.86 O +ATOM 143 CB LYS E 16 5.992 52.270 53.785 1.00 21.70 C +ATOM 144 CG LYS E 16 5.760 53.296 54.881 1.00 39.94 C +ATOM 145 CD LYS E 16 6.793 53.156 56.015 1.00 49.57 C +ATOM 146 CE LYS E 16 6.703 51.891 56.882 1.00 40.78 C +ATOM 147 NZ LYS E 16 5.552 51.835 57.811 1.00 40.20 N +ATOM 148 N ILE E 17 4.978 53.761 51.024 1.00 24.62 N +ATOM 149 CA ILE E 17 5.458 54.462 49.859 1.00 14.69 C +ATOM 150 C ILE E 17 6.976 54.553 49.933 1.00 17.88 C +ATOM 151 O ILE E 17 7.574 54.829 50.984 1.00 20.56 O +ATOM 152 CB ILE E 17 4.849 55.860 49.675 1.00 15.29 C +ATOM 153 CG1 ILE E 17 3.345 55.762 49.410 1.00 22.94 C +ATOM 154 CG2 ILE E 17 5.513 56.472 48.437 1.00 22.21 C +ATOM 155 CD1 ILE E 17 2.595 57.098 49.290 1.00 22.01 C +ATOM 156 N TYR E 18 7.615 54.261 48.788 1.00 14.55 N +ATOM 157 CA TYR E 18 9.033 54.273 48.656 1.00 17.89 C +ATOM 158 C TYR E 18 9.424 54.830 47.288 1.00 9.98 C +ATOM 159 O TYR E 18 8.614 54.927 46.361 1.00 14.99 O +ATOM 160 CB TYR E 18 9.616 52.874 48.956 1.00 16.03 C +ATOM 161 CG TYR E 18 9.295 51.824 47.893 1.00 13.98 C +ATOM 162 CD1 TYR E 18 8.080 51.141 47.987 1.00 16.41 C +ATOM 163 CD2 TYR E 18 10.135 51.510 46.821 1.00 21.35 C +ATOM 164 CE1 TYR E 18 7.716 50.166 47.045 1.00 16.83 C +ATOM 165 CE2 TYR E 18 9.796 50.543 45.870 1.00 21.88 C +ATOM 166 CZ TYR E 18 8.586 49.869 45.999 1.00 14.66 C +ATOM 167 OH TYR E 18 8.159 48.917 45.084 1.00 19.88 O +ATOM 168 N LYS E 19 10.699 55.187 47.236 1.00 14.92 N +ATOM 169 CA LYS E 19 11.442 55.722 46.104 1.00 21.90 C +ATOM 170 C LYS E 19 12.264 54.632 45.403 1.00 25.84 C +ATOM 171 O LYS E 19 12.991 53.828 46.033 1.00 21.46 O +ATOM 172 CB LYS E 19 12.476 56.728 46.605 1.00 15.90 C +ATOM 173 CG LYS E 19 12.125 58.188 46.368 1.00 32.39 C +ATOM 174 CD LYS E 19 13.330 59.111 46.487 1.00 26.80 C +ATOM 175 CE LYS E 19 12.998 60.534 46.082 1.00 37.21 C +ATOM 176 NZ LYS E 19 11.547 60.666 45.913 1.00 34.74 N +ATOM 177 N ASP E 20 12.174 54.603 44.087 1.00 20.32 N +ATOM 178 CA ASP E 20 12.942 53.636 43.319 1.00 15.70 C +ATOM 179 C ASP E 20 14.352 54.144 43.085 1.00 19.43 C +ATOM 180 O ASP E 20 14.716 55.177 43.621 1.00 19.11 O +ATOM 181 CB ASP E 20 12.280 53.224 42.010 1.00 16.77 C +ATOM 182 CG ASP E 20 11.928 54.366 41.098 1.00 11.00 C +ATOM 183 OD1 ASP E 20 12.743 55.382 41.202 1.00 11.25 O +ATOM 184 OD2 ASP E 20 11.062 54.255 40.277 1.00 13.27 O +ATOM 185 N THR E 21 15.162 53.441 42.293 1.00 16.50 N +ATOM 186 CA THR E 21 16.513 53.927 42.081 1.00 12.27 C +ATOM 187 C THR E 21 16.568 55.186 41.250 1.00 18.64 C +ATOM 188 O THR E 21 17.640 55.767 41.203 1.00 20.37 O +ATOM 189 CB THR E 21 17.545 52.871 41.609 1.00 9.81 C +ATOM 190 OG1 THR E 21 16.916 52.203 40.545 1.00 17.78 O +ATOM 191 CG2 THR E 21 17.792 51.835 42.732 1.00 15.04 C +ATOM 192 N GLU E 22 15.442 55.617 40.645 1.00 19.02 N +ATOM 193 CA GLU E 22 15.365 56.822 39.785 1.00 7.47 C +ATOM 194 C GLU E 22 14.757 57.999 40.533 1.00 18.71 C +ATOM 195 O GLU E 22 14.619 59.086 40.002 1.00 17.10 O +ATOM 196 CB GLU E 22 14.516 56.547 38.519 1.00 11.20 C +ATOM 197 CG GLU E 22 15.234 55.577 37.546 1.00 9.35 C +ATOM 198 CD GLU E 22 16.364 56.297 36.857 1.00 16.73 C +ATOM 199 OE1 GLU E 22 16.214 57.351 36.294 1.00 22.92 O +ATOM 200 OE2 GLU E 22 17.539 55.743 36.957 1.00 20.38 O +ATOM 201 N GLY E 23 14.344 57.759 41.773 1.00 15.68 N +ATOM 202 CA GLY E 23 13.741 58.789 42.595 1.00 7.12 C +ATOM 203 C GLY E 23 12.220 58.800 42.493 1.00 12.85 C +ATOM 204 O GLY E 23 11.565 59.686 43.053 1.00 14.48 O +ATOM 205 N TYR E 24 11.623 57.830 41.779 1.00 13.45 N +ATOM 206 CA TYR E 24 10.173 57.848 41.648 1.00 9.90 C +ATOM 207 C TYR E 24 9.558 57.106 42.779 1.00 12.86 C +ATOM 208 O TYR E 24 10.220 56.265 43.378 1.00 14.04 O +ATOM 209 CB TYR E 24 9.651 57.241 40.348 1.00 11.73 C +ATOM 210 CG TYR E 24 10.365 57.857 39.186 1.00 12.48 C +ATOM 211 CD1 TYR E 24 10.580 59.238 39.122 1.00 18.33 C +ATOM 212 CD2 TYR E 24 10.878 57.064 38.160 1.00 16.55 C +ATOM 213 CE1 TYR E 24 11.277 59.839 38.072 1.00 20.21 C +ATOM 214 CE2 TYR E 24 11.524 57.652 37.076 1.00 13.40 C +ATOM 215 CZ TYR E 24 11.720 59.034 37.021 1.00 17.95 C +ATOM 216 OH TYR E 24 12.381 59.614 35.947 1.00 20.53 O +ATOM 217 N TYR E 25 8.313 57.427 43.012 1.00 15.75 N +ATOM 218 CA TYR E 25 7.617 56.847 44.133 1.00 14.13 C +ATOM 219 C TYR E 25 6.810 55.645 43.753 1.00 9.90 C +ATOM 220 O TYR E 25 5.944 55.792 42.908 1.00 12.47 O +ATOM 221 CB TYR E 25 6.597 57.875 44.620 1.00 14.51 C +ATOM 222 CG TYR E 25 7.245 58.989 45.419 1.00 16.40 C +ATOM 223 CD1 TYR E 25 7.886 58.703 46.624 1.00 18.82 C +ATOM 224 CD2 TYR E 25 7.224 60.291 44.942 1.00 7.98 C +ATOM 225 CE1 TYR E 25 8.477 59.718 47.374 1.00 18.32 C +ATOM 226 CE2 TYR E 25 7.823 61.315 45.671 1.00 20.54 C +ATOM 227 CZ TYR E 25 8.405 61.033 46.907 1.00 11.85 C +ATOM 228 OH TYR E 25 8.993 62.058 47.624 1.00 25.18 O +ATOM 229 N GLU E 26 7.061 54.531 44.442 1.00 9.15 N +ATOM 230 CA GLU E 26 6.325 53.316 44.216 1.00 7.88 C +ATOM 231 C GLU E 26 5.780 52.740 45.547 1.00 13.17 C +ATOM 232 O GLU E 26 6.098 53.210 46.620 1.00 15.41 O +ATOM 233 CB GLU E 26 7.266 52.300 43.510 1.00 13.70 C +ATOM 234 CG GLU E 26 8.021 52.762 42.229 1.00 8.84 C +ATOM 235 CD GLU E 26 8.772 51.586 41.624 1.00 7.16 C +ATOM 236 OE1 GLU E 26 9.025 50.643 42.487 1.00 12.32 O +ATOM 237 OE2 GLU E 26 9.068 51.462 40.456 1.00 11.03 O +ATOM 238 N ILE E 27 4.926 51.712 45.514 1.00 11.03 N +ATOM 239 CA ILE E 27 4.423 51.113 46.739 1.00 13.90 C +ATOM 240 C ILE E 27 4.142 49.674 46.419 1.00 18.23 C +ATOM 241 O ILE E 27 4.170 49.344 45.227 1.00 15.82 O +ATOM 242 CB ILE E 27 3.256 51.809 47.400 1.00 13.19 C +ATOM 243 CG1 ILE E 27 3.152 51.395 48.878 1.00 15.89 C +ATOM 244 CG2 ILE E 27 1.952 51.598 46.634 1.00 7.66 C +ATOM 245 CD1 ILE E 27 1.891 52.009 49.478 1.00 9.44 C +ATOM 246 N GLY E 28 3.940 48.867 47.445 1.00 14.37 N +ATOM 247 CA GLY E 28 3.660 47.448 47.283 1.00 10.43 C +ATOM 248 C GLY E 28 4.702 46.673 46.481 1.00 12.46 C +ATOM 249 O GLY E 28 5.923 46.651 46.743 1.00 14.78 O +ATOM 250 N ILE E 29 4.227 46.010 45.436 1.00 11.22 N +ATOM 251 CA ILE E 29 5.116 45.263 44.584 1.00 9.51 C +ATOM 252 C ILE E 29 5.346 45.981 43.268 1.00 13.04 C +ATOM 253 O ILE E 29 4.728 45.636 42.258 1.00 11.44 O +ATOM 254 CB ILE E 29 4.600 43.855 44.297 1.00 11.26 C +ATOM 255 CG1 ILE E 29 4.416 43.114 45.635 1.00 18.75 C +ATOM 256 CG2 ILE E 29 5.636 43.106 43.435 1.00 6.16 C +ATOM 257 CD1 ILE E 29 3.304 42.082 45.581 1.00 16.35 C +ATOM 258 N GLY E 30 6.220 46.988 43.296 1.00 12.52 N +ATOM 259 CA GLY E 30 6.528 47.771 42.096 1.00 8.87 C +ATOM 260 C GLY E 30 5.344 48.563 41.571 1.00 11.87 C +ATOM 261 O GLY E 30 5.282 48.838 40.368 1.00 11.53 O +ATOM 262 N HIS E 31 4.373 48.967 42.405 1.00 3.15 N +ATOM 263 CA HIS E 31 3.284 49.717 41.795 1.00 6.74 C +ATOM 264 C HIS E 31 3.693 51.170 41.720 1.00 11.35 C +ATOM 265 O HIS E 31 3.886 51.771 42.789 1.00 8.65 O +ATOM 266 CB HIS E 31 1.987 49.657 42.611 1.00 6.94 C +ATOM 267 CG HIS E 31 0.894 50.507 42.043 1.00 11.14 C +ATOM 268 ND1 HIS E 31 0.109 50.039 40.984 1.00 7.09 N +ATOM 269 CD2 HIS E 31 0.465 51.754 42.366 1.00 8.33 C +ATOM 270 CE1 HIS E 31 -0.784 50.986 40.688 1.00 8.37 C +ATOM 271 NE2 HIS E 31 -0.585 52.049 41.479 1.00 8.77 N +ATOM 272 N LEU E 32 3.825 51.711 40.505 1.00 10.76 N +ATOM 273 CA LEU E 32 4.211 53.113 40.285 1.00 10.67 C +ATOM 274 C LEU E 32 3.114 54.079 40.701 1.00 12.54 C +ATOM 275 O LEU E 32 1.988 53.953 40.248 1.00 14.96 O +ATOM 276 CB LEU E 32 4.575 53.444 38.800 1.00 9.87 C +ATOM 277 CG LEU E 32 5.062 54.883 38.521 1.00 4.07 C +ATOM 278 CD1 LEU E 32 6.268 55.226 39.368 1.00 5.30 C +ATOM 279 CD2 LEU E 32 5.424 55.000 37.025 1.00 7.71 C +ATOM 280 N LEU E 33 3.460 55.039 41.554 1.00 10.11 N +ATOM 281 CA LEU E 33 2.504 56.041 41.983 1.00 12.98 C +ATOM 282 C LEU E 33 2.590 57.326 41.194 1.00 8.10 C +ATOM 283 O LEU E 33 1.571 57.842 40.723 1.00 15.70 O +ATOM 284 CB LEU E 33 2.494 56.340 43.504 1.00 10.10 C +ATOM 285 CG LEU E 33 2.209 55.107 44.338 1.00 11.45 C +ATOM 286 CD1 LEU E 33 2.488 55.448 45.801 1.00 6.66 C +ATOM 287 CD2 LEU E 33 0.736 54.695 44.146 1.00 16.47 C +ATOM 288 N THR E 34 3.781 57.888 41.145 1.00 15.15 N +ATOM 289 CA THR E 34 3.954 59.149 40.450 1.00 18.08 C +ATOM 290 C THR E 34 5.444 59.406 40.192 1.00 19.21 C +ATOM 291 O THR E 34 6.291 58.958 40.952 1.00 18.65 O +ATOM 292 CB THR E 34 3.402 60.328 41.293 1.00 11.72 C +ATOM 293 OG1 THR E 34 3.577 61.502 40.493 1.00 19.69 O +ATOM 294 CG2 THR E 34 4.260 60.396 42.571 1.00 9.66 C +ATOM 295 N LYS E 35 5.773 60.154 39.139 1.00 21.81 N +ATOM 296 CA LYS E 35 7.178 60.441 38.856 1.00 23.26 C +ATOM 297 C LYS E 35 7.509 61.858 39.398 1.00 29.92 C +ATOM 298 O LYS E 35 8.635 62.321 39.486 1.00 28.66 O +ATOM 299 CB LYS E 35 7.506 60.245 37.361 1.00 27.18 C +ATOM 300 CG LYS E 35 7.426 58.816 36.827 1.00 20.31 C +ATOM 301 CD LYS E 35 8.526 58.454 35.823 1.00 22.12 C +ATOM 302 CE LYS E 35 8.033 58.242 34.404 1.00 35.16 C +ATOM 303 NZ LYS E 35 9.113 58.191 33.397 1.00 38.09 N +ATOM 304 N SER E 36 6.461 62.561 39.799 1.00 23.02 N +ATOM 305 CA SER E 36 6.596 63.887 40.381 1.00 25.74 C +ATOM 306 C SER E 36 7.317 63.787 41.734 1.00 21.05 C +ATOM 307 O SER E 36 7.151 62.841 42.510 1.00 31.02 O +ATOM 308 CB SER E 36 5.238 64.585 40.463 1.00 35.08 C +ATOM 309 OG SER E 36 4.953 64.825 41.831 1.00 41.85 O +ATOM 310 N PRO E 37 8.182 64.739 42.055 1.00 22.81 N +ATOM 311 CA PRO E 37 8.951 64.671 43.304 1.00 23.02 C +ATOM 312 C PRO E 37 8.200 64.840 44.643 1.00 17.38 C +ATOM 313 O PRO E 37 8.701 64.545 45.763 1.00 22.39 O +ATOM 314 CB PRO E 37 10.065 65.695 43.147 1.00 22.37 C +ATOM 315 CG PRO E 37 9.594 66.645 42.059 1.00 19.30 C +ATOM 316 CD PRO E 37 8.496 65.952 41.264 1.00 14.84 C +ATOM 317 N SER E 38 6.973 65.288 44.552 1.00 20.10 N +ATOM 318 CA SER E 38 6.228 65.469 45.781 1.00 22.05 C +ATOM 319 C SER E 38 5.616 64.223 46.410 1.00 24.24 C +ATOM 320 O SER E 38 4.748 63.590 45.831 1.00 33.20 O +ATOM 321 CB SER E 38 5.055 66.396 45.542 1.00 35.43 C +ATOM 322 OG SER E 38 4.167 66.302 46.653 1.00 24.61 O +ATOM 323 N LEU E 39 5.998 63.907 47.622 1.00 23.25 N +ATOM 324 CA LEU E 39 5.432 62.794 48.349 1.00 26.92 C +ATOM 325 C LEU E 39 3.906 62.958 48.503 1.00 27.63 C +ATOM 326 O LEU E 39 3.145 62.000 48.563 1.00 23.39 O +ATOM 327 CB LEU E 39 6.194 62.736 49.684 1.00 25.31 C +ATOM 328 CG LEU E 39 5.647 61.712 50.652 1.00 29.31 C +ATOM 329 CD1 LEU E 39 5.681 60.349 49.975 1.00 20.41 C +ATOM 330 CD2 LEU E 39 6.519 61.738 51.895 1.00 20.71 C +ATOM 331 N ASN E 40 3.395 64.192 48.526 1.00 28.08 N +ATOM 332 CA ASN E 40 1.958 64.351 48.635 1.00 17.47 C +ATOM 333 C ASN E 40 1.196 63.964 47.387 1.00 25.49 C +ATOM 334 O ASN E 40 0.085 63.453 47.484 1.00 23.90 O +ATOM 335 CB ASN E 40 1.508 65.714 49.108 1.00 27.36 C +ATOM 336 CG ASN E 40 1.875 66.044 50.526 1.00 43.25 C +ATOM 337 OD1 ASN E 40 2.028 65.185 51.412 1.00 35.70 O +ATOM 338 ND2 ASN E 40 1.986 67.338 50.746 1.00 44.43 N +ATOM 339 N ALA E 41 1.751 64.195 46.196 1.00 25.38 N +ATOM 340 CA ALA E 41 1.007 63.785 45.002 1.00 27.34 C +ATOM 341 C ALA E 41 0.942 62.256 44.973 1.00 13.41 C +ATOM 342 O ALA E 41 -0.006 61.662 44.473 1.00 14.79 O +ATOM 343 CB ALA E 41 1.699 64.237 43.744 1.00 23.81 C +ATOM 344 N ALA E 42 2.006 61.669 45.530 1.00 19.57 N +ATOM 345 CA ALA E 42 2.097 60.225 45.619 1.00 24.79 C +ATOM 346 C ALA E 42 0.989 59.726 46.544 1.00 21.69 C +ATOM 347 O ALA E 42 0.285 58.780 46.205 1.00 20.93 O +ATOM 348 CB ALA E 42 3.472 59.809 46.123 1.00 20.22 C +ATOM 349 N LYS E 43 0.846 60.337 47.745 1.00 25.55 N +ATOM 350 CA LYS E 43 -0.213 59.929 48.674 1.00 15.88 C +ATOM 351 C LYS E 43 -1.547 60.070 47.970 1.00 18.39 C +ATOM 352 O LYS E 43 -2.437 59.245 48.062 1.00 18.22 O +ATOM 353 CB LYS E 43 -0.310 60.843 49.857 1.00 15.92 C +ATOM 354 CG LYS E 43 0.963 60.804 50.657 1.00 26.07 C +ATOM 355 CD LYS E 43 0.634 61.116 52.093 1.00 30.75 C +ATOM 356 CE LYS E 43 1.786 60.758 53.004 1.00 34.67 C +ATOM 357 NZ LYS E 43 1.686 61.456 54.294 1.00 31.58 N +ATOM 358 N SER E 44 -1.694 61.147 47.218 1.00 19.70 N +ATOM 359 CA SER E 44 -2.935 61.324 46.496 1.00 23.31 C +ATOM 360 C SER E 44 -3.220 60.237 45.478 1.00 32.83 C +ATOM 361 O SER E 44 -4.353 59.775 45.388 1.00 29.69 O +ATOM 362 CB SER E 44 -3.029 62.706 45.899 1.00 30.71 C +ATOM 363 OG SER E 44 -4.332 63.187 46.172 1.00 39.74 O +ATOM 364 N GLU E 45 -2.199 59.838 44.701 1.00 30.74 N +ATOM 365 CA GLU E 45 -2.380 58.787 43.697 1.00 28.05 C +ATOM 366 C GLU E 45 -2.785 57.537 44.421 1.00 17.35 C +ATOM 367 O GLU E 45 -3.580 56.723 43.944 1.00 23.37 O +ATOM 368 CB GLU E 45 -1.106 58.404 42.894 1.00 24.43 C +ATOM 369 CG GLU E 45 -0.698 59.543 41.953 1.00 20.73 C +ATOM 370 CD GLU E 45 -1.920 60.127 41.313 1.00 35.23 C +ATOM 371 OE1 GLU E 45 -2.668 59.506 40.582 1.00 30.08 O +ATOM 372 OE2 GLU E 45 -2.159 61.344 41.693 1.00 40.29 O +ATOM 373 N LEU E 46 -2.155 57.375 45.561 1.00 23.88 N +ATOM 374 CA LEU E 46 -2.412 56.207 46.368 1.00 19.20 C +ATOM 375 C LEU E 46 -3.888 56.100 46.803 1.00 23.87 C +ATOM 376 O LEU E 46 -4.571 55.138 46.488 1.00 23.96 O +ATOM 377 CB LEU E 46 -1.352 56.132 47.494 1.00 21.62 C +ATOM 378 CG LEU E 46 -1.472 54.888 48.382 1.00 14.80 C +ATOM 379 CD1 LEU E 46 -1.367 53.609 47.550 1.00 16.67 C +ATOM 380 CD2 LEU E 46 -0.393 54.881 49.450 1.00 18.65 C +ATOM 381 N ASP E 47 -4.421 57.101 47.497 1.00 31.73 N +ATOM 382 CA ASP E 47 -5.809 57.038 47.936 1.00 27.08 C +ATOM 383 C ASP E 47 -6.761 56.919 46.813 1.00 22.21 C +ATOM 384 O ASP E 47 -7.902 56.566 47.006 1.00 28.26 O +ATOM 385 CB ASP E 47 -6.290 58.285 48.619 1.00 16.50 C +ATOM 386 CG ASP E 47 -5.473 58.556 49.831 1.00 25.57 C +ATOM 387 OD1 ASP E 47 -4.755 57.736 50.381 1.00 19.21 O +ATOM 388 OD2 ASP E 47 -5.556 59.812 50.169 1.00 25.55 O +ATOM 389 N LYS E 48 -6.331 57.239 45.634 1.00 24.92 N +ATOM 390 CA LYS E 48 -7.294 57.094 44.574 1.00 15.30 C +ATOM 391 C LYS E 48 -7.276 55.643 44.112 1.00 29.42 C +ATOM 392 O LYS E 48 -8.287 55.084 43.754 1.00 36.81 O +ATOM 393 CB LYS E 48 -7.016 58.035 43.421 1.00 33.69 C +ATOM 394 CG LYS E 48 -7.495 59.444 43.712 1.00 37.80 C +ATOM 395 CD LYS E 48 -7.015 60.421 42.661 1.00 34.76 C +ATOM 396 CE LYS E 48 -5.564 60.164 42.256 1.00 47.97 C +ATOM 397 NZ LYS E 48 -5.007 61.154 41.305 1.00 38.30 N +ATOM 398 N ALA E 49 -6.120 55.003 44.142 1.00 26.30 N +ATOM 399 CA ALA E 49 -6.042 53.622 43.732 1.00 24.22 C +ATOM 400 C ALA E 49 -6.784 52.703 44.684 1.00 32.51 C +ATOM 401 O ALA E 49 -7.488 51.785 44.259 1.00 38.82 O +ATOM 402 CB ALA E 49 -4.597 53.147 43.667 1.00 28.14 C +ATOM 403 N ILE E 50 -6.573 52.952 45.965 1.00 29.19 N +ATOM 404 CA ILE E 50 -7.140 52.173 47.045 1.00 18.70 C +ATOM 405 C ILE E 50 -8.596 52.492 47.277 1.00 25.25 C +ATOM 406 O ILE E 50 -9.445 51.623 47.410 1.00 35.48 O +ATOM 407 CB ILE E 50 -6.368 52.463 48.329 1.00 33.62 C +ATOM 408 CG1 ILE E 50 -4.962 51.889 48.206 1.00 24.03 C +ATOM 409 CG2 ILE E 50 -7.084 51.908 49.552 1.00 25.86 C +ATOM 410 CD1 ILE E 50 -4.927 50.647 47.332 1.00 26.52 C +ATOM 411 N GLY E 51 -8.906 53.759 47.362 1.00 25.26 N +ATOM 412 CA GLY E 51 -10.280 54.140 47.579 1.00 29.09 C +ATOM 413 C GLY E 51 -10.492 54.489 49.017 1.00 40.95 C +ATOM 414 O GLY E 51 -11.598 54.429 49.533 1.00 39.23 O +ATOM 415 N ARG E 52 -9.395 54.868 49.631 1.00 31.87 N +ATOM 416 CA ARG E 52 -9.434 55.237 51.007 1.00 34.60 C +ATOM 417 C ARG E 52 -8.312 56.186 51.388 1.00 31.29 C +ATOM 418 O ARG E 52 -7.382 56.501 50.634 1.00 25.93 O +ATOM 419 CB ARG E 52 -9.483 53.964 51.850 1.00 19.71 C +ATOM 420 CG ARG E 52 -8.147 53.387 52.283 1.00 26.44 C +ATOM 421 CD ARG E 52 -8.300 51.991 52.895 1.00 21.88 C +ATOM 422 NE ARG E 52 -7.046 51.254 53.066 1.00 20.57 N +ATOM 423 CZ ARG E 52 -6.093 51.622 53.904 1.00 19.52 C +ATOM 424 NH1 ARG E 52 -6.304 52.701 54.661 1.00 20.34 N +ATOM 425 NH2 ARG E 52 -4.952 50.907 53.994 1.00 20.22 N +ATOM 426 N ASN E 53 -8.395 56.642 52.613 1.00 25.59 N +ATOM 427 CA ASN E 53 -7.391 57.532 53.126 1.00 34.28 C +ATOM 428 C ASN E 53 -6.326 56.582 53.619 1.00 27.26 C +ATOM 429 O ASN E 53 -6.609 55.809 54.531 1.00 34.07 O +ATOM 430 CB ASN E 53 -7.996 58.349 54.284 1.00 42.41 C +ATOM 431 CG ASN E 53 -7.544 59.793 54.430 1.00 41.36 C +ATOM 432 OD1 ASN E 53 -6.356 60.111 54.245 1.00 36.02 O +ATOM 433 ND2 ASN E 53 -8.502 60.647 54.841 1.00 32.38 N +ATOM 434 N THR E 54 -5.123 56.612 53.038 1.00 21.31 N +ATOM 435 CA THR E 54 -4.088 55.655 53.418 1.00 21.88 C +ATOM 436 C THR E 54 -2.919 56.211 54.173 1.00 22.27 C +ATOM 437 O THR E 54 -2.190 55.451 54.822 1.00 29.44 O +ATOM 438 CB THR E 54 -3.487 54.939 52.160 1.00 19.20 C +ATOM 439 OG1 THR E 54 -2.789 55.867 51.361 1.00 18.75 O +ATOM 440 CG2 THR E 54 -4.568 54.330 51.268 1.00 19.08 C +ATOM 441 N ASN E 55 -2.719 57.508 54.025 1.00 30.50 N +ATOM 442 CA ASN E 55 -1.589 58.155 54.655 1.00 20.32 C +ATOM 443 C ASN E 55 -0.271 57.537 54.200 1.00 24.33 C +ATOM 444 O ASN E 55 0.745 57.587 54.897 1.00 26.24 O +ATOM 445 CB ASN E 55 -1.660 58.392 56.187 1.00 33.09 C +ATOM 446 CG ASN E 55 -1.112 59.766 56.486 1.00 44.26 C +ATOM 447 OD1 ASN E 55 -1.806 60.775 56.279 1.00 40.50 O +ATOM 448 ND2 ASN E 55 0.170 59.806 56.826 1.00 39.01 N +ATOM 449 N GLY E 56 -0.326 56.938 53.012 1.00 23.81 N +ATOM 450 CA GLY E 56 0.829 56.313 52.427 1.00 21.56 C +ATOM 451 C GLY E 56 1.148 54.944 52.993 1.00 17.97 C +ATOM 452 O GLY E 56 2.301 54.551 52.941 1.00 17.04 O +ATOM 453 N VAL E 57 0.154 54.222 53.504 1.00 16.83 N +ATOM 454 CA VAL E 57 0.399 52.881 54.044 1.00 14.46 C +ATOM 455 C VAL E 57 -0.749 51.965 53.630 1.00 15.27 C +ATOM 456 O VAL E 57 -1.919 52.359 53.685 1.00 24.71 O +ATOM 457 CB VAL E 57 0.616 52.776 55.555 1.00 18.14 C +ATOM 458 CG1 VAL E 57 1.101 51.355 55.847 1.00 21.08 C +ATOM 459 CG2 VAL E 57 1.714 53.713 56.036 1.00 20.65 C +ATOM 460 N ILE E 58 -0.435 50.756 53.156 1.00 18.26 N +ATOM 461 CA ILE E 58 -1.504 49.846 52.755 1.00 16.46 C +ATOM 462 C ILE E 58 -1.355 48.492 53.393 1.00 14.09 C +ATOM 463 O ILE E 58 -0.278 48.155 53.905 1.00 19.46 O +ATOM 464 CB ILE E 58 -1.613 49.671 51.242 1.00 16.45 C +ATOM 465 CG1 ILE E 58 -0.219 49.257 50.707 1.00 15.98 C +ATOM 466 CG2 ILE E 58 -2.047 51.050 50.736 1.00 16.68 C +ATOM 467 CD1 ILE E 58 -0.191 48.626 49.312 1.00 11.03 C +ATOM 468 N THR E 59 -2.457 47.750 53.310 1.00 10.64 N +ATOM 469 CA THR E 59 -2.498 46.390 53.834 1.00 20.30 C +ATOM 470 C THR E 59 -1.780 45.463 52.854 1.00 13.60 C +ATOM 471 O THR E 59 -1.544 45.771 51.717 1.00 14.05 O +ATOM 472 CB THR E 59 -3.943 45.876 54.016 1.00 14.85 C +ATOM 473 OG1 THR E 59 -4.625 45.877 52.780 1.00 17.69 O +ATOM 474 CG2 THR E 59 -4.758 46.748 54.967 1.00 16.01 C +ATOM 475 N LYS E 60 -1.400 44.305 53.294 1.00 14.18 N +ATOM 476 CA LYS E 60 -0.726 43.429 52.388 1.00 25.11 C +ATOM 477 C LYS E 60 -1.730 42.981 51.355 1.00 20.67 C +ATOM 478 O LYS E 60 -1.496 42.773 50.175 1.00 25.62 O +ATOM 479 CB LYS E 60 -0.217 42.280 53.218 1.00 23.37 C +ATOM 480 CG LYS E 60 0.130 41.093 52.356 1.00 37.52 C +ATOM 481 CD LYS E 60 1.275 40.261 52.927 1.00 27.92 C +ATOM 482 CE LYS E 60 1.240 38.859 52.334 1.00 53.09 C +ATOM 483 NZ LYS E 60 2.561 38.241 52.109 1.00 45.87 N +ATOM 484 N ASP E 61 -2.933 42.861 51.817 1.00 25.37 N +ATOM 485 CA ASP E 61 -3.941 42.423 50.904 1.00 19.75 C +ATOM 486 C ASP E 61 -4.192 43.431 49.812 1.00 23.15 C +ATOM 487 O ASP E 61 -4.566 43.091 48.680 1.00 21.01 O +ATOM 488 CB ASP E 61 -5.261 42.190 51.639 1.00 35.53 C +ATOM 489 CG ASP E 61 -5.396 40.765 52.085 1.00 52.85 C +ATOM 490 OD1 ASP E 61 -4.583 39.897 51.827 1.00 41.40 O +ATOM 491 OD2 ASP E 61 -6.473 40.575 52.807 1.00 52.99 O +ATOM 492 N GLU E 62 -4.070 44.689 50.184 1.00 18.28 N +ATOM 493 CA GLU E 62 -4.279 45.690 49.195 1.00 20.87 C +ATOM 494 C GLU E 62 -3.135 45.623 48.229 1.00 14.73 C +ATOM 495 O GLU E 62 -3.431 45.899 47.080 1.00 14.04 O +ATOM 496 CB GLU E 62 -4.280 47.062 49.819 1.00 12.59 C +ATOM 497 CG GLU E 62 -5.654 47.283 50.466 1.00 15.34 C +ATOM 498 CD GLU E 62 -5.510 48.365 51.460 1.00 22.34 C +ATOM 499 OE1 GLU E 62 -4.390 48.584 51.919 1.00 20.05 O +ATOM 500 OE2 GLU E 62 -6.648 49.010 51.677 1.00 12.88 O +ATOM 501 N ALA E 63 -1.900 45.312 48.704 1.00 13.28 N +ATOM 502 CA ALA E 63 -0.733 45.185 47.865 1.00 13.58 C +ATOM 503 C ALA E 63 -0.910 44.096 46.795 1.00 14.80 C +ATOM 504 O ALA E 63 -0.628 44.280 45.602 1.00 13.42 O +ATOM 505 CB ALA E 63 0.546 44.909 48.627 1.00 10.30 C +ATOM 506 N GLU E 64 -1.400 42.960 47.252 1.00 16.06 N +ATOM 507 CA GLU E 64 -1.627 41.790 46.406 1.00 12.21 C +ATOM 508 C GLU E 64 -2.569 42.108 45.289 1.00 19.57 C +ATOM 509 O GLU E 64 -2.448 41.727 44.136 1.00 17.10 O +ATOM 510 CB GLU E 64 -2.202 40.640 47.238 1.00 18.79 C +ATOM 511 CG GLU E 64 -1.156 40.003 48.185 1.00 42.75 C +ATOM 512 CD GLU E 64 0.071 39.482 47.495 1.00 52.66 C +ATOM 513 OE1 GLU E 64 -0.145 39.236 46.215 1.00 41.93 O +ATOM 514 OE2 GLU E 64 1.133 39.291 48.077 1.00 38.54 O +ATOM 515 N LYS E 65 -3.555 42.831 45.699 1.00 13.82 N +ATOM 516 CA LYS E 65 -4.570 43.259 44.774 1.00 17.95 C +ATOM 517 C LYS E 65 -4.020 44.108 43.638 1.00 15.52 C +ATOM 518 O LYS E 65 -4.366 43.981 42.465 1.00 15.70 O +ATOM 519 CB LYS E 65 -5.583 44.123 45.528 1.00 19.77 C +ATOM 520 CG LYS E 65 -6.905 44.255 44.780 1.00 22.43 C +ATOM 521 CD LYS E 65 -7.101 43.087 43.799 1.00 37.27 C +ATOM 522 CE LYS E 65 -7.779 43.396 42.454 1.00 38.68 C +ATOM 523 NZ LYS E 65 -7.050 42.821 41.308 1.00 42.81 N +ATOM 524 N LEU E 66 -3.214 45.080 44.057 1.00 16.82 N +ATOM 525 CA LEU E 66 -2.671 45.981 43.103 1.00 14.66 C +ATOM 526 C LEU E 66 -1.806 45.169 42.149 1.00 6.79 C +ATOM 527 O LEU E 66 -1.815 45.356 40.922 1.00 13.91 O +ATOM 528 CB LEU E 66 -1.867 47.063 43.876 1.00 12.95 C +ATOM 529 CG LEU E 66 -2.722 48.221 44.359 1.00 12.31 C +ATOM 530 CD1 LEU E 66 -2.017 49.153 45.358 1.00 16.93 C +ATOM 531 CD2 LEU E 66 -3.285 49.037 43.211 1.00 16.42 C +ATOM 532 N PHE E 67 -0.982 44.308 42.749 1.00 10.41 N +ATOM 533 CA PHE E 67 -0.104 43.518 41.954 1.00 8.88 C +ATOM 534 C PHE E 67 -0.821 42.755 40.853 1.00 11.90 C +ATOM 535 O PHE E 67 -0.381 42.717 39.723 1.00 9.33 O +ATOM 536 CB PHE E 67 0.626 42.594 42.912 1.00 8.80 C +ATOM 537 CG PHE E 67 1.632 41.738 42.262 1.00 11.87 C +ATOM 538 CD1 PHE E 67 2.668 42.261 41.485 1.00 13.34 C +ATOM 539 CD2 PHE E 67 1.615 40.356 42.493 1.00 14.19 C +ATOM 540 CE1 PHE E 67 3.661 41.471 40.908 1.00 13.62 C +ATOM 541 CE2 PHE E 67 2.617 39.563 41.934 1.00 12.16 C +ATOM 542 CZ PHE E 67 3.610 40.099 41.120 1.00 15.37 C +ATOM 543 N ASN E 68 -1.922 42.089 41.207 1.00 15.02 N +ATOM 544 CA ASN E 68 -2.746 41.337 40.250 1.00 13.33 C +ATOM 545 C ASN E 68 -3.218 42.234 39.111 1.00 11.06 C +ATOM 546 O ASN E 68 -3.094 41.927 37.896 1.00 11.19 O +ATOM 547 CB ASN E 68 -4.010 40.723 40.905 1.00 14.83 C +ATOM 548 CG ASN E 68 -3.762 39.418 41.579 1.00 17.75 C +ATOM 549 OD1 ASN E 68 -2.676 38.846 41.440 1.00 17.17 O +ATOM 550 ND2 ASN E 68 -4.731 39.000 42.393 1.00 22.50 N +ATOM 551 N GLN E 69 -3.785 43.388 39.516 1.00 14.11 N +ATOM 552 CA GLN E 69 -4.233 44.278 38.461 1.00 9.12 C +ATOM 553 C GLN E 69 -3.102 44.728 37.538 1.00 9.29 C +ATOM 554 O GLN E 69 -3.260 44.896 36.308 1.00 7.38 O +ATOM 555 CB GLN E 69 -4.879 45.509 39.083 1.00 13.94 C +ATOM 556 CG GLN E 69 -5.982 45.064 40.037 1.00 22.04 C +ATOM 557 CD GLN E 69 -6.742 46.236 40.602 1.00 27.45 C +ATOM 558 OE1 GLN E 69 -7.954 46.168 40.890 1.00 39.79 O +ATOM 559 NE2 GLN E 69 -6.027 47.327 40.752 1.00 26.75 N +ATOM 560 N ASP E 70 -1.918 44.897 38.149 1.00 11.23 N +ATOM 561 CA ASP E 70 -0.763 45.337 37.380 1.00 9.51 C +ATOM 562 C ASP E 70 -0.237 44.284 36.422 1.00 4.37 C +ATOM 563 O ASP E 70 0.151 44.592 35.283 1.00 7.09 O +ATOM 564 CB ASP E 70 0.374 45.879 38.239 1.00 6.73 C +ATOM 565 CG ASP E 70 -0.068 47.142 38.908 1.00 6.28 C +ATOM 566 OD1 ASP E 70 -0.886 47.862 38.415 1.00 7.10 O +ATOM 567 OD2 ASP E 70 0.648 47.471 39.958 1.00 4.63 O +ATOM 568 N VAL E 71 -0.248 43.041 36.863 1.00 8.03 N +ATOM 569 CA VAL E 71 0.232 41.972 36.006 1.00 4.23 C +ATOM 570 C VAL E 71 -0.799 41.818 34.925 1.00 10.05 C +ATOM 571 O VAL E 71 -0.492 41.672 33.721 1.00 5.39 O +ATOM 572 CB VAL E 71 0.407 40.666 36.767 1.00 8.12 C +ATOM 573 CG1 VAL E 71 0.650 39.505 35.792 1.00 8.50 C +ATOM 574 CG2 VAL E 71 1.544 40.775 37.797 1.00 5.69 C +ATOM 575 N ASP E 72 -2.054 41.891 35.344 1.00 4.42 N +ATOM 576 CA ASP E 72 -3.135 41.801 34.332 1.00 4.79 C +ATOM 577 C ASP E 72 -3.015 42.937 33.307 1.00 3.99 C +ATOM 578 O ASP E 72 -3.131 42.707 32.115 1.00 3.18 O +ATOM 579 CB ASP E 72 -4.544 41.799 34.890 1.00 3.32 C +ATOM 580 CG ASP E 72 -5.665 41.800 33.886 1.00 11.02 C +ATOM 581 OD1 ASP E 72 -6.124 40.811 33.346 1.00 14.02 O +ATOM 582 OD2 ASP E 72 -6.196 42.961 33.698 1.00 11.95 O +ATOM 583 N ALA E 73 -2.734 44.164 33.711 1.00 3.55 N +ATOM 584 CA ALA E 73 -2.583 45.241 32.710 1.00 6.73 C +ATOM 585 C ALA E 73 -1.359 45.099 31.754 1.00 5.73 C +ATOM 586 O ALA E 73 -1.410 45.445 30.489 1.00 6.53 O +ATOM 587 CB ALA E 73 -2.547 46.585 33.474 1.00 6.53 C +ATOM 588 N ALA E 74 -0.260 44.553 32.307 1.00 2.86 N +ATOM 589 CA ALA E 74 0.987 44.300 31.547 1.00 6.86 C +ATOM 590 C ALA E 74 0.680 43.288 30.407 1.00 6.37 C +ATOM 591 O ALA E 74 1.026 43.437 29.246 1.00 6.37 O +ATOM 592 CB ALA E 74 2.073 43.767 32.506 1.00 2.25 C +ATOM 593 N VAL E 75 -0.095 42.208 30.712 1.00 6.47 N +ATOM 594 CA VAL E 75 -0.511 41.232 29.741 1.00 6.93 C +ATOM 595 C VAL E 75 -1.457 41.843 28.699 1.00 6.59 C +ATOM 596 O VAL E 75 -1.336 41.566 27.516 1.00 3.73 O +ATOM 597 CB VAL E 75 -1.165 40.067 30.457 1.00 7.67 C +ATOM 598 CG1 VAL E 75 -1.664 39.178 29.329 1.00 5.29 C +ATOM 599 CG2 VAL E 75 -0.133 39.327 31.314 1.00 6.96 C +ATOM 600 N ARG E 76 -2.414 42.651 29.140 1.00 7.21 N +ATOM 601 CA ARG E 76 -3.327 43.304 28.219 1.00 6.86 C +ATOM 602 C ARG E 76 -2.575 44.194 27.236 1.00 8.94 C +ATOM 603 O ARG E 76 -2.787 44.188 26.013 1.00 8.18 O +ATOM 604 CB ARG E 76 -4.401 44.036 28.979 1.00 13.73 C +ATOM 605 CG ARG E 76 -5.437 43.041 29.523 1.00 14.65 C +ATOM 606 CD ARG E 76 -6.845 43.620 29.478 1.00 28.79 C +ATOM 607 NE ARG E 76 -7.404 44.260 30.665 1.00 32.24 N +ATOM 608 CZ ARG E 76 -7.002 45.245 31.472 1.00 50.76 C +ATOM 609 NH1 ARG E 76 -5.854 45.927 31.421 1.00 36.39 N +ATOM 610 NH2 ARG E 76 -7.855 45.551 32.440 1.00 43.94 N +ATOM 611 N GLY E 77 -1.629 44.925 27.759 1.00 5.05 N +ATOM 612 CA GLY E 77 -0.727 45.769 26.991 1.00 8.38 C +ATOM 613 C GLY E 77 0.043 44.982 25.894 1.00 8.78 C +ATOM 614 O GLY E 77 0.090 45.363 24.715 1.00 5.34 O +ATOM 615 N ILE E 78 0.592 43.808 26.218 1.00 1.00 N +ATOM 616 CA ILE E 78 1.254 43.010 25.227 1.00 1.00 C +ATOM 617 C ILE E 78 0.252 42.579 24.137 1.00 1.76 C +ATOM 618 O ILE E 78 0.558 42.652 22.963 1.00 1.35 O +ATOM 619 CB ILE E 78 1.931 41.738 25.813 1.00 3.75 C +ATOM 620 CG1 ILE E 78 3.288 42.070 26.478 1.00 6.58 C +ATOM 621 CG2 ILE E 78 2.253 40.830 24.622 1.00 3.57 C +ATOM 622 CD1 ILE E 78 3.737 41.190 27.674 1.00 4.54 C +ATOM 623 N LEU E 79 -0.949 42.142 24.523 1.00 1.00 N +ATOM 624 CA LEU E 79 -1.953 41.602 23.636 1.00 5.27 C +ATOM 625 C LEU E 79 -2.558 42.548 22.644 1.00 7.17 C +ATOM 626 O LEU E 79 -2.856 42.155 21.540 1.00 7.13 O +ATOM 627 CB LEU E 79 -2.996 40.712 24.345 1.00 9.03 C +ATOM 628 CG LEU E 79 -2.396 39.502 25.115 1.00 7.40 C +ATOM 629 CD1 LEU E 79 -3.480 38.699 25.761 1.00 3.91 C +ATOM 630 CD2 LEU E 79 -1.680 38.575 24.165 1.00 6.94 C +ATOM 631 N ARG E 80 -2.666 43.804 23.015 1.00 3.17 N +ATOM 632 CA ARG E 80 -3.247 44.815 22.113 1.00 8.03 C +ATOM 633 C ARG E 80 -2.222 45.550 21.269 1.00 9.23 C +ATOM 634 O ARG E 80 -2.624 46.281 20.377 1.00 9.04 O +ATOM 635 CB ARG E 80 -4.182 45.819 22.815 1.00 5.91 C +ATOM 636 CG ARG E 80 -3.446 46.518 23.945 1.00 3.35 C +ATOM 637 CD ARG E 80 -4.201 47.621 24.677 1.00 6.10 C +ATOM 638 NE ARG E 80 -3.374 48.222 25.732 1.00 8.36 N +ATOM 639 CZ ARG E 80 -3.857 48.414 26.952 1.00 8.87 C +ATOM 640 NH1 ARG E 80 -5.120 48.082 27.151 1.00 7.45 N +ATOM 641 NH2 ARG E 80 -3.182 48.920 27.954 1.00 3.90 N +ATOM 642 N ASN E 81 -0.937 45.376 21.568 1.00 7.40 N +ATOM 643 CA ASN E 81 0.127 46.061 20.884 1.00 9.61 C +ATOM 644 C ASN E 81 0.616 45.290 19.659 1.00 4.00 C +ATOM 645 O ASN E 81 0.986 44.123 19.676 1.00 7.59 O +ATOM 646 CB ASN E 81 1.236 46.480 21.864 1.00 12.03 C +ATOM 647 CG ASN E 81 2.311 47.418 21.275 1.00 4.11 C +ATOM 648 OD1 ASN E 81 3.122 46.983 20.484 1.00 9.88 O +ATOM 649 ND2 ASN E 81 2.328 48.716 21.555 1.00 5.41 N +ATOM 650 N ALA E 82 0.509 45.945 18.516 1.00 6.36 N +ATOM 651 CA ALA E 82 0.859 45.347 17.212 1.00 11.49 C +ATOM 652 C ALA E 82 2.302 44.916 17.052 1.00 10.29 C +ATOM 653 O ALA E 82 2.567 44.080 16.206 1.00 7.88 O +ATOM 654 CB ALA E 82 0.433 46.263 16.060 1.00 8.48 C +ATOM 655 N LYS E 83 3.218 45.522 17.824 1.00 5.99 N +ATOM 656 CA LYS E 83 4.594 45.171 17.771 1.00 8.34 C +ATOM 657 C LYS E 83 4.941 44.073 18.754 1.00 6.11 C +ATOM 658 O LYS E 83 5.794 43.274 18.482 1.00 8.12 O +ATOM 659 CB LYS E 83 5.512 46.313 18.144 1.00 8.66 C +ATOM 660 CG LYS E 83 5.611 47.340 17.073 1.00 18.69 C +ATOM 661 CD LYS E 83 5.692 48.706 17.707 1.00 25.23 C +ATOM 662 CE LYS E 83 4.312 49.225 18.083 1.00 35.33 C +ATOM 663 NZ LYS E 83 4.317 50.652 18.412 1.00 29.06 N +ATOM 664 N LEU E 84 4.328 44.045 19.916 1.00 3.08 N +ATOM 665 CA LEU E 84 4.691 43.054 20.891 1.00 2.83 C +ATOM 666 C LEU E 84 3.986 41.742 20.772 1.00 8.07 C +ATOM 667 O LEU E 84 4.533 40.666 21.040 1.00 4.18 O +ATOM 668 CB LEU E 84 4.289 43.687 22.234 1.00 3.19 C +ATOM 669 CG LEU E 84 5.047 44.957 22.593 1.00 7.62 C +ATOM 670 CD1 LEU E 84 4.589 45.377 23.979 1.00 5.31 C +ATOM 671 CD2 LEU E 84 6.527 44.662 22.730 1.00 6.12 C +ATOM 672 N LYS E 85 2.719 41.848 20.429 1.00 11.63 N +ATOM 673 CA LYS E 85 1.943 40.644 20.292 1.00 11.52 C +ATOM 674 C LYS E 85 2.544 39.531 19.411 1.00 14.63 C +ATOM 675 O LYS E 85 2.581 38.388 19.883 1.00 10.79 O +ATOM 676 CB LYS E 85 0.453 40.819 20.037 1.00 12.19 C +ATOM 677 CG LYS E 85 -0.171 39.449 20.298 1.00 8.55 C +ATOM 678 CD LYS E 85 -1.545 39.250 19.787 1.00 11.15 C +ATOM 679 CE LYS E 85 -2.014 37.884 20.286 1.00 16.15 C +ATOM 680 NZ LYS E 85 -2.573 37.096 19.197 1.00 15.11 N +ATOM 681 N PRO E 86 2.964 39.803 18.134 1.00 12.35 N +ATOM 682 CA PRO E 86 3.499 38.712 17.318 1.00 7.82 C +ATOM 683 C PRO E 86 4.740 38.100 17.965 1.00 13.01 C +ATOM 684 O PRO E 86 5.067 36.962 17.811 1.00 7.08 O +ATOM 685 CB PRO E 86 3.866 39.340 15.971 1.00 16.72 C +ATOM 686 CG PRO E 86 3.273 40.744 15.917 1.00 15.89 C +ATOM 687 CD PRO E 86 2.726 41.030 17.305 1.00 5.83 C +ATOM 688 N VAL E 87 5.441 38.862 18.820 1.00 9.91 N +ATOM 689 CA VAL E 87 6.636 38.399 19.438 1.00 6.74 C +ATOM 690 C VAL E 87 6.306 37.456 20.544 1.00 14.06 C +ATOM 691 O VAL E 87 6.812 36.324 20.647 1.00 5.84 O +ATOM 692 CB VAL E 87 7.569 39.539 19.925 1.00 6.82 C +ATOM 693 CG1 VAL E 87 8.756 39.073 20.722 1.00 4.34 C +ATOM 694 CG2 VAL E 87 8.053 40.461 18.814 1.00 8.00 C +ATOM 695 N TYR E 88 5.434 37.966 21.361 1.00 7.70 N +ATOM 696 CA TYR E 88 5.007 37.210 22.484 1.00 6.11 C +ATOM 697 C TYR E 88 4.456 35.848 22.061 1.00 7.17 C +ATOM 698 O TYR E 88 4.801 34.792 22.607 1.00 9.30 O +ATOM 699 CB TYR E 88 3.916 38.037 23.168 1.00 6.50 C +ATOM 700 CG TYR E 88 3.434 37.443 24.477 1.00 3.35 C +ATOM 701 CD1 TYR E 88 4.194 37.456 25.638 1.00 8.64 C +ATOM 702 CD2 TYR E 88 2.174 36.832 24.512 1.00 5.73 C +ATOM 703 CE1 TYR E 88 3.664 36.934 26.805 1.00 3.91 C +ATOM 704 CE2 TYR E 88 1.649 36.258 25.656 1.00 5.20 C +ATOM 705 CZ TYR E 88 2.413 36.332 26.831 1.00 4.38 C +ATOM 706 OH TYR E 88 1.870 35.798 27.976 1.00 7.58 O +ATOM 707 N ASP E 89 3.583 35.879 21.082 1.00 8.89 N +ATOM 708 CA ASP E 89 2.965 34.652 20.604 1.00 10.94 C +ATOM 709 C ASP E 89 4.020 33.602 20.224 1.00 16.88 C +ATOM 710 O ASP E 89 3.862 32.386 20.450 1.00 12.55 O +ATOM 711 CB ASP E 89 1.999 34.894 19.417 1.00 10.70 C +ATOM 712 CG ASP E 89 0.653 35.563 19.595 1.00 20.37 C +ATOM 713 OD1 ASP E 89 0.252 35.657 20.835 1.00 17.75 O +ATOM 714 OD2 ASP E 89 -0.027 35.954 18.644 1.00 18.45 O +ATOM 715 N SER E 90 5.096 34.077 19.649 1.00 8.02 N +ATOM 716 CA SER E 90 6.177 33.198 19.222 1.00 14.82 C +ATOM 717 C SER E 90 7.073 32.613 20.308 1.00 13.59 C +ATOM 718 O SER E 90 7.890 31.698 20.047 1.00 11.10 O +ATOM 719 CB SER E 90 7.080 33.862 18.181 1.00 6.98 C +ATOM 720 OG SER E 90 8.016 34.730 18.813 1.00 13.19 O +ATOM 721 N LEU E 91 6.998 33.142 21.549 1.00 13.33 N +ATOM 722 CA LEU E 91 7.870 32.662 22.601 1.00 5.77 C +ATOM 723 C LEU E 91 7.384 31.464 23.436 1.00 13.04 C +ATOM 724 O LEU E 91 6.202 31.249 23.622 1.00 7.12 O +ATOM 725 CB LEU E 91 8.174 33.850 23.549 1.00 10.10 C +ATOM 726 CG LEU E 91 8.808 35.023 22.791 1.00 6.93 C +ATOM 727 CD1 LEU E 91 8.860 36.136 23.835 1.00 14.66 C +ATOM 728 CD2 LEU E 91 10.261 34.709 22.434 1.00 10.85 C +ATOM 729 N ASP E 92 8.321 30.698 24.023 1.00 8.61 N +ATOM 730 CA ASP E 92 7.958 29.582 24.901 1.00 8.02 C +ATOM 731 C ASP E 92 7.470 30.223 26.204 1.00 10.56 C +ATOM 732 O ASP E 92 7.512 31.454 26.386 1.00 13.31 O +ATOM 733 CB ASP E 92 9.211 28.736 25.190 1.00 7.51 C +ATOM 734 CG ASP E 92 10.350 29.588 25.731 1.00 9.03 C +ATOM 735 OD1 ASP E 92 11.065 30.134 24.765 1.00 11.63 O +ATOM 736 OD2 ASP E 92 10.542 29.854 26.906 1.00 11.39 O +ATOM 737 N ALA E 93 7.112 29.391 27.159 1.00 10.33 N +ATOM 738 CA ALA E 93 6.593 29.875 28.417 1.00 11.09 C +ATOM 739 C ALA E 93 7.547 30.650 29.254 1.00 13.17 C +ATOM 740 O ALA E 93 7.027 31.514 29.966 1.00 14.37 O +ATOM 741 CB ALA E 93 5.886 28.837 29.279 1.00 13.37 C +ATOM 742 N VAL E 94 8.867 30.311 29.204 1.00 10.99 N +ATOM 743 CA VAL E 94 9.790 31.039 30.071 1.00 8.88 C +ATOM 744 C VAL E 94 10.054 32.443 29.512 1.00 9.70 C +ATOM 745 O VAL E 94 10.089 33.406 30.243 1.00 8.95 O +ATOM 746 CB VAL E 94 11.102 30.272 30.379 1.00 11.65 C +ATOM 747 CG1 VAL E 94 12.004 30.937 31.417 1.00 5.62 C +ATOM 748 CG2 VAL E 94 10.756 28.844 30.859 1.00 7.36 C +ATOM 749 N ARG E 95 10.275 32.538 28.219 1.00 3.14 N +ATOM 750 CA ARG E 95 10.559 33.798 27.600 1.00 4.40 C +ATOM 751 C ARG E 95 9.398 34.738 27.638 1.00 11.66 C +ATOM 752 O ARG E 95 9.604 35.965 27.657 1.00 7.51 O +ATOM 753 CB ARG E 95 11.326 33.736 26.264 1.00 6.11 C +ATOM 754 CG ARG E 95 12.589 32.874 26.373 1.00 7.64 C +ATOM 755 CD ARG E 95 13.230 32.695 25.011 1.00 8.83 C +ATOM 756 NE ARG E 95 14.606 32.195 24.943 1.00 14.13 N +ATOM 757 CZ ARG E 95 15.017 30.941 24.767 1.00 16.72 C +ATOM 758 NH1 ARG E 95 14.176 29.932 24.682 1.00 12.85 N +ATOM 759 NH2 ARG E 95 16.315 30.695 24.686 1.00 13.55 N +ATOM 760 N ARG E 96 8.197 34.155 27.699 1.00 7.07 N +ATOM 761 CA ARG E 96 6.996 34.987 27.782 1.00 8.42 C +ATOM 762 C ARG E 96 7.013 35.804 29.068 1.00 6.66 C +ATOM 763 O ARG E 96 6.635 36.954 29.164 1.00 5.82 O +ATOM 764 CB ARG E 96 5.736 34.119 27.715 1.00 9.14 C +ATOM 765 CG ARG E 96 5.197 33.834 26.292 1.00 6.38 C +ATOM 766 CD ARG E 96 4.074 32.773 26.313 1.00 7.04 C +ATOM 767 NE ARG E 96 3.847 32.331 24.935 1.00 4.54 N +ATOM 768 CZ ARG E 96 2.682 32.315 24.283 1.00 6.08 C +ATOM 769 NH1 ARG E 96 1.566 32.705 24.865 1.00 7.63 N +ATOM 770 NH2 ARG E 96 2.675 31.947 22.977 1.00 8.84 N +ATOM 771 N ALA E 97 7.389 35.144 30.153 1.00 5.37 N +ATOM 772 CA ALA E 97 7.443 35.814 31.421 1.00 1.00 C +ATOM 773 C ALA E 97 8.496 36.936 31.353 1.00 7.42 C +ATOM 774 O ALA E 97 8.244 38.041 31.812 1.00 9.76 O +ATOM 775 CB ALA E 97 7.785 34.742 32.426 1.00 3.99 C +ATOM 776 N ALA E 98 9.640 36.720 30.692 1.00 5.05 N +ATOM 777 CA ALA E 98 10.717 37.709 30.558 1.00 4.54 C +ATOM 778 C ALA E 98 10.140 38.972 29.842 1.00 5.04 C +ATOM 779 O ALA E 98 10.363 40.098 30.218 1.00 7.96 O +ATOM 780 CB ALA E 98 11.951 37.130 29.903 1.00 2.80 C +ATOM 781 N LEU E 99 9.277 38.784 28.882 1.00 4.97 N +ATOM 782 CA LEU E 99 8.684 39.964 28.208 1.00 9.48 C +ATOM 783 C LEU E 99 7.598 40.658 29.068 1.00 6.63 C +ATOM 784 O LEU E 99 7.457 41.912 29.089 1.00 2.60 O +ATOM 785 CB LEU E 99 8.163 39.527 26.815 1.00 11.29 C +ATOM 786 CG LEU E 99 7.780 40.672 25.895 1.00 7.82 C +ATOM 787 CD1 LEU E 99 8.997 41.463 25.557 1.00 10.20 C +ATOM 788 CD2 LEU E 99 7.208 40.281 24.547 1.00 8.42 C +ATOM 789 N ILE E 100 6.802 39.848 29.798 1.00 3.19 N +ATOM 790 CA ILE E 100 5.790 40.493 30.580 1.00 1.00 C +ATOM 791 C ILE E 100 6.563 41.285 31.619 1.00 5.69 C +ATOM 792 O ILE E 100 6.147 42.320 32.057 1.00 10.23 O +ATOM 793 CB ILE E 100 4.905 39.438 31.287 1.00 4.71 C +ATOM 794 CG1 ILE E 100 4.123 38.576 30.287 1.00 5.59 C +ATOM 795 CG2 ILE E 100 3.947 40.158 32.256 1.00 3.36 C +ATOM 796 CD1 ILE E 100 3.342 37.441 30.970 1.00 2.70 C +ATOM 797 N ASN E 101 7.701 40.809 32.028 1.00 5.60 N +ATOM 798 CA ASN E 101 8.478 41.483 33.062 1.00 5.97 C +ATOM 799 C ASN E 101 8.982 42.837 32.564 1.00 4.59 C +ATOM 800 O ASN E 101 8.974 43.796 33.273 1.00 2.98 O +ATOM 801 CB ASN E 101 9.693 40.633 33.521 1.00 1.36 C +ATOM 802 CG ASN E 101 10.431 41.178 34.706 1.00 9.51 C +ATOM 803 OD1 ASN E 101 10.864 42.340 34.736 1.00 9.80 O +ATOM 804 ND2 ASN E 101 10.621 40.315 35.698 1.00 10.94 N +ATOM 805 N MET E 102 9.456 42.914 31.332 1.00 6.13 N +ATOM 806 CA MET E 102 9.920 44.197 30.839 1.00 2.67 C +ATOM 807 C MET E 102 8.734 45.138 30.717 1.00 9.18 C +ATOM 808 O MET E 102 8.748 46.342 30.975 1.00 4.60 O +ATOM 809 CB MET E 102 10.429 43.978 29.418 1.00 1.31 C +ATOM 810 CG MET E 102 11.764 43.294 29.460 1.00 11.07 C +ATOM 811 SD MET E 102 12.443 43.148 27.783 1.00 10.74 S +ATOM 812 CE MET E 102 12.879 44.886 27.625 1.00 6.50 C +ATOM 813 N VAL E 103 7.652 44.604 30.234 1.00 7.87 N +ATOM 814 CA VAL E 103 6.463 45.448 30.109 1.00 6.61 C +ATOM 815 C VAL E 103 5.954 46.017 31.404 1.00 6.01 C +ATOM 816 O VAL E 103 5.501 47.150 31.394 1.00 8.92 O +ATOM 817 CB VAL E 103 5.315 44.869 29.318 1.00 1.50 C +ATOM 818 CG1 VAL E 103 4.049 45.741 29.315 1.00 5.08 C +ATOM 819 CG2 VAL E 103 5.757 44.439 27.923 1.00 4.01 C +ATOM 820 N PHE E 104 5.951 45.236 32.502 1.00 5.81 N +ATOM 821 CA PHE E 104 5.499 45.719 33.802 1.00 6.30 C +ATOM 822 C PHE E 104 6.402 46.901 34.268 1.00 6.08 C +ATOM 823 O PHE E 104 5.962 47.852 34.932 1.00 6.32 O +ATOM 824 CB PHE E 104 5.628 44.511 34.786 1.00 4.08 C +ATOM 825 CG PHE E 104 5.217 44.627 36.265 1.00 3.86 C +ATOM 826 CD1 PHE E 104 6.074 45.042 37.287 1.00 6.51 C +ATOM 827 CD2 PHE E 104 3.920 44.265 36.642 1.00 7.52 C +ATOM 828 CE1 PHE E 104 5.637 45.108 38.626 1.00 4.33 C +ATOM 829 CE2 PHE E 104 3.479 44.315 37.960 1.00 5.55 C +ATOM 830 CZ PHE E 104 4.329 44.765 38.959 1.00 1.05 C +ATOM 831 N GLN E 105 7.703 46.837 33.946 1.00 2.22 N +ATOM 832 CA GLN E 105 8.703 47.791 34.342 1.00 3.40 C +ATOM 833 C GLN E 105 8.802 49.029 33.478 1.00 8.03 C +ATOM 834 O GLN E 105 9.250 50.067 33.954 1.00 6.12 O +ATOM 835 CB GLN E 105 10.130 47.215 34.398 1.00 2.46 C +ATOM 836 CG GLN E 105 11.093 48.013 35.328 1.00 2.43 C +ATOM 837 CD GLN E 105 12.541 47.598 35.251 1.00 2.53 C +ATOM 838 OE1 GLN E 105 12.899 46.576 34.651 1.00 6.28 O +ATOM 839 NE2 GLN E 105 13.388 48.367 35.909 1.00 8.81 N +ATOM 840 N MET E 106 8.446 48.899 32.204 1.00 4.47 N +ATOM 841 CA MET E 106 8.578 50.021 31.247 1.00 3.48 C +ATOM 842 C MET E 106 7.348 50.406 30.504 1.00 5.22 C +ATOM 843 O MET E 106 7.361 51.418 29.824 1.00 8.05 O +ATOM 844 CB MET E 106 9.709 49.742 30.213 1.00 7.17 C +ATOM 845 CG MET E 106 11.082 49.674 30.915 1.00 1.44 C +ATOM 846 SD MET E 106 12.428 49.209 29.782 1.00 11.10 S +ATOM 847 CE MET E 106 12.260 47.424 30.087 1.00 9.57 C +ATOM 848 N GLY E 107 6.292 49.629 30.582 1.00 4.81 N +ATOM 849 CA GLY E 107 5.070 49.946 29.807 1.00 4.21 C +ATOM 850 C GLY E 107 5.094 49.399 28.379 1.00 4.81 C +ATOM 851 O GLY E 107 6.166 49.115 27.827 1.00 4.09 O +ATOM 852 N GLU E 108 3.916 49.224 27.723 1.00 7.67 N +ATOM 853 CA GLU E 108 3.806 48.689 26.352 1.00 5.88 C +ATOM 854 C GLU E 108 4.553 49.515 25.323 1.00 6.01 C +ATOM 855 O GLU E 108 5.294 49.033 24.450 1.00 10.34 O +ATOM 856 CB GLU E 108 2.341 48.430 25.903 1.00 5.22 C +ATOM 857 CG GLU E 108 1.394 49.612 26.170 1.00 10.40 C +ATOM 858 CD GLU E 108 -0.093 49.296 26.227 1.00 6.74 C +ATOM 859 OE1 GLU E 108 -0.807 49.272 25.244 1.00 10.31 O +ATOM 860 OE2 GLU E 108 -0.572 49.124 27.446 1.00 10.25 O +ATOM 861 N THR E 109 4.344 50.829 25.432 1.00 14.39 N +ATOM 862 CA THR E 109 5.032 51.669 24.495 1.00 9.53 C +ATOM 863 C THR E 109 6.542 51.687 24.801 1.00 10.96 C +ATOM 864 O THR E 109 7.350 51.723 23.888 1.00 11.83 O +ATOM 865 CB THR E 109 4.381 53.051 24.454 1.00 14.80 C +ATOM 866 OG1 THR E 109 4.787 53.815 25.594 1.00 23.28 O +ATOM 867 CG2 THR E 109 2.878 52.787 24.545 1.00 17.60 C +ATOM 868 N GLY E 110 6.980 51.606 26.051 1.00 9.53 N +ATOM 869 CA GLY E 110 8.425 51.602 26.257 1.00 7.98 C +ATOM 870 C GLY E 110 9.075 50.335 25.772 1.00 9.60 C +ATOM 871 O GLY E 110 10.194 50.339 25.345 1.00 7.78 O +ATOM 872 N VAL E 111 8.416 49.194 25.877 1.00 2.85 N +ATOM 873 CA VAL E 111 9.056 47.994 25.409 1.00 2.93 C +ATOM 874 C VAL E 111 8.934 47.928 23.901 1.00 2.25 C +ATOM 875 O VAL E 111 9.835 47.376 23.233 1.00 8.51 O +ATOM 876 CB VAL E 111 8.368 46.771 26.032 1.00 1.00 C +ATOM 877 CG1 VAL E 111 9.042 45.578 25.386 1.00 1.60 C +ATOM 878 CG2 VAL E 111 8.612 46.792 27.535 1.00 1.25 C +ATOM 879 N ALA E 112 7.782 48.445 23.363 1.00 4.12 N +ATOM 880 CA ALA E 112 7.520 48.451 21.908 1.00 3.23 C +ATOM 881 C ALA E 112 8.662 49.207 21.165 1.00 9.77 C +ATOM 882 O ALA E 112 8.933 49.019 19.974 1.00 12.19 O +ATOM 883 CB ALA E 112 6.161 49.113 21.630 1.00 2.27 C +ATOM 884 N GLY E 113 9.361 50.087 21.894 1.00 8.10 N +ATOM 885 CA GLY E 113 10.467 50.849 21.388 1.00 5.28 C +ATOM 886 C GLY E 113 11.734 50.043 21.250 1.00 6.24 C +ATOM 887 O GLY E 113 12.629 50.535 20.636 1.00 5.07 O +ATOM 888 N PHE E 114 11.867 48.830 21.777 1.00 4.45 N +ATOM 889 CA PHE E 114 13.137 48.117 21.625 1.00 7.14 C +ATOM 890 C PHE E 114 13.184 47.419 20.287 1.00 6.29 C +ATOM 891 O PHE E 114 13.340 46.207 20.192 1.00 6.34 O +ATOM 892 CB PHE E 114 13.307 47.043 22.733 1.00 2.14 C +ATOM 893 CG PHE E 114 13.744 47.556 24.101 1.00 7.64 C +ATOM 894 CD1 PHE E 114 12.948 48.389 24.883 1.00 5.20 C +ATOM 895 CD2 PHE E 114 14.973 47.156 24.649 1.00 4.30 C +ATOM 896 CE1 PHE E 114 13.382 48.823 26.124 1.00 7.76 C +ATOM 897 CE2 PHE E 114 15.414 47.541 25.917 1.00 5.48 C +ATOM 898 CZ PHE E 114 14.611 48.418 26.653 1.00 3.79 C +ATOM 899 N THR E 115 13.021 48.195 19.255 1.00 9.21 N +ATOM 900 CA THR E 115 12.991 47.686 17.906 1.00 6.40 C +ATOM 901 C THR E 115 13.979 46.611 17.499 1.00 9.64 C +ATOM 902 O THR E 115 13.635 45.664 16.805 1.00 7.96 O +ATOM 903 CB THR E 115 13.236 48.922 17.044 1.00 20.50 C +ATOM 904 OG1 THR E 115 12.051 49.681 17.035 1.00 18.39 O +ATOM 905 CG2 THR E 115 13.555 48.523 15.628 1.00 15.66 C +ATOM 906 N ASN E 116 15.258 46.761 17.814 1.00 7.66 N +ATOM 907 CA ASN E 116 16.207 45.756 17.353 1.00 9.80 C +ATOM 908 C ASN E 116 16.183 44.440 18.100 1.00 10.26 C +ATOM 909 O ASN E 116 16.414 43.351 17.538 1.00 16.61 O +ATOM 910 CB ASN E 116 17.617 46.374 17.359 1.00 14.43 C +ATOM 911 CG ASN E 116 17.741 47.566 16.411 1.00 28.01 C +ATOM 912 OD1 ASN E 116 17.253 47.512 15.279 1.00 16.81 O +ATOM 913 ND2 ASN E 116 18.380 48.655 16.860 1.00 24.42 N +ATOM 914 N SER E 117 15.953 44.598 19.388 1.00 10.84 N +ATOM 915 CA SER E 117 15.898 43.509 20.346 1.00 11.61 C +ATOM 916 C SER E 117 14.696 42.625 20.043 1.00 11.95 C +ATOM 917 O SER E 117 14.845 41.428 20.113 1.00 10.39 O +ATOM 918 CB SER E 117 15.887 43.985 21.786 1.00 6.50 C +ATOM 919 OG SER E 117 17.041 44.751 22.118 1.00 8.45 O +ATOM 920 N LEU E 118 13.549 43.215 19.705 1.00 6.87 N +ATOM 921 CA LEU E 118 12.350 42.473 19.352 1.00 8.70 C +ATOM 922 C LEU E 118 12.555 41.773 18.002 1.00 13.15 C +ATOM 923 O LEU E 118 12.034 40.694 17.838 1.00 10.57 O +ATOM 924 CB LEU E 118 11.036 43.289 19.305 1.00 9.54 C +ATOM 925 CG LEU E 118 10.685 44.076 20.576 1.00 12.22 C +ATOM 926 CD1 LEU E 118 9.745 45.254 20.364 1.00 8.74 C +ATOM 927 CD2 LEU E 118 10.146 43.223 21.715 1.00 11.68 C +ATOM 928 N ARG E 119 13.235 42.396 17.013 1.00 12.31 N +ATOM 929 CA ARG E 119 13.498 41.751 15.739 1.00 20.20 C +ATOM 930 C ARG E 119 14.265 40.447 16.043 1.00 15.16 C +ATOM 931 O ARG E 119 13.967 39.413 15.452 1.00 12.12 O +ATOM 932 CB ARG E 119 14.427 42.496 14.744 1.00 17.69 C +ATOM 933 CG ARG E 119 13.892 43.586 13.799 1.00 39.75 C +ATOM 934 CD ARG E 119 14.924 44.083 12.755 1.00 37.86 C +ATOM 935 NE ARG E 119 16.092 43.195 12.566 1.00 43.26 N +ATOM 936 CZ ARG E 119 16.841 42.936 11.465 1.00 69.59 C +ATOM 937 NH1 ARG E 119 16.627 43.496 10.279 1.00 50.62 N +ATOM 938 NH2 ARG E 119 17.857 42.063 11.553 1.00 46.68 N +ATOM 939 N MET E 120 15.289 40.502 16.901 1.00 15.19 N +ATOM 940 CA MET E 120 16.104 39.351 17.239 1.00 13.74 C +ATOM 941 C MET E 120 15.336 38.253 17.976 1.00 18.30 C +ATOM 942 O MET E 120 15.463 37.061 17.714 1.00 18.19 O +ATOM 943 CB MET E 120 17.293 39.788 18.100 1.00 18.86 C +ATOM 944 CG MET E 120 18.227 40.755 17.390 1.00 20.59 C +ATOM 945 SD MET E 120 18.996 39.867 16.017 1.00 30.57 S +ATOM 946 CE MET E 120 17.768 40.024 14.708 1.00 28.70 C +ATOM 947 N LEU E 121 14.509 38.635 18.930 1.00 13.92 N +ATOM 948 CA LEU E 121 13.783 37.619 19.655 1.00 13.09 C +ATOM 949 C LEU E 121 12.844 36.923 18.735 1.00 15.91 C +ATOM 950 O LEU E 121 12.612 35.736 18.838 1.00 11.18 O +ATOM 951 CB LEU E 121 12.896 38.156 20.789 1.00 10.30 C +ATOM 952 CG LEU E 121 13.618 38.868 21.945 1.00 11.89 C +ATOM 953 CD1 LEU E 121 12.576 39.671 22.825 1.00 2.72 C +ATOM 954 CD2 LEU E 121 14.429 37.873 22.759 1.00 9.22 C +ATOM 955 N GLN E 122 12.252 37.686 17.859 1.00 14.08 N +ATOM 956 CA GLN E 122 11.277 37.133 16.934 1.00 11.22 C +ATOM 957 C GLN E 122 11.903 36.074 16.058 1.00 28.87 C +ATOM 958 O GLN E 122 11.269 35.087 15.734 1.00 26.63 O +ATOM 959 CB GLN E 122 10.715 38.314 16.139 1.00 19.13 C +ATOM 960 CG GLN E 122 9.878 37.964 14.910 1.00 25.90 C +ATOM 961 CD GLN E 122 8.414 37.889 15.226 1.00 39.47 C +ATOM 962 OE1 GLN E 122 7.709 38.914 15.138 1.00 31.43 O +ATOM 963 NE2 GLN E 122 7.984 36.677 15.586 1.00 35.05 N +ATOM 964 N GLN E 123 13.158 36.279 15.680 1.00 20.70 N +ATOM 965 CA GLN E 123 13.882 35.354 14.869 1.00 9.20 C +ATOM 966 C GLN E 123 14.641 34.295 15.643 1.00 16.82 C +ATOM 967 O GLN E 123 15.380 33.567 15.007 1.00 16.37 O +ATOM 968 CB GLN E 123 14.928 36.144 14.164 1.00 8.87 C +ATOM 969 CG GLN E 123 14.204 37.171 13.326 1.00 12.87 C +ATOM 970 CD GLN E 123 15.320 37.797 12.579 1.00 26.84 C +ATOM 971 OE1 GLN E 123 16.188 37.101 12.068 1.00 31.57 O +ATOM 972 NE2 GLN E 123 15.398 39.103 12.627 1.00 34.52 N +ATOM 973 N LYS E 124 14.459 34.176 16.978 1.00 18.71 N +ATOM 974 CA LYS E 124 15.157 33.149 17.756 1.00 13.06 C +ATOM 975 C LYS E 124 16.693 33.316 17.883 1.00 23.66 C +ATOM 976 O LYS E 124 17.420 32.364 18.202 1.00 19.24 O +ATOM 977 CB LYS E 124 14.630 31.697 17.624 1.00 14.46 C +ATOM 978 CG LYS E 124 13.142 31.566 17.267 1.00 18.60 C +ATOM 979 CD LYS E 124 12.438 30.266 17.625 1.00 36.81 C +ATOM 980 CE LYS E 124 10.956 30.469 17.936 1.00 34.85 C +ATOM 981 NZ LYS E 124 10.630 30.618 19.386 1.00 28.21 N +ATOM 982 N ARG E 125 17.219 34.537 17.681 1.00 18.27 N +ATOM 983 CA ARG E 125 18.658 34.851 17.811 1.00 19.08 C +ATOM 984 C ARG E 125 18.900 35.371 19.197 1.00 14.37 C +ATOM 985 O ARG E 125 19.058 36.567 19.406 1.00 13.85 O +ATOM 986 CB ARG E 125 19.053 35.901 16.764 1.00 15.91 C +ATOM 987 CG ARG E 125 19.086 35.288 15.349 1.00 20.89 C +ATOM 988 CD ARG E 125 18.265 35.975 14.263 1.00 23.86 C +ATOM 989 NE ARG E 125 18.876 35.898 12.917 1.00 44.50 N +ATOM 990 CZ ARG E 125 18.780 34.924 11.970 1.00 64.65 C +ATOM 991 NH1 ARG E 125 18.060 33.803 12.091 1.00 47.11 N +ATOM 992 NH2 ARG E 125 19.447 35.078 10.824 1.00 48.12 N +ATOM 993 N TRP E 126 18.860 34.441 20.125 1.00 12.03 N +ATOM 994 CA TRP E 126 18.976 34.697 21.547 1.00 10.65 C +ATOM 995 C TRP E 126 20.240 35.359 22.033 1.00 13.83 C +ATOM 996 O TRP E 126 20.300 36.204 22.956 1.00 11.19 O +ATOM 997 CB TRP E 126 18.618 33.464 22.398 1.00 17.36 C +ATOM 998 CG TRP E 126 17.446 32.622 21.960 1.00 21.55 C +ATOM 999 CD1 TRP E 126 17.452 31.284 21.663 1.00 21.97 C +ATOM 1000 CD2 TRP E 126 16.098 33.030 21.803 1.00 14.82 C +ATOM 1001 NE1 TRP E 126 16.192 30.827 21.351 1.00 23.59 N +ATOM 1002 CE2 TRP E 126 15.343 31.885 21.418 1.00 27.11 C +ATOM 1003 CE3 TRP E 126 15.467 34.248 21.957 1.00 17.02 C +ATOM 1004 CZ2 TRP E 126 13.985 31.956 21.161 1.00 15.25 C +ATOM 1005 CZ3 TRP E 126 14.127 34.314 21.712 1.00 15.71 C +ATOM 1006 CH2 TRP E 126 13.390 33.188 21.355 1.00 17.80 C +ATOM 1007 N ASP E 127 21.297 34.962 21.381 1.00 17.11 N +ATOM 1008 CA ASP E 127 22.504 35.613 21.842 1.00 18.54 C +ATOM 1009 C ASP E 127 22.550 37.039 21.354 1.00 5.55 C +ATOM 1010 O ASP E 127 22.871 37.944 22.139 1.00 13.87 O +ATOM 1011 CB ASP E 127 23.745 34.809 21.453 1.00 14.37 C +ATOM 1012 CG ASP E 127 23.614 33.494 22.167 1.00 31.43 C +ATOM 1013 OD1 ASP E 127 23.891 33.339 23.355 1.00 33.86 O +ATOM 1014 OD2 ASP E 127 23.069 32.587 21.410 1.00 26.99 O +ATOM 1015 N GLU E 128 22.196 37.200 20.084 1.00 10.40 N +ATOM 1016 CA GLU E 128 22.181 38.540 19.571 1.00 10.49 C +ATOM 1017 C GLU E 128 21.061 39.406 20.217 1.00 15.62 C +ATOM 1018 O GLU E 128 21.221 40.604 20.232 1.00 14.44 O +ATOM 1019 CB GLU E 128 22.124 38.578 18.026 1.00 20.86 C +ATOM 1020 CG GLU E 128 23.217 37.739 17.332 1.00 25.73 C +ATOM 1021 CD GLU E 128 22.763 37.210 15.990 1.00 37.62 C +ATOM 1022 OE1 GLU E 128 22.134 36.168 15.876 1.00 32.71 O +ATOM 1023 OE2 GLU E 128 23.053 38.011 14.973 1.00 28.84 O +ATOM 1024 N ALA E 129 19.911 38.883 20.708 1.00 7.72 N +ATOM 1025 CA ALA E 129 18.890 39.741 21.309 1.00 8.21 C +ATOM 1026 C ALA E 129 19.417 40.286 22.636 1.00 5.05 C +ATOM 1027 O ALA E 129 19.267 41.485 22.873 1.00 10.36 O +ATOM 1028 CB ALA E 129 17.580 38.990 21.535 1.00 3.90 C +ATOM 1029 N ALA E 130 20.083 39.401 23.420 1.00 9.20 N +ATOM 1030 CA ALA E 130 20.721 39.705 24.702 1.00 11.60 C +ATOM 1031 C ALA E 130 21.691 40.888 24.581 1.00 8.36 C +ATOM 1032 O ALA E 130 21.736 41.758 25.438 1.00 9.16 O +ATOM 1033 CB ALA E 130 21.547 38.516 25.196 1.00 9.19 C +ATOM 1034 N VAL E 131 22.486 40.873 23.519 1.00 5.97 N +ATOM 1035 CA VAL E 131 23.434 41.940 23.262 1.00 12.66 C +ATOM 1036 C VAL E 131 22.662 43.242 22.965 1.00 10.12 C +ATOM 1037 O VAL E 131 23.041 44.345 23.460 1.00 9.67 O +ATOM 1038 CB VAL E 131 24.380 41.596 22.104 1.00 8.98 C +ATOM 1039 CG1 VAL E 131 25.183 42.807 21.609 1.00 8.46 C +ATOM 1040 CG2 VAL E 131 25.457 40.664 22.649 1.00 10.29 C +ATOM 1041 N ASN E 132 21.621 43.138 22.106 1.00 13.11 N +ATOM 1042 CA ASN E 132 20.809 44.314 21.792 1.00 14.27 C +ATOM 1043 C ASN E 132 20.024 44.813 23.019 1.00 10.90 C +ATOM 1044 O ASN E 132 19.796 45.983 23.222 1.00 9.86 O +ATOM 1045 CB ASN E 132 19.949 44.067 20.553 1.00 8.88 C +ATOM 1046 CG ASN E 132 20.865 44.094 19.322 1.00 18.38 C +ATOM 1047 OD1 ASN E 132 21.221 45.169 18.850 1.00 14.05 O +ATOM 1048 ND2 ASN E 132 21.345 42.928 18.878 1.00 14.51 N +ATOM 1049 N LEU E 133 19.606 43.880 23.874 1.00 14.50 N +ATOM 1050 CA LEU E 133 18.856 44.212 25.071 1.00 6.21 C +ATOM 1051 C LEU E 133 19.732 45.024 26.018 1.00 10.73 C +ATOM 1052 O LEU E 133 19.223 45.911 26.682 1.00 11.05 O +ATOM 1053 CB LEU E 133 18.223 42.971 25.751 1.00 8.04 C +ATOM 1054 CG LEU E 133 17.045 42.349 24.968 1.00 7.81 C +ATOM 1055 CD1 LEU E 133 16.894 40.952 25.524 1.00 9.60 C +ATOM 1056 CD2 LEU E 133 15.753 43.099 25.328 1.00 6.96 C +ATOM 1057 N ALA E 134 21.040 44.748 26.047 1.00 7.61 N +ATOM 1058 CA ALA E 134 21.969 45.457 26.888 1.00 7.16 C +ATOM 1059 C ALA E 134 22.271 46.891 26.405 1.00 11.12 C +ATOM 1060 O ALA E 134 22.656 47.781 27.149 1.00 7.95 O +ATOM 1061 CB ALA E 134 23.205 44.662 27.228 1.00 7.56 C +ATOM 1062 N LYS E 135 22.101 47.185 25.157 1.00 5.94 N +ATOM 1063 CA LYS E 135 22.379 48.556 24.738 1.00 11.13 C +ATOM 1064 C LYS E 135 21.128 49.402 24.940 1.00 7.64 C +ATOM 1065 O LYS E 135 20.391 49.749 24.015 1.00 7.68 O +ATOM 1066 CB LYS E 135 22.825 48.433 23.301 1.00 9.26 C +ATOM 1067 CG LYS E 135 24.051 47.539 23.388 1.00 14.12 C +ATOM 1068 CD LYS E 135 24.884 47.564 22.117 1.00 18.25 C +ATOM 1069 CE LYS E 135 24.110 48.196 20.991 1.00 17.79 C +ATOM 1070 NZ LYS E 135 24.266 47.449 19.717 1.00 26.49 N +ATOM 1071 N SER E 136 20.852 49.684 26.203 1.00 3.36 N +ATOM 1072 CA SER E 136 19.687 50.416 26.449 1.00 7.68 C +ATOM 1073 C SER E 136 19.845 51.206 27.691 1.00 10.71 C +ATOM 1074 O SER E 136 20.732 50.968 28.517 1.00 10.65 O +ATOM 1075 CB SER E 136 18.512 49.457 26.586 1.00 12.58 C +ATOM 1076 OG SER E 136 18.723 48.589 27.679 1.00 3.34 O +ATOM 1077 N ARG E 137 18.938 52.170 27.780 1.00 9.23 N +ATOM 1078 CA ARG E 137 18.934 53.009 28.941 1.00 9.54 C +ATOM 1079 C ARG E 137 18.532 52.119 30.093 1.00 9.36 C +ATOM 1080 O ARG E 137 19.112 52.268 31.140 1.00 7.46 O +ATOM 1081 CB ARG E 137 18.031 54.239 28.764 1.00 11.67 C +ATOM 1082 CG ARG E 137 17.900 55.133 29.983 1.00 23.62 C +ATOM 1083 CD ARG E 137 17.534 56.553 29.558 1.00 39.83 C +ATOM 1084 NE ARG E 137 16.177 57.043 29.788 1.00 44.46 N +ATOM 1085 CZ ARG E 137 15.896 58.052 30.634 1.00 54.68 C +ATOM 1086 NH1 ARG E 137 16.878 58.603 31.330 1.00 38.91 N +ATOM 1087 NH2 ARG E 137 14.673 58.525 30.846 1.00 38.68 N +ATOM 1088 N TRP E 138 17.546 51.198 29.846 1.00 7.93 N +ATOM 1089 CA TRP E 138 17.075 50.301 30.881 1.00 7.66 C +ATOM 1090 C TRP E 138 18.230 49.624 31.632 1.00 9.32 C +ATOM 1091 O TRP E 138 18.376 49.595 32.831 1.00 9.07 O +ATOM 1092 CB TRP E 138 16.297 49.225 30.108 1.00 6.56 C +ATOM 1093 CG TRP E 138 15.904 47.998 30.928 1.00 8.11 C +ATOM 1094 CD1 TRP E 138 15.313 47.944 32.166 1.00 7.03 C +ATOM 1095 CD2 TRP E 138 16.001 46.639 30.467 1.00 5.39 C +ATOM 1096 NE1 TRP E 138 15.092 46.641 32.527 1.00 5.39 N +ATOM 1097 CE2 TRP E 138 15.469 45.808 31.481 1.00 9.27 C +ATOM 1098 CE3 TRP E 138 16.530 46.096 29.295 1.00 8.52 C +ATOM 1099 CZ2 TRP E 138 15.442 44.419 31.321 1.00 7.29 C +ATOM 1100 CZ3 TRP E 138 16.483 44.722 29.149 1.00 6.08 C +ATOM 1101 CH2 TRP E 138 15.945 43.909 30.149 1.00 5.94 C +ATOM 1102 N TYR E 139 19.074 48.983 30.858 1.00 9.53 N +ATOM 1103 CA TYR E 139 20.201 48.256 31.392 1.00 12.24 C +ATOM 1104 C TYR E 139 21.158 49.169 32.172 1.00 9.62 C +ATOM 1105 O TYR E 139 21.710 48.771 33.183 1.00 14.38 O +ATOM 1106 CB TYR E 139 20.862 47.648 30.141 1.00 13.69 C +ATOM 1107 CG TYR E 139 22.076 46.859 30.490 1.00 4.21 C +ATOM 1108 CD1 TYR E 139 21.943 45.526 30.858 1.00 17.09 C +ATOM 1109 CD2 TYR E 139 23.348 47.429 30.489 1.00 24.04 C +ATOM 1110 CE1 TYR E 139 23.087 44.795 31.212 1.00 21.79 C +ATOM 1111 CE2 TYR E 139 24.497 46.718 30.834 1.00 25.20 C +ATOM 1112 CZ TYR E 139 24.345 45.389 31.200 1.00 21.22 C +ATOM 1113 OH TYR E 139 25.426 44.623 31.519 1.00 33.59 O +ATOM 1114 N ASN E 140 21.317 50.420 31.752 1.00 11.12 N +ATOM 1115 CA ASN E 140 22.211 51.340 32.468 1.00 9.76 C +ATOM 1116 C ASN E 140 21.508 51.847 33.683 1.00 13.11 C +ATOM 1117 O ASN E 140 22.144 52.302 34.606 1.00 15.27 O +ATOM 1118 CB ASN E 140 22.578 52.534 31.583 1.00 11.52 C +ATOM 1119 CG ASN E 140 23.572 52.076 30.547 1.00 7.10 C +ATOM 1120 OD1 ASN E 140 23.258 51.612 29.424 1.00 11.14 O +ATOM 1121 ND2 ASN E 140 24.799 52.157 30.957 1.00 4.46 N +ATOM 1122 N GLN E 141 20.183 51.742 33.705 1.00 12.33 N +ATOM 1123 CA GLN E 141 19.404 52.203 34.866 1.00 2.81 C +ATOM 1124 C GLN E 141 19.360 51.177 35.956 1.00 14.29 C +ATOM 1125 O GLN E 141 19.659 51.458 37.135 1.00 10.28 O +ATOM 1126 CB GLN E 141 17.904 52.544 34.583 1.00 12.14 C +ATOM 1127 CG GLN E 141 17.706 53.766 33.628 1.00 12.49 C +ATOM 1128 CD GLN E 141 16.379 53.774 32.887 1.00 10.08 C +ATOM 1129 OE1 GLN E 141 15.823 52.642 32.546 1.00 13.76 O +ATOM 1130 NE2 GLN E 141 15.844 54.821 32.608 1.00 18.87 N +ATOM 1131 N THR E 142 18.933 49.980 35.570 1.00 9.55 N +ATOM 1132 CA THR E 142 18.769 48.865 36.507 1.00 7.07 C +ATOM 1133 C THR E 142 19.497 47.602 36.029 1.00 4.68 C +ATOM 1134 O THR E 142 18.901 46.586 35.712 1.00 11.56 O +ATOM 1135 CB THR E 142 17.272 48.579 36.878 1.00 9.70 C +ATOM 1136 OG1 THR E 142 16.578 47.987 35.769 1.00 9.25 O +ATOM 1137 CG2 THR E 142 16.454 49.775 37.444 1.00 4.80 C +ATOM 1138 N PRO E 143 20.809 47.660 35.927 1.00 13.02 N +ATOM 1139 CA PRO E 143 21.522 46.521 35.392 1.00 6.83 C +ATOM 1140 C PRO E 143 21.354 45.214 36.106 1.00 11.27 C +ATOM 1141 O PRO E 143 21.446 44.158 35.467 1.00 9.57 O +ATOM 1142 CB PRO E 143 23.003 46.842 35.460 1.00 10.63 C +ATOM 1143 CG PRO E 143 23.113 47.930 36.506 1.00 12.20 C +ATOM 1144 CD PRO E 143 21.750 48.610 36.590 1.00 12.30 C +ATOM 1145 N ASN E 144 21.186 45.249 37.422 1.00 10.86 N +ATOM 1146 CA ASN E 144 21.116 43.920 38.006 1.00 11.22 C +ATOM 1147 C ASN E 144 19.885 43.171 37.563 1.00 9.30 C +ATOM 1148 O ASN E 144 19.968 41.977 37.241 1.00 7.78 O +ATOM 1149 CB ASN E 144 21.206 44.044 39.507 1.00 13.21 C +ATOM 1150 CG ASN E 144 22.606 44.307 39.992 1.00 25.64 C +ATOM 1151 OD1 ASN E 144 23.599 43.770 39.461 1.00 27.49 O +ATOM 1152 ND2 ASN E 144 22.656 45.082 41.065 1.00 21.21 N +ATOM 1153 N AARG E 145 18.735 43.888 37.556 0.50 6.76 N +ATOM 1154 N BARG E 145 18.783 43.935 37.590 0.50 7.67 N +ATOM 1155 CA AARG E 145 17.422 43.395 37.135 0.50 4.27 C +ATOM 1156 CA BARG E 145 17.441 43.561 37.204 0.50 6.39 C +ATOM 1157 C AARG E 145 17.454 43.073 35.646 0.50 12.12 C +ATOM 1158 C BARG E 145 17.423 43.155 35.721 0.50 13.82 C +ATOM 1159 O AARG E 145 17.048 42.006 35.191 0.50 4.44 O +ATOM 1160 O BARG E 145 16.969 42.087 35.324 0.50 6.57 O +ATOM 1161 CB AARG E 145 16.325 44.433 37.421 0.50 5.46 C +ATOM 1162 CB BARG E 145 16.553 44.787 37.468 0.50 11.25 C +ATOM 1163 CG AARG E 145 15.102 44.458 36.507 0.50 1.00 C +ATOM 1164 CG BARG E 145 16.324 45.104 38.951 0.50 14.06 C +ATOM 1165 CD AARG E 145 13.927 43.864 37.262 0.50 5.45 C +ATOM 1166 CD BARG E 145 17.105 46.258 39.658 0.50 15.42 C +ATOM 1167 NE AARG E 145 12.516 43.877 36.799 0.50 1.00 N +ATOM 1168 NE BARG E 145 18.520 46.419 39.343 0.50 5.23 N +ATOM 1169 CZ AARG E 145 11.594 44.590 37.490 0.50 1.00 C +ATOM 1170 CZ BARG E 145 19.312 47.403 39.788 0.50 3.60 C +ATOM 1171 NH1AARG E 145 11.935 45.344 38.534 0.50 3.40 N +ATOM 1172 NH1BARG E 145 18.870 48.347 40.627 0.50 6.60 N +ATOM 1173 NH2AARG E 145 10.290 44.593 37.186 0.50 1.00 N +ATOM 1174 NH2BARG E 145 20.605 47.440 39.417 0.50 1.00 N +ATOM 1175 N ALA E 146 17.953 44.025 34.867 1.00 5.88 N +ATOM 1176 CA ALA E 146 18.044 43.809 33.464 1.00 3.02 C +ATOM 1177 C ALA E 146 18.876 42.575 33.184 1.00 10.62 C +ATOM 1178 O ALA E 146 18.549 41.741 32.345 1.00 8.80 O +ATOM 1179 CB ALA E 146 18.591 45.090 32.808 1.00 5.33 C +ATOM 1180 N LYS E 147 19.939 42.404 33.941 1.00 7.96 N +ATOM 1181 CA LYS E 147 20.750 41.210 33.714 1.00 11.34 C +ATOM 1182 C LYS E 147 20.022 39.872 33.958 1.00 11.70 C +ATOM 1183 O LYS E 147 20.216 38.886 33.185 1.00 11.22 O +ATOM 1184 CB LYS E 147 22.140 41.132 34.339 1.00 10.73 C +ATOM 1185 CG LYS E 147 23.190 42.196 34.056 1.00 25.38 C +ATOM 1186 CD LYS E 147 24.391 42.058 34.991 1.00 20.80 C +ATOM 1187 CE LYS E 147 25.355 43.227 34.922 1.00 24.54 C +ATOM 1188 NZ LYS E 147 25.623 43.850 36.240 1.00 38.72 N +ATOM 1189 N ARG E 148 19.172 39.821 35.000 1.00 9.02 N +ATOM 1190 CA ARG E 148 18.428 38.617 35.249 1.00 8.02 C +ATOM 1191 C ARG E 148 17.443 38.331 34.137 1.00 4.08 C +ATOM 1192 O ARG E 148 17.363 37.231 33.688 1.00 8.34 O +ATOM 1193 CB ARG E 148 17.646 38.784 36.511 1.00 7.48 C +ATOM 1194 CG ARG E 148 18.561 38.694 37.697 1.00 7.79 C +ATOM 1195 CD ARG E 148 17.800 38.225 38.921 1.00 12.36 C +ATOM 1196 NE ARG E 148 16.949 39.308 39.365 1.00 8.69 N +ATOM 1197 CZ ARG E 148 17.453 40.388 39.929 1.00 14.51 C +ATOM 1198 NH1 ARG E 148 18.777 40.505 40.060 1.00 17.69 N +ATOM 1199 NH2 ARG E 148 16.673 41.380 40.331 1.00 13.75 N +ATOM 1200 N VAL E 149 16.713 39.331 33.632 1.00 6.85 N +ATOM 1201 CA VAL E 149 15.737 39.237 32.530 1.00 3.40 C +ATOM 1202 C VAL E 149 16.421 38.842 31.224 1.00 9.04 C +ATOM 1203 O VAL E 149 15.965 37.990 30.457 1.00 8.14 O +ATOM 1204 CB VAL E 149 14.965 40.580 32.374 1.00 3.94 C +ATOM 1205 CG1 VAL E 149 14.099 40.602 31.098 1.00 6.48 C +ATOM 1206 CG2 VAL E 149 14.010 40.884 33.536 1.00 5.06 C +ATOM 1207 N ILE E 150 17.548 39.465 30.912 1.00 6.28 N +ATOM 1208 CA ILE E 150 18.256 39.113 29.700 1.00 8.09 C +ATOM 1209 C ILE E 150 18.770 37.688 29.776 1.00 10.36 C +ATOM 1210 O ILE E 150 18.881 37.008 28.757 1.00 13.15 O +ATOM 1211 CB ILE E 150 19.446 40.056 29.513 1.00 14.79 C +ATOM 1212 CG1 ILE E 150 19.048 41.535 29.526 1.00 9.31 C +ATOM 1213 CG2 ILE E 150 20.235 39.748 28.227 1.00 9.67 C +ATOM 1214 CD1 ILE E 150 20.241 42.425 29.143 1.00 9.22 C +ATOM 1215 N THR E 151 19.111 37.196 30.976 1.00 11.50 N +ATOM 1216 CA THR E 151 19.613 35.814 31.039 1.00 10.46 C +ATOM 1217 C THR E 151 18.485 34.875 30.747 1.00 4.76 C +ATOM 1218 O THR E 151 18.703 33.849 30.121 1.00 12.07 O +ATOM 1219 CB THR E 151 20.280 35.465 32.380 1.00 4.61 C +ATOM 1220 OG1 THR E 151 21.367 36.306 32.508 1.00 14.19 O +ATOM 1221 CG2 THR E 151 20.720 34.006 32.520 1.00 11.57 C +ATOM 1222 N THR E 152 17.284 35.252 31.173 1.00 11.41 N +ATOM 1223 CA THR E 152 16.103 34.436 30.944 1.00 6.35 C +ATOM 1224 C THR E 152 15.803 34.321 29.466 1.00 10.09 C +ATOM 1225 O THR E 152 15.406 33.286 28.964 1.00 10.32 O +ATOM 1226 CB THR E 152 14.944 35.018 31.760 1.00 7.09 C +ATOM 1227 OG1 THR E 152 15.346 35.219 33.124 1.00 5.80 O +ATOM 1228 CG2 THR E 152 13.730 34.135 31.723 1.00 1.00 C +ATOM 1229 N PHE E 153 15.917 35.419 28.754 1.00 6.52 N +ATOM 1230 CA PHE E 153 15.652 35.380 27.341 1.00 10.87 C +ATOM 1231 C PHE E 153 16.750 34.654 26.638 1.00 12.40 C +ATOM 1232 O PHE E 153 16.560 34.079 25.584 1.00 15.12 O +ATOM 1233 CB PHE E 153 15.808 36.757 26.727 1.00 10.50 C +ATOM 1234 CG PHE E 153 14.506 37.493 26.734 1.00 9.50 C +ATOM 1235 CD1 PHE E 153 13.349 36.935 26.179 1.00 11.10 C +ATOM 1236 CD2 PHE E 153 14.437 38.764 27.288 1.00 8.54 C +ATOM 1237 CE1 PHE E 153 12.152 37.632 26.178 1.00 9.32 C +ATOM 1238 CE2 PHE E 153 13.246 39.485 27.302 1.00 8.67 C +ATOM 1239 CZ PHE E 153 12.108 38.904 26.736 1.00 19.06 C +ATOM 1240 N ARG E 154 17.949 34.742 27.164 1.00 10.10 N +ATOM 1241 CA ARG E 154 19.049 34.122 26.505 1.00 8.41 C +ATOM 1242 C ARG E 154 18.965 32.632 26.512 1.00 13.34 C +ATOM 1243 O ARG E 154 19.139 31.988 25.459 1.00 14.00 O +ATOM 1244 CB ARG E 154 20.405 34.540 27.073 1.00 17.26 C +ATOM 1245 CG ARG E 154 21.517 34.028 26.179 1.00 18.26 C +ATOM 1246 CD ARG E 154 22.847 34.735 26.360 1.00 12.33 C +ATOM 1247 NE ARG E 154 23.208 34.588 27.768 1.00 13.47 N +ATOM 1248 CZ ARG E 154 23.664 33.431 28.256 1.00 22.51 C +ATOM 1249 NH1 ARG E 154 23.820 32.357 27.469 1.00 22.59 N +ATOM 1250 NH2 ARG E 154 23.941 33.343 29.568 1.00 26.09 N +ATOM 1251 N THR E 155 18.694 32.168 27.703 1.00 11.74 N +ATOM 1252 CA THR E 155 18.655 30.754 28.050 1.00 13.47 C +ATOM 1253 C THR E 155 17.364 30.028 28.005 1.00 19.90 C +ATOM 1254 O THR E 155 17.379 28.816 27.754 1.00 18.78 O +ATOM 1255 CB THR E 155 19.266 30.543 29.432 1.00 13.04 C +ATOM 1256 OG1 THR E 155 18.543 31.264 30.442 1.00 19.54 O +ATOM 1257 CG2 THR E 155 20.723 30.983 29.412 1.00 12.33 C +ATOM 1258 N GLY E 156 16.266 30.740 28.283 1.00 17.85 N +ATOM 1259 CA GLY E 156 14.980 30.117 28.289 1.00 13.06 C +ATOM 1260 C GLY E 156 14.791 29.305 29.563 1.00 9.49 C +ATOM 1261 O GLY E 156 13.838 28.498 29.673 1.00 15.82 O +ATOM 1262 N THR E 157 15.621 29.533 30.548 1.00 7.83 N +ATOM 1263 CA THR E 157 15.495 28.822 31.812 1.00 15.75 C +ATOM 1264 C THR E 157 15.285 29.737 32.995 1.00 9.53 C +ATOM 1265 O THR E 157 15.309 30.942 32.834 1.00 13.60 O +ATOM 1266 CB THR E 157 16.727 27.987 32.114 1.00 10.26 C +ATOM 1267 OG1 THR E 157 17.770 28.822 32.588 1.00 15.48 O +ATOM 1268 CG2 THR E 157 17.091 27.192 30.899 1.00 13.19 C +ATOM 1269 N TRP E 158 15.038 29.174 34.169 1.00 13.77 N +ATOM 1270 CA TRP E 158 14.822 30.023 35.341 1.00 16.32 C +ATOM 1271 C TRP E 158 16.087 30.242 36.114 1.00 15.11 C +ATOM 1272 O TRP E 158 16.051 30.702 37.247 1.00 13.76 O +ATOM 1273 CB TRP E 158 13.688 29.569 36.282 1.00 12.53 C +ATOM 1274 CG TRP E 158 12.352 29.687 35.637 1.00 18.53 C +ATOM 1275 CD1 TRP E 158 11.601 28.666 35.188 1.00 18.92 C +ATOM 1276 CD2 TRP E 158 11.586 30.868 35.394 1.00 13.85 C +ATOM 1277 NE1 TRP E 158 10.403 29.119 34.699 1.00 18.81 N +ATOM 1278 CE2 TRP E 158 10.347 30.462 34.822 1.00 24.05 C +ATOM 1279 CE3 TRP E 158 11.784 32.235 35.674 1.00 29.99 C +ATOM 1280 CZ2 TRP E 158 9.346 31.367 34.437 1.00 18.24 C +ATOM 1281 CZ3 TRP E 158 10.775 33.126 35.335 1.00 24.22 C +ATOM 1282 CH2 TRP E 158 9.585 32.701 34.695 1.00 18.39 C +ATOM 1283 N ASP E 159 17.214 29.882 35.505 1.00 14.67 N +ATOM 1284 CA ASP E 159 18.553 29.974 36.071 1.00 18.87 C +ATOM 1285 C ASP E 159 18.967 31.232 36.842 1.00 26.12 C +ATOM 1286 O ASP E 159 19.676 31.124 37.852 1.00 21.02 O +ATOM 1287 CB ASP E 159 19.596 29.691 35.009 1.00 25.29 C +ATOM 1288 CG ASP E 159 19.863 28.232 34.841 1.00 34.60 C +ATOM 1289 OD1 ASP E 159 19.292 27.495 35.749 1.00 26.31 O +ATOM 1290 OD2 ASP E 159 20.570 27.807 33.948 1.00 41.52 O +ATOM 1291 N ALA E 160 18.580 32.439 36.367 1.00 19.72 N +ATOM 1292 CA ALA E 160 18.946 33.667 37.051 1.00 14.55 C +ATOM 1293 C ALA E 160 18.152 33.972 38.326 1.00 21.06 C +ATOM 1294 O ALA E 160 18.562 34.820 39.132 1.00 20.84 O +ATOM 1295 CB ALA E 160 18.867 34.829 36.075 1.00 19.89 C +ATOM 1296 N TYR E 161 17.007 33.289 38.483 1.00 14.53 N +ATOM 1297 CA TYR E 161 16.079 33.412 39.580 1.00 16.63 C +ATOM 1298 C TYR E 161 16.261 32.372 40.682 1.00 30.25 C +ATOM 1299 O TYR E 161 15.799 32.575 41.794 1.00 27.38 O +ATOM 1300 CB TYR E 161 14.621 33.390 39.062 1.00 13.91 C +ATOM 1301 CG TYR E 161 14.444 34.690 38.325 1.00 16.13 C +ATOM 1302 CD1 TYR E 161 14.810 34.792 36.984 1.00 10.58 C +ATOM 1303 CD2 TYR E 161 14.010 35.820 39.023 1.00 21.01 C +ATOM 1304 CE1 TYR E 161 14.703 35.997 36.301 1.00 14.13 C +ATOM 1305 CE2 TYR E 161 13.918 37.051 38.367 1.00 15.33 C +ATOM 1306 CZ TYR E 161 14.266 37.108 37.013 1.00 12.94 C +ATOM 1307 OH TYR E 161 14.146 38.286 36.356 1.00 13.31 O +ATOM 1308 N LYS E 162 16.920 31.271 40.347 1.00 37.50 N +ATOM 1309 CA LYS E 162 17.228 30.126 41.207 1.00 43.73 C +ATOM 1310 C LYS E 162 18.458 30.294 42.094 1.00 37.32 C +ATOM 1311 O LYS E 162 18.457 29.644 43.177 1.00 38.14 O +ATOM 1312 CB LYS E 162 17.455 28.904 40.337 1.00 40.25 C +ATOM 1313 CG LYS E 162 16.335 27.910 40.480 1.00 52.18 C +ATOM 1314 CD LYS E 162 15.079 28.343 39.749 1.00 49.86 C +ATOM 1315 CE LYS E 162 14.523 27.251 38.847 1.00 63.85 C +ATOM 1316 NZ LYS E 162 15.520 26.750 37.886 1.00 58.77 N +ATOM 1317 N ASN E 163 19.398 31.025 41.679 1.00 38.17 N +TER 1318 ASN E 163 +ATOM 1319 N ALA S 166 11.607 52.383 34.794 1.00 11.50 N +ATOM 1320 CA ALA S 166 12.702 52.409 33.829 1.00 10.04 C +ATOM 1321 C ALA S 166 12.229 52.849 32.425 1.00 5.84 C +ATOM 1322 O ALA S 166 11.019 53.021 32.132 1.00 6.70 O +ATOM 1323 CB ALA S 166 13.498 51.083 33.763 1.00 8.17 C +HETATM 1324 N FGA S 167 13.244 52.985 31.556 1.00 8.06 N +HETATM 1325 CA FGA S 167 13.088 53.344 30.123 1.00 10.24 C +HETATM 1326 C FGA S 167 13.126 54.856 29.925 1.00 10.46 C +HETATM 1327 O FGA S 167 12.610 55.376 28.931 1.00 13.05 O +HETATM 1328 CB FGA S 167 14.213 52.722 29.269 1.00 4.88 C +HETATM 1329 CG FGA S 167 13.783 52.703 27.812 1.00 3.53 C +HETATM 1330 CD FGA S 167 14.899 52.094 27.018 1.00 6.48 C +HETATM 1331 OE1 FGA S 167 15.895 51.745 27.577 1.00 6.31 O +HETATM 1332 OXT FGA S 167 13.714 55.542 30.771 1.00 12.93 O +HETATM 1333 C API S 169 16.650 52.725 24.587 1.00 10.35 C +HETATM 1334 CA API S 169 15.705 51.535 24.787 1.00 7.75 C +HETATM 1335 C3 API S 169 15.086 51.118 23.467 1.00 9.17 C +HETATM 1336 C4 API S 169 16.065 50.846 22.342 1.00 6.31 C +HETATM 1337 C5 API S 169 16.965 49.708 22.681 1.00 8.50 C +HETATM 1338 C6 API S 169 17.738 49.168 21.464 1.00 8.62 C +HETATM 1339 C7 API S 169 16.885 48.233 20.633 1.00 12.75 C +HETATM 1340 OXT API S 169 17.838 52.587 24.666 1.00 9.33 O +HETATM 1341 O3 API S 169 16.406 48.737 19.530 1.00 8.49 O +HETATM 1342 O4 API S 169 16.661 47.076 20.933 1.00 13.44 O +HETATM 1343 N API S 169 14.706 51.986 25.737 1.00 8.24 N +HETATM 1344 N6 API S 169 18.835 48.241 21.932 1.00 5.99 N +HETATM 1345 N DAL S 170 16.130 53.915 24.417 1.00 8.63 N +HETATM 1346 CA DAL S 170 16.958 55.083 24.235 1.00 24.17 C +HETATM 1347 CB DAL S 170 16.321 56.394 24.733 1.00 30.20 C +HETATM 1348 C DAL S 170 17.335 55.218 22.790 1.00 32.54 C +HETATM 1349 O DAL S 170 16.693 54.552 21.946 1.00 27.41 O +HETATM 1350 OXT DAL S 170 18.286 55.960 22.546 1.00 18.81 O +TER 1351 DAL S 170 +HETATM 1352 C1 MUB A 1 9.749 50.449 39.569 1.00 9.35 C +HETATM 1353 C2 MUB A 1 10.190 51.296 38.366 1.00 9.65 C +HETATM 1354 C3 MUB A 1 8.848 51.763 37.789 1.00 8.55 C +HETATM 1355 C4 MUB A 1 8.105 50.533 37.344 1.00 5.51 C +HETATM 1356 C5 MUB A 1 7.692 49.700 38.563 1.00 7.36 C +HETATM 1357 C6 MUB A 1 7.063 48.412 38.077 1.00 5.72 C +HETATM 1358 C7 MUB A 1 12.605 51.459 38.171 1.00 12.78 C +HETATM 1359 C8 MUB A 1 13.748 52.374 38.250 1.00 5.31 C +HETATM 1360 C9 MUB A 1 10.131 53.399 36.493 1.00 9.39 C +HETATM 1361 C10 MUB A 1 11.242 53.466 35.514 1.00 12.75 C +HETATM 1362 C11 MUB A 1 9.040 54.443 36.233 1.00 3.05 C +HETATM 1363 O3 MUB A 1 9.498 52.123 36.557 1.00 7.07 O +HETATM 1364 O4 MUB A 1 6.827 51.206 37.119 1.00 7.12 O +HETATM 1365 O5 MUB A 1 8.687 49.503 39.612 1.00 7.44 O +HETATM 1366 O6 MUB A 1 8.330 47.893 37.724 1.00 4.10 O +HETATM 1367 O7 MUB A 1 12.684 50.300 37.644 1.00 10.10 O +HETATM 1368 O10 MUB A 1 11.832 54.557 35.414 1.00 13.97 O +HETATM 1369 N2 MUB A 1 11.481 51.770 38.808 1.00 9.42 N +HETATM 1370 C1 NAG A 2 6.499 50.988 35.782 1.00 8.40 C +HETATM 1371 C2 NAG A 2 4.970 50.850 35.680 1.00 9.95 C +HETATM 1372 C3 NAG A 2 4.471 50.923 34.247 1.00 8.02 C +HETATM 1373 C4 NAG A 2 5.020 52.221 33.674 1.00 12.51 C +HETATM 1374 C5 NAG A 2 6.544 52.113 33.769 1.00 6.32 C +HETATM 1375 C6 NAG A 2 7.399 53.152 33.074 1.00 16.08 C +HETATM 1376 C7 NAG A 2 3.753 49.600 37.376 1.00 13.73 C +HETATM 1377 C8 NAG A 2 3.362 48.234 37.810 1.00 8.71 C +HETATM 1378 N2 NAG A 2 4.535 49.635 36.315 1.00 7.22 N +HETATM 1379 O3 NAG A 2 3.052 51.024 34.307 1.00 11.78 O +HETATM 1380 O4 NAG A 2 4.604 52.346 32.331 1.00 11.96 O +HETATM 1381 O5 NAG A 2 6.897 52.172 35.137 1.00 9.13 O +HETATM 1382 O6 NAG A 2 6.648 54.340 33.108 1.00 20.15 O +HETATM 1383 O7 NAG A 2 3.361 50.614 37.926 1.00 13.10 O +HETATM 1384 C1 BME E 174 2.094 33.449 31.071 1.00 26.58 C +HETATM 1385 C2 BME E 174 0.951 32.578 31.669 1.00 53.32 C +HETATM 1386 O1 BME E 174 3.253 32.645 30.782 1.00 36.57 O +HETATM 1387 S2 BME E 174 0.664 32.875 33.436 1.00 68.58 S +HETATM 1388 O HOH E 175 21.918 51.754 39.049 1.00 44.89 O +HETATM 1389 O HOH E 176 16.989 33.072 34.253 1.00 18.14 O +HETATM 1390 O HOH E 177 5.676 23.778 25.247 1.00 9.23 O +HETATM 1391 O HOH E 178 -4.284 56.514 40.529 1.00 53.40 O +HETATM 1392 O HOH E 179 1.685 46.064 44.632 1.00 13.16 O +HETATM 1393 O HOH E 180 21.984 39.554 38.004 1.00 42.65 O +HETATM 1394 O HOH E 181 5.322 28.884 21.782 1.00 32.88 O +HETATM 1395 O HOH E 183 -6.028 40.346 38.538 1.00 51.16 O +HETATM 1396 O HOH E 184 -4.344 42.600 54.789 1.00 19.32 O +HETATM 1397 O HOH E 185 -7.944 41.968 38.732 1.00 49.44 O +HETATM 1398 O HOH E 186 -2.699 35.954 45.221 1.00 38.45 O +HETATM 1399 O HOH E 187 7.603 27.994 43.327 1.00 51.68 O +HETATM 1400 O HOH E 188 21.854 55.928 31.838 1.00 38.55 O +HETATM 1401 O HOH E 189 1.925 46.012 41.926 1.00 10.43 O +HETATM 1402 O HOH E 191 9.995 61.475 42.387 1.00 33.73 O +HETATM 1403 O HOH E 192 16.249 59.388 44.120 1.00 46.86 O +HETATM 1404 O HOH E 193 4.245 34.934 16.272 1.00 31.79 O +HETATM 1405 O HOH E 194 24.837 36.846 24.279 1.00 26.17 O +HETATM 1406 O HOH E 195 4.511 33.005 33.623 1.00 17.60 O +HETATM 1407 O HOH E 196 -4.944 55.080 56.304 1.00 43.77 O +HETATM 1408 O HOH E 197 11.744 52.617 24.942 1.00 1.68 O +HETATM 1409 O HOH E 200 6.419 59.104 31.519 1.00 32.35 O +HETATM 1410 O HOH E 202 -5.785 49.103 34.959 1.00 57.14 O +HETATM 1411 O HOH E 203 -2.481 35.640 41.849 1.00 50.82 O +HETATM 1412 O HOH E 204 10.176 47.806 43.488 1.00 17.67 O +HETATM 1413 O HOH E 206 5.501 52.982 28.248 1.00 14.30 O +HETATM 1414 O HOH E 208 12.271 44.014 33.212 1.00 8.24 O +HETATM 1415 O HOH E 209 20.382 56.064 40.553 1.00 49.34 O +HETATM 1416 O HOH E 211 21.115 38.501 40.018 1.00 32.82 O +HETATM 1417 O HOH E 213 11.174 29.613 22.016 1.00 15.95 O +HETATM 1418 O HOH E 214 10.065 32.357 15.682 1.00 36.83 O +HETATM 1419 O HOH E 215 -9.574 46.190 30.904 1.00 30.93 O +HETATM 1420 O HOH E 217 20.457 28.949 21.289 1.00 49.93 O +HETATM 1421 O HOH E 223 3.276 28.223 37.120 1.00 19.76 O +HETATM 1422 O HOH E 226 -0.098 34.581 22.773 0.50 3.62 O +HETATM 1423 O HOH E 229 12.910 49.291 43.703 1.00 36.17 O +HETATM 1424 O HOH E 235 21.053 32.066 20.459 1.00 43.51 O +HETATM 1425 O HOH E 236 13.898 51.259 46.330 1.00 39.93 O +HETATM 1426 O HOH E 238 21.172 30.669 24.381 1.00 36.70 O +HETATM 1427 O HOH E 240 -3.266 33.616 43.993 1.00 45.49 O +HETATM 1428 O HOH E 242 -4.024 50.804 30.726 1.00 38.46 O +HETATM 1429 O HOH E 244 5.749 34.088 46.467 1.00 58.36 O +HETATM 1430 O HOH E 245 18.464 36.004 42.725 1.00 34.65 O +HETATM 1431 O HOH E 247 13.599 53.517 48.833 1.00 55.23 O +HETATM 1432 O HOH E 249 23.918 41.228 29.979 1.00 23.57 O +HETATM 1433 O HOH E 250 26.371 43.177 26.850 1.00 44.17 O +HETATM 1434 O HOH E 251 25.395 45.275 24.248 1.00 33.72 O +HETATM 1435 O HOH E 253 7.470 43.276 16.251 1.00 27.55 O +HETATM 1436 O HOH E 254 3.174 52.497 28.167 1.00 14.96 O +HETATM 1437 O HOH E 256 -3.195 45.286 15.248 1.00 48.43 O +HETATM 1438 O HOH E 258 7.694 56.873 52.963 1.00 32.72 O +HETATM 1439 O HOH E 263 13.831 45.501 44.305 1.00 35.59 O +HETATM 1440 O HOH E 265 1.450 49.953 29.086 1.00 37.73 O +HETATM 1441 O HOH E 268 -0.005 42.366 15.014 1.00 40.57 O +HETATM 1442 O HOH E 273 2.616 29.379 34.236 1.00 25.41 O +HETATM 1443 O HOH E 274 1.697 47.215 34.392 1.00 16.22 O +HETATM 1444 O HOH E 275 9.198 53.496 29.739 1.00 16.09 O +HETATM 1445 O HOH E 276 9.369 49.225 17.403 1.00 36.70 O +HETATM 1446 O HOH E 280 1.225 52.243 38.458 1.00 21.70 O +HETATM 1447 O HOH E 283 6.460 36.008 48.228 1.00 59.48 O +HETATM 1448 O HOH E 285 13.681 43.670 47.034 1.00 58.08 O +HETATM 1449 O HOH E 289 -0.365 49.611 22.915 1.00 21.11 O +HETATM 1450 O HOH E 290 10.657 33.770 18.735 1.00 11.70 O +HETATM 1451 O HOH E 293 20.574 31.296 17.786 1.00 59.75 O +HETATM 1452 O HOH E 299 2.728 47.906 32.406 1.00 25.80 O +HETATM 1453 O HOH E 300 28.845 49.794 29.176 1.00 30.03 O +HETATM 1454 O HOH E 301 5.997 42.718 14.583 1.00 50.39 O +HETATM 1455 O HOH E 302 5.719 29.477 18.376 1.00 62.75 O +HETATM 1456 O HOH E 303 18.032 53.383 38.784 1.00 15.71 O +HETATM 1457 O HOH E 304 14.199 50.273 41.514 1.00 16.25 O +HETATM 1458 O HOH E 311 21.878 35.102 18.258 1.00 22.71 O +HETATM 1459 O HOH E 316 26.954 43.889 40.827 1.00 57.55 O +HETATM 1460 O HOH E 317 -1.256 43.923 56.152 1.00 42.86 O +HETATM 1461 O HOH E 320 -7.805 40.780 40.692 1.00 34.38 O +HETATM 1462 O HOH E 321 21.642 54.592 36.941 1.00 46.40 O +HETATM 1463 O HOH E 326 -5.698 49.001 30.222 1.00 33.19 O +HETATM 1464 O HOH E 329 6.297 31.457 32.543 1.00 31.96 O +HETATM 1465 O HOH E 330 1.835 54.722 26.893 1.00 29.62 O +HETATM 1466 O HOH E 332 -1.097 48.651 62.747 1.00 36.36 O +HETATM 1467 O HOH E 333 -4.811 59.539 56.055 1.00 37.56 O +HETATM 1468 O HOH E 334 -0.892 54.684 40.961 1.00 38.01 O +HETATM 1469 O HOH E 376 -0.406 34.268 27.581 0.50 2.47 O +HETATM 1470 O HOH E 377 26.192 40.632 32.230 1.00 61.37 O +HETATM 1471 O HOH E 378 1.366 67.674 45.496 1.00 48.00 O +HETATM 1472 O HOH E 379 -3.753 53.112 56.156 1.00 23.50 O +HETATM 1473 O HOH E 381 6.236 55.184 23.855 1.00 57.82 O +HETATM 1474 O HOH E 391 27.045 50.426 31.632 1.00 55.76 O +HETATM 1475 O HOH E 394 7.106 26.875 25.586 1.00 28.67 O +HETATM 1476 O HOH E 397 13.583 53.510 19.958 1.00 35.38 O +HETATM 1477 O HOH E 398 6.729 53.128 21.414 1.00 37.56 O +HETATM 1478 O HOH E 403 16.659 62.387 28.815 1.00 39.73 O +HETATM 1479 O HOH E 407 22.030 35.393 10.761 1.00 54.22 O +HETATM 1480 O HOH E 434 4.337 56.267 54.137 1.00 42.28 O +HETATM 1481 O HOH E 435 -0.352 62.231 36.929 1.00 47.91 O +HETATM 1482 O HOH E 436 21.074 26.449 31.618 1.00 64.59 O +HETATM 1483 O HOH E 441 14.246 43.896 36.181 0.50 10.66 O +HETATM 1484 O HOH E 442 12.861 45.012 37.611 0.50 12.48 O +HETATM 1485 O HOH E 443 10.959 43.979 36.876 0.50 8.38 O +HETATM 1486 O HOH E 444 19.417 46.715 39.015 0.50 11.68 O +HETATM 1487 O HOH E 445 19.829 48.507 40.484 0.50 17.44 O +HETATM 1488 O HOH E 446 22.737 48.422 40.372 0.50 17.34 O +HETATM 1489 O HOH E 451 -5.617 45.440 35.123 1.00 24.52 O +HETATM 1490 O HOH E 453 23.932 29.684 21.981 1.00 53.76 O +HETATM 1491 O HOH E 454 3.403 60.718 36.918 1.00 31.61 O +HETATM 1492 O HOH E 455 9.783 56.101 32.706 1.00 26.11 O +HETATM 1493 O HOH E 457 22.913 34.467 14.089 1.00 34.34 O +HETATM 1494 O HOH E 473 14.355 61.810 39.151 1.00 41.09 O +HETATM 1495 O HOH E 477 -3.362 49.110 38.923 1.00 44.61 O +HETATM 1496 O HOH E 478 17.576 61.282 40.831 1.00 55.72 O +HETATM 1497 O HOH E 488 11.599 27.797 28.110 1.00 25.96 O +HETATM 1498 O HOH E 489 8.327 34.540 44.726 1.00 34.14 O +HETATM 1499 O HOH E 490 9.421 47.333 47.120 1.00 24.83 O +HETATM 1500 O HOH E 491 25.415 48.663 27.953 1.00 25.04 O +HETATM 1501 O HOH E 493 6.148 55.436 28.815 1.00 44.76 O +HETATM 1502 O HOH E 495 1.772 31.772 28.847 1.00 32.16 O +HETATM 1503 O HOH E 497 -1.455 50.119 31.348 1.00 30.01 O +HETATM 1504 O HOH E 512 5.734 28.898 33.778 1.00 46.56 O +HETATM 1505 O HOH E 513 17.035 59.856 37.469 1.00 39.91 O +HETATM 1506 O HOH E 514 16.156 55.877 45.990 1.00 54.90 O +HETATM 1507 O HOH E 515 -6.370 57.622 57.345 1.00 35.57 O +HETATM 1508 O HOH E 517 20.423 37.509 13.445 1.00 39.60 O +HETATM 1509 O HOH E 532 -4.207 60.029 38.871 1.00 51.80 O +HETATM 1510 O HOH E 533 17.543 62.724 35.404 1.00 62.39 O +HETATM 1511 O HOH E 534 12.543 55.323 24.357 1.00 63.36 O +HETATM 1512 O HOH E 537 21.146 28.302 40.117 1.00 54.54 O +HETATM 1513 O HOH E 538 -2.195 60.129 52.081 1.00 62.52 O +HETATM 1514 O HOH E 542 18.284 58.084 35.183 1.00 46.57 O +HETATM 1515 O HOH S 182 1.505 53.565 35.363 1.00 25.23 O +HETATM 1516 O HOH S 190 16.611 51.422 18.460 1.00 26.55 O +HETATM 1517 O HOH S 207 12.492 48.295 39.908 1.00 18.12 O +HETATM 1518 O HOH S 212 16.473 60.278 17.083 1.00 37.17 O +HETATM 1519 O HOH S 225 10.749 54.347 27.410 1.00 18.32 O +HETATM 1520 O HOH S 239 1.689 54.936 30.704 1.00 61.70 O +HETATM 1521 O HOH S 270 14.384 56.317 26.942 1.00 60.70 O +HETATM 1522 O HOH S 281 1.918 51.865 30.338 1.00 20.46 O +HETATM 1523 O HOH S 306 11.114 57.972 29.440 1.00 35.20 O +HETATM 1524 O HOH S 324 20.274 47.641 19.729 1.00 10.76 O +HETATM 1525 O HOH S 456 12.769 56.348 33.570 1.00 19.46 O +HETATM 1526 O HOH S 496 0.529 49.398 35.457 1.00 36.82 O +HETATM 1527 O HOH S 498 15.576 59.087 24.595 1.00 54.60 O +CONECT 237 1352 +CONECT 1319 1361 +CONECT 1321 1324 +CONECT 1324 1321 1325 +CONECT 1325 1324 1326 1328 +CONECT 1326 1325 1327 1332 +CONECT 1327 1326 +CONECT 1328 1325 1329 +CONECT 1329 1328 1330 +CONECT 1330 1329 1331 1343 +CONECT 1331 1330 +CONECT 1332 1326 +CONECT 1333 1334 1340 1345 +CONECT 1334 1333 1335 1343 +CONECT 1335 1334 1336 +CONECT 1336 1335 1337 +CONECT 1337 1336 1338 +CONECT 1338 1337 1339 1344 +CONECT 1339 1338 1341 1342 +CONECT 1340 1333 +CONECT 1341 1339 +CONECT 1342 1339 +CONECT 1343 1330 1334 +CONECT 1344 1338 +CONECT 1345 1333 1346 +CONECT 1346 1345 1347 1348 +CONECT 1347 1346 +CONECT 1348 1346 1349 1350 +CONECT 1349 1348 +CONECT 1350 1348 +CONECT 1352 237 1353 1365 +CONECT 1353 1352 1354 1369 +CONECT 1354 1353 1355 1363 +CONECT 1355 1354 1356 1364 +CONECT 1356 1355 1357 1365 +CONECT 1357 1356 1366 +CONECT 1358 1359 1367 1369 +CONECT 1359 1358 +CONECT 1360 1361 1362 1363 +CONECT 1361 1319 1360 1368 +CONECT 1362 1360 +CONECT 1363 1354 1360 +CONECT 1364 1355 1370 +CONECT 1365 1352 1356 +CONECT 1366 1357 +CONECT 1367 1358 +CONECT 1368 1361 +CONECT 1369 1353 1358 +CONECT 1370 1364 1371 1381 +CONECT 1371 1370 1372 1378 +CONECT 1372 1371 1373 1379 +CONECT 1373 1372 1374 1380 +CONECT 1374 1373 1375 1381 +CONECT 1375 1374 1382 +CONECT 1376 1377 1378 1383 +CONECT 1377 1376 +CONECT 1378 1371 1376 +CONECT 1379 1372 +CONECT 1380 1373 +CONECT 1381 1370 1374 +CONECT 1382 1375 +CONECT 1383 1376 +CONECT 1384 1385 1386 +CONECT 1385 1384 1387 +CONECT 1386 1384 +CONECT 1387 1385 +MASTER 315 0 6 10 3 0 0 6 1503 2 66 14 +END diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..fbb4b17 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,104 @@ +"""Test-session setup: reach the sibling checkouts, in a safe order. + +Two hosts sit beside QuEst — imp-tricks for fluorescence machinery, ChiSurf for +presentation — and both are used from source checkouts rather than installs +(okf/workflows/environment.md). + +**ChiSurf is imported here, first, on purpose.** It pulls in tttrlib, and +SWIG extensions share one global type table: whichever registers a +``std::vector`` first owns the entry, so importing IMP before tttrlib +has been observed to destabilise the process. Importing ChiSurf before anything +touches IMP puts the ordering beyond doubt for the whole session. +""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +if str(REPO_ROOT) not in sys.path: + # This machine has `quest` installed editable from a *different* checkout; + # the tests must exercise this one. + sys.path.insert(0, str(REPO_ROOT)) + +# Numba's threading layer, chosen before anything imports numba. +# +# ChiSurf brings tttrlib, which carries its own OpenMP runtime. With numba's +# *workqueue* layer in the same process, building ChiSurf's Qt forms and then +# running QuEst's parallel kernels aborts the interpreter +# (`Fatal Python error: Aborted`, reproducible). Both `omp` and `tbb` are +# stable; `omp` keeps one OpenMP runtime for everyone. +os.environ.setdefault("NUMBA_THREADING_LAYER", "omp") + +# Numba's thread count, pinned for the same reason and at the same moment. +# +# Numba re-reads its configuration on every *fresh* compile, and raises if the +# value it computes then differs from the number of threads already launched: +# +# RuntimeError: Cannot set NUMBA_NUM_THREADS to a different value once the +# threads have been launched (currently have 7, trying to set 8) +# +# With no `NUMBA_NUM_THREADS` set, the value it computes is a *default* derived +# from the machine, which something else in the process had already changed by +# the time the first cold compile happened. The failure is therefore invisible +# until the numba cache is cold — a warm cache never recompiles, so a green +# suite says nothing. Reproduce with: +# +# find quest -name '__pycache__' -exec sh -c 'rm -f "$1"/*.nbi "$1"/*.nbc' _ {} \; +# +# An explicit value removes the recomputation: what is read on reload is what +# was read at launch. `setdefault`, so a caller can still choose. +os.environ.setdefault("NUMBA_NUM_THREADS", str(max(1, (os.cpu_count() or 1)))) + +#: Where ChiSurf lives unless told otherwise. Exported so subprocesses and +#: `quest.chisurf_host` agree without every caller setting PYTHONPATH. +DEFAULT_CHISURF_ROOT = Path.home() / "dev" / "chisurf" +os.environ.setdefault("CHISURF_ROOT", str(DEFAULT_CHISURF_ROOT)) + +#: Same for imp-tricks. +DEFAULT_IMP_TRICKS_SRC = Path.home() / "dev" / "imp-tricks" / "src" +os.environ.setdefault("IMP_TRICKS_SRC", str(DEFAULT_IMP_TRICKS_SRC)) + + +def _qt_binding_available() -> bool: + import importlib.util + + return any( + importlib.util.find_spec(name) is not None + for name in ("PyQt5", "PyQt6", "PySide2", "PySide6") + ) + + +def _import_chisurf_first() -> None: + """Load ChiSurf ahead of IMP — but only where it is actually used. + + Only the AutoForm tests need ChiSurf, and they need Qt, so an interpreter + without a Qt binding gains nothing from the import and pays a lot for it: + ChiSurf drags in tttrlib, mdtraj, pandas and pyarrow, and in the *web* + environment that extra footprint is enough to make Chromium die mid-test + ("Page crashed") once the rest of the suite has run. Reproducible: the + browser suite passes alone, fails after `test_pdb_id_support.py`, and passes + again with `CHISURF_ROOT=/nonexistent`. + + Where Qt *is* present, importing ChiSurf first is what keeps the process + stable: it and IMP both wrap C++ through SWIG, which keeps one global type + table. + """ + + if not _qt_binding_available(): + return + + from quest.chisurf_host import enable_chisurf + + if not enable_chisurf(): + return + try: + import chisurf # noqa: F401 + except Exception: + # A checkout that cannot be imported is not fatal: QuEst runs standalone. + pass + + +_import_chisurf_first() diff --git a/tests/data/mc4r_dimer.cif b/tests/data/mc4r_dimer.cif new file mode 100644 index 0000000..d22ee66 --- /dev/null +++ b/tests/data/mc4r_dimer.cif @@ -0,0 +1,11388 @@ +# By using this file you agree to the legally binding terms of use found at alphafoldserver.com/output-terms +data_7bef11920e4868f7 +# +_entry.id 7bef11920e4868f7 +# +loop_ +_atom_type.symbol +C +N +O +S +# +loop_ +_audit_author.name +_audit_author.pdbx_ordinal +"Google DeepMind" 1 +"Isomorphic Labs" 2 +# +_audit_conform.dict_location https://raw.githubusercontent.com/ihmwg/ModelCIF/master/dist/mmcif_ma.dic +_audit_conform.dict_name mmcif_ma.dic +_audit_conform.dict_version 1.4.5 +# +loop_ +_chem_comp.formula +_chem_comp.formula_weight +_chem_comp.id +_chem_comp.mon_nstd_flag +_chem_comp.name +_chem_comp.pdbx_smiles +_chem_comp.pdbx_synonyms +_chem_comp.type +"C3 H7 N O2" 89.093 ALA y ALANINE C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N4 O2" 175.209 ARG y ARGININE N[C@@H](CCCNC(N)=[NH2+])C(O)=O ? "L-PEPTIDE LINKING" +"C4 H8 N2 O3" 132.118 ASN y ASPARAGINE N[C@@H](CC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H7 N O4" 133.103 ASP y "ASPARTIC ACID" N[C@@H](CC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C3 H7 N O2 S" 121.158 CYS y CYSTEINE N[C@@H](CS)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H10 N2 O3" 146.144 GLN y GLUTAMINE N[C@@H](CCC(N)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O4" 147.129 GLU y "GLUTAMIC ACID" N[C@@H](CCC(O)=O)C(O)=O ? "L-PEPTIDE LINKING" +"C2 H5 N O2" 75.067 GLY y GLYCINE NCC(O)=O ? "PEPTIDE LINKING" +"C6 H10 N3 O2" 156.162 HIS y HISTIDINE N[C@@H](Cc1c[nH]c[nH+]1)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 ILE y ISOLEUCINE CC[C@H](C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H13 N O2" 131.173 LEU y LEUCINE CC(C)C[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C6 H15 N2 O2" 147.195 LYS y LYSINE N[C@@H](CCCC[NH3+])C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2 S" 149.211 MET y METHIONINE CSCC[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O2" 165.189 PHE y PHENYLALANINE N[C@@H](Cc1ccccc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H9 N O2" 115.130 PRO y PROLINE OC(=O)[C@@H]1CCCN1 ? "L-PEPTIDE LINKING" +"C3 H7 N O3" 105.093 SER y SERINE N[C@@H](CO)C(O)=O ? "L-PEPTIDE LINKING" +"C4 H9 N O3" 119.119 THR y THREONINE C[C@@H](O)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +"C11 H12 N2 O2" 204.225 TRP y TRYPTOPHAN N[C@@H](Cc1c[nH]c2ccccc12)C(O)=O ? "L-PEPTIDE LINKING" +"C9 H11 N O3" 181.189 TYR y TYROSINE N[C@@H](Cc1ccc(O)cc1)C(O)=O ? "L-PEPTIDE LINKING" +"C5 H11 N O2" 117.146 VAL y VALINE CC(C)[C@H](N)C(O)=O ? "L-PEPTIDE LINKING" +# +_citation.book_publisher ? +_citation.country UK +_citation.id primary +_citation.journal_full Nature +_citation.journal_id_ASTM NATUAS +_citation.journal_id_CSD 0006 +_citation.journal_id_ISSN 0028-0836 +_citation.journal_volume 630 +_citation.page_first 493 +_citation.page_last 500 +_citation.pdbx_database_id_DOI 10.1038/s41586-024-07487-w +_citation.pdbx_database_id_PubMed 38718835 +_citation.title "Accurate structure prediction of biomolecular interactions with AlphaFold 3" +_citation.year 2024 +# +loop_ +_citation_author.citation_id +_citation_author.name +_citation_author.ordinal +primary "Google DeepMind" 1 +primary "Isomorphic Labs" 2 +# +loop_ +_entity.id +_entity.pdbx_description +_entity.type +1 . polymer +2 . polymer +# +loop_ +_entity_poly.entity_id +_entity_poly.pdbx_strand_id +_entity_poly.type +1 A polypeptide(L) +2 B polypeptide(L) +# +loop_ +_entity_poly_seq.entity_id +_entity_poly_seq.hetero +_entity_poly_seq.mon_id +_entity_poly_seq.num +1 n MET 1 +1 n ASN 2 +1 n SER 3 +1 n THR 4 +1 n ALA 5 +1 n GLN 6 +1 n GLN 7 +1 n GLY 8 +1 n LEU 9 +1 n ILE 10 +1 n PRO 11 +1 n CYS 12 +1 n TYR 13 +1 n LEU 14 +1 n ASN 15 +1 n GLY 16 +1 n SER 17 +1 n LEU 18 +1 n CYS 19 +1 n PRO 20 +1 n GLY 21 +1 n THR 22 +1 n LEU 23 +1 n PRO 24 +1 n GLU 25 +1 n LYS 26 +1 n ASP 27 +1 n VAL 28 +1 n SER 29 +1 n GLY 30 +1 n GLU 31 +1 n GLU 32 +1 n LYS 33 +1 n ASP 34 +1 n SER 35 +1 n SER 36 +1 n ALA 37 +1 n GLY 38 +1 n CYS 39 +1 n SER 40 +1 n GLU 41 +1 n GLN 42 +1 n LEU 43 +1 n LEU 44 +1 n ILE 45 +1 n SER 46 +1 n THR 47 +1 n GLU 48 +1 n VAL 49 +1 n PHE 50 +1 n LEU 51 +1 n THR 52 +1 n LEU 53 +1 n GLY 54 +1 n ILE 55 +1 n ILE 56 +1 n SER 57 +1 n LEU 58 +1 n LEU 59 +1 n GLU 60 +1 n ASN 61 +1 n ILE 62 +1 n LEU 63 +1 n VAL 64 +1 n VAL 65 +1 n ALA 66 +1 n ALA 67 +1 n ILE 68 +1 n ILE 69 +1 n LYS 70 +1 n ASN 71 +1 n GLN 72 +1 n ASN 73 +1 n LEU 74 +1 n HIS 75 +1 n SER 76 +1 n PRO 77 +1 n MET 78 +1 n TYR 79 +1 n PHE 80 +1 n PHE 81 +1 n ILE 82 +1 n CYS 83 +1 n SER 84 +1 n LEU 85 +1 n ALA 86 +1 n VAL 87 +1 n ALA 88 +1 n ASP 89 +1 n MET 90 +1 n LEU 91 +1 n VAL 92 +1 n SER 93 +1 n VAL 94 +1 n SER 95 +1 n ASN 96 +1 n ALA 97 +1 n SER 98 +1 n GLU 99 +1 n THR 100 +1 n ILE 101 +1 n VAL 102 +1 n ILE 103 +1 n ALA 104 +1 n LEU 105 +1 n ILE 106 +1 n ASN 107 +1 n GLY 108 +1 n GLY 109 +1 n SER 110 +1 n LEU 111 +1 n THR 112 +1 n ILE 113 +1 n PRO 114 +1 n VAL 115 +1 n THR 116 +1 n PHE 117 +1 n ILE 118 +1 n LYS 119 +1 n SER 120 +1 n MET 121 +1 n ASP 122 +1 n ASN 123 +1 n VAL 124 +1 n PHE 125 +1 n ASP 126 +1 n SER 127 +1 n MET 128 +1 n ILE 129 +1 n CYS 130 +1 n SER 131 +1 n SER 132 +1 n LEU 133 +1 n LEU 134 +1 n ALA 135 +1 n SER 136 +1 n ILE 137 +1 n CYS 138 +1 n SER 139 +1 n LEU 140 +1 n LEU 141 +1 n ALA 142 +1 n ILE 143 +1 n ALA 144 +1 n ILE 145 +1 n ASP 146 +1 n ARG 147 +1 n TYR 148 +1 n ILE 149 +1 n THR 150 +1 n ILE 151 +1 n PHE 152 +1 n TYR 153 +1 n ALA 154 +1 n LEU 155 +1 n ARG 156 +1 n TYR 157 +1 n HIS 158 +1 n ASN 159 +1 n ILE 160 +1 n VAL 161 +1 n THR 162 +1 n ILE 163 +1 n ARG 164 +1 n ARG 165 +1 n ALA 166 +1 n LEU 167 +1 n LEU 168 +1 n VAL 169 +1 n ILE 170 +1 n ALA 171 +1 n GLY 172 +1 n ILE 173 +1 n TRP 174 +1 n THR 175 +1 n CYS 176 +1 n CYS 177 +1 n THR 178 +1 n VAL 179 +1 n SER 180 +1 n GLY 181 +1 n ILE 182 +1 n LEU 183 +1 n PHE 184 +1 n ILE 185 +1 n ILE 186 +1 n TYR 187 +1 n SER 188 +1 n GLU 189 +1 n SER 190 +1 n THR 191 +1 n MET 192 +1 n VAL 193 +1 n LEU 194 +1 n ILE 195 +1 n CYS 196 +1 n LEU 197 +1 n ILE 198 +1 n THR 199 +1 n MET 200 +1 n PHE 201 +1 n PHE 202 +1 n THR 203 +1 n MET 204 +1 n LEU 205 +1 n VAL 206 +1 n LEU 207 +1 n MET 208 +1 n ALA 209 +1 n SER 210 +1 n LEU 211 +1 n TYR 212 +1 n VAL 213 +1 n HIS 214 +1 n MET 215 +1 n PHE 216 +1 n LEU 217 +1 n LEU 218 +1 n ALA 219 +1 n ARG 220 +1 n GLN 221 +1 n HIS 222 +1 n MET 223 +1 n LYS 224 +1 n ARG 225 +1 n ILE 226 +1 n ALA 227 +1 n ALA 228 +1 n LEU 229 +1 n PRO 230 +1 n GLY 231 +1 n ASN 232 +1 n ALA 233 +1 n PRO 234 +1 n ILE 235 +1 n GLN 236 +1 n GLN 237 +1 n ARG 238 +1 n ALA 239 +1 n ASN 240 +1 n MET 241 +1 n LYS 242 +1 n GLY 243 +1 n ALA 244 +1 n ILE 245 +1 n THR 246 +1 n LEU 247 +1 n THR 248 +1 n ILE 249 +1 n LEU 250 +1 n LEU 251 +1 n GLY 252 +1 n VAL 253 +1 n PHE 254 +1 n VAL 255 +1 n VAL 256 +1 n CYS 257 +1 n TRP 258 +1 n ALA 259 +1 n PRO 260 +1 n PHE 261 +1 n PHE 262 +1 n LEU 263 +1 n HIS 264 +1 n LEU 265 +1 n ILE 266 +1 n LEU 267 +1 n MET 268 +1 n ILE 269 +1 n THR 270 +1 n CYS 271 +1 n PRO 272 +1 n ARG 273 +1 n ASN 274 +1 n PRO 275 +1 n TYR 276 +1 n CYS 277 +1 n THR 278 +1 n CYS 279 +1 n PHE 280 +1 n MET 281 +1 n SER 282 +1 n HIS 283 +1 n PHE 284 +1 n ASN 285 +1 n MET 286 +1 n TYR 287 +1 n LEU 288 +1 n ILE 289 +1 n LEU 290 +1 n ILE 291 +1 n MET 292 +1 n CYS 293 +1 n ASN 294 +1 n SER 295 +1 n ILE 296 +1 n ILE 297 +1 n ASP 298 +1 n PRO 299 +1 n ILE 300 +1 n ILE 301 +1 n TYR 302 +1 n ALA 303 +1 n PHE 304 +1 n ARG 305 +1 n SER 306 +1 n GLN 307 +1 n GLU 308 +1 n MET 309 +1 n ARG 310 +1 n LYS 311 +1 n THR 312 +1 n PHE 313 +1 n LYS 314 +1 n GLU 315 +1 n ILE 316 +1 n PHE 317 +1 n CYS 318 +1 n CYS 319 +1 n SER 320 +1 n GLN 321 +1 n ALA 322 +1 n LEU 323 +1 n SER 324 +1 n CYS 325 +1 n ILE 326 +1 n SER 327 +1 n PHE 328 +1 n LEU 329 +1 n SER 330 +1 n ARG 331 +1 n VAL 332 +1 n SER 333 +1 n LYS 334 +1 n GLY 335 +1 n GLU 336 +1 n GLU 337 +1 n LEU 338 +1 n PHE 339 +1 n THR 340 +1 n GLY 341 +1 n VAL 342 +1 n VAL 343 +1 n PRO 344 +1 n ILE 345 +1 n LEU 346 +1 n VAL 347 +1 n GLU 348 +1 n LEU 349 +1 n ASP 350 +1 n GLY 351 +1 n ASP 352 +1 n VAL 353 +1 n ASN 354 +1 n GLY 355 +1 n HIS 356 +1 n LYS 357 +1 n PHE 358 +1 n SER 359 +1 n VAL 360 +1 n SER 361 +1 n GLY 362 +1 n GLU 363 +1 n GLY 364 +1 n GLU 365 +1 n GLY 366 +1 n ASP 367 +1 n ALA 368 +1 n THR 369 +1 n TYR 370 +1 n GLY 371 +1 n LYS 372 +1 n LEU 373 +1 n THR 374 +1 n LEU 375 +1 n LYS 376 +1 n PHE 377 +1 n ILE 378 +1 n CYS 379 +1 n THR 380 +1 n THR 381 +1 n GLY 382 +1 n LYS 383 +1 n LEU 384 +1 n PRO 385 +1 n VAL 386 +1 n PRO 387 +1 n TRP 388 +1 n PRO 389 +1 n THR 390 +1 n LEU 391 +1 n VAL 392 +1 n THR 393 +1 n THR 394 +1 n LEU 395 +1 n THR 396 +1 n TYR 397 +1 n GLY 398 +1 n VAL 399 +1 n GLN 400 +1 n CYS 401 +1 n PHE 402 +1 n SER 403 +1 n ARG 404 +1 n TYR 405 +1 n PRO 406 +1 n ASP 407 +1 n HIS 408 +1 n MET 409 +1 n LYS 410 +1 n GLN 411 +1 n HIS 412 +1 n ASP 413 +1 n PHE 414 +1 n PHE 415 +1 n LYS 416 +1 n SER 417 +1 n ALA 418 +1 n MET 419 +1 n PRO 420 +1 n GLU 421 +1 n GLY 422 +1 n TYR 423 +1 n VAL 424 +1 n GLN 425 +1 n GLU 426 +1 n ARG 427 +1 n THR 428 +1 n ILE 429 +1 n PHE 430 +1 n PHE 431 +1 n LYS 432 +1 n ASP 433 +1 n ASP 434 +1 n GLY 435 +1 n ASN 436 +1 n TYR 437 +1 n LYS 438 +1 n THR 439 +1 n ARG 440 +1 n ALA 441 +1 n GLU 442 +1 n VAL 443 +1 n LYS 444 +1 n PHE 445 +1 n GLU 446 +1 n GLY 447 +1 n ASP 448 +1 n THR 449 +1 n LEU 450 +1 n VAL 451 +1 n ASN 452 +1 n ARG 453 +1 n ILE 454 +1 n GLU 455 +1 n LEU 456 +1 n LYS 457 +1 n GLY 458 +1 n ILE 459 +1 n ASP 460 +1 n PHE 461 +1 n LYS 462 +1 n GLU 463 +1 n ASP 464 +1 n GLY 465 +1 n ASN 466 +1 n ILE 467 +1 n LEU 468 +1 n GLY 469 +1 n HIS 470 +1 n LYS 471 +1 n LEU 472 +1 n GLU 473 +1 n TYR 474 +1 n ASN 475 +1 n TYR 476 +1 n ASN 477 +1 n SER 478 +1 n HIS 479 +1 n ASN 480 +1 n VAL 481 +1 n TYR 482 +1 n ILE 483 +1 n MET 484 +1 n ALA 485 +1 n ASP 486 +1 n LYS 487 +1 n GLN 488 +1 n LYS 489 +1 n ASN 490 +1 n GLY 491 +1 n ILE 492 +1 n LYS 493 +1 n VAL 494 +1 n ASN 495 +1 n PHE 496 +1 n LYS 497 +1 n ILE 498 +1 n ARG 499 +1 n HIS 500 +1 n ASN 501 +1 n ILE 502 +1 n GLU 503 +1 n ASP 504 +1 n GLY 505 +1 n SER 506 +1 n VAL 507 +1 n GLN 508 +1 n LEU 509 +1 n ALA 510 +1 n ASP 511 +1 n HIS 512 +1 n TYR 513 +1 n GLN 514 +1 n GLN 515 +1 n ASN 516 +1 n THR 517 +1 n PRO 518 +1 n ILE 519 +1 n GLY 520 +1 n ASP 521 +1 n GLY 522 +1 n PRO 523 +1 n VAL 524 +1 n LEU 525 +1 n LEU 526 +1 n PRO 527 +1 n ASP 528 +1 n ASN 529 +1 n HIS 530 +1 n TYR 531 +1 n LEU 532 +1 n SER 533 +1 n THR 534 +1 n GLN 535 +1 n SER 536 +1 n ALA 537 +1 n LEU 538 +1 n SER 539 +1 n LYS 540 +1 n ASP 541 +1 n PRO 542 +1 n ASN 543 +1 n GLU 544 +1 n LYS 545 +1 n ARG 546 +1 n ASP 547 +1 n HIS 548 +1 n MET 549 +1 n VAL 550 +1 n LEU 551 +1 n LEU 552 +1 n GLU 553 +1 n PHE 554 +1 n VAL 555 +1 n THR 556 +1 n ALA 557 +1 n ALA 558 +1 n GLY 559 +1 n ILE 560 +1 n THR 561 +1 n LEU 562 +1 n GLY 563 +1 n MET 564 +1 n ASP 565 +1 n GLU 566 +1 n LEU 567 +1 n TYR 568 +1 n LYS 569 +2 n MET 1 +2 n ASN 2 +2 n SER 3 +2 n THR 4 +2 n ALA 5 +2 n GLN 6 +2 n GLN 7 +2 n GLY 8 +2 n LEU 9 +2 n ILE 10 +2 n PRO 11 +2 n CYS 12 +2 n TYR 13 +2 n LEU 14 +2 n ASN 15 +2 n GLY 16 +2 n SER 17 +2 n LEU 18 +2 n CYS 19 +2 n PRO 20 +2 n GLY 21 +2 n THR 22 +2 n LEU 23 +2 n PRO 24 +2 n GLU 25 +2 n LYS 26 +2 n ASP 27 +2 n VAL 28 +2 n SER 29 +2 n GLY 30 +2 n GLU 31 +2 n GLU 32 +2 n LYS 33 +2 n ASP 34 +2 n SER 35 +2 n SER 36 +2 n ALA 37 +2 n GLY 38 +2 n CYS 39 +2 n SER 40 +2 n GLU 41 +2 n GLN 42 +2 n LEU 43 +2 n LEU 44 +2 n ILE 45 +2 n SER 46 +2 n THR 47 +2 n GLU 48 +2 n VAL 49 +2 n PHE 50 +2 n LEU 51 +2 n THR 52 +2 n LEU 53 +2 n GLY 54 +2 n ILE 55 +2 n ILE 56 +2 n SER 57 +2 n LEU 58 +2 n LEU 59 +2 n GLU 60 +2 n ASN 61 +2 n ILE 62 +2 n LEU 63 +2 n VAL 64 +2 n VAL 65 +2 n ALA 66 +2 n ALA 67 +2 n ILE 68 +2 n ILE 69 +2 n LYS 70 +2 n ASN 71 +2 n GLN 72 +2 n ASN 73 +2 n LEU 74 +2 n HIS 75 +2 n SER 76 +2 n PRO 77 +2 n MET 78 +2 n TYR 79 +2 n PHE 80 +2 n PHE 81 +2 n ILE 82 +2 n CYS 83 +2 n SER 84 +2 n LEU 85 +2 n ALA 86 +2 n VAL 87 +2 n ALA 88 +2 n ASP 89 +2 n MET 90 +2 n LEU 91 +2 n VAL 92 +2 n SER 93 +2 n VAL 94 +2 n SER 95 +2 n ASN 96 +2 n ALA 97 +2 n SER 98 +2 n GLU 99 +2 n THR 100 +2 n ILE 101 +2 n VAL 102 +2 n ILE 103 +2 n ALA 104 +2 n LEU 105 +2 n ILE 106 +2 n ASN 107 +2 n GLY 108 +2 n GLY 109 +2 n SER 110 +2 n LEU 111 +2 n THR 112 +2 n ILE 113 +2 n PRO 114 +2 n VAL 115 +2 n THR 116 +2 n PHE 117 +2 n ILE 118 +2 n LYS 119 +2 n SER 120 +2 n MET 121 +2 n ASP 122 +2 n ASN 123 +2 n VAL 124 +2 n PHE 125 +2 n ASP 126 +2 n SER 127 +2 n MET 128 +2 n ILE 129 +2 n CYS 130 +2 n SER 131 +2 n SER 132 +2 n LEU 133 +2 n LEU 134 +2 n ALA 135 +2 n SER 136 +2 n ILE 137 +2 n CYS 138 +2 n SER 139 +2 n LEU 140 +2 n LEU 141 +2 n ALA 142 +2 n ILE 143 +2 n ALA 144 +2 n ILE 145 +2 n ASP 146 +2 n ARG 147 +2 n TYR 148 +2 n ILE 149 +2 n THR 150 +2 n ILE 151 +2 n PHE 152 +2 n TYR 153 +2 n ALA 154 +2 n LEU 155 +2 n ARG 156 +2 n TYR 157 +2 n HIS 158 +2 n ASN 159 +2 n ILE 160 +2 n VAL 161 +2 n THR 162 +2 n ILE 163 +2 n ARG 164 +2 n ARG 165 +2 n ALA 166 +2 n LEU 167 +2 n LEU 168 +2 n VAL 169 +2 n ILE 170 +2 n ALA 171 +2 n GLY 172 +2 n ILE 173 +2 n TRP 174 +2 n THR 175 +2 n CYS 176 +2 n CYS 177 +2 n THR 178 +2 n VAL 179 +2 n SER 180 +2 n GLY 181 +2 n ILE 182 +2 n LEU 183 +2 n PHE 184 +2 n ILE 185 +2 n ILE 186 +2 n TYR 187 +2 n SER 188 +2 n GLU 189 +2 n SER 190 +2 n THR 191 +2 n MET 192 +2 n VAL 193 +2 n LEU 194 +2 n ILE 195 +2 n CYS 196 +2 n LEU 197 +2 n ILE 198 +2 n THR 199 +2 n MET 200 +2 n PHE 201 +2 n PHE 202 +2 n THR 203 +2 n MET 204 +2 n LEU 205 +2 n VAL 206 +2 n LEU 207 +2 n MET 208 +2 n ALA 209 +2 n SER 210 +2 n LEU 211 +2 n TYR 212 +2 n VAL 213 +2 n HIS 214 +2 n MET 215 +2 n PHE 216 +2 n LEU 217 +2 n LEU 218 +2 n ALA 219 +2 n ARG 220 +2 n GLN 221 +2 n HIS 222 +2 n MET 223 +2 n LYS 224 +2 n ARG 225 +2 n ILE 226 +2 n ALA 227 +2 n ALA 228 +2 n LEU 229 +2 n PRO 230 +2 n GLY 231 +2 n ASN 232 +2 n ALA 233 +2 n PRO 234 +2 n ILE 235 +2 n GLN 236 +2 n GLN 237 +2 n ARG 238 +2 n ALA 239 +2 n ASN 240 +2 n MET 241 +2 n LYS 242 +2 n GLY 243 +2 n ALA 244 +2 n ILE 245 +2 n THR 246 +2 n LEU 247 +2 n THR 248 +2 n ILE 249 +2 n LEU 250 +2 n LEU 251 +2 n GLY 252 +2 n VAL 253 +2 n PHE 254 +2 n VAL 255 +2 n VAL 256 +2 n CYS 257 +2 n TRP 258 +2 n ALA 259 +2 n PRO 260 +2 n PHE 261 +2 n PHE 262 +2 n LEU 263 +2 n HIS 264 +2 n LEU 265 +2 n ILE 266 +2 n LEU 267 +2 n MET 268 +2 n ILE 269 +2 n THR 270 +2 n CYS 271 +2 n PRO 272 +2 n ARG 273 +2 n ASN 274 +2 n PRO 275 +2 n TYR 276 +2 n CYS 277 +2 n THR 278 +2 n CYS 279 +2 n PHE 280 +2 n MET 281 +2 n SER 282 +2 n HIS 283 +2 n PHE 284 +2 n ASN 285 +2 n MET 286 +2 n TYR 287 +2 n LEU 288 +2 n ILE 289 +2 n LEU 290 +2 n ILE 291 +2 n MET 292 +2 n CYS 293 +2 n ASN 294 +2 n SER 295 +2 n ILE 296 +2 n ILE 297 +2 n ASP 298 +2 n PRO 299 +2 n ILE 300 +2 n ILE 301 +2 n TYR 302 +2 n ALA 303 +2 n PHE 304 +2 n ARG 305 +2 n SER 306 +2 n GLN 307 +2 n GLU 308 +2 n MET 309 +2 n ARG 310 +2 n LYS 311 +2 n THR 312 +2 n PHE 313 +2 n LYS 314 +2 n GLU 315 +2 n ILE 316 +2 n PHE 317 +2 n CYS 318 +2 n CYS 319 +2 n SER 320 +2 n GLN 321 +2 n ALA 322 +2 n LEU 323 +2 n SER 324 +2 n CYS 325 +2 n ILE 326 +2 n SER 327 +2 n PHE 328 +2 n LEU 329 +2 n SER 330 +2 n ARG 331 +2 n VAL 332 +2 n SER 333 +2 n LYS 334 +2 n GLY 335 +2 n GLU 336 +2 n GLU 337 +2 n LEU 338 +2 n PHE 339 +2 n THR 340 +2 n GLY 341 +2 n VAL 342 +2 n VAL 343 +2 n PRO 344 +2 n ILE 345 +2 n LEU 346 +2 n VAL 347 +2 n GLU 348 +2 n LEU 349 +2 n ASP 350 +2 n GLY 351 +2 n ASP 352 +2 n VAL 353 +2 n ASN 354 +2 n GLY 355 +2 n HIS 356 +2 n LYS 357 +2 n PHE 358 +2 n SER 359 +2 n VAL 360 +2 n SER 361 +2 n GLY 362 +2 n GLU 363 +2 n GLY 364 +2 n GLU 365 +2 n GLY 366 +2 n ASP 367 +2 n ALA 368 +2 n THR 369 +2 n TYR 370 +2 n GLY 371 +2 n LYS 372 +2 n LEU 373 +2 n THR 374 +2 n LEU 375 +2 n LYS 376 +2 n PHE 377 +2 n ILE 378 +2 n CYS 379 +2 n THR 380 +2 n THR 381 +2 n GLY 382 +2 n LYS 383 +2 n LEU 384 +2 n PRO 385 +2 n VAL 386 +2 n PRO 387 +2 n TRP 388 +2 n PRO 389 +2 n THR 390 +2 n LEU 391 +2 n VAL 392 +2 n THR 393 +2 n THR 394 +2 n LEU 395 +2 n THR 396 +2 n TYR 397 +2 n GLY 398 +2 n VAL 399 +2 n GLN 400 +2 n CYS 401 +2 n PHE 402 +2 n SER 403 +2 n ARG 404 +2 n TYR 405 +2 n PRO 406 +2 n ASP 407 +2 n HIS 408 +2 n MET 409 +2 n LYS 410 +2 n GLN 411 +2 n HIS 412 +2 n ASP 413 +2 n PHE 414 +2 n PHE 415 +2 n LYS 416 +2 n SER 417 +2 n ALA 418 +2 n MET 419 +2 n PRO 420 +2 n GLU 421 +2 n GLY 422 +2 n TYR 423 +2 n VAL 424 +2 n GLN 425 +2 n GLU 426 +2 n ARG 427 +2 n THR 428 +2 n ILE 429 +2 n PHE 430 +2 n PHE 431 +2 n LYS 432 +2 n ASP 433 +2 n ASP 434 +2 n GLY 435 +2 n ASN 436 +2 n TYR 437 +2 n LYS 438 +2 n THR 439 +2 n ARG 440 +2 n ALA 441 +2 n GLU 442 +2 n VAL 443 +2 n LYS 444 +2 n PHE 445 +2 n GLU 446 +2 n GLY 447 +2 n ASP 448 +2 n THR 449 +2 n LEU 450 +2 n VAL 451 +2 n ASN 452 +2 n ARG 453 +2 n ILE 454 +2 n GLU 455 +2 n LEU 456 +2 n LYS 457 +2 n GLY 458 +2 n ILE 459 +2 n ASP 460 +2 n PHE 461 +2 n LYS 462 +2 n GLU 463 +2 n ASP 464 +2 n GLY 465 +2 n ASN 466 +2 n ILE 467 +2 n LEU 468 +2 n GLY 469 +2 n HIS 470 +2 n LYS 471 +2 n LEU 472 +2 n GLU 473 +2 n TYR 474 +2 n ASN 475 +2 n TYR 476 +2 n ASN 477 +2 n SER 478 +2 n HIS 479 +2 n ASN 480 +2 n VAL 481 +2 n TYR 482 +2 n ILE 483 +2 n MET 484 +2 n ALA 485 +2 n ASP 486 +2 n LYS 487 +2 n GLN 488 +2 n LYS 489 +2 n ASN 490 +2 n GLY 491 +2 n ILE 492 +2 n LYS 493 +2 n VAL 494 +2 n ASN 495 +2 n PHE 496 +2 n LYS 497 +2 n ILE 498 +2 n ARG 499 +2 n HIS 500 +2 n ASN 501 +2 n ILE 502 +2 n GLU 503 +2 n ASP 504 +2 n GLY 505 +2 n SER 506 +2 n VAL 507 +2 n GLN 508 +2 n LEU 509 +2 n ALA 510 +2 n ASP 511 +2 n HIS 512 +2 n TYR 513 +2 n GLN 514 +2 n GLN 515 +2 n ASN 516 +2 n THR 517 +2 n PRO 518 +2 n ILE 519 +2 n GLY 520 +2 n ASP 521 +2 n GLY 522 +2 n PRO 523 +2 n VAL 524 +2 n LEU 525 +2 n LEU 526 +2 n PRO 527 +2 n ASP 528 +2 n ASN 529 +2 n HIS 530 +2 n TYR 531 +2 n LEU 532 +2 n SER 533 +2 n THR 534 +2 n GLN 535 +2 n SER 536 +2 n ALA 537 +2 n LEU 538 +2 n SER 539 +2 n LYS 540 +2 n ASP 541 +2 n PRO 542 +2 n ASN 543 +2 n GLU 544 +2 n LYS 545 +2 n ARG 546 +2 n ASP 547 +2 n HIS 548 +2 n MET 549 +2 n VAL 550 +2 n LEU 551 +2 n LEU 552 +2 n GLU 553 +2 n PHE 554 +2 n VAL 555 +2 n THR 556 +2 n ALA 557 +2 n ALA 558 +2 n GLY 559 +2 n ILE 560 +2 n THR 561 +2 n LEU 562 +2 n GLY 563 +2 n MET 564 +2 n ASP 565 +2 n GLU 566 +2 n LEU 567 +2 n TYR 568 +2 n LYS 569 +# +_ma_data.content_type "model coordinates" +_ma_data.id 1 +_ma_data.name Model +# +_ma_model_list.data_id 1 +_ma_model_list.model_group_id 1 +_ma_model_list.model_group_name "AlphaFold-beta-20231127 (52ceabbc-a146-4d20-8f14-848cbf63912f @ 2026-01-15 01:31:36)" +_ma_model_list.model_id 1 +_ma_model_list.model_name "Top ranked model" +_ma_model_list.model_type "Ab initio model" +_ma_model_list.ordinal_id 1 +# +loop_ +_ma_protocol_step.method_type +_ma_protocol_step.ordinal_id +_ma_protocol_step.protocol_id +_ma_protocol_step.step_id +"coevolution MSA" 1 1 1 +"template search" 2 1 2 +modeling 3 1 3 +# +loop_ +_ma_qa_metric.id +_ma_qa_metric.mode +_ma_qa_metric.name +_ma_qa_metric.software_group_id +_ma_qa_metric.type +1 global pLDDT 1 pLDDT +2 local pLDDT 1 pLDDT +# +_ma_qa_metric_global.metric_id 1 +_ma_qa_metric_global.metric_value 73.22 +_ma_qa_metric_global.model_id 1 +_ma_qa_metric_global.ordinal_id 1 +# +_ma_software_group.group_id 1 +_ma_software_group.ordinal_id 1 +_ma_software_group.software_id 1 +# +loop_ +_ma_target_entity.data_id +_ma_target_entity.entity_id +_ma_target_entity.origin +1 1 . +1 2 . +# +loop_ +_ma_target_entity_instance.asym_id +_ma_target_entity_instance.details +_ma_target_entity_instance.entity_id +A . 1 +B . 2 +# +loop_ +_pdbx_data_usage.details +_pdbx_data_usage.id +_pdbx_data_usage.type +_pdbx_data_usage.url +;NON-COMMERCIAL USE ONLY, BY USING THIS FILE YOU AGREE TO THE TERMS OF USE FOUND +AT alphafoldserver.com/output-terms. +; +1 license ? +;THE INFORMATION IS NOT INTENDED FOR, HAS NOT BEEN VALIDATED FOR, AND IS NOT +APPROVED FOR CLINICAL USE. IT SHOULD NOT BE USED FOR CLINICAL PURPOSE OR RELIED +ON FOR MEDICAL OR OTHER PROFESSIONAL ADVICE. IT IS THEORETICAL MODELLING ONLY +AND CAUTION SHOULD BE EXERCISED IN ITS USE. IT IS PROVIDED "AS-IS" WITHOUT ANY +WARRANTY OF ANY KIND, WHETHER EXPRESSED OR IMPLIED. NO WARRANTY IS GIVEN THAT +USE OF THE INFORMATION SHALL NOT INFRINGE THE RIGHTS OF ANY THIRD PARTY. +; +2 disclaimer ? +# +loop_ +_pdbx_poly_seq_scheme.asym_id +_pdbx_poly_seq_scheme.auth_seq_num +_pdbx_poly_seq_scheme.entity_id +_pdbx_poly_seq_scheme.hetero +_pdbx_poly_seq_scheme.mon_id +_pdbx_poly_seq_scheme.pdb_ins_code +_pdbx_poly_seq_scheme.pdb_seq_num +_pdbx_poly_seq_scheme.pdb_strand_id +_pdbx_poly_seq_scheme.seq_id +A 1 1 n MET . 1 A 1 +A 2 1 n ASN . 2 A 2 +A 3 1 n SER . 3 A 3 +A 4 1 n THR . 4 A 4 +A 5 1 n ALA . 5 A 5 +A 6 1 n GLN . 6 A 6 +A 7 1 n GLN . 7 A 7 +A 8 1 n GLY . 8 A 8 +A 9 1 n LEU . 9 A 9 +A 10 1 n ILE . 10 A 10 +A 11 1 n PRO . 11 A 11 +A 12 1 n CYS . 12 A 12 +A 13 1 n TYR . 13 A 13 +A 14 1 n LEU . 14 A 14 +A 15 1 n ASN . 15 A 15 +A 16 1 n GLY . 16 A 16 +A 17 1 n SER . 17 A 17 +A 18 1 n LEU . 18 A 18 +A 19 1 n CYS . 19 A 19 +A 20 1 n PRO . 20 A 20 +A 21 1 n GLY . 21 A 21 +A 22 1 n THR . 22 A 22 +A 23 1 n LEU . 23 A 23 +A 24 1 n PRO . 24 A 24 +A 25 1 n GLU . 25 A 25 +A 26 1 n LYS . 26 A 26 +A 27 1 n ASP . 27 A 27 +A 28 1 n VAL . 28 A 28 +A 29 1 n SER . 29 A 29 +A 30 1 n GLY . 30 A 30 +A 31 1 n GLU . 31 A 31 +A 32 1 n GLU . 32 A 32 +A 33 1 n LYS . 33 A 33 +A 34 1 n ASP . 34 A 34 +A 35 1 n SER . 35 A 35 +A 36 1 n SER . 36 A 36 +A 37 1 n ALA . 37 A 37 +A 38 1 n GLY . 38 A 38 +A 39 1 n CYS . 39 A 39 +A 40 1 n SER . 40 A 40 +A 41 1 n GLU . 41 A 41 +A 42 1 n GLN . 42 A 42 +A 43 1 n LEU . 43 A 43 +A 44 1 n LEU . 44 A 44 +A 45 1 n ILE . 45 A 45 +A 46 1 n SER . 46 A 46 +A 47 1 n THR . 47 A 47 +A 48 1 n GLU . 48 A 48 +A 49 1 n VAL . 49 A 49 +A 50 1 n PHE . 50 A 50 +A 51 1 n LEU . 51 A 51 +A 52 1 n THR . 52 A 52 +A 53 1 n LEU . 53 A 53 +A 54 1 n GLY . 54 A 54 +A 55 1 n ILE . 55 A 55 +A 56 1 n ILE . 56 A 56 +A 57 1 n SER . 57 A 57 +A 58 1 n LEU . 58 A 58 +A 59 1 n LEU . 59 A 59 +A 60 1 n GLU . 60 A 60 +A 61 1 n ASN . 61 A 61 +A 62 1 n ILE . 62 A 62 +A 63 1 n LEU . 63 A 63 +A 64 1 n VAL . 64 A 64 +A 65 1 n VAL . 65 A 65 +A 66 1 n ALA . 66 A 66 +A 67 1 n ALA . 67 A 67 +A 68 1 n ILE . 68 A 68 +A 69 1 n ILE . 69 A 69 +A 70 1 n LYS . 70 A 70 +A 71 1 n ASN . 71 A 71 +A 72 1 n GLN . 72 A 72 +A 73 1 n ASN . 73 A 73 +A 74 1 n LEU . 74 A 74 +A 75 1 n HIS . 75 A 75 +A 76 1 n SER . 76 A 76 +A 77 1 n PRO . 77 A 77 +A 78 1 n MET . 78 A 78 +A 79 1 n TYR . 79 A 79 +A 80 1 n PHE . 80 A 80 +A 81 1 n PHE . 81 A 81 +A 82 1 n ILE . 82 A 82 +A 83 1 n CYS . 83 A 83 +A 84 1 n SER . 84 A 84 +A 85 1 n LEU . 85 A 85 +A 86 1 n ALA . 86 A 86 +A 87 1 n VAL . 87 A 87 +A 88 1 n ALA . 88 A 88 +A 89 1 n ASP . 89 A 89 +A 90 1 n MET . 90 A 90 +A 91 1 n LEU . 91 A 91 +A 92 1 n VAL . 92 A 92 +A 93 1 n SER . 93 A 93 +A 94 1 n VAL . 94 A 94 +A 95 1 n SER . 95 A 95 +A 96 1 n ASN . 96 A 96 +A 97 1 n ALA . 97 A 97 +A 98 1 n SER . 98 A 98 +A 99 1 n GLU . 99 A 99 +A 100 1 n THR . 100 A 100 +A 101 1 n ILE . 101 A 101 +A 102 1 n VAL . 102 A 102 +A 103 1 n ILE . 103 A 103 +A 104 1 n ALA . 104 A 104 +A 105 1 n LEU . 105 A 105 +A 106 1 n ILE . 106 A 106 +A 107 1 n ASN . 107 A 107 +A 108 1 n GLY . 108 A 108 +A 109 1 n GLY . 109 A 109 +A 110 1 n SER . 110 A 110 +A 111 1 n LEU . 111 A 111 +A 112 1 n THR . 112 A 112 +A 113 1 n ILE . 113 A 113 +A 114 1 n PRO . 114 A 114 +A 115 1 n VAL . 115 A 115 +A 116 1 n THR . 116 A 116 +A 117 1 n PHE . 117 A 117 +A 118 1 n ILE . 118 A 118 +A 119 1 n LYS . 119 A 119 +A 120 1 n SER . 120 A 120 +A 121 1 n MET . 121 A 121 +A 122 1 n ASP . 122 A 122 +A 123 1 n ASN . 123 A 123 +A 124 1 n VAL . 124 A 124 +A 125 1 n PHE . 125 A 125 +A 126 1 n ASP . 126 A 126 +A 127 1 n SER . 127 A 127 +A 128 1 n MET . 128 A 128 +A 129 1 n ILE . 129 A 129 +A 130 1 n CYS . 130 A 130 +A 131 1 n SER . 131 A 131 +A 132 1 n SER . 132 A 132 +A 133 1 n LEU . 133 A 133 +A 134 1 n LEU . 134 A 134 +A 135 1 n ALA . 135 A 135 +A 136 1 n SER . 136 A 136 +A 137 1 n ILE . 137 A 137 +A 138 1 n CYS . 138 A 138 +A 139 1 n SER . 139 A 139 +A 140 1 n LEU . 140 A 140 +A 141 1 n LEU . 141 A 141 +A 142 1 n ALA . 142 A 142 +A 143 1 n ILE . 143 A 143 +A 144 1 n ALA . 144 A 144 +A 145 1 n ILE . 145 A 145 +A 146 1 n ASP . 146 A 146 +A 147 1 n ARG . 147 A 147 +A 148 1 n TYR . 148 A 148 +A 149 1 n ILE . 149 A 149 +A 150 1 n THR . 150 A 150 +A 151 1 n ILE . 151 A 151 +A 152 1 n PHE . 152 A 152 +A 153 1 n TYR . 153 A 153 +A 154 1 n ALA . 154 A 154 +A 155 1 n LEU . 155 A 155 +A 156 1 n ARG . 156 A 156 +A 157 1 n TYR . 157 A 157 +A 158 1 n HIS . 158 A 158 +A 159 1 n ASN . 159 A 159 +A 160 1 n ILE . 160 A 160 +A 161 1 n VAL . 161 A 161 +A 162 1 n THR . 162 A 162 +A 163 1 n ILE . 163 A 163 +A 164 1 n ARG . 164 A 164 +A 165 1 n ARG . 165 A 165 +A 166 1 n ALA . 166 A 166 +A 167 1 n LEU . 167 A 167 +A 168 1 n LEU . 168 A 168 +A 169 1 n VAL . 169 A 169 +A 170 1 n ILE . 170 A 170 +A 171 1 n ALA . 171 A 171 +A 172 1 n GLY . 172 A 172 +A 173 1 n ILE . 173 A 173 +A 174 1 n TRP . 174 A 174 +A 175 1 n THR . 175 A 175 +A 176 1 n CYS . 176 A 176 +A 177 1 n CYS . 177 A 177 +A 178 1 n THR . 178 A 178 +A 179 1 n VAL . 179 A 179 +A 180 1 n SER . 180 A 180 +A 181 1 n GLY . 181 A 181 +A 182 1 n ILE . 182 A 182 +A 183 1 n LEU . 183 A 183 +A 184 1 n PHE . 184 A 184 +A 185 1 n ILE . 185 A 185 +A 186 1 n ILE . 186 A 186 +A 187 1 n TYR . 187 A 187 +A 188 1 n SER . 188 A 188 +A 189 1 n GLU . 189 A 189 +A 190 1 n SER . 190 A 190 +A 191 1 n THR . 191 A 191 +A 192 1 n MET . 192 A 192 +A 193 1 n VAL . 193 A 193 +A 194 1 n LEU . 194 A 194 +A 195 1 n ILE . 195 A 195 +A 196 1 n CYS . 196 A 196 +A 197 1 n LEU . 197 A 197 +A 198 1 n ILE . 198 A 198 +A 199 1 n THR . 199 A 199 +A 200 1 n MET . 200 A 200 +A 201 1 n PHE . 201 A 201 +A 202 1 n PHE . 202 A 202 +A 203 1 n THR . 203 A 203 +A 204 1 n MET . 204 A 204 +A 205 1 n LEU . 205 A 205 +A 206 1 n VAL . 206 A 206 +A 207 1 n LEU . 207 A 207 +A 208 1 n MET . 208 A 208 +A 209 1 n ALA . 209 A 209 +A 210 1 n SER . 210 A 210 +A 211 1 n LEU . 211 A 211 +A 212 1 n TYR . 212 A 212 +A 213 1 n VAL . 213 A 213 +A 214 1 n HIS . 214 A 214 +A 215 1 n MET . 215 A 215 +A 216 1 n PHE . 216 A 216 +A 217 1 n LEU . 217 A 217 +A 218 1 n LEU . 218 A 218 +A 219 1 n ALA . 219 A 219 +A 220 1 n ARG . 220 A 220 +A 221 1 n GLN . 221 A 221 +A 222 1 n HIS . 222 A 222 +A 223 1 n MET . 223 A 223 +A 224 1 n LYS . 224 A 224 +A 225 1 n ARG . 225 A 225 +A 226 1 n ILE . 226 A 226 +A 227 1 n ALA . 227 A 227 +A 228 1 n ALA . 228 A 228 +A 229 1 n LEU . 229 A 229 +A 230 1 n PRO . 230 A 230 +A 231 1 n GLY . 231 A 231 +A 232 1 n ASN . 232 A 232 +A 233 1 n ALA . 233 A 233 +A 234 1 n PRO . 234 A 234 +A 235 1 n ILE . 235 A 235 +A 236 1 n GLN . 236 A 236 +A 237 1 n GLN . 237 A 237 +A 238 1 n ARG . 238 A 238 +A 239 1 n ALA . 239 A 239 +A 240 1 n ASN . 240 A 240 +A 241 1 n MET . 241 A 241 +A 242 1 n LYS . 242 A 242 +A 243 1 n GLY . 243 A 243 +A 244 1 n ALA . 244 A 244 +A 245 1 n ILE . 245 A 245 +A 246 1 n THR . 246 A 246 +A 247 1 n LEU . 247 A 247 +A 248 1 n THR . 248 A 248 +A 249 1 n ILE . 249 A 249 +A 250 1 n LEU . 250 A 250 +A 251 1 n LEU . 251 A 251 +A 252 1 n GLY . 252 A 252 +A 253 1 n VAL . 253 A 253 +A 254 1 n PHE . 254 A 254 +A 255 1 n VAL . 255 A 255 +A 256 1 n VAL . 256 A 256 +A 257 1 n CYS . 257 A 257 +A 258 1 n TRP . 258 A 258 +A 259 1 n ALA . 259 A 259 +A 260 1 n PRO . 260 A 260 +A 261 1 n PHE . 261 A 261 +A 262 1 n PHE . 262 A 262 +A 263 1 n LEU . 263 A 263 +A 264 1 n HIS . 264 A 264 +A 265 1 n LEU . 265 A 265 +A 266 1 n ILE . 266 A 266 +A 267 1 n LEU . 267 A 267 +A 268 1 n MET . 268 A 268 +A 269 1 n ILE . 269 A 269 +A 270 1 n THR . 270 A 270 +A 271 1 n CYS . 271 A 271 +A 272 1 n PRO . 272 A 272 +A 273 1 n ARG . 273 A 273 +A 274 1 n ASN . 274 A 274 +A 275 1 n PRO . 275 A 275 +A 276 1 n TYR . 276 A 276 +A 277 1 n CYS . 277 A 277 +A 278 1 n THR . 278 A 278 +A 279 1 n CYS . 279 A 279 +A 280 1 n PHE . 280 A 280 +A 281 1 n MET . 281 A 281 +A 282 1 n SER . 282 A 282 +A 283 1 n HIS . 283 A 283 +A 284 1 n PHE . 284 A 284 +A 285 1 n ASN . 285 A 285 +A 286 1 n MET . 286 A 286 +A 287 1 n TYR . 287 A 287 +A 288 1 n LEU . 288 A 288 +A 289 1 n ILE . 289 A 289 +A 290 1 n LEU . 290 A 290 +A 291 1 n ILE . 291 A 291 +A 292 1 n MET . 292 A 292 +A 293 1 n CYS . 293 A 293 +A 294 1 n ASN . 294 A 294 +A 295 1 n SER . 295 A 295 +A 296 1 n ILE . 296 A 296 +A 297 1 n ILE . 297 A 297 +A 298 1 n ASP . 298 A 298 +A 299 1 n PRO . 299 A 299 +A 300 1 n ILE . 300 A 300 +A 301 1 n ILE . 301 A 301 +A 302 1 n TYR . 302 A 302 +A 303 1 n ALA . 303 A 303 +A 304 1 n PHE . 304 A 304 +A 305 1 n ARG . 305 A 305 +A 306 1 n SER . 306 A 306 +A 307 1 n GLN . 307 A 307 +A 308 1 n GLU . 308 A 308 +A 309 1 n MET . 309 A 309 +A 310 1 n ARG . 310 A 310 +A 311 1 n LYS . 311 A 311 +A 312 1 n THR . 312 A 312 +A 313 1 n PHE . 313 A 313 +A 314 1 n LYS . 314 A 314 +A 315 1 n GLU . 315 A 315 +A 316 1 n ILE . 316 A 316 +A 317 1 n PHE . 317 A 317 +A 318 1 n CYS . 318 A 318 +A 319 1 n CYS . 319 A 319 +A 320 1 n SER . 320 A 320 +A 321 1 n GLN . 321 A 321 +A 322 1 n ALA . 322 A 322 +A 323 1 n LEU . 323 A 323 +A 324 1 n SER . 324 A 324 +A 325 1 n CYS . 325 A 325 +A 326 1 n ILE . 326 A 326 +A 327 1 n SER . 327 A 327 +A 328 1 n PHE . 328 A 328 +A 329 1 n LEU . 329 A 329 +A 330 1 n SER . 330 A 330 +A 331 1 n ARG . 331 A 331 +A 332 1 n VAL . 332 A 332 +A 333 1 n SER . 333 A 333 +A 334 1 n LYS . 334 A 334 +A 335 1 n GLY . 335 A 335 +A 336 1 n GLU . 336 A 336 +A 337 1 n GLU . 337 A 337 +A 338 1 n LEU . 338 A 338 +A 339 1 n PHE . 339 A 339 +A 340 1 n THR . 340 A 340 +A 341 1 n GLY . 341 A 341 +A 342 1 n VAL . 342 A 342 +A 343 1 n VAL . 343 A 343 +A 344 1 n PRO . 344 A 344 +A 345 1 n ILE . 345 A 345 +A 346 1 n LEU . 346 A 346 +A 347 1 n VAL . 347 A 347 +A 348 1 n GLU . 348 A 348 +A 349 1 n LEU . 349 A 349 +A 350 1 n ASP . 350 A 350 +A 351 1 n GLY . 351 A 351 +A 352 1 n ASP . 352 A 352 +A 353 1 n VAL . 353 A 353 +A 354 1 n ASN . 354 A 354 +A 355 1 n GLY . 355 A 355 +A 356 1 n HIS . 356 A 356 +A 357 1 n LYS . 357 A 357 +A 358 1 n PHE . 358 A 358 +A 359 1 n SER . 359 A 359 +A 360 1 n VAL . 360 A 360 +A 361 1 n SER . 361 A 361 +A 362 1 n GLY . 362 A 362 +A 363 1 n GLU . 363 A 363 +A 364 1 n GLY . 364 A 364 +A 365 1 n GLU . 365 A 365 +A 366 1 n GLY . 366 A 366 +A 367 1 n ASP . 367 A 367 +A 368 1 n ALA . 368 A 368 +A 369 1 n THR . 369 A 369 +A 370 1 n TYR . 370 A 370 +A 371 1 n GLY . 371 A 371 +A 372 1 n LYS . 372 A 372 +A 373 1 n LEU . 373 A 373 +A 374 1 n THR . 374 A 374 +A 375 1 n LEU . 375 A 375 +A 376 1 n LYS . 376 A 376 +A 377 1 n PHE . 377 A 377 +A 378 1 n ILE . 378 A 378 +A 379 1 n CYS . 379 A 379 +A 380 1 n THR . 380 A 380 +A 381 1 n THR . 381 A 381 +A 382 1 n GLY . 382 A 382 +A 383 1 n LYS . 383 A 383 +A 384 1 n LEU . 384 A 384 +A 385 1 n PRO . 385 A 385 +A 386 1 n VAL . 386 A 386 +A 387 1 n PRO . 387 A 387 +A 388 1 n TRP . 388 A 388 +A 389 1 n PRO . 389 A 389 +A 390 1 n THR . 390 A 390 +A 391 1 n LEU . 391 A 391 +A 392 1 n VAL . 392 A 392 +A 393 1 n THR . 393 A 393 +A 394 1 n THR . 394 A 394 +A 395 1 n LEU . 395 A 395 +A 396 1 n THR . 396 A 396 +A 397 1 n TYR . 397 A 397 +A 398 1 n GLY . 398 A 398 +A 399 1 n VAL . 399 A 399 +A 400 1 n GLN . 400 A 400 +A 401 1 n CYS . 401 A 401 +A 402 1 n PHE . 402 A 402 +A 403 1 n SER . 403 A 403 +A 404 1 n ARG . 404 A 404 +A 405 1 n TYR . 405 A 405 +A 406 1 n PRO . 406 A 406 +A 407 1 n ASP . 407 A 407 +A 408 1 n HIS . 408 A 408 +A 409 1 n MET . 409 A 409 +A 410 1 n LYS . 410 A 410 +A 411 1 n GLN . 411 A 411 +A 412 1 n HIS . 412 A 412 +A 413 1 n ASP . 413 A 413 +A 414 1 n PHE . 414 A 414 +A 415 1 n PHE . 415 A 415 +A 416 1 n LYS . 416 A 416 +A 417 1 n SER . 417 A 417 +A 418 1 n ALA . 418 A 418 +A 419 1 n MET . 419 A 419 +A 420 1 n PRO . 420 A 420 +A 421 1 n GLU . 421 A 421 +A 422 1 n GLY . 422 A 422 +A 423 1 n TYR . 423 A 423 +A 424 1 n VAL . 424 A 424 +A 425 1 n GLN . 425 A 425 +A 426 1 n GLU . 426 A 426 +A 427 1 n ARG . 427 A 427 +A 428 1 n THR . 428 A 428 +A 429 1 n ILE . 429 A 429 +A 430 1 n PHE . 430 A 430 +A 431 1 n PHE . 431 A 431 +A 432 1 n LYS . 432 A 432 +A 433 1 n ASP . 433 A 433 +A 434 1 n ASP . 434 A 434 +A 435 1 n GLY . 435 A 435 +A 436 1 n ASN . 436 A 436 +A 437 1 n TYR . 437 A 437 +A 438 1 n LYS . 438 A 438 +A 439 1 n THR . 439 A 439 +A 440 1 n ARG . 440 A 440 +A 441 1 n ALA . 441 A 441 +A 442 1 n GLU . 442 A 442 +A 443 1 n VAL . 443 A 443 +A 444 1 n LYS . 444 A 444 +A 445 1 n PHE . 445 A 445 +A 446 1 n GLU . 446 A 446 +A 447 1 n GLY . 447 A 447 +A 448 1 n ASP . 448 A 448 +A 449 1 n THR . 449 A 449 +A 450 1 n LEU . 450 A 450 +A 451 1 n VAL . 451 A 451 +A 452 1 n ASN . 452 A 452 +A 453 1 n ARG . 453 A 453 +A 454 1 n ILE . 454 A 454 +A 455 1 n GLU . 455 A 455 +A 456 1 n LEU . 456 A 456 +A 457 1 n LYS . 457 A 457 +A 458 1 n GLY . 458 A 458 +A 459 1 n ILE . 459 A 459 +A 460 1 n ASP . 460 A 460 +A 461 1 n PHE . 461 A 461 +A 462 1 n LYS . 462 A 462 +A 463 1 n GLU . 463 A 463 +A 464 1 n ASP . 464 A 464 +A 465 1 n GLY . 465 A 465 +A 466 1 n ASN . 466 A 466 +A 467 1 n ILE . 467 A 467 +A 468 1 n LEU . 468 A 468 +A 469 1 n GLY . 469 A 469 +A 470 1 n HIS . 470 A 470 +A 471 1 n LYS . 471 A 471 +A 472 1 n LEU . 472 A 472 +A 473 1 n GLU . 473 A 473 +A 474 1 n TYR . 474 A 474 +A 475 1 n ASN . 475 A 475 +A 476 1 n TYR . 476 A 476 +A 477 1 n ASN . 477 A 477 +A 478 1 n SER . 478 A 478 +A 479 1 n HIS . 479 A 479 +A 480 1 n ASN . 480 A 480 +A 481 1 n VAL . 481 A 481 +A 482 1 n TYR . 482 A 482 +A 483 1 n ILE . 483 A 483 +A 484 1 n MET . 484 A 484 +A 485 1 n ALA . 485 A 485 +A 486 1 n ASP . 486 A 486 +A 487 1 n LYS . 487 A 487 +A 488 1 n GLN . 488 A 488 +A 489 1 n LYS . 489 A 489 +A 490 1 n ASN . 490 A 490 +A 491 1 n GLY . 491 A 491 +A 492 1 n ILE . 492 A 492 +A 493 1 n LYS . 493 A 493 +A 494 1 n VAL . 494 A 494 +A 495 1 n ASN . 495 A 495 +A 496 1 n PHE . 496 A 496 +A 497 1 n LYS . 497 A 497 +A 498 1 n ILE . 498 A 498 +A 499 1 n ARG . 499 A 499 +A 500 1 n HIS . 500 A 500 +A 501 1 n ASN . 501 A 501 +A 502 1 n ILE . 502 A 502 +A 503 1 n GLU . 503 A 503 +A 504 1 n ASP . 504 A 504 +A 505 1 n GLY . 505 A 505 +A 506 1 n SER . 506 A 506 +A 507 1 n VAL . 507 A 507 +A 508 1 n GLN . 508 A 508 +A 509 1 n LEU . 509 A 509 +A 510 1 n ALA . 510 A 510 +A 511 1 n ASP . 511 A 511 +A 512 1 n HIS . 512 A 512 +A 513 1 n TYR . 513 A 513 +A 514 1 n GLN . 514 A 514 +A 515 1 n GLN . 515 A 515 +A 516 1 n ASN . 516 A 516 +A 517 1 n THR . 517 A 517 +A 518 1 n PRO . 518 A 518 +A 519 1 n ILE . 519 A 519 +A 520 1 n GLY . 520 A 520 +A 521 1 n ASP . 521 A 521 +A 522 1 n GLY . 522 A 522 +A 523 1 n PRO . 523 A 523 +A 524 1 n VAL . 524 A 524 +A 525 1 n LEU . 525 A 525 +A 526 1 n LEU . 526 A 526 +A 527 1 n PRO . 527 A 527 +A 528 1 n ASP . 528 A 528 +A 529 1 n ASN . 529 A 529 +A 530 1 n HIS . 530 A 530 +A 531 1 n TYR . 531 A 531 +A 532 1 n LEU . 532 A 532 +A 533 1 n SER . 533 A 533 +A 534 1 n THR . 534 A 534 +A 535 1 n GLN . 535 A 535 +A 536 1 n SER . 536 A 536 +A 537 1 n ALA . 537 A 537 +A 538 1 n LEU . 538 A 538 +A 539 1 n SER . 539 A 539 +A 540 1 n LYS . 540 A 540 +A 541 1 n ASP . 541 A 541 +A 542 1 n PRO . 542 A 542 +A 543 1 n ASN . 543 A 543 +A 544 1 n GLU . 544 A 544 +A 545 1 n LYS . 545 A 545 +A 546 1 n ARG . 546 A 546 +A 547 1 n ASP . 547 A 547 +A 548 1 n HIS . 548 A 548 +A 549 1 n MET . 549 A 549 +A 550 1 n VAL . 550 A 550 +A 551 1 n LEU . 551 A 551 +A 552 1 n LEU . 552 A 552 +A 553 1 n GLU . 553 A 553 +A 554 1 n PHE . 554 A 554 +A 555 1 n VAL . 555 A 555 +A 556 1 n THR . 556 A 556 +A 557 1 n ALA . 557 A 557 +A 558 1 n ALA . 558 A 558 +A 559 1 n GLY . 559 A 559 +A 560 1 n ILE . 560 A 560 +A 561 1 n THR . 561 A 561 +A 562 1 n LEU . 562 A 562 +A 563 1 n GLY . 563 A 563 +A 564 1 n MET . 564 A 564 +A 565 1 n ASP . 565 A 565 +A 566 1 n GLU . 566 A 566 +A 567 1 n LEU . 567 A 567 +A 568 1 n TYR . 568 A 568 +A 569 1 n LYS . 569 A 569 +B 1 2 n MET . 1 B 1 +B 2 2 n ASN . 2 B 2 +B 3 2 n SER . 3 B 3 +B 4 2 n THR . 4 B 4 +B 5 2 n ALA . 5 B 5 +B 6 2 n GLN . 6 B 6 +B 7 2 n GLN . 7 B 7 +B 8 2 n GLY . 8 B 8 +B 9 2 n LEU . 9 B 9 +B 10 2 n ILE . 10 B 10 +B 11 2 n PRO . 11 B 11 +B 12 2 n CYS . 12 B 12 +B 13 2 n TYR . 13 B 13 +B 14 2 n LEU . 14 B 14 +B 15 2 n ASN . 15 B 15 +B 16 2 n GLY . 16 B 16 +B 17 2 n SER . 17 B 17 +B 18 2 n LEU . 18 B 18 +B 19 2 n CYS . 19 B 19 +B 20 2 n PRO . 20 B 20 +B 21 2 n GLY . 21 B 21 +B 22 2 n THR . 22 B 22 +B 23 2 n LEU . 23 B 23 +B 24 2 n PRO . 24 B 24 +B 25 2 n GLU . 25 B 25 +B 26 2 n LYS . 26 B 26 +B 27 2 n ASP . 27 B 27 +B 28 2 n VAL . 28 B 28 +B 29 2 n SER . 29 B 29 +B 30 2 n GLY . 30 B 30 +B 31 2 n GLU . 31 B 31 +B 32 2 n GLU . 32 B 32 +B 33 2 n LYS . 33 B 33 +B 34 2 n ASP . 34 B 34 +B 35 2 n SER . 35 B 35 +B 36 2 n SER . 36 B 36 +B 37 2 n ALA . 37 B 37 +B 38 2 n GLY . 38 B 38 +B 39 2 n CYS . 39 B 39 +B 40 2 n SER . 40 B 40 +B 41 2 n GLU . 41 B 41 +B 42 2 n GLN . 42 B 42 +B 43 2 n LEU . 43 B 43 +B 44 2 n LEU . 44 B 44 +B 45 2 n ILE . 45 B 45 +B 46 2 n SER . 46 B 46 +B 47 2 n THR . 47 B 47 +B 48 2 n GLU . 48 B 48 +B 49 2 n VAL . 49 B 49 +B 50 2 n PHE . 50 B 50 +B 51 2 n LEU . 51 B 51 +B 52 2 n THR . 52 B 52 +B 53 2 n LEU . 53 B 53 +B 54 2 n GLY . 54 B 54 +B 55 2 n ILE . 55 B 55 +B 56 2 n ILE . 56 B 56 +B 57 2 n SER . 57 B 57 +B 58 2 n LEU . 58 B 58 +B 59 2 n LEU . 59 B 59 +B 60 2 n GLU . 60 B 60 +B 61 2 n ASN . 61 B 61 +B 62 2 n ILE . 62 B 62 +B 63 2 n LEU . 63 B 63 +B 64 2 n VAL . 64 B 64 +B 65 2 n VAL . 65 B 65 +B 66 2 n ALA . 66 B 66 +B 67 2 n ALA . 67 B 67 +B 68 2 n ILE . 68 B 68 +B 69 2 n ILE . 69 B 69 +B 70 2 n LYS . 70 B 70 +B 71 2 n ASN . 71 B 71 +B 72 2 n GLN . 72 B 72 +B 73 2 n ASN . 73 B 73 +B 74 2 n LEU . 74 B 74 +B 75 2 n HIS . 75 B 75 +B 76 2 n SER . 76 B 76 +B 77 2 n PRO . 77 B 77 +B 78 2 n MET . 78 B 78 +B 79 2 n TYR . 79 B 79 +B 80 2 n PHE . 80 B 80 +B 81 2 n PHE . 81 B 81 +B 82 2 n ILE . 82 B 82 +B 83 2 n CYS . 83 B 83 +B 84 2 n SER . 84 B 84 +B 85 2 n LEU . 85 B 85 +B 86 2 n ALA . 86 B 86 +B 87 2 n VAL . 87 B 87 +B 88 2 n ALA . 88 B 88 +B 89 2 n ASP . 89 B 89 +B 90 2 n MET . 90 B 90 +B 91 2 n LEU . 91 B 91 +B 92 2 n VAL . 92 B 92 +B 93 2 n SER . 93 B 93 +B 94 2 n VAL . 94 B 94 +B 95 2 n SER . 95 B 95 +B 96 2 n ASN . 96 B 96 +B 97 2 n ALA . 97 B 97 +B 98 2 n SER . 98 B 98 +B 99 2 n GLU . 99 B 99 +B 100 2 n THR . 100 B 100 +B 101 2 n ILE . 101 B 101 +B 102 2 n VAL . 102 B 102 +B 103 2 n ILE . 103 B 103 +B 104 2 n ALA . 104 B 104 +B 105 2 n LEU . 105 B 105 +B 106 2 n ILE . 106 B 106 +B 107 2 n ASN . 107 B 107 +B 108 2 n GLY . 108 B 108 +B 109 2 n GLY . 109 B 109 +B 110 2 n SER . 110 B 110 +B 111 2 n LEU . 111 B 111 +B 112 2 n THR . 112 B 112 +B 113 2 n ILE . 113 B 113 +B 114 2 n PRO . 114 B 114 +B 115 2 n VAL . 115 B 115 +B 116 2 n THR . 116 B 116 +B 117 2 n PHE . 117 B 117 +B 118 2 n ILE . 118 B 118 +B 119 2 n LYS . 119 B 119 +B 120 2 n SER . 120 B 120 +B 121 2 n MET . 121 B 121 +B 122 2 n ASP . 122 B 122 +B 123 2 n ASN . 123 B 123 +B 124 2 n VAL . 124 B 124 +B 125 2 n PHE . 125 B 125 +B 126 2 n ASP . 126 B 126 +B 127 2 n SER . 127 B 127 +B 128 2 n MET . 128 B 128 +B 129 2 n ILE . 129 B 129 +B 130 2 n CYS . 130 B 130 +B 131 2 n SER . 131 B 131 +B 132 2 n SER . 132 B 132 +B 133 2 n LEU . 133 B 133 +B 134 2 n LEU . 134 B 134 +B 135 2 n ALA . 135 B 135 +B 136 2 n SER . 136 B 136 +B 137 2 n ILE . 137 B 137 +B 138 2 n CYS . 138 B 138 +B 139 2 n SER . 139 B 139 +B 140 2 n LEU . 140 B 140 +B 141 2 n LEU . 141 B 141 +B 142 2 n ALA . 142 B 142 +B 143 2 n ILE . 143 B 143 +B 144 2 n ALA . 144 B 144 +B 145 2 n ILE . 145 B 145 +B 146 2 n ASP . 146 B 146 +B 147 2 n ARG . 147 B 147 +B 148 2 n TYR . 148 B 148 +B 149 2 n ILE . 149 B 149 +B 150 2 n THR . 150 B 150 +B 151 2 n ILE . 151 B 151 +B 152 2 n PHE . 152 B 152 +B 153 2 n TYR . 153 B 153 +B 154 2 n ALA . 154 B 154 +B 155 2 n LEU . 155 B 155 +B 156 2 n ARG . 156 B 156 +B 157 2 n TYR . 157 B 157 +B 158 2 n HIS . 158 B 158 +B 159 2 n ASN . 159 B 159 +B 160 2 n ILE . 160 B 160 +B 161 2 n VAL . 161 B 161 +B 162 2 n THR . 162 B 162 +B 163 2 n ILE . 163 B 163 +B 164 2 n ARG . 164 B 164 +B 165 2 n ARG . 165 B 165 +B 166 2 n ALA . 166 B 166 +B 167 2 n LEU . 167 B 167 +B 168 2 n LEU . 168 B 168 +B 169 2 n VAL . 169 B 169 +B 170 2 n ILE . 170 B 170 +B 171 2 n ALA . 171 B 171 +B 172 2 n GLY . 172 B 172 +B 173 2 n ILE . 173 B 173 +B 174 2 n TRP . 174 B 174 +B 175 2 n THR . 175 B 175 +B 176 2 n CYS . 176 B 176 +B 177 2 n CYS . 177 B 177 +B 178 2 n THR . 178 B 178 +B 179 2 n VAL . 179 B 179 +B 180 2 n SER . 180 B 180 +B 181 2 n GLY . 181 B 181 +B 182 2 n ILE . 182 B 182 +B 183 2 n LEU . 183 B 183 +B 184 2 n PHE . 184 B 184 +B 185 2 n ILE . 185 B 185 +B 186 2 n ILE . 186 B 186 +B 187 2 n TYR . 187 B 187 +B 188 2 n SER . 188 B 188 +B 189 2 n GLU . 189 B 189 +B 190 2 n SER . 190 B 190 +B 191 2 n THR . 191 B 191 +B 192 2 n MET . 192 B 192 +B 193 2 n VAL . 193 B 193 +B 194 2 n LEU . 194 B 194 +B 195 2 n ILE . 195 B 195 +B 196 2 n CYS . 196 B 196 +B 197 2 n LEU . 197 B 197 +B 198 2 n ILE . 198 B 198 +B 199 2 n THR . 199 B 199 +B 200 2 n MET . 200 B 200 +B 201 2 n PHE . 201 B 201 +B 202 2 n PHE . 202 B 202 +B 203 2 n THR . 203 B 203 +B 204 2 n MET . 204 B 204 +B 205 2 n LEU . 205 B 205 +B 206 2 n VAL . 206 B 206 +B 207 2 n LEU . 207 B 207 +B 208 2 n MET . 208 B 208 +B 209 2 n ALA . 209 B 209 +B 210 2 n SER . 210 B 210 +B 211 2 n LEU . 211 B 211 +B 212 2 n TYR . 212 B 212 +B 213 2 n VAL . 213 B 213 +B 214 2 n HIS . 214 B 214 +B 215 2 n MET . 215 B 215 +B 216 2 n PHE . 216 B 216 +B 217 2 n LEU . 217 B 217 +B 218 2 n LEU . 218 B 218 +B 219 2 n ALA . 219 B 219 +B 220 2 n ARG . 220 B 220 +B 221 2 n GLN . 221 B 221 +B 222 2 n HIS . 222 B 222 +B 223 2 n MET . 223 B 223 +B 224 2 n LYS . 224 B 224 +B 225 2 n ARG . 225 B 225 +B 226 2 n ILE . 226 B 226 +B 227 2 n ALA . 227 B 227 +B 228 2 n ALA . 228 B 228 +B 229 2 n LEU . 229 B 229 +B 230 2 n PRO . 230 B 230 +B 231 2 n GLY . 231 B 231 +B 232 2 n ASN . 232 B 232 +B 233 2 n ALA . 233 B 233 +B 234 2 n PRO . 234 B 234 +B 235 2 n ILE . 235 B 235 +B 236 2 n GLN . 236 B 236 +B 237 2 n GLN . 237 B 237 +B 238 2 n ARG . 238 B 238 +B 239 2 n ALA . 239 B 239 +B 240 2 n ASN . 240 B 240 +B 241 2 n MET . 241 B 241 +B 242 2 n LYS . 242 B 242 +B 243 2 n GLY . 243 B 243 +B 244 2 n ALA . 244 B 244 +B 245 2 n ILE . 245 B 245 +B 246 2 n THR . 246 B 246 +B 247 2 n LEU . 247 B 247 +B 248 2 n THR . 248 B 248 +B 249 2 n ILE . 249 B 249 +B 250 2 n LEU . 250 B 250 +B 251 2 n LEU . 251 B 251 +B 252 2 n GLY . 252 B 252 +B 253 2 n VAL . 253 B 253 +B 254 2 n PHE . 254 B 254 +B 255 2 n VAL . 255 B 255 +B 256 2 n VAL . 256 B 256 +B 257 2 n CYS . 257 B 257 +B 258 2 n TRP . 258 B 258 +B 259 2 n ALA . 259 B 259 +B 260 2 n PRO . 260 B 260 +B 261 2 n PHE . 261 B 261 +B 262 2 n PHE . 262 B 262 +B 263 2 n LEU . 263 B 263 +B 264 2 n HIS . 264 B 264 +B 265 2 n LEU . 265 B 265 +B 266 2 n ILE . 266 B 266 +B 267 2 n LEU . 267 B 267 +B 268 2 n MET . 268 B 268 +B 269 2 n ILE . 269 B 269 +B 270 2 n THR . 270 B 270 +B 271 2 n CYS . 271 B 271 +B 272 2 n PRO . 272 B 272 +B 273 2 n ARG . 273 B 273 +B 274 2 n ASN . 274 B 274 +B 275 2 n PRO . 275 B 275 +B 276 2 n TYR . 276 B 276 +B 277 2 n CYS . 277 B 277 +B 278 2 n THR . 278 B 278 +B 279 2 n CYS . 279 B 279 +B 280 2 n PHE . 280 B 280 +B 281 2 n MET . 281 B 281 +B 282 2 n SER . 282 B 282 +B 283 2 n HIS . 283 B 283 +B 284 2 n PHE . 284 B 284 +B 285 2 n ASN . 285 B 285 +B 286 2 n MET . 286 B 286 +B 287 2 n TYR . 287 B 287 +B 288 2 n LEU . 288 B 288 +B 289 2 n ILE . 289 B 289 +B 290 2 n LEU . 290 B 290 +B 291 2 n ILE . 291 B 291 +B 292 2 n MET . 292 B 292 +B 293 2 n CYS . 293 B 293 +B 294 2 n ASN . 294 B 294 +B 295 2 n SER . 295 B 295 +B 296 2 n ILE . 296 B 296 +B 297 2 n ILE . 297 B 297 +B 298 2 n ASP . 298 B 298 +B 299 2 n PRO . 299 B 299 +B 300 2 n ILE . 300 B 300 +B 301 2 n ILE . 301 B 301 +B 302 2 n TYR . 302 B 302 +B 303 2 n ALA . 303 B 303 +B 304 2 n PHE . 304 B 304 +B 305 2 n ARG . 305 B 305 +B 306 2 n SER . 306 B 306 +B 307 2 n GLN . 307 B 307 +B 308 2 n GLU . 308 B 308 +B 309 2 n MET . 309 B 309 +B 310 2 n ARG . 310 B 310 +B 311 2 n LYS . 311 B 311 +B 312 2 n THR . 312 B 312 +B 313 2 n PHE . 313 B 313 +B 314 2 n LYS . 314 B 314 +B 315 2 n GLU . 315 B 315 +B 316 2 n ILE . 316 B 316 +B 317 2 n PHE . 317 B 317 +B 318 2 n CYS . 318 B 318 +B 319 2 n CYS . 319 B 319 +B 320 2 n SER . 320 B 320 +B 321 2 n GLN . 321 B 321 +B 322 2 n ALA . 322 B 322 +B 323 2 n LEU . 323 B 323 +B 324 2 n SER . 324 B 324 +B 325 2 n CYS . 325 B 325 +B 326 2 n ILE . 326 B 326 +B 327 2 n SER . 327 B 327 +B 328 2 n PHE . 328 B 328 +B 329 2 n LEU . 329 B 329 +B 330 2 n SER . 330 B 330 +B 331 2 n ARG . 331 B 331 +B 332 2 n VAL . 332 B 332 +B 333 2 n SER . 333 B 333 +B 334 2 n LYS . 334 B 334 +B 335 2 n GLY . 335 B 335 +B 336 2 n GLU . 336 B 336 +B 337 2 n GLU . 337 B 337 +B 338 2 n LEU . 338 B 338 +B 339 2 n PHE . 339 B 339 +B 340 2 n THR . 340 B 340 +B 341 2 n GLY . 341 B 341 +B 342 2 n VAL . 342 B 342 +B 343 2 n VAL . 343 B 343 +B 344 2 n PRO . 344 B 344 +B 345 2 n ILE . 345 B 345 +B 346 2 n LEU . 346 B 346 +B 347 2 n VAL . 347 B 347 +B 348 2 n GLU . 348 B 348 +B 349 2 n LEU . 349 B 349 +B 350 2 n ASP . 350 B 350 +B 351 2 n GLY . 351 B 351 +B 352 2 n ASP . 352 B 352 +B 353 2 n VAL . 353 B 353 +B 354 2 n ASN . 354 B 354 +B 355 2 n GLY . 355 B 355 +B 356 2 n HIS . 356 B 356 +B 357 2 n LYS . 357 B 357 +B 358 2 n PHE . 358 B 358 +B 359 2 n SER . 359 B 359 +B 360 2 n VAL . 360 B 360 +B 361 2 n SER . 361 B 361 +B 362 2 n GLY . 362 B 362 +B 363 2 n GLU . 363 B 363 +B 364 2 n GLY . 364 B 364 +B 365 2 n GLU . 365 B 365 +B 366 2 n GLY . 366 B 366 +B 367 2 n ASP . 367 B 367 +B 368 2 n ALA . 368 B 368 +B 369 2 n THR . 369 B 369 +B 370 2 n TYR . 370 B 370 +B 371 2 n GLY . 371 B 371 +B 372 2 n LYS . 372 B 372 +B 373 2 n LEU . 373 B 373 +B 374 2 n THR . 374 B 374 +B 375 2 n LEU . 375 B 375 +B 376 2 n LYS . 376 B 376 +B 377 2 n PHE . 377 B 377 +B 378 2 n ILE . 378 B 378 +B 379 2 n CYS . 379 B 379 +B 380 2 n THR . 380 B 380 +B 381 2 n THR . 381 B 381 +B 382 2 n GLY . 382 B 382 +B 383 2 n LYS . 383 B 383 +B 384 2 n LEU . 384 B 384 +B 385 2 n PRO . 385 B 385 +B 386 2 n VAL . 386 B 386 +B 387 2 n PRO . 387 B 387 +B 388 2 n TRP . 388 B 388 +B 389 2 n PRO . 389 B 389 +B 390 2 n THR . 390 B 390 +B 391 2 n LEU . 391 B 391 +B 392 2 n VAL . 392 B 392 +B 393 2 n THR . 393 B 393 +B 394 2 n THR . 394 B 394 +B 395 2 n LEU . 395 B 395 +B 396 2 n THR . 396 B 396 +B 397 2 n TYR . 397 B 397 +B 398 2 n GLY . 398 B 398 +B 399 2 n VAL . 399 B 399 +B 400 2 n GLN . 400 B 400 +B 401 2 n CYS . 401 B 401 +B 402 2 n PHE . 402 B 402 +B 403 2 n SER . 403 B 403 +B 404 2 n ARG . 404 B 404 +B 405 2 n TYR . 405 B 405 +B 406 2 n PRO . 406 B 406 +B 407 2 n ASP . 407 B 407 +B 408 2 n HIS . 408 B 408 +B 409 2 n MET . 409 B 409 +B 410 2 n LYS . 410 B 410 +B 411 2 n GLN . 411 B 411 +B 412 2 n HIS . 412 B 412 +B 413 2 n ASP . 413 B 413 +B 414 2 n PHE . 414 B 414 +B 415 2 n PHE . 415 B 415 +B 416 2 n LYS . 416 B 416 +B 417 2 n SER . 417 B 417 +B 418 2 n ALA . 418 B 418 +B 419 2 n MET . 419 B 419 +B 420 2 n PRO . 420 B 420 +B 421 2 n GLU . 421 B 421 +B 422 2 n GLY . 422 B 422 +B 423 2 n TYR . 423 B 423 +B 424 2 n VAL . 424 B 424 +B 425 2 n GLN . 425 B 425 +B 426 2 n GLU . 426 B 426 +B 427 2 n ARG . 427 B 427 +B 428 2 n THR . 428 B 428 +B 429 2 n ILE . 429 B 429 +B 430 2 n PHE . 430 B 430 +B 431 2 n PHE . 431 B 431 +B 432 2 n LYS . 432 B 432 +B 433 2 n ASP . 433 B 433 +B 434 2 n ASP . 434 B 434 +B 435 2 n GLY . 435 B 435 +B 436 2 n ASN . 436 B 436 +B 437 2 n TYR . 437 B 437 +B 438 2 n LYS . 438 B 438 +B 439 2 n THR . 439 B 439 +B 440 2 n ARG . 440 B 440 +B 441 2 n ALA . 441 B 441 +B 442 2 n GLU . 442 B 442 +B 443 2 n VAL . 443 B 443 +B 444 2 n LYS . 444 B 444 +B 445 2 n PHE . 445 B 445 +B 446 2 n GLU . 446 B 446 +B 447 2 n GLY . 447 B 447 +B 448 2 n ASP . 448 B 448 +B 449 2 n THR . 449 B 449 +B 450 2 n LEU . 450 B 450 +B 451 2 n VAL . 451 B 451 +B 452 2 n ASN . 452 B 452 +B 453 2 n ARG . 453 B 453 +B 454 2 n ILE . 454 B 454 +B 455 2 n GLU . 455 B 455 +B 456 2 n LEU . 456 B 456 +B 457 2 n LYS . 457 B 457 +B 458 2 n GLY . 458 B 458 +B 459 2 n ILE . 459 B 459 +B 460 2 n ASP . 460 B 460 +B 461 2 n PHE . 461 B 461 +B 462 2 n LYS . 462 B 462 +B 463 2 n GLU . 463 B 463 +B 464 2 n ASP . 464 B 464 +B 465 2 n GLY . 465 B 465 +B 466 2 n ASN . 466 B 466 +B 467 2 n ILE . 467 B 467 +B 468 2 n LEU . 468 B 468 +B 469 2 n GLY . 469 B 469 +B 470 2 n HIS . 470 B 470 +B 471 2 n LYS . 471 B 471 +B 472 2 n LEU . 472 B 472 +B 473 2 n GLU . 473 B 473 +B 474 2 n TYR . 474 B 474 +B 475 2 n ASN . 475 B 475 +B 476 2 n TYR . 476 B 476 +B 477 2 n ASN . 477 B 477 +B 478 2 n SER . 478 B 478 +B 479 2 n HIS . 479 B 479 +B 480 2 n ASN . 480 B 480 +B 481 2 n VAL . 481 B 481 +B 482 2 n TYR . 482 B 482 +B 483 2 n ILE . 483 B 483 +B 484 2 n MET . 484 B 484 +B 485 2 n ALA . 485 B 485 +B 486 2 n ASP . 486 B 486 +B 487 2 n LYS . 487 B 487 +B 488 2 n GLN . 488 B 488 +B 489 2 n LYS . 489 B 489 +B 490 2 n ASN . 490 B 490 +B 491 2 n GLY . 491 B 491 +B 492 2 n ILE . 492 B 492 +B 493 2 n LYS . 493 B 493 +B 494 2 n VAL . 494 B 494 +B 495 2 n ASN . 495 B 495 +B 496 2 n PHE . 496 B 496 +B 497 2 n LYS . 497 B 497 +B 498 2 n ILE . 498 B 498 +B 499 2 n ARG . 499 B 499 +B 500 2 n HIS . 500 B 500 +B 501 2 n ASN . 501 B 501 +B 502 2 n ILE . 502 B 502 +B 503 2 n GLU . 503 B 503 +B 504 2 n ASP . 504 B 504 +B 505 2 n GLY . 505 B 505 +B 506 2 n SER . 506 B 506 +B 507 2 n VAL . 507 B 507 +B 508 2 n GLN . 508 B 508 +B 509 2 n LEU . 509 B 509 +B 510 2 n ALA . 510 B 510 +B 511 2 n ASP . 511 B 511 +B 512 2 n HIS . 512 B 512 +B 513 2 n TYR . 513 B 513 +B 514 2 n GLN . 514 B 514 +B 515 2 n GLN . 515 B 515 +B 516 2 n ASN . 516 B 516 +B 517 2 n THR . 517 B 517 +B 518 2 n PRO . 518 B 518 +B 519 2 n ILE . 519 B 519 +B 520 2 n GLY . 520 B 520 +B 521 2 n ASP . 521 B 521 +B 522 2 n GLY . 522 B 522 +B 523 2 n PRO . 523 B 523 +B 524 2 n VAL . 524 B 524 +B 525 2 n LEU . 525 B 525 +B 526 2 n LEU . 526 B 526 +B 527 2 n PRO . 527 B 527 +B 528 2 n ASP . 528 B 528 +B 529 2 n ASN . 529 B 529 +B 530 2 n HIS . 530 B 530 +B 531 2 n TYR . 531 B 531 +B 532 2 n LEU . 532 B 532 +B 533 2 n SER . 533 B 533 +B 534 2 n THR . 534 B 534 +B 535 2 n GLN . 535 B 535 +B 536 2 n SER . 536 B 536 +B 537 2 n ALA . 537 B 537 +B 538 2 n LEU . 538 B 538 +B 539 2 n SER . 539 B 539 +B 540 2 n LYS . 540 B 540 +B 541 2 n ASP . 541 B 541 +B 542 2 n PRO . 542 B 542 +B 543 2 n ASN . 543 B 543 +B 544 2 n GLU . 544 B 544 +B 545 2 n LYS . 545 B 545 +B 546 2 n ARG . 546 B 546 +B 547 2 n ASP . 547 B 547 +B 548 2 n HIS . 548 B 548 +B 549 2 n MET . 549 B 549 +B 550 2 n VAL . 550 B 550 +B 551 2 n LEU . 551 B 551 +B 552 2 n LEU . 552 B 552 +B 553 2 n GLU . 553 B 553 +B 554 2 n PHE . 554 B 554 +B 555 2 n VAL . 555 B 555 +B 556 2 n THR . 556 B 556 +B 557 2 n ALA . 557 B 557 +B 558 2 n ALA . 558 B 558 +B 559 2 n GLY . 559 B 559 +B 560 2 n ILE . 560 B 560 +B 561 2 n THR . 561 B 561 +B 562 2 n LEU . 562 B 562 +B 563 2 n GLY . 563 B 563 +B 564 2 n MET . 564 B 564 +B 565 2 n ASP . 565 B 565 +B 566 2 n GLU . 566 B 566 +B 567 2 n LEU . 567 B 567 +B 568 2 n TYR . 568 B 568 +B 569 2 n LYS . 569 B 569 +# +_software.classification other +_software.date ? +_software.description "Structure prediction" +_software.name AlphaFold +_software.pdbx_ordinal 1 +_software.type package +_software.version "AlphaFold-beta-20231127 (52ceabbc-a146-4d20-8f14-848cbf63912f @ 2026-01-15 01:31:36)" +# +loop_ +_struct_asym.entity_id +_struct_asym.id +1 A +2 B +# +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.occupancy +_atom_site.B_iso_or_equiv +_atom_site.auth_seq_id +_atom_site.auth_asym_id +_atom_site.pdbx_PDB_model_num +ATOM 1 N N . MET A 1 1 ? -42.661 5.081 -42.252 1.00 22.82 1 A 1 +ATOM 2 C CA . MET A 1 1 ? -42.459 3.948 -41.323 1.00 24.68 1 A 1 +ATOM 3 C C . MET A 1 1 ? -41.864 4.509 -40.045 1.00 26.03 1 A 1 +ATOM 4 O O . MET A 1 1 ? -41.108 5.456 -40.135 1.00 24.34 1 A 1 +ATOM 5 C CB . MET A 1 1 ? -41.559 2.874 -41.941 1.00 22.93 1 A 1 +ATOM 6 C CG . MET A 1 1 ? -42.355 1.943 -42.878 1.00 20.70 1 A 1 +ATOM 7 S SD . MET A 1 1 ? -41.322 0.767 -43.773 1.00 19.60 1 A 1 +ATOM 8 C CE . MET A 1 1 ? -42.572 -0.396 -44.401 1.00 17.14 1 A 1 +ATOM 9 N N . ASN A 1 2 ? -42.282 4.027 -38.875 1.00 24.41 2 A 1 +ATOM 10 C CA . ASN A 1 2 ? -42.143 4.758 -37.601 1.00 25.21 2 A 1 +ATOM 11 C C . ASN A 1 2 ? -40.688 4.817 -37.121 1.00 25.79 2 A 1 +ATOM 12 O O . ASN A 1 2 ? -40.145 3.812 -36.690 1.00 24.39 2 A 1 +ATOM 13 C CB . ASN A 1 2 ? -43.063 4.109 -36.553 1.00 23.36 2 A 1 +ATOM 14 C CG . ASN A 1 2 ? -44.531 4.384 -36.807 1.00 20.49 2 A 1 +ATOM 15 O OD1 . ASN A 1 2 ? -44.899 5.170 -37.657 1.00 19.56 2 A 1 +ATOM 16 N ND2 . ASN A 1 2 ? -45.418 3.719 -36.111 1.00 19.63 2 A 1 +ATOM 17 N N . SER A 1 3 ? -40.102 6.002 -37.173 1.00 24.58 3 A 1 +ATOM 18 C CA . SER A 1 3 ? -38.794 6.319 -36.611 1.00 26.22 3 A 1 +ATOM 19 C C . SER A 1 3 ? -38.899 6.430 -35.085 1.00 26.31 3 A 1 +ATOM 20 O O . SER A 1 3 ? -38.890 7.527 -34.535 1.00 25.04 3 A 1 +ATOM 21 C CB . SER A 1 3 ? -38.274 7.630 -37.229 1.00 24.70 3 A 1 +ATOM 22 O OG . SER A 1 3 ? -39.214 8.670 -37.035 1.00 23.06 3 A 1 +ATOM 23 N N . THR A 1 4 ? -39.041 5.304 -34.401 1.00 29.19 4 A 1 +ATOM 24 C CA . THR A 1 4 ? -38.929 5.256 -32.940 1.00 30.31 4 A 1 +ATOM 25 C C . THR A 1 4 ? -37.472 5.546 -32.581 1.00 29.90 4 A 1 +ATOM 26 O O . THR A 1 4 ? -36.647 4.637 -32.582 1.00 28.00 4 A 1 +ATOM 27 C CB . THR A 1 4 ? -39.371 3.894 -32.382 1.00 28.21 4 A 1 +ATOM 28 O OG1 . THR A 1 4 ? -38.873 2.839 -33.176 1.00 26.11 4 A 1 +ATOM 29 C CG2 . THR A 1 4 ? -40.893 3.767 -32.370 1.00 25.91 4 A 1 +ATOM 30 N N . ALA A 1 5 ? -37.185 6.828 -32.341 1.00 29.55 5 A 1 +ATOM 31 C CA . ALA A 1 5 ? -35.896 7.236 -31.815 1.00 30.98 5 A 1 +ATOM 32 C C . ALA A 1 5 ? -35.680 6.488 -30.489 1.00 31.27 5 A 1 +ATOM 33 O O . ALA A 1 5 ? -36.454 6.660 -29.551 1.00 29.99 5 A 1 +ATOM 34 C CB . ALA A 1 5 ? -35.891 8.759 -31.645 1.00 29.25 5 A 1 +ATOM 35 N N . GLN A 1 6 ? -34.662 5.627 -30.443 1.00 33.07 6 A 1 +ATOM 36 C CA . GLN A 1 6 ? -34.249 4.994 -29.197 1.00 34.27 6 A 1 +ATOM 37 C C . GLN A 1 6 ? -33.702 6.106 -28.295 1.00 34.52 6 A 1 +ATOM 38 O O . GLN A 1 6 ? -32.640 6.658 -28.562 1.00 33.35 6 A 1 +ATOM 39 C CB . GLN A 1 6 ? -33.212 3.889 -29.461 1.00 32.76 6 A 1 +ATOM 40 C CG . GLN A 1 6 ? -33.867 2.583 -29.934 1.00 30.51 6 A 1 +ATOM 41 C CD . GLN A 1 6 ? -32.830 1.501 -30.261 1.00 28.30 6 A 1 +ATOM 42 O OE1 . GLN A 1 6 ? -31.874 1.748 -30.967 1.00 27.98 6 A 1 +ATOM 43 N NE2 . GLN A 1 6 ? -33.008 0.290 -29.794 1.00 28.40 6 A 1 +ATOM 44 N N . GLN A 1 7 ? -34.485 6.472 -27.284 1.00 35.03 7 A 1 +ATOM 45 C CA . GLN A 1 7 ? -34.076 7.412 -26.243 1.00 37.04 7 A 1 +ATOM 46 C C . GLN A 1 7 ? -32.974 6.747 -25.411 1.00 37.59 7 A 1 +ATOM 47 O O . GLN A 1 7 ? -33.043 5.542 -25.160 1.00 36.54 7 A 1 +ATOM 48 C CB . GLN A 1 7 ? -35.294 7.799 -25.390 1.00 35.87 7 A 1 +ATOM 49 C CG . GLN A 1 7 ? -36.241 8.751 -26.143 1.00 33.82 7 A 1 +ATOM 50 C CD . GLN A 1 7 ? -37.499 9.104 -25.350 1.00 31.26 7 A 1 +ATOM 51 O OE1 . GLN A 1 7 ? -38.082 8.298 -24.650 1.00 30.68 7 A 1 +ATOM 52 N NE2 . GLN A 1 7 ? -37.995 10.313 -25.470 1.00 30.35 7 A 1 +ATOM 53 N N . GLY A 1 8 ? -31.980 7.530 -25.023 1.00 39.91 8 A 1 +ATOM 54 C CA . GLY A 1 8 ? -31.000 7.116 -24.027 1.00 41.43 8 A 1 +ATOM 55 C C . GLY A 1 8 ? -31.675 6.816 -22.687 1.00 42.01 8 A 1 +ATOM 56 O O . GLY A 1 8 ? -32.879 7.017 -22.515 1.00 40.73 8 A 1 +ATOM 57 N N . LEU A 1 9 ? -30.887 6.322 -21.721 1.00 42.47 9 A 1 +ATOM 58 C CA . LEU A 1 9 ? -31.354 6.022 -20.363 1.00 43.26 9 A 1 +ATOM 59 C C . LEU A 1 9 ? -31.937 7.256 -19.681 1.00 43.81 9 A 1 +ATOM 60 O O . LEU A 1 9 ? -32.985 7.180 -19.053 1.00 41.97 9 A 1 +ATOM 61 C CB . LEU A 1 9 ? -30.167 5.503 -19.557 1.00 40.53 9 A 1 +ATOM 62 C CG . LEU A 1 9 ? -30.229 3.985 -19.360 1.00 38.05 9 A 1 +ATOM 63 C CD1 . LEU A 1 9 ? -28.844 3.388 -19.474 1.00 36.00 9 A 1 +ATOM 64 C CD2 . LEU A 1 9 ? -30.796 3.651 -17.992 1.00 36.71 9 A 1 +ATOM 65 N N . ILE A 1 10 ? -31.247 8.380 -19.841 1.00 42.21 10 A 1 +ATOM 66 C CA . ILE A 1 10 ? -31.730 9.691 -19.428 1.00 43.43 10 A 1 +ATOM 67 C C . ILE A 1 10 ? -32.488 10.257 -20.627 1.00 43.79 10 A 1 +ATOM 68 O O . ILE A 1 10 ? -31.873 10.568 -21.646 1.00 42.11 10 A 1 +ATOM 69 C CB . ILE A 1 10 ? -30.577 10.598 -18.954 1.00 41.67 10 A 1 +ATOM 70 C CG1 . ILE A 1 10 ? -29.799 9.909 -17.817 1.00 39.52 10 A 1 +ATOM 71 C CG2 . ILE A 1 10 ? -31.144 11.954 -18.490 1.00 38.96 10 A 1 +ATOM 72 C CD1 . ILE A 1 10 ? -28.578 10.667 -17.326 1.00 37.03 10 A 1 +ATOM 73 N N . PRO A 1 11 ? -33.816 10.361 -20.559 1.00 40.40 11 A 1 +ATOM 74 C CA . PRO A 1 11 ? -34.549 10.989 -21.636 1.00 41.12 11 A 1 +ATOM 75 C C . PRO A 1 11 ? -34.033 12.420 -21.765 1.00 40.78 11 A 1 +ATOM 76 O O . PRO A 1 11 ? -34.182 13.222 -20.840 1.00 39.73 11 A 1 +ATOM 77 C CB . PRO A 1 11 ? -36.027 10.905 -21.234 1.00 39.78 11 A 1 +ATOM 78 C CG . PRO A 1 11 ? -35.992 10.771 -19.709 1.00 39.95 11 A 1 +ATOM 79 C CD . PRO A 1 11 ? -34.685 10.036 -19.445 1.00 42.55 11 A 1 +ATOM 80 N N . CYS A 1 12 ? -33.424 12.735 -22.905 1.00 40.53 12 A 1 +ATOM 81 C CA . CYS A 1 12 ? -32.876 14.060 -23.146 1.00 40.33 12 A 1 +ATOM 82 C C . CYS A 1 12 ? -34.037 15.072 -23.131 1.00 39.38 12 A 1 +ATOM 83 O O . CYS A 1 12 ? -34.819 15.145 -24.075 1.00 37.41 12 A 1 +ATOM 84 C CB . CYS A 1 12 ? -32.089 14.031 -24.460 1.00 37.85 12 A 1 +ATOM 85 S SG . CYS A 1 12 ? -31.023 15.497 -24.576 1.00 34.94 12 A 1 +ATOM 86 N N . TYR A 1 13 ? -34.172 15.805 -22.025 1.00 38.79 13 A 1 +ATOM 87 C CA . TYR A 1 13 ? -35.354 16.640 -21.747 1.00 38.85 13 A 1 +ATOM 88 C C . TYR A 1 13 ? -35.566 17.736 -22.792 1.00 37.87 13 A 1 +ATOM 89 O O . TYR A 1 13 ? -36.670 18.243 -22.952 1.00 36.12 13 A 1 +ATOM 90 C CB . TYR A 1 13 ? -35.238 17.251 -20.346 1.00 36.75 13 A 1 +ATOM 91 C CG . TYR A 1 13 ? -35.758 16.339 -19.250 1.00 35.00 13 A 1 +ATOM 92 C CD1 . TYR A 1 13 ? -37.103 16.430 -18.848 1.00 33.24 13 A 1 +ATOM 93 C CD2 . TYR A 1 13 ? -34.916 15.406 -18.645 1.00 32.56 13 A 1 +ATOM 94 C CE1 . TYR A 1 13 ? -37.603 15.584 -17.852 1.00 30.79 13 A 1 +ATOM 95 C CE2 . TYR A 1 13 ? -35.411 14.546 -17.653 1.00 31.08 13 A 1 +ATOM 96 C CZ . TYR A 1 13 ? -36.760 14.630 -17.256 1.00 30.44 13 A 1 +ATOM 97 O OH . TYR A 1 13 ? -37.243 13.785 -16.304 1.00 28.95 13 A 1 +ATOM 98 N N . LEU A 1 14 ? -34.519 18.053 -23.559 1.00 34.59 14 A 1 +ATOM 99 C CA . LEU A 1 14 ? -34.585 18.973 -24.690 1.00 35.51 14 A 1 +ATOM 100 C C . LEU A 1 14 ? -35.542 18.512 -25.784 1.00 35.54 14 A 1 +ATOM 101 O O . LEU A 1 14 ? -36.124 19.357 -26.461 1.00 33.74 14 A 1 +ATOM 102 C CB . LEU A 1 14 ? -33.174 19.142 -25.253 1.00 33.02 14 A 1 +ATOM 103 C CG . LEU A 1 14 ? -32.381 20.208 -24.478 1.00 30.23 14 A 1 +ATOM 104 C CD1 . LEU A 1 14 ? -30.907 19.891 -24.537 1.00 28.58 14 A 1 +ATOM 105 C CD2 . LEU A 1 14 ? -32.638 21.589 -25.091 1.00 30.16 14 A 1 +ATOM 106 N N . ASN A 1 15 ? -35.750 17.210 -25.962 1.00 33.45 15 A 1 +ATOM 107 C CA . ASN A 1 15 ? -36.688 16.742 -26.993 1.00 33.97 15 A 1 +ATOM 108 C C . ASN A 1 15 ? -38.146 17.093 -26.685 1.00 33.73 15 A 1 +ATOM 109 O O . ASN A 1 15 ? -38.957 17.125 -27.606 1.00 32.27 15 A 1 +ATOM 110 C CB . ASN A 1 15 ? -36.502 15.235 -27.228 1.00 32.06 15 A 1 +ATOM 111 C CG . ASN A 1 15 ? -35.503 14.924 -28.331 1.00 29.43 15 A 1 +ATOM 112 O OD1 . ASN A 1 15 ? -35.143 15.750 -29.154 1.00 28.61 15 A 1 +ATOM 113 N ND2 . ASN A 1 15 ? -35.063 13.691 -28.413 1.00 28.62 15 A 1 +ATOM 114 N N . GLY A 1 16 ? -38.492 17.373 -25.422 1.00 34.76 16 A 1 +ATOM 115 C CA . GLY A 1 16 ? -39.856 17.744 -25.073 1.00 34.88 16 A 1 +ATOM 116 C C . GLY A 1 16 ? -40.278 19.106 -25.630 1.00 34.64 16 A 1 +ATOM 117 O O . GLY A 1 16 ? -41.419 19.263 -26.057 1.00 32.83 16 A 1 +ATOM 118 N N . SER A 1 17 ? -39.379 20.094 -25.660 1.00 31.41 17 A 1 +ATOM 119 C CA . SER A 1 17 ? -39.719 21.456 -26.101 1.00 32.25 17 A 1 +ATOM 120 C C . SER A 1 17 ? -39.455 21.714 -27.587 1.00 32.40 17 A 1 +ATOM 121 O O . SER A 1 17 ? -40.185 22.476 -28.212 1.00 31.05 17 A 1 +ATOM 122 C CB . SER A 1 17 ? -38.977 22.494 -25.258 1.00 30.32 17 A 1 +ATOM 123 O OG . SER A 1 17 ? -37.580 22.393 -25.446 1.00 29.03 17 A 1 +ATOM 124 N N . LEU A 1 18 ? -38.393 21.114 -28.133 1.00 32.68 18 A 1 +ATOM 125 C CA . LEU A 1 18 ? -37.953 21.399 -29.505 1.00 33.76 18 A 1 +ATOM 126 C C . LEU A 1 18 ? -38.574 20.494 -30.571 1.00 33.35 18 A 1 +ATOM 127 O O . LEU A 1 18 ? -38.375 20.757 -31.754 1.00 32.06 18 A 1 +ATOM 128 C CB . LEU A 1 18 ? -36.417 21.391 -29.591 1.00 32.00 18 A 1 +ATOM 129 C CG . LEU A 1 18 ? -35.794 22.732 -29.204 1.00 29.76 18 A 1 +ATOM 130 C CD1 . LEU A 1 18 ? -34.300 22.557 -28.964 1.00 28.70 18 A 1 +ATOM 131 C CD2 . LEU A 1 18 ? -35.966 23.771 -30.329 1.00 29.94 18 A 1 +ATOM 132 N N . CYS A 1 19 ? -39.345 19.467 -30.193 1.00 32.93 19 A 1 +ATOM 133 C CA . CYS A 1 19 ? -40.247 18.875 -31.169 1.00 34.04 19 A 1 +ATOM 134 C C . CYS A 1 19 ? -41.239 19.976 -31.569 1.00 32.66 19 A 1 +ATOM 135 O O . CYS A 1 19 ? -41.991 20.434 -30.699 1.00 31.18 19 A 1 +ATOM 136 C CB . CYS A 1 19 ? -40.958 17.645 -30.591 1.00 32.59 19 A 1 +ATOM 137 S SG . CYS A 1 19 ? -39.904 16.170 -30.839 1.00 29.85 19 A 1 +ATOM 138 N N . PRO A 1 20 ? -41.213 20.449 -32.815 1.00 28.80 20 A 1 +ATOM 139 C CA . PRO A 1 20 ? -42.179 21.437 -33.248 1.00 29.83 20 A 1 +ATOM 140 C C . PRO A 1 20 ? -43.544 20.791 -33.061 1.00 29.81 20 A 1 +ATOM 141 O O . PRO A 1 20 ? -43.877 19.827 -33.747 1.00 28.65 20 A 1 +ATOM 142 C CB . PRO A 1 20 ? -41.830 21.750 -34.708 1.00 28.54 20 A 1 +ATOM 143 C CG . PRO A 1 20 ? -41.110 20.492 -35.181 1.00 29.30 20 A 1 +ATOM 144 C CD . PRO A 1 20 ? -40.415 19.968 -33.917 1.00 32.42 20 A 1 +ATOM 145 N N . GLY A 1 21 ? -44.271 21.285 -32.078 1.00 28.18 21 A 1 +ATOM 146 C CA . GLY A 1 21 ? -45.625 20.848 -31.861 1.00 29.12 21 A 1 +ATOM 147 C C . GLY A 1 21 ? -46.384 21.141 -33.146 1.00 28.85 21 A 1 +ATOM 148 O O . GLY A 1 21 ? -46.631 22.304 -33.456 1.00 27.15 21 A 1 +ATOM 149 N N . THR A 1 22 ? -46.710 20.099 -33.890 1.00 27.86 22 A 1 +ATOM 150 C CA . THR A 1 22 ? -47.802 20.194 -34.844 1.00 29.75 22 A 1 +ATOM 151 C C . THR A 1 22 ? -48.989 20.698 -34.035 1.00 29.04 22 A 1 +ATOM 152 O O . THR A 1 22 ? -49.398 20.039 -33.085 1.00 27.42 22 A 1 +ATOM 153 C CB . THR A 1 22 ? -48.132 18.835 -35.471 1.00 27.80 22 A 1 +ATOM 154 O OG1 . THR A 1 22 ? -48.044 17.805 -34.517 1.00 26.07 22 A 1 +ATOM 155 C CG2 . THR A 1 22 ? -47.162 18.499 -36.607 1.00 26.17 22 A 1 +ATOM 156 N N . LEU A 1 23 ? -49.438 21.912 -34.364 1.00 29.51 23 A 1 +ATOM 157 C CA . LEU A 1 23 ? -50.604 22.524 -33.745 1.00 31.63 23 A 1 +ATOM 158 C C . LEU A 1 23 ? -51.718 21.481 -33.770 1.00 30.43 23 A 1 +ATOM 159 O O . LEU A 1 23 ? -52.125 21.101 -34.874 1.00 29.38 23 A 1 +ATOM 160 C CB . LEU A 1 23 ? -51.017 23.762 -34.559 1.00 30.71 23 A 1 +ATOM 161 C CG . LEU A 1 23 ? -50.251 25.043 -34.160 1.00 28.23 23 A 1 +ATOM 162 C CD1 . LEU A 1 23 ? -50.220 26.031 -35.324 1.00 27.73 23 A 1 +ATOM 163 C CD2 . LEU A 1 23 ? -50.932 25.724 -32.970 1.00 29.41 23 A 1 +ATOM 164 N N . PRO A 1 24 ? -52.178 20.970 -32.634 1.00 28.86 24 A 1 +ATOM 165 C CA . PRO A 1 24 ? -53.316 20.094 -32.650 1.00 30.80 24 A 1 +ATOM 166 C C . PRO A 1 24 ? -54.479 20.906 -33.214 1.00 30.51 24 A 1 +ATOM 167 O O . PRO A 1 24 ? -54.719 22.041 -32.771 1.00 29.32 24 A 1 +ATOM 168 C CB . PRO A 1 24 ? -53.526 19.639 -31.199 1.00 29.72 24 A 1 +ATOM 169 C CG . PRO A 1 24 ? -52.904 20.764 -30.377 1.00 30.13 24 A 1 +ATOM 170 C CD . PRO A 1 24 ? -51.783 21.303 -31.276 1.00 33.57 24 A 1 +ATOM 171 N N . GLU A 1 25 ? -55.135 20.379 -34.218 1.00 30.90 25 A 1 +ATOM 172 C CA . GLU A 1 25 ? -56.382 20.978 -34.688 1.00 32.65 25 A 1 +ATOM 173 C C . GLU A 1 25 ? -57.365 21.056 -33.521 1.00 31.18 25 A 1 +ATOM 174 O O . GLU A 1 25 ? -57.385 20.211 -32.627 1.00 30.63 25 A 1 +ATOM 175 C CB . GLU A 1 25 ? -56.954 20.210 -35.886 1.00 32.14 25 A 1 +ATOM 176 C CG . GLU A 1 25 ? -56.231 20.575 -37.195 1.00 30.35 25 A 1 +ATOM 177 C CD . GLU A 1 25 ? -56.849 19.911 -38.440 1.00 28.91 25 A 1 +ATOM 178 O OE1 . GLU A 1 25 ? -56.785 20.558 -39.511 1.00 25.52 25 A 1 +ATOM 179 O OE2 . GLU A 1 25 ? -57.346 18.789 -38.317 1.00 30.12 25 A 1 +ATOM 180 N N . LYS A 1 26 ? -58.170 22.129 -33.515 1.00 32.84 26 A 1 +ATOM 181 C CA . LYS A 1 26 ? -59.105 22.498 -32.447 1.00 34.77 26 A 1 +ATOM 182 C C . LYS A 1 26 ? -60.320 21.565 -32.343 1.00 33.23 26 A 1 +ATOM 183 O O . LYS A 1 26 ? -61.392 22.064 -31.995 1.00 31.97 26 A 1 +ATOM 184 C CB . LYS A 1 26 ? -59.594 23.939 -32.664 1.00 33.98 26 A 1 +ATOM 185 C CG . LYS A 1 26 ? -58.681 25.030 -32.114 1.00 31.67 26 A 1 +ATOM 186 C CD . LYS A 1 26 ? -59.406 26.360 -32.305 1.00 29.87 26 A 1 +ATOM 187 C CE . LYS A 1 26 ? -58.659 27.509 -31.636 1.00 26.57 26 A 1 +ATOM 188 N NZ . LYS A 1 26 ? -59.376 28.796 -31.805 1.00 25.41 26 A 1 +ATOM 189 N N . ASP A 1 27 ? -60.233 20.299 -32.694 1.00 33.25 27 A 1 +ATOM 190 C CA . ASP A 1 27 ? -61.445 19.496 -32.759 1.00 34.61 27 A 1 +ATOM 191 C C . ASP A 1 27 ? -62.136 19.400 -31.395 1.00 32.82 27 A 1 +ATOM 192 O O . ASP A 1 27 ? -61.512 19.229 -30.348 1.00 31.31 27 A 1 +ATOM 193 C CB . ASP A 1 27 ? -61.201 18.147 -33.452 1.00 32.94 27 A 1 +ATOM 194 C CG . ASP A 1 27 ? -61.875 18.064 -34.835 1.00 30.11 27 A 1 +ATOM 195 O OD1 . ASP A 1 27 ? -62.755 18.912 -35.109 1.00 30.19 27 A 1 +ATOM 196 O OD2 . ASP A 1 27 ? -61.538 17.122 -35.569 1.00 29.83 27 A 1 +ATOM 197 N N . VAL A 1 28 ? -63.461 19.616 -31.436 1.00 30.87 28 A 1 +ATOM 198 C CA . VAL A 1 28 ? -64.288 20.107 -30.318 1.00 33.46 28 A 1 +ATOM 199 C C . VAL A 1 28 ? -64.735 18.996 -29.361 1.00 32.21 28 A 1 +ATOM 200 O O . VAL A 1 28 ? -65.458 19.273 -28.411 1.00 30.76 28 A 1 +ATOM 201 C CB . VAL A 1 28 ? -65.524 20.842 -30.914 1.00 31.91 28 A 1 +ATOM 202 C CG1 . VAL A 1 28 ? -66.422 21.535 -29.891 1.00 29.20 28 A 1 +ATOM 203 C CG2 . VAL A 1 28 ? -65.101 21.931 -31.916 1.00 31.64 28 A 1 +ATOM 204 N N . SER A 1 29 ? -64.398 17.751 -29.615 1.00 30.04 29 A 1 +ATOM 205 C CA . SER A 1 29 ? -65.094 16.597 -29.044 1.00 33.02 29 A 1 +ATOM 206 C C . SER A 1 29 ? -64.983 16.465 -27.512 1.00 32.27 29 A 1 +ATOM 207 O O . SER A 1 29 ? -64.249 17.185 -26.844 1.00 31.12 29 A 1 +ATOM 208 C CB . SER A 1 29 ? -64.713 15.319 -29.793 1.00 31.71 29 A 1 +ATOM 209 O OG . SER A 1 29 ? -63.336 15.039 -29.640 1.00 30.45 29 A 1 +ATOM 210 N N . GLY A 1 30 ? -65.802 15.561 -26.978 1.00 29.29 30 A 1 +ATOM 211 C CA . GLY A 1 30 ? -66.369 15.669 -25.637 1.00 31.50 30 A 1 +ATOM 212 C C . GLY A 1 30 ? -65.518 15.331 -24.402 1.00 30.96 30 A 1 +ATOM 213 O O . GLY A 1 30 ? -64.306 15.178 -24.422 1.00 29.34 30 A 1 +ATOM 214 N N . GLU A 1 31 ? -66.271 15.235 -23.304 1.00 27.41 31 A 1 +ATOM 215 C CA . GLU A 1 31 ? -65.883 15.349 -21.888 1.00 30.01 31 A 1 +ATOM 216 C C . GLU A 1 31 ? -65.111 14.188 -21.247 1.00 28.66 31 A 1 +ATOM 217 O O . GLU A 1 31 ? -65.091 14.151 -20.016 1.00 27.95 31 A 1 +ATOM 218 C CB . GLU A 1 31 ? -67.166 15.525 -21.059 1.00 29.57 31 A 1 +ATOM 219 C CG . GLU A 1 31 ? -67.915 16.852 -21.219 1.00 28.17 31 A 1 +ATOM 220 C CD . GLU A 1 31 ? -69.069 16.946 -20.208 1.00 26.97 31 A 1 +ATOM 221 O OE1 . GLU A 1 31 ? -69.251 18.049 -19.638 1.00 23.35 31 A 1 +ATOM 222 O OE2 . GLU A 1 31 ? -69.761 15.934 -19.979 1.00 28.73 31 A 1 +ATOM 223 N N . GLU A 1 32 ? -64.532 13.228 -21.949 1.00 28.34 32 A 1 +ATOM 224 C CA . GLU A 1 32 ? -63.920 12.105 -21.221 1.00 30.69 32 A 1 +ATOM 225 C C . GLU A 1 32 ? -62.750 12.588 -20.343 1.00 29.43 32 A 1 +ATOM 226 O O . GLU A 1 32 ? -61.591 12.663 -20.742 1.00 28.53 32 A 1 +ATOM 227 C CB . GLU A 1 32 ? -63.590 10.906 -22.123 1.00 29.77 32 A 1 +ATOM 228 C CG . GLU A 1 32 ? -64.846 10.044 -22.378 1.00 27.71 32 A 1 +ATOM 229 C CD . GLU A 1 32 ? -64.574 8.722 -23.103 1.00 26.64 32 A 1 +ATOM 230 O OE1 . GLU A 1 32 ? -65.483 7.858 -23.065 1.00 23.39 32 A 1 +ATOM 231 O OE2 . GLU A 1 32 ? -63.500 8.576 -23.715 1.00 28.27 32 A 1 +ATOM 232 N N . LYS A 1 33 ? -63.101 12.934 -19.094 1.00 29.01 33 A 1 +ATOM 233 C CA . LYS A 1 33 ? -62.212 13.304 -17.980 1.00 31.16 33 A 1 +ATOM 234 C C . LYS A 1 33 ? -61.405 12.093 -17.499 1.00 30.50 33 A 1 +ATOM 235 O O . LYS A 1 33 ? -61.459 11.760 -16.319 1.00 29.23 33 A 1 +ATOM 236 C CB . LYS A 1 33 ? -63.037 13.863 -16.816 1.00 29.76 33 A 1 +ATOM 237 C CG . LYS A 1 33 ? -63.619 15.260 -17.030 1.00 27.29 33 A 1 +ATOM 238 C CD . LYS A 1 33 ? -64.401 15.646 -15.775 1.00 26.15 33 A 1 +ATOM 239 C CE . LYS A 1 33 ? -64.900 17.088 -15.884 1.00 22.90 33 A 1 +ATOM 240 N NZ . LYS A 1 33 ? -65.784 17.439 -14.747 1.00 23.15 33 A 1 +ATOM 241 N N . ASP A 1 34 ? -60.734 11.394 -18.403 1.00 30.83 34 A 1 +ATOM 242 C CA . ASP A 1 34 ? -60.149 10.118 -18.034 1.00 32.82 34 A 1 +ATOM 243 C C . ASP A 1 34 ? -58.957 10.272 -17.068 1.00 32.58 34 A 1 +ATOM 244 O O . ASP A 1 34 ? -58.279 11.301 -16.992 1.00 31.29 34 A 1 +ATOM 245 C CB . ASP A 1 34 ? -59.862 9.272 -19.280 1.00 30.90 34 A 1 +ATOM 246 C CG . ASP A 1 34 ? -60.063 7.767 -19.024 1.00 27.89 34 A 1 +ATOM 247 O OD1 . ASP A 1 34 ? -60.332 7.394 -17.859 1.00 27.62 34 A 1 +ATOM 248 O OD2 . ASP A 1 34 ? -59.897 6.993 -19.983 1.00 26.71 34 A 1 +ATOM 249 N N . SER A 1 35 ? -58.734 9.235 -16.272 1.00 30.33 35 A 1 +ATOM 250 C CA . SER A 1 35 ? -57.971 9.214 -15.019 1.00 32.83 35 A 1 +ATOM 251 C C . SER A 1 35 ? -56.448 9.384 -15.132 1.00 33.09 35 A 1 +ATOM 252 O O . SER A 1 35 ? -55.730 9.157 -14.154 1.00 31.72 35 A 1 +ATOM 253 C CB . SER A 1 35 ? -58.302 7.903 -14.305 1.00 30.81 35 A 1 +ATOM 254 O OG . SER A 1 35 ? -57.993 6.796 -15.130 1.00 29.46 35 A 1 +ATOM 255 N N . SER A 1 36 ? -55.900 9.767 -16.281 1.00 33.65 36 A 1 +ATOM 256 C CA . SER A 1 36 ? -54.465 9.970 -16.513 1.00 35.63 36 A 1 +ATOM 257 C C . SER A 1 36 ? -53.860 11.167 -15.774 1.00 35.32 36 A 1 +ATOM 258 O O . SER A 1 36 ? -52.639 11.328 -15.755 1.00 33.75 36 A 1 +ATOM 259 C CB . SER A 1 36 ? -54.212 10.085 -18.020 1.00 34.01 36 A 1 +ATOM 260 O OG . SER A 1 36 ? -54.954 11.164 -18.562 1.00 33.00 36 A 1 +ATOM 261 N N . ALA A 1 37 ? -54.676 11.996 -15.122 1.00 33.94 37 A 1 +ATOM 262 C CA . ALA A 1 37 ? -54.264 13.229 -14.457 1.00 35.66 37 A 1 +ATOM 263 C C . ALA A 1 37 ? -53.199 13.035 -13.365 1.00 36.23 37 A 1 +ATOM 264 O O . ALA A 1 37 ? -52.348 13.898 -13.179 1.00 34.95 37 A 1 +ATOM 265 C CB . ALA A 1 37 ? -55.515 13.895 -13.877 1.00 33.47 37 A 1 +ATOM 266 N N . GLY A 1 38 ? -53.216 11.914 -12.647 1.00 36.96 38 A 1 +ATOM 267 C CA . GLY A 1 38 ? -52.313 11.701 -11.510 1.00 38.12 38 A 1 +ATOM 268 C C . GLY A 1 38 ? -50.828 11.577 -11.867 1.00 38.76 38 A 1 +ATOM 269 O O . GLY A 1 38 ? -49.971 11.745 -11.007 1.00 37.17 38 A 1 +ATOM 270 N N . CYS A 1 39 ? -50.534 11.301 -13.125 1.00 43.15 39 A 1 +ATOM 271 C CA . CYS A 1 39 ? -49.158 11.149 -13.587 1.00 43.79 39 A 1 +ATOM 272 C C . CYS A 1 39 ? -48.540 12.432 -14.172 1.00 43.21 39 A 1 +ATOM 273 O O . CYS A 1 39 ? -47.364 12.451 -14.525 1.00 41.44 39 A 1 +ATOM 274 C CB . CYS A 1 39 ? -49.135 9.992 -14.584 1.00 41.93 39 A 1 +ATOM 275 S SG . CYS A 1 39 ? -47.458 9.382 -14.810 1.00 39.28 39 A 1 +ATOM 276 N N . SER A 1 40 ? -49.338 13.497 -14.320 1.00 38.93 40 A 1 +ATOM 277 C CA . SER A 1 40 ? -48.954 14.692 -15.075 1.00 40.32 40 A 1 +ATOM 278 C C . SER A 1 40 ? -48.066 15.678 -14.326 1.00 41.24 40 A 1 +ATOM 279 O O . SER A 1 40 ? -47.428 16.512 -14.961 1.00 39.58 40 A 1 +ATOM 280 C CB . SER A 1 40 ? -50.208 15.410 -15.558 1.00 37.84 40 A 1 +ATOM 281 O OG . SER A 1 40 ? -50.958 15.929 -14.473 1.00 36.04 40 A 1 +ATOM 282 N N . GLU A 1 41 ? -48.008 15.611 -13.006 1.00 42.10 41 A 1 +ATOM 283 C CA . GLU A 1 41 ? -47.120 16.466 -12.216 1.00 42.89 41 A 1 +ATOM 284 C C . GLU A 1 41 ? -45.671 15.975 -12.358 1.00 43.95 41 A 1 +ATOM 285 O O . GLU A 1 41 ? -45.088 15.376 -11.460 1.00 42.40 41 A 1 +ATOM 286 C CB . GLU A 1 41 ? -47.580 16.599 -10.760 1.00 40.64 41 A 1 +ATOM 287 C CG . GLU A 1 41 ? -48.811 17.500 -10.607 1.00 36.99 41 A 1 +ATOM 288 C CD . GLU A 1 41 ? -49.164 17.825 -9.144 1.00 34.25 41 A 1 +ATOM 289 O OE1 . GLU A 1 41 ? -49.966 18.769 -8.945 1.00 29.85 41 A 1 +ATOM 290 O OE2 . GLU A 1 41 ? -48.655 17.144 -8.237 1.00 33.42 41 A 1 +ATOM 291 N N . GLN A 1 42 ? -45.079 16.255 -13.528 1.00 46.88 42 A 1 +ATOM 292 C CA . GLN A 1 42 ? -43.631 16.307 -13.636 1.00 46.90 42 A 1 +ATOM 293 C C . GLN A 1 42 ? -43.160 17.358 -12.641 1.00 47.88 42 A 1 +ATOM 294 O O . GLN A 1 42 ? -43.299 18.561 -12.876 1.00 46.09 42 A 1 +ATOM 295 C CB . GLN A 1 42 ? -43.176 16.661 -15.061 1.00 43.97 42 A 1 +ATOM 296 C CG . GLN A 1 42 ? -43.225 15.454 -16.000 1.00 40.52 42 A 1 +ATOM 297 C CD . GLN A 1 42 ? -42.642 15.755 -17.389 1.00 37.38 42 A 1 +ATOM 298 O OE1 . GLN A 1 42 ? -42.526 16.888 -17.825 1.00 35.37 42 A 1 +ATOM 299 N NE2 . GLN A 1 42 ? -42.254 14.742 -18.133 1.00 34.13 42 A 1 +ATOM 300 N N . LEU A 1 43 ? -42.627 16.907 -11.519 1.00 48.72 43 A 1 +ATOM 301 C CA . LEU A 1 43 ? -41.888 17.749 -10.595 1.00 49.45 43 A 1 +ATOM 302 C C . LEU A 1 43 ? -40.718 18.342 -11.378 1.00 50.83 43 A 1 +ATOM 303 O O . LEU A 1 43 ? -39.699 17.696 -11.590 1.00 49.08 43 A 1 +ATOM 304 C CB . LEU A 1 43 ? -41.457 16.913 -9.373 1.00 46.10 43 A 1 +ATOM 305 C CG . LEU A 1 43 ? -42.419 17.055 -8.180 1.00 42.40 43 A 1 +ATOM 306 C CD1 . LEU A 1 43 ? -42.525 15.744 -7.403 1.00 39.35 43 A 1 +ATOM 307 C CD2 . LEU A 1 43 ? -41.929 18.138 -7.222 1.00 39.99 43 A 1 +ATOM 308 N N . LEU A 1 44 ? -40.895 19.566 -11.838 1.00 54.13 44 A 1 +ATOM 309 C CA . LEU A 1 44 ? -39.860 20.407 -12.419 1.00 54.65 44 A 1 +ATOM 310 C C . LEU A 1 44 ? -38.879 20.762 -11.305 1.00 56.60 44 A 1 +ATOM 311 O O . LEU A 1 44 ? -38.959 21.819 -10.679 1.00 53.85 44 A 1 +ATOM 312 C CB . LEU A 1 44 ? -40.518 21.637 -13.081 1.00 50.08 44 A 1 +ATOM 313 C CG . LEU A 1 44 ? -40.734 21.479 -14.594 1.00 45.37 44 A 1 +ATOM 314 C CD1 . LEU A 1 44 ? -41.969 22.260 -15.047 1.00 41.21 44 A 1 +ATOM 315 C CD2 . LEU A 1 44 ? -39.529 22.006 -15.371 1.00 41.01 44 A 1 +ATOM 316 N N . ILE A 1 45 ? -37.988 19.829 -11.026 1.00 58.17 45 A 1 +ATOM 317 C CA . ILE A 1 45 ? -36.920 20.039 -10.064 1.00 59.94 45 A 1 +ATOM 318 C C . ILE A 1 45 ? -35.988 21.070 -10.674 1.00 62.19 45 A 1 +ATOM 319 O O . ILE A 1 45 ? -35.483 20.888 -11.786 1.00 59.00 45 A 1 +ATOM 320 C CB . ILE A 1 45 ? -36.234 18.710 -9.712 1.00 56.85 45 A 1 +ATOM 321 C CG1 . ILE A 1 45 ? -37.231 17.749 -9.010 1.00 53.23 45 A 1 +ATOM 322 C CG2 . ILE A 1 45 ? -35.044 18.994 -8.801 1.00 52.08 45 A 1 +ATOM 323 C CD1 . ILE A 1 45 ? -36.812 16.285 -9.079 1.00 48.77 45 A 1 +ATOM 324 N N . SER A 1 46 ? -35.792 22.175 -9.951 1.00 65.15 46 A 1 +ATOM 325 C CA . SER A 1 46 ? -34.922 23.237 -10.426 1.00 66.70 46 A 1 +ATOM 326 C C . SER A 1 46 ? -33.502 22.699 -10.629 1.00 69.40 46 A 1 +ATOM 327 O O . SER A 1 46 ? -32.973 21.967 -9.793 1.00 66.07 46 A 1 +ATOM 328 C CB . SER A 1 46 ? -34.907 24.414 -9.443 1.00 61.41 46 A 1 +ATOM 329 O OG . SER A 1 46 ? -33.997 25.389 -9.909 1.00 54.89 46 A 1 +ATOM 330 N N . THR A 1 47 ? -32.871 23.104 -11.723 1.00 69.42 47 A 1 +ATOM 331 C CA . THR A 1 47 ? -31.453 22.850 -12.001 1.00 70.67 47 A 1 +ATOM 332 C C . THR A 1 47 ? -30.552 23.285 -10.844 1.00 73.30 47 A 1 +ATOM 333 O O . THR A 1 47 ? -29.549 22.640 -10.562 1.00 71.61 47 A 1 +ATOM 334 C CB . THR A 1 47 ? -31.028 23.600 -13.270 1.00 67.37 47 A 1 +ATOM 335 O OG1 . THR A 1 47 ? -31.493 24.937 -13.237 1.00 60.49 47 A 1 +ATOM 336 C CG2 . THR A 1 47 ? -31.616 22.963 -14.527 1.00 57.05 47 A 1 +ATOM 337 N N . GLU A 1 48 ? -30.947 24.316 -10.104 1.00 70.80 48 A 1 +ATOM 338 C CA . GLU A 1 48 ? -30.245 24.792 -8.912 1.00 72.43 48 A 1 +ATOM 339 C C . GLU A 1 48 ? -30.219 23.737 -7.795 1.00 74.57 48 A 1 +ATOM 340 O O . GLU A 1 48 ? -29.224 23.632 -7.079 1.00 74.88 48 A 1 +ATOM 341 C CB . GLU A 1 48 ? -30.938 26.046 -8.374 1.00 70.59 48 A 1 +ATOM 342 C CG . GLU A 1 48 ? -30.936 27.214 -9.364 1.00 64.49 48 A 1 +ATOM 343 C CD . GLU A 1 48 ? -31.708 28.431 -8.847 1.00 55.82 48 A 1 +ATOM 344 O OE1 . GLU A 1 48 ? -31.505 29.525 -9.426 1.00 49.87 48 A 1 +ATOM 345 O OE2 . GLU A 1 48 ? -32.519 28.272 -7.912 1.00 52.26 48 A 1 +ATOM 346 N N . VAL A 1 49 ? -31.280 22.944 -7.640 1.00 75.23 49 A 1 +ATOM 347 C CA . VAL A 1 49 ? -31.343 21.880 -6.630 1.00 76.34 49 A 1 +ATOM 348 C C . VAL A 1 49 ? -30.345 20.779 -6.967 1.00 77.30 49 A 1 +ATOM 349 O O . VAL A 1 49 ? -29.573 20.373 -6.104 1.00 77.10 49 A 1 +ATOM 350 C CB . VAL A 1 49 ? -32.765 21.312 -6.476 1.00 75.34 49 A 1 +ATOM 351 C CG1 . VAL A 1 49 ? -32.811 20.164 -5.458 1.00 68.88 49 A 1 +ATOM 352 C CG2 . VAL A 1 49 ? -33.731 22.397 -5.995 1.00 68.41 49 A 1 +ATOM 353 N N . PHE A 1 50 ? -30.305 20.350 -8.233 1.00 77.51 50 A 1 +ATOM 354 C CA . PHE A 1 50 ? -29.324 19.364 -8.692 1.00 78.06 50 A 1 +ATOM 355 C C . PHE A 1 50 ? -27.883 19.846 -8.499 1.00 78.93 50 A 1 +ATOM 356 O O . PHE A 1 50 ? -27.055 19.115 -7.964 1.00 78.49 50 A 1 +ATOM 357 C CB . PHE A 1 50 ? -29.570 19.030 -10.168 1.00 75.79 50 A 1 +ATOM 358 C CG . PHE A 1 50 ? -30.548 17.902 -10.363 1.00 72.22 50 A 1 +ATOM 359 C CD1 . PHE A 1 50 ? -30.088 16.573 -10.296 1.00 66.10 50 A 1 +ATOM 360 C CD2 . PHE A 1 50 ? -31.896 18.159 -10.627 1.00 65.30 50 A 1 +ATOM 361 C CE1 . PHE A 1 50 ? -30.984 15.510 -10.491 1.00 62.84 50 A 1 +ATOM 362 C CE2 . PHE A 1 50 ? -32.790 17.095 -10.816 1.00 61.86 50 A 1 +ATOM 363 C CZ . PHE A 1 50 ? -32.335 15.766 -10.753 1.00 64.10 50 A 1 +ATOM 364 N N . LEU A 1 51 ? -27.595 21.091 -8.877 1.00 77.13 51 A 1 +ATOM 365 C CA . LEU A 1 51 ? -26.277 21.702 -8.699 1.00 78.12 51 A 1 +ATOM 366 C C . LEU A 1 51 ? -25.885 21.781 -7.228 1.00 79.53 51 A 1 +ATOM 367 O O . LEU A 1 51 ? -24.769 21.419 -6.870 1.00 80.27 51 A 1 +ATOM 368 C CB . LEU A 1 51 ? -26.284 23.095 -9.350 1.00 77.10 51 A 1 +ATOM 369 C CG . LEU A 1 51 ? -25.633 23.077 -10.741 1.00 70.77 51 A 1 +ATOM 370 C CD1 . LEU A 1 51 ? -26.142 24.237 -11.593 1.00 63.03 51 A 1 +ATOM 371 C CD2 . LEU A 1 51 ? -24.120 23.188 -10.613 1.00 63.17 51 A 1 +ATOM 372 N N . THR A 1 52 ? -26.807 22.209 -6.359 1.00 79.79 52 A 1 +ATOM 373 C CA . THR A 1 52 ? -26.548 22.351 -4.922 1.00 79.54 52 A 1 +ATOM 374 C C . THR A 1 52 ? -26.266 20.989 -4.284 1.00 79.73 52 A 1 +ATOM 375 O O . THR A 1 52 ? -25.270 20.840 -3.579 1.00 80.44 52 A 1 +ATOM 376 C CB . THR A 1 52 ? -27.712 23.045 -4.212 1.00 79.27 52 A 1 +ATOM 377 O OG1 . THR A 1 52 ? -27.999 24.279 -4.829 1.00 71.35 52 A 1 +ATOM 378 C CG2 . THR A 1 52 ? -27.388 23.358 -2.756 1.00 68.36 52 A 1 +ATOM 379 N N . LEU A 1 53 ? -27.080 19.976 -4.572 1.00 81.23 53 A 1 +ATOM 380 C CA . LEU A 1 53 ? -26.870 18.616 -4.077 1.00 81.37 53 A 1 +ATOM 381 C C . LEU A 1 53 ? -25.563 18.015 -4.603 1.00 81.80 53 A 1 +ATOM 382 O O . LEU A 1 53 ? -24.819 17.412 -3.835 1.00 81.90 53 A 1 +ATOM 383 C CB . LEU A 1 53 ? -28.069 17.736 -4.469 1.00 81.19 53 A 1 +ATOM 384 C CG . LEU A 1 53 ? -29.391 18.056 -3.737 1.00 78.38 53 A 1 +ATOM 385 C CD1 . LEU A 1 53 ? -30.509 17.218 -4.345 1.00 71.43 53 A 1 +ATOM 386 C CD2 . LEU A 1 53 ? -29.325 17.745 -2.248 1.00 71.63 53 A 1 +ATOM 387 N N . GLY A 1 54 ? -25.247 18.224 -5.872 1.00 82.62 54 A 1 +ATOM 388 C CA . GLY A 1 54 ? -24.003 17.766 -6.481 1.00 81.40 54 A 1 +ATOM 389 C C . GLY A 1 54 ? -22.762 18.397 -5.837 1.00 82.64 54 A 1 +ATOM 390 O O . GLY A 1 54 ? -21.812 17.689 -5.520 1.00 82.40 54 A 1 +ATOM 391 N N . ILE A 1 55 ? -22.793 19.711 -5.573 1.00 81.81 55 A 1 +ATOM 392 C CA . ILE A 1 55 ? -21.688 20.422 -4.913 1.00 81.93 55 A 1 +ATOM 393 C C . ILE A 1 55 ? -21.518 19.954 -3.470 1.00 82.58 55 A 1 +ATOM 394 O O . ILE A 1 55 ? -20.387 19.709 -3.050 1.00 82.96 55 A 1 +ATOM 395 C CB . ILE A 1 55 ? -21.892 21.953 -5.001 1.00 80.98 55 A 1 +ATOM 396 C CG1 . ILE A 1 55 ? -21.727 22.431 -6.460 1.00 74.93 55 A 1 +ATOM 397 C CG2 . ILE A 1 55 ? -20.901 22.708 -4.092 1.00 71.27 55 A 1 +ATOM 398 C CD1 . ILE A 1 55 ? -22.234 23.858 -6.711 1.00 64.00 55 A 1 +ATOM 399 N N . ILE A 1 56 ? -22.611 19.808 -2.713 1.00 83.00 56 A 1 +ATOM 400 C CA . ILE A 1 56 ? -22.559 19.325 -1.328 1.00 84.04 56 A 1 +ATOM 401 C C . ILE A 1 56 ? -21.955 17.925 -1.287 1.00 84.44 56 A 1 +ATOM 402 O O . ILE A 1 56 ? -20.977 17.710 -0.574 1.00 83.73 56 A 1 +ATOM 403 C CB . ILE A 1 56 ? -23.953 19.381 -0.657 1.00 84.04 56 A 1 +ATOM 404 C CG1 . ILE A 1 56 ? -24.373 20.850 -0.437 1.00 79.07 56 A 1 +ATOM 405 C CG2 . ILE A 1 56 ? -23.946 18.643 0.692 1.00 77.24 56 A 1 +ATOM 406 C CD1 . ILE A 1 56 ? -25.857 21.013 -0.066 1.00 69.27 56 A 1 +ATOM 407 N N . SER A 1 57 ? -22.477 17.007 -2.099 1.00 85.72 57 A 1 +ATOM 408 C CA . SER A 1 57 ? -21.965 15.635 -2.166 1.00 85.08 57 A 1 +ATOM 409 C C . SER A 1 57 ? -20.493 15.587 -2.574 1.00 85.63 57 A 1 +ATOM 410 O O . SER A 1 57 ? -19.697 14.872 -1.960 1.00 84.62 57 A 1 +ATOM 411 C CB . SER A 1 57 ? -22.806 14.820 -3.143 1.00 84.11 57 A 1 +ATOM 412 O OG . SER A 1 57 ? -22.262 13.530 -3.271 1.00 72.91 57 A 1 +ATOM 413 N N . LEU A 1 58 ? -20.079 16.394 -3.553 1.00 84.99 58 A 1 +ATOM 414 C CA . LEU A 1 58 ? -18.688 16.468 -3.990 1.00 84.63 58 A 1 +ATOM 415 C C . LEU A 1 58 ? -17.774 16.941 -2.854 1.00 85.08 58 A 1 +ATOM 416 O O . LEU A 1 58 ? -16.735 16.330 -2.616 1.00 85.04 58 A 1 +ATOM 417 C CB . LEU A 1 58 ? -18.605 17.397 -5.212 1.00 83.53 58 A 1 +ATOM 418 C CG . LEU A 1 58 ? -17.210 17.421 -5.856 1.00 79.19 58 A 1 +ATOM 419 C CD1 . LEU A 1 58 ? -16.902 16.115 -6.582 1.00 70.48 58 A 1 +ATOM 420 C CD2 . LEU A 1 58 ? -17.120 18.556 -6.881 1.00 71.07 58 A 1 +ATOM 421 N N . LEU A 1 59 ? -18.157 17.996 -2.128 1.00 84.87 59 A 1 +ATOM 422 C CA . LEU A 1 59 ? -17.379 18.524 -1.011 1.00 84.96 59 A 1 +ATOM 423 C C . LEU A 1 59 ? -17.280 17.528 0.145 1.00 85.08 59 A 1 +ATOM 424 O O . LEU A 1 59 ? -16.193 17.338 0.694 1.00 84.70 59 A 1 +ATOM 425 C CB . LEU A 1 59 ? -17.990 19.850 -0.531 1.00 84.51 59 A 1 +ATOM 426 C CG . LEU A 1 59 ? -17.779 21.041 -1.489 1.00 79.20 59 A 1 +ATOM 427 C CD1 . LEU A 1 59 ? -18.569 22.244 -0.978 1.00 71.15 59 A 1 +ATOM 428 C CD2 . LEU A 1 59 ? -16.310 21.449 -1.593 1.00 71.71 59 A 1 +ATOM 429 N N . GLU A 1 60 ? -18.378 16.862 0.494 1.00 84.27 60 A 1 +ATOM 430 C CA . GLU A 1 60 ? -18.394 15.850 1.547 1.00 85.23 60 A 1 +ATOM 431 C C . GLU A 1 60 ? -17.504 14.654 1.204 1.00 85.57 60 A 1 +ATOM 432 O O . GLU A 1 60 ? -16.695 14.229 2.032 1.00 84.25 60 A 1 +ATOM 433 C CB . GLU A 1 60 ? -19.826 15.374 1.793 1.00 82.54 60 A 1 +ATOM 434 C CG . GLU A 1 60 ? -20.699 16.410 2.517 1.00 77.74 60 A 1 +ATOM 435 C CD . GLU A 1 60 ? -22.097 15.856 2.835 1.00 77.99 60 A 1 +ATOM 436 O OE1 . GLU A 1 60 ? -22.781 16.474 3.679 1.00 68.13 60 A 1 +ATOM 437 O OE2 . GLU A 1 60 ? -22.471 14.793 2.294 1.00 74.08 60 A 1 +ATOM 438 N N . ASN A 1 61 ? -17.589 14.145 -0.024 1.00 88.77 61 A 1 +ATOM 439 C CA . ASN A 1 61 ? -16.778 13.006 -0.442 1.00 88.25 61 A 1 +ATOM 440 C C . ASN A 1 61 ? -15.292 13.371 -0.601 1.00 87.95 61 A 1 +ATOM 441 O O . ASN A 1 61 ? -14.427 12.581 -0.225 1.00 86.56 61 A 1 +ATOM 442 C CB . ASN A 1 61 ? -17.390 12.380 -1.699 1.00 87.96 61 A 1 +ATOM 443 C CG . ASN A 1 61 ? -18.638 11.580 -1.358 1.00 86.47 61 A 1 +ATOM 444 O OD1 . ASN A 1 61 ? -18.602 10.683 -0.532 1.00 76.58 61 A 1 +ATOM 445 N ND2 . ASN A 1 61 ? -19.755 11.879 -1.969 1.00 75.97 61 A 1 +ATOM 446 N N . ILE A 1 62 ? -14.972 14.589 -1.058 1.00 86.67 62 A 1 +ATOM 447 C CA . ILE A 1 62 ? -13.599 15.107 -1.031 1.00 86.02 62 A 1 +ATOM 448 C C . ILE A 1 62 ? -13.079 15.155 0.410 1.00 85.95 62 A 1 +ATOM 449 O O . ILE A 1 62 ? -11.937 14.755 0.659 1.00 85.07 62 A 1 +ATOM 450 C CB . ILE A 1 62 ? -13.509 16.496 -1.703 1.00 85.66 62 A 1 +ATOM 451 C CG1 . ILE A 1 62 ? -13.644 16.349 -3.238 1.00 80.85 62 A 1 +ATOM 452 C CG2 . ILE A 1 62 ? -12.177 17.211 -1.376 1.00 79.13 62 A 1 +ATOM 453 C CD1 . ILE A 1 62 ? -13.873 17.678 -3.967 1.00 71.50 62 A 1 +ATOM 454 N N . LEU A 1 63 ? -13.904 15.589 1.372 1.00 87.02 63 A 1 +ATOM 455 C CA . LEU A 1 63 ? -13.538 15.634 2.777 1.00 86.06 63 A 1 +ATOM 456 C C . LEU A 1 63 ? -13.251 14.233 3.335 1.00 85.94 63 A 1 +ATOM 457 O O . LEU A 1 63 ? -12.268 14.057 4.057 1.00 85.03 63 A 1 +ATOM 458 C CB . LEU A 1 63 ? -14.660 16.338 3.550 1.00 84.89 63 A 1 +ATOM 459 C CG . LEU A 1 63 ? -14.284 16.673 5.009 1.00 78.75 63 A 1 +ATOM 460 C CD1 . LEU A 1 63 ? -13.340 17.864 5.077 1.00 70.58 63 A 1 +ATOM 461 C CD2 . LEU A 1 63 ? -15.546 17.005 5.799 1.00 70.83 63 A 1 +ATOM 462 N N . VAL A 1 64 ? -14.046 13.221 2.963 1.00 87.88 64 A 1 +ATOM 463 C CA . VAL A 1 64 ? -13.814 11.817 3.336 1.00 87.28 64 A 1 +ATOM 464 C C . VAL A 1 64 ? -12.465 11.321 2.798 1.00 87.33 64 A 1 +ATOM 465 O O . VAL A 1 64 ? -11.658 10.789 3.560 1.00 86.47 64 A 1 +ATOM 466 C CB . VAL A 1 64 ? -14.962 10.905 2.838 1.00 86.63 64 A 1 +ATOM 467 C CG1 . VAL A 1 64 ? -14.655 9.415 3.025 1.00 78.65 64 A 1 +ATOM 468 C CG2 . VAL A 1 64 ? -16.253 11.191 3.608 1.00 78.40 64 A 1 +ATOM 469 N N . VAL A 1 65 ? -12.205 11.536 1.508 1.00 87.64 65 A 1 +ATOM 470 C CA . VAL A 1 65 ? -10.945 11.121 0.876 1.00 86.68 65 A 1 +ATOM 471 C C . VAL A 1 65 ? -9.757 11.850 1.518 1.00 86.15 65 A 1 +ATOM 472 O O . VAL A 1 65 ? -8.762 11.213 1.871 1.00 85.27 65 A 1 +ATOM 473 C CB . VAL A 1 65 ? -10.990 11.346 -0.648 1.00 86.68 65 A 1 +ATOM 474 C CG1 . VAL A 1 65 ? -9.648 11.040 -1.316 1.00 78.84 65 A 1 +ATOM 475 C CG2 . VAL A 1 65 ? -12.033 10.430 -1.301 1.00 78.56 65 A 1 +ATOM 476 N N . ALA A 1 66 ? -9.867 13.157 1.732 1.00 86.45 66 A 1 +ATOM 477 C CA . ALA A 1 66 ? -8.829 13.960 2.370 1.00 84.70 66 A 1 +ATOM 478 C C . ALA A 1 66 ? -8.551 13.504 3.815 1.00 84.16 66 A 1 +ATOM 479 O O . ALA A 1 66 ? -7.386 13.401 4.211 1.00 82.40 66 A 1 +ATOM 480 C CB . ALA A 1 66 ? -9.249 15.432 2.321 1.00 84.12 66 A 1 +ATOM 481 N N . ALA A 1 67 ? -9.587 13.175 4.577 1.00 85.57 67 A 1 +ATOM 482 C CA . ALA A 1 67 ? -9.440 12.671 5.937 1.00 83.98 67 A 1 +ATOM 483 C C . ALA A 1 67 ? -8.705 11.328 5.979 1.00 83.52 67 A 1 +ATOM 484 O O . ALA A 1 67 ? -7.794 11.155 6.794 1.00 82.16 67 A 1 +ATOM 485 C CB . ALA A 1 67 ? -10.833 12.572 6.575 1.00 83.62 67 A 1 +ATOM 486 N N . ILE A 1 68 ? -9.025 10.402 5.065 1.00 85.40 68 A 1 +ATOM 487 C CA . ILE A 1 68 ? -8.353 9.102 4.971 1.00 84.62 68 A 1 +ATOM 488 C C . ILE A 1 68 ? -6.885 9.257 4.548 1.00 83.15 68 A 1 +ATOM 489 O O . ILE A 1 68 ? -6.017 8.571 5.081 1.00 81.26 68 A 1 +ATOM 490 C CB . ILE A 1 68 ? -9.138 8.160 4.029 1.00 85.36 68 A 1 +ATOM 491 C CG1 . ILE A 1 68 ? -10.510 7.819 4.648 1.00 82.67 68 A 1 +ATOM 492 C CG2 . ILE A 1 68 ? -8.356 6.859 3.758 1.00 80.81 68 A 1 +ATOM 493 C CD1 . ILE A 1 68 ? -11.489 7.146 3.676 1.00 75.77 68 A 1 +ATOM 494 N N . ILE A 1 69 ? -6.588 10.170 3.633 1.00 84.77 69 A 1 +ATOM 495 C CA . ILE A 1 69 ? -5.209 10.431 3.213 1.00 82.40 69 A 1 +ATOM 496 C C . ILE A 1 69 ? -4.385 11.036 4.355 1.00 80.97 69 A 1 +ATOM 497 O O . ILE A 1 69 ? -3.242 10.633 4.564 1.00 78.97 69 A 1 +ATOM 498 C CB . ILE A 1 69 ? -5.184 11.308 1.941 1.00 82.81 69 A 1 +ATOM 499 C CG1 . ILE A 1 69 ? -5.749 10.512 0.740 1.00 77.95 69 A 1 +ATOM 500 C CG2 . ILE A 1 69 ? -3.753 11.780 1.617 1.00 75.94 69 A 1 +ATOM 501 C CD1 . ILE A 1 69 ? -6.026 11.374 -0.495 1.00 69.33 69 A 1 +ATOM 502 N N . LYS A 1 70 ? -4.963 11.991 5.089 1.00 82.70 70 A 1 +ATOM 503 C CA . LYS A 1 70 ? -4.268 12.751 6.140 1.00 80.25 70 A 1 +ATOM 504 C C . LYS A 1 70 ? -3.997 11.930 7.398 1.00 79.61 70 A 1 +ATOM 505 O O . LYS A 1 70 ? -2.917 12.038 7.973 1.00 74.79 70 A 1 +ATOM 506 C CB . LYS A 1 70 ? -5.075 14.019 6.462 1.00 77.10 70 A 1 +ATOM 507 C CG . LYS A 1 70 ? -4.349 14.958 7.454 1.00 68.45 70 A 1 +ATOM 508 C CD . LYS A 1 70 ? -5.189 16.204 7.786 1.00 63.65 70 A 1 +ATOM 509 C CE . LYS A 1 70 ? -4.450 17.063 8.814 1.00 54.87 70 A 1 +ATOM 510 N NZ . LYS A 1 70 ? -5.249 18.226 9.289 1.00 49.53 70 A 1 +ATOM 511 N N . ASN A 1 71 ? -4.970 11.135 7.855 1.00 79.72 71 A 1 +ATOM 512 C CA . ASN A 1 71 ? -4.870 10.427 9.132 1.00 78.25 71 A 1 +ATOM 513 C C . ASN A 1 71 ? -4.334 9.000 8.943 1.00 77.81 71 A 1 +ATOM 514 O O . ASN A 1 71 ? -5.029 8.137 8.415 1.00 73.81 71 A 1 +ATOM 515 C CB . ASN A 1 71 ? -6.233 10.475 9.840 1.00 75.71 71 A 1 +ATOM 516 C CG . ASN A 1 71 ? -6.187 9.882 11.241 1.00 74.90 71 A 1 +ATOM 517 O OD1 . ASN A 1 71 ? -5.228 9.258 11.670 1.00 65.91 71 A 1 +ATOM 518 N ND2 . ASN A 1 71 ? -7.238 10.060 12.004 1.00 67.42 71 A 1 +ATOM 519 N N . GLN A 1 72 ? -3.125 8.740 9.441 1.00 78.33 72 A 1 +ATOM 520 C CA . GLN A 1 72 ? -2.517 7.414 9.343 1.00 76.88 72 A 1 +ATOM 521 C C . GLN A 1 72 ? -3.307 6.322 10.078 1.00 77.77 72 A 1 +ATOM 522 O O . GLN A 1 72 ? -3.290 5.176 9.640 1.00 72.49 72 A 1 +ATOM 523 C CB . GLN A 1 72 ? -1.071 7.436 9.860 1.00 72.93 72 A 1 +ATOM 524 C CG . GLN A 1 72 ? -0.136 8.251 8.952 1.00 65.40 72 A 1 +ATOM 525 C CD . GLN A 1 72 ? 1.341 8.022 9.281 1.00 58.04 72 A 1 +ATOM 526 O OE1 . GLN A 1 72 ? 1.707 7.190 10.090 1.00 50.48 72 A 1 +ATOM 527 N NE2 . GLN A 1 72 ? 2.254 8.740 8.652 1.00 48.69 72 A 1 +ATOM 528 N N . ASN A 1 73 ? -4.054 6.651 11.114 1.00 76.59 73 A 1 +ATOM 529 C CA . ASN A 1 73 ? -4.926 5.692 11.806 1.00 75.12 73 A 1 +ATOM 530 C C . ASN A 1 73 ? -6.073 5.177 10.919 1.00 76.38 73 A 1 +ATOM 531 O O . ASN A 1 73 ? -6.666 4.145 11.210 1.00 73.57 73 A 1 +ATOM 532 C CB . ASN A 1 73 ? -5.498 6.336 13.075 1.00 72.50 73 A 1 +ATOM 533 C CG . ASN A 1 73 ? -4.439 6.675 14.121 1.00 68.77 73 A 1 +ATOM 534 O OD1 . ASN A 1 73 ? -3.340 6.162 14.140 1.00 60.73 73 A 1 +ATOM 535 N ND2 . ASN A 1 73 ? -4.779 7.545 15.040 1.00 60.89 73 A 1 +ATOM 536 N N . LEU A 1 74 ? -6.368 5.875 9.814 1.00 76.17 74 A 1 +ATOM 537 C CA . LEU A 1 74 ? -7.352 5.466 8.813 1.00 77.56 74 A 1 +ATOM 538 C C . LEU A 1 74 ? -6.720 4.710 7.632 1.00 78.40 74 A 1 +ATOM 539 O O . LEU A 1 74 ? -7.425 4.349 6.697 1.00 75.66 74 A 1 +ATOM 540 C CB . LEU A 1 74 ? -8.160 6.694 8.340 1.00 76.86 74 A 1 +ATOM 541 C CG . LEU A 1 74 ? -8.877 7.464 9.461 1.00 76.88 74 A 1 +ATOM 542 C CD1 . LEU A 1 74 ? -9.599 8.677 8.874 1.00 68.67 74 A 1 +ATOM 543 C CD2 . LEU A 1 74 ? -9.907 6.619 10.195 1.00 70.69 74 A 1 +ATOM 544 N N . HIS A 1 75 ? -5.409 4.445 7.661 1.00 80.29 75 A 1 +ATOM 545 C CA . HIS A 1 75 ? -4.729 3.682 6.615 1.00 79.34 75 A 1 +ATOM 546 C C . HIS A 1 75 ? -4.894 2.168 6.794 1.00 78.68 75 A 1 +ATOM 547 O O . HIS A 1 75 ? -3.926 1.405 6.812 1.00 74.52 75 A 1 +ATOM 548 C CB . HIS A 1 75 ? -3.261 4.114 6.478 1.00 77.96 75 A 1 +ATOM 549 C CG . HIS A 1 75 ? -3.057 5.533 6.046 1.00 78.19 75 A 1 +ATOM 550 N ND1 . HIS A 1 75 ? -1.839 6.185 6.093 1.00 66.62 75 A 1 +ATOM 551 C CD2 . HIS A 1 75 ? -3.954 6.412 5.523 1.00 67.75 75 A 1 +ATOM 552 C CE1 . HIS A 1 75 ? -2.015 7.426 5.636 1.00 68.90 75 A 1 +ATOM 553 N NE2 . HIS A 1 75 ? -3.289 7.608 5.274 1.00 70.42 75 A 1 +ATOM 554 N N . SER A 1 76 ? -6.139 1.725 6.909 1.00 79.95 76 A 1 +ATOM 555 C CA . SER A 1 76 ? -6.503 0.322 6.991 1.00 80.20 76 A 1 +ATOM 556 C C . SER A 1 76 ? -7.323 -0.101 5.761 1.00 82.67 76 A 1 +ATOM 557 O O . SER A 1 76 ? -7.960 0.752 5.136 1.00 80.84 76 A 1 +ATOM 558 C CB . SER A 1 76 ? -7.259 0.046 8.295 1.00 75.93 76 A 1 +ATOM 559 O OG . SER A 1 76 ? -8.575 0.530 8.245 1.00 67.55 76 A 1 +ATOM 560 N N . PRO A 1 77 ? -7.333 -1.403 5.406 1.00 79.98 77 A 1 +ATOM 561 C CA . PRO A 1 77 ? -8.064 -1.897 4.241 1.00 81.46 77 A 1 +ATOM 562 C C . PRO A 1 77 ? -9.536 -1.461 4.192 1.00 83.17 77 A 1 +ATOM 563 O O . PRO A 1 77 ? -10.006 -1.025 3.146 1.00 82.44 77 A 1 +ATOM 564 C CB . PRO A 1 77 ? -7.930 -3.418 4.314 1.00 79.62 77 A 1 +ATOM 565 C CG . PRO A 1 77 ? -6.566 -3.605 4.967 1.00 75.86 77 A 1 +ATOM 566 C CD . PRO A 1 77 ? -6.521 -2.463 5.979 1.00 77.56 77 A 1 +ATOM 567 N N . MET A 1 78 ? -10.236 -1.483 5.327 1.00 81.97 78 A 1 +ATOM 568 C CA . MET A 1 78 ? -11.633 -1.036 5.412 1.00 82.73 78 A 1 +ATOM 569 C C . MET A 1 78 ? -11.800 0.415 4.947 1.00 84.79 78 A 1 +ATOM 570 O O . MET A 1 78 ? -12.692 0.715 4.154 1.00 84.05 78 A 1 +ATOM 571 C CB . MET A 1 78 ? -12.134 -1.180 6.854 1.00 80.12 78 A 1 +ATOM 572 C CG . MET A 1 78 ? -13.597 -0.763 6.987 1.00 74.02 78 A 1 +ATOM 573 S SD . MET A 1 78 ? -14.221 -0.770 8.683 1.00 68.37 78 A 1 +ATOM 574 C CE . MET A 1 78 ? -15.905 -0.196 8.384 1.00 60.54 78 A 1 +ATOM 575 N N . TYR A 1 79 ? -10.938 1.321 5.427 1.00 84.67 79 A 1 +ATOM 576 C CA . TYR A 1 79 ? -11.034 2.733 5.064 1.00 85.69 79 A 1 +ATOM 577 C C . TYR A 1 79 ? -10.599 3.001 3.620 1.00 87.09 79 A 1 +ATOM 578 O O . TYR A 1 79 ? -11.098 3.937 3.020 1.00 86.73 79 A 1 +ATOM 579 C CB . TYR A 1 79 ? -10.245 3.583 6.051 1.00 84.43 79 A 1 +ATOM 580 C CG . TYR A 1 79 ? -10.915 3.716 7.399 1.00 82.11 79 A 1 +ATOM 581 C CD1 . TYR A 1 79 ? -12.095 4.480 7.531 1.00 73.91 79 A 1 +ATOM 582 C CD2 . TYR A 1 79 ? -10.366 3.098 8.537 1.00 74.07 79 A 1 +ATOM 583 C CE1 . TYR A 1 79 ? -12.712 4.620 8.781 1.00 72.25 79 A 1 +ATOM 584 C CE2 . TYR A 1 79 ? -10.977 3.229 9.786 1.00 71.38 79 A 1 +ATOM 585 C CZ . TYR A 1 79 ? -12.150 3.994 9.911 1.00 75.93 79 A 1 +ATOM 586 O OH . TYR A 1 79 ? -12.747 4.121 11.139 1.00 72.81 79 A 1 +ATOM 587 N N . PHE A 1 80 ? -9.736 2.157 3.033 1.00 86.45 80 A 1 +ATOM 588 C CA . PHE A 1 80 ? -9.459 2.242 1.602 1.00 87.71 80 A 1 +ATOM 589 C C . PHE A 1 80 ? -10.675 1.826 0.759 1.00 88.95 80 A 1 +ATOM 590 O O . PHE A 1 80 ? -10.945 2.469 -0.248 1.00 87.85 80 A 1 +ATOM 591 C CB . PHE A 1 80 ? -8.229 1.413 1.233 1.00 86.72 80 A 1 +ATOM 592 C CG . PHE A 1 80 ? -6.931 1.887 1.849 1.00 85.49 80 A 1 +ATOM 593 C CD1 . PHE A 1 80 ? -6.650 3.257 2.011 1.00 75.49 80 A 1 +ATOM 594 C CD2 . PHE A 1 80 ? -5.958 0.942 2.237 1.00 73.71 80 A 1 +ATOM 595 C CE1 . PHE A 1 80 ? -5.433 3.681 2.579 1.00 71.81 80 A 1 +ATOM 596 C CE2 . PHE A 1 80 ? -4.743 1.358 2.794 1.00 70.93 80 A 1 +ATOM 597 C CZ . PHE A 1 80 ? -4.485 2.722 2.971 1.00 75.10 80 A 1 +ATOM 598 N N . PHE A 1 81 ? -11.444 0.840 1.190 1.00 87.04 81 A 1 +ATOM 599 C CA . PHE A 1 81 ? -12.705 0.497 0.532 1.00 88.00 81 A 1 +ATOM 600 C C . PHE A 1 81 ? -13.769 1.592 0.719 1.00 88.86 81 A 1 +ATOM 601 O O . PHE A 1 81 ? -14.483 1.904 -0.222 1.00 88.12 81 A 1 +ATOM 602 C CB . PHE A 1 81 ? -13.210 -0.860 1.022 1.00 87.97 81 A 1 +ATOM 603 C CG . PHE A 1 81 ? -12.289 -2.033 0.770 1.00 87.79 81 A 1 +ATOM 604 C CD1 . PHE A 1 81 ? -11.632 -2.195 -0.468 1.00 77.60 81 A 1 +ATOM 605 C CD2 . PHE A 1 81 ? -12.100 -3.003 1.772 1.00 76.65 81 A 1 +ATOM 606 C CE1 . PHE A 1 81 ? -10.786 -3.282 -0.689 1.00 76.67 81 A 1 +ATOM 607 C CE2 . PHE A 1 81 ? -11.251 -4.097 1.552 1.00 75.58 81 A 1 +ATOM 608 C CZ . PHE A 1 81 ? -10.590 -4.236 0.328 1.00 83.87 81 A 1 +ATOM 609 N N . ILE A 1 82 ? -13.818 2.238 1.886 1.00 87.43 82 A 1 +ATOM 610 C CA . ILE A 1 82 ? -14.657 3.421 2.105 1.00 87.24 82 A 1 +ATOM 611 C C . ILE A 1 82 ? -14.220 4.576 1.187 1.00 87.36 82 A 1 +ATOM 612 O O . ILE A 1 82 ? -15.062 5.246 0.611 1.00 86.86 82 A 1 +ATOM 613 C CB . ILE A 1 82 ? -14.635 3.833 3.597 1.00 86.59 82 A 1 +ATOM 614 C CG1 . ILE A 1 82 ? -15.429 2.800 4.424 1.00 82.80 82 A 1 +ATOM 615 C CG2 . ILE A 1 82 ? -15.210 5.245 3.812 1.00 80.44 82 A 1 +ATOM 616 C CD1 . ILE A 1 82 ? -15.308 2.974 5.934 1.00 72.85 82 A 1 +ATOM 617 N N . CYS A 1 83 ? -12.915 4.774 1.007 1.00 87.70 83 A 1 +ATOM 618 C CA . CYS A 1 83 ? -12.388 5.762 0.063 1.00 87.91 83 A 1 +ATOM 619 C C . CYS A 1 83 ? -12.820 5.439 -1.379 1.00 88.51 83 A 1 +ATOM 620 O O . CYS A 1 83 ? -13.235 6.344 -2.101 1.00 88.05 83 A 1 +ATOM 621 C CB . CYS A 1 83 ? -10.861 5.812 0.206 1.00 87.46 83 A 1 +ATOM 622 S SG . CYS A 1 83 ? -10.164 7.192 -0.740 1.00 79.75 83 A 1 +ATOM 623 N N . SER A 1 84 ? -12.787 4.171 -1.785 1.00 88.61 84 A 1 +ATOM 624 C CA . SER A 1 84 ? -13.291 3.734 -3.097 1.00 88.77 84 A 1 +ATOM 625 C C . SER A 1 84 ? -14.790 4.027 -3.259 1.00 88.72 84 A 1 +ATOM 626 O O . SER A 1 84 ? -15.195 4.505 -4.312 1.00 87.96 84 A 1 +ATOM 627 C CB . SER A 1 84 ? -13.025 2.237 -3.292 1.00 88.97 84 A 1 +ATOM 628 O OG . SER A 1 84 ? -13.418 1.806 -4.571 1.00 81.39 84 A 1 +ATOM 629 N N . LEU A 1 85 ? -15.593 3.795 -2.212 1.00 88.79 85 A 1 +ATOM 630 C CA . LEU A 1 85 ? -17.016 4.118 -2.214 1.00 88.34 85 A 1 +ATOM 631 C C . LEU A 1 85 ? -17.248 5.628 -2.330 1.00 88.35 85 A 1 +ATOM 632 O O . LEU A 1 85 ? -18.031 6.053 -3.178 1.00 87.62 85 A 1 +ATOM 633 C CB . LEU A 1 85 ? -17.658 3.523 -0.947 1.00 88.00 85 A 1 +ATOM 634 C CG . LEU A 1 85 ? -19.186 3.658 -0.899 1.00 85.10 85 A 1 +ATOM 635 C CD1 . LEU A 1 85 ? -19.873 2.886 -2.026 1.00 75.39 85 A 1 +ATOM 636 C CD2 . LEU A 1 85 ? -19.713 3.088 0.419 1.00 75.79 85 A 1 +ATOM 637 N N . ALA A 1 86 ? -16.506 6.443 -1.576 1.00 89.16 86 A 1 +ATOM 638 C CA . ALA A 1 86 ? -16.584 7.898 -1.666 1.00 88.48 86 A 1 +ATOM 639 C C . ALA A 1 86 ? -16.215 8.431 -3.063 1.00 88.46 86 A 1 +ATOM 640 O O . ALA A 1 86 ? -16.829 9.371 -3.552 1.00 87.46 86 A 1 +ATOM 641 C CB . ALA A 1 86 ? -15.681 8.499 -0.583 1.00 88.37 86 A 1 +ATOM 642 N N . VAL A 1 87 ? -15.241 7.813 -3.749 1.00 88.71 87 A 1 +ATOM 643 C CA . VAL A 1 87 ? -14.908 8.171 -5.137 1.00 88.12 87 A 1 +ATOM 644 C C . VAL A 1 87 ? -16.035 7.773 -6.101 1.00 87.86 87 A 1 +ATOM 645 O O . VAL A 1 87 ? -16.315 8.523 -7.029 1.00 86.96 87 A 1 +ATOM 646 C CB . VAL A 1 87 ? -13.550 7.583 -5.560 1.00 87.77 87 A 1 +ATOM 647 C CG1 . VAL A 1 87 ? -13.216 7.885 -7.024 1.00 79.81 87 A 1 +ATOM 648 C CG2 . VAL A 1 87 ? -12.403 8.174 -4.730 1.00 79.33 87 A 1 +ATOM 649 N N . ALA A 1 88 ? -16.708 6.642 -5.869 1.00 89.00 88 A 1 +ATOM 650 C CA . ALA A 1 88 ? -17.876 6.262 -6.657 1.00 88.23 88 A 1 +ATOM 651 C C . ALA A 1 88 ? -19.042 7.249 -6.468 1.00 87.87 88 A 1 +ATOM 652 O O . ALA A 1 88 ? -19.659 7.666 -7.451 1.00 86.24 88 A 1 +ATOM 653 C CB . ALA A 1 88 ? -18.272 4.821 -6.294 1.00 88.16 88 A 1 +ATOM 654 N N . ASP A 1 89 ? -19.271 7.711 -5.237 1.00 89.06 89 A 1 +ATOM 655 C CA . ASP A 1 89 ? -20.285 8.731 -4.928 1.00 87.61 89 A 1 +ATOM 656 C C . ASP A 1 89 ? -19.940 10.097 -5.543 1.00 86.37 89 A 1 +ATOM 657 O O . ASP A 1 89 ? -20.814 10.792 -6.072 1.00 84.51 89 A 1 +ATOM 658 C CB . ASP A 1 89 ? -20.423 8.861 -3.410 1.00 87.03 89 A 1 +ATOM 659 C CG . ASP A 1 89 ? -21.104 7.659 -2.754 1.00 84.74 89 A 1 +ATOM 660 O OD1 . ASP A 1 89 ? -21.868 6.954 -3.443 1.00 75.88 89 A 1 +ATOM 661 O OD2 . ASP A 1 89 ? -20.893 7.490 -1.532 1.00 76.45 89 A 1 +ATOM 662 N N . MET A 1 90 ? -18.648 10.461 -5.568 1.00 87.57 90 A 1 +ATOM 663 C CA . MET A 1 90 ? -18.176 11.630 -6.313 1.00 86.73 90 A 1 +ATOM 664 C C . MET A 1 90 ? -18.478 11.516 -7.804 1.00 86.33 90 A 1 +ATOM 665 O O . MET A 1 90 ? -18.847 12.511 -8.418 1.00 84.52 90 A 1 +ATOM 666 C CB . MET A 1 90 ? -16.665 11.824 -6.141 1.00 85.79 90 A 1 +ATOM 667 C CG . MET A 1 90 ? -16.294 12.434 -4.794 1.00 80.59 90 A 1 +ATOM 668 S SD . MET A 1 90 ? -14.492 12.581 -4.517 1.00 79.61 90 A 1 +ATOM 669 C CE . MET A 1 90 ? -14.042 13.688 -5.867 1.00 67.90 90 A 1 +ATOM 670 N N . LEU A 1 91 ? -18.353 10.321 -8.394 1.00 86.58 91 A 1 +ATOM 671 C CA . LEU A 1 91 ? -18.605 10.100 -9.814 1.00 85.36 91 A 1 +ATOM 672 C C . LEU A 1 91 ? -20.063 10.387 -10.185 1.00 84.58 91 A 1 +ATOM 673 O O . LEU A 1 91 ? -20.318 11.069 -11.174 1.00 82.80 91 A 1 +ATOM 674 C CB . LEU A 1 91 ? -18.197 8.665 -10.198 1.00 83.95 91 A 1 +ATOM 675 C CG . LEU A 1 91 ? -17.713 8.563 -11.653 1.00 78.30 91 A 1 +ATOM 676 C CD1 . LEU A 1 91 ? -16.214 8.825 -11.741 1.00 70.89 91 A 1 +ATOM 677 C CD2 . LEU A 1 91 ? -17.985 7.175 -12.217 1.00 70.09 91 A 1 +ATOM 678 N N . VAL A 1 92 ? -21.022 9.937 -9.355 1.00 84.83 92 A 1 +ATOM 679 C CA . VAL A 1 92 ? -22.447 10.279 -9.508 1.00 83.31 92 A 1 +ATOM 680 C C . VAL A 1 92 ? -22.649 11.788 -9.425 1.00 83.06 92 A 1 +ATOM 681 O O . VAL A 1 92 ? -23.320 12.380 -10.264 1.00 81.11 92 A 1 +ATOM 682 C CB . VAL A 1 92 ? -23.319 9.611 -8.432 1.00 81.59 92 A 1 +ATOM 683 C CG1 . VAL A 1 92 ? -24.766 10.118 -8.423 1.00 72.34 92 A 1 +ATOM 684 C CG2 . VAL A 1 92 ? -23.400 8.109 -8.659 1.00 71.95 92 A 1 +ATOM 685 N N . SER A 1 93 ? -22.048 12.424 -8.418 1.00 83.31 93 A 1 +ATOM 686 C CA . SER A 1 93 ? -22.196 13.858 -8.180 1.00 81.37 93 A 1 +ATOM 687 C C . SER A 1 93 ? -21.655 14.689 -9.342 1.00 81.57 93 A 1 +ATOM 688 O O . SER A 1 93 ? -22.309 15.633 -9.783 1.00 79.65 93 A 1 +ATOM 689 C CB . SER A 1 93 ? -21.473 14.248 -6.894 1.00 79.91 93 A 1 +ATOM 690 O OG . SER A 1 93 ? -21.909 13.430 -5.835 1.00 69.14 93 A 1 +ATOM 691 N N . VAL A 1 94 ? -20.485 14.316 -9.865 1.00 82.55 94 A 1 +ATOM 692 C CA . VAL A 1 94 ? -19.870 14.969 -11.025 1.00 81.72 94 A 1 +ATOM 693 C C . VAL A 1 94 ? -20.699 14.739 -12.287 1.00 81.23 94 A 1 +ATOM 694 O O . VAL A 1 94 ? -20.894 15.690 -13.034 1.00 80.10 94 A 1 +ATOM 695 C CB . VAL A 1 94 ? -18.424 14.495 -11.223 1.00 81.36 94 A 1 +ATOM 696 C CG1 . VAL A 1 94 ? -17.805 15.000 -12.529 1.00 74.13 94 A 1 +ATOM 697 C CG2 . VAL A 1 94 ? -17.525 15.015 -10.086 1.00 73.75 94 A 1 +ATOM 698 N N . SER A 1 95 ? -21.223 13.542 -12.503 1.00 83.05 95 A 1 +ATOM 699 C CA . SER A 1 95 ? -22.087 13.229 -13.644 1.00 81.57 95 A 1 +ATOM 700 C C . SER A 1 95 ? -23.336 14.109 -13.648 1.00 81.26 95 A 1 +ATOM 701 O O . SER A 1 95 ? -23.526 14.894 -14.568 1.00 79.42 95 A 1 +ATOM 702 C CB . SER A 1 95 ? -22.469 11.742 -13.630 1.00 80.65 95 A 1 +ATOM 703 O OG . SER A 1 95 ? -23.263 11.425 -14.749 1.00 69.23 95 A 1 +ATOM 704 N N . ASN A 1 96 ? -24.101 14.077 -12.561 1.00 79.61 96 A 1 +ATOM 705 C CA . ASN A 1 96 ? -25.342 14.838 -12.454 1.00 78.13 96 A 1 +ATOM 706 C C . ASN A 1 96 ? -25.118 16.357 -12.494 1.00 78.64 96 A 1 +ATOM 707 O O . ASN A 1 96 ? -25.862 17.077 -13.152 1.00 76.66 96 A 1 +ATOM 708 C CB . ASN A 1 96 ? -26.069 14.430 -11.168 1.00 75.73 96 A 1 +ATOM 709 C CG . ASN A 1 96 ? -26.632 13.017 -11.232 1.00 67.51 96 A 1 +ATOM 710 O OD1 . ASN A 1 96 ? -26.951 12.488 -12.266 1.00 59.85 96 A 1 +ATOM 711 N ND2 . ASN A 1 96 ? -26.799 12.369 -10.103 1.00 58.83 96 A 1 +ATOM 712 N N . ALA A 1 97 ? -24.076 16.857 -11.824 1.00 78.39 97 A 1 +ATOM 713 C CA . ALA A 1 97 ? -23.742 18.279 -11.874 1.00 77.30 97 A 1 +ATOM 714 C C . ALA A 1 97 ? -23.326 18.715 -13.282 1.00 78.29 97 A 1 +ATOM 715 O O . ALA A 1 97 ? -23.779 19.760 -13.761 1.00 77.32 97 A 1 +ATOM 716 C CB . ALA A 1 97 ? -22.648 18.570 -10.842 1.00 75.97 97 A 1 +ATOM 717 N N . SER A 1 98 ? -22.506 17.912 -13.969 1.00 78.04 98 A 1 +ATOM 718 C CA . SER A 1 98 ? -22.047 18.216 -15.320 1.00 77.75 98 A 1 +ATOM 719 C C . SER A 1 98 ? -23.199 18.213 -16.321 1.00 77.81 98 A 1 +ATOM 720 O O . SER A 1 98 ? -23.322 19.148 -17.106 1.00 76.60 98 A 1 +ATOM 721 C CB . SER A 1 98 ? -20.980 17.224 -15.789 1.00 77.01 98 A 1 +ATOM 722 O OG . SER A 1 98 ? -19.880 17.214 -14.898 1.00 68.66 98 A 1 +ATOM 723 N N . GLU A 1 99 ? -24.073 17.211 -16.240 1.00 77.93 99 A 1 +ATOM 724 C CA . GLU A 1 99 ? -25.273 17.127 -17.070 1.00 77.46 99 A 1 +ATOM 725 C C . GLU A 1 99 ? -26.187 18.329 -16.846 1.00 77.16 99 A 1 +ATOM 726 O O . GLU A 1 99 ? -26.598 18.997 -17.794 1.00 75.83 99 A 1 +ATOM 727 C CB . GLU A 1 99 ? -25.994 15.816 -16.753 1.00 75.20 99 A 1 +ATOM 728 C CG . GLU A 1 99 ? -27.189 15.604 -17.679 1.00 68.70 99 A 1 +ATOM 729 C CD . GLU A 1 99 ? -27.919 14.283 -17.435 1.00 65.94 99 A 1 +ATOM 730 O OE1 . GLU A 1 99 ? -28.810 13.986 -18.241 1.00 58.52 99 A 1 +ATOM 731 O OE2 . GLU A 1 99 ? -27.611 13.603 -16.434 1.00 60.22 99 A 1 +ATOM 732 N N . THR A 1 100 ? -26.436 18.686 -15.580 1.00 77.19 100 A 1 +ATOM 733 C CA . THR A 1 100 ? -27.258 19.836 -15.210 1.00 75.36 100 A 1 +ATOM 734 C C . THR A 1 100 ? -26.688 21.140 -15.761 1.00 75.68 100 A 1 +ATOM 735 O O . THR A 1 100 ? -27.432 21.967 -16.290 1.00 75.24 100 A 1 +ATOM 736 C CB . THR A 1 100 ? -27.394 19.938 -13.687 1.00 74.26 100 A 1 +ATOM 737 O OG1 . THR A 1 100 ? -27.925 18.755 -13.150 1.00 67.42 100 A 1 +ATOM 738 C CG2 . THR A 1 100 ? -28.348 21.050 -13.276 1.00 65.02 100 A 1 +ATOM 739 N N . ILE A 1 101 ? -25.370 21.336 -15.682 1.00 75.23 101 A 1 +ATOM 740 C CA . ILE A 1 101 ? -24.688 22.511 -16.238 1.00 75.01 101 A 1 +ATOM 741 C C . ILE A 1 101 ? -24.826 22.545 -17.765 1.00 75.24 101 A 1 +ATOM 742 O O . ILE A 1 101 ? -25.142 23.593 -18.318 1.00 75.59 101 A 1 +ATOM 743 C CB . ILE A 1 101 ? -23.206 22.546 -15.803 1.00 75.23 101 A 1 +ATOM 744 C CG1 . ILE A 1 101 ? -23.097 22.846 -14.294 1.00 70.65 101 A 1 +ATOM 745 C CG2 . ILE A 1 101 ? -22.406 23.597 -16.589 1.00 68.55 101 A 1 +ATOM 746 C CD1 . ILE A 1 101 ? -21.724 22.531 -13.697 1.00 62.59 101 A 1 +ATOM 747 N N . VAL A 1 102 ? -24.624 21.411 -18.436 1.00 76.20 102 A 1 +ATOM 748 C CA . VAL A 1 102 ? -24.737 21.327 -19.897 1.00 75.41 102 A 1 +ATOM 749 C C . VAL A 1 102 ? -26.162 21.632 -20.348 1.00 74.48 102 A 1 +ATOM 750 O O . VAL A 1 102 ? -26.345 22.469 -21.230 1.00 74.27 102 A 1 +ATOM 751 C CB . VAL A 1 102 ? -24.251 19.966 -20.410 1.00 75.03 102 A 1 +ATOM 752 C CG1 . VAL A 1 102 ? -24.574 19.754 -21.887 1.00 68.81 102 A 1 +ATOM 753 C CG2 . VAL A 1 102 ? -22.727 19.873 -20.251 1.00 68.68 102 A 1 +ATOM 754 N N . ILE A 1 103 ? -27.167 21.036 -19.705 1.00 75.75 103 A 1 +ATOM 755 C CA . ILE A 1 103 ? -28.578 21.299 -20.015 1.00 73.98 103 A 1 +ATOM 756 C C . ILE A 1 103 ? -28.912 22.775 -19.783 1.00 73.74 103 A 1 +ATOM 757 O O . ILE A 1 103 ? -29.533 23.411 -20.637 1.00 72.25 103 A 1 +ATOM 758 C CB . ILE A 1 103 ? -29.496 20.354 -19.202 1.00 72.07 103 A 1 +ATOM 759 C CG1 . ILE A 1 103 ? -29.314 18.900 -19.684 1.00 66.88 103 A 1 +ATOM 760 C CG2 . ILE A 1 103 ? -30.971 20.775 -19.337 1.00 63.84 103 A 1 +ATOM 761 C CD1 . ILE A 1 103 ? -29.989 17.859 -18.789 1.00 59.34 103 A 1 +ATOM 762 N N . ALA A 1 104 ? -28.474 23.372 -18.672 1.00 74.39 104 A 1 +ATOM 763 C CA . ALA A 1 104 ? -28.704 24.786 -18.381 1.00 73.19 104 A 1 +ATOM 764 C C . ALA A 1 104 ? -28.036 25.715 -19.412 1.00 73.08 104 A 1 +ATOM 765 O O . ALA A 1 104 ? -28.637 26.695 -19.835 1.00 72.22 104 A 1 +ATOM 766 C CB . ALA A 1 104 ? -28.207 25.083 -16.960 1.00 72.05 104 A 1 +ATOM 767 N N . LEU A 1 105 ? -26.818 25.398 -19.853 1.00 74.84 105 A 1 +ATOM 768 C CA . LEU A 1 105 ? -26.103 26.163 -20.879 1.00 73.43 105 A 1 +ATOM 769 C C . LEU A 1 105 ? -26.781 26.069 -22.253 1.00 72.40 105 A 1 +ATOM 770 O O . LEU A 1 105 ? -26.843 27.071 -22.961 1.00 72.23 105 A 1 +ATOM 771 C CB . LEU A 1 105 ? -24.651 25.671 -20.968 1.00 73.59 105 A 1 +ATOM 772 C CG . LEU A 1 105 ? -23.750 26.117 -19.804 1.00 70.08 105 A 1 +ATOM 773 C CD1 . LEU A 1 105 ? -22.412 25.384 -19.898 1.00 64.59 105 A 1 +ATOM 774 C CD2 . LEU A 1 105 ? -23.468 27.618 -19.830 1.00 65.56 105 A 1 +ATOM 775 N N . ILE A 1 106 ? -27.312 24.893 -22.609 1.00 73.81 106 A 1 +ATOM 776 C CA . ILE A 1 106 ? -28.047 24.709 -23.866 1.00 72.14 106 A 1 +ATOM 777 C C . ILE A 1 106 ? -29.378 25.453 -23.817 1.00 71.12 106 A 1 +ATOM 778 O O . ILE A 1 106 ? -29.682 26.217 -24.727 1.00 68.90 106 A 1 +ATOM 779 C CB . ILE A 1 106 ? -28.242 23.206 -24.175 1.00 71.35 106 A 1 +ATOM 780 C CG1 . ILE A 1 106 ? -26.893 22.499 -24.414 1.00 67.55 106 A 1 +ATOM 781 C CG2 . ILE A 1 106 ? -29.119 23.046 -25.431 1.00 66.39 106 A 1 +ATOM 782 C CD1 . ILE A 1 106 ? -26.995 20.966 -24.303 1.00 62.36 106 A 1 +ATOM 783 N N . ASN A 1 107 ? -30.136 25.302 -22.733 1.00 74.50 107 A 1 +ATOM 784 C CA . ASN A 1 107 ? -31.426 25.981 -22.560 1.00 71.68 107 A 1 +ATOM 785 C C . ASN A 1 107 ? -31.273 27.499 -22.447 1.00 69.35 107 A 1 +ATOM 786 O O . ASN A 1 107 ? -32.127 28.244 -22.930 1.00 65.35 107 A 1 +ATOM 787 C CB . ASN A 1 107 ? -32.130 25.419 -21.314 1.00 69.47 107 A 1 +ATOM 788 C CG . ASN A 1 107 ? -32.679 24.015 -21.518 1.00 65.32 107 A 1 +ATOM 789 O OD1 . ASN A 1 107 ? -32.837 23.529 -22.622 1.00 59.38 107 A 1 +ATOM 790 N ND2 . ASN A 1 107 ? -33.034 23.330 -20.450 1.00 59.26 107 A 1 +ATOM 791 N N . GLY A 1 108 ? -30.179 27.971 -21.858 1.00 71.09 108 A 1 +ATOM 792 C CA . GLY A 1 108 ? -29.819 29.386 -21.798 1.00 68.64 108 A 1 +ATOM 793 C C . GLY A 1 108 ? -29.321 29.968 -23.124 1.00 67.48 108 A 1 +ATOM 794 O O . GLY A 1 108 ? -29.035 31.157 -23.183 1.00 61.55 108 A 1 +ATOM 795 N N . GLY A 1 109 ? -29.191 29.154 -24.164 1.00 67.60 109 A 1 +ATOM 796 C CA . GLY A 1 109 ? -28.708 29.561 -25.484 1.00 65.84 109 A 1 +ATOM 797 C C . GLY A 1 109 ? -27.216 29.916 -25.536 1.00 65.11 109 A 1 +ATOM 798 O O . GLY A 1 109 ? -26.728 30.353 -26.578 1.00 59.27 109 A 1 +ATOM 799 N N . SER A 1 110 ? -26.486 29.731 -24.444 1.00 63.50 110 A 1 +ATOM 800 C CA . SER A 1 110 ? -25.063 30.063 -24.349 1.00 63.36 110 A 1 +ATOM 801 C C . SER A 1 110 ? -24.167 29.026 -25.030 1.00 63.34 110 A 1 +ATOM 802 O O . SER A 1 110 ? -23.040 29.334 -25.409 1.00 59.16 110 A 1 +ATOM 803 C CB . SER A 1 110 ? -24.648 30.182 -22.879 1.00 60.13 110 A 1 +ATOM 804 O OG . SER A 1 110 ? -25.490 31.084 -22.197 1.00 56.08 110 A 1 +ATOM 805 N N . LEU A 1 111 ? -24.676 27.805 -25.176 1.00 62.78 111 A 1 +ATOM 806 C CA . LEU A 1 111 ? -23.939 26.698 -25.767 1.00 63.25 111 A 1 +ATOM 807 C C . LEU A 1 111 ? -24.795 26.043 -26.856 1.00 64.18 111 A 1 +ATOM 808 O O . LEU A 1 111 ? -25.800 25.403 -26.569 1.00 60.48 111 A 1 +ATOM 809 C CB . LEU A 1 111 ? -23.528 25.716 -24.652 1.00 59.33 111 A 1 +ATOM 810 C CG . LEU A 1 111 ? -22.199 25.005 -24.951 1.00 54.51 111 A 1 +ATOM 811 C CD1 . LEU A 1 111 ? -21.010 25.882 -24.564 1.00 51.08 111 A 1 +ATOM 812 C CD2 . LEU A 1 111 ? -22.096 23.716 -24.151 1.00 51.65 111 A 1 +ATOM 813 N N . THR A 1 112 ? -24.385 26.206 -28.119 1.00 65.68 112 A 1 +ATOM 814 C CA . THR A 1 112 ? -25.001 25.512 -29.252 1.00 65.84 112 A 1 +ATOM 815 C C . THR A 1 112 ? -24.223 24.239 -29.543 1.00 65.39 112 A 1 +ATOM 816 O O . THR A 1 112 ? -23.158 24.278 -30.164 1.00 61.69 112 A 1 +ATOM 817 C CB . THR A 1 112 ? -25.086 26.413 -30.496 1.00 61.93 112 A 1 +ATOM 818 O OG1 . THR A 1 112 ? -23.890 27.125 -30.688 1.00 55.46 112 A 1 +ATOM 819 C CG2 . THR A 1 112 ? -26.210 27.444 -30.361 1.00 52.96 112 A 1 +ATOM 820 N N . ILE A 1 113 ? -24.752 23.109 -29.076 1.00 65.24 113 A 1 +ATOM 821 C CA . ILE A 1 113 ? -24.147 21.794 -29.305 1.00 65.68 113 A 1 +ATOM 822 C C . ILE A 1 113 ? -24.999 21.042 -30.340 1.00 67.09 113 A 1 +ATOM 823 O O . ILE A 1 113 ? -26.226 21.043 -30.223 1.00 64.22 113 A 1 +ATOM 824 C CB . ILE A 1 113 ? -23.985 21.013 -27.989 1.00 61.30 113 A 1 +ATOM 825 C CG1 . ILE A 1 113 ? -23.242 21.846 -26.912 1.00 56.22 113 A 1 +ATOM 826 C CG2 . ILE A 1 113 ? -23.209 19.721 -28.257 1.00 54.23 113 A 1 +ATOM 827 C CD1 . ILE A 1 113 ? -23.034 21.113 -25.579 1.00 50.77 113 A 1 +ATOM 828 N N . PRO A 1 114 ? -24.395 20.400 -31.344 1.00 69.04 114 A 1 +ATOM 829 C CA . PRO A 1 114 ? -25.148 19.594 -32.294 1.00 69.52 114 A 1 +ATOM 830 C C . PRO A 1 114 ? -25.825 18.408 -31.596 1.00 70.03 114 A 1 +ATOM 831 O O . PRO A 1 114 ? -25.269 17.825 -30.666 1.00 67.88 114 A 1 +ATOM 832 C CB . PRO A 1 114 ? -24.132 19.157 -33.362 1.00 66.75 114 A 1 +ATOM 833 C CG . PRO A 1 114 ? -22.790 19.229 -32.636 1.00 64.29 114 A 1 +ATOM 834 C CD . PRO A 1 114 ? -22.974 20.365 -31.637 1.00 66.75 114 A 1 +ATOM 835 N N . VAL A 1 115 ? -27.000 18.006 -32.076 1.00 70.01 115 A 1 +ATOM 836 C CA . VAL A 1 115 ? -27.830 16.956 -31.458 1.00 70.55 115 A 1 +ATOM 837 C C . VAL A 1 115 ? -27.075 15.628 -31.290 1.00 71.10 115 A 1 +ATOM 838 O O . VAL A 1 115 ? -27.235 14.941 -30.288 1.00 68.41 115 A 1 +ATOM 839 C CB . VAL A 1 115 ? -29.119 16.723 -32.274 1.00 67.78 115 A 1 +ATOM 840 C CG1 . VAL A 1 115 ? -30.027 15.658 -31.668 1.00 60.02 115 A 1 +ATOM 841 C CG2 . VAL A 1 115 ? -29.940 18.017 -32.385 1.00 59.00 115 A 1 +ATOM 842 N N . THR A 1 116 ? -26.201 15.302 -32.250 1.00 71.24 116 A 1 +ATOM 843 C CA . THR A 1 116 ? -25.343 14.112 -32.175 1.00 71.41 116 A 1 +ATOM 844 C C . THR A 1 116 ? -24.406 14.156 -30.970 1.00 72.47 116 A 1 +ATOM 845 O O . THR A 1 116 ? -24.213 13.140 -30.304 1.00 70.38 116 A 1 +ATOM 846 C CB . THR A 1 116 ? -24.491 13.978 -33.441 1.00 68.88 116 A 1 +ATOM 847 O OG1 . THR A 1 116 ? -23.904 15.229 -33.771 1.00 62.28 116 A 1 +ATOM 848 C CG2 . THR A 1 116 ? -25.338 13.561 -34.636 1.00 58.75 116 A 1 +ATOM 849 N N . PHE A 1 117 ? -23.877 15.343 -30.647 1.00 72.44 117 A 1 +ATOM 850 C CA . PHE A 1 117 ? -23.003 15.536 -29.502 1.00 72.43 117 A 1 +ATOM 851 C C . PHE A 1 117 ? -23.768 15.471 -28.181 1.00 73.24 117 A 1 +ATOM 852 O O . PHE A 1 117 ? -23.277 14.888 -27.228 1.00 72.37 117 A 1 +ATOM 853 C CB . PHE A 1 117 ? -22.304 16.878 -29.660 1.00 70.04 117 A 1 +ATOM 854 C CG . PHE A 1 117 ? -21.138 17.067 -28.737 1.00 63.85 117 A 1 +ATOM 855 C CD1 . PHE A 1 117 ? -21.328 17.532 -27.422 1.00 56.91 117 A 1 +ATOM 856 C CD2 . PHE A 1 117 ? -19.840 16.861 -29.236 1.00 56.08 117 A 1 +ATOM 857 C CE1 . PHE A 1 117 ? -20.224 17.841 -26.626 1.00 50.44 117 A 1 +ATOM 858 C CE2 . PHE A 1 117 ? -18.740 17.179 -28.438 1.00 50.10 117 A 1 +ATOM 859 C CZ . PHE A 1 117 ? -18.928 17.693 -27.141 1.00 50.02 117 A 1 +ATOM 860 N N . ILE A 1 118 ? -24.995 15.990 -28.147 1.00 70.80 118 A 1 +ATOM 861 C CA . ILE A 1 118 ? -25.884 15.862 -26.984 1.00 70.72 118 A 1 +ATOM 862 C C . ILE A 1 118 ? -26.147 14.385 -26.686 1.00 71.94 118 A 1 +ATOM 863 O O . ILE A 1 118 ? -25.971 13.960 -25.557 1.00 71.06 118 A 1 +ATOM 864 C CB . ILE A 1 118 ? -27.202 16.638 -27.188 1.00 69.06 118 A 1 +ATOM 865 C CG1 . ILE A 1 118 ? -26.922 18.144 -27.374 1.00 63.99 118 A 1 +ATOM 866 C CG2 . ILE A 1 118 ? -28.137 16.425 -25.987 1.00 61.46 118 A 1 +ATOM 867 C CD1 . ILE A 1 118 ? -28.147 18.950 -27.811 1.00 56.86 118 A 1 +ATOM 868 N N . LYS A 1 119 ? -26.456 13.579 -27.707 1.00 73.03 119 A 1 +ATOM 869 C CA . LYS A 1 119 ? -26.670 12.141 -27.549 1.00 73.22 119 A 1 +ATOM 870 C C . LYS A 1 119 ? -25.400 11.418 -27.073 1.00 74.20 119 A 1 +ATOM 871 O O . LYS A 1 119 ? -25.488 10.508 -26.252 1.00 73.49 119 A 1 +ATOM 872 C CB . LYS A 1 119 ? -27.196 11.555 -28.872 1.00 71.73 119 A 1 +ATOM 873 C CG . LYS A 1 119 ? -27.791 10.151 -28.668 1.00 63.37 119 A 1 +ATOM 874 C CD . LYS A 1 119 ? -28.281 9.524 -29.977 1.00 57.41 119 A 1 +ATOM 875 C CE . LYS A 1 119 ? -28.852 8.134 -29.683 1.00 50.71 119 A 1 +ATOM 876 N NZ . LYS A 1 119 ? -29.119 7.321 -30.901 1.00 44.69 119 A 1 +ATOM 877 N N . SER A 1 120 ? -24.220 11.826 -27.548 1.00 73.13 120 A 1 +ATOM 878 C CA . SER A 1 120 ? -22.952 11.285 -27.061 1.00 73.29 120 A 1 +ATOM 879 C C . SER A 1 120 ? -22.686 11.664 -25.605 1.00 74.81 120 A 1 +ATOM 880 O O . SER A 1 120 ? -22.251 10.810 -24.842 1.00 73.77 120 A 1 +ATOM 881 C CB . SER A 1 120 ? -21.779 11.757 -27.926 1.00 71.06 120 A 1 +ATOM 882 O OG . SER A 1 120 ? -21.913 11.288 -29.250 1.00 62.32 120 A 1 +ATOM 883 N N . MET A 1 121 ? -22.973 12.906 -25.198 1.00 73.54 121 A 1 +ATOM 884 C CA . MET A 1 121 ? -22.859 13.323 -23.794 1.00 72.96 121 A 1 +ATOM 885 C C . MET A 1 121 ? -23.821 12.551 -22.897 1.00 74.11 121 A 1 +ATOM 886 O O . MET A 1 121 ? -23.402 12.101 -21.836 1.00 73.80 121 A 1 +ATOM 887 C CB . MET A 1 121 ? -23.113 14.825 -23.638 1.00 71.57 121 A 1 +ATOM 888 C CG . MET A 1 121 ? -21.911 15.658 -24.081 1.00 64.86 121 A 1 +ATOM 889 S SD . MET A 1 121 ? -21.804 17.279 -23.279 1.00 58.80 121 A 1 +ATOM 890 C CE . MET A 1 121 ? -21.273 16.768 -21.628 1.00 51.95 121 A 1 +ATOM 891 N N . ASP A 1 122 ? -25.059 12.361 -23.333 1.00 76.91 122 A 1 +ATOM 892 C CA . ASP A 1 122 ? -26.075 11.598 -22.616 1.00 76.43 122 A 1 +ATOM 893 C C . ASP A 1 122 ? -25.589 10.156 -22.344 1.00 77.56 122 A 1 +ATOM 894 O O . ASP A 1 122 ? -25.549 9.718 -21.203 1.00 76.29 122 A 1 +ATOM 895 C CB . ASP A 1 122 ? -27.368 11.640 -23.455 1.00 74.16 122 A 1 +ATOM 896 C CG . ASP A 1 122 ? -28.662 11.479 -22.659 1.00 67.14 122 A 1 +ATOM 897 O OD1 . ASP A 1 122 ? -28.720 11.998 -21.534 1.00 59.09 122 A 1 +ATOM 898 O OD2 . ASP A 1 122 ? -29.624 10.945 -23.254 1.00 58.61 122 A 1 +ATOM 899 N N . ASN A 1 123 ? -25.050 9.485 -23.366 1.00 78.18 123 A 1 +ATOM 900 C CA . ASN A 1 123 ? -24.446 8.164 -23.204 1.00 77.87 123 A 1 +ATOM 901 C C . ASN A 1 123 ? -23.251 8.162 -22.227 1.00 78.53 123 A 1 +ATOM 902 O O . ASN A 1 123 ? -23.017 7.175 -21.544 1.00 77.79 123 A 1 +ATOM 903 C CB . ASN A 1 123 ? -23.984 7.646 -24.570 1.00 77.06 123 A 1 +ATOM 904 C CG . ASN A 1 123 ? -25.105 7.283 -25.531 1.00 73.58 123 A 1 +ATOM 905 O OD1 . ASN A 1 123 ? -26.265 7.155 -25.220 1.00 66.17 123 A 1 +ATOM 906 N ND2 . ASN A 1 123 ? -24.748 7.039 -26.771 1.00 66.16 123 A 1 +ATOM 907 N N . VAL A 1 124 ? -22.469 9.249 -22.170 1.00 78.50 124 A 1 +ATOM 908 C CA . VAL A 1 124 ? -21.358 9.378 -21.217 1.00 78.29 124 A 1 +ATOM 909 C C . VAL A 1 124 ? -21.874 9.532 -19.796 1.00 78.54 124 A 1 +ATOM 910 O O . VAL A 1 124 ? -21.359 8.866 -18.903 1.00 78.59 124 A 1 +ATOM 911 C CB . VAL A 1 124 ? -20.414 10.543 -21.568 1.00 77.87 124 A 1 +ATOM 912 C CG1 . VAL A 1 124 ? -19.327 10.756 -20.507 1.00 70.91 124 A 1 +ATOM 913 C CG2 . VAL A 1 124 ? -19.710 10.252 -22.886 1.00 70.84 124 A 1 +ATOM 914 N N . PHE A 1 125 ? -22.896 10.365 -19.581 1.00 78.63 125 A 1 +ATOM 915 C CA . PHE A 1 125 ? -23.500 10.537 -18.262 1.00 78.41 125 A 1 +ATOM 916 C C . PHE A 1 125 ? -24.158 9.248 -17.781 1.00 78.47 125 A 1 +ATOM 917 O O . PHE A 1 125 ? -23.885 8.808 -16.665 1.00 77.56 125 A 1 +ATOM 918 C CB . PHE A 1 125 ? -24.484 11.707 -18.289 1.00 77.97 125 A 1 +ATOM 919 C CG . PHE A 1 125 ? -23.866 13.048 -18.585 1.00 73.95 125 A 1 +ATOM 920 C CD1 . PHE A 1 125 ? -22.684 13.461 -17.931 1.00 67.42 125 A 1 +ATOM 921 C CD2 . PHE A 1 125 ? -24.479 13.935 -19.501 1.00 67.32 125 A 1 +ATOM 922 C CE1 . PHE A 1 125 ? -22.126 14.726 -18.196 1.00 64.27 125 A 1 +ATOM 923 C CE2 . PHE A 1 125 ? -23.931 15.188 -19.761 1.00 62.72 125 A 1 +ATOM 924 C CZ . PHE A 1 125 ? -22.752 15.589 -19.113 1.00 65.73 125 A 1 +ATOM 925 N N . ASP A 1 126 ? -24.882 8.556 -18.646 1.00 79.73 126 A 1 +ATOM 926 C CA . ASP A 1 126 ? -25.447 7.242 -18.361 1.00 78.44 126 A 1 +ATOM 927 C C . ASP A 1 126 ? -24.360 6.224 -17.997 1.00 78.72 126 A 1 +ATOM 928 O O . ASP A 1 126 ? -24.466 5.503 -16.999 1.00 77.80 126 A 1 +ATOM 929 C CB . ASP A 1 126 ? -26.202 6.727 -19.591 1.00 76.23 126 A 1 +ATOM 930 C CG . ASP A 1 126 ? -27.579 7.364 -19.789 1.00 71.79 126 A 1 +ATOM 931 O OD1 . ASP A 1 126 ? -28.070 8.011 -18.840 1.00 65.42 126 A 1 +ATOM 932 O OD2 . ASP A 1 126 ? -28.188 7.063 -20.844 1.00 64.68 126 A 1 +ATOM 933 N N . SER A 1 127 ? -23.264 6.205 -18.759 1.00 80.25 127 A 1 +ATOM 934 C CA . SER A 1 127 ? -22.114 5.350 -18.473 1.00 80.00 127 A 1 +ATOM 935 C C . SER A 1 127 ? -21.461 5.686 -17.132 1.00 80.97 127 A 1 +ATOM 936 O O . SER A 1 127 ? -21.077 4.777 -16.399 1.00 80.22 127 A 1 +ATOM 937 C CB . SER A 1 127 ? -21.089 5.452 -19.589 1.00 79.04 127 A 1 +ATOM 938 O OG . SER A 1 127 ? -19.951 4.683 -19.253 1.00 68.27 127 A 1 +ATOM 939 N N . MET A 1 128 ? -21.335 6.967 -16.771 1.00 80.10 128 A 1 +ATOM 940 C CA . MET A 1 128 ? -20.791 7.393 -15.483 1.00 80.47 128 A 1 +ATOM 941 C C . MET A 1 128 ? -21.684 6.942 -14.325 1.00 81.02 128 A 1 +ATOM 942 O O . MET A 1 128 ? -21.159 6.426 -13.335 1.00 81.20 128 A 1 +ATOM 943 C CB . MET A 1 128 ? -20.600 8.914 -15.447 1.00 80.54 128 A 1 +ATOM 944 C CG . MET A 1 128 ? -19.397 9.373 -16.261 1.00 75.89 128 A 1 +ATOM 945 S SD . MET A 1 128 ? -19.126 11.175 -16.254 1.00 71.22 128 A 1 +ATOM 946 C CE . MET A 1 128 ? -18.619 11.431 -14.536 1.00 61.20 128 A 1 +ATOM 947 N N . ILE A 1 129 ? -23.004 7.075 -14.453 1.00 81.38 129 A 1 +ATOM 948 C CA . ILE A 1 129 ? -23.961 6.605 -13.441 1.00 81.18 129 A 1 +ATOM 949 C C . ILE A 1 129 ? -23.879 5.082 -13.290 1.00 81.39 129 A 1 +ATOM 950 O O . ILE A 1 129 ? -23.746 4.577 -12.181 1.00 81.02 129 A 1 +ATOM 951 C CB . ILE A 1 129 ? -25.396 7.075 -13.778 1.00 80.03 129 A 1 +ATOM 952 C CG1 . ILE A 1 129 ? -25.490 8.612 -13.681 1.00 73.88 129 A 1 +ATOM 953 C CG2 . ILE A 1 129 ? -26.417 6.435 -12.820 1.00 71.02 129 A 1 +ATOM 954 C CD1 . ILE A 1 129 ? -26.787 9.188 -14.278 1.00 64.37 129 A 1 +ATOM 955 N N . CYS A 1 130 ? -23.858 4.334 -14.400 1.00 80.92 130 A 1 +ATOM 956 C CA . CYS A 1 130 ? -23.724 2.884 -14.383 1.00 80.54 130 A 1 +ATOM 957 C C . CYS A 1 130 ? -22.373 2.419 -13.815 1.00 82.02 130 A 1 +ATOM 958 O O . CYS A 1 130 ? -22.321 1.453 -13.057 1.00 81.40 130 A 1 +ATOM 959 C CB . CYS A 1 130 ? -23.939 2.353 -15.800 1.00 77.94 130 A 1 +ATOM 960 S SG . CYS A 1 130 ? -25.687 2.529 -16.261 1.00 66.42 130 A 1 +ATOM 961 N N . SER A 1 131 ? -21.287 3.121 -14.142 1.00 82.26 131 A 1 +ATOM 962 C CA . SER A 1 131 ? -19.957 2.834 -13.608 1.00 82.79 131 A 1 +ATOM 963 C C . SER A 1 131 ? -19.879 3.117 -12.113 1.00 83.93 131 A 1 +ATOM 964 O O . SER A 1 131 ? -19.314 2.317 -11.367 1.00 83.14 131 A 1 +ATOM 965 C CB . SER A 1 131 ? -18.882 3.651 -14.324 1.00 82.28 131 A 1 +ATOM 966 O OG . SER A 1 131 ? -18.881 3.359 -15.698 1.00 72.31 131 A 1 +ATOM 967 N N . SER A 1 132 ? -20.487 4.213 -11.657 1.00 83.50 132 A 1 +ATOM 968 C CA . SER A 1 132 ? -20.576 4.537 -10.240 1.00 83.48 132 A 1 +ATOM 969 C C . SER A 1 132 ? -21.375 3.491 -9.473 1.00 84.30 132 A 1 +ATOM 970 O O . SER A 1 132 ? -20.926 3.020 -8.437 1.00 84.15 132 A 1 +ATOM 971 C CB . SER A 1 132 ? -21.203 5.903 -10.034 1.00 83.17 132 A 1 +ATOM 972 O OG . SER A 1 132 ? -21.268 6.131 -8.637 1.00 71.95 132 A 1 +ATOM 973 N N . LEU A 1 133 ? -22.505 3.054 -10.019 1.00 83.46 133 A 1 +ATOM 974 C CA . LEU A 1 133 ? -23.323 1.995 -9.434 1.00 83.03 133 A 1 +ATOM 975 C C . LEU A 1 133 ? -22.537 0.696 -9.247 1.00 84.18 133 A 1 +ATOM 976 O O . LEU A 1 133 ? -22.529 0.115 -8.165 1.00 83.92 133 A 1 +ATOM 977 C CB . LEU A 1 133 ? -24.517 1.792 -10.370 1.00 81.45 133 A 1 +ATOM 978 C CG . LEU A 1 133 ? -25.437 0.629 -9.991 1.00 78.24 133 A 1 +ATOM 979 C CD1 . LEU A 1 133 ? -26.245 0.935 -8.748 1.00 69.93 133 A 1 +ATOM 980 C CD2 . LEU A 1 133 ? -26.359 0.374 -11.176 1.00 70.60 133 A 1 +ATOM 981 N N . LEU A 1 134 ? -21.814 0.266 -10.289 1.00 83.65 134 A 1 +ATOM 982 C CA . LEU A 1 134 ? -20.948 -0.908 -10.232 1.00 84.04 134 A 1 +ATOM 983 C C . LEU A 1 134 ? -19.804 -0.724 -9.233 1.00 85.12 134 A 1 +ATOM 984 O O . LEU A 1 134 ? -19.526 -1.629 -8.448 1.00 84.94 134 A 1 +ATOM 985 C CB . LEU A 1 134 ? -20.398 -1.204 -11.638 1.00 82.54 134 A 1 +ATOM 986 C CG . LEU A 1 134 ? -21.339 -2.061 -12.488 1.00 75.64 134 A 1 +ATOM 987 C CD1 . LEU A 1 134 ? -20.928 -1.975 -13.958 1.00 68.15 134 A 1 +ATOM 988 C CD2 . LEU A 1 134 ? -21.263 -3.534 -12.076 1.00 67.17 134 A 1 +ATOM 989 N N . ALA A 1 135 ? -19.161 0.458 -9.219 1.00 86.06 135 A 1 +ATOM 990 C CA . ALA A 1 135 ? -18.081 0.754 -8.288 1.00 86.81 135 A 1 +ATOM 991 C C . ALA A 1 135 ? -18.567 0.789 -6.835 1.00 87.59 135 A 1 +ATOM 992 O O . ALA A 1 135 ? -17.914 0.223 -5.955 1.00 86.41 135 A 1 +ATOM 993 C CB . ALA A 1 135 ? -17.417 2.068 -8.699 1.00 86.87 135 A 1 +ATOM 994 N N . SER A 1 136 ? -19.744 1.369 -6.582 1.00 86.89 136 A 1 +ATOM 995 C CA . SER A 1 136 ? -20.384 1.395 -5.267 1.00 86.11 136 A 1 +ATOM 996 C C . SER A 1 136 ? -20.712 -0.008 -4.782 1.00 86.27 136 A 1 +ATOM 997 O O . SER A 1 136 ? -20.320 -0.393 -3.682 1.00 85.79 136 A 1 +ATOM 998 C CB . SER A 1 136 ? -21.657 2.243 -5.298 1.00 85.85 136 A 1 +ATOM 999 O OG . SER A 1 136 ? -21.346 3.588 -5.551 1.00 74.97 136 A 1 +ATOM 1000 N N . ILE A 1 137 ? -21.362 -0.836 -5.610 1.00 85.87 137 A 1 +ATOM 1001 C CA . ILE A 1 137 ? -21.739 -2.185 -5.205 1.00 85.29 137 A 1 +ATOM 1002 C C . ILE A 1 137 ? -20.517 -3.087 -5.001 1.00 86.03 137 A 1 +ATOM 1003 O O . ILE A 1 137 ? -20.472 -3.839 -4.037 1.00 85.93 137 A 1 +ATOM 1004 C CB . ILE A 1 137 ? -22.795 -2.782 -6.158 1.00 83.54 137 A 1 +ATOM 1005 C CG1 . ILE A 1 137 ? -23.672 -3.750 -5.341 1.00 72.61 137 A 1 +ATOM 1006 C CG2 . ILE A 1 137 ? -22.195 -3.475 -7.382 1.00 69.76 137 A 1 +ATOM 1007 C CD1 . ILE A 1 137 ? -24.926 -4.196 -6.069 1.00 63.00 137 A 1 +ATOM 1008 N N . CYS A 1 138 ? -19.491 -2.966 -5.853 1.00 86.33 138 A 1 +ATOM 1009 C CA . CYS A 1 138 ? -18.244 -3.699 -5.687 1.00 86.63 138 A 1 +ATOM 1010 C C . CYS A 1 138 ? -17.471 -3.238 -4.439 1.00 86.93 138 A 1 +ATOM 1011 O O . CYS A 1 138 ? -16.904 -4.067 -3.735 1.00 86.54 138 A 1 +ATOM 1012 C CB . CYS A 1 138 ? -17.389 -3.550 -6.946 1.00 86.12 138 A 1 +ATOM 1013 S SG . CYS A 1 138 ? -18.122 -4.455 -8.339 1.00 79.46 138 A 1 +ATOM 1014 N N . SER A 1 139 ? -17.471 -1.936 -4.130 1.00 87.54 139 A 1 +ATOM 1015 C CA . SER A 1 139 ? -16.834 -1.390 -2.928 1.00 87.48 139 A 1 +ATOM 1016 C C . SER A 1 139 ? -17.562 -1.839 -1.654 1.00 87.30 139 A 1 +ATOM 1017 O O . SER A 1 139 ? -16.916 -2.273 -0.705 1.00 86.59 139 A 1 +ATOM 1018 C CB . SER A 1 139 ? -16.763 0.135 -2.997 1.00 88.02 139 A 1 +ATOM 1019 O OG . SER A 1 139 ? -16.018 0.524 -4.127 1.00 79.38 139 A 1 +ATOM 1020 N N . LEU A 1 140 ? -18.898 -1.831 -1.657 1.00 86.19 140 A 1 +ATOM 1021 C CA . LEU A 1 140 ? -19.696 -2.381 -0.570 1.00 85.43 140 A 1 +ATOM 1022 C C . LEU A 1 140 ? -19.468 -3.882 -0.390 1.00 85.36 140 A 1 +ATOM 1023 O O . LEU A 1 140 ? -19.365 -4.355 0.750 1.00 85.39 140 A 1 +ATOM 1024 C CB . LEU A 1 140 ? -21.188 -2.104 -0.828 1.00 85.48 140 A 1 +ATOM 1025 C CG . LEU A 1 140 ? -21.614 -0.641 -0.602 1.00 82.96 140 A 1 +ATOM 1026 C CD1 . LEU A 1 140 ? -23.027 -0.436 -1.132 1.00 74.67 140 A 1 +ATOM 1027 C CD2 . LEU A 1 140 ? -21.615 -0.277 0.884 1.00 75.32 140 A 1 +ATOM 1028 N N . LEU A 1 141 ? -19.309 -4.640 -1.483 1.00 86.55 141 A 1 +ATOM 1029 C CA . LEU A 1 141 ? -18.966 -6.059 -1.427 1.00 86.14 141 A 1 +ATOM 1030 C C . LEU A 1 141 ? -17.572 -6.273 -0.831 1.00 86.22 141 A 1 +ATOM 1031 O O . LEU A 1 141 ? -17.407 -7.143 0.019 1.00 85.81 141 A 1 +ATOM 1032 C CB . LEU A 1 141 ? -19.082 -6.668 -2.838 1.00 86.04 141 A 1 +ATOM 1033 C CG . LEU A 1 141 ? -18.893 -8.199 -2.863 1.00 81.65 141 A 1 +ATOM 1034 C CD1 . LEU A 1 141 ? -20.054 -8.936 -2.208 1.00 72.21 141 A 1 +ATOM 1035 C CD2 . LEU A 1 141 ? -18.799 -8.691 -4.309 1.00 72.51 141 A 1 +ATOM 1036 N N . ALA A 1 142 ? -16.594 -5.454 -1.200 1.00 86.81 142 A 1 +ATOM 1037 C CA . ALA A 1 142 ? -15.256 -5.499 -0.623 1.00 86.77 142 A 1 +ATOM 1038 C C . ALA A 1 142 ? -15.279 -5.199 0.886 1.00 86.59 142 A 1 +ATOM 1039 O O . ALA A 1 142 ? -14.657 -5.923 1.659 1.00 85.48 142 A 1 +ATOM 1040 C CB . ALA A 1 142 ? -14.350 -4.540 -1.392 1.00 87.07 142 A 1 +ATOM 1041 N N . ILE A 1 143 ? -16.057 -4.201 1.322 1.00 86.75 143 A 1 +ATOM 1042 C CA . ILE A 1 143 ? -16.271 -3.911 2.746 1.00 85.44 143 A 1 +ATOM 1043 C C . ILE A 1 143 ? -16.948 -5.095 3.441 1.00 84.85 143 A 1 +ATOM 1044 O O . ILE A 1 143 ? -16.546 -5.466 4.547 1.00 84.07 143 A 1 +ATOM 1045 C CB . ILE A 1 143 ? -17.084 -2.610 2.947 1.00 85.49 143 A 1 +ATOM 1046 C CG1 . ILE A 1 143 ? -16.319 -1.374 2.426 1.00 82.92 143 A 1 +ATOM 1047 C CG2 . ILE A 1 143 ? -17.419 -2.382 4.436 1.00 81.36 143 A 1 +ATOM 1048 C CD1 . ILE A 1 143 ? -17.200 -0.128 2.243 1.00 76.64 143 A 1 +ATOM 1049 N N . ALA A 1 144 ? -17.932 -5.719 2.808 1.00 85.20 144 A 1 +ATOM 1050 C CA . ALA A 1 144 ? -18.621 -6.889 3.368 1.00 83.01 144 A 1 +ATOM 1051 C C . ALA A 1 144 ? -17.667 -8.080 3.550 1.00 82.95 144 A 1 +ATOM 1052 O O . ALA A 1 144 ? -17.662 -8.695 4.613 1.00 82.45 144 A 1 +ATOM 1053 C CB . ALA A 1 144 ? -19.820 -7.255 2.486 1.00 82.74 144 A 1 +ATOM 1054 N N . ILE A 1 145 ? -16.836 -8.364 2.551 1.00 84.40 145 A 1 +ATOM 1055 C CA . ILE A 1 145 ? -15.816 -9.419 2.613 1.00 83.89 145 A 1 +ATOM 1056 C C . ILE A 1 145 ? -14.788 -9.097 3.703 1.00 83.10 145 A 1 +ATOM 1057 O O . ILE A 1 145 ? -14.488 -9.957 4.523 1.00 81.83 145 A 1 +ATOM 1058 C CB . ILE A 1 145 ? -15.158 -9.618 1.236 1.00 84.31 145 A 1 +ATOM 1059 C CG1 . ILE A 1 145 ? -16.182 -10.194 0.230 1.00 80.68 145 A 1 +ATOM 1060 C CG2 . ILE A 1 145 ? -13.940 -10.556 1.326 1.00 79.26 145 A 1 +ATOM 1061 C CD1 . ILE A 1 145 ? -15.726 -10.116 -1.238 1.00 72.28 145 A 1 +ATOM 1062 N N . ASP A 1 146 ? -14.305 -7.854 3.775 1.00 84.24 146 A 1 +ATOM 1063 C CA . ASP A 1 146 ? -13.368 -7.408 4.803 1.00 82.63 146 A 1 +ATOM 1064 C C . ASP A 1 146 ? -13.948 -7.596 6.218 1.00 81.34 146 A 1 +ATOM 1065 O O . ASP A 1 146 ? -13.299 -8.160 7.102 1.00 79.69 146 A 1 +ATOM 1066 C CB . ASP A 1 146 ? -12.997 -5.943 4.545 1.00 82.18 146 A 1 +ATOM 1067 C CG . ASP A 1 146 ? -12.113 -5.379 5.648 1.00 80.56 146 A 1 +ATOM 1068 O OD1 . ASP A 1 146 ? -10.923 -5.738 5.709 1.00 71.47 146 A 1 +ATOM 1069 O OD2 . ASP A 1 146 ? -12.622 -4.601 6.482 1.00 71.84 146 A 1 +ATOM 1070 N N . ARG A 1 147 ? -15.208 -7.208 6.438 1.00 83.05 147 A 1 +ATOM 1071 C CA . ARG A 1 147 ? -15.883 -7.409 7.723 1.00 80.67 147 A 1 +ATOM 1072 C C . ARG A 1 147 ? -16.128 -8.884 8.024 1.00 79.80 147 A 1 +ATOM 1073 O O . ARG A 1 147 ? -15.975 -9.282 9.177 1.00 77.83 147 A 1 +ATOM 1074 C CB . ARG A 1 147 ? -17.201 -6.631 7.776 1.00 78.60 147 A 1 +ATOM 1075 C CG . ARG A 1 147 ? -17.071 -5.102 7.799 1.00 72.86 147 A 1 +ATOM 1076 C CD . ARG A 1 147 ? -16.225 -4.528 8.940 1.00 69.44 147 A 1 +ATOM 1077 N NE . ARG A 1 147 ? -14.815 -4.414 8.569 1.00 65.12 147 A 1 +ATOM 1078 C CZ . ARG A 1 147 ? -13.828 -4.002 9.365 1.00 60.05 147 A 1 +ATOM 1079 N NH1 . ARG A 1 147 ? -14.032 -3.653 10.608 1.00 54.49 147 A 1 +ATOM 1080 N NH2 . ARG A 1 147 ? -12.612 -3.926 8.911 1.00 54.89 147 A 1 +ATOM 1081 N N . TYR A 1 148 ? -16.447 -9.689 7.013 1.00 78.96 148 A 1 +ATOM 1082 C CA . TYR A 1 148 ? -16.589 -11.133 7.149 1.00 77.60 148 A 1 +ATOM 1083 C C . TYR A 1 148 ? -15.280 -11.760 7.641 1.00 76.71 148 A 1 +ATOM 1084 O O . TYR A 1 148 ? -15.276 -12.452 8.659 1.00 75.85 148 A 1 +ATOM 1085 C CB . TYR A 1 148 ? -17.045 -11.723 5.809 1.00 77.54 148 A 1 +ATOM 1086 C CG . TYR A 1 148 ? -17.382 -13.192 5.872 1.00 77.00 148 A 1 +ATOM 1087 C CD1 . TYR A 1 148 ? -16.388 -14.172 5.690 1.00 69.79 148 A 1 +ATOM 1088 C CD2 . TYR A 1 148 ? -18.707 -13.597 6.136 1.00 70.18 148 A 1 +ATOM 1089 C CE1 . TYR A 1 148 ? -16.705 -15.538 5.787 1.00 68.01 148 A 1 +ATOM 1090 C CE2 . TYR A 1 148 ? -19.037 -14.961 6.228 1.00 67.14 148 A 1 +ATOM 1091 C CZ . TYR A 1 148 ? -18.031 -15.928 6.057 1.00 71.29 148 A 1 +ATOM 1092 O OH . TYR A 1 148 ? -18.336 -17.254 6.177 1.00 69.20 148 A 1 +ATOM 1093 N N . ILE A 1 149 ? -14.166 -11.449 6.988 1.00 79.22 149 A 1 +ATOM 1094 C CA . ILE A 1 149 ? -12.844 -11.938 7.389 1.00 78.54 149 A 1 +ATOM 1095 C C . ILE A 1 149 ? -12.491 -11.448 8.802 1.00 76.47 149 A 1 +ATOM 1096 O O . ILE A 1 149 ? -12.009 -12.229 9.614 1.00 74.12 149 A 1 +ATOM 1097 C CB . ILE A 1 149 ? -11.783 -11.544 6.347 1.00 79.76 149 A 1 +ATOM 1098 C CG1 . ILE A 1 149 ? -12.076 -12.219 4.988 1.00 77.09 149 A 1 +ATOM 1099 C CG2 . ILE A 1 149 ? -10.380 -11.958 6.824 1.00 76.20 149 A 1 +ATOM 1100 C CD1 . ILE A 1 149 ? -11.250 -11.655 3.817 1.00 71.09 149 A 1 +ATOM 1101 N N . THR A 1 150 ? -12.796 -10.187 9.143 1.00 76.99 150 A 1 +ATOM 1102 C CA . THR A 1 150 ? -12.546 -9.652 10.491 1.00 73.49 150 A 1 +ATOM 1103 C C . THR A 1 150 ? -13.292 -10.424 11.578 1.00 71.37 150 A 1 +ATOM 1104 O O . THR A 1 150 ? -12.785 -10.570 12.678 1.00 69.29 150 A 1 +ATOM 1105 C CB . THR A 1 150 ? -12.957 -8.184 10.604 1.00 72.22 150 A 1 +ATOM 1106 O OG1 . THR A 1 150 ? -12.478 -7.390 9.550 1.00 64.08 150 A 1 +ATOM 1107 C CG2 . THR A 1 150 ? -12.394 -7.525 11.861 1.00 62.72 150 A 1 +ATOM 1108 N N . ILE A 1 151 ? -14.504 -10.887 11.298 1.00 73.25 151 A 1 +ATOM 1109 C CA . ILE A 1 151 ? -15.342 -11.600 12.274 1.00 69.91 151 A 1 +ATOM 1110 C C . ILE A 1 151 ? -14.933 -13.073 12.390 1.00 67.99 151 A 1 +ATOM 1111 O O . ILE A 1 151 ? -14.831 -13.592 13.491 1.00 64.81 151 A 1 +ATOM 1112 C CB . ILE A 1 151 ? -16.841 -11.428 11.932 1.00 68.18 151 A 1 +ATOM 1113 C CG1 . ILE A 1 151 ? -17.261 -9.955 12.135 1.00 64.19 151 A 1 +ATOM 1114 C CG2 . ILE A 1 151 ? -17.732 -12.347 12.796 1.00 63.01 151 A 1 +ATOM 1115 C CD1 . ILE A 1 151 ? -18.621 -9.614 11.512 1.00 58.11 151 A 1 +ATOM 1116 N N . PHE A 1 152 ? -14.707 -13.742 11.254 1.00 72.10 152 A 1 +ATOM 1117 C CA . PHE A 1 152 ? -14.432 -15.179 11.235 1.00 70.08 152 A 1 +ATOM 1118 C C . PHE A 1 152 ? -12.970 -15.557 11.400 1.00 69.17 152 A 1 +ATOM 1119 O O . PHE A 1 152 ? -12.665 -16.625 11.922 1.00 65.82 152 A 1 +ATOM 1120 C CB . PHE A 1 152 ? -14.997 -15.801 9.946 1.00 67.74 152 A 1 +ATOM 1121 C CG . PHE A 1 152 ? -16.498 -15.850 10.000 1.00 65.45 152 A 1 +ATOM 1122 C CD1 . PHE A 1 152 ? -17.099 -16.709 10.925 1.00 60.66 152 A 1 +ATOM 1123 C CD2 . PHE A 1 152 ? -17.261 -14.938 9.267 1.00 60.21 152 A 1 +ATOM 1124 C CE1 . PHE A 1 152 ? -18.474 -16.614 11.155 1.00 56.86 152 A 1 +ATOM 1125 C CE2 . PHE A 1 152 ? -18.648 -14.844 9.497 1.00 55.35 152 A 1 +ATOM 1126 C CZ . PHE A 1 152 ? -19.240 -15.663 10.457 1.00 56.30 152 A 1 +ATOM 1127 N N . TYR A 1 153 ? -12.075 -14.681 10.950 1.00 70.93 153 A 1 +ATOM 1128 C CA . TYR A 1 153 ? -10.630 -14.896 10.961 1.00 70.25 153 A 1 +ATOM 1129 C C . TYR A 1 153 ? -9.925 -13.744 11.680 1.00 68.61 153 A 1 +ATOM 1130 O O . TYR A 1 153 ? -8.897 -13.269 11.217 1.00 65.31 153 A 1 +ATOM 1131 C CB . TYR A 1 153 ? -10.133 -15.102 9.525 1.00 69.33 153 A 1 +ATOM 1132 C CG . TYR A 1 153 ? -10.760 -16.267 8.804 1.00 67.27 153 A 1 +ATOM 1133 C CD1 . TYR A 1 153 ? -10.241 -17.567 8.961 1.00 61.74 153 A 1 +ATOM 1134 C CD2 . TYR A 1 153 ? -11.878 -16.070 7.960 1.00 61.74 153 A 1 +ATOM 1135 C CE1 . TYR A 1 153 ? -10.813 -18.657 8.272 1.00 58.20 153 A 1 +ATOM 1136 C CE2 . TYR A 1 153 ? -12.462 -17.150 7.278 1.00 58.19 153 A 1 +ATOM 1137 C CZ . TYR A 1 153 ? -11.919 -18.434 7.439 1.00 59.77 153 A 1 +ATOM 1138 O OH . TYR A 1 153 ? -12.491 -19.507 6.764 1.00 57.39 153 A 1 +ATOM 1139 N N . ALA A 1 154 ? -10.475 -13.290 12.808 1.00 65.65 154 A 1 +ATOM 1140 C CA . ALA A 1 154 ? -10.007 -12.116 13.538 1.00 63.48 154 A 1 +ATOM 1141 C C . ALA A 1 154 ? -8.485 -12.118 13.785 1.00 63.43 154 A 1 +ATOM 1142 O O . ALA A 1 154 ? -7.813 -11.119 13.548 1.00 59.56 154 A 1 +ATOM 1143 C CB . ALA A 1 154 ? -10.771 -12.045 14.875 1.00 58.90 154 A 1 +ATOM 1144 N N . LEU A 1 155 ? -7.947 -13.281 14.181 1.00 61.53 155 A 1 +ATOM 1145 C CA . LEU A 1 155 ? -6.524 -13.487 14.479 1.00 58.95 155 A 1 +ATOM 1146 C C . LEU A 1 155 ? -5.657 -13.456 13.209 1.00 60.66 155 A 1 +ATOM 1147 O O . LEU A 1 155 ? -4.522 -12.988 13.225 1.00 56.10 155 A 1 +ATOM 1148 C CB . LEU A 1 155 ? -6.392 -14.844 15.200 1.00 52.87 155 A 1 +ATOM 1149 C CG . LEU A 1 155 ? -7.211 -14.957 16.505 1.00 47.25 155 A 1 +ATOM 1150 C CD1 . LEU A 1 155 ? -7.244 -16.397 16.996 1.00 42.01 155 A 1 +ATOM 1151 C CD2 . LEU A 1 155 ? -6.657 -14.085 17.620 1.00 42.43 155 A 1 +ATOM 1152 N N . ARG A 1 156 ? -6.205 -13.915 12.074 1.00 66.46 156 A 1 +ATOM 1153 C CA . ARG A 1 156 ? -5.507 -13.981 10.782 1.00 67.84 156 A 1 +ATOM 1154 C C . ARG A 1 156 ? -5.789 -12.781 9.876 1.00 69.44 156 A 1 +ATOM 1155 O O . ARG A 1 156 ? -5.279 -12.722 8.769 1.00 65.65 156 A 1 +ATOM 1156 C CB . ARG A 1 156 ? -5.862 -15.287 10.058 1.00 64.75 156 A 1 +ATOM 1157 C CG . ARG A 1 156 ? -5.517 -16.538 10.882 1.00 58.28 156 A 1 +ATOM 1158 C CD . ARG A 1 156 ? -5.732 -17.788 10.027 1.00 54.25 156 A 1 +ATOM 1159 N NE . ARG A 1 156 ? -5.533 -19.016 10.824 1.00 47.17 156 A 1 +ATOM 1160 C CZ . ARG A 1 156 ? -5.514 -20.251 10.345 1.00 41.73 156 A 1 +ATOM 1161 N NH1 . ARG A 1 156 ? -5.680 -20.507 9.085 1.00 38.05 156 A 1 +ATOM 1162 N NH2 . ARG A 1 156 ? -5.315 -21.246 11.144 1.00 37.30 156 A 1 +ATOM 1163 N N . TYR A 1 157 ? -6.604 -11.850 10.333 1.00 69.49 157 A 1 +ATOM 1164 C CA . TYR A 1 157 ? -7.107 -10.744 9.516 1.00 69.29 157 A 1 +ATOM 1165 C C . TYR A 1 157 ? -5.987 -9.972 8.822 1.00 69.47 157 A 1 +ATOM 1166 O O . TYR A 1 157 ? -6.014 -9.806 7.598 1.00 66.39 157 A 1 +ATOM 1167 C CB . TYR A 1 157 ? -7.951 -9.813 10.391 1.00 68.16 157 A 1 +ATOM 1168 C CG . TYR A 1 157 ? -8.378 -8.555 9.667 1.00 68.42 157 A 1 +ATOM 1169 C CD1 . TYR A 1 157 ? -7.695 -7.338 9.878 1.00 61.02 157 A 1 +ATOM 1170 C CD2 . TYR A 1 157 ? -9.424 -8.610 8.721 1.00 62.32 157 A 1 +ATOM 1171 C CE1 . TYR A 1 157 ? -8.062 -6.194 9.167 1.00 60.12 157 A 1 +ATOM 1172 C CE2 . TYR A 1 157 ? -9.788 -7.460 8.009 1.00 60.89 157 A 1 +ATOM 1173 C CZ . TYR A 1 157 ? -9.105 -6.250 8.232 1.00 65.87 157 A 1 +ATOM 1174 O OH . TYR A 1 157 ? -9.454 -5.121 7.532 1.00 63.99 157 A 1 +ATOM 1175 N N . HIS A 1 158 ? -4.962 -9.575 9.566 1.00 70.02 158 A 1 +ATOM 1176 C CA . HIS A 1 158 ? -3.838 -8.793 9.037 1.00 69.35 158 A 1 +ATOM 1177 C C . HIS A 1 158 ? -2.995 -9.552 8.000 1.00 70.28 158 A 1 +ATOM 1178 O O . HIS A 1 158 ? -2.383 -8.928 7.137 1.00 66.89 158 A 1 +ATOM 1179 C CB . HIS A 1 158 ? -2.971 -8.306 10.198 1.00 65.94 158 A 1 +ATOM 1180 C CG . HIS A 1 158 ? -3.662 -7.250 11.011 1.00 62.70 158 A 1 +ATOM 1181 N ND1 . HIS A 1 158 ? -3.997 -5.978 10.570 1.00 54.69 158 A 1 +ATOM 1182 C CD2 . HIS A 1 158 ? -4.120 -7.339 12.304 1.00 55.06 158 A 1 +ATOM 1183 C CE1 . HIS A 1 158 ? -4.627 -5.345 11.572 1.00 52.31 158 A 1 +ATOM 1184 N NE2 . HIS A 1 158 ? -4.723 -6.139 12.642 1.00 52.99 158 A 1 +ATOM 1185 N N . ASN A 1 159 ? -3.004 -10.890 8.031 1.00 73.71 159 A 1 +ATOM 1186 C CA . ASN A 1 159 ? -2.286 -11.716 7.065 1.00 74.80 159 A 1 +ATOM 1187 C C . ASN A 1 159 ? -3.107 -11.969 5.793 1.00 76.87 159 A 1 +ATOM 1188 O O . ASN A 1 159 ? -2.558 -12.075 4.697 1.00 73.64 159 A 1 +ATOM 1189 C CB . ASN A 1 159 ? -1.899 -13.031 7.747 1.00 71.30 159 A 1 +ATOM 1190 C CG . ASN A 1 159 ? -0.967 -12.782 8.919 1.00 63.79 159 A 1 +ATOM 1191 O OD1 . ASN A 1 159 ? -0.104 -11.936 8.893 1.00 55.42 159 A 1 +ATOM 1192 N ND2 . ASN A 1 159 ? -1.136 -13.521 9.990 1.00 55.26 159 A 1 +ATOM 1193 N N . ILE A 1 160 ? -4.438 -12.058 5.935 1.00 75.86 160 A 1 +ATOM 1194 C CA . ILE A 1 160 ? -5.351 -12.278 4.811 1.00 77.79 160 A 1 +ATOM 1195 C C . ILE A 1 160 ? -5.608 -10.968 4.067 1.00 78.98 160 A 1 +ATOM 1196 O O . ILE A 1 160 ? -5.461 -10.913 2.846 1.00 76.38 160 A 1 +ATOM 1197 C CB . ILE A 1 160 ? -6.660 -12.949 5.298 1.00 75.56 160 A 1 +ATOM 1198 C CG1 . ILE A 1 160 ? -6.364 -14.326 5.931 1.00 68.83 160 A 1 +ATOM 1199 C CG2 . ILE A 1 160 ? -7.635 -13.114 4.115 1.00 67.31 160 A 1 +ATOM 1200 C CD1 . ILE A 1 160 ? -7.564 -14.930 6.676 1.00 62.16 160 A 1 +ATOM 1201 N N . VAL A 1 161 ? -5.960 -9.916 4.807 1.00 77.59 161 A 1 +ATOM 1202 C CA . VAL A 1 161 ? -6.311 -8.596 4.273 1.00 77.97 161 A 1 +ATOM 1203 C C . VAL A 1 161 ? -5.163 -7.620 4.510 1.00 76.76 161 A 1 +ATOM 1204 O O . VAL A 1 161 ? -5.156 -6.823 5.440 1.00 73.99 161 A 1 +ATOM 1205 C CB . VAL A 1 161 ? -7.652 -8.076 4.821 1.00 76.66 161 A 1 +ATOM 1206 C CG1 . VAL A 1 161 ? -8.093 -6.846 4.025 1.00 68.69 161 A 1 +ATOM 1207 C CG2 . VAL A 1 161 ? -8.759 -9.121 4.694 1.00 68.80 161 A 1 +ATOM 1208 N N . THR A 1 162 ? -4.175 -7.684 3.632 1.00 80.22 162 A 1 +ATOM 1209 C CA . THR A 1 162 ? -3.064 -6.731 3.628 1.00 80.73 162 A 1 +ATOM 1210 C C . THR A 1 162 ? -3.436 -5.473 2.841 1.00 82.87 162 A 1 +ATOM 1211 O O . THR A 1 162 ? -4.244 -5.520 1.906 1.00 80.59 162 A 1 +ATOM 1212 C CB . THR A 1 162 ? -1.774 -7.350 3.069 1.00 75.84 162 A 1 +ATOM 1213 O OG1 . THR A 1 162 ? -1.907 -7.670 1.709 1.00 67.48 162 A 1 +ATOM 1214 C CG2 . THR A 1 162 ? -1.363 -8.614 3.817 1.00 64.88 162 A 1 +ATOM 1215 N N . ILE A 1 163 ? -2.792 -4.347 3.164 1.00 79.46 163 A 1 +ATOM 1216 C CA . ILE A 1 163 ? -2.950 -3.089 2.411 1.00 80.52 163 A 1 +ATOM 1217 C C . ILE A 1 163 ? -2.706 -3.305 0.913 1.00 82.66 163 A 1 +ATOM 1218 O O . ILE A 1 163 ? -3.458 -2.813 0.076 1.00 81.20 163 A 1 +ATOM 1219 C CB . ILE A 1 163 ? -1.995 -2.008 2.981 1.00 77.84 163 A 1 +ATOM 1220 C CG1 . ILE A 1 163 ? -2.435 -1.621 4.408 1.00 70.85 163 A 1 +ATOM 1221 C CG2 . ILE A 1 163 ? -1.954 -0.765 2.072 1.00 67.10 163 A 1 +ATOM 1222 C CD1 . ILE A 1 163 ? -1.466 -0.682 5.134 1.00 61.16 163 A 1 +ATOM 1223 N N . ARG A 1 164 ? -1.704 -4.088 0.565 1.00 81.17 164 A 1 +ATOM 1224 C CA . ARG A 1 164 ? -1.387 -4.396 -0.841 1.00 82.90 164 A 1 +ATOM 1225 C C . ARG A 1 164 ? -2.521 -5.140 -1.539 1.00 84.63 164 A 1 +ATOM 1226 O O . ARG A 1 164 ? -2.869 -4.795 -2.662 1.00 82.87 164 A 1 +ATOM 1227 C CB . ARG A 1 164 ? -0.071 -5.191 -0.886 1.00 81.53 164 A 1 +ATOM 1228 C CG . ARG A 1 164 ? 0.406 -5.414 -2.325 1.00 71.30 164 A 1 +ATOM 1229 C CD . ARG A 1 164 ? 1.717 -6.196 -2.321 1.00 65.85 164 A 1 +ATOM 1230 N NE . ARG A 1 164 ? 2.202 -6.451 -3.696 1.00 55.84 164 A 1 +ATOM 1231 C CZ . ARG A 1 164 ? 3.202 -7.260 -4.006 1.00 47.39 164 A 1 +ATOM 1232 N NH1 . ARG A 1 164 ? 3.839 -7.942 -3.106 1.00 41.96 164 A 1 +ATOM 1233 N NH2 . ARG A 1 164 ? 3.580 -7.395 -5.237 1.00 41.62 164 A 1 +ATOM 1234 N N . ARG A 1 165 ? -3.102 -6.149 -0.900 1.00 83.16 165 A 1 +ATOM 1235 C CA . ARG A 1 165 ? -4.245 -6.883 -1.455 1.00 85.16 165 A 1 +ATOM 1236 C C . ARG A 1 165 ? -5.484 -5.987 -1.565 1.00 86.12 165 A 1 +ATOM 1237 O O . ARG A 1 165 ? -6.152 -6.042 -2.585 1.00 85.40 165 A 1 +ATOM 1238 C CB . ARG A 1 165 ? -4.554 -8.135 -0.612 1.00 83.70 165 A 1 +ATOM 1239 C CG . ARG A 1 165 ? -3.529 -9.265 -0.825 1.00 80.06 165 A 1 +ATOM 1240 C CD . ARG A 1 165 ? -3.881 -10.464 0.055 1.00 77.37 165 A 1 +ATOM 1241 N NE . ARG A 1 165 ? -2.915 -11.567 -0.066 1.00 71.12 165 A 1 +ATOM 1242 C CZ . ARG A 1 165 ? -2.864 -12.641 0.712 1.00 64.87 165 A 1 +ATOM 1243 N NH1 . ARG A 1 165 ? -3.715 -12.836 1.676 1.00 60.27 165 A 1 +ATOM 1244 N NH2 . ARG A 1 165 ? -1.952 -13.554 0.538 1.00 58.82 165 A 1 +ATOM 1245 N N . ALA A 1 166 ? -5.732 -5.139 -0.571 1.00 84.54 166 A 1 +ATOM 1246 C CA . ALA A 1 166 ? -6.832 -4.183 -0.629 1.00 85.17 166 A 1 +ATOM 1247 C C . ALA A 1 166 ? -6.686 -3.207 -1.807 1.00 86.50 166 A 1 +ATOM 1248 O O . ALA A 1 166 ? -7.641 -3.013 -2.561 1.00 86.38 166 A 1 +ATOM 1249 C CB . ALA A 1 166 ? -6.904 -3.434 0.715 1.00 84.38 166 A 1 +ATOM 1250 N N . LEU A 1 167 ? -5.493 -2.662 -2.036 1.00 85.90 167 A 1 +ATOM 1251 C CA . LEU A 1 167 ? -5.219 -1.785 -3.176 1.00 86.53 167 A 1 +ATOM 1252 C C . LEU A 1 167 ? -5.358 -2.514 -4.525 1.00 87.80 167 A 1 +ATOM 1253 O O . LEU A 1 167 ? -5.881 -1.936 -5.471 1.00 87.91 167 A 1 +ATOM 1254 C CB . LEU A 1 167 ? -3.809 -1.175 -3.038 1.00 86.18 167 A 1 +ATOM 1255 C CG . LEU A 1 167 ? -3.664 -0.156 -1.897 1.00 81.49 167 A 1 +ATOM 1256 C CD1 . LEU A 1 167 ? -2.207 0.260 -1.770 1.00 72.65 167 A 1 +ATOM 1257 C CD2 . LEU A 1 167 ? -4.503 1.100 -2.124 1.00 73.07 167 A 1 +ATOM 1258 N N . LEU A 1 168 ? -4.939 -3.776 -4.606 1.00 86.90 168 A 1 +ATOM 1259 C CA . LEU A 1 168 ? -5.144 -4.599 -5.801 1.00 87.64 168 A 1 +ATOM 1260 C C . LEU A 1 168 ? -6.637 -4.844 -6.076 1.00 88.59 168 A 1 +ATOM 1261 O O . LEU A 1 168 ? -7.060 -4.758 -7.220 1.00 88.65 168 A 1 +ATOM 1262 C CB . LEU A 1 168 ? -4.412 -5.944 -5.654 1.00 87.98 168 A 1 +ATOM 1263 C CG . LEU A 1 168 ? -2.896 -5.876 -5.942 1.00 78.04 168 A 1 +ATOM 1264 C CD1 . LEU A 1 168 ? -2.223 -7.168 -5.481 1.00 68.92 168 A 1 +ATOM 1265 C CD2 . LEU A 1 168 ? -2.623 -5.704 -7.441 1.00 70.05 168 A 1 +ATOM 1266 N N . VAL A 1 169 ? -7.415 -5.104 -5.037 1.00 87.65 169 A 1 +ATOM 1267 C CA . VAL A 1 169 ? -8.873 -5.260 -5.163 1.00 87.73 169 A 1 +ATOM 1268 C C . VAL A 1 169 ? -9.508 -3.957 -5.650 1.00 88.47 169 A 1 +ATOM 1269 O O . VAL A 1 169 ? -10.304 -3.995 -6.583 1.00 88.21 169 A 1 +ATOM 1270 C CB . VAL A 1 169 ? -9.505 -5.743 -3.844 1.00 86.98 169 A 1 +ATOM 1271 C CG1 . VAL A 1 169 ? -11.028 -5.683 -3.858 1.00 77.62 169 A 1 +ATOM 1272 C CG2 . VAL A 1 169 ? -9.113 -7.204 -3.569 1.00 77.18 169 A 1 +ATOM 1273 N N . ILE A 1 170 ? -9.121 -2.813 -5.096 1.00 87.76 170 A 1 +ATOM 1274 C CA . ILE A 1 170 ? -9.621 -1.502 -5.535 1.00 87.86 170 A 1 +ATOM 1275 C C . ILE A 1 170 ? -9.254 -1.244 -7.006 1.00 87.93 170 A 1 +ATOM 1276 O O . ILE A 1 170 ? -10.126 -0.871 -7.789 1.00 87.82 170 A 1 +ATOM 1277 C CB . ILE A 1 170 ? -9.094 -0.380 -4.608 1.00 88.02 170 A 1 +ATOM 1278 C CG1 . ILE A 1 170 ? -9.742 -0.506 -3.209 1.00 83.85 170 A 1 +ATOM 1279 C CG2 . ILE A 1 170 ? -9.392 1.018 -5.192 1.00 81.77 170 A 1 +ATOM 1280 C CD1 . ILE A 1 170 ? -9.047 0.328 -2.133 1.00 74.30 170 A 1 +ATOM 1281 N N . ALA A 1 171 ? -8.004 -1.499 -7.398 1.00 88.86 171 A 1 +ATOM 1282 C CA . ALA A 1 171 ? -7.585 -1.355 -8.784 1.00 88.20 171 A 1 +ATOM 1283 C C . ALA A 1 171 ? -8.391 -2.273 -9.728 1.00 88.26 171 A 1 +ATOM 1284 O O . ALA A 1 171 ? -8.816 -1.838 -10.794 1.00 87.25 171 A 1 +ATOM 1285 C CB . ALA A 1 171 ? -6.079 -1.632 -8.876 1.00 88.34 171 A 1 +ATOM 1286 N N . GLY A 1 172 ? -8.648 -3.511 -9.306 1.00 89.77 172 A 1 +ATOM 1287 C CA . GLY A 1 172 ? -9.496 -4.446 -10.037 1.00 88.85 172 A 1 +ATOM 1288 C C . GLY A 1 172 ? -10.936 -3.949 -10.194 1.00 88.78 172 A 1 +ATOM 1289 O O . GLY A 1 172 ? -11.462 -3.961 -11.302 1.00 87.42 172 A 1 +ATOM 1290 N N . ILE A 1 173 ? -11.531 -3.449 -9.115 1.00 88.16 173 A 1 +ATOM 1291 C CA . ILE A 1 173 ? -12.879 -2.863 -9.121 1.00 87.43 173 A 1 +ATOM 1292 C C . ILE A 1 173 ? -12.961 -1.733 -10.146 1.00 87.05 173 A 1 +ATOM 1293 O O . ILE A 1 173 ? -13.796 -1.776 -11.042 1.00 85.94 173 A 1 +ATOM 1294 C CB . ILE A 1 173 ? -13.286 -2.384 -7.707 1.00 87.07 173 A 1 +ATOM 1295 C CG1 . ILE A 1 173 ? -13.553 -3.596 -6.787 1.00 83.40 173 A 1 +ATOM 1296 C CG2 . ILE A 1 173 ? -14.545 -1.476 -7.749 1.00 82.04 173 A 1 +ATOM 1297 C CD1 . ILE A 1 173 ? -13.653 -3.231 -5.293 1.00 76.90 173 A 1 +ATOM 1298 N N . TRP A 1 174 ? -12.070 -0.740 -10.043 1.00 88.69 174 A 1 +ATOM 1299 C CA . TRP A 1 174 ? -12.092 0.422 -10.927 1.00 88.13 174 A 1 +ATOM 1300 C C . TRP A 1 174 ? -11.802 0.060 -12.385 1.00 87.47 174 A 1 +ATOM 1301 O O . TRP A 1 174 ? -12.431 0.611 -13.283 1.00 84.94 174 A 1 +ATOM 1302 C CB . TRP A 1 174 ? -11.136 1.488 -10.398 1.00 87.37 174 A 1 +ATOM 1303 C CG . TRP A 1 174 ? -11.743 2.265 -9.271 1.00 88.27 174 A 1 +ATOM 1304 C CD1 . TRP A 1 174 ? -11.545 2.054 -7.952 1.00 81.97 174 A 1 +ATOM 1305 C CD2 . TRP A 1 174 ? -12.750 3.315 -9.374 1.00 86.10 174 A 1 +ATOM 1306 N NE1 . TRP A 1 174 ? -12.367 2.907 -7.224 1.00 82.66 174 A 1 +ATOM 1307 C CE2 . TRP A 1 174 ? -13.129 3.687 -8.062 1.00 84.22 174 A 1 +ATOM 1308 C CE3 . TRP A 1 174 ? -13.383 3.966 -10.456 1.00 84.62 174 A 1 +ATOM 1309 C CZ2 . TRP A 1 174 ? -14.125 4.654 -7.822 1.00 84.21 174 A 1 +ATOM 1310 C CZ3 . TRP A 1 174 ? -14.374 4.942 -10.212 1.00 81.10 174 A 1 +ATOM 1311 C CH2 . TRP A 1 174 ? -14.742 5.272 -8.912 1.00 81.43 174 A 1 +ATOM 1312 N N . THR A 1 175 ? -10.923 -0.909 -12.627 1.00 87.83 175 A 1 +ATOM 1313 C CA . THR A 1 175 ? -10.663 -1.417 -13.983 1.00 86.47 175 A 1 +ATOM 1314 C C . THR A 1 175 ? -11.911 -2.065 -14.576 1.00 85.87 175 A 1 +ATOM 1315 O O . THR A 1 175 ? -12.328 -1.709 -15.673 1.00 85.29 175 A 1 +ATOM 1316 C CB . THR A 1 175 ? -9.490 -2.404 -13.995 1.00 86.19 175 A 1 +ATOM 1317 O OG1 . THR A 1 175 ? -8.350 -1.823 -13.409 1.00 76.95 175 A 1 +ATOM 1318 C CG2 . THR A 1 175 ? -9.095 -2.808 -15.412 1.00 73.84 175 A 1 +ATOM 1319 N N . CYS A 1 176 ? -12.564 -2.954 -13.822 1.00 88.09 176 A 1 +ATOM 1320 C CA . CYS A 1 176 ? -13.796 -3.601 -14.259 1.00 85.78 176 A 1 +ATOM 1321 C C . CYS A 1 176 ? -14.933 -2.593 -14.494 1.00 84.95 176 A 1 +ATOM 1322 O O . CYS A 1 176 ? -15.621 -2.683 -15.504 1.00 82.94 176 A 1 +ATOM 1323 C CB . CYS A 1 176 ? -14.223 -4.652 -13.228 1.00 83.55 176 A 1 +ATOM 1324 S SG . CYS A 1 176 ? -13.110 -6.096 -13.291 1.00 68.29 176 A 1 +ATOM 1325 N N . CYS A 1 177 ? -15.102 -1.620 -13.598 1.00 86.15 177 A 1 +ATOM 1326 C CA . CYS A 1 177 ? -16.121 -0.583 -13.737 1.00 84.59 177 A 1 +ATOM 1327 C C . CYS A 1 177 ? -15.856 0.309 -14.957 1.00 83.79 177 A 1 +ATOM 1328 O O . CYS A 1 177 ? -16.780 0.603 -15.705 1.00 82.45 177 A 1 +ATOM 1329 C CB . CYS A 1 177 ? -16.192 0.246 -12.451 1.00 84.10 177 A 1 +ATOM 1330 S SG . CYS A 1 177 ? -16.756 -0.823 -11.087 1.00 74.41 177 A 1 +ATOM 1331 N N . THR A 1 178 ? -14.601 0.672 -15.190 1.00 84.20 178 A 1 +ATOM 1332 C CA . THR A 1 178 ? -14.217 1.498 -16.338 1.00 82.55 178 A 1 +ATOM 1333 C C . THR A 1 178 ? -14.429 0.756 -17.660 1.00 81.97 178 A 1 +ATOM 1334 O O . THR A 1 178 ? -15.032 1.298 -18.575 1.00 81.71 178 A 1 +ATOM 1335 C CB . THR A 1 178 ? -12.757 1.955 -16.238 1.00 82.02 178 A 1 +ATOM 1336 O OG1 . THR A 1 178 ? -12.499 2.564 -14.998 1.00 73.44 178 A 1 +ATOM 1337 C CG2 . THR A 1 178 ? -12.447 2.998 -17.297 1.00 71.06 178 A 1 +ATOM 1338 N N . VAL A 1 179 ? -14.011 -0.512 -17.735 1.00 82.06 179 A 1 +ATOM 1339 C CA . VAL A 1 179 ? -14.264 -1.359 -18.916 1.00 81.43 179 A 1 +ATOM 1340 C C . VAL A 1 179 ? -15.764 -1.522 -19.154 1.00 80.49 179 A 1 +ATOM 1341 O O . VAL A 1 179 ? -16.219 -1.394 -20.292 1.00 79.97 179 A 1 +ATOM 1342 C CB . VAL A 1 179 ? -13.569 -2.725 -18.764 1.00 81.82 179 A 1 +ATOM 1343 C CG1 . VAL A 1 179 ? -13.968 -3.714 -19.872 1.00 75.00 179 A 1 +ATOM 1344 C CG2 . VAL A 1 179 ? -12.049 -2.564 -18.833 1.00 74.49 179 A 1 +ATOM 1345 N N . SER A 1 180 ? -16.549 -1.748 -18.108 1.00 82.60 180 A 1 +ATOM 1346 C CA . SER A 1 180 ? -18.004 -1.855 -18.217 1.00 79.80 180 A 1 +ATOM 1347 C C . SER A 1 180 ? -18.638 -0.555 -18.704 1.00 79.15 180 A 1 +ATOM 1348 O O . SER A 1 180 ? -19.529 -0.592 -19.557 1.00 77.10 180 A 1 +ATOM 1349 C CB . SER A 1 180 ? -18.626 -2.256 -16.871 1.00 78.31 180 A 1 +ATOM 1350 O OG . SER A 1 180 ? -18.089 -3.484 -16.414 1.00 67.99 180 A 1 +ATOM 1351 N N . GLY A 1 181 ? -18.156 0.596 -18.228 1.00 80.00 181 A 1 +ATOM 1352 C CA . GLY A 1 181 ? -18.595 1.912 -18.695 1.00 78.05 181 A 1 +ATOM 1353 C C . GLY A 1 181 ? -18.267 2.155 -20.171 1.00 78.04 181 A 1 +ATOM 1354 O O . GLY A 1 181 ? -19.129 2.606 -20.924 1.00 77.45 181 A 1 +ATOM 1355 N N . ILE A 1 182 ? -17.064 1.792 -20.614 1.00 79.13 182 A 1 +ATOM 1356 C CA . ILE A 1 182 ? -16.673 1.892 -22.030 1.00 78.22 182 A 1 +ATOM 1357 C C . ILE A 1 182 ? -17.572 0.997 -22.894 1.00 77.80 182 A 1 +ATOM 1358 O O . ILE A 1 182 ? -18.105 1.452 -23.899 1.00 77.70 182 A 1 +ATOM 1359 C CB . ILE A 1 182 ? -15.180 1.542 -22.214 1.00 78.81 182 A 1 +ATOM 1360 C CG1 . ILE A 1 182 ? -14.282 2.607 -21.545 1.00 74.32 182 A 1 +ATOM 1361 C CG2 . ILE A 1 182 ? -14.815 1.432 -23.702 1.00 71.50 182 A 1 +ATOM 1362 C CD1 . ILE A 1 182 ? -12.826 2.160 -21.373 1.00 64.39 182 A 1 +ATOM 1363 N N . LEU A 1 183 ? -17.783 -0.257 -22.480 1.00 78.94 183 A 1 +ATOM 1364 C CA . LEU A 1 183 ? -18.683 -1.171 -23.177 1.00 78.05 183 A 1 +ATOM 1365 C C . LEU A 1 183 ? -20.106 -0.613 -23.238 1.00 77.49 183 A 1 +ATOM 1366 O O . LEU A 1 183 ? -20.752 -0.723 -24.279 1.00 76.54 183 A 1 +ATOM 1367 C CB . LEU A 1 183 ? -18.670 -2.543 -22.485 1.00 77.65 183 A 1 +ATOM 1368 C CG . LEU A 1 183 ? -17.373 -3.355 -22.687 1.00 73.14 183 A 1 +ATOM 1369 C CD1 . LEU A 1 183 ? -17.426 -4.608 -21.818 1.00 66.53 183 A 1 +ATOM 1370 C CD2 . LEU A 1 183 ? -17.182 -3.791 -24.136 1.00 67.19 183 A 1 +ATOM 1371 N N . PHE A 1 184 ? -20.582 0.035 -22.178 1.00 77.83 184 A 1 +ATOM 1372 C CA . PHE A 1 184 ? -21.887 0.681 -22.160 1.00 76.54 184 A 1 +ATOM 1373 C C . PHE A 1 184 ? -21.989 1.811 -23.194 1.00 76.25 184 A 1 +ATOM 1374 O O . PHE A 1 184 ? -22.984 1.872 -23.908 1.00 75.04 184 A 1 +ATOM 1375 C CB . PHE A 1 184 ? -22.201 1.177 -20.748 1.00 74.34 184 A 1 +ATOM 1376 C CG . PHE A 1 184 ? -23.615 1.677 -20.636 1.00 68.02 184 A 1 +ATOM 1377 C CD1 . PHE A 1 184 ? -23.910 3.033 -20.859 1.00 60.82 184 A 1 +ATOM 1378 C CD2 . PHE A 1 184 ? -24.659 0.759 -20.425 1.00 59.43 184 A 1 +ATOM 1379 C CE1 . PHE A 1 184 ? -25.237 3.461 -20.902 1.00 55.72 184 A 1 +ATOM 1380 C CE2 . PHE A 1 184 ? -25.997 1.190 -20.467 1.00 55.11 184 A 1 +ATOM 1381 C CZ . PHE A 1 184 ? -26.281 2.541 -20.718 1.00 55.65 184 A 1 +ATOM 1382 N N . ILE A 1 185 ? -20.959 2.649 -23.346 1.00 75.86 185 A 1 +ATOM 1383 C CA . ILE A 1 185 ? -20.938 3.714 -24.361 1.00 74.54 185 A 1 +ATOM 1384 C C . ILE A 1 185 ? -20.952 3.119 -25.778 1.00 74.11 185 A 1 +ATOM 1385 O O . ILE A 1 185 ? -21.738 3.541 -26.615 1.00 73.33 185 A 1 +ATOM 1386 C CB . ILE A 1 185 ? -19.721 4.647 -24.154 1.00 73.80 185 A 1 +ATOM 1387 C CG1 . ILE A 1 185 ? -19.843 5.411 -22.825 1.00 69.65 185 A 1 +ATOM 1388 C CG2 . ILE A 1 185 ? -19.605 5.661 -25.317 1.00 67.97 185 A 1 +ATOM 1389 C CD1 . ILE A 1 185 ? -18.526 6.062 -22.382 1.00 62.32 185 A 1 +ATOM 1390 N N . ILE A 1 186 ? -20.106 2.116 -26.032 1.00 76.17 186 A 1 +ATOM 1391 C CA . ILE A 1 186 ? -19.980 1.488 -27.357 1.00 75.01 186 A 1 +ATOM 1392 C C . ILE A 1 186 ? -21.274 0.795 -27.763 1.00 73.57 186 A 1 +ATOM 1393 O O . ILE A 1 186 ? -21.712 0.882 -28.911 1.00 71.32 186 A 1 +ATOM 1394 C CB . ILE A 1 186 ? -18.798 0.497 -27.363 1.00 75.36 186 A 1 +ATOM 1395 C CG1 . ILE A 1 186 ? -17.461 1.219 -27.103 1.00 71.19 186 A 1 +ATOM 1396 C CG2 . ILE A 1 186 ? -18.708 -0.254 -28.710 1.00 69.62 186 A 1 +ATOM 1397 C CD1 . ILE A 1 186 ? -16.371 0.258 -26.608 1.00 64.48 186 A 1 +ATOM 1398 N N . TYR A 1 187 ? -21.905 0.105 -26.826 1.00 75.89 187 A 1 +ATOM 1399 C CA . TYR A 1 187 ? -23.127 -0.668 -27.036 1.00 74.27 187 A 1 +ATOM 1400 C C . TYR A 1 187 ? -24.371 0.019 -26.469 1.00 72.91 187 A 1 +ATOM 1401 O O . TYR A 1 187 ? -25.352 -0.655 -26.160 1.00 68.57 187 A 1 +ATOM 1402 C CB . TYR A 1 187 ? -22.941 -2.084 -26.477 1.00 72.75 187 A 1 +ATOM 1403 C CG . TYR A 1 187 ? -21.815 -2.861 -27.117 1.00 69.75 187 A 1 +ATOM 1404 C CD1 . TYR A 1 187 ? -21.962 -3.395 -28.404 1.00 64.13 187 A 1 +ATOM 1405 C CD2 . TYR A 1 187 ? -20.602 -3.058 -26.427 1.00 63.57 187 A 1 +ATOM 1406 C CE1 . TYR A 1 187 ? -20.922 -4.111 -28.989 1.00 60.02 187 A 1 +ATOM 1407 C CE2 . TYR A 1 187 ? -19.556 -3.776 -27.006 1.00 59.49 187 A 1 +ATOM 1408 C CZ . TYR A 1 187 ? -19.713 -4.301 -28.293 1.00 60.62 187 A 1 +ATOM 1409 O OH . TYR A 1 187 ? -18.686 -5.000 -28.870 1.00 57.46 187 A 1 +ATOM 1410 N N . SER A 1 188 ? -24.358 1.358 -26.359 1.00 71.22 188 A 1 +ATOM 1411 C CA . SER A 1 188 ? -25.448 2.149 -25.780 1.00 68.73 188 A 1 +ATOM 1412 C C . SER A 1 188 ? -26.817 1.893 -26.420 1.00 69.04 188 A 1 +ATOM 1413 O O . SER A 1 188 ? -27.840 1.933 -25.735 1.00 64.54 188 A 1 +ATOM 1414 C CB . SER A 1 188 ? -25.113 3.641 -25.890 1.00 64.32 188 A 1 +ATOM 1415 O OG . SER A 1 188 ? -24.821 4.025 -27.223 1.00 57.48 188 A 1 +ATOM 1416 N N . GLU A 1 189 ? -26.839 1.557 -27.708 1.00 69.76 189 A 1 +ATOM 1417 C CA . GLU A 1 189 ? -28.076 1.200 -28.409 1.00 69.66 189 A 1 +ATOM 1418 C C . GLU A 1 189 ? -28.495 -0.267 -28.206 1.00 70.61 189 A 1 +ATOM 1419 O O . GLU A 1 189 ? -29.574 -0.677 -28.640 1.00 64.98 189 A 1 +ATOM 1420 C CB . GLU A 1 189 ? -27.950 1.550 -29.898 1.00 64.47 189 A 1 +ATOM 1421 C CG . GLU A 1 189 ? -27.653 3.044 -30.122 1.00 57.38 189 A 1 +ATOM 1422 C CD . GLU A 1 189 ? -27.861 3.519 -31.568 1.00 50.76 189 A 1 +ATOM 1423 O OE1 . GLU A 1 189 ? -28.022 4.754 -31.738 1.00 44.34 189 A 1 +ATOM 1424 O OE2 . GLU A 1 189 ? -27.893 2.678 -32.494 1.00 45.27 189 A 1 +ATOM 1425 N N . SER A 1 190 ? -27.668 -1.086 -27.544 1.00 70.36 190 A 1 +ATOM 1426 C CA . SER A 1 190 ? -27.943 -2.493 -27.301 1.00 70.89 190 A 1 +ATOM 1427 C C . SER A 1 190 ? -28.604 -2.716 -25.947 1.00 72.95 190 A 1 +ATOM 1428 O O . SER A 1 190 ? -27.990 -2.581 -24.893 1.00 69.03 190 A 1 +ATOM 1429 C CB . SER A 1 190 ? -26.659 -3.316 -27.422 1.00 65.90 190 A 1 +ATOM 1430 O OG . SER A 1 190 ? -26.960 -4.687 -27.237 1.00 57.56 190 A 1 +ATOM 1431 N N . THR A 1 191 ? -29.826 -3.191 -25.967 1.00 71.63 191 A 1 +ATOM 1432 C CA . THR A 1 191 ? -30.534 -3.645 -24.762 1.00 72.53 191 A 1 +ATOM 1433 C C . THR A 1 191 ? -29.820 -4.791 -24.039 1.00 74.38 191 A 1 +ATOM 1434 O O . THR A 1 191 ? -30.016 -4.985 -22.849 1.00 71.27 191 A 1 +ATOM 1435 C CB . THR A 1 191 ? -31.955 -4.097 -25.119 1.00 69.23 191 A 1 +ATOM 1436 O OG1 . THR A 1 191 ? -31.936 -4.967 -26.232 1.00 62.05 191 A 1 +ATOM 1437 C CG2 . THR A 1 191 ? -32.857 -2.921 -25.479 1.00 58.94 191 A 1 +ATOM 1438 N N . MET A 1 192 ? -28.956 -5.537 -24.746 1.00 72.88 192 A 1 +ATOM 1439 C CA . MET A 1 192 ? -28.243 -6.671 -24.168 1.00 73.42 192 A 1 +ATOM 1440 C C . MET A 1 192 ? -27.231 -6.240 -23.100 1.00 74.82 192 A 1 +ATOM 1441 O O . MET A 1 192 ? -27.105 -6.898 -22.079 1.00 73.27 192 A 1 +ATOM 1442 C CB . MET A 1 192 ? -27.563 -7.474 -25.287 1.00 71.11 192 A 1 +ATOM 1443 C CG . MET A 1 192 ? -27.690 -8.968 -25.030 1.00 63.35 192 A 1 +ATOM 1444 S SD . MET A 1 192 ? -26.735 -9.989 -26.173 1.00 54.25 192 A 1 +ATOM 1445 C CE . MET A 1 192 ? -27.393 -11.621 -25.766 1.00 47.14 192 A 1 +ATOM 1446 N N . VAL A 1 193 ? -26.544 -5.108 -23.308 1.00 73.21 193 A 1 +ATOM 1447 C CA . VAL A 1 193 ? -25.614 -4.540 -22.313 1.00 72.88 193 A 1 +ATOM 1448 C C . VAL A 1 193 ? -26.368 -4.138 -21.045 1.00 74.37 193 A 1 +ATOM 1449 O O . VAL A 1 193 ? -25.926 -4.451 -19.942 1.00 73.55 193 A 1 +ATOM 1450 C CB . VAL A 1 193 ? -24.859 -3.335 -22.882 1.00 70.30 193 A 1 +ATOM 1451 C CG1 . VAL A 1 193 ? -23.928 -2.688 -21.852 1.00 63.32 193 A 1 +ATOM 1452 C CG2 . VAL A 1 193 ? -23.998 -3.783 -24.064 1.00 61.85 193 A 1 +ATOM 1453 N N . LEU A 1 194 ? -27.522 -3.523 -21.208 1.00 73.71 194 A 1 +ATOM 1454 C CA . LEU A 1 194 ? -28.405 -3.143 -20.114 1.00 74.70 194 A 1 +ATOM 1455 C C . LEU A 1 194 ? -28.878 -4.358 -19.308 1.00 76.70 194 A 1 +ATOM 1456 O O . LEU A 1 194 ? -28.825 -4.350 -18.080 1.00 77.04 194 A 1 +ATOM 1457 C CB . LEU A 1 194 ? -29.574 -2.351 -20.717 1.00 73.08 194 A 1 +ATOM 1458 C CG . LEU A 1 194 ? -29.644 -0.920 -20.162 1.00 67.28 194 A 1 +ATOM 1459 C CD1 . LEU A 1 194 ? -30.098 0.044 -21.261 1.00 60.93 194 A 1 +ATOM 1460 C CD2 . LEU A 1 194 ? -30.608 -0.854 -19.002 1.00 60.46 194 A 1 +ATOM 1461 N N . ILE A 1 195 ? -29.253 -5.441 -19.989 1.00 75.81 195 A 1 +ATOM 1462 C CA . ILE A 1 195 ? -29.634 -6.710 -19.350 1.00 76.99 195 A 1 +ATOM 1463 C C . ILE A 1 195 ? -28.445 -7.304 -18.586 1.00 78.26 195 A 1 +ATOM 1464 O O . ILE A 1 195 ? -28.616 -7.747 -17.449 1.00 78.17 195 A 1 +ATOM 1465 C CB . ILE A 1 195 ? -30.196 -7.700 -20.389 1.00 77.16 195 A 1 +ATOM 1466 C CG1 . ILE A 1 195 ? -31.541 -7.185 -20.948 1.00 72.02 195 A 1 +ATOM 1467 C CG2 . ILE A 1 195 ? -30.393 -9.097 -19.778 1.00 69.69 195 A 1 +ATOM 1468 C CD1 . ILE A 1 195 ? -31.998 -7.901 -22.228 1.00 63.39 195 A 1 +ATOM 1469 N N . CYS A 1 196 ? -27.242 -7.293 -19.169 1.00 77.95 196 A 1 +ATOM 1470 C CA . CYS A 1 196 ? -26.034 -7.750 -18.489 1.00 77.22 196 A 1 +ATOM 1471 C C . CYS A 1 196 ? -25.749 -6.932 -17.219 1.00 77.91 196 A 1 +ATOM 1472 O O . CYS A 1 196 ? -25.450 -7.519 -16.182 1.00 77.84 196 A 1 +ATOM 1473 C CB . CYS A 1 196 ? -24.839 -7.693 -19.445 1.00 75.55 196 A 1 +ATOM 1474 S SG . CYS A 1 196 ? -24.908 -9.090 -20.607 1.00 64.14 196 A 1 +ATOM 1475 N N . LEU A 1 197 ? -25.903 -5.607 -17.286 1.00 76.09 197 A 1 +ATOM 1476 C CA . LEU A 1 197 ? -25.712 -4.694 -16.157 1.00 75.90 197 A 1 +ATOM 1477 C C . LEU A 1 197 ? -26.696 -4.983 -15.021 1.00 77.13 197 A 1 +ATOM 1478 O O . LEU A 1 197 ? -26.288 -5.147 -13.871 1.00 77.71 197 A 1 +ATOM 1479 C CB . LEU A 1 197 ? -25.832 -3.249 -16.672 1.00 74.42 197 A 1 +ATOM 1480 C CG . LEU A 1 197 ? -24.545 -2.430 -16.426 1.00 68.35 197 A 1 +ATOM 1481 C CD1 . LEU A 1 197 ? -24.382 -1.378 -17.523 1.00 61.97 197 A 1 +ATOM 1482 C CD2 . LEU A 1 197 ? -24.609 -1.733 -15.077 1.00 61.38 197 A 1 +ATOM 1483 N N . ILE A 1 198 ? -27.977 -5.126 -15.353 1.00 76.87 198 A 1 +ATOM 1484 C CA . ILE A 1 198 ? -29.026 -5.478 -14.392 1.00 78.31 198 A 1 +ATOM 1485 C C . ILE A 1 198 ? -28.759 -6.848 -13.767 1.00 79.89 198 A 1 +ATOM 1486 O O . ILE A 1 198 ? -28.810 -7.001 -12.550 1.00 80.50 198 A 1 +ATOM 1487 C CB . ILE A 1 198 ? -30.412 -5.422 -15.072 1.00 78.31 198 A 1 +ATOM 1488 C CG1 . ILE A 1 198 ? -30.772 -3.964 -15.429 1.00 73.98 198 A 1 +ATOM 1489 C CG2 . ILE A 1 198 ? -31.507 -6.020 -14.174 1.00 72.02 198 A 1 +ATOM 1490 C CD1 . ILE A 1 198 ? -31.960 -3.837 -16.376 1.00 65.92 198 A 1 +ATOM 1491 N N . THR A 1 199 ? -28.415 -7.847 -14.586 1.00 81.22 199 A 1 +ATOM 1492 C CA . THR A 1 199 ? -28.138 -9.205 -14.112 1.00 80.62 199 A 1 +ATOM 1493 C C . THR A 1 199 ? -26.923 -9.237 -13.188 1.00 80.53 199 A 1 +ATOM 1494 O O . THR A 1 199 ? -26.968 -9.862 -12.129 1.00 80.64 199 A 1 +ATOM 1495 C CB . THR A 1 199 ? -27.919 -10.169 -15.295 1.00 80.58 199 A 1 +ATOM 1496 O OG1 . THR A 1 199 ? -28.971 -10.074 -16.220 1.00 71.15 199 A 1 +ATOM 1497 C CG2 . THR A 1 199 ? -27.876 -11.624 -14.840 1.00 68.06 199 A 1 +ATOM 1498 N N . MET A 1 200 ? -25.841 -8.521 -13.549 1.00 80.30 200 A 1 +ATOM 1499 C CA . MET A 1 200 ? -24.639 -8.418 -12.731 1.00 79.19 200 A 1 +ATOM 1500 C C . MET A 1 200 ? -24.932 -7.731 -11.390 1.00 80.25 200 A 1 +ATOM 1501 O O . MET A 1 200 ? -24.512 -8.225 -10.345 1.00 79.85 200 A 1 +ATOM 1502 C CB . MET A 1 200 ? -23.548 -7.672 -13.516 1.00 76.27 200 A 1 +ATOM 1503 C CG . MET A 1 200 ? -22.182 -7.760 -12.823 1.00 66.07 200 A 1 +ATOM 1504 S SD . MET A 1 200 ? -20.836 -6.892 -13.679 1.00 59.32 200 A 1 +ATOM 1505 C CE . MET A 1 200 ? -20.632 -7.909 -15.158 1.00 51.32 200 A 1 +ATOM 1506 N N . PHE A 1 201 ? -25.728 -6.648 -11.408 1.00 79.51 201 A 1 +ATOM 1507 C CA . PHE A 1 201 ? -26.148 -5.962 -10.191 1.00 79.34 201 A 1 +ATOM 1508 C C . PHE A 1 201 ? -26.928 -6.880 -9.263 1.00 80.99 201 A 1 +ATOM 1509 O O . PHE A 1 201 ? -26.566 -7.014 -8.099 1.00 81.44 201 A 1 +ATOM 1510 C CB . PHE A 1 201 ? -26.985 -4.740 -10.543 1.00 77.49 201 A 1 +ATOM 1511 C CG . PHE A 1 201 ? -27.488 -3.989 -9.333 1.00 75.12 201 A 1 +ATOM 1512 C CD1 . PHE A 1 201 ? -28.756 -4.260 -8.799 1.00 66.72 201 A 1 +ATOM 1513 C CD2 . PHE A 1 201 ? -26.698 -2.977 -8.754 1.00 66.02 201 A 1 +ATOM 1514 C CE1 . PHE A 1 201 ? -29.243 -3.504 -7.708 1.00 63.39 201 A 1 +ATOM 1515 C CE2 . PHE A 1 201 ? -27.181 -2.225 -7.677 1.00 62.22 201 A 1 +ATOM 1516 C CZ . PHE A 1 201 ? -28.465 -2.477 -7.149 1.00 66.13 201 A 1 +ATOM 1517 N N . PHE A 1 202 ? -27.965 -7.565 -9.767 1.00 81.10 202 A 1 +ATOM 1518 C CA . PHE A 1 202 ? -28.754 -8.479 -8.945 1.00 82.76 202 A 1 +ATOM 1519 C C . PHE A 1 202 ? -27.927 -9.640 -8.414 1.00 84.05 202 A 1 +ATOM 1520 O O . PHE A 1 202 ? -28.084 -10.022 -7.251 1.00 83.38 202 A 1 +ATOM 1521 C CB . PHE A 1 202 ? -29.969 -8.993 -9.725 1.00 81.32 202 A 1 +ATOM 1522 C CG . PHE A 1 202 ? -31.164 -8.078 -9.606 1.00 77.19 202 A 1 +ATOM 1523 C CD1 . PHE A 1 202 ? -31.901 -8.039 -8.404 1.00 69.19 202 A 1 +ATOM 1524 C CD2 . PHE A 1 202 ? -31.537 -7.247 -10.665 1.00 68.64 202 A 1 +ATOM 1525 C CE1 . PHE A 1 202 ? -33.001 -7.173 -8.277 1.00 66.36 202 A 1 +ATOM 1526 C CE2 . PHE A 1 202 ? -32.632 -6.381 -10.537 1.00 64.30 202 A 1 +ATOM 1527 C CZ . PHE A 1 202 ? -33.365 -6.342 -9.347 1.00 68.97 202 A 1 +ATOM 1528 N N . THR A 1 203 ? -26.990 -10.165 -9.208 1.00 83.28 203 A 1 +ATOM 1529 C CA . THR A 1 203 ? -26.080 -11.232 -8.782 1.00 82.86 203 A 1 +ATOM 1530 C C . THR A 1 203 ? -25.189 -10.758 -7.635 1.00 82.86 203 A 1 +ATOM 1531 O O . THR A 1 203 ? -25.099 -11.430 -6.613 1.00 82.61 203 A 1 +ATOM 1532 C CB . THR A 1 203 ? -25.225 -11.740 -9.951 1.00 82.66 203 A 1 +ATOM 1533 O OG1 . THR A 1 203 ? -26.035 -12.115 -11.033 1.00 72.45 203 A 1 +ATOM 1534 C CG2 . THR A 1 203 ? -24.416 -12.978 -9.572 1.00 69.06 203 A 1 +ATOM 1535 N N . MET A 1 204 ? -24.582 -9.569 -7.765 1.00 80.72 204 A 1 +ATOM 1536 C CA . MET A 1 204 ? -23.781 -8.959 -6.706 1.00 79.90 204 A 1 +ATOM 1537 C C . MET A 1 204 ? -24.601 -8.695 -5.443 1.00 81.22 204 A 1 +ATOM 1538 O O . MET A 1 204 ? -24.134 -8.944 -4.337 1.00 81.49 204 A 1 +ATOM 1539 C CB . MET A 1 204 ? -23.168 -7.647 -7.209 1.00 78.43 204 A 1 +ATOM 1540 C CG . MET A 1 204 ? -21.977 -7.858 -8.151 1.00 70.19 204 A 1 +ATOM 1541 S SD . MET A 1 204 ? -20.457 -8.366 -7.301 1.00 62.71 204 A 1 +ATOM 1542 C CE . MET A 1 204 ? -19.269 -8.057 -8.616 1.00 54.27 204 A 1 +ATOM 1543 N N . LEU A 1 205 ? -25.832 -8.225 -5.596 1.00 81.66 205 A 1 +ATOM 1544 C CA . LEU A 1 205 ? -26.732 -7.902 -4.489 1.00 81.09 205 A 1 +ATOM 1545 C C . LEU A 1 205 ? -27.156 -9.157 -3.720 1.00 81.76 205 A 1 +ATOM 1546 O O . LEU A 1 205 ? -27.128 -9.172 -2.497 1.00 81.91 205 A 1 +ATOM 1547 C CB . LEU A 1 205 ? -27.930 -7.114 -5.054 1.00 79.66 205 A 1 +ATOM 1548 C CG . LEU A 1 205 ? -28.309 -5.866 -4.229 1.00 73.43 205 A 1 +ATOM 1549 C CD1 . LEU A 1 205 ? -29.052 -4.864 -5.112 1.00 65.80 205 A 1 +ATOM 1550 C CD2 . LEU A 1 205 ? -29.196 -6.203 -3.047 1.00 66.24 205 A 1 +ATOM 1551 N N . VAL A 1 206 ? -27.455 -10.241 -4.436 1.00 83.89 206 A 1 +ATOM 1552 C CA . VAL A 1 206 ? -27.741 -11.550 -3.833 1.00 84.25 206 A 1 +ATOM 1553 C C . VAL A 1 206 ? -26.509 -12.099 -3.115 1.00 83.82 206 A 1 +ATOM 1554 O O . VAL A 1 206 ? -26.626 -12.590 -1.992 1.00 83.87 206 A 1 +ATOM 1555 C CB . VAL A 1 206 ? -28.244 -12.545 -4.898 1.00 84.14 206 A 1 +ATOM 1556 C CG1 . VAL A 1 206 ? -28.350 -13.974 -4.359 1.00 75.17 206 A 1 +ATOM 1557 C CG2 . VAL A 1 206 ? -29.636 -12.142 -5.385 1.00 74.25 206 A 1 +ATOM 1558 N N . LEU A 1 207 ? -25.336 -11.963 -3.719 1.00 82.91 207 A 1 +ATOM 1559 C CA . LEU A 1 207 ? -24.081 -12.403 -3.112 1.00 82.64 207 A 1 +ATOM 1560 C C . LEU A 1 207 ? -23.787 -11.625 -1.826 1.00 82.81 207 A 1 +ATOM 1561 O O . LEU A 1 207 ? -23.472 -12.221 -0.796 1.00 83.03 207 A 1 +ATOM 1562 C CB . LEU A 1 207 ? -22.944 -12.260 -4.142 1.00 82.51 207 A 1 +ATOM 1563 C CG . LEU A 1 207 ? -21.870 -13.356 -3.984 1.00 72.82 207 A 1 +ATOM 1564 C CD1 . LEU A 1 207 ? -21.828 -14.235 -5.242 1.00 63.89 207 A 1 +ATOM 1565 C CD2 . LEU A 1 207 ? -20.482 -12.766 -3.787 1.00 65.58 207 A 1 +ATOM 1566 N N . MET A 1 208 ? -23.966 -10.296 -1.838 1.00 81.47 208 A 1 +ATOM 1567 C CA . MET A 1 208 ? -23.832 -9.446 -0.660 1.00 80.54 208 A 1 +ATOM 1568 C C . MET A 1 208 ? -24.846 -9.793 0.422 1.00 80.60 208 A 1 +ATOM 1569 O O . MET A 1 208 ? -24.485 -9.931 1.586 1.00 80.84 208 A 1 +ATOM 1570 C CB . MET A 1 208 ? -23.971 -7.967 -1.042 1.00 79.69 208 A 1 +ATOM 1571 C CG . MET A 1 208 ? -22.672 -7.223 -0.743 1.00 72.97 208 A 1 +ATOM 1572 S SD . MET A 1 208 ? -22.807 -5.431 -0.764 1.00 68.54 208 A 1 +ATOM 1573 C CE . MET A 1 208 ? -23.066 -5.132 -2.514 1.00 59.44 208 A 1 +ATOM 1574 N N . ALA A 1 209 ? -26.106 -9.983 0.047 1.00 81.49 209 A 1 +ATOM 1575 C CA . ALA A 1 209 ? -27.157 -10.367 0.975 1.00 80.17 209 A 1 +ATOM 1576 C C . ALA A 1 209 ? -26.864 -11.721 1.628 1.00 80.75 209 A 1 +ATOM 1577 O O . ALA A 1 209 ? -27.024 -11.857 2.843 1.00 79.87 209 A 1 +ATOM 1578 C CB . ALA A 1 209 ? -28.496 -10.364 0.236 1.00 79.19 209 A 1 +ATOM 1579 N N . SER A 1 210 ? -26.379 -12.702 0.864 1.00 81.55 210 A 1 +ATOM 1580 C CA . SER A 1 210 ? -26.014 -14.009 1.404 1.00 81.20 210 A 1 +ATOM 1581 C C . SER A 1 210 ? -24.839 -13.924 2.385 1.00 81.24 210 A 1 +ATOM 1582 O O . SER A 1 210 ? -24.940 -14.451 3.493 1.00 81.19 210 A 1 +ATOM 1583 C CB . SER A 1 210 ? -25.733 -15.002 0.267 1.00 81.69 210 A 1 +ATOM 1584 O OG . SER A 1 210 ? -24.513 -14.740 -0.388 1.00 71.08 210 A 1 +ATOM 1585 N N . LEU A 1 211 ? -23.783 -13.183 2.030 1.00 80.65 211 A 1 +ATOM 1586 C CA . LEU A 1 211 ? -22.651 -12.901 2.921 1.00 79.59 211 A 1 +ATOM 1587 C C . LEU A 1 211 ? -23.105 -12.183 4.195 1.00 79.06 211 A 1 +ATOM 1588 O O . LEU A 1 211 ? -22.674 -12.535 5.295 1.00 78.28 211 A 1 +ATOM 1589 C CB . LEU A 1 211 ? -21.620 -12.026 2.181 1.00 79.55 211 A 1 +ATOM 1590 C CG . LEU A 1 211 ? -20.579 -12.843 1.399 1.00 75.06 211 A 1 +ATOM 1591 C CD1 . LEU A 1 211 ? -19.883 -11.973 0.360 1.00 66.72 211 A 1 +ATOM 1592 C CD2 . LEU A 1 211 ? -19.498 -13.391 2.339 1.00 67.94 211 A 1 +ATOM 1593 N N . TYR A 1 212 ? -24.003 -11.209 4.054 1.00 80.49 212 A 1 +ATOM 1594 C CA . TYR A 1 212 ? -24.510 -10.435 5.168 1.00 77.96 212 A 1 +ATOM 1595 C C . TYR A 1 212 ? -25.377 -11.269 6.115 1.00 78.09 212 A 1 +ATOM 1596 O O . TYR A 1 212 ? -25.177 -11.230 7.327 1.00 77.34 212 A 1 +ATOM 1597 C CB . TYR A 1 212 ? -25.265 -9.220 4.618 1.00 75.48 212 A 1 +ATOM 1598 C CG . TYR A 1 212 ? -25.581 -8.251 5.708 1.00 70.16 212 A 1 +ATOM 1599 C CD1 . TYR A 1 212 ? -26.814 -8.321 6.377 1.00 62.74 212 A 1 +ATOM 1600 C CD2 . TYR A 1 212 ? -24.578 -7.385 6.166 1.00 62.32 212 A 1 +ATOM 1601 C CE1 . TYR A 1 212 ? -27.019 -7.607 7.551 1.00 57.80 212 A 1 +ATOM 1602 C CE2 . TYR A 1 212 ? -24.767 -6.663 7.356 1.00 57.22 212 A 1 +ATOM 1603 C CZ . TYR A 1 212 ? -25.978 -6.815 8.060 1.00 58.93 212 A 1 +ATOM 1604 O OH . TYR A 1 212 ? -26.121 -6.248 9.286 1.00 55.44 212 A 1 +ATOM 1605 N N . VAL A 1 213 ? -26.270 -12.080 5.584 1.00 78.77 213 A 1 +ATOM 1606 C CA . VAL A 1 213 ? -27.089 -13.014 6.374 1.00 78.64 213 A 1 +ATOM 1607 C C . VAL A 1 213 ? -26.199 -14.018 7.098 1.00 78.59 213 A 1 +ATOM 1608 O O . VAL A 1 213 ? -26.403 -14.262 8.287 1.00 78.30 213 A 1 +ATOM 1609 C CB . VAL A 1 213 ? -28.127 -13.717 5.483 1.00 79.50 213 A 1 +ATOM 1610 C CG1 . VAL A 1 213 ? -28.841 -14.863 6.210 1.00 72.99 213 A 1 +ATOM 1611 C CG2 . VAL A 1 213 ? -29.208 -12.729 5.034 1.00 73.31 213 A 1 +ATOM 1612 N N . HIS A 1 214 ? -25.172 -14.541 6.418 1.00 80.65 214 A 1 +ATOM 1613 C CA . HIS A 1 214 ? -24.232 -15.469 7.029 1.00 79.17 214 A 1 +ATOM 1614 C C . HIS A 1 214 ? -23.426 -14.808 8.155 1.00 78.24 214 A 1 +ATOM 1615 O O . HIS A 1 214 ? -23.352 -15.360 9.258 1.00 77.70 214 A 1 +ATOM 1616 C CB . HIS A 1 214 ? -23.338 -16.078 5.945 1.00 78.94 214 A 1 +ATOM 1617 C CG . HIS A 1 214 ? -22.728 -17.380 6.377 1.00 74.52 214 A 1 +ATOM 1618 N ND1 . HIS A 1 214 ? -23.420 -18.547 6.628 1.00 63.20 214 A 1 +ATOM 1619 C CD2 . HIS A 1 214 ? -21.407 -17.647 6.602 1.00 63.43 214 A 1 +ATOM 1620 C CE1 . HIS A 1 214 ? -22.522 -19.488 6.989 1.00 62.93 214 A 1 +ATOM 1621 N NE2 . HIS A 1 214 ? -21.299 -18.983 6.985 1.00 63.58 214 A 1 +ATOM 1622 N N . MET A 1 215 ? -22.920 -13.583 7.942 1.00 78.36 215 A 1 +ATOM 1623 C CA . MET A 1 215 ? -22.282 -12.782 8.996 1.00 75.71 215 A 1 +ATOM 1624 C C . MET A 1 215 ? -23.206 -12.573 10.188 1.00 73.93 215 A 1 +ATOM 1625 O O . MET A 1 215 ? -22.783 -12.752 11.321 1.00 73.06 215 A 1 +ATOM 1626 C CB . MET A 1 215 ? -21.874 -11.396 8.480 1.00 75.00 215 A 1 +ATOM 1627 C CG . MET A 1 215 ? -20.436 -11.366 7.974 1.00 69.47 215 A 1 +ATOM 1628 S SD . MET A 1 215 ? -19.818 -9.695 7.663 1.00 66.63 215 A 1 +ATOM 1629 C CE . MET A 1 215 ? -20.686 -9.313 6.145 1.00 58.95 215 A 1 +ATOM 1630 N N . PHE A 1 216 ? -24.455 -12.195 9.944 1.00 76.14 216 A 1 +ATOM 1631 C CA . PHE A 1 216 ? -25.392 -11.884 11.013 1.00 74.03 216 A 1 +ATOM 1632 C C . PHE A 1 216 ? -25.758 -13.123 11.837 1.00 73.52 216 A 1 +ATOM 1633 O O . PHE A 1 216 ? -25.789 -13.062 13.065 1.00 72.82 216 A 1 +ATOM 1634 C CB . PHE A 1 216 ? -26.631 -11.214 10.422 1.00 72.33 216 A 1 +ATOM 1635 C CG . PHE A 1 216 ? -27.446 -10.485 11.468 1.00 66.67 216 A 1 +ATOM 1636 C CD1 . PHE A 1 216 ? -28.517 -11.116 12.130 1.00 59.66 216 A 1 +ATOM 1637 C CD2 . PHE A 1 216 ? -27.107 -9.157 11.812 1.00 58.54 216 A 1 +ATOM 1638 C CE1 . PHE A 1 216 ? -29.248 -10.433 13.107 1.00 53.74 216 A 1 +ATOM 1639 C CE2 . PHE A 1 216 ? -27.837 -8.471 12.794 1.00 52.68 216 A 1 +ATOM 1640 C CZ . PHE A 1 216 ? -28.913 -9.107 13.439 1.00 53.51 216 A 1 +ATOM 1641 N N . LEU A 1 217 ? -25.973 -14.261 11.179 1.00 75.15 217 A 1 +ATOM 1642 C CA . LEU A 1 217 ? -26.252 -15.535 11.850 1.00 74.87 217 A 1 +ATOM 1643 C C . LEU A 1 217 ? -25.069 -15.989 12.706 1.00 73.16 217 A 1 +ATOM 1644 O O . LEU A 1 217 ? -25.254 -16.321 13.882 1.00 72.77 217 A 1 +ATOM 1645 C CB . LEU A 1 217 ? -26.601 -16.599 10.796 1.00 76.66 217 A 1 +ATOM 1646 C CG . LEU A 1 217 ? -28.006 -16.441 10.177 1.00 72.69 217 A 1 +ATOM 1647 C CD1 . LEU A 1 217 ? -28.149 -17.402 9.004 1.00 66.90 217 A 1 +ATOM 1648 C CD2 . LEU A 1 217 ? -29.106 -16.749 11.187 1.00 68.07 217 A 1 +ATOM 1649 N N . LEU A 1 218 ? -23.849 -15.946 12.156 1.00 73.27 218 A 1 +ATOM 1650 C CA . LEU A 1 218 ? -22.644 -16.375 12.852 1.00 70.71 218 A 1 +ATOM 1651 C C . LEU A 1 218 ? -22.207 -15.377 13.934 1.00 70.04 218 A 1 +ATOM 1652 O O . LEU A 1 218 ? -21.853 -15.797 15.033 1.00 67.37 218 A 1 +ATOM 1653 C CB . LEU A 1 218 ? -21.551 -16.675 11.820 1.00 68.87 218 A 1 +ATOM 1654 C CG . LEU A 1 218 ? -21.719 -18.066 11.193 1.00 62.43 218 A 1 +ATOM 1655 C CD1 . LEU A 1 218 ? -21.030 -18.166 9.842 1.00 57.35 218 A 1 +ATOM 1656 C CD2 . LEU A 1 218 ? -21.138 -19.153 12.099 1.00 56.93 218 A 1 +ATOM 1657 N N . ALA A 1 219 ? -22.341 -14.069 13.696 1.00 69.82 219 A 1 +ATOM 1658 C CA . ALA A 1 219 ? -22.115 -13.055 14.721 1.00 67.27 219 A 1 +ATOM 1659 C C . ALA A 1 219 ? -23.108 -13.200 15.880 1.00 67.03 219 A 1 +ATOM 1660 O O . ALA A 1 219 ? -22.738 -13.030 17.038 1.00 64.89 219 A 1 +ATOM 1661 C CB . ALA A 1 219 ? -22.211 -11.659 14.100 1.00 64.39 219 A 1 +ATOM 1662 N N . ARG A 1 220 ? -24.360 -13.575 15.603 1.00 70.25 220 A 1 +ATOM 1663 C CA . ARG A 1 220 ? -25.358 -13.856 16.638 1.00 70.16 220 A 1 +ATOM 1664 C C . ARG A 1 220 ? -25.014 -15.115 17.432 1.00 69.78 220 A 1 +ATOM 1665 O O . ARG A 1 220 ? -25.235 -15.135 18.635 1.00 69.21 220 A 1 +ATOM 1666 C CB . ARG A 1 220 ? -26.748 -13.943 15.990 1.00 68.99 220 A 1 +ATOM 1667 C CG . ARG A 1 220 ? -27.879 -13.861 17.027 1.00 61.96 220 A 1 +ATOM 1668 C CD . ARG A 1 220 ? -29.232 -13.929 16.318 1.00 58.99 220 A 1 +ATOM 1669 N NE . ARG A 1 220 ? -30.354 -13.728 17.253 1.00 52.46 220 A 1 +ATOM 1670 C CZ . ARG A 1 220 ? -31.650 -13.803 16.962 1.00 46.88 220 A 1 +ATOM 1671 N NH1 . ARG A 1 220 ? -32.053 -14.125 15.769 1.00 42.59 220 A 1 +ATOM 1672 N NH2 . ARG A 1 220 ? -32.545 -13.558 17.864 1.00 41.45 220 A 1 +ATOM 1673 N N . GLN A 1 221 ? -24.470 -16.153 16.796 1.00 70.25 221 A 1 +ATOM 1674 C CA . GLN A 1 221 ? -23.949 -17.328 17.501 1.00 69.30 221 A 1 +ATOM 1675 C C . GLN A 1 221 ? -22.718 -16.992 18.342 1.00 68.65 221 A 1 +ATOM 1676 O O . GLN A 1 221 ? -22.655 -17.391 19.503 1.00 65.37 221 A 1 +ATOM 1677 C CB . GLN A 1 221 ? -23.613 -18.454 16.517 1.00 68.23 221 A 1 +ATOM 1678 C CG . GLN A 1 221 ? -24.851 -19.248 16.078 1.00 62.85 221 A 1 +ATOM 1679 C CD . GLN A 1 221 ? -24.472 -20.463 15.226 1.00 58.49 221 A 1 +ATOM 1680 O OE1 . GLN A 1 221 ? -23.359 -20.631 14.775 1.00 53.06 221 A 1 +ATOM 1681 N NE2 . GLN A 1 221 ? -25.391 -21.377 14.984 1.00 50.54 221 A 1 +ATOM 1682 N N . HIS A 1 222 ? -21.774 -16.211 17.796 1.00 66.91 222 A 1 +ATOM 1683 C CA . HIS A 1 222 ? -20.596 -15.753 18.525 1.00 63.54 222 A 1 +ATOM 1684 C C . HIS A 1 222 ? -20.985 -14.856 19.692 1.00 62.91 222 A 1 +ATOM 1685 O O . HIS A 1 222 ? -20.549 -15.102 20.810 1.00 61.32 222 A 1 +ATOM 1686 C CB . HIS A 1 222 ? -19.608 -15.062 17.578 1.00 60.16 222 A 1 +ATOM 1687 C CG . HIS A 1 222 ? -18.356 -15.867 17.384 1.00 56.20 222 A 1 +ATOM 1688 N ND1 . HIS A 1 222 ? -18.252 -17.093 16.755 1.00 50.82 222 A 1 +ATOM 1689 C CD2 . HIS A 1 222 ? -17.105 -15.559 17.839 1.00 50.26 222 A 1 +ATOM 1690 C CE1 . HIS A 1 222 ? -16.984 -17.495 16.825 1.00 47.03 222 A 1 +ATOM 1691 N NE2 . HIS A 1 222 ? -16.251 -16.593 17.481 1.00 46.86 222 A 1 +ATOM 1692 N N . MET A 1 223 ? -21.892 -13.891 19.502 1.00 63.94 223 A 1 +ATOM 1693 C CA . MET A 1 223 ? -22.431 -13.089 20.600 1.00 62.13 223 A 1 +ATOM 1694 C C . MET A 1 223 ? -23.094 -13.950 21.668 1.00 61.50 223 A 1 +ATOM 1695 O O . MET A 1 223 ? -22.909 -13.675 22.841 1.00 59.63 223 A 1 +ATOM 1696 C CB . MET A 1 223 ? -23.460 -12.067 20.114 1.00 59.90 223 A 1 +ATOM 1697 C CG . MET A 1 223 ? -22.833 -10.722 19.795 1.00 55.50 223 A 1 +ATOM 1698 S SD . MET A 1 223 ? -24.084 -9.414 19.642 1.00 51.44 223 A 1 +ATOM 1699 C CE . MET A 1 223 ? -24.725 -9.794 17.997 1.00 47.27 223 A 1 +ATOM 1700 N N . LYS A 1 224 ? -23.846 -14.993 21.301 1.00 67.55 224 A 1 +ATOM 1701 C CA . LYS A 1 224 ? -24.441 -15.901 22.289 1.00 67.29 224 A 1 +ATOM 1702 C C . LYS A 1 224 ? -23.372 -16.652 23.083 1.00 65.23 224 A 1 +ATOM 1703 O O . LYS A 1 224 ? -23.518 -16.774 24.293 1.00 63.22 224 A 1 +ATOM 1704 C CB . LYS A 1 224 ? -25.405 -16.892 21.639 1.00 67.39 224 A 1 +ATOM 1705 C CG . LYS A 1 224 ? -26.792 -16.283 21.394 1.00 62.31 224 A 1 +ATOM 1706 C CD . LYS A 1 224 ? -27.714 -17.365 20.830 1.00 59.09 224 A 1 +ATOM 1707 C CE . LYS A 1 224 ? -29.147 -16.853 20.688 1.00 51.53 224 A 1 +ATOM 1708 N NZ . LYS A 1 224 ? -30.075 -17.972 20.327 1.00 46.01 224 A 1 +ATOM 1709 N N . ARG A 1 225 ? -22.308 -17.120 22.441 1.00 63.12 225 A 1 +ATOM 1710 C CA . ARG A 1 225 ? -21.184 -17.778 23.133 1.00 60.80 225 A 1 +ATOM 1711 C C . ARG A 1 225 ? -20.443 -16.811 24.055 1.00 59.11 225 A 1 +ATOM 1712 O O . ARG A 1 225 ? -20.140 -17.186 25.169 1.00 57.32 225 A 1 +ATOM 1713 C CB . ARG A 1 225 ? -20.210 -18.405 22.131 1.00 59.06 225 A 1 +ATOM 1714 C CG . ARG A 1 225 ? -20.633 -19.822 21.727 1.00 54.20 225 A 1 +ATOM 1715 C CD . ARG A 1 225 ? -19.561 -20.458 20.836 1.00 52.06 225 A 1 +ATOM 1716 N NE . ARG A 1 225 ? -19.803 -21.889 20.604 1.00 46.43 225 A 1 +ATOM 1717 C CZ . ARG A 1 225 ? -19.069 -22.689 19.847 1.00 42.12 225 A 1 +ATOM 1718 N NH1 . ARG A 1 225 ? -18.033 -22.244 19.182 1.00 39.36 225 A 1 +ATOM 1719 N NH2 . ARG A 1 225 ? -19.346 -23.956 19.757 1.00 37.88 225 A 1 +ATOM 1720 N N . ILE A 1 226 ? -20.191 -15.582 23.607 1.00 57.32 226 A 1 +ATOM 1721 C CA . ILE A 1 226 ? -19.440 -14.588 24.375 1.00 55.37 226 A 1 +ATOM 1722 C C . ILE A 1 226 ? -20.305 -13.931 25.455 1.00 54.86 226 A 1 +ATOM 1723 O O . ILE A 1 226 ? -19.807 -13.665 26.538 1.00 52.24 226 A 1 +ATOM 1724 C CB . ILE A 1 226 ? -18.762 -13.579 23.424 1.00 52.20 226 A 1 +ATOM 1725 C CG1 . ILE A 1 226 ? -17.694 -14.343 22.595 1.00 49.03 226 A 1 +ATOM 1726 C CG2 . ILE A 1 226 ? -18.114 -12.428 24.208 1.00 48.88 226 A 1 +ATOM 1727 C CD1 . ILE A 1 226 ? -17.179 -13.572 21.396 1.00 45.92 226 A 1 +ATOM 1728 N N . ALA A 1 227 ? -21.610 -13.736 25.220 1.00 56.85 227 A 1 +ATOM 1729 C CA . ALA A 1 227 ? -22.535 -13.313 26.266 1.00 56.82 227 A 1 +ATOM 1730 C C . ALA A 1 227 ? -22.720 -14.382 27.355 1.00 55.77 227 A 1 +ATOM 1731 O O . ALA A 1 227 ? -23.077 -14.045 28.475 1.00 53.82 227 A 1 +ATOM 1732 C CB . ALA A 1 227 ? -23.878 -12.936 25.637 1.00 55.59 227 A 1 +ATOM 1733 N N . ALA A 1 228 ? -22.463 -15.657 27.032 1.00 57.26 228 A 1 +ATOM 1734 C CA . ALA A 1 228 ? -22.398 -16.723 28.027 1.00 56.91 228 A 1 +ATOM 1735 C C . ALA A 1 228 ? -21.091 -16.702 28.846 1.00 55.58 228 A 1 +ATOM 1736 O O . ALA A 1 228 ? -21.049 -17.270 29.936 1.00 52.47 228 A 1 +ATOM 1737 C CB . ALA A 1 228 ? -22.611 -18.067 27.325 1.00 55.13 228 A 1 +ATOM 1738 N N . LEU A 1 229 ? -20.044 -16.031 28.349 1.00 49.67 229 A 1 +ATOM 1739 C CA . LEU A 1 229 ? -18.834 -15.742 29.112 1.00 48.34 229 A 1 +ATOM 1740 C C . LEU A 1 229 ? -19.071 -14.448 29.911 1.00 47.83 229 A 1 +ATOM 1741 O O . LEU A 1 229 ? -19.309 -13.399 29.307 1.00 44.74 229 A 1 +ATOM 1742 C CB . LEU A 1 229 ? -17.627 -15.642 28.162 1.00 44.58 229 A 1 +ATOM 1743 C CG . LEU A 1 229 ? -17.093 -17.020 27.727 1.00 40.99 229 A 1 +ATOM 1744 C CD1 . LEU A 1 229 ? -16.266 -16.908 26.444 1.00 38.10 229 A 1 +ATOM 1745 C CD2 . LEU A 1 229 ? -16.188 -17.625 28.816 1.00 39.64 229 A 1 +ATOM 1746 N N . PRO A 1 230 ? -18.989 -14.466 31.243 1.00 41.43 230 A 1 +ATOM 1747 C CA . PRO A 1 230 ? -19.396 -13.348 32.094 1.00 42.14 230 A 1 +ATOM 1748 C C . PRO A 1 230 ? -18.510 -12.099 31.978 1.00 43.96 230 A 1 +ATOM 1749 O O . PRO A 1 230 ? -18.826 -11.060 32.553 1.00 41.49 230 A 1 +ATOM 1750 C CB . PRO A 1 230 ? -19.393 -13.926 33.520 1.00 38.39 230 A 1 +ATOM 1751 C CG . PRO A 1 230 ? -18.384 -15.076 33.451 1.00 38.38 230 A 1 +ATOM 1752 C CD . PRO A 1 230 ? -18.574 -15.605 32.030 1.00 41.62 230 A 1 +ATOM 1753 N N . GLY A 1 231 ? -17.373 -12.197 31.286 1.00 36.44 231 A 1 +ATOM 1754 C CA . GLY A 1 231 ? -16.383 -11.129 31.189 1.00 36.86 231 A 1 +ATOM 1755 C C . GLY A 1 231 ? -16.765 -10.008 30.217 1.00 38.03 231 A 1 +ATOM 1756 O O . GLY A 1 231 ? -17.597 -10.163 29.324 1.00 35.52 231 A 1 +ATOM 1757 N N . ASN A 1 232 ? -16.095 -8.867 30.369 1.00 38.44 232 A 1 +ATOM 1758 C CA . ASN A 1 232 ? -16.186 -7.754 29.428 1.00 39.22 232 A 1 +ATOM 1759 C C . ASN A 1 232 ? -15.840 -8.241 28.014 1.00 40.34 232 A 1 +ATOM 1760 O O . ASN A 1 232 ? -14.702 -8.610 27.754 1.00 37.57 232 A 1 +ATOM 1761 C CB . ASN A 1 232 ? -15.236 -6.625 29.863 1.00 35.48 232 A 1 +ATOM 1762 C CG . ASN A 1 232 ? -15.858 -5.648 30.843 1.00 32.05 232 A 1 +ATOM 1763 O OD1 . ASN A 1 232 ? -17.042 -5.371 30.821 1.00 30.09 232 A 1 +ATOM 1764 N ND2 . ASN A 1 232 ? -15.068 -5.050 31.707 1.00 29.57 232 A 1 +ATOM 1765 N N . ALA A 1 233 ? -16.808 -8.172 27.107 1.00 40.84 233 A 1 +ATOM 1766 C CA . ALA A 1 233 ? -16.573 -8.464 25.699 1.00 41.47 233 A 1 +ATOM 1767 C C . ALA A 1 233 ? -15.365 -7.631 25.223 1.00 42.17 233 A 1 +ATOM 1768 O O . ALA A 1 233 ? -15.370 -6.408 25.386 1.00 40.24 233 A 1 +ATOM 1769 C CB . ALA A 1 233 ? -17.838 -8.142 24.890 1.00 38.99 233 A 1 +ATOM 1770 N N . PRO A 1 234 ? -14.338 -8.267 24.671 1.00 42.35 234 A 1 +ATOM 1771 C CA . PRO A 1 234 ? -13.096 -7.587 24.344 1.00 43.23 234 A 1 +ATOM 1772 C C . PRO A 1 234 ? -13.369 -6.407 23.400 1.00 44.72 234 A 1 +ATOM 1773 O O . PRO A 1 234 ? -14.170 -6.504 22.469 1.00 42.83 234 A 1 +ATOM 1774 C CB . PRO A 1 234 ? -12.160 -8.660 23.760 1.00 39.99 234 A 1 +ATOM 1775 C CG . PRO A 1 234 ? -13.091 -9.807 23.365 1.00 40.23 234 A 1 +ATOM 1776 C CD . PRO A 1 234 ? -14.243 -9.679 24.352 1.00 42.14 234 A 1 +ATOM 1777 N N . ILE A 1 235 ? -12.693 -5.283 23.655 1.00 41.00 235 A 1 +ATOM 1778 C CA . ILE A 1 235 ? -12.896 -4.016 22.924 1.00 41.25 235 A 1 +ATOM 1779 C C . ILE A 1 235 ? -12.810 -4.222 21.403 1.00 43.79 235 A 1 +ATOM 1780 O O . ILE A 1 235 ? -13.574 -3.615 20.648 1.00 41.33 235 A 1 +ATOM 1781 C CB . ILE A 1 235 ? -11.865 -2.969 23.408 1.00 37.67 235 A 1 +ATOM 1782 C CG1 . ILE A 1 235 ? -12.118 -2.613 24.890 1.00 34.82 235 A 1 +ATOM 1783 C CG2 . ILE A 1 235 ? -11.888 -1.694 22.549 1.00 34.34 235 A 1 +ATOM 1784 C CD1 . ILE A 1 235 ? -11.018 -1.756 25.538 1.00 31.59 235 A 1 +ATOM 1785 N N . GLN A 1 236 ? -11.959 -5.136 20.971 1.00 47.08 236 A 1 +ATOM 1786 C CA . GLN A 1 236 ? -11.773 -5.527 19.577 1.00 48.33 236 A 1 +ATOM 1787 C C . GLN A 1 236 ? -13.082 -6.054 18.956 1.00 51.82 236 A 1 +ATOM 1788 O O . GLN A 1 236 ? -13.470 -5.635 17.869 1.00 50.09 236 A 1 +ATOM 1789 C CB . GLN A 1 236 ? -10.670 -6.588 19.532 1.00 44.72 236 A 1 +ATOM 1790 C CG . GLN A 1 236 ? -9.766 -6.514 18.298 1.00 40.36 236 A 1 +ATOM 1791 C CD . GLN A 1 236 ? -8.503 -7.364 18.484 1.00 36.53 236 A 1 +ATOM 1792 O OE1 . GLN A 1 236 ? -8.273 -7.924 19.543 1.00 34.89 236 A 1 +ATOM 1793 N NE2 . GLN A 1 236 ? -7.649 -7.475 17.505 1.00 32.91 236 A 1 +ATOM 1794 N N . GLN A 1 237 ? -13.820 -6.895 19.664 1.00 51.96 237 A 1 +ATOM 1795 C CA . GLN A 1 237 ? -15.095 -7.417 19.178 1.00 52.70 237 A 1 +ATOM 1796 C C . GLN A 1 237 ? -16.143 -6.309 19.041 1.00 55.65 237 A 1 +ATOM 1797 O O . GLN A 1 237 ? -16.921 -6.282 18.087 1.00 53.87 237 A 1 +ATOM 1798 C CB . GLN A 1 237 ? -15.575 -8.520 20.115 1.00 49.21 237 A 1 +ATOM 1799 C CG . GLN A 1 237 ? -16.595 -9.403 19.399 1.00 45.48 237 A 1 +ATOM 1800 C CD . GLN A 1 237 ? -17.206 -10.432 20.326 1.00 42.16 237 A 1 +ATOM 1801 O OE1 . GLN A 1 237 ? -17.056 -10.389 21.535 1.00 40.13 237 A 1 +ATOM 1802 N NE2 . GLN A 1 237 ? -17.943 -11.372 19.790 1.00 37.69 237 A 1 +ATOM 1803 N N . ARG A 1 238 ? -16.138 -5.334 19.958 1.00 54.23 238 A 1 +ATOM 1804 C CA . ARG A 1 238 ? -17.017 -4.164 19.894 1.00 55.27 238 A 1 +ATOM 1805 C C . ARG A 1 238 ? -16.673 -3.255 18.708 1.00 57.45 238 A 1 +ATOM 1806 O O . ARG A 1 238 ? -17.572 -2.680 18.108 1.00 55.93 238 A 1 +ATOM 1807 C CB . ARG A 1 238 ? -16.961 -3.422 21.236 1.00 52.38 238 A 1 +ATOM 1808 C CG . ARG A 1 238 ? -18.227 -2.598 21.494 1.00 48.42 238 A 1 +ATOM 1809 C CD . ARG A 1 238 ? -18.138 -1.919 22.854 1.00 44.69 238 A 1 +ATOM 1810 N NE . ARG A 1 238 ? -19.417 -1.312 23.268 1.00 40.07 238 A 1 +ATOM 1811 C CZ . ARG A 1 238 ? -19.651 -0.671 24.395 1.00 35.54 238 A 1 +ATOM 1812 N NH1 . ARG A 1 238 ? -18.700 -0.458 25.267 1.00 32.97 238 A 1 +ATOM 1813 N NH2 . ARG A 1 238 ? -20.841 -0.239 24.677 1.00 31.65 238 A 1 +ATOM 1814 N N . ALA A 1 239 ? -15.398 -3.147 18.356 1.00 54.28 239 A 1 +ATOM 1815 C CA . ALA A 1 239 ? -14.941 -2.445 17.164 1.00 55.24 239 A 1 +ATOM 1816 C C . ALA A 1 239 ? -15.376 -3.177 15.882 1.00 59.04 239 A 1 +ATOM 1817 O O . ALA A 1 239 ? -15.977 -2.556 15.004 1.00 57.04 239 A 1 +ATOM 1818 C CB . ALA A 1 239 ? -13.421 -2.263 17.238 1.00 51.60 239 A 1 +ATOM 1819 N N . ASN A 1 240 ? -15.206 -4.496 15.825 1.00 60.12 240 A 1 +ATOM 1820 C CA . ASN A 1 240 ? -15.641 -5.322 14.702 1.00 61.65 240 A 1 +ATOM 1821 C C . ASN A 1 240 ? -17.155 -5.239 14.486 1.00 65.53 240 A 1 +ATOM 1822 O O . ASN A 1 240 ? -17.616 -5.026 13.361 1.00 64.38 240 A 1 +ATOM 1823 C CB . ASN A 1 240 ? -15.172 -6.772 14.932 1.00 57.93 240 A 1 +ATOM 1824 C CG . ASN A 1 240 ? -13.660 -6.917 14.863 1.00 52.80 240 A 1 +ATOM 1825 O OD1 . ASN A 1 240 ? -12.948 -6.003 14.494 1.00 48.92 240 A 1 +ATOM 1826 N ND2 . ASN A 1 240 ? -13.146 -8.074 15.208 1.00 48.78 240 A 1 +ATOM 1827 N N . MET A 1 241 ? -17.944 -5.286 15.554 1.00 63.77 241 A 1 +ATOM 1828 C CA . MET A 1 241 ? -19.390 -5.087 15.486 1.00 66.22 241 A 1 +ATOM 1829 C C . MET A 1 241 ? -19.762 -3.687 15.012 1.00 71.04 241 A 1 +ATOM 1830 O O . MET A 1 241 ? -20.701 -3.551 14.234 1.00 69.26 241 A 1 +ATOM 1831 C CB . MET A 1 241 ? -20.044 -5.345 16.846 1.00 62.20 241 A 1 +ATOM 1832 C CG . MET A 1 241 ? -20.137 -6.829 17.163 1.00 56.08 241 A 1 +ATOM 1833 S SD . MET A 1 241 ? -21.087 -7.136 18.683 1.00 51.27 241 A 1 +ATOM 1834 C CE . MET A 1 241 ? -22.727 -7.200 17.961 1.00 46.22 241 A 1 +ATOM 1835 N N . LYS A 1 242 ? -19.058 -2.635 15.439 1.00 68.19 242 A 1 +ATOM 1836 C CA . LYS A 1 242 ? -19.307 -1.286 14.931 1.00 70.67 242 A 1 +ATOM 1837 C C . LYS A 1 242 ? -19.103 -1.215 13.419 1.00 74.11 242 A 1 +ATOM 1838 O O . LYS A 1 242 ? -19.926 -0.604 12.752 1.00 72.27 242 A 1 +ATOM 1839 C CB . LYS A 1 242 ? -18.418 -0.248 15.628 1.00 67.11 242 A 1 +ATOM 1840 C CG . LYS A 1 242 ? -18.989 0.229 16.967 1.00 59.82 242 A 1 +ATOM 1841 C CD . LYS A 1 242 ? -18.081 1.328 17.533 1.00 55.76 242 A 1 +ATOM 1842 C CE . LYS A 1 242 ? -18.656 1.957 18.799 1.00 47.83 242 A 1 +ATOM 1843 N NZ . LYS A 1 242 ? -17.828 3.110 19.244 1.00 42.75 242 A 1 +ATOM 1844 N N . GLY A 1 243 ? -18.047 -1.849 12.897 1.00 69.88 243 A 1 +ATOM 1845 C CA . GLY A 1 243 ? -17.804 -1.951 11.461 1.00 71.59 243 A 1 +ATOM 1846 C C . GLY A 1 243 ? -18.922 -2.689 10.723 1.00 75.42 243 A 1 +ATOM 1847 O O . GLY A 1 243 ? -19.450 -2.176 9.746 1.00 74.70 243 A 1 +ATOM 1848 N N . ALA A 1 244 ? -19.364 -3.835 11.249 1.00 71.73 244 A 1 +ATOM 1849 C CA . ALA A 1 244 ? -20.470 -4.600 10.682 1.00 73.53 244 A 1 +ATOM 1850 C C . ALA A 1 244 ? -21.793 -3.808 10.676 1.00 76.36 244 A 1 +ATOM 1851 O O . ALA A 1 244 ? -22.479 -3.772 9.662 1.00 76.60 244 A 1 +ATOM 1852 C CB . ALA A 1 244 ? -20.607 -5.924 11.445 1.00 71.35 244 A 1 +ATOM 1853 N N . ILE A 1 245 ? -22.114 -3.093 11.765 1.00 74.52 245 A 1 +ATOM 1854 C CA . ILE A 1 245 ? -23.308 -2.232 11.820 1.00 76.97 245 A 1 +ATOM 1855 C C . ILE A 1 245 ? -23.200 -1.079 10.813 1.00 79.43 245 A 1 +ATOM 1856 O O . ILE A 1 245 ? -24.191 -0.728 10.190 1.00 79.93 245 A 1 +ATOM 1857 C CB . ILE A 1 245 ? -23.557 -1.710 13.247 1.00 76.14 245 A 1 +ATOM 1858 C CG1 . ILE A 1 245 ? -23.874 -2.857 14.236 1.00 69.80 245 A 1 +ATOM 1859 C CG2 . ILE A 1 245 ? -24.729 -0.711 13.280 1.00 68.78 245 A 1 +ATOM 1860 C CD1 . ILE A 1 245 ? -23.712 -2.456 15.716 1.00 62.45 245 A 1 +ATOM 1861 N N . THR A 1 246 ? -22.009 -0.492 10.636 1.00 77.81 246 A 1 +ATOM 1862 C CA . THR A 1 246 ? -21.794 0.573 9.648 1.00 79.06 246 A 1 +ATOM 1863 C C . THR A 1 246 ? -22.065 0.061 8.239 1.00 80.86 246 A 1 +ATOM 1864 O O . THR A 1 246 ? -22.831 0.680 7.513 1.00 80.86 246 A 1 +ATOM 1865 C CB . THR A 1 246 ? -20.381 1.165 9.728 1.00 78.35 246 A 1 +ATOM 1866 O OG1 . THR A 1 246 ? -20.109 1.587 11.044 1.00 70.52 246 A 1 +ATOM 1867 C CG2 . THR A 1 246 ? -20.215 2.394 8.837 1.00 69.53 246 A 1 +ATOM 1868 N N . LEU A 1 247 ? -21.530 -1.108 7.891 1.00 79.71 247 A 1 +ATOM 1869 C CA . LEU A 1 247 ? -21.814 -1.786 6.622 1.00 80.13 247 A 1 +ATOM 1870 C C . LEU A 1 247 ? -23.313 -2.021 6.434 1.00 81.55 247 A 1 +ATOM 1871 O O . LEU A 1 247 ? -23.834 -1.768 5.359 1.00 81.90 247 A 1 +ATOM 1872 C CB . LEU A 1 247 ? -21.029 -3.104 6.599 1.00 79.20 247 A 1 +ATOM 1873 C CG . LEU A 1 247 ? -21.345 -4.000 5.384 1.00 75.90 247 A 1 +ATOM 1874 C CD1 . LEU A 1 247 ? -20.865 -3.395 4.075 1.00 68.87 247 A 1 +ATOM 1875 C CD2 . LEU A 1 247 ? -20.687 -5.358 5.592 1.00 69.51 247 A 1 +ATOM 1876 N N . THR A 1 248 ? -24.037 -2.447 7.469 1.00 79.47 248 A 1 +ATOM 1877 C CA . THR A 1 248 ? -25.490 -2.654 7.390 1.00 79.03 248 A 1 +ATOM 1878 C C . THR A 1 248 ? -26.230 -1.401 7.007 1.00 80.77 248 A 1 +ATOM 1879 O O . THR A 1 248 ? -27.153 -1.448 6.206 1.00 81.04 248 A 1 +ATOM 1880 C CB . THR A 1 248 ? -26.101 -3.060 8.738 1.00 77.25 248 A 1 +ATOM 1881 O OG1 . THR A 1 248 ? -25.266 -3.959 9.438 1.00 69.87 248 A 1 +ATOM 1882 C CG2 . THR A 1 248 ? -27.476 -3.707 8.571 1.00 67.65 248 A 1 +ATOM 1883 N N . ILE A 1 249 ? -25.856 -0.276 7.634 1.00 80.91 249 A 1 +ATOM 1884 C CA . ILE A 1 249 ? -26.506 1.013 7.400 1.00 82.61 249 A 1 +ATOM 1885 C C . ILE A 1 249 ? -26.207 1.477 5.968 1.00 83.89 249 A 1 +ATOM 1886 O O . ILE A 1 249 ? -27.133 1.845 5.259 1.00 83.95 249 A 1 +ATOM 1887 C CB . ILE A 1 249 ? -26.082 2.044 8.462 1.00 82.91 249 A 1 +ATOM 1888 C CG1 . ILE A 1 249 ? -26.553 1.613 9.869 1.00 77.80 249 A 1 +ATOM 1889 C CG2 . ILE A 1 249 ? -26.678 3.426 8.144 1.00 76.71 249 A 1 +ATOM 1890 C CD1 . ILE A 1 249 ? -25.858 2.380 11.009 1.00 70.23 249 A 1 +ATOM 1891 N N . LEU A 1 250 ? -24.945 1.378 5.529 1.00 83.72 250 A 1 +ATOM 1892 C CA . LEU A 1 250 ? -24.527 1.719 4.171 1.00 83.96 250 A 1 +ATOM 1893 C C . LEU A 1 250 ? -25.285 0.881 3.121 1.00 84.38 250 A 1 +ATOM 1894 O O . LEU A 1 250 ? -25.835 1.433 2.180 1.00 84.55 250 A 1 +ATOM 1895 C CB . LEU A 1 250 ? -23.014 1.507 4.018 1.00 84.27 250 A 1 +ATOM 1896 C CG . LEU A 1 250 ? -22.142 2.534 4.772 1.00 82.00 250 A 1 +ATOM 1897 C CD1 . LEU A 1 250 ? -20.673 2.096 4.728 1.00 74.08 250 A 1 +ATOM 1898 C CD2 . LEU A 1 250 ? -22.253 3.919 4.165 1.00 74.33 250 A 1 +ATOM 1899 N N . LEU A 1 251 ? -25.370 -0.425 3.325 1.00 83.71 251 A 1 +ATOM 1900 C CA . LEU A 1 251 ? -26.119 -1.328 2.452 1.00 82.60 251 A 1 +ATOM 1901 C C . LEU A 1 251 ? -27.609 -1.010 2.419 1.00 83.12 251 A 1 +ATOM 1902 O O . LEU A 1 251 ? -28.214 -1.004 1.350 1.00 82.73 251 A 1 +ATOM 1903 C CB . LEU A 1 251 ? -25.880 -2.777 2.916 1.00 81.47 251 A 1 +ATOM 1904 C CG . LEU A 1 251 ? -25.046 -3.589 1.906 1.00 74.07 251 A 1 +ATOM 1905 C CD1 . LEU A 1 251 ? -24.231 -4.660 2.626 1.00 66.41 251 A 1 +ATOM 1906 C CD2 . LEU A 1 251 ? -25.957 -4.264 0.889 1.00 66.37 251 A 1 +ATOM 1907 N N . GLY A 1 252 ? -28.203 -0.719 3.578 1.00 83.44 252 A 1 +ATOM 1908 C CA . GLY A 1 252 ? -29.605 -0.349 3.672 1.00 82.74 252 A 1 +ATOM 1909 C C . GLY A 1 252 ? -29.923 0.933 2.908 1.00 83.55 252 A 1 +ATOM 1910 O O . GLY A 1 252 ? -30.844 0.949 2.096 1.00 83.10 252 A 1 +ATOM 1911 N N . VAL A 1 253 ? -29.124 1.982 3.116 1.00 85.05 253 A 1 +ATOM 1912 C CA . VAL A 1 253 ? -29.268 3.262 2.412 1.00 85.59 253 A 1 +ATOM 1913 C C . VAL A 1 253 ? -29.053 3.080 0.910 1.00 85.35 253 A 1 +ATOM 1914 O O . VAL A 1 253 ? -29.890 3.508 0.126 1.00 84.48 253 A 1 +ATOM 1915 C CB . VAL A 1 253 ? -28.321 4.328 2.996 1.00 85.56 253 A 1 +ATOM 1916 C CG1 . VAL A 1 253 ? -28.356 5.624 2.195 1.00 76.79 253 A 1 +ATOM 1917 C CG2 . VAL A 1 253 ? -28.733 4.676 4.433 1.00 77.18 253 A 1 +ATOM 1918 N N . PHE A 1 254 ? -28.006 2.353 0.513 1.00 85.42 254 A 1 +ATOM 1919 C CA . PHE A 1 254 ? -27.719 2.055 -0.885 1.00 84.67 254 A 1 +ATOM 1920 C C . PHE A 1 254 ? -28.890 1.366 -1.584 1.00 84.56 254 A 1 +ATOM 1921 O O . PHE A 1 254 ? -29.335 1.821 -2.635 1.00 84.73 254 A 1 +ATOM 1922 C CB . PHE A 1 254 ? -26.454 1.189 -0.962 1.00 84.00 254 A 1 +ATOM 1923 C CG . PHE A 1 254 ? -26.061 0.825 -2.377 1.00 83.60 254 A 1 +ATOM 1924 C CD1 . PHE A 1 254 ? -26.494 -0.388 -2.953 1.00 75.55 254 A 1 +ATOM 1925 C CD2 . PHE A 1 254 ? -25.299 1.723 -3.138 1.00 75.33 254 A 1 +ATOM 1926 C CE1 . PHE A 1 254 ? -26.168 -0.694 -4.278 1.00 73.42 254 A 1 +ATOM 1927 C CE2 . PHE A 1 254 ? -24.964 1.423 -4.465 1.00 72.55 254 A 1 +ATOM 1928 C CZ . PHE A 1 254 ? -25.399 0.209 -5.040 1.00 77.87 254 A 1 +ATOM 1929 N N . VAL A 1 255 ? -29.441 0.310 -0.995 1.00 84.32 255 A 1 +ATOM 1930 C CA . VAL A 1 255 ? -30.570 -0.417 -1.580 1.00 83.69 255 A 1 +ATOM 1931 C C . VAL A 1 255 ? -31.798 0.483 -1.708 1.00 83.88 255 A 1 +ATOM 1932 O O . VAL A 1 255 ? -32.445 0.466 -2.750 1.00 83.14 255 A 1 +ATOM 1933 C CB . VAL A 1 255 ? -30.888 -1.693 -0.775 1.00 82.46 255 A 1 +ATOM 1934 C CG1 . VAL A 1 255 ? -32.193 -2.371 -1.215 1.00 75.46 255 A 1 +ATOM 1935 C CG2 . VAL A 1 255 ? -29.769 -2.731 -0.944 1.00 75.13 255 A 1 +ATOM 1936 N N . VAL A 1 256 ? -32.114 1.288 -0.690 1.00 85.76 256 A 1 +ATOM 1937 C CA . VAL A 1 256 ? -33.270 2.190 -0.722 1.00 85.43 256 A 1 +ATOM 1938 C C . VAL A 1 256 ? -33.122 3.272 -1.789 1.00 85.10 256 A 1 +ATOM 1939 O O . VAL A 1 256 ? -34.066 3.534 -2.523 1.00 84.05 256 A 1 +ATOM 1940 C CB . VAL A 1 256 ? -33.529 2.802 0.675 1.00 85.14 256 A 1 +ATOM 1941 C CG1 . VAL A 1 256 ? -34.591 3.903 0.653 1.00 77.43 256 A 1 +ATOM 1942 C CG2 . VAL A 1 256 ? -34.027 1.720 1.644 1.00 76.73 256 A 1 +ATOM 1943 N N . CYS A 1 257 ? -31.943 3.880 -1.909 1.00 84.57 257 A 1 +ATOM 1944 C CA . CYS A 1 257 ? -31.697 4.964 -2.861 1.00 84.03 257 A 1 +ATOM 1945 C C . CYS A 1 257 ? -31.606 4.491 -4.315 1.00 83.41 257 A 1 +ATOM 1946 O O . CYS A 1 257 ? -32.093 5.174 -5.208 1.00 82.45 257 A 1 +ATOM 1947 C CB . CYS A 1 257 ? -30.434 5.722 -2.436 1.00 83.95 257 A 1 +ATOM 1948 S SG . CYS A 1 257 ? -30.721 6.606 -0.868 1.00 79.53 257 A 1 +ATOM 1949 N N . TRP A 1 258 ? -31.023 3.311 -4.562 1.00 84.68 258 A 1 +ATOM 1950 C CA . TRP A 1 258 ? -30.834 2.787 -5.913 1.00 83.86 258 A 1 +ATOM 1951 C C . TRP A 1 258 ? -31.996 1.923 -6.430 1.00 83.20 258 A 1 +ATOM 1952 O O . TRP A 1 258 ? -32.148 1.765 -7.639 1.00 81.79 258 A 1 +ATOM 1953 C CB . TRP A 1 258 ? -29.504 2.043 -5.984 1.00 83.13 258 A 1 +ATOM 1954 C CG . TRP A 1 258 ? -28.302 2.935 -6.040 1.00 83.18 258 A 1 +ATOM 1955 C CD1 . TRP A 1 258 ? -27.575 3.371 -4.985 1.00 75.53 258 A 1 +ATOM 1956 C CD2 . TRP A 1 258 ? -27.658 3.499 -7.234 1.00 80.41 258 A 1 +ATOM 1957 N NE1 . TRP A 1 258 ? -26.518 4.157 -5.442 1.00 76.14 258 A 1 +ATOM 1958 C CE2 . TRP A 1 258 ? -26.526 4.253 -6.812 1.00 78.04 258 A 1 +ATOM 1959 C CE3 . TRP A 1 258 ? -27.923 3.419 -8.613 1.00 78.54 258 A 1 +ATOM 1960 C CZ2 . TRP A 1 258 ? -25.677 4.899 -7.734 1.00 78.05 258 A 1 +ATOM 1961 C CZ3 . TRP A 1 258 ? -27.075 4.074 -9.531 1.00 74.48 258 A 1 +ATOM 1962 C CH2 . TRP A 1 258 ? -25.970 4.796 -9.103 1.00 74.74 258 A 1 +ATOM 1963 N N . ALA A 1 259 ? -32.854 1.382 -5.554 1.00 82.65 259 A 1 +ATOM 1964 C CA . ALA A 1 259 ? -33.970 0.529 -5.971 1.00 81.66 259 A 1 +ATOM 1965 C C . ALA A 1 259 ? -34.927 1.181 -6.998 1.00 82.00 259 A 1 +ATOM 1966 O O . ALA A 1 259 ? -35.268 0.509 -7.974 1.00 80.69 259 A 1 +ATOM 1967 C CB . ALA A 1 259 ? -34.719 0.013 -4.734 1.00 80.65 259 A 1 +ATOM 1968 N N . PRO A 1 260 ? -35.338 2.458 -6.861 1.00 82.81 260 A 1 +ATOM 1969 C CA . PRO A 1 260 ? -36.201 3.103 -7.847 1.00 81.59 260 A 1 +ATOM 1970 C C . PRO A 1 260 ? -35.538 3.241 -9.222 1.00 81.07 260 A 1 +ATOM 1971 O O . PRO A 1 260 ? -36.174 2.975 -10.243 1.00 79.16 260 A 1 +ATOM 1972 C CB . PRO A 1 260 ? -36.564 4.471 -7.261 1.00 80.55 260 A 1 +ATOM 1973 C CG . PRO A 1 260 ? -36.335 4.297 -5.770 1.00 79.43 260 A 1 +ATOM 1974 C CD . PRO A 1 260 ? -35.148 3.340 -5.726 1.00 82.79 260 A 1 +ATOM 1975 N N . PHE A 1 261 ? -34.238 3.589 -9.246 1.00 82.16 261 A 1 +ATOM 1976 C CA . PHE A 1 261 ? -33.455 3.665 -10.477 1.00 80.43 261 A 1 +ATOM 1977 C C . PHE A 1 261 ? -33.345 2.290 -11.151 1.00 79.86 261 A 1 +ATOM 1978 O O . PHE A 1 261 ? -33.545 2.174 -12.357 1.00 79.32 261 A 1 +ATOM 1979 C CB . PHE A 1 261 ? -32.068 4.232 -10.150 1.00 79.07 261 A 1 +ATOM 1980 C CG . PHE A 1 261 ? -31.181 4.348 -11.367 1.00 78.04 261 A 1 +ATOM 1981 C CD1 . PHE A 1 261 ? -30.195 3.377 -11.635 1.00 70.59 261 A 1 +ATOM 1982 C CD2 . PHE A 1 261 ? -31.347 5.429 -12.254 1.00 70.25 261 A 1 +ATOM 1983 C CE1 . PHE A 1 261 ? -29.375 3.496 -12.766 1.00 68.30 261 A 1 +ATOM 1984 C CE2 . PHE A 1 261 ? -30.529 5.552 -13.387 1.00 67.43 261 A 1 +ATOM 1985 C CZ . PHE A 1 261 ? -29.540 4.589 -13.643 1.00 72.15 261 A 1 +ATOM 1986 N N . PHE A 1 262 ? -33.126 1.232 -10.382 1.00 80.95 262 A 1 +ATOM 1987 C CA . PHE A 1 262 ? -33.131 -0.124 -10.913 1.00 80.26 262 A 1 +ATOM 1988 C C . PHE A 1 262 ? -34.470 -0.527 -11.503 1.00 80.67 262 A 1 +ATOM 1989 O O . PHE A 1 262 ? -34.525 -1.148 -12.564 1.00 79.34 262 A 1 +ATOM 1990 C CB . PHE A 1 262 ? -32.704 -1.123 -9.825 1.00 78.23 262 A 1 +ATOM 1991 C CG . PHE A 1 262 ? -31.321 -1.597 -10.151 1.00 75.21 262 A 1 +ATOM 1992 C CD1 . PHE A 1 262 ? -31.157 -2.618 -11.101 1.00 68.16 262 A 1 +ATOM 1993 C CD2 . PHE A 1 262 ? -30.220 -0.869 -9.692 1.00 67.03 262 A 1 +ATOM 1994 C CE1 . PHE A 1 262 ? -29.896 -2.885 -11.641 1.00 64.32 262 A 1 +ATOM 1995 C CE2 . PHE A 1 262 ? -28.957 -1.134 -10.230 1.00 62.97 262 A 1 +ATOM 1996 C CZ . PHE A 1 262 ? -28.797 -2.125 -11.225 1.00 66.30 262 A 1 +ATOM 1997 N N . LEU A 1 263 ? -35.552 -0.145 -10.840 1.00 79.36 263 A 1 +ATOM 1998 C CA . LEU A 1 263 ? -36.889 -0.395 -11.338 1.00 79.00 263 A 1 +ATOM 1999 C C . LEU A 1 263 ? -37.120 0.335 -12.671 1.00 78.64 263 A 1 +ATOM 2000 O O . LEU A 1 263 ? -37.660 -0.269 -13.591 1.00 77.84 263 A 1 +ATOM 2001 C CB . LEU A 1 263 ? -37.911 -0.016 -10.258 1.00 79.02 263 A 1 +ATOM 2002 C CG . LEU A 1 263 ? -39.300 -0.624 -10.527 1.00 73.18 263 A 1 +ATOM 2003 C CD1 . LEU A 1 263 ? -39.313 -2.137 -10.287 1.00 65.15 263 A 1 +ATOM 2004 C CD2 . LEU A 1 263 ? -40.334 -0.011 -9.586 1.00 65.56 263 A 1 +ATOM 2005 N N . HIS A 1 264 ? -36.638 1.575 -12.791 1.00 80.73 264 A 1 +ATOM 2006 C CA . HIS A 1 264 ? -36.670 2.332 -14.042 1.00 78.87 264 A 1 +ATOM 2007 C C . HIS A 1 264 ? -35.941 1.594 -15.179 1.00 78.33 264 A 1 +ATOM 2008 O O . HIS A 1 264 ? -36.528 1.385 -16.243 1.00 77.32 264 A 1 +ATOM 2009 C CB . HIS A 1 264 ? -36.094 3.731 -13.806 1.00 77.64 264 A 1 +ATOM 2010 C CG . HIS A 1 264 ? -36.048 4.569 -15.053 1.00 75.97 264 A 1 +ATOM 2011 N ND1 . HIS A 1 264 ? -37.029 5.424 -15.492 1.00 64.87 264 A 1 +ATOM 2012 C CD2 . HIS A 1 264 ? -35.035 4.633 -15.962 1.00 66.01 264 A 1 +ATOM 2013 C CE1 . HIS A 1 264 ? -36.613 5.995 -16.633 1.00 65.01 264 A 1 +ATOM 2014 N NE2 . HIS A 1 264 ? -35.404 5.534 -16.952 1.00 65.18 264 A 1 +ATOM 2015 N N . LEU A 1 265 ? -34.722 1.105 -14.940 1.00 78.53 265 A 1 +ATOM 2016 C CA . LEU A 1 265 ? -33.962 0.335 -15.936 1.00 76.78 265 A 1 +ATOM 2017 C C . LEU A 1 265 ? -34.691 -0.941 -16.380 1.00 76.34 265 A 1 +ATOM 2018 O O . LEU A 1 265 ? -34.731 -1.265 -17.566 1.00 76.40 265 A 1 +ATOM 2019 C CB . LEU A 1 265 ? -32.583 -0.035 -15.369 1.00 75.75 265 A 1 +ATOM 2020 C CG . LEU A 1 265 ? -31.606 1.136 -15.159 1.00 72.82 265 A 1 +ATOM 2021 C CD1 . LEU A 1 265 ? -30.284 0.579 -14.607 1.00 67.34 265 A 1 +ATOM 2022 C CD2 . LEU A 1 265 ? -31.310 1.860 -16.461 1.00 67.20 265 A 1 +ATOM 2023 N N . ILE A 1 266 ? -35.284 -1.666 -15.438 1.00 76.89 266 A 1 +ATOM 2024 C CA . ILE A 1 266 ? -36.060 -2.870 -15.736 1.00 76.45 266 A 1 +ATOM 2025 C C . ILE A 1 266 ? -37.286 -2.517 -16.582 1.00 75.75 266 A 1 +ATOM 2026 O O . ILE A 1 266 ? -37.565 -3.197 -17.571 1.00 74.79 266 A 1 +ATOM 2027 C CB . ILE A 1 266 ? -36.446 -3.609 -14.435 1.00 76.55 266 A 1 +ATOM 2028 C CG1 . ILE A 1 266 ? -35.185 -4.185 -13.752 1.00 72.70 266 A 1 +ATOM 2029 C CG2 . ILE A 1 266 ? -37.448 -4.743 -14.714 1.00 71.78 266 A 1 +ATOM 2030 C CD1 . ILE A 1 266 ? -35.412 -4.615 -12.298 1.00 66.03 266 A 1 +ATOM 2031 N N . LEU A 1 267 ? -38.001 -1.449 -16.230 1.00 77.60 267 A 1 +ATOM 2032 C CA . LEU A 1 267 ? -39.187 -1.004 -16.962 1.00 76.14 267 A 1 +ATOM 2033 C C . LEU A 1 267 ? -38.850 -0.532 -18.377 1.00 75.29 267 A 1 +ATOM 2034 O O . LEU A 1 267 ? -39.616 -0.829 -19.296 1.00 73.78 267 A 1 +ATOM 2035 C CB . LEU A 1 267 ? -39.900 0.100 -16.162 1.00 75.87 267 A 1 +ATOM 2036 C CG . LEU A 1 267 ? -40.579 -0.383 -14.865 1.00 73.01 267 A 1 +ATOM 2037 C CD1 . LEU A 1 267 ? -41.143 0.826 -14.127 1.00 66.55 267 A 1 +ATOM 2038 C CD2 . LEU A 1 267 ? -41.706 -1.377 -15.105 1.00 67.91 267 A 1 +ATOM 2039 N N . MET A 1 268 ? -37.698 0.112 -18.597 1.00 77.80 268 A 1 +ATOM 2040 C CA . MET A 1 268 ? -37.231 0.479 -19.939 1.00 75.21 268 A 1 +ATOM 2041 C C . MET A 1 268 ? -37.107 -0.724 -20.875 1.00 74.11 268 A 1 +ATOM 2042 O O . MET A 1 268 ? -37.395 -0.609 -22.066 1.00 72.19 268 A 1 +ATOM 2043 C CB . MET A 1 268 ? -35.871 1.184 -19.871 1.00 73.15 268 A 1 +ATOM 2044 C CG . MET A 1 268 ? -35.998 2.659 -19.522 1.00 66.98 268 A 1 +ATOM 2045 S SD . MET A 1 268 ? -34.448 3.576 -19.727 1.00 62.99 268 A 1 +ATOM 2046 C CE . MET A 1 268 ? -34.319 3.648 -21.525 1.00 56.33 268 A 1 +ATOM 2047 N N . ILE A 1 269 ? -36.694 -1.874 -20.358 1.00 75.66 269 A 1 +ATOM 2048 C CA . ILE A 1 269 ? -36.506 -3.089 -21.153 1.00 74.29 269 A 1 +ATOM 2049 C C . ILE A 1 269 ? -37.812 -3.865 -21.295 1.00 73.06 269 A 1 +ATOM 2050 O O . ILE A 1 269 ? -38.136 -4.346 -22.382 1.00 69.10 269 A 1 +ATOM 2051 C CB . ILE A 1 269 ? -35.394 -3.966 -20.530 1.00 72.89 269 A 1 +ATOM 2052 C CG1 . ILE A 1 269 ? -34.059 -3.194 -20.510 1.00 68.15 269 A 1 +ATOM 2053 C CG2 . ILE A 1 269 ? -35.234 -5.276 -21.322 1.00 66.28 269 A 1 +ATOM 2054 C CD1 . ILE A 1 269 ? -32.969 -3.902 -19.692 1.00 61.78 269 A 1 +ATOM 2055 N N . THR A 1 270 ? -38.553 -4.002 -20.211 1.00 75.60 270 A 1 +ATOM 2056 C CA . THR A 1 270 ? -39.714 -4.901 -20.154 1.00 73.72 270 A 1 +ATOM 2057 C C . THR A 1 270 ? -41.013 -4.258 -20.613 1.00 71.73 270 A 1 +ATOM 2058 O O . THR A 1 270 ? -41.880 -4.954 -21.158 1.00 66.25 270 A 1 +ATOM 2059 C CB . THR A 1 270 ? -39.912 -5.461 -18.747 1.00 72.44 270 A 1 +ATOM 2060 O OG1 . THR A 1 270 ? -40.039 -4.432 -17.794 1.00 67.43 270 A 1 +ATOM 2061 C CG2 . THR A 1 270 ? -38.742 -6.343 -18.308 1.00 65.15 270 A 1 +ATOM 2062 N N . CYS A 1 271 ? -41.173 -2.956 -20.377 1.00 73.30 271 A 1 +ATOM 2063 C CA . CYS A 1 271 ? -42.466 -2.295 -20.471 1.00 71.56 271 A 1 +ATOM 2064 C C . CYS A 1 271 ? -42.391 -0.873 -21.051 1.00 71.18 271 A 1 +ATOM 2065 O O . CYS A 1 271 ? -43.070 0.032 -20.558 1.00 64.15 271 A 1 +ATOM 2066 C CB . CYS A 1 271 ? -43.076 -2.348 -19.062 1.00 66.87 271 A 1 +ATOM 2067 S SG . CYS A 1 271 ? -44.839 -2.009 -18.999 1.00 60.76 271 A 1 +ATOM 2068 N N . PRO A 1 272 ? -41.637 -0.606 -22.129 1.00 71.34 272 A 1 +ATOM 2069 C CA . PRO A 1 272 ? -41.363 0.762 -22.589 1.00 69.75 272 A 1 +ATOM 2070 C C . PRO A 1 272 ? -42.590 1.503 -23.142 1.00 70.22 272 A 1 +ATOM 2071 O O . PRO A 1 272 ? -42.562 2.721 -23.281 1.00 65.57 272 A 1 +ATOM 2072 C CB . PRO A 1 272 ? -40.275 0.598 -23.657 1.00 66.30 272 A 1 +ATOM 2073 C CG . PRO A 1 272 ? -40.489 -0.819 -24.186 1.00 64.93 272 A 1 +ATOM 2074 C CD . PRO A 1 272 ? -40.925 -1.583 -22.934 1.00 67.34 272 A 1 +ATOM 2075 N N . ARG A 1 273 ? -43.651 0.793 -23.473 1.00 71.94 273 A 1 +ATOM 2076 C CA . ARG A 1 273 ? -44.861 1.371 -24.099 1.00 72.40 273 A 1 +ATOM 2077 C C . ARG A 1 273 ? -46.086 1.396 -23.186 1.00 73.15 273 A 1 +ATOM 2078 O O . ARG A 1 273 ? -47.118 1.937 -23.593 1.00 66.33 273 A 1 +ATOM 2079 C CB . ARG A 1 273 ? -45.186 0.624 -25.394 1.00 67.33 273 A 1 +ATOM 2080 C CG . ARG A 1 273 ? -44.104 0.826 -26.467 1.00 60.48 273 A 1 +ATOM 2081 C CD . ARG A 1 273 ? -44.567 0.183 -27.791 1.00 55.20 273 A 1 +ATOM 2082 N NE . ARG A 1 273 ? -43.576 0.380 -28.852 1.00 48.70 273 A 1 +ATOM 2083 C CZ . ARG A 1 273 ? -43.656 -0.078 -30.095 1.00 41.93 273 A 1 +ATOM 2084 N NH1 . ARG A 1 273 ? -44.688 -0.779 -30.494 1.00 39.37 273 A 1 +ATOM 2085 N NH2 . ARG A 1 273 ? -42.702 0.164 -30.941 1.00 38.10 273 A 1 +ATOM 2086 N N . ASN A 1 274 ? -46.023 0.819 -22.004 1.00 70.59 274 A 1 +ATOM 2087 C CA . ASN A 1 274 ? -47.163 0.795 -21.100 1.00 70.85 274 A 1 +ATOM 2088 C C . ASN A 1 274 ? -47.285 2.158 -20.390 1.00 71.89 274 A 1 +ATOM 2089 O O . ASN A 1 274 ? -46.301 2.609 -19.814 1.00 66.68 274 A 1 +ATOM 2090 C CB . ASN A 1 274 ? -46.992 -0.386 -20.135 1.00 66.41 274 A 1 +ATOM 2091 C CG . ASN A 1 274 ? -48.163 -0.582 -19.186 1.00 61.53 274 A 1 +ATOM 2092 O OD1 . ASN A 1 274 ? -48.829 0.338 -18.754 1.00 54.96 274 A 1 +ATOM 2093 N ND2 . ASN A 1 274 ? -48.425 -1.810 -18.808 1.00 55.14 274 A 1 +ATOM 2094 N N . PRO A 1 275 ? -48.457 2.789 -20.368 1.00 69.34 275 A 1 +ATOM 2095 C CA . PRO A 1 275 ? -48.644 4.103 -19.758 1.00 68.97 275 A 1 +ATOM 2096 C C . PRO A 1 275 ? -48.282 4.147 -18.268 1.00 69.06 275 A 1 +ATOM 2097 O O . PRO A 1 275 ? -47.763 5.160 -17.805 1.00 64.76 275 A 1 +ATOM 2098 C CB . PRO A 1 275 ? -50.115 4.464 -20.004 1.00 66.20 275 A 1 +ATOM 2099 C CG . PRO A 1 275 ? -50.802 3.129 -20.258 1.00 65.71 275 A 1 +ATOM 2100 C CD . PRO A 1 275 ? -49.708 2.314 -20.943 1.00 68.07 275 A 1 +ATOM 2101 N N . TYR A 1 276 ? -48.461 3.060 -17.519 1.00 71.42 276 A 1 +ATOM 2102 C CA . TYR A 1 276 ? -47.997 3.001 -16.134 1.00 70.91 276 A 1 +ATOM 2103 C C . TYR A 1 276 ? -46.470 2.998 -16.032 1.00 70.69 276 A 1 +ATOM 2104 O O . TYR A 1 276 ? -45.907 3.633 -15.133 1.00 66.85 276 A 1 +ATOM 2105 C CB . TYR A 1 276 ? -48.564 1.759 -15.442 1.00 69.70 276 A 1 +ATOM 2106 C CG . TYR A 1 276 ? -50.033 1.870 -15.142 1.00 65.84 276 A 1 +ATOM 2107 C CD1 . TYR A 1 276 ? -50.476 2.626 -14.035 1.00 59.74 276 A 1 +ATOM 2108 C CD2 . TYR A 1 276 ? -50.985 1.229 -15.957 1.00 59.16 276 A 1 +ATOM 2109 C CE1 . TYR A 1 276 ? -51.838 2.744 -13.746 1.00 53.41 276 A 1 +ATOM 2110 C CE2 . TYR A 1 276 ? -52.362 1.344 -15.681 1.00 53.42 276 A 1 +ATOM 2111 C CZ . TYR A 1 276 ? -52.779 2.101 -14.575 1.00 54.23 276 A 1 +ATOM 2112 O OH . TYR A 1 276 ? -54.119 2.228 -14.299 1.00 52.22 276 A 1 +ATOM 2113 N N . CYS A 1 277 ? -45.794 2.347 -16.974 1.00 71.25 277 A 1 +ATOM 2114 C CA . CYS A 1 277 ? -44.341 2.317 -17.023 1.00 69.35 277 A 1 +ATOM 2115 C C . CYS A 1 277 ? -43.769 3.660 -17.485 1.00 69.41 277 A 1 +ATOM 2116 O O . CYS A 1 277 ? -42.814 4.138 -16.891 1.00 66.46 277 A 1 +ATOM 2117 C CB . CYS A 1 277 ? -43.878 1.163 -17.910 1.00 67.08 277 A 1 +ATOM 2118 S SG . CYS A 1 277 ? -44.440 -0.455 -17.285 1.00 62.58 277 A 1 +ATOM 2119 N N . THR A 1 278 ? -44.378 4.310 -18.475 1.00 71.92 278 A 1 +ATOM 2120 C CA . THR A 1 278 ? -43.989 5.669 -18.889 1.00 70.53 278 A 1 +ATOM 2121 C C . THR A 1 278 ? -44.223 6.692 -17.781 1.00 70.52 278 A 1 +ATOM 2122 O O . THR A 1 278 ? -43.393 7.576 -17.596 1.00 67.85 278 A 1 +ATOM 2123 C CB . THR A 1 278 ? -44.710 6.121 -20.164 1.00 68.00 278 A 1 +ATOM 2124 O OG1 . THR A 1 278 ? -46.092 5.909 -20.084 1.00 62.08 278 A 1 +ATOM 2125 C CG2 . THR A 1 278 ? -44.223 5.339 -21.388 1.00 59.41 278 A 1 +ATOM 2126 N N . CYS A 1 279 ? -45.286 6.541 -16.991 1.00 72.98 279 A 1 +ATOM 2127 C CA . CYS A 1 279 ? -45.528 7.347 -15.801 1.00 72.04 279 A 1 +ATOM 2128 C C . CYS A 1 279 ? -44.402 7.198 -14.774 1.00 71.93 279 A 1 +ATOM 2129 O O . CYS A 1 279 ? -43.861 8.192 -14.297 1.00 67.55 279 A 1 +ATOM 2130 C CB . CYS A 1 279 ? -46.870 6.935 -15.187 1.00 68.77 279 A 1 +ATOM 2131 S SG . CYS A 1 279 ? -47.320 7.962 -13.769 1.00 60.39 279 A 1 +ATOM 2132 N N . PHE A 1 280 ? -43.997 5.972 -14.471 1.00 70.08 280 A 1 +ATOM 2133 C CA . PHE A 1 280 ? -42.895 5.728 -13.542 1.00 70.33 280 A 1 +ATOM 2134 C C . PHE A 1 280 ? -41.576 6.291 -14.080 1.00 70.89 280 A 1 +ATOM 2135 O O . PHE A 1 280 ? -40.854 6.969 -13.349 1.00 68.81 280 A 1 +ATOM 2136 C CB . PHE A 1 280 ? -42.810 4.230 -13.243 1.00 68.65 280 A 1 +ATOM 2137 C CG . PHE A 1 280 ? -41.958 3.926 -12.034 1.00 68.07 280 A 1 +ATOM 2138 C CD1 . PHE A 1 280 ? -40.581 3.720 -12.161 1.00 61.63 280 A 1 +ATOM 2139 C CD2 . PHE A 1 280 ? -42.547 3.895 -10.751 1.00 61.39 280 A 1 +ATOM 2140 C CE1 . PHE A 1 280 ? -39.790 3.481 -11.022 1.00 59.23 280 A 1 +ATOM 2141 C CE2 . PHE A 1 280 ? -41.765 3.647 -9.617 1.00 58.56 280 A 1 +ATOM 2142 C CZ . PHE A 1 280 ? -40.391 3.449 -9.754 1.00 62.44 280 A 1 +ATOM 2143 N N . MET A 1 281 ? -41.295 6.098 -15.380 1.00 69.12 281 A 1 +ATOM 2144 C CA . MET A 1 281 ? -40.097 6.624 -16.032 1.00 67.58 281 A 1 +ATOM 2145 C C . MET A 1 281 ? -40.076 8.164 -16.112 1.00 68.37 281 A 1 +ATOM 2146 O O . MET A 1 281 ? -39.000 8.746 -16.098 1.00 66.37 281 A 1 +ATOM 2147 C CB . MET A 1 281 ? -39.953 6.013 -17.425 1.00 65.49 281 A 1 +ATOM 2148 C CG . MET A 1 281 ? -39.640 4.508 -17.384 1.00 62.70 281 A 1 +ATOM 2149 S SD . MET A 1 281 ? -39.268 3.749 -18.987 1.00 57.53 281 A 1 +ATOM 2150 C CE . MET A 1 281 ? -40.789 4.017 -19.892 1.00 52.87 281 A 1 +ATOM 2151 N N . SER A 1 282 ? -41.243 8.838 -16.134 1.00 71.29 282 A 1 +ATOM 2152 C CA . SER A 1 282 ? -41.301 10.301 -16.154 1.00 69.72 282 A 1 +ATOM 2153 C C . SER A 1 282 ? -40.770 10.951 -14.871 1.00 70.70 282 A 1 +ATOM 2154 O O . SER A 1 282 ? -40.360 12.109 -14.893 1.00 66.73 282 A 1 +ATOM 2155 C CB . SER A 1 282 ? -42.726 10.788 -16.443 1.00 66.08 282 A 1 +ATOM 2156 O OG . SER A 1 282 ? -43.580 10.619 -15.343 1.00 58.85 282 A 1 +ATOM 2157 N N . HIS A 1 283 ? -40.694 10.200 -13.766 1.00 70.43 283 A 1 +ATOM 2158 C CA . HIS A 1 283 ? -40.110 10.656 -12.502 1.00 70.80 283 A 1 +ATOM 2159 C C . HIS A 1 283 ? -38.603 10.352 -12.387 1.00 71.98 283 A 1 +ATOM 2160 O O . HIS A 1 283 ? -38.058 10.378 -11.288 1.00 69.36 283 A 1 +ATOM 2161 C CB . HIS A 1 283 ? -40.914 10.077 -11.329 1.00 69.26 283 A 1 +ATOM 2162 C CG . HIS A 1 283 ? -42.339 10.546 -11.299 1.00 67.66 283 A 1 +ATOM 2163 N ND1 . HIS A 1 283 ? -43.365 10.079 -12.082 1.00 58.50 283 A 1 +ATOM 2164 C CD2 . HIS A 1 283 ? -42.872 11.542 -10.513 1.00 59.58 283 A 1 +ATOM 2165 C CE1 . HIS A 1 283 ? -44.475 10.767 -11.780 1.00 58.35 283 A 1 +ATOM 2166 N NE2 . HIS A 1 283 ? -44.215 11.652 -10.820 1.00 58.88 283 A 1 +ATOM 2167 N N . PHE A 1 284 ? -37.918 10.117 -13.508 1.00 73.24 284 A 1 +ATOM 2168 C CA . PHE A 1 284 ? -36.493 9.785 -13.531 1.00 73.32 284 A 1 +ATOM 2169 C C . PHE A 1 284 ? -35.608 10.778 -12.758 1.00 75.26 284 A 1 +ATOM 2170 O O . PHE A 1 284 ? -34.753 10.368 -11.978 1.00 74.05 284 A 1 +ATOM 2171 C CB . PHE A 1 284 ? -36.033 9.695 -14.991 1.00 70.69 284 A 1 +ATOM 2172 C CG . PHE A 1 284 ? -34.591 9.267 -15.126 1.00 68.04 284 A 1 +ATOM 2173 C CD1 . PHE A 1 284 ? -33.602 10.192 -15.475 1.00 61.64 284 A 1 +ATOM 2174 C CD2 . PHE A 1 284 ? -34.233 7.929 -14.880 1.00 60.65 284 A 1 +ATOM 2175 C CE1 . PHE A 1 284 ? -32.268 9.777 -15.599 1.00 57.16 284 A 1 +ATOM 2176 C CE2 . PHE A 1 284 ? -32.904 7.515 -15.001 1.00 57.32 284 A 1 +ATOM 2177 C CZ . PHE A 1 284 ? -31.917 8.434 -15.359 1.00 59.09 284 A 1 +ATOM 2178 N N . ASN A 1 285 ? -35.883 12.087 -12.878 1.00 73.99 285 A 1 +ATOM 2179 C CA . ASN A 1 285 ? -35.163 13.117 -12.118 1.00 74.39 285 A 1 +ATOM 2180 C C . ASN A 1 285 ? -35.272 12.917 -10.600 1.00 76.24 285 A 1 +ATOM 2181 O O . ASN A 1 285 ? -34.332 13.210 -9.864 1.00 75.40 285 A 1 +ATOM 2182 C CB . ASN A 1 285 ? -35.711 14.496 -12.501 1.00 71.60 285 A 1 +ATOM 2183 C CG . ASN A 1 285 ? -35.180 14.990 -13.839 1.00 67.40 285 A 1 +ATOM 2184 O OD1 . ASN A 1 285 ? -34.306 14.420 -14.440 1.00 60.09 285 A 1 +ATOM 2185 N ND2 . ASN A 1 285 ? -35.708 16.090 -14.319 1.00 59.76 285 A 1 +ATOM 2186 N N . MET A 1 286 ? -36.400 12.397 -10.114 1.00 74.93 286 A 1 +ATOM 2187 C CA . MET A 1 286 ? -36.577 12.119 -8.700 1.00 76.14 286 A 1 +ATOM 2188 C C . MET A 1 286 ? -35.702 10.942 -8.247 1.00 78.22 286 A 1 +ATOM 2189 O O . MET A 1 286 ? -35.180 10.950 -7.132 1.00 77.84 286 A 1 +ATOM 2190 C CB . MET A 1 286 ? -38.070 11.891 -8.422 1.00 74.77 286 A 1 +ATOM 2191 C CG . MET A 1 286 ? -38.391 11.973 -6.933 1.00 67.68 286 A 1 +ATOM 2192 S SD . MET A 1 286 ? -40.167 11.811 -6.577 1.00 60.39 286 A 1 +ATOM 2193 C CE . MET A 1 286 ? -40.146 12.107 -4.792 1.00 51.49 286 A 1 +ATOM 2194 N N . TYR A 1 287 ? -35.491 9.962 -9.131 1.00 76.84 287 A 1 +ATOM 2195 C CA . TYR A 1 287 ? -34.588 8.843 -8.854 1.00 77.61 287 A 1 +ATOM 2196 C C . TYR A 1 287 ? -33.118 9.280 -8.863 1.00 79.02 287 A 1 +ATOM 2197 O O . TYR A 1 287 ? -32.366 8.853 -7.995 1.00 78.83 287 A 1 +ATOM 2198 C CB . TYR A 1 287 ? -34.837 7.695 -9.842 1.00 77.07 287 A 1 +ATOM 2199 C CG . TYR A 1 287 ? -36.295 7.289 -9.995 1.00 76.50 287 A 1 +ATOM 2200 C CD1 . TYR A 1 287 ? -37.174 7.321 -8.899 1.00 68.78 287 A 1 +ATOM 2201 C CD2 . TYR A 1 287 ? -36.791 6.941 -11.261 1.00 69.68 287 A 1 +ATOM 2202 C CE1 . TYR A 1 287 ? -38.537 7.030 -9.060 1.00 66.73 287 A 1 +ATOM 2203 C CE2 . TYR A 1 287 ? -38.155 6.653 -11.436 1.00 66.47 287 A 1 +ATOM 2204 C CZ . TYR A 1 287 ? -39.026 6.716 -10.336 1.00 70.66 287 A 1 +ATOM 2205 O OH . TYR A 1 287 ? -40.365 6.474 -10.501 1.00 67.21 287 A 1 +ATOM 2206 N N . LEU A 1 288 ? -32.743 10.202 -9.749 1.00 79.42 288 A 1 +ATOM 2207 C CA . LEU A 1 288 ? -31.411 10.816 -9.737 1.00 78.70 288 A 1 +ATOM 2208 C C . LEU A 1 288 ? -31.162 11.599 -8.444 1.00 79.47 288 A 1 +ATOM 2209 O O . LEU A 1 288 ? -30.080 11.489 -7.860 1.00 79.73 288 A 1 +ATOM 2210 C CB . LEU A 1 288 ? -31.238 11.738 -10.954 1.00 77.57 288 A 1 +ATOM 2211 C CG . LEU A 1 288 ? -31.134 11.020 -12.304 1.00 72.53 288 A 1 +ATOM 2212 C CD1 . LEU A 1 288 ? -31.001 12.078 -13.409 1.00 66.35 288 A 1 +ATOM 2213 C CD2 . LEU A 1 288 ? -29.910 10.103 -12.375 1.00 65.49 288 A 1 +ATOM 2214 N N . ILE A 1 289 ? -32.144 12.351 -7.940 1.00 79.09 289 A 1 +ATOM 2215 C CA . ILE A 1 289 ? -32.044 13.009 -6.626 1.00 79.69 289 A 1 +ATOM 2216 C C . ILE A 1 289 ? -31.848 11.981 -5.523 1.00 80.97 289 A 1 +ATOM 2217 O O . ILE A 1 289 ? -31.026 12.195 -4.636 1.00 80.73 289 A 1 +ATOM 2218 C CB . ILE A 1 289 ? -33.266 13.900 -6.349 1.00 78.79 289 A 1 +ATOM 2219 C CG1 . ILE A 1 289 ? -33.137 15.173 -7.203 1.00 74.01 289 A 1 +ATOM 2220 C CG2 . ILE A 1 289 ? -33.395 14.277 -4.859 1.00 71.43 289 A 1 +ATOM 2221 C CD1 . ILE A 1 289 ? -34.329 16.107 -7.083 1.00 64.46 289 A 1 +ATOM 2222 N N . LEU A 1 290 ? -32.563 10.853 -5.561 1.00 80.62 290 A 1 +ATOM 2223 C CA . LEU A 1 290 ? -32.428 9.811 -4.558 1.00 81.34 290 A 1 +ATOM 2224 C C . LEU A 1 290 ? -31.008 9.214 -4.541 1.00 81.85 290 A 1 +ATOM 2225 O O . LEU A 1 290 ? -30.453 8.988 -3.468 1.00 81.86 290 A 1 +ATOM 2226 C CB . LEU A 1 290 ? -33.487 8.723 -4.796 1.00 81.30 290 A 1 +ATOM 2227 C CG . LEU A 1 290 ? -34.134 8.266 -3.474 1.00 75.84 290 A 1 +ATOM 2228 C CD1 . LEU A 1 290 ? -35.285 9.181 -3.081 1.00 68.24 290 A 1 +ATOM 2229 C CD2 . LEU A 1 290 ? -34.697 6.856 -3.621 1.00 68.89 290 A 1 +ATOM 2230 N N . ILE A 1 291 ? -30.402 9.028 -5.717 1.00 82.76 291 A 1 +ATOM 2231 C CA . ILE A 1 291 ? -29.010 8.573 -5.860 1.00 82.55 291 A 1 +ATOM 2232 C C . ILE A 1 291 ? -28.044 9.624 -5.303 1.00 82.57 291 A 1 +ATOM 2233 O O . ILE A 1 291 ? -27.153 9.281 -4.525 1.00 82.09 291 A 1 +ATOM 2234 C CB . ILE A 1 291 ? -28.713 8.229 -7.332 1.00 82.11 291 A 1 +ATOM 2235 C CG1 . ILE A 1 291 ? -29.531 6.992 -7.779 1.00 77.19 291 A 1 +ATOM 2236 C CG2 . ILE A 1 291 ? -27.217 7.946 -7.529 1.00 75.56 291 A 1 +ATOM 2237 C CD1 . ILE A 1 291 ? -29.563 6.816 -9.309 1.00 69.96 291 A 1 +ATOM 2238 N N . MET A 1 292 ? -28.237 10.914 -5.618 1.00 82.20 292 A 1 +ATOM 2239 C CA . MET A 1 292 ? -27.422 11.981 -5.019 1.00 81.68 292 A 1 +ATOM 2240 C C . MET A 1 292 ? -27.586 12.059 -3.503 1.00 82.29 292 A 1 +ATOM 2241 O O . MET A 1 292 ? -26.613 12.317 -2.797 1.00 82.31 292 A 1 +ATOM 2242 C CB . MET A 1 292 ? -27.752 13.342 -5.640 1.00 80.91 292 A 1 +ATOM 2243 C CG . MET A 1 292 ? -27.087 13.518 -6.997 1.00 75.78 292 A 1 +ATOM 2244 S SD . MET A 1 292 ? -26.993 15.249 -7.518 1.00 70.98 292 A 1 +ATOM 2245 C CE . MET A 1 292 ? -28.727 15.510 -7.951 1.00 60.13 292 A 1 +ATOM 2246 N N . CYS A 1 293 ? -28.776 11.799 -2.964 1.00 83.48 293 A 1 +ATOM 2247 C CA . CYS A 1 293 ? -28.986 11.698 -1.530 1.00 83.60 293 A 1 +ATOM 2248 C C . CYS A 1 293 ? -28.162 10.562 -0.909 1.00 83.75 293 A 1 +ATOM 2249 O O . CYS A 1 293 ? -27.654 10.752 0.191 1.00 82.82 293 A 1 +ATOM 2250 C CB . CYS A 1 293 ? -30.475 11.515 -1.216 1.00 82.95 293 A 1 +ATOM 2251 S SG . CYS A 1 293 ? -31.393 13.052 -1.529 1.00 76.24 293 A 1 +ATOM 2252 N N . ASN A 1 294 ? -27.987 9.426 -1.595 1.00 85.20 294 A 1 +ATOM 2253 C CA . ASN A 1 294 ? -27.081 8.372 -1.115 1.00 85.40 294 A 1 +ATOM 2254 C C . ASN A 1 294 ? -25.651 8.902 -0.961 1.00 85.00 294 A 1 +ATOM 2255 O O . ASN A 1 294 ? -25.064 8.748 0.107 1.00 82.49 294 A 1 +ATOM 2256 C CB . ASN A 1 294 ? -27.135 7.163 -2.059 1.00 84.20 294 A 1 +ATOM 2257 C CG . ASN A 1 294 ? -26.325 6.007 -1.514 1.00 82.46 294 A 1 +ATOM 2258 O OD1 . ASN A 1 294 ? -26.734 5.335 -0.599 1.00 69.97 294 A 1 +ATOM 2259 N ND2 . ASN A 1 294 ? -25.159 5.753 -2.063 1.00 71.81 294 A 1 +ATOM 2260 N N . SER A 1 295 ? -25.148 9.615 -1.967 1.00 85.83 295 A 1 +ATOM 2261 C CA . SER A 1 295 ? -23.806 10.195 -1.961 1.00 84.55 295 A 1 +ATOM 2262 C C . SER A 1 295 ? -23.597 11.266 -0.881 1.00 84.66 295 A 1 +ATOM 2263 O O . SER A 1 295 ? -22.463 11.485 -0.457 1.00 83.29 295 A 1 +ATOM 2264 C CB . SER A 1 295 ? -23.501 10.801 -3.333 1.00 83.12 295 A 1 +ATOM 2265 O OG . SER A 1 295 ? -23.674 9.839 -4.354 1.00 70.83 295 A 1 +ATOM 2266 N N . ILE A 1 296 ? -24.648 11.929 -0.423 1.00 85.13 296 A 1 +ATOM 2267 C CA . ILE A 1 296 ? -24.615 12.891 0.694 1.00 85.58 296 A 1 +ATOM 2268 C C . ILE A 1 296 ? -24.712 12.173 2.051 1.00 86.07 296 A 1 +ATOM 2269 O O . ILE A 1 296 ? -24.071 12.578 3.019 1.00 84.93 296 A 1 +ATOM 2270 C CB . ILE A 1 296 ? -25.756 13.930 0.525 1.00 84.94 296 A 1 +ATOM 2271 C CG1 . ILE A 1 296 ? -25.492 14.812 -0.714 1.00 79.87 296 A 1 +ATOM 2272 C CG2 . ILE A 1 296 ? -25.925 14.809 1.771 1.00 79.06 296 A 1 +ATOM 2273 C CD1 . ILE A 1 296 ? -26.680 15.685 -1.116 1.00 72.72 296 A 1 +ATOM 2274 N N . ILE A 1 297 ? -25.520 11.118 2.131 1.00 86.08 297 A 1 +ATOM 2275 C CA . ILE A 1 297 ? -25.768 10.390 3.381 1.00 86.22 297 A 1 +ATOM 2276 C C . ILE A 1 297 ? -24.546 9.558 3.799 1.00 86.02 297 A 1 +ATOM 2277 O O . ILE A 1 297 ? -24.241 9.488 4.995 1.00 84.76 297 A 1 +ATOM 2278 C CB . ILE A 1 297 ? -27.057 9.547 3.254 1.00 85.60 297 A 1 +ATOM 2279 C CG1 . ILE A 1 297 ? -28.298 10.473 3.213 1.00 79.54 297 A 1 +ATOM 2280 C CG2 . ILE A 1 297 ? -27.205 8.559 4.422 1.00 78.43 297 A 1 +ATOM 2281 C CD1 . ILE A 1 297 ? -29.564 9.768 2.703 1.00 69.85 297 A 1 +ATOM 2282 N N . ASP A 1 298 ? -23.832 8.954 2.845 1.00 87.08 298 A 1 +ATOM 2283 C CA . ASP A 1 298 ? -22.700 8.083 3.137 1.00 86.76 298 A 1 +ATOM 2284 C C . ASP A 1 298 ? -21.588 8.780 3.960 1.00 85.91 298 A 1 +ATOM 2285 O O . ASP A 1 298 ? -21.227 8.258 5.025 1.00 84.37 298 A 1 +ATOM 2286 C CB . ASP A 1 298 ? -22.170 7.439 1.842 1.00 85.39 298 A 1 +ATOM 2287 C CG . ASP A 1 298 ? -22.993 6.222 1.379 1.00 84.59 298 A 1 +ATOM 2288 O OD1 . ASP A 1 298 ? -23.974 5.867 2.064 1.00 75.62 298 A 1 +ATOM 2289 O OD2 . ASP A 1 298 ? -22.572 5.588 0.399 1.00 76.93 298 A 1 +ATOM 2290 N N . PRO A 1 299 ? -21.113 9.997 3.606 1.00 86.97 299 A 1 +ATOM 2291 C CA . PRO A 1 299 ? -20.172 10.751 4.445 1.00 85.81 299 A 1 +ATOM 2292 C C . PRO A 1 299 ? -20.690 11.045 5.853 1.00 86.03 299 A 1 +ATOM 2293 O O . PRO A 1 299 ? -19.937 10.958 6.827 1.00 84.72 299 A 1 +ATOM 2294 C CB . PRO A 1 299 ? -19.899 12.054 3.687 1.00 83.99 299 A 1 +ATOM 2295 C CG . PRO A 1 299 ? -20.147 11.679 2.240 1.00 82.64 299 A 1 +ATOM 2296 C CD . PRO A 1 299 ? -21.291 10.678 2.333 1.00 85.15 299 A 1 +ATOM 2297 N N . ILE A 1 300 ? -21.984 11.342 5.993 1.00 85.59 300 A 1 +ATOM 2298 C CA . ILE A 1 300 ? -22.628 11.569 7.292 1.00 84.83 300 A 1 +ATOM 2299 C C . ILE A 1 300 ? -22.593 10.291 8.137 1.00 84.46 300 A 1 +ATOM 2300 O O . ILE A 1 300 ? -22.280 10.339 9.331 1.00 83.49 300 A 1 +ATOM 2301 C CB . ILE A 1 300 ? -24.062 12.114 7.113 1.00 85.07 300 A 1 +ATOM 2302 C CG1 . ILE A 1 300 ? -24.056 13.463 6.366 1.00 82.58 300 A 1 +ATOM 2303 C CG2 . ILE A 1 300 ? -24.760 12.267 8.475 1.00 81.65 300 A 1 +ATOM 2304 C CD1 . ILE A 1 300 ? -25.443 13.974 5.958 1.00 74.45 300 A 1 +ATOM 2305 N N . ILE A 1 301 ? -22.849 9.133 7.519 1.00 85.47 301 A 1 +ATOM 2306 C CA . ILE A 1 301 ? -22.739 7.830 8.182 1.00 84.52 301 A 1 +ATOM 2307 C C . ILE A 1 301 ? -21.303 7.589 8.666 1.00 83.75 301 A 1 +ATOM 2308 O O . ILE A 1 301 ? -21.115 7.211 9.824 1.00 82.35 301 A 1 +ATOM 2309 C CB . ILE A 1 301 ? -23.236 6.690 7.268 1.00 84.95 301 A 1 +ATOM 2310 C CG1 . ILE A 1 301 ? -24.754 6.808 7.012 1.00 81.86 301 A 1 +ATOM 2311 C CG2 . ILE A 1 301 ? -22.934 5.304 7.893 1.00 80.82 301 A 1 +ATOM 2312 C CD1 . ILE A 1 301 ? -25.239 5.954 5.840 1.00 73.71 301 A 1 +ATOM 2313 N N . TYR A 1 302 ? -20.297 7.872 7.833 1.00 85.87 302 A 1 +ATOM 2314 C CA . TYR A 1 302 ? -18.897 7.728 8.240 1.00 83.37 302 A 1 +ATOM 2315 C C . TYR A 1 302 ? -18.559 8.637 9.420 1.00 82.69 302 A 1 +ATOM 2316 O O . TYR A 1 302 ? -17.998 8.172 10.415 1.00 81.17 302 A 1 +ATOM 2317 C CB . TYR A 1 302 ? -17.949 8.016 7.067 1.00 82.50 302 A 1 +ATOM 2318 C CG . TYR A 1 302 ? -18.218 7.267 5.781 1.00 81.55 302 A 1 +ATOM 2319 C CD1 . TYR A 1 302 ? -18.670 5.939 5.793 1.00 74.23 302 A 1 +ATOM 2320 C CD2 . TYR A 1 302 ? -18.040 7.928 4.550 1.00 74.25 302 A 1 +ATOM 2321 C CE1 . TYR A 1 302 ? -18.967 5.281 4.591 1.00 72.15 302 A 1 +ATOM 2322 C CE2 . TYR A 1 302 ? -18.333 7.283 3.351 1.00 71.34 302 A 1 +ATOM 2323 C CZ . TYR A 1 302 ? -18.809 5.962 3.365 1.00 76.26 302 A 1 +ATOM 2324 O OH . TYR A 1 302 ? -19.121 5.347 2.187 1.00 73.72 302 A 1 +ATOM 2325 N N . ALA A 1 303 ? -18.969 9.901 9.364 1.00 82.89 303 A 1 +ATOM 2326 C CA . ALA A 1 303 ? -18.750 10.857 10.443 1.00 80.34 303 A 1 +ATOM 2327 C C . ALA A 1 303 ? -19.423 10.419 11.753 1.00 80.13 303 A 1 +ATOM 2328 O O . ALA A 1 303 ? -18.848 10.538 12.835 1.00 77.92 303 A 1 +ATOM 2329 C CB . ALA A 1 303 ? -19.271 12.222 9.993 1.00 78.95 303 A 1 +ATOM 2330 N N . PHE A 1 304 ? -20.641 9.864 11.665 1.00 82.24 304 A 1 +ATOM 2331 C CA . PHE A 1 304 ? -21.386 9.450 12.849 1.00 80.74 304 A 1 +ATOM 2332 C C . PHE A 1 304 ? -20.854 8.146 13.462 1.00 79.95 304 A 1 +ATOM 2333 O O . PHE A 1 304 ? -20.842 7.994 14.689 1.00 76.96 304 A 1 +ATOM 2334 C CB . PHE A 1 304 ? -22.879 9.337 12.494 1.00 79.53 304 A 1 +ATOM 2335 C CG . PHE A 1 304 ? -23.748 9.424 13.723 1.00 73.70 304 A 1 +ATOM 2336 C CD1 . PHE A 1 304 ? -24.163 8.257 14.389 1.00 66.89 304 A 1 +ATOM 2337 C CD2 . PHE A 1 304 ? -24.143 10.685 14.214 1.00 64.75 304 A 1 +ATOM 2338 C CE1 . PHE A 1 304 ? -24.966 8.354 15.542 1.00 60.45 304 A 1 +ATOM 2339 C CE2 . PHE A 1 304 ? -24.938 10.782 15.361 1.00 58.80 304 A 1 +ATOM 2340 C CZ . PHE A 1 304 ? -25.352 9.614 16.029 1.00 60.65 304 A 1 +ATOM 2341 N N . ARG A 1 305 ? -20.391 7.211 12.618 1.00 81.13 305 A 1 +ATOM 2342 C CA . ARG A 1 305 ? -19.994 5.864 13.039 1.00 80.65 305 A 1 +ATOM 2343 C C . ARG A 1 305 ? -18.515 5.732 13.399 1.00 79.68 305 A 1 +ATOM 2344 O O . ARG A 1 305 ? -18.188 4.924 14.273 1.00 76.05 305 A 1 +ATOM 2345 C CB . ARG A 1 305 ? -20.386 4.859 11.948 1.00 79.41 305 A 1 +ATOM 2346 C CG . ARG A 1 305 ? -21.909 4.757 11.723 1.00 76.08 305 A 1 +ATOM 2347 C CD . ARG A 1 305 ? -22.696 4.244 12.940 1.00 74.06 305 A 1 +ATOM 2348 N NE . ARG A 1 305 ? -22.269 2.888 13.301 1.00 72.15 305 A 1 +ATOM 2349 C CZ . ARG A 1 305 ? -22.690 2.179 14.331 1.00 67.83 305 A 1 +ATOM 2350 N NH1 . ARG A 1 305 ? -23.589 2.630 15.170 1.00 61.21 305 A 1 +ATOM 2351 N NH2 . ARG A 1 305 ? -22.204 0.991 14.528 1.00 63.55 305 A 1 +ATOM 2352 N N . SER A 1 306 ? -17.643 6.511 12.781 1.00 80.02 306 A 1 +ATOM 2353 C CA . SER A 1 306 ? -16.207 6.503 13.063 1.00 79.19 306 A 1 +ATOM 2354 C C . SER A 1 306 ? -15.813 7.704 13.922 1.00 79.55 306 A 1 +ATOM 2355 O O . SER A 1 306 ? -15.893 8.849 13.502 1.00 76.82 306 A 1 +ATOM 2356 C CB . SER A 1 306 ? -15.405 6.464 11.765 1.00 76.16 306 A 1 +ATOM 2357 O OG . SER A 1 306 ? -14.023 6.485 12.081 1.00 69.35 306 A 1 +ATOM 2358 N N . GLN A 1 307 ? -15.339 7.426 15.150 1.00 78.48 307 A 1 +ATOM 2359 C CA . GLN A 1 307 ? -14.815 8.476 16.026 1.00 78.59 307 A 1 +ATOM 2360 C C . GLN A 1 307 ? -13.549 9.108 15.442 1.00 80.25 307 A 1 +ATOM 2361 O O . GLN A 1 307 ? -13.374 10.323 15.554 1.00 77.32 307 A 1 +ATOM 2362 C CB . GLN A 1 307 ? -14.577 7.870 17.418 1.00 74.84 307 A 1 +ATOM 2363 C CG . GLN A 1 307 ? -14.187 8.940 18.463 1.00 65.57 307 A 1 +ATOM 2364 C CD . GLN A 1 307 ? -14.089 8.370 19.876 1.00 59.58 307 A 1 +ATOM 2365 O OE1 . GLN A 1 307 ? -14.346 7.203 20.130 1.00 52.22 307 A 1 +ATOM 2366 N NE2 . GLN A 1 307 ? -13.743 9.172 20.847 1.00 49.68 307 A 1 +ATOM 2367 N N . GLU A 1 308 ? -12.720 8.301 14.775 1.00 77.36 308 A 1 +ATOM 2368 C CA . GLU A 1 308 ? -11.469 8.755 14.171 1.00 78.30 308 A 1 +ATOM 2369 C C . GLU A 1 308 ? -11.712 9.647 12.945 1.00 79.70 308 A 1 +ATOM 2370 O O . GLU A 1 308 ? -11.136 10.722 12.845 1.00 77.49 308 A 1 +ATOM 2371 C CB . GLU A 1 308 ? -10.619 7.520 13.813 1.00 75.91 308 A 1 +ATOM 2372 C CG . GLU A 1 308 ? -9.125 7.832 13.730 1.00 69.67 308 A 1 +ATOM 2373 C CD . GLU A 1 308 ? -8.533 8.303 15.081 1.00 64.92 308 A 1 +ATOM 2374 O OE1 . GLU A 1 308 ? -7.464 8.944 15.047 1.00 58.44 308 A 1 +ATOM 2375 O OE2 . GLU A 1 308 ? -9.169 8.073 16.130 1.00 60.36 308 A 1 +ATOM 2376 N N . MET A 1 309 ? -12.673 9.292 12.088 1.00 79.24 309 A 1 +ATOM 2377 C CA . MET A 1 309 ? -13.135 10.159 10.999 1.00 80.70 309 A 1 +ATOM 2378 C C . MET A 1 309 ? -13.662 11.492 11.529 1.00 81.11 309 A 1 +ATOM 2379 O O . MET A 1 309 ? -13.283 12.544 11.047 1.00 80.19 309 A 1 +ATOM 2380 C CB . MET A 1 309 ? -14.244 9.461 10.194 1.00 81.26 309 A 1 +ATOM 2381 C CG . MET A 1 309 ? -13.692 8.457 9.192 1.00 77.95 309 A 1 +ATOM 2382 S SD . MET A 1 309 ? -12.977 9.208 7.709 1.00 75.60 309 A 1 +ATOM 2383 C CE . MET A 1 309 ? -14.460 9.406 6.720 1.00 66.58 309 A 1 +ATOM 2384 N N . ARG A 1 310 ? -14.502 11.449 12.570 1.00 81.37 310 A 1 +ATOM 2385 C CA . ARG A 1 310 ? -15.083 12.661 13.175 1.00 81.77 310 A 1 +ATOM 2386 C C . ARG A 1 310 ? -14.020 13.584 13.765 1.00 81.61 310 A 1 +ATOM 2387 O O . ARG A 1 310 ? -14.147 14.796 13.659 1.00 79.98 310 A 1 +ATOM 2388 C CB . ARG A 1 310 ? -16.091 12.235 14.245 1.00 80.92 310 A 1 +ATOM 2389 C CG . ARG A 1 310 ? -17.120 13.339 14.541 1.00 75.28 310 A 1 +ATOM 2390 C CD . ARG A 1 310 ? -18.040 12.966 15.702 1.00 74.04 310 A 1 +ATOM 2391 N NE . ARG A 1 310 ? -18.594 11.610 15.521 1.00 67.83 310 A 1 +ATOM 2392 C CZ . ARG A 1 310 ? -19.389 10.950 16.341 1.00 61.78 310 A 1 +ATOM 2393 N NH1 . ARG A 1 310 ? -19.871 11.475 17.444 1.00 56.20 310 A 1 +ATOM 2394 N NH2 . ARG A 1 310 ? -19.725 9.721 16.064 1.00 56.12 310 A 1 +ATOM 2395 N N . LYS A 1 311 ? -12.994 13.010 14.387 1.00 80.85 311 A 1 +ATOM 2396 C CA . LYS A 1 311 ? -11.844 13.756 14.899 1.00 80.30 311 A 1 +ATOM 2397 C C . LYS A 1 311 ? -11.077 14.412 13.745 1.00 80.85 311 A 1 +ATOM 2398 O O . LYS A 1 311 ? -10.836 15.611 13.797 1.00 78.75 311 A 1 +ATOM 2399 C CB . LYS A 1 311 ? -10.954 12.804 15.712 1.00 78.36 311 A 1 +ATOM 2400 C CG . LYS A 1 311 ? -9.797 13.543 16.404 1.00 69.44 311 A 1 +ATOM 2401 C CD . LYS A 1 311 ? -8.861 12.543 17.088 1.00 64.93 311 A 1 +ATOM 2402 C CE . LYS A 1 311 ? -7.632 13.262 17.644 1.00 55.20 311 A 1 +ATOM 2403 N NZ . LYS A 1 311 ? -6.575 12.298 18.024 1.00 49.45 311 A 1 +ATOM 2404 N N . THR A 1 312 ? -10.806 13.661 12.679 1.00 81.00 312 A 1 +ATOM 2405 C CA . THR A 1 312 ? -10.077 14.157 11.506 1.00 80.67 312 A 1 +ATOM 2406 C C . THR A 1 312 ? -10.856 15.249 10.769 1.00 80.93 312 A 1 +ATOM 2407 O O . THR A 1 312 ? -10.278 16.256 10.381 1.00 80.02 312 A 1 +ATOM 2408 C CB . THR A 1 312 ? -9.735 13.019 10.537 1.00 80.46 312 A 1 +ATOM 2409 O OG1 . THR A 1 312 ? -9.231 11.902 11.222 1.00 72.11 312 A 1 +ATOM 2410 C CG2 . THR A 1 312 ? -8.656 13.443 9.554 1.00 71.25 312 A 1 +ATOM 2411 N N . PHE A 1 313 ? -12.183 15.115 10.638 1.00 81.56 313 A 1 +ATOM 2412 C CA . PHE A 1 313 ? -13.043 16.164 10.086 1.00 81.22 313 A 1 +ATOM 2413 C C . PHE A 1 313 ? -12.985 17.433 10.925 1.00 80.06 313 A 1 +ATOM 2414 O O . PHE A 1 313 ? -12.784 18.516 10.377 1.00 78.66 313 A 1 +ATOM 2415 C CB . PHE A 1 313 ? -14.484 15.672 9.967 1.00 81.45 313 A 1 +ATOM 2416 C CG . PHE A 1 313 ? -14.755 14.562 8.977 1.00 81.48 313 A 1 +ATOM 2417 C CD1 . PHE A 1 313 ? -13.911 14.296 7.883 1.00 74.68 313 A 1 +ATOM 2418 C CD2 . PHE A 1 313 ? -15.939 13.813 9.111 1.00 74.24 313 A 1 +ATOM 2419 C CE1 . PHE A 1 313 ? -14.239 13.301 6.945 1.00 73.59 313 A 1 +ATOM 2420 C CE2 . PHE A 1 313 ? -16.270 12.825 8.182 1.00 72.78 313 A 1 +ATOM 2421 C CZ . PHE A 1 313 ? -15.418 12.566 7.097 1.00 77.81 313 A 1 +ATOM 2422 N N . LYS A 1 314 ? -13.083 17.322 12.257 1.00 81.72 314 A 1 +ATOM 2423 C CA . LYS A 1 314 ? -12.918 18.467 13.146 1.00 80.18 314 A 1 +ATOM 2424 C C . LYS A 1 314 ? -11.556 19.123 12.971 1.00 78.52 314 A 1 +ATOM 2425 O O . LYS A 1 314 ? -11.498 20.349 12.921 1.00 76.03 314 A 1 +ATOM 2426 C CB . LYS A 1 314 ? -13.117 18.069 14.615 1.00 79.69 314 A 1 +ATOM 2427 C CG . LYS A 1 314 ? -14.599 17.957 14.977 1.00 71.45 314 A 1 +ATOM 2428 C CD . LYS A 1 314 ? -14.736 17.658 16.473 1.00 67.38 314 A 1 +ATOM 2429 C CE . LYS A 1 314 ? -16.204 17.657 16.886 1.00 57.66 314 A 1 +ATOM 2430 N NZ . LYS A 1 314 ? -16.346 17.541 18.353 1.00 51.20 314 A 1 +ATOM 2431 N N . GLU A 1 315 ? -10.488 18.356 12.847 1.00 79.43 315 A 1 +ATOM 2432 C CA . GLU A 1 315 ? -9.148 18.895 12.608 1.00 77.98 315 A 1 +ATOM 2433 C C . GLU A 1 315 ? -9.039 19.628 11.258 1.00 77.03 315 A 1 +ATOM 2434 O O . GLU A 1 315 ? -8.428 20.682 11.201 1.00 74.71 315 A 1 +ATOM 2435 C CB . GLU A 1 315 ? -8.109 17.774 12.680 1.00 75.53 315 A 1 +ATOM 2436 C CG . GLU A 1 315 ? -7.839 17.313 14.119 1.00 67.22 315 A 1 +ATOM 2437 C CD . GLU A 1 315 ? -6.946 16.070 14.184 1.00 63.17 315 A 1 +ATOM 2438 O OE1 . GLU A 1 315 ? -6.859 15.486 15.287 1.00 56.02 315 A 1 +ATOM 2439 O OE2 . GLU A 1 315 ? -6.376 15.675 13.141 1.00 57.99 315 A 1 +ATOM 2440 N N . ILE A 1 316 ? -9.665 19.111 10.193 1.00 77.24 316 A 1 +ATOM 2441 C CA . ILE A 1 316 ? -9.683 19.765 8.882 1.00 76.41 316 A 1 +ATOM 2442 C C . ILE A 1 316 ? -10.491 21.080 8.940 1.00 74.68 316 A 1 +ATOM 2443 O O . ILE A 1 316 ? -9.985 22.118 8.523 1.00 72.10 316 A 1 +ATOM 2444 C CB . ILE A 1 316 ? -10.193 18.803 7.784 1.00 76.54 316 A 1 +ATOM 2445 C CG1 . ILE A 1 316 ? -9.176 17.651 7.570 1.00 72.91 316 A 1 +ATOM 2446 C CG2 . ILE A 1 316 ? -10.403 19.551 6.453 1.00 71.43 316 A 1 +ATOM 2447 C CD1 . ILE A 1 316 ? -9.727 16.491 6.732 1.00 66.84 316 A 1 +ATOM 2448 N N . PHE A 1 317 ? -11.705 21.044 9.510 1.00 77.59 317 A 1 +ATOM 2449 C CA . PHE A 1 317 ? -12.538 22.237 9.671 1.00 75.10 317 A 1 +ATOM 2450 C C . PHE A 1 317 ? -11.919 23.251 10.625 1.00 72.55 317 A 1 +ATOM 2451 O O . PHE A 1 317 ? -11.849 24.438 10.299 1.00 67.70 317 A 1 +ATOM 2452 C CB . PHE A 1 317 ? -13.949 21.840 10.136 1.00 72.83 317 A 1 +ATOM 2453 C CG . PHE A 1 317 ? -14.879 21.480 9.003 1.00 68.53 317 A 1 +ATOM 2454 C CD1 . PHE A 1 317 ? -15.417 22.497 8.195 1.00 62.10 317 A 1 +ATOM 2455 C CD2 . PHE A 1 317 ? -15.217 20.149 8.750 1.00 60.50 317 A 1 +ATOM 2456 C CE1 . PHE A 1 317 ? -16.285 22.177 7.143 1.00 55.56 317 A 1 +ATOM 2457 C CE2 . PHE A 1 317 ? -16.083 19.826 7.695 1.00 54.52 317 A 1 +ATOM 2458 C CZ . PHE A 1 317 ? -16.621 20.834 6.889 1.00 55.97 317 A 1 +ATOM 2459 N N . CYS A 1 318 ? -11.406 22.817 11.771 1.00 72.26 318 A 1 +ATOM 2460 C CA . CYS A 1 318 ? -10.714 23.690 12.703 1.00 70.74 318 A 1 +ATOM 2461 C C . CYS A 1 318 ? -9.462 24.276 12.059 1.00 67.99 318 A 1 +ATOM 2462 O O . CYS A 1 318 ? -9.231 25.454 12.221 1.00 61.83 318 A 1 +ATOM 2463 C CB . CYS A 1 318 ? -10.386 22.972 14.017 1.00 67.28 318 A 1 +ATOM 2464 S SG . CYS A 1 318 ? -11.901 22.736 14.998 1.00 58.83 318 A 1 +ATOM 2465 N N . CYS A 1 319 ? -8.701 23.527 11.279 1.00 65.03 319 A 1 +ATOM 2466 C CA . CYS A 1 319 ? -7.499 24.056 10.624 1.00 62.87 319 A 1 +ATOM 2467 C C . CYS A 1 319 ? -7.830 25.159 9.599 1.00 61.46 319 A 1 +ATOM 2468 O O . CYS A 1 319 ? -7.061 26.105 9.463 1.00 57.29 319 A 1 +ATOM 2469 C CB . CYS A 1 319 ? -6.710 22.895 9.996 1.00 59.45 319 A 1 +ATOM 2470 S SG . CYS A 1 319 ? -4.969 23.343 9.807 1.00 53.98 319 A 1 +ATOM 2471 N N . SER A 1 320 ? -8.988 25.089 8.930 1.00 59.73 320 A 1 +ATOM 2472 C CA . SER A 1 320 ? -9.441 26.166 8.046 1.00 58.27 320 A 1 +ATOM 2473 C C . SER A 1 320 ? -9.870 27.432 8.805 1.00 57.29 320 A 1 +ATOM 2474 O O . SER A 1 320 ? -9.594 28.536 8.357 1.00 54.32 320 A 1 +ATOM 2475 C CB . SER A 1 320 ? -10.569 25.665 7.125 1.00 55.44 320 A 1 +ATOM 2476 O OG . SER A 1 320 ? -11.749 25.386 7.835 1.00 52.07 320 A 1 +ATOM 2477 N N . GLN A 1 321 ? -10.476 27.291 9.998 1.00 57.31 321 A 1 +ATOM 2478 C CA . GLN A 1 321 ? -10.781 28.423 10.894 1.00 56.54 321 A 1 +ATOM 2479 C C . GLN A 1 321 ? -9.572 28.862 11.739 1.00 55.49 321 A 1 +ATOM 2480 O O . GLN A 1 321 ? -9.485 30.020 12.150 1.00 52.84 321 A 1 +ATOM 2481 C CB . GLN A 1 321 ? -11.959 28.058 11.809 1.00 54.01 321 A 1 +ATOM 2482 C CG . GLN A 1 321 ? -13.306 28.019 11.070 1.00 50.10 321 A 1 +ATOM 2483 C CD . GLN A 1 321 ? -14.497 27.830 12.016 1.00 45.63 321 A 1 +ATOM 2484 O OE1 . GLN A 1 321 ? -14.371 27.451 13.170 1.00 43.37 321 A 1 +ATOM 2485 N NE2 . GLN A 1 321 ? -15.699 28.082 11.558 1.00 41.32 321 A 1 +ATOM 2486 N N . ALA A 1 322 ? -8.639 27.966 11.999 1.00 45.66 322 A 1 +ATOM 2487 C CA . ALA A 1 322 ? -7.494 28.157 12.877 1.00 45.11 322 A 1 +ATOM 2488 C C . ALA A 1 322 ? -6.338 28.952 12.256 1.00 45.24 322 A 1 +ATOM 2489 O O . ALA A 1 322 ? -5.283 29.063 12.881 1.00 43.68 322 A 1 +ATOM 2490 C CB . ALA A 1 322 ? -7.004 26.818 13.443 1.00 42.82 322 A 1 +ATOM 2491 N N . LEU A 1 323 ? -6.540 29.611 11.132 1.00 40.88 323 A 1 +ATOM 2492 C CA . LEU A 1 323 ? -5.812 30.853 10.856 1.00 41.00 323 A 1 +ATOM 2493 C C . LEU A 1 323 ? -5.890 31.824 12.048 1.00 41.41 323 A 1 +ATOM 2494 O O . LEU A 1 323 ? -4.953 32.565 12.284 1.00 40.33 323 A 1 +ATOM 2495 C CB . LEU A 1 323 ? -6.365 31.492 9.567 1.00 38.76 323 A 1 +ATOM 2496 C CG . LEU A 1 323 ? -5.577 31.078 8.316 1.00 35.28 323 A 1 +ATOM 2497 C CD1 . LEU A 1 323 ? -6.426 31.268 7.060 1.00 32.81 323 A 1 +ATOM 2498 C CD2 . LEU A 1 323 ? -4.315 31.946 8.165 1.00 35.53 323 A 1 +ATOM 2499 N N . SER A 1 324 ? -6.969 31.779 12.856 1.00 38.82 324 A 1 +ATOM 2500 C CA . SER A 1 324 ? -7.103 32.579 14.080 1.00 39.54 324 A 1 +ATOM 2501 C C . SER A 1 324 ? -6.571 31.899 15.352 1.00 40.25 324 A 1 +ATOM 2502 O O . SER A 1 324 ? -6.059 32.580 16.236 1.00 39.32 324 A 1 +ATOM 2503 C CB . SER A 1 324 ? -8.569 32.967 14.277 1.00 37.43 324 A 1 +ATOM 2504 O OG . SER A 1 324 ? -9.391 31.847 14.543 1.00 35.00 324 A 1 +ATOM 2505 N N . CYS A 1 325 ? -6.654 30.574 15.471 1.00 40.93 325 A 1 +ATOM 2506 C CA . CYS A 1 325 ? -6.316 29.850 16.706 1.00 41.36 325 A 1 +ATOM 2507 C C . CYS A 1 325 ? -4.840 29.421 16.832 1.00 41.06 325 A 1 +ATOM 2508 O O . CYS A 1 325 ? -4.533 28.496 17.572 1.00 40.19 325 A 1 +ATOM 2509 C CB . CYS A 1 325 ? -7.304 28.682 16.914 1.00 39.19 325 A 1 +ATOM 2510 S SG . CYS A 1 325 ? -8.895 29.300 17.526 1.00 36.02 325 A 1 +ATOM 2511 N N . ILE A 1 326 ? -3.931 30.115 16.169 1.00 39.00 326 A 1 +ATOM 2512 C CA . ILE A 1 326 ? -2.481 29.863 16.264 1.00 39.40 326 A 1 +ATOM 2513 C C . ILE A 1 326 ? -1.960 29.985 17.714 1.00 39.77 326 A 1 +ATOM 2514 O O . ILE A 1 326 ? -0.978 29.346 18.075 1.00 38.72 326 A 1 +ATOM 2515 C CB . ILE A 1 326 ? -1.723 30.830 15.306 1.00 37.39 326 A 1 +ATOM 2516 C CG1 . ILE A 1 326 ? -2.116 30.559 13.844 1.00 35.23 326 A 1 +ATOM 2517 C CG2 . ILE A 1 326 ? -0.195 30.723 15.465 1.00 35.79 326 A 1 +ATOM 2518 C CD1 . ILE A 1 326 ? -1.582 31.589 12.840 1.00 33.84 326 A 1 +ATOM 2519 N N . SER A 1 327 ? -2.612 30.772 18.552 1.00 35.63 327 A 1 +ATOM 2520 C CA . SER A 1 327 ? -2.081 31.157 19.870 1.00 36.53 327 A 1 +ATOM 2521 C C . SER A 1 327 ? -1.855 30.003 20.850 1.00 37.24 327 A 1 +ATOM 2522 O O . SER A 1 327 ? -0.970 30.104 21.698 1.00 35.83 327 A 1 +ATOM 2523 C CB . SER A 1 327 ? -3.003 32.190 20.520 1.00 33.91 327 A 1 +ATOM 2524 O OG . SER A 1 327 ? -4.272 31.636 20.773 1.00 31.53 327 A 1 +ATOM 2525 N N . PHE A 1 328 ? -2.663 28.940 20.798 1.00 36.56 328 A 1 +ATOM 2526 C CA . PHE A 1 328 ? -2.656 27.943 21.873 1.00 36.18 328 A 1 +ATOM 2527 C C . PHE A 1 328 ? -1.524 26.911 21.774 1.00 36.74 328 A 1 +ATOM 2528 O O . PHE A 1 328 ? -1.205 26.259 22.771 1.00 35.60 328 A 1 +ATOM 2529 C CB . PHE A 1 328 ? -4.046 27.285 21.998 1.00 33.87 328 A 1 +ATOM 2530 C CG . PHE A 1 328 ? -4.470 27.129 23.436 1.00 30.86 328 A 1 +ATOM 2531 C CD1 . PHE A 1 328 ? -4.129 25.982 24.180 1.00 28.70 328 A 1 +ATOM 2532 C CD2 . PHE A 1 328 ? -5.201 28.160 24.062 1.00 28.84 328 A 1 +ATOM 2533 C CE1 . PHE A 1 328 ? -4.519 25.873 25.522 1.00 27.07 328 A 1 +ATOM 2534 C CE2 . PHE A 1 328 ? -5.594 28.052 25.407 1.00 26.54 328 A 1 +ATOM 2535 C CZ . PHE A 1 328 ? -5.250 26.907 26.134 1.00 27.31 328 A 1 +ATOM 2536 N N . LEU A 1 329 ? -0.864 26.807 20.636 1.00 36.70 329 A 1 +ATOM 2537 C CA . LEU A 1 329 ? 0.311 25.937 20.430 1.00 37.27 329 A 1 +ATOM 2538 C C . LEU A 1 329 ? 1.596 26.465 21.114 1.00 37.35 329 A 1 +ATOM 2539 O O . LEU A 1 329 ? 2.693 26.039 20.788 1.00 36.04 329 A 1 +ATOM 2540 C CB . LEU A 1 329 ? 0.497 25.694 18.917 1.00 34.91 329 A 1 +ATOM 2541 C CG . LEU A 1 329 ? -0.449 24.620 18.346 1.00 31.95 329 A 1 +ATOM 2542 C CD1 . LEU A 1 329 ? -0.527 24.744 16.830 1.00 30.08 329 A 1 +ATOM 2543 C CD2 . LEU A 1 329 ? 0.056 23.213 18.678 1.00 31.43 329 A 1 +ATOM 2544 N N . SER A 1 330 ? 1.468 27.379 22.063 1.00 35.38 330 A 1 +ATOM 2545 C CA . SER A 1 330 ? 2.593 28.104 22.659 1.00 36.31 330 A 1 +ATOM 2546 C C . SER A 1 330 ? 3.609 27.237 23.419 1.00 37.51 330 A 1 +ATOM 2547 O O . SER A 1 330 ? 4.798 27.530 23.377 1.00 35.63 330 A 1 +ATOM 2548 C CB . SER A 1 330 ? 2.055 29.169 23.621 1.00 33.42 330 A 1 +ATOM 2549 O OG . SER A 1 330 ? 1.228 28.598 24.618 1.00 31.22 330 A 1 +ATOM 2550 N N . ARG A 1 331 ? 3.149 26.220 24.162 1.00 40.73 331 A 1 +ATOM 2551 C CA . ARG A 1 331 ? 4.021 25.500 25.105 1.00 41.11 331 A 1 +ATOM 2552 C C . ARG A 1 331 ? 4.787 24.334 24.495 1.00 42.23 331 A 1 +ATOM 2553 O O . ARG A 1 331 ? 5.766 23.898 25.098 1.00 39.50 331 A 1 +ATOM 2554 C CB . ARG A 1 331 ? 3.243 25.016 26.338 1.00 37.44 331 A 1 +ATOM 2555 C CG . ARG A 1 331 ? 3.023 26.129 27.359 1.00 34.37 331 A 1 +ATOM 2556 C CD . ARG A 1 331 ? 2.462 25.516 28.643 1.00 31.21 331 A 1 +ATOM 2557 N NE . ARG A 1 331 ? 2.225 26.526 29.679 1.00 28.40 331 A 1 +ATOM 2558 C CZ . ARG A 1 331 ? 1.738 26.296 30.891 1.00 25.80 331 A 1 +ATOM 2559 N NH1 . ARG A 1 331 ? 1.417 25.095 31.275 1.00 24.37 331 A 1 +ATOM 2560 N NH2 . ARG A 1 331 ? 1.565 27.273 31.734 1.00 22.74 331 A 1 +ATOM 2561 N N . VAL A 1 332 ? 4.333 23.816 23.379 1.00 46.68 332 A 1 +ATOM 2562 C CA . VAL A 1 332 ? 5.085 22.800 22.653 1.00 47.04 332 A 1 +ATOM 2563 C C . VAL A 1 332 ? 6.265 23.518 22.011 1.00 49.68 332 A 1 +ATOM 2564 O O . VAL A 1 332 ? 6.071 24.525 21.334 1.00 46.77 332 A 1 +ATOM 2565 C CB . VAL A 1 332 ? 4.205 22.079 21.624 1.00 42.53 332 A 1 +ATOM 2566 C CG1 . VAL A 1 332 ? 4.979 20.970 20.931 1.00 38.84 332 A 1 +ATOM 2567 C CG2 . VAL A 1 332 ? 2.985 21.431 22.310 1.00 38.30 332 A 1 +ATOM 2568 N N . SER A 1 333 ? 7.481 23.071 22.283 1.00 56.42 333 A 1 +ATOM 2569 C CA . SER A 1 333 ? 8.646 23.686 21.649 1.00 58.14 333 A 1 +ATOM 2570 C C . SER A 1 333 ? 8.482 23.584 20.133 1.00 62.62 333 A 1 +ATOM 2571 O O . SER A 1 333 ? 8.066 22.544 19.619 1.00 58.78 333 A 1 +ATOM 2572 C CB . SER A 1 333 ? 9.954 23.035 22.119 1.00 52.13 333 A 1 +ATOM 2573 O OG . SER A 1 333 ? 10.140 21.756 21.559 1.00 47.91 333 A 1 +ATOM 2574 N N . LYS A 1 334 ? 8.827 24.644 19.393 1.00 63.48 334 A 1 +ATOM 2575 C CA . LYS A 1 334 ? 8.690 24.658 17.923 1.00 66.62 334 A 1 +ATOM 2576 C C . LYS A 1 334 ? 9.335 23.447 17.255 1.00 72.81 334 A 1 +ATOM 2577 O O . LYS A 1 334 ? 8.857 22.982 16.224 1.00 68.25 334 A 1 +ATOM 2578 C CB . LYS A 1 334 ? 9.318 25.934 17.353 1.00 59.10 334 A 1 +ATOM 2579 C CG . LYS A 1 334 ? 8.467 27.179 17.585 1.00 50.96 334 A 1 +ATOM 2580 C CD . LYS A 1 334 ? 9.116 28.365 16.880 1.00 44.84 334 A 1 +ATOM 2581 C CE . LYS A 1 334 ? 8.240 29.613 16.980 1.00 38.46 334 A 1 +ATOM 2582 N NZ . LYS A 1 334 ? 8.845 30.744 16.247 1.00 33.27 334 A 1 +ATOM 2583 N N . GLY A 1 335 ? 10.404 22.913 17.836 1.00 72.37 335 A 1 +ATOM 2584 C CA . GLY A 1 335 ? 11.077 21.717 17.353 1.00 74.80 335 A 1 +ATOM 2585 C C . GLY A 1 335 ? 10.265 20.434 17.502 1.00 78.45 335 A 1 +ATOM 2586 O O . GLY A 1 335 ? 10.457 19.516 16.714 1.00 74.54 335 A 1 +ATOM 2587 N N . GLU A 1 336 ? 9.329 20.347 18.464 1.00 75.83 336 A 1 +ATOM 2588 C CA . GLU A 1 336 ? 8.531 19.130 18.661 1.00 77.04 336 A 1 +ATOM 2589 C C . GLU A 1 336 ? 7.583 18.861 17.480 1.00 79.38 336 A 1 +ATOM 2590 O O . GLU A 1 336 ? 7.382 17.711 17.096 1.00 76.27 336 A 1 +ATOM 2591 C CB . GLU A 1 336 ? 7.744 19.206 19.985 1.00 73.21 336 A 1 +ATOM 2592 C CG . GLU A 1 336 ? 7.142 17.845 20.372 1.00 67.41 336 A 1 +ATOM 2593 C CD . GLU A 1 336 ? 6.277 17.875 21.631 1.00 62.36 336 A 1 +ATOM 2594 O OE1 . GLU A 1 336 ? 5.431 16.968 21.776 1.00 55.60 336 A 1 +ATOM 2595 O OE2 . GLU A 1 336 ? 6.433 18.783 22.473 1.00 57.70 336 A 1 +ATOM 2596 N N . GLU A 1 337 ? 7.061 19.921 16.845 1.00 76.44 337 A 1 +ATOM 2597 C CA . GLU A 1 337 ? 6.176 19.800 15.681 1.00 76.95 337 A 1 +ATOM 2598 C C . GLU A 1 337 ? 6.863 19.106 14.498 1.00 79.84 337 A 1 +ATOM 2599 O O . GLU A 1 337 ? 6.210 18.388 13.740 1.00 76.97 337 A 1 +ATOM 2600 C CB . GLU A 1 337 ? 5.674 21.177 15.234 1.00 71.92 337 A 1 +ATOM 2601 C CG . GLU A 1 337 ? 4.755 21.847 16.272 1.00 62.58 337 A 1 +ATOM 2602 C CD . GLU A 1 337 ? 4.153 23.174 15.786 1.00 55.05 337 A 1 +ATOM 2603 O OE1 . GLU A 1 337 ? 3.251 23.677 16.492 1.00 47.08 337 A 1 +ATOM 2604 O OE2 . GLU A 1 337 ? 4.593 23.701 14.740 1.00 49.22 337 A 1 +ATOM 2605 N N . LEU A 1 338 ? 8.177 19.233 14.371 1.00 81.97 338 A 1 +ATOM 2606 C CA . LEU A 1 338 ? 8.959 18.577 13.331 1.00 83.30 338 A 1 +ATOM 2607 C C . LEU A 1 338 ? 8.986 17.049 13.481 1.00 85.46 338 A 1 +ATOM 2608 O O . LEU A 1 338 ? 9.279 16.341 12.518 1.00 82.72 338 A 1 +ATOM 2609 C CB . LEU A 1 338 ? 10.395 19.134 13.346 1.00 81.66 338 A 1 +ATOM 2610 C CG . LEU A 1 338 ? 10.507 20.651 13.103 1.00 79.25 338 A 1 +ATOM 2611 C CD1 . LEU A 1 338 ? 11.950 21.098 13.319 1.00 72.89 338 A 1 +ATOM 2612 C CD2 . LEU A 1 338 ? 10.093 21.024 11.681 1.00 72.85 338 A 1 +ATOM 2613 N N . PHE A 1 339 ? 8.665 16.534 14.666 1.00 85.19 339 A 1 +ATOM 2614 C CA . PHE A 1 339 ? 8.707 15.107 15.005 1.00 86.18 339 A 1 +ATOM 2615 C C . PHE A 1 339 ? 7.317 14.472 15.159 1.00 85.69 339 A 1 +ATOM 2616 O O . PHE A 1 339 ? 7.211 13.361 15.687 1.00 81.02 339 A 1 +ATOM 2617 C CB . PHE A 1 339 ? 9.557 14.912 16.257 1.00 86.14 339 A 1 +ATOM 2618 C CG . PHE A 1 339 ? 11.008 15.304 16.087 1.00 87.94 339 A 1 +ATOM 2619 C CD1 . PHE A 1 339 ? 11.940 14.378 15.591 1.00 80.65 339 A 1 +ATOM 2620 C CD2 . PHE A 1 339 ? 11.436 16.606 16.417 1.00 80.80 339 A 1 +ATOM 2621 C CE1 . PHE A 1 339 ? 13.287 14.737 15.433 1.00 79.98 339 A 1 +ATOM 2622 C CE2 . PHE A 1 339 ? 12.778 16.973 16.255 1.00 80.05 339 A 1 +ATOM 2623 C CZ . PHE A 1 339 ? 13.700 16.035 15.766 1.00 86.89 339 A 1 +ATOM 2624 N N . THR A 1 340 ? 6.250 15.156 14.713 1.00 86.06 340 A 1 +ATOM 2625 C CA . THR A 1 340 ? 4.873 14.643 14.829 1.00 82.34 340 A 1 +ATOM 2626 C C . THR A 1 340 ? 4.582 13.443 13.922 1.00 80.58 340 A 1 +ATOM 2627 O O . THR A 1 340 ? 3.652 12.681 14.182 1.00 72.45 340 A 1 +ATOM 2628 C CB . THR A 1 340 ? 3.845 15.732 14.507 1.00 78.52 340 A 1 +ATOM 2629 O OG1 . THR A 1 340 ? 4.105 16.322 13.262 1.00 70.88 340 A 1 +ATOM 2630 C CG2 . THR A 1 340 ? 3.829 16.831 15.566 1.00 67.57 340 A 1 +ATOM 2631 N N . GLY A 1 341 ? 5.378 13.266 12.868 1.00 82.63 341 A 1 +ATOM 2632 C CA . GLY A 1 341 ? 5.258 12.171 11.918 1.00 82.86 341 A 1 +ATOM 2633 C C . GLY A 1 341 ? 6.557 11.394 11.757 1.00 85.41 341 A 1 +ATOM 2634 O O . GLY A 1 341 ? 7.529 11.593 12.489 1.00 82.27 341 A 1 +ATOM 2635 N N . VAL A 1 342 ? 6.573 10.519 10.763 1.00 87.03 342 A 1 +ATOM 2636 C CA . VAL A 1 342 ? 7.794 9.812 10.367 1.00 87.70 342 A 1 +ATOM 2637 C C . VAL A 1 342 ? 8.737 10.795 9.679 1.00 88.37 342 A 1 +ATOM 2638 O O . VAL A 1 342 ? 8.374 11.427 8.691 1.00 85.49 342 A 1 +ATOM 2639 C CB . VAL A 1 342 ? 7.478 8.619 9.450 1.00 85.27 342 A 1 +ATOM 2640 C CG1 . VAL A 1 342 ? 8.745 7.869 9.059 1.00 76.08 342 A 1 +ATOM 2641 C CG2 . VAL A 1 342 ? 6.548 7.615 10.150 1.00 74.86 342 A 1 +ATOM 2642 N N . VAL A 1 343 ? 9.949 10.914 10.218 1.00 89.91 343 A 1 +ATOM 2643 C CA . VAL A 1 343 ? 10.996 11.800 9.710 1.00 90.30 343 A 1 +ATOM 2644 C C . VAL A 1 343 ? 12.098 10.954 9.084 1.00 91.11 343 A 1 +ATOM 2645 O O . VAL A 1 343 ? 12.589 10.019 9.719 1.00 89.74 343 A 1 +ATOM 2646 C CB . VAL A 1 343 ? 11.550 12.698 10.830 1.00 88.89 343 A 1 +ATOM 2647 C CG1 . VAL A 1 343 ? 12.662 13.616 10.320 1.00 81.25 343 A 1 +ATOM 2648 C CG2 . VAL A 1 343 ? 10.451 13.585 11.421 1.00 80.48 343 A 1 +ATOM 2649 N N . PRO A 1 344 ? 12.516 11.250 7.846 1.00 90.93 344 A 1 +ATOM 2650 C CA . PRO A 1 344 ? 13.662 10.591 7.248 1.00 90.94 344 A 1 +ATOM 2651 C C . PRO A 1 344 ? 14.960 10.973 7.974 1.00 91.34 344 A 1 +ATOM 2652 O O . PRO A 1 344 ? 15.168 12.135 8.331 1.00 89.99 344 A 1 +ATOM 2653 C CB . PRO A 1 344 ? 13.665 11.038 5.792 1.00 89.35 344 A 1 +ATOM 2654 C CG . PRO A 1 344 ? 12.913 12.363 5.788 1.00 86.30 344 A 1 +ATOM 2655 C CD . PRO A 1 344 ? 11.923 12.213 6.930 1.00 89.07 344 A 1 +ATOM 2656 N N . ILE A 1 345 ? 15.835 9.992 8.144 1.00 92.48 345 A 1 +ATOM 2657 C CA . ILE A 1 345 ? 17.134 10.152 8.801 1.00 92.75 345 A 1 +ATOM 2658 C C . ILE A 1 345 ? 18.240 9.827 7.811 1.00 92.44 345 A 1 +ATOM 2659 O O . ILE A 1 345 ? 18.195 8.815 7.115 1.00 90.39 345 A 1 +ATOM 2660 C CB . ILE A 1 345 ? 17.245 9.269 10.059 1.00 91.91 345 A 1 +ATOM 2661 C CG1 . ILE A 1 345 ? 16.075 9.500 11.044 1.00 86.56 345 A 1 +ATOM 2662 C CG2 . ILE A 1 345 ? 18.584 9.549 10.781 1.00 85.49 345 A 1 +ATOM 2663 C CD1 . ILE A 1 345 ? 16.029 8.481 12.182 1.00 84.02 345 A 1 +ATOM 2664 N N . LEU A 1 346 ? 19.271 10.659 7.808 1.00 92.63 346 A 1 +ATOM 2665 C CA . LEU A 1 346 ? 20.551 10.416 7.172 1.00 92.38 346 A 1 +ATOM 2666 C C . LEU A 1 346 ? 21.644 10.431 8.243 1.00 92.41 346 A 1 +ATOM 2667 O O . LEU A 1 346 ? 21.727 11.364 9.032 1.00 90.99 346 A 1 +ATOM 2668 C CB . LEU A 1 346 ? 20.783 11.502 6.105 1.00 91.27 346 A 1 +ATOM 2669 C CG . LEU A 1 346 ? 22.186 11.471 5.474 1.00 84.96 346 A 1 +ATOM 2670 C CD1 . LEU A 1 346 ? 22.456 10.168 4.729 1.00 76.55 346 A 1 +ATOM 2671 C CD2 . LEU A 1 346 ? 22.330 12.635 4.490 1.00 75.50 346 A 1 +ATOM 2672 N N . VAL A 1 347 ? 22.495 9.415 8.240 1.00 93.10 347 A 1 +ATOM 2673 C CA . VAL A 1 347 ? 23.662 9.354 9.124 1.00 92.78 347 A 1 +ATOM 2674 C C . VAL A 1 347 ? 24.914 9.186 8.276 1.00 92.84 347 A 1 +ATOM 2675 O O . VAL A 1 347 ? 24.993 8.271 7.460 1.00 91.56 347 A 1 +ATOM 2676 C CB . VAL A 1 347 ? 23.544 8.233 10.170 1.00 91.72 347 A 1 +ATOM 2677 C CG1 . VAL A 1 347 ? 24.690 8.295 11.175 1.00 84.65 347 A 1 +ATOM 2678 C CG2 . VAL A 1 347 ? 22.220 8.321 10.952 1.00 83.89 347 A 1 +ATOM 2679 N N . GLU A 1 348 ? 25.907 10.046 8.478 1.00 92.76 348 A 1 +ATOM 2680 C CA . GLU A 1 348 ? 27.227 9.940 7.872 1.00 92.65 348 A 1 +ATOM 2681 C C . GLU A 1 348 ? 28.283 9.931 8.971 1.00 92.72 348 A 1 +ATOM 2682 O O . GLU A 1 348 ? 28.309 10.821 9.821 1.00 91.08 348 A 1 +ATOM 2683 C CB . GLU A 1 348 ? 27.482 11.074 6.869 1.00 91.36 348 A 1 +ATOM 2684 C CG . GLU A 1 348 ? 26.605 10.950 5.607 1.00 83.65 348 A 1 +ATOM 2685 C CD . GLU A 1 348 ? 26.887 12.022 4.543 1.00 78.82 348 A 1 +ATOM 2686 O OE1 . GLU A 1 348 ? 26.441 11.820 3.389 1.00 68.10 348 A 1 +ATOM 2687 O OE2 . GLU A 1 348 ? 27.499 13.060 4.865 1.00 69.87 348 A 1 +ATOM 2688 N N . LEU A 1 349 ? 29.134 8.907 8.950 1.00 93.31 349 A 1 +ATOM 2689 C CA . LEU A 1 349 ? 30.227 8.777 9.906 1.00 93.53 349 A 1 +ATOM 2690 C C . LEU A 1 349 ? 31.539 8.558 9.161 1.00 93.71 349 A 1 +ATOM 2691 O O . LEU A 1 349 ? 31.657 7.606 8.388 1.00 92.09 349 A 1 +ATOM 2692 C CB . LEU A 1 349 ? 29.893 7.659 10.910 1.00 92.60 349 A 1 +ATOM 2693 C CG . LEU A 1 349 ? 31.018 7.347 11.929 1.00 92.09 349 A 1 +ATOM 2694 C CD1 . LEU A 1 349 ? 30.417 6.844 13.240 1.00 82.06 349 A 1 +ATOM 2695 C CD2 . LEU A 1 349 ? 31.978 6.259 11.458 1.00 82.30 349 A 1 +ATOM 2696 N N . ASP A 1 350 ? 32.538 9.384 9.455 1.00 93.32 350 A 1 +ATOM 2697 C CA . ASP A 1 350 ? 33.932 9.138 9.111 1.00 93.35 350 A 1 +ATOM 2698 C C . ASP A 1 350 ? 34.704 8.774 10.374 1.00 93.04 350 A 1 +ATOM 2699 O O . ASP A 1 350 ? 34.664 9.485 11.381 1.00 90.59 350 A 1 +ATOM 2700 C CB . ASP A 1 350 ? 34.529 10.346 8.374 1.00 92.14 350 A 1 +ATOM 2701 C CG . ASP A 1 350 ? 34.032 10.462 6.934 1.00 87.00 350 A 1 +ATOM 2702 O OD1 . ASP A 1 350 ? 33.964 9.411 6.250 1.00 78.98 350 A 1 +ATOM 2703 O OD2 . ASP A 1 350 ? 33.768 11.596 6.497 1.00 77.44 350 A 1 +ATOM 2704 N N . GLY A 1 351 ? 35.382 7.636 10.336 1.00 93.58 351 A 1 +ATOM 2705 C CA . GLY A 1 351 ? 36.085 7.072 11.472 1.00 93.07 351 A 1 +ATOM 2706 C C . GLY A 1 351 ? 37.558 6.785 11.197 1.00 93.82 351 A 1 +ATOM 2707 O O . GLY A 1 351 ? 37.949 6.428 10.091 1.00 91.60 351 A 1 +ATOM 2708 N N . ASP A 1 352 ? 38.364 6.899 12.252 1.00 93.68 352 A 1 +ATOM 2709 C CA . ASP A 1 352 ? 39.775 6.529 12.279 1.00 94.08 352 A 1 +ATOM 2710 C C . ASP A 1 352 ? 40.061 5.855 13.633 1.00 93.98 352 A 1 +ATOM 2711 O O . ASP A 1 352 ? 40.077 6.522 14.671 1.00 90.59 352 A 1 +ATOM 2712 C CB . ASP A 1 352 ? 40.627 7.788 12.051 1.00 92.26 352 A 1 +ATOM 2713 C CG . ASP A 1 352 ? 42.149 7.566 12.029 1.00 89.82 352 A 1 +ATOM 2714 O OD1 . ASP A 1 352 ? 42.637 6.505 12.463 1.00 80.71 352 A 1 +ATOM 2715 O OD2 . ASP A 1 352 ? 42.846 8.506 11.587 1.00 79.33 352 A 1 +ATOM 2716 N N . VAL A 1 353 ? 40.248 4.535 13.627 1.00 93.54 353 A 1 +ATOM 2717 C CA . VAL A 1 353 ? 40.539 3.740 14.821 1.00 93.43 353 A 1 +ATOM 2718 C C . VAL A 1 353 ? 41.916 3.116 14.669 1.00 93.13 353 A 1 +ATOM 2719 O O . VAL A 1 353 ? 42.122 2.300 13.777 1.00 90.79 353 A 1 +ATOM 2720 C CB . VAL A 1 353 ? 39.464 2.666 15.066 1.00 92.63 353 A 1 +ATOM 2721 C CG1 . VAL A 1 353 ? 39.785 1.835 16.310 1.00 85.12 353 A 1 +ATOM 2722 C CG2 . VAL A 1 353 ? 38.088 3.309 15.285 1.00 84.15 353 A 1 +ATOM 2723 N N . ASN A 1 354 ? 42.880 3.510 15.514 1.00 92.98 354 A 1 +ATOM 2724 C CA . ASN A 1 354 ? 44.278 3.087 15.410 1.00 92.47 354 A 1 +ATOM 2725 C C . ASN A 1 354 ? 44.894 3.295 14.004 1.00 92.39 354 A 1 +ATOM 2726 O O . ASN A 1 354 ? 45.727 2.524 13.556 1.00 87.08 354 A 1 +ATOM 2727 C CB . ASN A 1 354 ? 44.438 1.642 15.922 1.00 90.98 354 A 1 +ATOM 2728 C CG . ASN A 1 354 ? 44.597 1.515 17.424 1.00 90.28 354 A 1 +ATOM 2729 O OD1 . ASN A 1 354 ? 44.295 2.384 18.208 1.00 80.86 354 A 1 +ATOM 2730 N ND2 . ASN A 1 354 ? 45.112 0.377 17.861 1.00 81.24 354 A 1 +ATOM 2731 N N . GLY A 1 355 ? 44.445 4.319 13.270 1.00 91.86 355 A 1 +ATOM 2732 C CA . GLY A 1 355 ? 44.859 4.567 11.886 1.00 91.24 355 A 1 +ATOM 2733 C C . GLY A 1 355 ? 44.059 3.804 10.827 1.00 92.22 355 A 1 +ATOM 2734 O O . GLY A 1 355 ? 44.172 4.135 9.639 1.00 88.36 355 A 1 +ATOM 2735 N N . HIS A 1 356 ? 43.206 2.840 11.208 1.00 92.84 356 A 1 +ATOM 2736 C CA . HIS A 1 356 ? 42.258 2.185 10.307 1.00 91.89 356 A 1 +ATOM 2737 C C . HIS A 1 356 ? 41.105 3.141 9.996 1.00 92.68 356 A 1 +ATOM 2738 O O . HIS A 1 356 ? 40.226 3.369 10.825 1.00 90.63 356 A 1 +ATOM 2739 C CB . HIS A 1 356 ? 41.743 0.883 10.922 1.00 90.63 356 A 1 +ATOM 2740 C CG . HIS A 1 356 ? 42.817 -0.136 11.169 1.00 89.04 356 A 1 +ATOM 2741 N ND1 . HIS A 1 356 ? 43.474 -0.897 10.212 1.00 77.01 356 A 1 +ATOM 2742 C CD2 . HIS A 1 356 ? 43.331 -0.486 12.391 1.00 77.05 356 A 1 +ATOM 2743 C CE1 . HIS A 1 356 ? 44.349 -1.678 10.854 1.00 79.40 356 A 1 +ATOM 2744 N NE2 . HIS A 1 356 ? 44.289 -1.461 12.169 1.00 80.45 356 A 1 +ATOM 2745 N N . LYS A 1 357 ? 41.104 3.699 8.781 1.00 92.11 357 A 1 +ATOM 2746 C CA . LYS A 1 357 ? 40.065 4.627 8.329 1.00 92.59 357 A 1 +ATOM 2747 C C . LYS A 1 357 ? 38.884 3.894 7.718 1.00 92.43 357 A 1 +ATOM 2748 O O . LYS A 1 357 ? 39.062 2.937 6.951 1.00 89.82 357 A 1 +ATOM 2749 C CB . LYS A 1 357 ? 40.634 5.655 7.347 1.00 91.27 357 A 1 +ATOM 2750 C CG . LYS A 1 357 ? 41.679 6.537 8.039 1.00 86.70 357 A 1 +ATOM 2751 C CD . LYS A 1 357 ? 42.114 7.680 7.140 1.00 81.17 357 A 1 +ATOM 2752 C CE . LYS A 1 357 ? 43.118 8.527 7.917 1.00 72.15 357 A 1 +ATOM 2753 N NZ . LYS A 1 357 ? 43.451 9.765 7.197 1.00 62.91 357 A 1 +ATOM 2754 N N . PHE A 1 358 ? 37.688 4.371 8.000 1.00 93.85 358 A 1 +ATOM 2755 C CA . PHE A 1 358 ? 36.449 3.841 7.444 1.00 94.13 358 A 1 +ATOM 2756 C C . PHE A 1 358 ? 35.383 4.926 7.390 1.00 94.46 358 A 1 +ATOM 2757 O O . PHE A 1 358 ? 35.406 5.874 8.174 1.00 92.75 358 A 1 +ATOM 2758 C CB . PHE A 1 358 ? 35.977 2.642 8.278 1.00 93.34 358 A 1 +ATOM 2759 C CG . PHE A 1 358 ? 35.651 2.961 9.725 1.00 93.90 358 A 1 +ATOM 2760 C CD1 . PHE A 1 358 ? 36.663 2.952 10.704 1.00 86.45 358 A 1 +ATOM 2761 C CD2 . PHE A 1 358 ? 34.333 3.262 10.110 1.00 86.55 358 A 1 +ATOM 2762 C CE1 . PHE A 1 358 ? 36.370 3.239 12.046 1.00 86.32 358 A 1 +ATOM 2763 C CE2 . PHE A 1 358 ? 34.032 3.551 11.448 1.00 85.28 358 A 1 +ATOM 2764 C CZ . PHE A 1 358 ? 35.042 3.541 12.419 1.00 91.38 358 A 1 +ATOM 2765 N N . SER A 1 359 ? 34.439 4.751 6.489 1.00 93.35 359 A 1 +ATOM 2766 C CA . SER A 1 359 ? 33.247 5.586 6.416 1.00 93.19 359 A 1 +ATOM 2767 C C . SER A 1 359 ? 31.994 4.715 6.486 1.00 92.85 359 A 1 +ATOM 2768 O O . SER A 1 359 ? 31.955 3.614 5.929 1.00 90.85 359 A 1 +ATOM 2769 C CB . SER A 1 359 ? 33.242 6.462 5.157 1.00 92.40 359 A 1 +ATOM 2770 O OG . SER A 1 359 ? 34.408 7.257 5.076 1.00 84.47 359 A 1 +ATOM 2771 N N . VAL A 1 360 ? 30.970 5.207 7.167 1.00 93.75 360 A 1 +ATOM 2772 C CA . VAL A 1 360 ? 29.658 4.574 7.273 1.00 93.41 360 A 1 +ATOM 2773 C C . VAL A 1 360 ? 28.599 5.568 6.823 1.00 93.20 360 A 1 +ATOM 2774 O O . VAL A 1 360 ? 28.582 6.705 7.284 1.00 91.77 360 A 1 +ATOM 2775 C CB . VAL A 1 360 ? 29.382 4.074 8.705 1.00 92.55 360 A 1 +ATOM 2776 C CG1 . VAL A 1 360 ? 27.980 3.481 8.857 1.00 84.89 360 A 1 +ATOM 2777 C CG2 . VAL A 1 360 ? 30.386 2.989 9.113 1.00 83.71 360 A 1 +ATOM 2778 N N . SER A 1 361 ? 27.709 5.138 5.942 1.00 93.53 361 A 1 +ATOM 2779 C CA . SER A 1 361 ? 26.514 5.886 5.562 1.00 92.84 361 A 1 +ATOM 2780 C C . SER A 1 361 ? 25.281 5.113 6.015 1.00 92.75 361 A 1 +ATOM 2781 O O . SER A 1 361 ? 25.194 3.902 5.793 1.00 90.81 361 A 1 +ATOM 2782 C CB . SER A 1 361 ? 26.493 6.136 4.056 1.00 91.38 361 A 1 +ATOM 2783 O OG . SER A 1 361 ? 25.413 6.973 3.710 1.00 78.17 361 A 1 +ATOM 2784 N N . GLY A 1 362 ? 24.352 5.794 6.663 1.00 92.35 362 A 1 +ATOM 2785 C CA . GLY A 1 362 ? 23.108 5.232 7.155 1.00 91.64 362 A 1 +ATOM 2786 C C . GLY A 1 362 ? 21.899 6.013 6.677 1.00 92.35 362 A 1 +ATOM 2787 O O . GLY A 1 362 ? 21.890 7.234 6.667 1.00 90.30 362 A 1 +ATOM 2788 N N . GLU A 1 363 ? 20.864 5.276 6.293 1.00 91.63 363 A 1 +ATOM 2789 C CA . GLU A 1 363 ? 19.581 5.819 5.858 1.00 91.48 363 A 1 +ATOM 2790 C C . GLU A 1 363 ? 18.455 5.111 6.602 1.00 91.35 363 A 1 +ATOM 2791 O O . GLU A 1 363 ? 18.522 3.903 6.861 1.00 88.24 363 A 1 +ATOM 2792 C CB . GLU A 1 363 ? 19.402 5.640 4.340 1.00 87.99 363 A 1 +ATOM 2793 C CG . GLU A 1 363 ? 20.416 6.439 3.503 1.00 76.40 363 A 1 +ATOM 2794 C CD . GLU A 1 363 ? 20.272 6.172 1.991 1.00 74.21 363 A 1 +ATOM 2795 O OE1 . GLU A 1 363 ? 21.306 6.186 1.285 1.00 65.10 363 A 1 +ATOM 2796 O OE2 . GLU A 1 363 ? 19.137 5.928 1.519 1.00 66.74 363 A 1 +ATOM 2797 N N . GLY A 1 364 ? 17.404 5.855 6.937 1.00 90.89 364 A 1 +ATOM 2798 C CA . GLY A 1 364 ? 16.262 5.278 7.606 1.00 90.53 364 A 1 +ATOM 2799 C C . GLY A 1 364 ? 15.174 6.293 7.931 1.00 91.70 364 A 1 +ATOM 2800 O O . GLY A 1 364 ? 15.089 7.363 7.342 1.00 89.66 364 A 1 +ATOM 2801 N N . GLU A 1 365 ? 14.340 5.917 8.880 1.00 90.62 365 A 1 +ATOM 2802 C CA . GLU A 1 365 ? 13.233 6.722 9.363 1.00 90.58 365 A 1 +ATOM 2803 C C . GLU A 1 365 ? 13.150 6.670 10.891 1.00 90.45 365 A 1 +ATOM 2804 O O . GLU A 1 365 ? 13.471 5.650 11.519 1.00 87.80 365 A 1 +ATOM 2805 C CB . GLU A 1 365 ? 11.918 6.294 8.690 1.00 87.31 365 A 1 +ATOM 2806 C CG . GLU A 1 365 ? 11.538 4.827 8.929 1.00 79.07 365 A 1 +ATOM 2807 C CD . GLU A 1 365 ? 10.230 4.398 8.238 1.00 78.71 365 A 1 +ATOM 2808 O OE1 . GLU A 1 365 ? 9.618 3.417 8.726 1.00 68.84 365 A 1 +ATOM 2809 O OE2 . GLU A 1 365 ? 9.847 5.029 7.231 1.00 71.65 365 A 1 +ATOM 2810 N N . GLY A 1 366 ? 12.719 7.783 11.476 1.00 90.48 366 A 1 +ATOM 2811 C CA . GLY A 1 366 ? 12.419 7.887 12.888 1.00 90.00 366 A 1 +ATOM 2812 C C . GLY A 1 366 ? 10.982 8.324 13.115 1.00 90.31 366 A 1 +ATOM 2813 O O . GLY A 1 366 ? 10.477 9.226 12.443 1.00 88.08 366 A 1 +ATOM 2814 N N . ASP A 1 367 ? 10.326 7.696 14.077 1.00 89.54 367 A 1 +ATOM 2815 C CA . ASP A 1 367 ? 8.978 8.043 14.527 1.00 88.90 367 A 1 +ATOM 2816 C C . ASP A 1 367 ? 9.008 8.327 16.034 1.00 88.92 367 A 1 +ATOM 2817 O O . ASP A 1 367 ? 8.926 7.420 16.868 1.00 85.76 367 A 1 +ATOM 2818 C CB . ASP A 1 367 ? 7.991 6.940 14.136 1.00 86.15 367 A 1 +ATOM 2819 C CG . ASP A 1 367 ? 6.531 7.312 14.435 1.00 82.36 367 A 1 +ATOM 2820 O OD1 . ASP A 1 367 ? 6.289 8.262 15.222 1.00 73.77 367 A 1 +ATOM 2821 O OD2 . ASP A 1 367 ? 5.645 6.620 13.887 1.00 74.57 367 A 1 +ATOM 2822 N N . ALA A 1 368 ? 9.150 9.605 16.379 1.00 88.22 368 A 1 +ATOM 2823 C CA . ALA A 1 368 ? 9.253 10.042 17.772 1.00 88.06 368 A 1 +ATOM 2824 C C . ALA A 1 368 ? 7.981 9.775 18.582 1.00 88.14 368 A 1 +ATOM 2825 O O . ALA A 1 368 ? 8.048 9.643 19.807 1.00 85.53 368 A 1 +ATOM 2826 C CB . ALA A 1 368 ? 9.618 11.529 17.785 1.00 86.96 368 A 1 +ATOM 2827 N N . THR A 1 369 ? 6.826 9.636 17.926 1.00 87.26 369 A 1 +ATOM 2828 C CA . THR A 1 369 ? 5.545 9.327 18.588 1.00 85.22 369 A 1 +ATOM 2829 C C . THR A 1 369 ? 5.576 7.939 19.238 1.00 85.59 369 A 1 +ATOM 2830 O O . THR A 1 369 ? 5.000 7.731 20.301 1.00 82.90 369 A 1 +ATOM 2831 C CB . THR A 1 369 ? 4.379 9.384 17.588 1.00 82.88 369 A 1 +ATOM 2832 O OG1 . THR A 1 369 ? 4.489 10.517 16.757 1.00 74.12 369 A 1 +ATOM 2833 C CG2 . THR A 1 369 ? 3.035 9.482 18.291 1.00 70.18 369 A 1 +ATOM 2834 N N . TYR A 1 370 ? 6.292 7.006 18.607 1.00 85.93 370 A 1 +ATOM 2835 C CA . TYR A 1 370 ? 6.498 5.643 19.101 1.00 84.90 370 A 1 +ATOM 2836 C C . TYR A 1 370 ? 7.893 5.436 19.697 1.00 85.67 370 A 1 +ATOM 2837 O O . TYR A 1 370 ? 8.176 4.358 20.211 1.00 82.58 370 A 1 +ATOM 2838 C CB . TYR A 1 370 ? 6.214 4.656 17.959 1.00 82.55 370 A 1 +ATOM 2839 C CG . TYR A 1 370 ? 4.772 4.664 17.493 1.00 78.94 370 A 1 +ATOM 2840 C CD1 . TYR A 1 370 ? 3.854 3.740 18.028 1.00 71.61 370 A 1 +ATOM 2841 C CD2 . TYR A 1 370 ? 4.329 5.612 16.553 1.00 70.79 370 A 1 +ATOM 2842 C CE1 . TYR A 1 370 ? 2.509 3.761 17.623 1.00 67.73 370 A 1 +ATOM 2843 C CE2 . TYR A 1 370 ? 2.989 5.649 16.146 1.00 66.85 370 A 1 +ATOM 2844 C CZ . TYR A 1 370 ? 2.073 4.717 16.680 1.00 69.42 370 A 1 +ATOM 2845 O OH . TYR A 1 370 ? 0.760 4.747 16.295 1.00 66.65 370 A 1 +ATOM 2846 N N . GLY A 1 371 ? 8.760 6.437 19.621 1.00 86.75 371 A 1 +ATOM 2847 C CA . GLY A 1 371 ? 10.175 6.324 19.988 1.00 87.08 371 A 1 +ATOM 2848 C C . GLY A 1 371 ? 10.923 5.309 19.125 1.00 88.28 371 A 1 +ATOM 2849 O O . GLY A 1 371 ? 11.851 4.668 19.609 1.00 85.71 371 A 1 +ATOM 2850 N N . LYS A 1 372 ? 10.500 5.134 17.876 1.00 89.27 372 A 1 +ATOM 2851 C CA . LYS A 1 372 ? 10.989 4.082 16.981 1.00 89.49 372 A 1 +ATOM 2852 C C . LYS A 1 372 ? 11.978 4.636 15.960 1.00 89.69 372 A 1 +ATOM 2853 O O . LYS A 1 372 ? 11.691 5.598 15.267 1.00 88.04 372 A 1 +ATOM 2854 C CB . LYS A 1 372 ? 9.782 3.408 16.305 1.00 86.94 372 A 1 +ATOM 2855 C CG . LYS A 1 372 ? 10.192 2.220 15.418 1.00 82.76 372 A 1 +ATOM 2856 C CD . LYS A 1 372 ? 8.991 1.696 14.637 1.00 80.38 372 A 1 +ATOM 2857 C CE . LYS A 1 372 ? 9.455 0.623 13.656 1.00 72.84 372 A 1 +ATOM 2858 N NZ . LYS A 1 372 ? 8.483 0.434 12.553 1.00 66.18 372 A 1 +ATOM 2859 N N . LEU A 1 373 ? 13.110 3.958 15.833 1.00 89.24 373 A 1 +ATOM 2860 C CA . LEU A 1 373 ? 14.121 4.209 14.820 1.00 89.45 373 A 1 +ATOM 2861 C C . LEU A 1 373 ? 14.290 2.961 13.963 1.00 89.88 373 A 1 +ATOM 2862 O O . LEU A 1 373 ? 14.410 1.856 14.490 1.00 87.65 373 A 1 +ATOM 2863 C CB . LEU A 1 373 ? 15.441 4.584 15.512 1.00 87.74 373 A 1 +ATOM 2864 C CG . LEU A 1 373 ? 15.387 5.945 16.228 1.00 85.51 373 A 1 +ATOM 2865 C CD1 . LEU A 1 373 ? 16.522 6.059 17.241 1.00 75.68 373 A 1 +ATOM 2866 C CD2 . LEU A 1 373 ? 15.543 7.077 15.225 1.00 75.44 373 A 1 +ATOM 2867 N N . THR A 1 374 ? 14.317 3.121 12.648 1.00 90.57 374 A 1 +ATOM 2868 C CA . THR A 1 374 ? 14.608 2.038 11.702 1.00 90.14 374 A 1 +ATOM 2869 C C . THR A 1 374 ? 15.659 2.532 10.729 1.00 90.44 374 A 1 +ATOM 2870 O O . THR A 1 374 ? 15.392 3.436 9.947 1.00 88.39 374 A 1 +ATOM 2871 C CB . THR A 1 374 ? 13.352 1.580 10.943 1.00 87.95 374 A 1 +ATOM 2872 O OG1 . THR A 1 374 ? 12.253 1.432 11.812 1.00 74.34 374 A 1 +ATOM 2873 C CG2 . THR A 1 374 ? 13.569 0.230 10.270 1.00 71.66 374 A 1 +ATOM 2874 N N . LEU A 1 375 ? 16.865 1.952 10.792 1.00 90.88 375 A 1 +ATOM 2875 C CA . LEU A 1 375 ? 18.020 2.433 10.036 1.00 91.30 375 A 1 +ATOM 2876 C C . LEU A 1 375 ? 18.786 1.269 9.413 1.00 91.73 375 A 1 +ATOM 2877 O O . LEU A 1 375 ? 18.912 0.195 10.000 1.00 90.01 375 A 1 +ATOM 2878 C CB . LEU A 1 375 ? 18.915 3.270 10.964 1.00 90.34 375 A 1 +ATOM 2879 C CG . LEU A 1 375 ? 18.352 4.678 11.232 1.00 88.27 375 A 1 +ATOM 2880 C CD1 . LEU A 1 375 ? 18.685 5.164 12.630 1.00 78.00 375 A 1 +ATOM 2881 C CD2 . LEU A 1 375 ? 18.916 5.690 10.238 1.00 77.95 375 A 1 +ATOM 2882 N N . LYS A 1 376 ? 19.335 1.507 8.219 1.00 92.23 376 A 1 +ATOM 2883 C CA . LYS A 1 376 ? 20.306 0.625 7.578 1.00 92.65 376 A 1 +ATOM 2884 C C . LYS A 1 376 ? 21.618 1.383 7.396 1.00 92.79 376 A 1 +ATOM 2885 O O . LYS A 1 376 ? 21.642 2.414 6.741 1.00 91.15 376 A 1 +ATOM 2886 C CB . LYS A 1 376 ? 19.739 0.091 6.257 1.00 91.20 376 A 1 +ATOM 2887 C CG . LYS A 1 376 ? 20.722 -0.843 5.530 1.00 88.81 376 A 1 +ATOM 2888 C CD . LYS A 1 376 ? 20.078 -1.427 4.261 1.00 86.56 376 A 1 +ATOM 2889 C CE . LYS A 1 376 ? 21.063 -2.350 3.534 1.00 80.95 376 A 1 +ATOM 2890 N NZ . LYS A 1 376 ? 20.458 -2.962 2.332 1.00 74.92 376 A 1 +ATOM 2891 N N . PHE A 1 377 ? 22.677 0.843 7.942 1.00 93.56 377 A 1 +ATOM 2892 C CA . PHE A 1 377 ? 24.020 1.386 7.845 1.00 93.50 377 A 1 +ATOM 2893 C C . PHE A 1 377 ? 24.872 0.534 6.927 1.00 93.57 377 A 1 +ATOM 2894 O O . PHE A 1 377 ? 24.807 -0.690 6.979 1.00 91.51 377 A 1 +ATOM 2895 C CB . PHE A 1 377 ? 24.645 1.459 9.239 1.00 92.87 377 A 1 +ATOM 2896 C CG . PHE A 1 377 ? 23.865 2.319 10.202 1.00 93.16 377 A 1 +ATOM 2897 C CD1 . PHE A 1 377 ? 24.051 3.714 10.215 1.00 84.03 377 A 1 +ATOM 2898 C CD2 . PHE A 1 377 ? 22.918 1.740 11.061 1.00 84.54 377 A 1 +ATOM 2899 C CE1 . PHE A 1 377 ? 23.305 4.519 11.082 1.00 83.93 377 A 1 +ATOM 2900 C CE2 . PHE A 1 377 ? 22.166 2.547 11.941 1.00 83.54 377 A 1 +ATOM 2901 C CZ . PHE A 1 377 ? 22.370 3.932 11.938 1.00 90.55 377 A 1 +ATOM 2902 N N . ILE A 1 378 ? 25.700 1.165 6.104 1.00 93.50 378 A 1 +ATOM 2903 C CA . ILE A 1 378 ? 26.581 0.505 5.150 1.00 93.24 378 A 1 +ATOM 2904 C C . ILE A 1 378 ? 27.987 1.051 5.339 1.00 93.47 378 A 1 +ATOM 2905 O O . ILE A 1 378 ? 28.186 2.260 5.328 1.00 91.59 378 A 1 +ATOM 2906 C CB . ILE A 1 378 ? 26.063 0.719 3.714 1.00 91.34 378 A 1 +ATOM 2907 C CG1 . ILE A 1 378 ? 24.645 0.117 3.539 1.00 81.23 378 A 1 +ATOM 2908 C CG2 . ILE A 1 378 ? 27.040 0.092 2.706 1.00 78.79 378 A 1 +ATOM 2909 C CD1 . ILE A 1 378 ? 23.920 0.572 2.267 1.00 71.96 378 A 1 +ATOM 2910 N N . CYS A 1 379 ? 28.961 0.153 5.464 1.00 92.69 379 A 1 +ATOM 2911 C CA . CYS A 1 379 ? 30.363 0.542 5.387 1.00 92.42 379 A 1 +ATOM 2912 C C . CYS A 1 379 ? 30.713 0.807 3.915 1.00 91.90 379 A 1 +ATOM 2913 O O . CYS A 1 379 ? 30.747 -0.107 3.095 1.00 89.93 379 A 1 +ATOM 2914 C CB . CYS A 1 379 ? 31.237 -0.535 6.028 1.00 91.94 379 A 1 +ATOM 2915 S SG . CYS A 1 379 ? 32.965 0.038 6.065 1.00 90.01 379 A 1 +ATOM 2916 N N . THR A 1 380 ? 30.954 2.068 3.572 1.00 92.21 380 A 1 +ATOM 2917 C CA . THR A 1 380 ? 31.236 2.490 2.195 1.00 91.15 380 A 1 +ATOM 2918 C C . THR A 1 380 ? 32.687 2.259 1.776 1.00 91.34 380 A 1 +ATOM 2919 O O . THR A 1 380 ? 32.987 2.245 0.585 1.00 87.99 380 A 1 +ATOM 2920 C CB . THR A 1 380 ? 30.849 3.951 1.970 1.00 90.00 380 A 1 +ATOM 2921 O OG1 . THR A 1 380 ? 31.533 4.778 2.880 1.00 83.34 380 A 1 +ATOM 2922 C CG2 . THR A 1 380 ? 29.352 4.193 2.180 1.00 80.64 380 A 1 +ATOM 2923 N N . THR A 1 381 ? 33.567 2.015 2.737 1.00 91.80 381 A 1 +ATOM 2924 C CA . THR A 1 381 ? 35.004 1.770 2.543 1.00 91.07 381 A 1 +ATOM 2925 C C . THR A 1 381 ? 35.379 0.287 2.492 1.00 90.84 381 A 1 +ATOM 2926 O O . THR A 1 381 ? 36.553 -0.043 2.407 1.00 86.29 381 A 1 +ATOM 2927 C CB . THR A 1 381 ? 35.814 2.502 3.620 1.00 89.98 381 A 1 +ATOM 2928 O OG1 . THR A 1 381 ? 35.276 2.248 4.898 1.00 83.33 381 A 1 +ATOM 2929 C CG2 . THR A 1 381 ? 35.776 4.013 3.416 1.00 80.90 381 A 1 +ATOM 2930 N N . GLY A 1 382 ? 34.404 -0.614 2.476 1.00 90.62 382 A 1 +ATOM 2931 C CA . GLY A 1 382 ? 34.608 -2.059 2.384 1.00 89.77 382 A 1 +ATOM 2932 C C . GLY A 1 382 ? 34.210 -2.781 3.665 1.00 90.60 382 A 1 +ATOM 2933 O O . GLY A 1 382 ? 33.041 -2.747 4.051 1.00 87.07 382 A 1 +ATOM 2934 N N . LYS A 1 383 ? 35.160 -3.457 4.310 1.00 91.65 383 A 1 +ATOM 2935 C CA . LYS A 1 383 ? 34.944 -4.150 5.582 1.00 91.76 383 A 1 +ATOM 2936 C C . LYS A 1 383 ? 35.182 -3.186 6.743 1.00 92.49 383 A 1 +ATOM 2937 O O . LYS A 1 383 ? 36.206 -2.518 6.779 1.00 89.13 383 A 1 +ATOM 2938 C CB . LYS A 1 383 ? 35.845 -5.390 5.661 1.00 88.87 383 A 1 +ATOM 2939 C CG . LYS A 1 383 ? 35.479 -6.261 6.876 1.00 77.17 383 A 1 +ATOM 2940 C CD . LYS A 1 383 ? 36.365 -7.513 6.985 1.00 69.75 383 A 1 +ATOM 2941 C CE . LYS A 1 383 ? 35.952 -8.285 8.243 1.00 58.76 383 A 1 +ATOM 2942 N NZ . LYS A 1 383 ? 36.839 -9.435 8.517 1.00 50.34 383 A 1 +ATOM 2943 N N . LEU A 1 384 ? 34.254 -3.165 7.681 1.00 91.96 384 A 1 +ATOM 2944 C CA . LEU A 1 384 ? 34.380 -2.344 8.876 1.00 92.57 384 A 1 +ATOM 2945 C C . LEU A 1 384 ? 35.514 -2.888 9.765 1.00 92.78 384 A 1 +ATOM 2946 O O . LEU A 1 384 ? 35.512 -4.086 10.069 1.00 90.68 384 A 1 +ATOM 2947 C CB . LEU A 1 384 ? 33.024 -2.332 9.605 1.00 91.88 384 A 1 +ATOM 2948 C CG . LEU A 1 384 ? 32.903 -1.199 10.634 1.00 90.74 384 A 1 +ATOM 2949 C CD1 . LEU A 1 384 ? 32.693 0.159 9.958 1.00 80.77 384 A 1 +ATOM 2950 C CD2 . LEU A 1 384 ? 31.715 -1.441 11.549 1.00 80.69 384 A 1 +ATOM 2951 N N . PRO A 1 385 ? 36.486 -2.057 10.199 1.00 93.57 385 A 1 +ATOM 2952 C CA . PRO A 1 385 ? 37.620 -2.520 11.002 1.00 93.07 385 A 1 +ATOM 2953 C C . PRO A 1 385 ? 37.284 -2.755 12.481 1.00 93.39 385 A 1 +ATOM 2954 O O . PRO A 1 385 ? 38.112 -3.256 13.224 1.00 90.76 385 A 1 +ATOM 2955 C CB . PRO A 1 385 ? 38.688 -1.438 10.822 1.00 91.90 385 A 1 +ATOM 2956 C CG . PRO A 1 385 ? 37.863 -0.166 10.648 1.00 90.05 385 A 1 +ATOM 2957 C CD . PRO A 1 385 ? 36.644 -0.656 9.854 1.00 92.35 385 A 1 +ATOM 2958 N N . VAL A 1 386 ? 36.080 -2.402 12.905 1.00 93.59 386 A 1 +ATOM 2959 C CA . VAL A 1 386 ? 35.573 -2.583 14.274 1.00 93.74 386 A 1 +ATOM 2960 C C . VAL A 1 386 ? 34.217 -3.296 14.249 1.00 93.97 386 A 1 +ATOM 2961 O O . VAL A 1 386 ? 33.508 -3.224 13.242 1.00 92.29 386 A 1 +ATOM 2962 C CB . VAL A 1 386 ? 35.481 -1.245 15.025 1.00 93.03 386 A 1 +ATOM 2963 C CG1 . VAL A 1 386 ? 36.860 -0.587 15.164 1.00 85.40 386 A 1 +ATOM 2964 C CG2 . VAL A 1 386 ? 34.528 -0.238 14.375 1.00 82.95 386 A 1 +ATOM 2965 N N . PRO A 1 387 ? 33.807 -3.973 15.328 1.00 93.87 387 A 1 +ATOM 2966 C CA . PRO A 1 387 ? 32.487 -4.595 15.382 1.00 93.39 387 A 1 +ATOM 2967 C C . PRO A 1 387 ? 31.368 -3.557 15.292 1.00 93.66 387 A 1 +ATOM 2968 O O . PRO A 1 387 ? 31.402 -2.544 15.994 1.00 92.14 387 A 1 +ATOM 2969 C CB . PRO A 1 387 ? 32.434 -5.364 16.709 1.00 91.90 387 A 1 +ATOM 2970 C CG . PRO A 1 387 ? 33.905 -5.561 17.081 1.00 89.71 387 A 1 +ATOM 2971 C CD . PRO A 1 387 ? 34.574 -4.313 16.513 1.00 91.51 387 A 1 +ATOM 2972 N N . TRP A 1 388 ? 30.325 -3.839 14.494 1.00 93.26 388 A 1 +ATOM 2973 C CA . TRP A 1 388 ? 29.152 -2.967 14.363 1.00 93.32 388 A 1 +ATOM 2974 C C . TRP A 1 388 ? 28.519 -2.545 15.706 1.00 93.58 388 A 1 +ATOM 2975 O O . TRP A 1 388 ? 28.181 -1.372 15.839 1.00 91.78 388 A 1 +ATOM 2976 C CB . TRP A 1 388 ? 28.102 -3.648 13.478 1.00 93.09 388 A 1 +ATOM 2977 C CG . TRP A 1 388 ? 28.344 -3.516 12.012 1.00 93.11 388 A 1 +ATOM 2978 C CD1 . TRP A 1 388 ? 28.745 -4.489 11.166 1.00 89.64 388 A 1 +ATOM 2979 C CD2 . TRP A 1 388 ? 28.188 -2.316 11.202 1.00 92.35 388 A 1 +ATOM 2980 N NE1 . TRP A 1 388 ? 28.849 -3.982 9.890 1.00 90.37 388 A 1 +ATOM 2981 C CE2 . TRP A 1 388 ? 28.521 -2.646 9.867 1.00 91.73 388 A 1 +ATOM 2982 C CE3 . TRP A 1 388 ? 27.802 -0.987 11.486 1.00 91.91 388 A 1 +ATOM 2983 C CZ2 . TRP A 1 388 ? 28.486 -1.685 8.826 1.00 91.82 388 A 1 +ATOM 2984 C CZ3 . TRP A 1 388 ? 27.766 -0.034 10.449 1.00 89.63 388 A 1 +ATOM 2985 C CH2 . TRP A 1 388 ? 28.113 -0.381 9.148 1.00 89.85 388 A 1 +ATOM 2986 N N . PRO A 1 389 ? 28.401 -3.419 16.728 1.00 93.07 389 A 1 +ATOM 2987 C CA . PRO A 1 389 ? 27.845 -3.025 18.020 1.00 92.37 389 A 1 +ATOM 2988 C C . PRO A 1 389 ? 28.578 -1.857 18.696 1.00 92.43 389 A 1 +ATOM 2989 O O . PRO A 1 389 ? 27.946 -1.072 19.393 1.00 90.68 389 A 1 +ATOM 2990 C CB . PRO A 1 389 ? 27.891 -4.284 18.888 1.00 91.14 389 A 1 +ATOM 2991 C CG . PRO A 1 389 ? 27.789 -5.413 17.874 1.00 89.07 389 A 1 +ATOM 2992 C CD . PRO A 1 389 ? 28.604 -4.864 16.696 1.00 91.21 389 A 1 +ATOM 2993 N N . THR A 1 390 ? 29.878 -1.691 18.462 1.00 93.23 390 A 1 +ATOM 2994 C CA . THR A 1 390 ? 30.656 -0.593 19.064 1.00 93.05 390 A 1 +ATOM 2995 C C . THR A 1 390 ? 30.294 0.776 18.490 1.00 93.19 390 A 1 +ATOM 2996 O O . THR A 1 390 ? 30.572 1.801 19.115 1.00 90.96 390 A 1 +ATOM 2997 C CB . THR A 1 390 ? 32.164 -0.806 18.915 1.00 92.64 390 A 1 +ATOM 2998 O OG1 . THR A 1 390 ? 32.582 -0.703 17.581 1.00 84.85 390 A 1 +ATOM 2999 C CG2 . THR A 1 390 ? 32.621 -2.160 19.451 1.00 83.43 390 A 1 +ATOM 3000 N N . LEU A 1 391 ? 29.641 0.801 17.321 1.00 92.81 391 A 1 +ATOM 3001 C CA . LEU A 1 391 ? 29.199 2.024 16.661 1.00 92.77 391 A 1 +ATOM 3002 C C . LEU A 1 391 ? 27.723 2.350 16.912 1.00 92.81 391 A 1 +ATOM 3003 O O . LEU A 1 391 ? 27.312 3.464 16.615 1.00 90.41 391 A 1 +ATOM 3004 C CB . LEU A 1 391 ? 29.484 1.929 15.156 1.00 92.18 391 A 1 +ATOM 3005 C CG . LEU A 1 391 ? 30.969 1.762 14.772 1.00 91.93 391 A 1 +ATOM 3006 C CD1 . LEU A 1 391 ? 31.079 1.772 13.253 1.00 84.70 391 A 1 +ATOM 3007 C CD2 . LEU A 1 391 ? 31.850 2.880 15.320 1.00 84.20 391 A 1 +ATOM 3008 N N . VAL A 1 392 ? 26.932 1.432 17.467 1.00 92.76 392 A 1 +ATOM 3009 C CA . VAL A 1 392 ? 25.481 1.637 17.652 1.00 91.68 392 A 1 +ATOM 3010 C C . VAL A 1 392 ? 25.193 2.922 18.421 1.00 90.92 392 A 1 +ATOM 3011 O O . VAL A 1 392 ? 24.389 3.733 17.984 1.00 88.21 392 A 1 +ATOM 3012 C CB . VAL A 1 392 ? 24.833 0.424 18.356 1.00 90.76 392 A 1 +ATOM 3013 C CG1 . VAL A 1 392 ? 23.377 0.686 18.760 1.00 84.33 392 A 1 +ATOM 3014 C CG2 . VAL A 1 392 ? 24.834 -0.787 17.420 1.00 83.60 392 A 1 +ATOM 3015 N N . THR A 1 393 ? 25.890 3.148 19.536 1.00 92.17 393 A 1 +ATOM 3016 C CA . THR A 1 393 ? 25.716 4.375 20.325 1.00 90.92 393 A 1 +ATOM 3017 C C . THR A 1 393 ? 26.088 5.628 19.551 1.00 90.89 393 A 1 +ATOM 3018 O O . THR A 1 393 ? 25.413 6.643 19.673 1.00 87.58 393 A 1 +ATOM 3019 C CB . THR A 1 393 ? 26.545 4.335 21.607 1.00 89.59 393 A 1 +ATOM 3020 O OG1 . THR A 1 393 ? 27.891 4.033 21.318 1.00 81.19 393 A 1 +ATOM 3021 C CG2 . THR A 1 393 ? 26.011 3.282 22.573 1.00 80.25 393 A 1 +ATOM 3022 N N . THR A 1 394 ? 27.116 5.579 18.725 1.00 91.11 394 A 1 +ATOM 3023 C CA . THR A 1 394 ? 27.547 6.714 17.907 1.00 90.41 394 A 1 +ATOM 3024 C C . THR A 1 394 ? 26.533 7.017 16.801 1.00 90.67 394 A 1 +ATOM 3025 O O . THR A 1 394 ? 26.245 8.177 16.532 1.00 87.96 394 A 1 +ATOM 3026 C CB . THR A 1 394 ? 28.931 6.447 17.319 1.00 89.91 394 A 1 +ATOM 3027 O OG1 . THR A 1 394 ? 29.834 6.205 18.372 1.00 81.88 394 A 1 +ATOM 3028 C CG2 . THR A 1 394 ? 29.484 7.623 16.544 1.00 80.27 394 A 1 +ATOM 3029 N N . LEU A 1 395 ? 25.951 5.976 16.198 1.00 90.40 395 A 1 +ATOM 3030 C CA . LEU A 1 395 ? 25.057 6.083 15.050 1.00 88.71 395 A 1 +ATOM 3031 C C . LEU A 1 395 ? 23.613 6.436 15.448 1.00 87.97 395 A 1 +ATOM 3032 O O . LEU A 1 395 ? 23.080 7.435 14.975 1.00 82.81 395 A 1 +ATOM 3033 C CB . LEU A 1 395 ? 25.131 4.779 14.247 1.00 88.22 395 A 1 +ATOM 3034 C CG . LEU A 1 395 ? 26.500 4.490 13.595 1.00 89.22 395 A 1 +ATOM 3035 C CD1 . LEU A 1 395 ? 26.529 3.061 13.057 1.00 82.50 395 A 1 +ATOM 3036 C CD2 . LEU A 1 395 ? 26.812 5.446 12.452 1.00 83.00 395 A 1 +ATOM 3037 N N . THR A 1 396 ? 22.990 5.643 16.328 1.00 82.58 396 A 1 +ATOM 3038 C CA . THR A 1 396 ? 21.557 5.783 16.656 1.00 77.81 396 A 1 +ATOM 3039 C C . THR A 1 396 ? 21.291 6.426 18.001 1.00 78.57 396 A 1 +ATOM 3040 O O . THR A 1 396 ? 20.423 7.288 18.084 1.00 73.39 396 A 1 +ATOM 3041 C CB . THR A 1 396 ? 20.803 4.465 16.590 1.00 73.54 396 A 1 +ATOM 3042 O OG1 . THR A 1 396 ? 21.474 3.473 17.329 1.00 71.03 396 A 1 +ATOM 3043 C CG2 . THR A 1 396 ? 20.657 3.982 15.156 1.00 70.11 396 A 1 +ATOM 3044 N N . TYR A 1 397 ? 22.061 6.129 19.037 1.00 82.12 397 A 1 +ATOM 3045 C CA . TYR A 1 397 ? 22.056 6.967 20.244 1.00 80.02 397 A 1 +ATOM 3046 C C . TYR A 1 397 ? 22.662 8.347 19.942 1.00 79.77 397 A 1 +ATOM 3047 O O . TYR A 1 397 ? 22.720 9.205 20.815 1.00 72.87 397 A 1 +ATOM 3048 C CB . TYR A 1 397 ? 22.796 6.299 21.422 1.00 77.84 397 A 1 +ATOM 3049 C CG . TYR A 1 397 ? 22.316 4.981 21.983 1.00 78.33 397 A 1 +ATOM 3050 C CD1 . TYR A 1 397 ? 22.267 4.822 23.382 1.00 68.81 397 A 1 +ATOM 3051 C CD2 . TYR A 1 397 ? 22.021 3.882 21.170 1.00 68.47 397 A 1 +ATOM 3052 C CE1 . TYR A 1 397 ? 21.913 3.581 23.950 1.00 69.81 397 A 1 +ATOM 3053 C CE2 . TYR A 1 397 ? 21.662 2.638 21.728 1.00 70.37 397 A 1 +ATOM 3054 C CZ . TYR A 1 397 ? 21.615 2.497 23.124 1.00 77.62 397 A 1 +ATOM 3055 O OH . TYR A 1 397 ? 21.251 1.289 23.668 1.00 73.70 397 A 1 +ATOM 3056 N N . GLY A 1 398 ? 23.092 8.563 18.708 1.00 80.24 398 A 1 +ATOM 3057 C CA . GLY A 1 398 ? 23.407 9.859 18.130 1.00 76.73 398 A 1 +ATOM 3058 C C . GLY A 1 398 ? 22.184 10.675 17.713 1.00 81.56 398 A 1 +ATOM 3059 O O . GLY A 1 398 ? 22.300 11.889 17.578 1.00 75.84 398 A 1 +ATOM 3060 N N . VAL A 1 399 ? 21.016 10.037 17.555 1.00 85.99 399 A 1 +ATOM 3061 C CA . VAL A 1 399 ? 19.772 10.709 17.129 1.00 87.19 399 A 1 +ATOM 3062 C C . VAL A 1 399 ? 18.670 10.604 18.191 1.00 88.86 399 A 1 +ATOM 3063 O O . VAL A 1 399 ? 17.523 10.258 17.916 1.00 85.57 399 A 1 +ATOM 3064 C CB . VAL A 1 399 ? 19.323 10.276 15.717 1.00 83.71 399 A 1 +ATOM 3065 C CG1 . VAL A 1 399 ? 20.291 10.803 14.658 1.00 77.89 399 A 1 +ATOM 3066 C CG2 . VAL A 1 399 ? 19.212 8.759 15.542 1.00 77.31 399 A 1 +ATOM 3067 N N . GLN A 1 400 ? 19.004 10.920 19.428 1.00 88.71 400 A 1 +ATOM 3068 C CA . GLN A 1 400 ? 18.108 10.837 20.597 1.00 89.10 400 A 1 +ATOM 3069 C C . GLN A 1 400 ? 16.897 11.789 20.532 1.00 90.02 400 A 1 +ATOM 3070 O O . GLN A 1 400 ? 15.962 11.649 21.324 1.00 87.34 400 A 1 +ATOM 3071 C CB . GLN A 1 400 ? 18.923 11.064 21.877 1.00 87.57 400 A 1 +ATOM 3072 C CG . GLN A 1 400 ? 19.890 9.907 22.139 1.00 86.61 400 A 1 +ATOM 3073 C CD . GLN A 1 400 ? 20.807 10.126 23.345 1.00 83.39 400 A 1 +ATOM 3074 O OE1 . GLN A 1 400 ? 21.404 11.168 23.526 1.00 74.05 400 A 1 +ATOM 3075 N NE2 . GLN A 1 400 ? 20.983 9.137 24.183 1.00 72.78 400 A 1 +ATOM 3076 N N . CYS A 1 401 ? 16.837 12.694 19.564 1.00 91.21 401 A 1 +ATOM 3077 C CA . CYS A 1 401 ? 15.650 13.496 19.249 1.00 91.15 401 A 1 +ATOM 3078 C C . CYS A 1 401 ? 14.438 12.650 18.827 1.00 91.45 401 A 1 +ATOM 3079 O O . CYS A 1 401 ? 13.312 13.132 18.901 1.00 89.67 401 A 1 +ATOM 3080 C CB . CYS A 1 401 ? 16.018 14.526 18.179 1.00 90.12 401 A 1 +ATOM 3081 S SG . CYS A 1 401 ? 16.787 13.730 16.739 1.00 87.52 401 A 1 +ATOM 3082 N N . PHE A 1 402 ? 14.625 11.395 18.446 1.00 91.65 402 A 1 +ATOM 3083 C CA . PHE A 1 402 ? 13.525 10.461 18.172 1.00 91.43 402 A 1 +ATOM 3084 C C . PHE A 1 402 ? 13.025 9.696 19.402 1.00 91.19 402 A 1 +ATOM 3085 O O . PHE A 1 402 ? 12.135 8.850 19.276 1.00 88.86 402 A 1 +ATOM 3086 C CB . PHE A 1 402 ? 13.927 9.512 17.046 1.00 91.18 402 A 1 +ATOM 3087 C CG . PHE A 1 402 ? 14.022 10.206 15.717 1.00 91.52 402 A 1 +ATOM 3088 C CD1 . PHE A 1 402 ? 12.847 10.574 15.038 1.00 82.88 402 A 1 +ATOM 3089 C CD2 . PHE A 1 402 ? 15.265 10.539 15.170 1.00 82.86 402 A 1 +ATOM 3090 C CE1 . PHE A 1 402 ? 12.910 11.253 13.823 1.00 82.49 402 A 1 +ATOM 3091 C CE2 . PHE A 1 402 ? 15.337 11.225 13.949 1.00 82.00 402 A 1 +ATOM 3092 C CZ . PHE A 1 402 ? 14.158 11.586 13.278 1.00 89.78 402 A 1 +ATOM 3093 N N . SER A 1 403 ? 13.552 9.978 20.586 1.00 91.37 403 A 1 +ATOM 3094 C CA . SER A 1 403 ? 13.012 9.411 21.811 1.00 90.88 403 A 1 +ATOM 3095 C C . SER A 1 403 ? 11.563 9.848 22.032 1.00 90.58 403 A 1 +ATOM 3096 O O . SER A 1 403 ? 11.189 11.000 21.791 1.00 88.90 403 A 1 +ATOM 3097 C CB . SER A 1 403 ? 13.891 9.740 23.017 1.00 89.95 403 A 1 +ATOM 3098 O OG . SER A 1 403 ? 14.043 11.122 23.193 1.00 79.84 403 A 1 +ATOM 3099 N N . ARG A 1 404 ? 10.755 8.926 22.517 1.00 90.11 404 A 1 +ATOM 3100 C CA . ARG A 1 404 ? 9.396 9.227 22.949 1.00 89.33 404 A 1 +ATOM 3101 C C . ARG A 1 404 ? 9.446 9.800 24.355 1.00 89.32 404 A 1 +ATOM 3102 O O . ARG A 1 404 ? 9.674 9.064 25.314 1.00 88.05 404 A 1 +ATOM 3103 C CB . ARG A 1 404 ? 8.536 7.959 22.866 1.00 87.64 404 A 1 +ATOM 3104 C CG . ARG A 1 404 ? 7.115 8.212 23.376 1.00 82.49 404 A 1 +ATOM 3105 C CD . ARG A 1 404 ? 6.309 6.913 23.388 1.00 79.25 404 A 1 +ATOM 3106 N NE . ARG A 1 404 ? 5.068 7.095 24.131 1.00 72.16 404 A 1 +ATOM 3107 C CZ . ARG A 1 404 ? 4.271 6.127 24.582 1.00 66.16 404 A 1 +ATOM 3108 N NH1 . ARG A 1 404 ? 4.520 4.872 24.327 1.00 59.56 404 A 1 +ATOM 3109 N NH2 . ARG A 1 404 ? 3.229 6.415 25.299 1.00 59.27 404 A 1 +ATOM 3110 N N . TYR A 1 405 ? 9.146 11.080 24.474 1.00 87.83 405 A 1 +ATOM 3111 C CA . TYR A 1 405 ? 8.852 11.707 25.756 1.00 88.59 405 A 1 +ATOM 3112 C C . TYR A 1 405 ? 7.346 11.580 26.033 1.00 87.78 405 A 1 +ATOM 3113 O O . TYR A 1 405 ? 6.543 12.031 25.215 1.00 84.75 405 A 1 +ATOM 3114 C CB . TYR A 1 405 ? 9.353 13.148 25.768 1.00 89.08 405 A 1 +ATOM 3115 C CG . TYR A 1 405 ? 10.841 13.251 26.061 1.00 89.81 405 A 1 +ATOM 3116 C CD1 . TYR A 1 405 ? 11.292 13.653 27.336 1.00 82.06 405 A 1 +ATOM 3117 C CD2 . TYR A 1 405 ? 11.796 12.915 25.077 1.00 82.10 405 A 1 +ATOM 3118 C CE1 . TYR A 1 405 ? 12.661 13.727 27.633 1.00 81.97 405 A 1 +ATOM 3119 C CE2 . TYR A 1 405 ? 13.175 12.975 25.366 1.00 81.31 405 A 1 +ATOM 3120 C CZ . TYR A 1 405 ? 13.604 13.385 26.646 1.00 88.77 405 A 1 +ATOM 3121 O OH . TYR A 1 405 ? 14.943 13.443 26.928 1.00 88.07 405 A 1 +ATOM 3122 N N . PRO A 1 406 ? 6.933 10.950 27.140 1.00 87.22 406 A 1 +ATOM 3123 C CA . PRO A 1 406 ? 5.546 10.978 27.592 1.00 84.93 406 A 1 +ATOM 3124 C C . PRO A 1 406 ? 5.048 12.415 27.776 1.00 84.52 406 A 1 +ATOM 3125 O O . PRO A 1 406 ? 5.837 13.311 28.048 1.00 81.51 406 A 1 +ATOM 3126 C CB . PRO A 1 406 ? 5.528 10.211 28.926 1.00 82.82 406 A 1 +ATOM 3127 C CG . PRO A 1 406 ? 6.760 9.324 28.848 1.00 81.33 406 A 1 +ATOM 3128 C CD . PRO A 1 406 ? 7.753 10.185 28.056 1.00 84.53 406 A 1 +ATOM 3129 N N . ASP A 1 407 ? 3.734 12.640 27.691 1.00 83.50 407 A 1 +ATOM 3130 C CA . ASP A 1 407 ? 3.164 13.995 27.709 1.00 81.56 407 A 1 +ATOM 3131 C C . ASP A 1 407 ? 3.566 14.817 28.951 1.00 81.44 407 A 1 +ATOM 3132 O O . ASP A 1 407 ? 3.856 16.007 28.832 1.00 77.63 407 A 1 +ATOM 3133 C CB . ASP A 1 407 ? 1.636 13.927 27.581 1.00 78.85 407 A 1 +ATOM 3134 C CG . ASP A 1 407 ? 1.171 13.449 26.203 1.00 74.18 407 A 1 +ATOM 3135 O OD1 . ASP A 1 407 ? 1.819 13.820 25.197 1.00 66.73 407 A 1 +ATOM 3136 O OD2 . ASP A 1 407 ? 0.159 12.724 26.158 1.00 66.11 407 A 1 +ATOM 3137 N N . HIS A 1 408 ? 3.673 14.181 30.118 1.00 83.56 408 A 1 +ATOM 3138 C CA . HIS A 1 408 ? 4.122 14.831 31.353 1.00 81.64 408 A 1 +ATOM 3139 C C . HIS A 1 408 ? 5.629 15.140 31.393 1.00 81.98 408 A 1 +ATOM 3140 O O . HIS A 1 408 ? 6.073 15.881 32.265 1.00 79.03 408 A 1 +ATOM 3141 C CB . HIS A 1 408 ? 3.725 13.957 32.550 1.00 79.75 408 A 1 +ATOM 3142 C CG . HIS A 1 408 ? 4.449 12.642 32.624 1.00 77.28 408 A 1 +ATOM 3143 N ND1 . HIS A 1 408 ? 4.097 11.470 31.989 1.00 68.37 408 A 1 +ATOM 3144 C CD2 . HIS A 1 408 ? 5.569 12.355 33.370 1.00 68.38 408 A 1 +ATOM 3145 C CE1 . HIS A 1 408 ? 4.971 10.519 32.353 1.00 67.97 408 A 1 +ATOM 3146 N NE2 . HIS A 1 408 ? 5.879 11.008 33.184 1.00 68.95 408 A 1 +ATOM 3147 N N . MET A 1 409 ? 6.409 14.596 30.457 1.00 82.60 409 A 1 +ATOM 3148 C CA . MET A 1 409 ? 7.861 14.815 30.367 1.00 84.42 409 A 1 +ATOM 3149 C C . MET A 1 409 ? 8.276 15.688 29.180 1.00 84.70 409 A 1 +ATOM 3150 O O . MET A 1 409 ? 9.467 15.952 29.021 1.00 81.95 409 A 1 +ATOM 3151 C CB . MET A 1 409 ? 8.597 13.469 30.317 1.00 83.98 409 A 1 +ATOM 3152 C CG . MET A 1 409 ? 8.431 12.629 31.589 1.00 81.92 409 A 1 +ATOM 3153 S SD . MET A 1 409 ? 9.423 11.105 31.594 1.00 81.96 409 A 1 +ATOM 3154 C CE . MET A 1 409 ? 11.094 11.794 31.638 1.00 73.43 409 A 1 +ATOM 3155 N N . LYS A 1 410 ? 7.350 16.168 28.347 1.00 85.49 410 A 1 +ATOM 3156 C CA . LYS A 1 410 ? 7.678 16.935 27.124 1.00 84.50 410 A 1 +ATOM 3157 C C . LYS A 1 410 ? 8.528 18.180 27.389 1.00 85.19 410 A 1 +ATOM 3158 O O . LYS A 1 410 ? 9.359 18.548 26.569 1.00 82.01 410 A 1 +ATOM 3159 C CB . LYS A 1 410 ? 6.400 17.336 26.396 1.00 81.90 410 A 1 +ATOM 3160 C CG . LYS A 1 410 ? 5.758 16.120 25.717 1.00 78.28 410 A 1 +ATOM 3161 C CD . LYS A 1 410 ? 4.569 16.567 24.878 1.00 72.35 410 A 1 +ATOM 3162 C CE . LYS A 1 410 ? 4.050 15.374 24.079 1.00 67.20 410 A 1 +ATOM 3163 N NZ . LYS A 1 410 ? 3.365 15.840 22.859 1.00 59.75 410 A 1 +ATOM 3164 N N . GLN A 1 411 ? 8.352 18.797 28.547 1.00 85.99 411 A 1 +ATOM 3165 C CA . GLN A 1 411 ? 9.153 19.942 29.005 1.00 85.26 411 A 1 +ATOM 3166 C C . GLN A 1 411 ? 10.617 19.592 29.330 1.00 86.82 411 A 1 +ATOM 3167 O O . GLN A 1 411 ? 11.401 20.497 29.590 1.00 84.34 411 A 1 +ATOM 3168 C CB . GLN A 1 411 ? 8.441 20.594 30.199 1.00 82.15 411 A 1 +ATOM 3169 C CG . GLN A 1 411 ? 8.364 19.660 31.436 1.00 72.41 411 A 1 +ATOM 3170 C CD . GLN A 1 411 ? 7.538 20.246 32.583 1.00 64.33 411 A 1 +ATOM 3171 O OE1 . GLN A 1 411 ? 7.116 21.386 32.564 1.00 55.69 411 A 1 +ATOM 3172 N NE2 . GLN A 1 411 ? 7.280 19.479 33.610 1.00 53.24 411 A 1 +ATOM 3173 N N . HIS A 1 412 ? 10.974 18.315 29.296 1.00 87.18 412 A 1 +ATOM 3174 C CA . HIS A 1 412 ? 12.321 17.814 29.547 1.00 87.44 412 A 1 +ATOM 3175 C C . HIS A 1 412 ? 13.030 17.336 28.269 1.00 88.62 412 A 1 +ATOM 3176 O O . HIS A 1 412 ? 14.146 16.835 28.342 1.00 86.34 412 A 1 +ATOM 3177 C CB . HIS A 1 412 ? 12.249 16.714 30.618 1.00 87.05 412 A 1 +ATOM 3178 C CG . HIS A 1 412 ? 11.656 17.195 31.910 1.00 87.52 412 A 1 +ATOM 3179 N ND1 . HIS A 1 412 ? 12.266 18.038 32.816 1.00 76.87 412 A 1 +ATOM 3180 C CD2 . HIS A 1 412 ? 10.406 16.918 32.404 1.00 77.33 412 A 1 +ATOM 3181 C CE1 . HIS A 1 412 ? 11.397 18.255 33.826 1.00 78.79 412 A 1 +ATOM 3182 N NE2 . HIS A 1 412 ? 10.262 17.593 33.601 1.00 80.17 412 A 1 +ATOM 3183 N N . ASP A 1 413 ? 12.418 17.511 27.097 1.00 88.68 413 A 1 +ATOM 3184 C CA . ASP A 1 413 ? 12.994 17.082 25.823 1.00 89.56 413 A 1 +ATOM 3185 C C . ASP A 1 413 ? 13.932 18.153 25.238 1.00 89.97 413 A 1 +ATOM 3186 O O . ASP A 1 413 ? 13.553 18.943 24.368 1.00 88.02 413 A 1 +ATOM 3187 C CB . ASP A 1 413 ? 11.880 16.659 24.858 1.00 88.55 413 A 1 +ATOM 3188 C CG . ASP A 1 413 ? 12.410 15.907 23.636 1.00 88.61 413 A 1 +ATOM 3189 O OD1 . ASP A 1 413 ? 13.623 15.957 23.328 1.00 81.44 413 A 1 +ATOM 3190 O OD2 . ASP A 1 413 ? 11.582 15.245 22.983 1.00 81.87 413 A 1 +ATOM 3191 N N . PHE A 1 414 ? 15.175 18.152 25.701 1.00 90.76 414 A 1 +ATOM 3192 C CA . PHE A 1 414 ? 16.219 19.012 25.146 1.00 91.16 414 A 1 +ATOM 3193 C C . PHE A 1 414 ? 16.406 18.767 23.638 1.00 91.65 414 A 1 +ATOM 3194 O O . PHE A 1 414 ? 16.521 19.718 22.876 1.00 90.77 414 A 1 +ATOM 3195 C CB . PHE A 1 414 ? 17.538 18.768 25.894 1.00 91.18 414 A 1 +ATOM 3196 C CG . PHE A 1 414 ? 18.740 19.390 25.224 1.00 91.35 414 A 1 +ATOM 3197 C CD1 . PHE A 1 414 ? 19.521 18.649 24.316 1.00 84.61 414 A 1 +ATOM 3198 C CD2 . PHE A 1 414 ? 19.066 20.738 25.451 1.00 84.89 414 A 1 +ATOM 3199 C CE1 . PHE A 1 414 ? 20.595 19.240 23.640 1.00 85.51 414 A 1 +ATOM 3200 C CE2 . PHE A 1 414 ? 20.141 21.335 24.782 1.00 84.35 414 A 1 +ATOM 3201 C CZ . PHE A 1 414 ? 20.905 20.588 23.872 1.00 90.09 414 A 1 +ATOM 3202 N N . PHE A 1 415 ? 16.436 17.518 23.214 1.00 92.16 415 A 1 +ATOM 3203 C CA . PHE A 1 415 ? 16.844 17.127 21.865 1.00 92.12 415 A 1 +ATOM 3204 C C . PHE A 1 415 ? 15.935 17.719 20.786 1.00 92.45 415 A 1 +ATOM 3205 O O . PHE A 1 415 ? 16.432 18.321 19.829 1.00 90.84 415 A 1 +ATOM 3206 C CB . PHE A 1 415 ? 16.853 15.603 21.765 1.00 91.73 415 A 1 +ATOM 3207 C CG . PHE A 1 415 ? 17.699 14.888 22.790 1.00 92.11 415 A 1 +ATOM 3208 C CD1 . PHE A 1 415 ? 19.096 14.817 22.626 1.00 83.77 415 A 1 +ATOM 3209 C CD2 . PHE A 1 415 ? 17.096 14.278 23.903 1.00 83.05 415 A 1 +ATOM 3210 C CE1 . PHE A 1 415 ? 19.880 14.128 23.559 1.00 82.94 415 A 1 +ATOM 3211 C CE2 . PHE A 1 415 ? 17.885 13.585 24.842 1.00 82.07 415 A 1 +ATOM 3212 C CZ . PHE A 1 415 ? 19.269 13.517 24.664 1.00 89.77 415 A 1 +ATOM 3213 N N . LYS A 1 416 ? 14.611 17.596 20.936 1.00 90.20 416 A 1 +ATOM 3214 C CA . LYS A 1 416 ? 13.653 18.206 19.998 1.00 89.86 416 A 1 +ATOM 3215 C C . LYS A 1 416 ? 13.645 19.725 20.102 1.00 89.52 416 A 1 +ATOM 3216 O O . LYS A 1 416 ? 13.507 20.390 19.095 1.00 87.72 416 A 1 +ATOM 3217 C CB . LYS A 1 416 ? 12.248 17.645 20.220 1.00 89.05 416 A 1 +ATOM 3218 C CG . LYS A 1 416 ? 12.132 16.150 19.872 1.00 87.75 416 A 1 +ATOM 3219 C CD . LYS A 1 416 ? 10.697 15.657 20.040 1.00 86.05 416 A 1 +ATOM 3220 C CE . LYS A 1 416 ? 10.630 14.131 19.976 1.00 83.92 416 A 1 +ATOM 3221 N NZ . LYS A 1 416 ? 11.306 13.500 21.137 1.00 79.92 416 A 1 +ATOM 3222 N N . SER A 1 417 ? 13.829 20.281 21.300 1.00 90.14 417 A 1 +ATOM 3223 C CA . SER A 1 417 ? 13.792 21.726 21.528 1.00 89.26 417 A 1 +ATOM 3224 C C . SER A 1 417 ? 14.912 22.493 20.806 1.00 89.42 417 A 1 +ATOM 3225 O O . SER A 1 417 ? 14.708 23.657 20.465 1.00 87.06 417 A 1 +ATOM 3226 C CB . SER A 1 417 ? 13.836 22.031 23.025 1.00 88.27 417 A 1 +ATOM 3227 O OG . SER A 1 417 ? 15.122 21.892 23.574 1.00 83.34 417 A 1 +ATOM 3228 N N . ALA A 1 418 ? 16.041 21.845 20.541 1.00 89.42 418 A 1 +ATOM 3229 C CA . ALA A 1 418 ? 17.155 22.429 19.798 1.00 89.59 418 A 1 +ATOM 3230 C C . ALA A 1 418 ? 16.945 22.425 18.269 1.00 89.84 418 A 1 +ATOM 3231 O O . ALA A 1 418 ? 17.739 23.018 17.535 1.00 87.41 418 A 1 +ATOM 3232 C CB . ALA A 1 418 ? 18.429 21.675 20.195 1.00 89.34 418 A 1 +ATOM 3233 N N . MET A 1 419 ? 15.904 21.760 17.764 1.00 89.15 419 A 1 +ATOM 3234 C CA . MET A 1 419 ? 15.613 21.685 16.326 1.00 88.93 419 A 1 +ATOM 3235 C C . MET A 1 419 ? 14.841 22.926 15.835 1.00 88.08 419 A 1 +ATOM 3236 O O . MET A 1 419 ? 14.069 23.495 16.601 1.00 83.73 419 A 1 +ATOM 3237 C CB . MET A 1 419 ? 14.865 20.391 16.013 1.00 88.61 419 A 1 +ATOM 3238 C CG . MET A 1 419 ? 15.694 19.137 16.341 1.00 86.66 419 A 1 +ATOM 3239 S SD . MET A 1 419 ? 17.221 18.964 15.382 1.00 88.30 419 A 1 +ATOM 3240 C CE . MET A 1 419 ? 18.002 17.658 16.333 1.00 80.75 419 A 1 +ATOM 3241 N N . PRO A 1 420 ? 14.982 23.378 14.557 1.00 88.26 420 A 1 +ATOM 3242 C CA . PRO A 1 420 ? 15.691 22.700 13.464 1.00 88.22 420 A 1 +ATOM 3243 C C . PRO A 1 420 ? 17.202 22.976 13.380 1.00 88.91 420 A 1 +ATOM 3244 O O . PRO A 1 420 ? 17.894 22.275 12.653 1.00 86.07 420 A 1 +ATOM 3245 C CB . PRO A 1 420 ? 14.992 23.202 12.196 1.00 85.74 420 A 1 +ATOM 3246 C CG . PRO A 1 420 ? 14.592 24.631 12.563 1.00 82.66 420 A 1 +ATOM 3247 C CD . PRO A 1 420 ? 14.226 24.505 14.042 1.00 84.73 420 A 1 +ATOM 3248 N N . GLU A 1 421 ? 17.721 23.967 14.103 1.00 88.53 421 A 1 +ATOM 3249 C CA . GLU A 1 421 ? 19.145 24.340 14.053 1.00 88.62 421 A 1 +ATOM 3250 C C . GLU A 1 421 ? 20.045 23.203 14.537 1.00 89.86 421 A 1 +ATOM 3251 O O . GLU A 1 421 ? 21.151 23.015 14.025 1.00 87.10 421 A 1 +ATOM 3252 C CB . GLU A 1 421 ? 19.398 25.604 14.891 1.00 86.72 421 A 1 +ATOM 3253 C CG . GLU A 1 421 ? 18.661 26.867 14.409 1.00 80.10 421 A 1 +ATOM 3254 C CD . GLU A 1 421 ? 17.201 26.994 14.865 1.00 72.94 421 A 1 +ATOM 3255 O OE1 . GLU A 1 421 ? 16.573 28.011 14.499 1.00 62.52 421 A 1 +ATOM 3256 O OE2 . GLU A 1 421 ? 16.693 26.085 15.564 1.00 63.84 421 A 1 +ATOM 3257 N N . GLY A 1 422 ? 19.548 22.435 15.489 1.00 90.02 422 A 1 +ATOM 3258 C CA . GLY A 1 422 ? 20.139 21.216 15.985 1.00 90.67 422 A 1 +ATOM 3259 C C . GLY A 1 422 ? 21.089 21.394 17.161 1.00 91.82 422 A 1 +ATOM 3260 O O . GLY A 1 422 ? 21.121 22.421 17.836 1.00 89.27 422 A 1 +ATOM 3261 N N . TYR A 1 423 ? 21.857 20.344 17.433 1.00 92.55 423 A 1 +ATOM 3262 C CA . TYR A 1 423 ? 22.820 20.305 18.526 1.00 93.12 423 A 1 +ATOM 3263 C C . TYR A 1 423 ? 24.107 19.591 18.115 1.00 93.74 423 A 1 +ATOM 3264 O O . TYR A 1 423 ? 24.109 18.703 17.262 1.00 92.22 423 A 1 +ATOM 3265 C CB . TYR A 1 423 ? 22.184 19.673 19.777 1.00 92.27 423 A 1 +ATOM 3266 C CG . TYR A 1 423 ? 21.608 18.282 19.569 1.00 92.36 423 A 1 +ATOM 3267 C CD1 . TYR A 1 423 ? 20.220 18.114 19.346 1.00 82.40 423 A 1 +ATOM 3268 C CD2 . TYR A 1 423 ? 22.433 17.141 19.604 1.00 82.37 423 A 1 +ATOM 3269 C CE1 . TYR A 1 423 ? 19.675 16.837 19.153 1.00 81.69 423 A 1 +ATOM 3270 C CE2 . TYR A 1 423 ? 21.899 15.859 19.407 1.00 80.33 423 A 1 +ATOM 3271 C CZ . TYR A 1 423 ? 20.520 15.700 19.180 1.00 89.13 423 A 1 +ATOM 3272 O OH . TYR A 1 423 ? 19.999 14.451 18.988 1.00 88.27 423 A 1 +ATOM 3273 N N . VAL A 1 424 ? 25.199 19.970 18.768 1.00 93.20 424 A 1 +ATOM 3274 C CA . VAL A 1 424 ? 26.448 19.221 18.750 1.00 93.23 424 A 1 +ATOM 3275 C C . VAL A 1 424 ? 26.384 18.164 19.845 1.00 93.13 424 A 1 +ATOM 3276 O O . VAL A 1 424 ? 26.033 18.470 20.986 1.00 91.88 424 A 1 +ATOM 3277 C CB . VAL A 1 424 ? 27.667 20.140 18.952 1.00 92.41 424 A 1 +ATOM 3278 C CG1 . VAL A 1 424 ? 28.981 19.354 18.916 1.00 84.03 424 A 1 +ATOM 3279 C CG2 . VAL A 1 424 ? 27.740 21.209 17.852 1.00 84.12 424 A 1 +ATOM 3280 N N . GLN A 1 425 ? 26.733 16.924 19.503 1.00 93.38 425 A 1 +ATOM 3281 C CA . GLN A 1 425 ? 26.877 15.834 20.452 1.00 93.12 425 A 1 +ATOM 3282 C C . GLN A 1 425 ? 28.330 15.357 20.459 1.00 93.39 425 A 1 +ATOM 3283 O O . GLN A 1 425 ? 28.824 14.833 19.462 1.00 92.13 425 A 1 +ATOM 3284 C CB . GLN A 1 425 ? 25.878 14.729 20.105 1.00 92.15 425 A 1 +ATOM 3285 C CG . GLN A 1 425 ? 25.935 13.571 21.114 1.00 90.25 425 A 1 +ATOM 3286 C CD . GLN A 1 425 ? 24.824 12.559 20.870 1.00 89.95 425 A 1 +ATOM 3287 O OE1 . GLN A 1 425 ? 23.667 12.788 21.166 1.00 82.57 425 A 1 +ATOM 3288 N NE2 . GLN A 1 425 ? 25.148 11.415 20.331 1.00 80.08 425 A 1 +ATOM 3289 N N . GLU A 1 426 ? 28.996 15.524 21.582 1.00 92.83 426 A 1 +ATOM 3290 C CA . GLU A 1 426 ? 30.359 15.037 21.790 1.00 92.89 426 A 1 +ATOM 3291 C C . GLU A 1 426 ? 30.338 13.859 22.766 1.00 92.64 426 A 1 +ATOM 3292 O O . GLU A 1 426 ? 29.654 13.901 23.788 1.00 90.64 426 A 1 +ATOM 3293 C CB . GLU A 1 426 ? 31.266 16.171 22.286 1.00 91.83 426 A 1 +ATOM 3294 C CG . GLU A 1 426 ? 31.417 17.288 21.235 1.00 86.29 426 A 1 +ATOM 3295 C CD . GLU A 1 426 ? 32.328 18.435 21.695 1.00 84.78 426 A 1 +ATOM 3296 O OE1 . GLU A 1 426 ? 33.229 18.819 20.916 1.00 75.32 426 A 1 +ATOM 3297 O OE2 . GLU A 1 426 ? 32.110 18.949 22.809 1.00 77.32 426 A 1 +ATOM 3298 N N . ARG A 1 427 ? 31.098 12.807 22.459 1.00 92.92 427 A 1 +ATOM 3299 C CA . ARG A 1 427 ? 31.269 11.665 23.362 1.00 93.08 427 A 1 +ATOM 3300 C C . ARG A 1 427 ? 32.725 11.271 23.512 1.00 93.53 427 A 1 +ATOM 3301 O O . ARG A 1 427 ? 33.527 11.381 22.587 1.00 91.41 427 A 1 +ATOM 3302 C CB . ARG A 1 427 ? 30.444 10.452 22.910 1.00 91.42 427 A 1 +ATOM 3303 C CG . ARG A 1 427 ? 28.935 10.634 23.097 1.00 87.86 427 A 1 +ATOM 3304 C CD . ARG A 1 427 ? 28.220 9.353 22.693 1.00 87.09 427 A 1 +ATOM 3305 N NE . ARG A 1 427 ? 26.765 9.435 22.890 1.00 85.15 427 A 1 +ATOM 3306 C CZ . ARG A 1 427 ? 25.842 8.813 22.183 1.00 84.96 427 A 1 +ATOM 3307 N NH1 . ARG A 1 427 ? 26.143 8.017 21.193 1.00 76.98 427 A 1 +ATOM 3308 N NH2 . ARG A 1 427 ? 24.593 8.983 22.454 1.00 79.22 427 A 1 +ATOM 3309 N N . THR A 1 428 ? 33.035 10.740 24.685 1.00 93.25 428 A 1 +ATOM 3310 C CA . THR A 1 428 ? 34.198 9.891 24.908 1.00 93.10 428 A 1 +ATOM 3311 C C . THR A 1 428 ? 33.688 8.550 25.423 1.00 93.20 428 A 1 +ATOM 3312 O O . THR A 1 428 ? 32.933 8.515 26.390 1.00 91.49 428 A 1 +ATOM 3313 C CB . THR A 1 428 ? 35.201 10.520 25.886 1.00 92.51 428 A 1 +ATOM 3314 O OG1 . THR A 1 428 ? 35.524 11.833 25.472 1.00 83.34 428 A 1 +ATOM 3315 C CG2 . THR A 1 428 ? 36.506 9.746 25.939 1.00 81.23 428 A 1 +ATOM 3316 N N . ILE A 1 429 ? 34.085 7.479 24.755 1.00 93.97 429 A 1 +ATOM 3317 C CA . ILE A 1 429 ? 33.661 6.111 25.065 1.00 93.90 429 A 1 +ATOM 3318 C C . ILE A 1 429 ? 34.902 5.332 25.475 1.00 94.06 429 A 1 +ATOM 3319 O O . ILE A 1 429 ? 35.791 5.120 24.646 1.00 92.35 429 A 1 +ATOM 3320 C CB . ILE A 1 429 ? 32.977 5.458 23.842 1.00 93.61 429 A 1 +ATOM 3321 C CG1 . ILE A 1 429 ? 31.812 6.324 23.301 1.00 91.22 429 A 1 +ATOM 3322 C CG2 . ILE A 1 429 ? 32.513 4.041 24.217 1.00 90.49 429 A 1 +ATOM 3323 C CD1 . ILE A 1 429 ? 31.214 5.817 21.977 1.00 87.37 429 A 1 +ATOM 3324 N N . PHE A 1 430 ? 34.981 4.919 26.732 1.00 93.95 430 A 1 +ATOM 3325 C CA . PHE A 1 430 ? 36.103 4.142 27.253 1.00 93.06 430 A 1 +ATOM 3326 C C . PHE A 1 430 ? 35.738 2.659 27.269 1.00 92.64 430 A 1 +ATOM 3327 O O . PHE A 1 430 ? 34.889 2.236 28.060 1.00 90.53 430 A 1 +ATOM 3328 C CB . PHE A 1 430 ? 36.469 4.632 28.655 1.00 92.27 430 A 1 +ATOM 3329 C CG . PHE A 1 430 ? 36.978 6.063 28.697 1.00 89.49 430 A 1 +ATOM 3330 C CD1 . PHE A 1 430 ? 38.331 6.344 28.447 1.00 81.85 430 A 1 +ATOM 3331 C CD2 . PHE A 1 430 ? 36.100 7.120 28.992 1.00 81.68 430 A 1 +ATOM 3332 C CE1 . PHE A 1 430 ? 38.805 7.664 28.500 1.00 81.31 430 A 1 +ATOM 3333 C CE2 . PHE A 1 430 ? 36.573 8.445 29.042 1.00 80.20 430 A 1 +ATOM 3334 C CZ . PHE A 1 430 ? 37.922 8.719 28.799 1.00 84.91 430 A 1 +ATOM 3335 N N . PHE A 1 431 ? 36.375 1.869 26.407 1.00 93.76 431 A 1 +ATOM 3336 C CA . PHE A 1 431 ? 36.275 0.415 26.459 1.00 93.42 431 A 1 +ATOM 3337 C C . PHE A 1 431 ? 37.178 -0.098 27.576 1.00 92.85 431 A 1 +ATOM 3338 O O . PHE A 1 431 ? 38.369 0.193 27.614 1.00 89.97 431 A 1 +ATOM 3339 C CB . PHE A 1 431 ? 36.634 -0.191 25.104 1.00 93.20 431 A 1 +ATOM 3340 C CG . PHE A 1 431 ? 35.639 0.155 24.018 1.00 93.43 431 A 1 +ATOM 3341 C CD1 . PHE A 1 431 ? 34.543 -0.693 23.760 1.00 83.64 431 A 1 +ATOM 3342 C CD2 . PHE A 1 431 ? 35.769 1.353 23.288 1.00 83.72 431 A 1 +ATOM 3343 C CE1 . PHE A 1 431 ? 33.597 -0.357 22.785 1.00 84.30 431 A 1 +ATOM 3344 C CE2 . PHE A 1 431 ? 34.819 1.695 22.313 1.00 83.42 431 A 1 +ATOM 3345 C CZ . PHE A 1 431 ? 33.728 0.839 22.066 1.00 91.27 431 A 1 +ATOM 3346 N N . LYS A 1 432 ? 36.600 -0.850 28.515 1.00 91.34 432 A 1 +ATOM 3347 C CA . LYS A 1 432 ? 37.342 -1.372 29.649 1.00 90.54 432 A 1 +ATOM 3348 C C . LYS A 1 432 ? 38.461 -2.298 29.178 1.00 89.42 432 A 1 +ATOM 3349 O O . LYS A 1 432 ? 38.217 -3.185 28.371 1.00 86.00 432 A 1 +ATOM 3350 C CB . LYS A 1 432 ? 36.374 -2.070 30.614 1.00 89.83 432 A 1 +ATOM 3351 C CG . LYS A 1 432 ? 37.100 -2.460 31.910 1.00 84.06 432 A 1 +ATOM 3352 C CD . LYS A 1 432 ? 36.192 -3.251 32.835 1.00 77.85 432 A 1 +ATOM 3353 C CE . LYS A 1 432 ? 37.035 -3.703 34.025 1.00 68.68 432 A 1 +ATOM 3354 N NZ . LYS A 1 432 ? 36.312 -4.669 34.876 1.00 59.99 432 A 1 +ATOM 3355 N N . ASP A 1 433 ? 39.667 -2.090 29.705 1.00 90.30 433 A 1 +ATOM 3356 C CA . ASP A 1 433 ? 40.891 -2.828 29.356 1.00 89.76 433 A 1 +ATOM 3357 C C . ASP A 1 433 ? 41.291 -2.738 27.862 1.00 90.26 433 A 1 +ATOM 3358 O O . ASP A 1 433 ? 42.097 -3.551 27.392 1.00 85.67 433 A 1 +ATOM 3359 C CB . ASP A 1 433 ? 40.829 -4.267 29.908 1.00 88.16 433 A 1 +ATOM 3360 C CG . ASP A 1 433 ? 40.543 -4.320 31.417 1.00 80.33 433 A 1 +ATOM 3361 O OD1 . ASP A 1 433 ? 41.169 -3.514 32.150 1.00 71.34 433 A 1 +ATOM 3362 O OD2 . ASP A 1 433 ? 39.704 -5.131 31.848 1.00 69.09 433 A 1 +ATOM 3363 N N . ASP A 1 434 ? 40.788 -1.727 27.151 1.00 91.06 434 A 1 +ATOM 3364 C CA . ASP A 1 434 ? 41.076 -1.450 25.742 1.00 92.13 434 A 1 +ATOM 3365 C C . ASP A 1 434 ? 41.094 0.067 25.476 1.00 92.60 434 A 1 +ATOM 3366 O O . ASP A 1 434 ? 41.155 0.866 26.424 1.00 86.92 434 A 1 +ATOM 3367 C CB . ASP A 1 434 ? 40.056 -2.217 24.869 1.00 90.15 434 A 1 +ATOM 3368 C CG . ASP A 1 434 ? 40.639 -2.678 23.528 1.00 90.08 434 A 1 +ATOM 3369 O OD1 . ASP A 1 434 ? 41.527 -1.981 22.980 1.00 81.83 434 A 1 +ATOM 3370 O OD2 . ASP A 1 434 ? 40.222 -3.753 23.044 1.00 82.36 434 A 1 +ATOM 3371 N N . GLY A 1 435 ? 41.071 0.466 24.226 1.00 92.35 435 A 1 +ATOM 3372 C CA . GLY A 1 435 ? 41.151 1.860 23.811 1.00 92.50 435 A 1 +ATOM 3373 C C . GLY A 1 435 ? 39.902 2.701 24.077 1.00 93.47 435 A 1 +ATOM 3374 O O . GLY A 1 435 ? 38.984 2.328 24.813 1.00 90.73 435 A 1 +ATOM 3375 N N . ASN A 1 436 ? 39.856 3.867 23.463 1.00 94.23 436 A 1 +ATOM 3376 C CA . ASN A 1 436 ? 38.728 4.783 23.564 1.00 94.22 436 A 1 +ATOM 3377 C C . ASN A 1 436 ? 38.353 5.405 22.221 1.00 94.46 436 A 1 +ATOM 3378 O O . ASN A 1 436 ? 39.204 5.662 21.366 1.00 92.30 436 A 1 +ATOM 3379 C CB . ASN A 1 436 ? 38.998 5.852 24.641 1.00 92.62 436 A 1 +ATOM 3380 C CG . ASN A 1 436 ? 40.179 6.762 24.318 1.00 89.37 436 A 1 +ATOM 3381 O OD1 . ASN A 1 436 ? 40.057 7.788 23.675 1.00 78.32 436 A 1 +ATOM 3382 N ND2 . ASN A 1 436 ? 41.362 6.414 24.775 1.00 77.55 436 A 1 +ATOM 3383 N N . TYR A 1 437 ? 37.062 5.689 22.063 1.00 94.58 437 A 1 +ATOM 3384 C CA . TYR A 1 437 ? 36.548 6.514 20.980 1.00 94.54 437 A 1 +ATOM 3385 C C . TYR A 1 437 ? 36.289 7.927 21.480 1.00 94.45 437 A 1 +ATOM 3386 O O . TYR A 1 437 ? 35.702 8.127 22.537 1.00 92.50 437 A 1 +ATOM 3387 C CB . TYR A 1 437 ? 35.269 5.915 20.382 1.00 93.74 437 A 1 +ATOM 3388 C CG . TYR A 1 437 ? 35.379 4.565 19.703 1.00 93.26 437 A 1 +ATOM 3389 C CD1 . TYR A 1 437 ? 36.614 4.033 19.284 1.00 86.37 437 A 1 +ATOM 3390 C CD2 . TYR A 1 437 ? 34.207 3.832 19.449 1.00 86.02 437 A 1 +ATOM 3391 C CE1 . TYR A 1 437 ? 36.682 2.793 18.643 1.00 85.73 437 A 1 +ATOM 3392 C CE2 . TYR A 1 437 ? 34.257 2.595 18.808 1.00 85.70 437 A 1 +ATOM 3393 C CZ . TYR A 1 437 ? 35.504 2.064 18.409 1.00 90.45 437 A 1 +ATOM 3394 O OH . TYR A 1 437 ? 35.562 0.848 17.794 1.00 88.66 437 A 1 +ATOM 3395 N N . LYS A 1 438 ? 36.679 8.920 20.678 1.00 93.42 438 A 1 +ATOM 3396 C CA . LYS A 1 438 ? 36.165 10.282 20.770 1.00 93.74 438 A 1 +ATOM 3397 C C . LYS A 1 438 ? 35.311 10.559 19.546 1.00 93.59 438 A 1 +ATOM 3398 O O . LYS A 1 438 ? 35.757 10.326 18.427 1.00 91.45 438 A 1 +ATOM 3399 C CB . LYS A 1 438 ? 37.302 11.299 20.903 1.00 92.82 438 A 1 +ATOM 3400 C CG . LYS A 1 438 ? 37.920 11.219 22.304 1.00 84.37 438 A 1 +ATOM 3401 C CD . LYS A 1 438 ? 38.955 12.329 22.512 1.00 80.32 438 A 1 +ATOM 3402 C CE . LYS A 1 438 ? 39.468 12.238 23.942 1.00 70.74 438 A 1 +ATOM 3403 N NZ . LYS A 1 438 ? 40.396 13.349 24.273 1.00 61.66 438 A 1 +ATOM 3404 N N . THR A 1 439 ? 34.108 11.055 19.769 1.00 94.23 439 A 1 +ATOM 3405 C CA . THR A 1 439 ? 33.169 11.369 18.696 1.00 93.80 439 A 1 +ATOM 3406 C C . THR A 1 439 ? 32.686 12.801 18.819 1.00 93.74 439 A 1 +ATOM 3407 O O . THR A 1 439 ? 32.438 13.291 19.919 1.00 92.16 439 A 1 +ATOM 3408 C CB . THR A 1 439 ? 31.976 10.406 18.662 1.00 92.68 439 A 1 +ATOM 3409 O OG1 . THR A 1 439 ? 31.181 10.512 19.819 1.00 81.41 439 A 1 +ATOM 3410 C CG2 . THR A 1 439 ? 32.417 8.953 18.574 1.00 81.34 439 A 1 +ATOM 3411 N N . ARG A 1 440 ? 32.525 13.457 17.674 1.00 92.95 440 A 1 +ATOM 3412 C CA . ARG A 1 440 ? 31.822 14.732 17.536 1.00 93.24 440 A 1 +ATOM 3413 C C . ARG A 1 440 ? 30.785 14.571 16.440 1.00 92.94 440 A 1 +ATOM 3414 O O . ARG A 1 440 ? 31.131 14.179 15.334 1.00 91.00 440 A 1 +ATOM 3415 C CB . ARG A 1 440 ? 32.837 15.843 17.234 1.00 92.43 440 A 1 +ATOM 3416 C CG . ARG A 1 440 ? 32.145 17.195 17.055 1.00 89.04 440 A 1 +ATOM 3417 C CD . ARG A 1 440 ? 33.165 18.274 16.660 1.00 87.02 440 A 1 +ATOM 3418 N NE . ARG A 1 440 ? 32.507 19.541 16.352 1.00 80.65 440 A 1 +ATOM 3419 C CZ . ARG A 1 440 ? 32.269 20.540 17.192 1.00 75.26 440 A 1 +ATOM 3420 N NH1 . ARG A 1 440 ? 32.683 20.522 18.431 1.00 66.34 440 A 1 +ATOM 3421 N NH2 . ARG A 1 440 ? 31.585 21.567 16.788 1.00 69.86 440 A 1 +ATOM 3422 N N . ALA A 1 441 ? 29.537 14.880 16.753 1.00 93.40 441 A 1 +ATOM 3423 C CA . ALA A 1 441 ? 28.443 14.825 15.797 1.00 93.09 441 A 1 +ATOM 3424 C C . ALA A 1 441 ? 27.682 16.147 15.768 1.00 93.43 441 A 1 +ATOM 3425 O O . ALA A 1 441 ? 27.485 16.783 16.800 1.00 91.85 441 A 1 +ATOM 3426 C CB . ALA A 1 441 ? 27.529 13.654 16.161 1.00 91.69 441 A 1 +ATOM 3427 N N . GLU A 1 442 ? 27.218 16.544 14.582 1.00 92.81 442 A 1 +ATOM 3428 C CA . GLU A 1 442 ? 26.211 17.578 14.411 1.00 92.80 442 A 1 +ATOM 3429 C C . GLU A 1 442 ? 24.902 16.926 13.972 1.00 92.57 442 A 1 +ATOM 3430 O O . GLU A 1 442 ? 24.843 16.271 12.927 1.00 90.53 442 A 1 +ATOM 3431 C CB . GLU A 1 442 ? 26.648 18.647 13.399 1.00 91.63 442 A 1 +ATOM 3432 C CG . GLU A 1 442 ? 27.835 19.484 13.891 1.00 85.44 442 A 1 +ATOM 3433 C CD . GLU A 1 442 ? 28.151 20.684 12.980 1.00 85.39 442 A 1 +ATOM 3434 O OE1 . GLU A 1 442 ? 29.063 21.460 13.348 1.00 77.18 442 A 1 +ATOM 3435 O OE2 . GLU A 1 442 ? 27.470 20.863 11.941 1.00 79.58 442 A 1 +ATOM 3436 N N . VAL A 1 443 ? 23.868 17.097 14.786 1.00 93.06 443 A 1 +ATOM 3437 C CA . VAL A 1 443 ? 22.527 16.572 14.528 1.00 92.73 443 A 1 +ATOM 3438 C C . VAL A 1 443 ? 21.608 17.752 14.267 1.00 92.59 443 A 1 +ATOM 3439 O O . VAL A 1 443 ? 21.367 18.552 15.166 1.00 90.85 443 A 1 +ATOM 3440 C CB . VAL A 1 443 ? 22.010 15.717 15.700 1.00 92.11 443 A 1 +ATOM 3441 C CG1 . VAL A 1 443 ? 20.683 15.052 15.335 1.00 85.41 443 A 1 +ATOM 3442 C CG2 . VAL A 1 443 ? 23.002 14.618 16.077 1.00 83.81 443 A 1 +ATOM 3443 N N . LYS A 1 444 ? 21.102 17.876 13.043 1.00 92.16 444 A 1 +ATOM 3444 C CA . LYS A 1 444 ? 20.285 19.013 12.611 1.00 92.12 444 A 1 +ATOM 3445 C C . LYS A 1 444 ? 19.371 18.638 11.456 1.00 91.96 444 A 1 +ATOM 3446 O O . LYS A 1 444 ? 19.582 17.629 10.784 1.00 90.14 444 A 1 +ATOM 3447 C CB . LYS A 1 444 ? 21.200 20.197 12.243 1.00 89.93 444 A 1 +ATOM 3448 C CG . LYS A 1 444 ? 22.124 19.924 11.044 1.00 84.27 444 A 1 +ATOM 3449 C CD . LYS A 1 444 ? 23.129 21.071 10.879 1.00 85.02 444 A 1 +ATOM 3450 C CE . LYS A 1 444 ? 24.081 20.764 9.723 1.00 75.02 444 A 1 +ATOM 3451 N NZ . LYS A 1 444 ? 25.246 21.678 9.735 1.00 69.13 444 A 1 +ATOM 3452 N N . PHE A 1 445 ? 18.358 19.461 11.187 1.00 91.48 445 A 1 +ATOM 3453 C CA . PHE A 1 445 ? 17.552 19.324 9.979 1.00 90.70 445 A 1 +ATOM 3454 C C . PHE A 1 445 ? 18.257 19.947 8.774 1.00 90.48 445 A 1 +ATOM 3455 O O . PHE A 1 445 ? 18.714 21.083 8.809 1.00 87.98 445 A 1 +ATOM 3456 C CB . PHE A 1 445 ? 16.161 19.918 10.202 1.00 89.59 445 A 1 +ATOM 3457 C CG . PHE A 1 445 ? 15.204 18.933 10.839 1.00 89.20 445 A 1 +ATOM 3458 C CD1 . PHE A 1 445 ? 14.429 18.082 10.025 1.00 81.38 445 A 1 +ATOM 3459 C CD2 . PHE A 1 445 ? 15.077 18.857 12.233 1.00 80.69 445 A 1 +ATOM 3460 C CE1 . PHE A 1 445 ? 13.535 17.170 10.594 1.00 80.24 445 A 1 +ATOM 3461 C CE2 . PHE A 1 445 ? 14.174 17.941 12.811 1.00 79.72 445 A 1 +ATOM 3462 C CZ . PHE A 1 445 ? 13.406 17.108 11.992 1.00 86.34 445 A 1 +ATOM 3463 N N . GLU A 1 446 ? 18.310 19.206 7.671 1.00 88.95 446 A 1 +ATOM 3464 C CA . GLU A 1 446 ? 18.630 19.693 6.335 1.00 88.49 446 A 1 +ATOM 3465 C C . GLU A 1 446 ? 17.376 19.536 5.460 1.00 88.46 446 A 1 +ATOM 3466 O O . GLU A 1 446 ? 17.128 18.483 4.861 1.00 84.24 446 A 1 +ATOM 3467 C CB . GLU A 1 446 ? 19.868 18.985 5.756 1.00 87.30 446 A 1 +ATOM 3468 C CG . GLU A 1 446 ? 21.178 19.314 6.498 1.00 83.87 446 A 1 +ATOM 3469 C CD . GLU A 1 446 ? 22.434 18.658 5.864 1.00 82.31 446 A 1 +ATOM 3470 O OE1 . GLU A 1 446 ? 23.510 18.661 6.521 1.00 73.76 446 A 1 +ATOM 3471 O OE2 . GLU A 1 446 ? 22.377 18.148 4.724 1.00 76.61 446 A 1 +ATOM 3472 N N . GLY A 1 447 ? 16.536 20.578 5.410 1.00 85.88 447 A 1 +ATOM 3473 C CA . GLY A 1 447 ? 15.182 20.509 4.876 1.00 85.30 447 A 1 +ATOM 3474 C C . GLY A 1 447 ? 14.283 19.673 5.798 1.00 86.22 447 A 1 +ATOM 3475 O O . GLY A 1 447 ? 14.169 19.961 6.982 1.00 82.01 447 A 1 +ATOM 3476 N N . ASP A 1 448 ? 13.669 18.635 5.253 1.00 87.81 448 A 1 +ATOM 3477 C CA . ASP A 1 448 ? 12.758 17.724 5.921 1.00 87.25 448 A 1 +ATOM 3478 C C . ASP A 1 448 ? 13.429 16.428 6.426 1.00 88.73 448 A 1 +ATOM 3479 O O . ASP A 1 448 ? 12.765 15.555 6.963 1.00 84.84 448 A 1 +ATOM 3480 C CB . ASP A 1 448 ? 11.586 17.428 4.966 1.00 83.07 448 A 1 +ATOM 3481 C CG . ASP A 1 448 ? 12.000 16.865 3.587 1.00 74.25 448 A 1 +ATOM 3482 O OD1 . ASP A 1 448 ? 13.076 17.257 3.057 1.00 63.33 448 A 1 +ATOM 3483 O OD2 . ASP A 1 448 ? 11.218 16.075 3.017 1.00 64.66 448 A 1 +ATOM 3484 N N . THR A 1 449 ? 14.753 16.314 6.268 1.00 89.35 449 A 1 +ATOM 3485 C CA . THR A 1 449 ? 15.554 15.166 6.711 1.00 89.94 449 A 1 +ATOM 3486 C C . THR A 1 449 ? 16.375 15.542 7.934 1.00 90.67 449 A 1 +ATOM 3487 O O . THR A 1 449 ? 17.069 16.552 7.923 1.00 88.43 449 A 1 +ATOM 3488 C CB . THR A 1 449 ? 16.473 14.675 5.586 1.00 88.55 449 A 1 +ATOM 3489 O OG1 . THR A 1 449 ? 15.697 14.364 4.444 1.00 78.01 449 A 1 +ATOM 3490 C CG2 . THR A 1 449 ? 17.248 13.413 5.938 1.00 76.80 449 A 1 +ATOM 3491 N N . LEU A 1 450 ? 16.328 14.691 8.958 1.00 91.32 450 A 1 +ATOM 3492 C CA . LEU A 1 450 ? 17.264 14.811 10.068 1.00 91.75 450 A 1 +ATOM 3493 C C . LEU A 1 450 ? 18.612 14.204 9.664 1.00 91.83 450 A 1 +ATOM 3494 O O . LEU A 1 450 ? 18.682 13.039 9.287 1.00 90.75 450 A 1 +ATOM 3495 C CB . LEU A 1 450 ? 16.699 14.123 11.318 1.00 91.53 450 A 1 +ATOM 3496 C CG . LEU A 1 450 ? 17.565 14.455 12.544 1.00 90.61 450 A 1 +ATOM 3497 C CD1 . LEU A 1 450 ? 17.104 15.763 13.206 1.00 79.99 450 A 1 +ATOM 3498 C CD2 . LEU A 1 450 ? 17.497 13.342 13.569 1.00 80.06 450 A 1 +ATOM 3499 N N . VAL A 1 451 ? 19.672 14.988 9.784 1.00 92.59 451 A 1 +ATOM 3500 C CA . VAL A 1 451 ? 21.031 14.569 9.426 1.00 92.44 451 A 1 +ATOM 3501 C C . VAL A 1 451 ? 21.902 14.507 10.679 1.00 92.36 451 A 1 +ATOM 3502 O O . VAL A 1 451 ? 21.961 15.459 11.449 1.00 90.96 451 A 1 +ATOM 3503 C CB . VAL A 1 451 ? 21.635 15.493 8.361 1.00 91.16 451 A 1 +ATOM 3504 C CG1 . VAL A 1 451 ? 22.997 14.974 7.892 1.00 82.01 451 A 1 +ATOM 3505 C CG2 . VAL A 1 451 ? 20.727 15.588 7.127 1.00 81.48 451 A 1 +ATOM 3506 N N . ASN A 1 452 ? 22.604 13.385 10.849 1.00 93.12 452 A 1 +ATOM 3507 C CA . ASN A 1 452 ? 23.625 13.182 11.870 1.00 92.71 452 A 1 +ATOM 3508 C C . ASN A 1 452 ? 24.972 12.973 11.175 1.00 92.93 452 A 1 +ATOM 3509 O O . ASN A 1 452 ? 25.205 11.930 10.573 1.00 91.64 452 A 1 +ATOM 3510 C CB . ASN A 1 452 ? 23.203 11.995 12.749 1.00 91.71 452 A 1 +ATOM 3511 C CG . ASN A 1 452 ? 24.200 11.682 13.870 1.00 91.17 452 A 1 +ATOM 3512 O OD1 . ASN A 1 452 ? 25.058 12.471 14.220 1.00 81.68 452 A 1 +ATOM 3513 N ND2 . ASN A 1 452 ? 24.081 10.530 14.475 1.00 81.87 452 A 1 +ATOM 3514 N N . ARG A 1 453 ? 25.846 13.971 11.242 1.00 92.35 453 A 1 +ATOM 3515 C CA . ARG A 1 453 ? 27.211 13.921 10.690 1.00 92.43 453 A 1 +ATOM 3516 C C . ARG A 1 453 ? 28.205 13.737 11.823 1.00 92.32 453 A 1 +ATOM 3517 O O . ARG A 1 453 ? 28.232 14.555 12.743 1.00 90.62 453 A 1 +ATOM 3518 C CB . ARG A 1 453 ? 27.524 15.184 9.887 1.00 91.22 453 A 1 +ATOM 3519 C CG . ARG A 1 453 ? 26.660 15.311 8.634 1.00 84.13 453 A 1 +ATOM 3520 C CD . ARG A 1 453 ? 27.053 16.565 7.837 1.00 82.65 453 A 1 +ATOM 3521 N NE . ARG A 1 453 ? 26.131 16.802 6.716 1.00 78.22 453 A 1 +ATOM 3522 C CZ . ARG A 1 453 ? 26.142 16.203 5.529 1.00 73.21 453 A 1 +ATOM 3523 N NH1 . ARG A 1 453 ? 27.100 15.412 5.161 1.00 63.62 453 A 1 +ATOM 3524 N NH2 . ARG A 1 453 ? 25.151 16.375 4.718 1.00 68.45 453 A 1 +ATOM 3525 N N . ILE A 1 454 ? 29.005 12.693 11.752 1.00 93.54 454 A 1 +ATOM 3526 C CA . ILE A 1 454 ? 29.840 12.234 12.860 1.00 93.75 454 A 1 +ATOM 3527 C C . ILE A 1 454 ? 31.280 12.083 12.391 1.00 93.82 454 A 1 +ATOM 3528 O O . ILE A 1 454 ? 31.560 11.422 11.398 1.00 92.12 454 A 1 +ATOM 3529 C CB . ILE A 1 454 ? 29.318 10.900 13.434 1.00 93.07 454 A 1 +ATOM 3530 C CG1 . ILE A 1 454 ? 27.782 10.894 13.673 1.00 86.43 454 A 1 +ATOM 3531 C CG2 . ILE A 1 454 ? 30.050 10.584 14.753 1.00 85.03 454 A 1 +ATOM 3532 C CD1 . ILE A 1 454 ? 27.203 9.493 13.882 1.00 83.18 454 A 1 +ATOM 3533 N N . GLU A 1 455 ? 32.201 12.626 13.172 1.00 93.56 455 A 1 +ATOM 3534 C CA . GLU A 1 455 ? 33.613 12.257 13.136 1.00 93.41 455 A 1 +ATOM 3535 C C . GLU A 1 455 ? 33.937 11.402 14.364 1.00 93.47 455 A 1 +ATOM 3536 O O . GLU A 1 455 ? 33.595 11.764 15.497 1.00 91.86 455 A 1 +ATOM 3537 C CB . GLU A 1 455 ? 34.511 13.501 13.082 1.00 92.34 455 A 1 +ATOM 3538 C CG . GLU A 1 455 ? 34.407 14.247 11.744 1.00 79.16 455 A 1 +ATOM 3539 C CD . GLU A 1 455 ? 35.370 15.456 11.661 1.00 74.44 455 A 1 +ATOM 3540 O OE1 . GLU A 1 455 ? 35.517 16.006 10.547 1.00 65.03 455 A 1 +ATOM 3541 O OE2 . GLU A 1 455 ? 35.952 15.831 12.708 1.00 66.82 455 A 1 +ATOM 3542 N N . LEU A 1 456 ? 34.601 10.258 14.142 1.00 93.64 456 A 1 +ATOM 3543 C CA . LEU A 1 456 ? 35.038 9.361 15.202 1.00 93.75 456 A 1 +ATOM 3544 C C . LEU A 1 456 ? 36.540 9.154 15.125 1.00 93.70 456 A 1 +ATOM 3545 O O . LEU A 1 456 ? 37.075 8.771 14.082 1.00 92.31 456 A 1 +ATOM 3546 C CB . LEU A 1 456 ? 34.233 8.048 15.116 1.00 93.00 456 A 1 +ATOM 3547 C CG . LEU A 1 456 ? 34.605 6.989 16.183 1.00 93.29 456 A 1 +ATOM 3548 C CD1 . LEU A 1 456 ? 33.405 6.085 16.450 1.00 83.68 456 A 1 +ATOM 3549 C CD2 . LEU A 1 456 ? 35.750 6.073 15.747 1.00 83.48 456 A 1 +ATOM 3550 N N . LYS A 1 457 ? 37.214 9.323 16.248 1.00 93.74 457 A 1 +ATOM 3551 C CA . LYS A 1 457 ? 38.628 8.989 16.390 1.00 93.91 457 A 1 +ATOM 3552 C C . LYS A 1 457 ? 38.832 8.012 17.542 1.00 93.88 457 A 1 +ATOM 3553 O O . LYS A 1 457 ? 38.497 8.327 18.677 1.00 91.58 457 A 1 +ATOM 3554 C CB . LYS A 1 457 ? 39.444 10.274 16.520 1.00 92.86 457 A 1 +ATOM 3555 C CG . LYS A 1 457 ? 40.945 9.958 16.409 1.00 85.20 457 A 1 +ATOM 3556 C CD . LYS A 1 457 ? 41.729 11.159 15.895 1.00 78.49 457 A 1 +ATOM 3557 C CE . LYS A 1 457 ? 43.163 10.707 15.627 1.00 69.18 457 A 1 +ATOM 3558 N NZ . LYS A 1 457 ? 43.823 11.564 14.609 1.00 60.36 457 A 1 +ATOM 3559 N N . GLY A 1 458 ? 39.385 6.840 17.232 1.00 93.79 458 A 1 +ATOM 3560 C CA . GLY A 1 458 ? 39.755 5.823 18.203 1.00 93.22 458 A 1 +ATOM 3561 C C . GLY A 1 458 ? 41.273 5.722 18.345 1.00 93.67 458 A 1 +ATOM 3562 O O . GLY A 1 458 ? 41.996 5.782 17.356 1.00 90.97 458 A 1 +ATOM 3563 N N . ILE A 1 459 ? 41.742 5.579 19.574 1.00 93.52 459 A 1 +ATOM 3564 C CA . ILE A 1 459 ? 43.162 5.462 19.923 1.00 93.32 459 A 1 +ATOM 3565 C C . ILE A 1 459 ? 43.374 4.392 20.990 1.00 93.39 459 A 1 +ATOM 3566 O O . ILE A 1 459 ? 42.447 4.048 21.722 1.00 90.04 459 A 1 +ATOM 3567 C CB . ILE A 1 459 ? 43.746 6.821 20.371 1.00 91.27 459 A 1 +ATOM 3568 C CG1 . ILE A 1 459 ? 42.987 7.432 21.571 1.00 82.14 459 A 1 +ATOM 3569 C CG2 . ILE A 1 459 ? 43.810 7.806 19.190 1.00 80.31 459 A 1 +ATOM 3570 C CD1 . ILE A 1 459 ? 43.678 8.656 22.200 1.00 76.05 459 A 1 +ATOM 3571 N N . ASP A 1 460 ? 44.611 3.898 21.088 1.00 92.10 460 A 1 +ATOM 3572 C CA . ASP A 1 460 ? 45.067 2.981 22.141 1.00 92.32 460 A 1 +ATOM 3573 C C . ASP A 1 460 ? 44.317 1.636 22.200 1.00 92.76 460 A 1 +ATOM 3574 O O . ASP A 1 460 ? 44.242 1.004 23.252 1.00 88.56 460 A 1 +ATOM 3575 C CB . ASP A 1 460 ? 45.141 3.708 23.495 1.00 90.79 460 A 1 +ATOM 3576 C CG . ASP A 1 460 ? 45.938 5.015 23.449 1.00 87.50 460 A 1 +ATOM 3577 O OD1 . ASP A 1 460 ? 46.947 5.071 22.702 1.00 79.60 460 A 1 +ATOM 3578 O OD2 . ASP A 1 460 ? 45.533 5.974 24.140 1.00 78.66 460 A 1 +ATOM 3579 N N . PHE A 1 461 ? 43.768 1.176 21.064 1.00 92.99 461 A 1 +ATOM 3580 C CA . PHE A 1 461 ? 43.165 -0.147 20.953 1.00 93.10 461 A 1 +ATOM 3581 C C . PHE A 1 461 ? 44.226 -1.234 20.795 1.00 92.86 461 A 1 +ATOM 3582 O O . PHE A 1 461 ? 45.244 -1.046 20.122 1.00 89.19 461 A 1 +ATOM 3583 C CB . PHE A 1 461 ? 42.158 -0.191 19.799 1.00 92.94 461 A 1 +ATOM 3584 C CG . PHE A 1 461 ? 40.865 0.516 20.125 1.00 94.23 461 A 1 +ATOM 3585 C CD1 . PHE A 1 461 ? 39.834 -0.165 20.782 1.00 87.67 461 A 1 +ATOM 3586 C CD2 . PHE A 1 461 ? 40.711 1.884 19.830 1.00 87.16 461 A 1 +ATOM 3587 C CE1 . PHE A 1 461 ? 38.664 0.504 21.153 1.00 86.89 461 A 1 +ATOM 3588 C CE2 . PHE A 1 461 ? 39.541 2.560 20.210 1.00 86.80 461 A 1 +ATOM 3589 C CZ . PHE A 1 461 ? 38.523 1.870 20.874 1.00 92.41 461 A 1 +ATOM 3590 N N . LYS A 1 462 ? 43.952 -2.402 21.368 1.00 93.01 462 A 1 +ATOM 3591 C CA . LYS A 1 462 ? 44.749 -3.608 21.172 1.00 92.57 462 A 1 +ATOM 3592 C C . LYS A 1 462 ? 44.330 -4.286 19.870 1.00 92.01 462 A 1 +ATOM 3593 O O . LYS A 1 462 ? 43.149 -4.559 19.683 1.00 88.79 462 A 1 +ATOM 3594 C CB . LYS A 1 462 ? 44.557 -4.550 22.362 1.00 90.93 462 A 1 +ATOM 3595 C CG . LYS A 1 462 ? 45.021 -3.939 23.692 1.00 86.59 462 A 1 +ATOM 3596 C CD . LYS A 1 462 ? 44.632 -4.868 24.846 1.00 84.37 462 A 1 +ATOM 3597 C CE . LYS A 1 462 ? 44.955 -4.209 26.190 1.00 76.19 462 A 1 +ATOM 3598 N NZ . LYS A 1 462 ? 44.277 -4.924 27.299 1.00 68.50 462 A 1 +ATOM 3599 N N . GLU A 1 463 ? 45.285 -4.619 19.007 1.00 91.61 463 A 1 +ATOM 3600 C CA . GLU A 1 463 ? 45.013 -5.274 17.712 1.00 90.31 463 A 1 +ATOM 3601 C C . GLU A 1 463 ? 44.376 -6.666 17.877 1.00 90.22 463 A 1 +ATOM 3602 O O . GLU A 1 463 ? 43.564 -7.090 17.056 1.00 85.91 463 A 1 +ATOM 3603 C CB . GLU A 1 463 ? 46.325 -5.390 16.909 1.00 88.72 463 A 1 +ATOM 3604 C CG . GLU A 1 463 ? 46.861 -4.039 16.398 1.00 81.95 463 A 1 +ATOM 3605 C CD . GLU A 1 463 ? 45.984 -3.392 15.305 1.00 77.09 463 A 1 +ATOM 3606 O OE1 . GLU A 1 463 ? 46.018 -2.142 15.181 1.00 69.08 463 A 1 +ATOM 3607 O OE2 . GLU A 1 463 ? 45.290 -4.125 14.571 1.00 71.49 463 A 1 +ATOM 3608 N N . ASP A 1 464 ? 44.663 -7.362 18.959 1.00 90.73 464 A 1 +ATOM 3609 C CA . ASP A 1 464 ? 44.077 -8.653 19.332 1.00 89.87 464 A 1 +ATOM 3610 C C . ASP A 1 464 ? 42.967 -8.540 20.392 1.00 90.56 464 A 1 +ATOM 3611 O O . ASP A 1 464 ? 42.488 -9.559 20.910 1.00 84.50 464 A 1 +ATOM 3612 C CB . ASP A 1 464 ? 45.206 -9.596 19.785 1.00 86.54 464 A 1 +ATOM 3613 C CG . ASP A 1 464 ? 45.837 -9.200 21.130 1.00 77.06 464 A 1 +ATOM 3614 O OD1 . ASP A 1 464 ? 45.911 -7.979 21.418 1.00 66.15 464 A 1 +ATOM 3615 O OD2 . ASP A 1 464 ? 46.244 -10.117 21.856 1.00 66.79 464 A 1 +ATOM 3616 N N . GLY A 1 465 ? 42.575 -7.323 20.736 1.00 90.59 465 A 1 +ATOM 3617 C CA . GLY A 1 465 ? 41.501 -7.028 21.672 1.00 90.12 465 A 1 +ATOM 3618 C C . GLY A 1 465 ? 40.114 -7.400 21.138 1.00 91.18 465 A 1 +ATOM 3619 O O . GLY A 1 465 ? 39.950 -7.851 20.009 1.00 87.63 465 A 1 +ATOM 3620 N N . ASN A 1 466 ? 39.097 -7.196 21.964 1.00 92.23 466 A 1 +ATOM 3621 C CA . ASN A 1 466 ? 37.720 -7.528 21.590 1.00 91.41 466 A 1 +ATOM 3622 C C . ASN A 1 466 ? 37.166 -6.644 20.465 1.00 91.92 466 A 1 +ATOM 3623 O O . ASN A 1 466 ? 36.243 -7.059 19.764 1.00 88.37 466 A 1 +ATOM 3624 C CB . ASN A 1 466 ? 36.828 -7.429 22.839 1.00 90.16 466 A 1 +ATOM 3625 C CG . ASN A 1 466 ? 37.182 -8.457 23.908 1.00 88.93 466 A 1 +ATOM 3626 O OD1 . ASN A 1 466 ? 37.726 -9.511 23.642 1.00 79.45 466 A 1 +ATOM 3627 N ND2 . ASN A 1 466 ? 36.874 -8.156 25.148 1.00 78.55 466 A 1 +ATOM 3628 N N . ILE A 1 467 ? 37.720 -5.452 20.275 1.00 92.35 467 A 1 +ATOM 3629 C CA . ILE A 1 467 ? 37.271 -4.477 19.273 1.00 92.53 467 A 1 +ATOM 3630 C C . ILE A 1 467 ? 37.941 -4.759 17.927 1.00 92.38 467 A 1 +ATOM 3631 O O . ILE A 1 467 ? 37.273 -5.220 17.000 1.00 89.76 467 A 1 +ATOM 3632 C CB . ILE A 1 467 ? 37.474 -3.030 19.772 1.00 92.32 467 A 1 +ATOM 3633 C CG1 . ILE A 1 467 ? 36.965 -2.789 21.215 1.00 88.22 467 A 1 +ATOM 3634 C CG2 . ILE A 1 467 ? 36.819 -2.036 18.802 1.00 86.21 467 A 1 +ATOM 3635 C CD1 . ILE A 1 467 ? 35.517 -3.208 21.487 1.00 78.96 467 A 1 +ATOM 3636 N N . LEU A 1 468 ? 39.253 -4.561 17.810 1.00 92.48 468 A 1 +ATOM 3637 C CA . LEU A 1 468 ? 39.970 -4.808 16.558 1.00 92.15 468 A 1 +ATOM 3638 C C . LEU A 1 468 ? 40.058 -6.298 16.198 1.00 91.83 468 A 1 +ATOM 3639 O O . LEU A 1 468 ? 40.041 -6.658 15.024 1.00 88.30 468 A 1 +ATOM 3640 C CB . LEU A 1 468 ? 41.372 -4.173 16.630 1.00 91.65 468 A 1 +ATOM 3641 C CG . LEU A 1 468 ? 41.368 -2.633 16.701 1.00 90.66 468 A 1 +ATOM 3642 C CD1 . LEU A 1 468 ? 42.796 -2.125 16.842 1.00 83.11 468 A 1 +ATOM 3643 C CD2 . LEU A 1 468 ? 40.759 -1.987 15.458 1.00 82.64 468 A 1 +ATOM 3644 N N . GLY A 1 469 ? 40.056 -7.173 17.199 1.00 91.86 469 A 1 +ATOM 3645 C CA . GLY A 1 469 ? 39.993 -8.630 17.025 1.00 90.60 469 A 1 +ATOM 3646 C C . GLY A 1 469 ? 38.600 -9.177 16.699 1.00 90.95 469 A 1 +ATOM 3647 O O . GLY A 1 469 ? 38.468 -10.387 16.555 1.00 86.96 469 A 1 +ATOM 3648 N N . HIS A 1 470 ? 37.576 -8.323 16.599 1.00 90.80 470 A 1 +ATOM 3649 C CA . HIS A 1 470 ? 36.198 -8.699 16.247 1.00 89.99 470 A 1 +ATOM 3650 C C . HIS A 1 470 ? 35.602 -9.816 17.118 1.00 90.16 470 A 1 +ATOM 3651 O O . HIS A 1 470 ? 34.945 -10.722 16.600 1.00 85.64 470 A 1 +ATOM 3652 C CB . HIS A 1 470 ? 36.098 -8.996 14.741 1.00 88.49 470 A 1 +ATOM 3653 C CG . HIS A 1 470 ? 36.159 -7.787 13.869 1.00 88.62 470 A 1 +ATOM 3654 N ND1 . HIS A 1 470 ? 35.066 -7.039 13.482 1.00 76.40 470 A 1 +ATOM 3655 C CD2 . HIS A 1 470 ? 37.257 -7.252 13.240 1.00 76.72 470 A 1 +ATOM 3656 C CE1 . HIS A 1 470 ? 35.505 -6.081 12.639 1.00 79.34 470 A 1 +ATOM 3657 N NE2 . HIS A 1 470 ? 36.825 -6.181 12.460 1.00 80.90 470 A 1 +ATOM 3658 N N . LYS A 1 471 ? 35.765 -9.755 18.425 1.00 89.64 471 A 1 +ATOM 3659 C CA . LYS A 1 471 ? 35.317 -10.768 19.394 1.00 89.65 471 A 1 +ATOM 3660 C C . LYS A 1 471 ? 33.975 -10.437 20.071 1.00 89.76 471 A 1 +ATOM 3661 O O . LYS A 1 471 ? 33.641 -11.042 21.088 1.00 86.31 471 A 1 +ATOM 3662 C CB . LYS A 1 471 ? 36.423 -11.023 20.430 1.00 88.66 471 A 1 +ATOM 3663 C CG . LYS A 1 471 ? 37.740 -11.496 19.796 1.00 88.17 471 A 1 +ATOM 3664 C CD . LYS A 1 471 ? 38.833 -11.650 20.860 1.00 84.08 471 A 1 +ATOM 3665 C CE . LYS A 1 471 ? 40.166 -11.972 20.190 1.00 78.36 471 A 1 +ATOM 3666 N NZ . LYS A 1 471 ? 41.321 -11.729 21.093 1.00 68.85 471 A 1 +ATOM 3667 N N . LEU A 1 472 ? 33.234 -9.467 19.560 1.00 90.21 472 A 1 +ATOM 3668 C CA . LEU A 1 472 ? 31.921 -9.105 20.081 1.00 90.59 472 A 1 +ATOM 3669 C C . LEU A 1 472 ? 30.805 -9.780 19.276 1.00 89.92 472 A 1 +ATOM 3670 O O . LEU A 1 472 ? 30.847 -9.810 18.045 1.00 87.07 472 A 1 +ATOM 3671 C CB . LEU A 1 472 ? 31.730 -7.582 20.107 1.00 90.59 472 A 1 +ATOM 3672 C CG . LEU A 1 472 ? 32.784 -6.795 20.900 1.00 90.08 472 A 1 +ATOM 3673 C CD1 . LEU A 1 472 ? 32.376 -5.333 20.952 1.00 81.76 472 A 1 +ATOM 3674 C CD2 . LEU A 1 472 ? 32.938 -7.290 22.338 1.00 82.51 472 A 1 +ATOM 3675 N N . GLU A 1 473 ? 29.777 -10.249 19.958 1.00 88.91 473 A 1 +ATOM 3676 C CA . GLU A 1 473 ? 28.575 -10.781 19.327 1.00 87.84 473 A 1 +ATOM 3677 C C . GLU A 1 473 ? 27.816 -9.697 18.551 1.00 88.18 473 A 1 +ATOM 3678 O O . GLU A 1 473 ? 27.772 -8.532 18.949 1.00 85.66 473 A 1 +ATOM 3679 C CB . GLU A 1 473 ? 27.643 -11.401 20.377 1.00 85.21 473 A 1 +ATOM 3680 C CG . GLU A 1 473 ? 28.256 -12.611 21.093 1.00 80.79 473 A 1 +ATOM 3681 C CD . GLU A 1 473 ? 27.267 -13.259 22.078 1.00 79.54 473 A 1 +ATOM 3682 O OE1 . GLU A 1 473 ? 27.600 -14.337 22.622 1.00 70.62 473 A 1 +ATOM 3683 O OE2 . GLU A 1 473 ? 26.163 -12.714 22.302 1.00 73.72 473 A 1 +ATOM 3684 N N . TYR A 1 474 ? 27.163 -10.101 17.462 1.00 87.57 474 A 1 +ATOM 3685 C CA . TYR A 1 474 ? 26.311 -9.209 16.675 1.00 87.06 474 A 1 +ATOM 3686 C C . TYR A 1 474 ? 24.904 -9.092 17.284 1.00 86.50 474 A 1 +ATOM 3687 O O . TYR A 1 474 ? 23.895 -9.504 16.697 1.00 82.44 474 A 1 +ATOM 3688 C CB . TYR A 1 474 ? 26.311 -9.648 15.209 1.00 86.13 474 A 1 +ATOM 3689 C CG . TYR A 1 474 ? 25.634 -8.641 14.296 1.00 86.69 474 A 1 +ATOM 3690 C CD1 . TYR A 1 474 ? 24.345 -8.887 13.806 1.00 77.79 474 A 1 +ATOM 3691 C CD2 . TYR A 1 474 ? 26.285 -7.430 13.973 1.00 77.43 474 A 1 +ATOM 3692 C CE1 . TYR A 1 474 ? 23.703 -7.954 12.976 1.00 77.83 474 A 1 +ATOM 3693 C CE2 . TYR A 1 474 ? 25.655 -6.486 13.152 1.00 77.60 474 A 1 +ATOM 3694 C CZ . TYR A 1 474 ? 24.363 -6.753 12.644 1.00 86.41 474 A 1 +ATOM 3695 O OH . TYR A 1 474 ? 23.746 -5.838 11.834 1.00 84.82 474 A 1 +ATOM 3696 N N . ASN A 1 475 ? 24.839 -8.553 18.479 1.00 88.91 475 A 1 +ATOM 3697 C CA . ASN A 1 475 ? 23.613 -8.309 19.226 1.00 88.06 475 A 1 +ATOM 3698 C C . ASN A 1 475 ? 23.794 -7.082 20.128 1.00 88.75 475 A 1 +ATOM 3699 O O . ASN A 1 475 ? 24.880 -6.497 20.189 1.00 85.94 475 A 1 +ATOM 3700 C CB . ASN A 1 475 ? 23.213 -9.596 19.971 1.00 84.84 475 A 1 +ATOM 3701 C CG . ASN A 1 475 ? 24.206 -10.055 21.023 1.00 83.19 475 A 1 +ATOM 3702 O OD1 . ASN A 1 475 ? 24.850 -9.285 21.698 1.00 74.49 475 A 1 +ATOM 3703 N ND2 . ASN A 1 475 ? 24.304 -11.357 21.220 1.00 75.10 475 A 1 +ATOM 3704 N N . TYR A 1 476 ? 22.704 -6.677 20.793 1.00 86.11 476 A 1 +ATOM 3705 C CA . TYR A 1 476 ? 22.734 -5.488 21.635 1.00 87.19 476 A 1 +ATOM 3706 C C . TYR A 1 476 ? 21.826 -5.646 22.853 1.00 86.34 476 A 1 +ATOM 3707 O O . TYR A 1 476 ? 20.712 -6.152 22.746 1.00 80.62 476 A 1 +ATOM 3708 C CB . TYR A 1 476 ? 22.358 -4.265 20.792 1.00 86.85 476 A 1 +ATOM 3709 C CG . TYR A 1 476 ? 23.150 -3.035 21.182 1.00 88.20 476 A 1 +ATOM 3710 C CD1 . TYR A 1 476 ? 22.579 -2.028 21.975 1.00 80.72 476 A 1 +ATOM 3711 C CD2 . TYR A 1 476 ? 24.481 -2.914 20.744 1.00 80.75 476 A 1 +ATOM 3712 C CE1 . TYR A 1 476 ? 23.328 -0.899 22.315 1.00 80.01 476 A 1 +ATOM 3713 C CE2 . TYR A 1 476 ? 25.236 -1.791 21.087 1.00 80.56 476 A 1 +ATOM 3714 C CZ . TYR A 1 476 ? 24.663 -0.773 21.871 1.00 87.40 476 A 1 +ATOM 3715 O OH . TYR A 1 476 ? 25.399 0.323 22.198 1.00 85.68 476 A 1 +ATOM 3716 N N . ASN A 1 477 ? 22.293 -5.224 24.013 1.00 87.68 477 A 1 +ATOM 3717 C CA . ASN A 1 477 ? 21.527 -5.253 25.246 1.00 86.42 477 A 1 +ATOM 3718 C C . ASN A 1 477 ? 20.689 -3.979 25.413 1.00 86.32 477 A 1 +ATOM 3719 O O . ASN A 1 477 ? 20.938 -2.962 24.769 1.00 82.13 477 A 1 +ATOM 3720 C CB . ASN A 1 477 ? 22.489 -5.486 26.419 1.00 83.92 477 A 1 +ATOM 3721 C CG . ASN A 1 477 ? 23.100 -6.887 26.405 1.00 83.56 477 A 1 +ATOM 3722 O OD1 . ASN A 1 477 ? 22.409 -7.886 26.348 1.00 75.61 477 A 1 +ATOM 3723 N ND2 . ASN A 1 477 ? 24.410 -6.988 26.487 1.00 73.78 477 A 1 +ATOM 3724 N N . SER A 1 478 ? 19.723 -4.023 26.324 1.00 85.55 478 A 1 +ATOM 3725 C CA . SER A 1 478 ? 18.984 -2.836 26.737 1.00 84.69 478 A 1 +ATOM 3726 C C . SER A 1 478 ? 19.758 -2.039 27.782 1.00 84.83 478 A 1 +ATOM 3727 O O . SER A 1 478 ? 20.400 -2.614 28.661 1.00 81.79 478 A 1 +ATOM 3728 C CB . SER A 1 478 ? 17.608 -3.210 27.280 1.00 81.54 478 A 1 +ATOM 3729 O OG . SER A 1 478 ? 16.848 -3.766 26.227 1.00 70.88 478 A 1 +ATOM 3730 N N . HIS A 1 479 ? 19.673 -0.708 27.689 1.00 86.79 479 A 1 +ATOM 3731 C CA . HIS A 1 479 ? 20.373 0.199 28.588 1.00 86.29 479 A 1 +ATOM 3732 C C . HIS A 1 479 ? 19.506 1.409 28.937 1.00 86.33 479 A 1 +ATOM 3733 O O . HIS A 1 479 ? 18.690 1.849 28.130 1.00 83.86 479 A 1 +ATOM 3734 C CB . HIS A 1 479 ? 21.683 0.681 27.947 1.00 85.30 479 A 1 +ATOM 3735 C CG . HIS A 1 479 ? 22.566 -0.435 27.482 1.00 86.18 479 A 1 +ATOM 3736 N ND1 . HIS A 1 479 ? 22.560 -0.995 26.218 1.00 75.96 479 A 1 +ATOM 3737 C CD2 . HIS A 1 479 ? 23.506 -1.116 28.208 1.00 76.15 479 A 1 +ATOM 3738 C CE1 . HIS A 1 479 ? 23.471 -1.975 26.192 1.00 77.49 479 A 1 +ATOM 3739 N NE2 . HIS A 1 479 ? 24.068 -2.086 27.382 1.00 79.24 479 A 1 +ATOM 3740 N N . ASN A 1 480 ? 19.759 1.978 30.112 1.00 86.62 480 A 1 +ATOM 3741 C CA . ASN A 1 480 ? 19.241 3.279 30.508 1.00 86.48 480 A 1 +ATOM 3742 C C . ASN A 1 480 ? 20.334 4.340 30.334 1.00 86.84 480 A 1 +ATOM 3743 O O . ASN A 1 480 ? 21.452 4.190 30.823 1.00 84.38 480 A 1 +ATOM 3744 C CB . ASN A 1 480 ? 18.710 3.213 31.944 1.00 84.37 480 A 1 +ATOM 3745 C CG . ASN A 1 480 ? 17.508 2.289 32.076 1.00 83.06 480 A 1 +ATOM 3746 O OD1 . ASN A 1 480 ? 16.837 1.943 31.112 1.00 75.43 480 A 1 +ATOM 3747 N ND2 . ASN A 1 480 ? 17.218 1.860 33.287 1.00 75.05 480 A 1 +ATOM 3748 N N . VAL A 1 481 ? 19.982 5.398 29.624 1.00 88.78 481 A 1 +ATOM 3749 C CA . VAL A 1 481 ? 20.861 6.519 29.291 1.00 89.14 481 A 1 +ATOM 3750 C C . VAL A 1 481 ? 20.483 7.683 30.203 1.00 89.97 481 A 1 +ATOM 3751 O O . VAL A 1 481 ? 19.464 8.331 29.970 1.00 87.60 481 A 1 +ATOM 3752 C CB . VAL A 1 481 ? 20.702 6.865 27.801 1.00 87.40 481 A 1 +ATOM 3753 C CG1 . VAL A 1 481 ? 21.585 8.047 27.418 1.00 79.80 481 A 1 +ATOM 3754 C CG2 . VAL A 1 481 ? 21.093 5.681 26.903 1.00 79.36 481 A 1 +ATOM 3755 N N . TYR A 1 482 ? 21.272 7.943 31.230 1.00 88.99 482 A 1 +ATOM 3756 C CA . TYR A 1 482 ? 20.950 8.950 32.244 1.00 87.84 482 A 1 +ATOM 3757 C C . TYR A 1 482 ? 21.323 10.356 31.779 1.00 88.41 482 A 1 +ATOM 3758 O O . TYR A 1 482 ? 22.467 10.616 31.413 1.00 86.68 482 A 1 +ATOM 3759 C CB . TYR A 1 482 ? 21.636 8.606 33.574 1.00 85.26 482 A 1 +ATOM 3760 C CG . TYR A 1 482 ? 21.164 7.294 34.163 1.00 79.13 482 A 1 +ATOM 3761 C CD1 . TYR A 1 482 ? 19.988 7.240 34.936 1.00 71.42 482 A 1 +ATOM 3762 C CD2 . TYR A 1 482 ? 21.879 6.102 33.906 1.00 71.03 482 A 1 +ATOM 3763 C CE1 . TYR A 1 482 ? 19.525 6.006 35.448 1.00 67.54 482 A 1 +ATOM 3764 C CE2 . TYR A 1 482 ? 21.422 4.869 34.407 1.00 66.51 482 A 1 +ATOM 3765 C CZ . TYR A 1 482 ? 20.238 4.824 35.176 1.00 70.22 482 A 1 +ATOM 3766 O OH . TYR A 1 482 ? 19.788 3.618 35.655 1.00 67.38 482 A 1 +ATOM 3767 N N . ILE A 1 483 ? 20.347 11.260 31.813 1.00 89.87 483 A 1 +ATOM 3768 C CA . ILE A 1 483 ? 20.446 12.639 31.333 1.00 90.58 483 A 1 +ATOM 3769 C C . ILE A 1 483 ? 20.326 13.605 32.503 1.00 90.25 483 A 1 +ATOM 3770 O O . ILE A 1 483 ? 19.459 13.470 33.362 1.00 87.96 483 A 1 +ATOM 3771 C CB . ILE A 1 483 ? 19.374 12.916 30.255 1.00 89.91 483 A 1 +ATOM 3772 C CG1 . ILE A 1 483 ? 19.541 11.943 29.060 1.00 86.26 483 A 1 +ATOM 3773 C CG2 . ILE A 1 483 ? 19.439 14.382 29.779 1.00 85.53 483 A 1 +ATOM 3774 C CD1 . ILE A 1 483 ? 18.446 12.051 28.007 1.00 81.15 483 A 1 +ATOM 3775 N N . MET A 1 484 ? 21.179 14.608 32.512 1.00 90.33 484 A 1 +ATOM 3776 C CA . MET A 1 484 ? 21.170 15.716 33.458 1.00 89.76 484 A 1 +ATOM 3777 C C . MET A 1 484 ? 21.482 17.031 32.748 1.00 90.01 484 A 1 +ATOM 3778 O O . MET A 1 484 ? 22.232 17.063 31.786 1.00 88.11 484 A 1 +ATOM 3779 C CB . MET A 1 484 ? 22.126 15.483 34.644 1.00 87.26 484 A 1 +ATOM 3780 C CG . MET A 1 484 ? 23.146 14.357 34.501 1.00 76.03 484 A 1 +ATOM 3781 S SD . MET A 1 484 ? 24.150 14.004 35.984 1.00 71.06 484 A 1 +ATOM 3782 C CE . MET A 1 484 ? 25.050 15.563 36.150 1.00 58.99 484 A 1 +ATOM 3783 N N . ALA A 1 485 ? 20.897 18.135 33.228 1.00 89.67 485 A 1 +ATOM 3784 C CA . ALA A 1 485 ? 21.149 19.449 32.655 1.00 89.33 485 A 1 +ATOM 3785 C C . ALA A 1 485 ? 22.601 19.900 32.878 1.00 89.31 485 A 1 +ATOM 3786 O O . ALA A 1 485 ? 23.164 19.743 33.959 1.00 86.29 485 A 1 +ATOM 3787 C CB . ALA A 1 485 ? 20.145 20.448 33.247 1.00 87.26 485 A 1 +ATOM 3788 N N . ASP A 1 486 ? 23.191 20.530 31.862 1.00 89.56 486 A 1 +ATOM 3789 C CA . ASP A 1 486 ? 24.451 21.272 31.971 1.00 89.10 486 A 1 +ATOM 3790 C C . ASP A 1 486 ? 24.175 22.757 31.715 1.00 88.71 486 A 1 +ATOM 3791 O O . ASP A 1 486 ? 24.356 23.278 30.619 1.00 84.32 486 A 1 +ATOM 3792 C CB . ASP A 1 486 ? 25.521 20.698 31.028 1.00 86.93 486 A 1 +ATOM 3793 C CG . ASP A 1 486 ? 26.916 21.298 31.281 1.00 85.57 486 A 1 +ATOM 3794 O OD1 . ASP A 1 486 ? 27.048 22.288 32.026 1.00 76.89 486 A 1 +ATOM 3795 O OD2 . ASP A 1 486 ? 27.905 20.716 30.780 1.00 76.90 486 A 1 +ATOM 3796 N N . LYS A 1 487 ? 23.719 23.459 32.773 1.00 87.94 487 A 1 +ATOM 3797 C CA . LYS A 1 487 ? 23.322 24.872 32.697 1.00 86.57 487 A 1 +ATOM 3798 C C . LYS A 1 487 ? 24.442 25.789 32.202 1.00 86.67 487 A 1 +ATOM 3799 O O . LYS A 1 487 ? 24.153 26.783 31.554 1.00 82.61 487 A 1 +ATOM 3800 C CB . LYS A 1 487 ? 22.804 25.354 34.056 1.00 83.97 487 A 1 +ATOM 3801 C CG . LYS A 1 487 ? 21.493 24.663 34.466 1.00 74.82 487 A 1 +ATOM 3802 C CD . LYS A 1 487 ? 20.924 25.239 35.771 1.00 68.80 487 A 1 +ATOM 3803 C CE . LYS A 1 487 ? 19.616 24.514 36.112 1.00 59.03 487 A 1 +ATOM 3804 N NZ . LYS A 1 487 ? 18.979 25.004 37.353 1.00 51.72 487 A 1 +ATOM 3805 N N . GLN A 1 488 ? 25.697 25.467 32.485 1.00 87.56 488 A 1 +ATOM 3806 C CA . GLN A 1 488 ? 26.831 26.305 32.073 1.00 86.57 488 A 1 +ATOM 3807 C C . GLN A 1 488 ? 27.012 26.334 30.548 1.00 87.14 488 A 1 +ATOM 3808 O O . GLN A 1 488 ? 27.417 27.355 30.009 1.00 83.35 488 A 1 +ATOM 3809 C CB . GLN A 1 488 ? 28.129 25.786 32.705 1.00 85.31 488 A 1 +ATOM 3810 C CG . GLN A 1 488 ? 28.206 26.074 34.201 1.00 75.48 488 A 1 +ATOM 3811 C CD . GLN A 1 488 ? 29.576 25.707 34.796 1.00 65.99 488 A 1 +ATOM 3812 O OE1 . GLN A 1 488 ? 30.396 25.032 34.193 1.00 58.16 488 A 1 +ATOM 3813 N NE2 . GLN A 1 488 ? 29.859 26.126 35.997 1.00 55.91 488 A 1 +ATOM 3814 N N . LYS A 1 489 ? 26.705 25.236 29.865 1.00 87.54 489 A 1 +ATOM 3815 C CA . LYS A 1 489 ? 26.791 25.144 28.399 1.00 87.32 489 A 1 +ATOM 3816 C C . LYS A 1 489 ? 25.427 25.228 27.706 1.00 88.33 489 A 1 +ATOM 3817 O O . LYS A 1 489 ? 25.359 24.971 26.511 1.00 83.47 489 A 1 +ATOM 3818 C CB . LYS A 1 489 ? 27.564 23.892 28.000 1.00 85.33 489 A 1 +ATOM 3819 C CG . LYS A 1 489 ? 29.031 23.944 28.467 1.00 81.91 489 A 1 +ATOM 3820 C CD . LYS A 1 489 ? 29.828 22.931 27.649 1.00 74.95 489 A 1 +ATOM 3821 C CE . LYS A 1 489 ? 31.290 22.803 28.052 1.00 67.46 489 A 1 +ATOM 3822 N NZ . LYS A 1 489 ? 31.936 21.767 27.206 1.00 59.42 489 A 1 +ATOM 3823 N N . ASN A 1 490 ? 24.361 25.575 28.446 1.00 88.70 490 A 1 +ATOM 3824 C CA . ASN A 1 490 ? 22.993 25.600 27.953 1.00 89.01 490 A 1 +ATOM 3825 C C . ASN A 1 490 ? 22.587 24.280 27.271 1.00 90.22 490 A 1 +ATOM 3826 O O . ASN A 1 490 ? 21.938 24.280 26.240 1.00 86.48 490 A 1 +ATOM 3827 C CB . ASN A 1 490 ? 22.779 26.854 27.087 1.00 86.65 490 A 1 +ATOM 3828 C CG . ASN A 1 490 ? 21.316 27.155 26.841 1.00 83.37 490 A 1 +ATOM 3829 O OD1 . ASN A 1 490 ? 20.482 27.024 27.724 1.00 74.44 490 A 1 +ATOM 3830 N ND2 . ASN A 1 490 ? 20.965 27.609 25.658 1.00 73.12 490 A 1 +ATOM 3831 N N . GLY A 1 491 ? 23.022 23.155 27.824 1.00 90.13 491 A 1 +ATOM 3832 C CA . GLY A 1 491 ? 22.840 21.844 27.233 1.00 90.56 491 A 1 +ATOM 3833 C C . GLY A 1 491 ? 22.616 20.754 28.269 1.00 91.75 491 A 1 +ATOM 3834 O O . GLY A 1 491 ? 22.123 20.991 29.372 1.00 88.79 491 A 1 +ATOM 3835 N N . ILE A 1 492 ? 23.002 19.552 27.912 1.00 92.24 492 A 1 +ATOM 3836 C CA . ILE A 1 492 ? 22.876 18.374 28.767 1.00 92.49 492 A 1 +ATOM 3837 C C . ILE A 1 492 ? 24.197 17.610 28.853 1.00 92.60 492 A 1 +ATOM 3838 O O . ILE A 1 492 ? 25.014 17.613 27.929 1.00 90.68 492 A 1 +ATOM 3839 C CB . ILE A 1 492 ? 21.716 17.455 28.323 1.00 90.95 492 A 1 +ATOM 3840 C CG1 . ILE A 1 492 ? 21.909 16.939 26.878 1.00 84.09 492 A 1 +ATOM 3841 C CG2 . ILE A 1 492 ? 20.369 18.186 28.485 1.00 81.31 492 A 1 +ATOM 3842 C CD1 . ILE A 1 492 ? 20.908 15.865 26.469 1.00 81.01 492 A 1 +ATOM 3843 N N . LYS A 1 493 ? 24.385 16.912 29.975 1.00 91.68 493 A 1 +ATOM 3844 C CA . LYS A 1 493 ? 25.377 15.857 30.148 1.00 91.37 493 A 1 +ATOM 3845 C C . LYS A 1 493 ? 24.669 14.518 30.263 1.00 91.30 493 A 1 +ATOM 3846 O O . LYS A 1 493 ? 23.615 14.421 30.888 1.00 88.36 493 A 1 +ATOM 3847 C CB . LYS A 1 493 ? 26.237 16.126 31.384 1.00 89.14 493 A 1 +ATOM 3848 C CG . LYS A 1 493 ? 27.400 17.048 31.026 1.00 79.42 493 A 1 +ATOM 3849 C CD . LYS A 1 493 ? 28.178 17.453 32.273 1.00 77.38 493 A 1 +ATOM 3850 C CE . LYS A 1 493 ? 29.386 18.274 31.846 1.00 65.32 493 A 1 +ATOM 3851 N NZ . LYS A 1 493 ? 29.780 19.244 32.882 1.00 58.41 493 A 1 +ATOM 3852 N N . VAL A 1 494 ? 25.269 13.503 29.683 1.00 91.58 494 A 1 +ATOM 3853 C CA . VAL A 1 494 ? 24.729 12.143 29.659 1.00 90.67 494 A 1 +ATOM 3854 C C . VAL A 1 494 ? 25.854 11.181 30.017 1.00 91.14 494 A 1 +ATOM 3855 O O . VAL A 1 494 ? 26.968 11.312 29.523 1.00 89.00 494 A 1 +ATOM 3856 C CB . VAL A 1 494 ? 24.107 11.814 28.294 1.00 88.50 494 A 1 +ATOM 3857 C CG1 . VAL A 1 494 ? 23.315 10.522 28.352 1.00 81.66 494 A 1 +ATOM 3858 C CG2 . VAL A 1 494 ? 23.171 12.926 27.779 1.00 80.58 494 A 1 +ATOM 3859 N N . ASN A 1 495 ? 25.558 10.223 30.886 1.00 90.74 495 A 1 +ATOM 3860 C CA . ASN A 1 495 ? 26.506 9.188 31.282 1.00 89.55 495 A 1 +ATOM 3861 C C . ASN A 1 495 ? 25.782 7.843 31.370 1.00 89.77 495 A 1 +ATOM 3862 O O . ASN A 1 495 ? 24.699 7.753 31.948 1.00 86.74 495 A 1 +ATOM 3863 C CB . ASN A 1 495 ? 27.175 9.603 32.603 1.00 85.83 495 A 1 +ATOM 3864 C CG . ASN A 1 495 ? 28.287 8.661 33.041 1.00 74.90 495 A 1 +ATOM 3865 O OD1 . ASN A 1 495 ? 28.585 7.652 32.442 1.00 63.60 495 A 1 +ATOM 3866 N ND2 . ASN A 1 495 ? 28.939 8.963 34.133 1.00 64.15 495 A 1 +ATOM 3867 N N . PHE A 1 496 ? 26.383 6.829 30.777 1.00 90.13 496 A 1 +ATOM 3868 C CA . PHE A 1 496 ? 25.836 5.481 30.788 1.00 90.28 496 A 1 +ATOM 3869 C C . PHE A 1 496 ? 26.919 4.459 30.457 1.00 90.93 496 A 1 +ATOM 3870 O O . PHE A 1 496 ? 27.942 4.784 29.852 1.00 89.48 496 A 1 +ATOM 3871 C CB . PHE A 1 496 ? 24.654 5.377 29.814 1.00 89.01 496 A 1 +ATOM 3872 C CG . PHE A 1 496 ? 24.963 5.742 28.374 1.00 89.10 496 A 1 +ATOM 3873 C CD1 . PHE A 1 496 ? 25.015 7.092 27.961 1.00 82.26 496 A 1 +ATOM 3874 C CD2 . PHE A 1 496 ? 25.151 4.730 27.416 1.00 82.31 496 A 1 +ATOM 3875 C CE1 . PHE A 1 496 ? 25.242 7.430 26.624 1.00 81.27 496 A 1 +ATOM 3876 C CE2 . PHE A 1 496 ? 25.367 5.063 26.066 1.00 81.19 496 A 1 +ATOM 3877 C CZ . PHE A 1 496 ? 25.410 6.414 25.678 1.00 86.05 496 A 1 +ATOM 3878 N N . LYS A 1 497 ? 26.674 3.202 30.841 1.00 89.35 497 A 1 +ATOM 3879 C CA . LYS A 1 497 ? 27.554 2.076 30.542 1.00 88.67 497 A 1 +ATOM 3880 C C . LYS A 1 497 ? 26.867 1.157 29.543 1.00 88.57 497 A 1 +ATOM 3881 O O . LYS A 1 497 ? 25.775 0.668 29.831 1.00 86.06 497 A 1 +ATOM 3882 C CB . LYS A 1 497 ? 27.937 1.320 31.814 1.00 86.99 497 A 1 +ATOM 3883 C CG . LYS A 1 497 ? 28.576 2.247 32.864 1.00 79.95 497 A 1 +ATOM 3884 C CD . LYS A 1 497 ? 29.250 1.448 33.966 1.00 76.39 497 A 1 +ATOM 3885 C CE . LYS A 1 497 ? 29.925 2.415 34.944 1.00 66.97 497 A 1 +ATOM 3886 N NZ . LYS A 1 497 ? 31.345 2.052 35.165 1.00 58.58 497 A 1 +ATOM 3887 N N . ILE A 1 498 ? 27.527 0.902 28.424 1.00 89.88 498 A 1 +ATOM 3888 C CA . ILE A 1 498 ? 27.094 -0.122 27.478 1.00 90.27 498 A 1 +ATOM 3889 C C . ILE A 1 498 ? 27.758 -1.446 27.844 1.00 90.05 498 A 1 +ATOM 3890 O O . ILE A 1 498 ? 28.925 -1.496 28.222 1.00 88.67 498 A 1 +ATOM 3891 C CB . ILE A 1 498 ? 27.356 0.323 26.029 1.00 89.97 498 A 1 +ATOM 3892 C CG1 . ILE A 1 498 ? 26.556 1.595 25.665 1.00 85.95 498 A 1 +ATOM 3893 C CG2 . ILE A 1 498 ? 27.052 -0.797 25.030 1.00 85.95 498 A 1 +ATOM 3894 C CD1 . ILE A 1 498 ? 25.028 1.465 25.725 1.00 80.58 498 A 1 +ATOM 3895 N N . ARG A 1 499 ? 26.988 -2.528 27.720 1.00 89.47 499 A 1 +ATOM 3896 C CA . ARG A 1 499 ? 27.445 -3.906 27.929 1.00 88.07 499 A 1 +ATOM 3897 C C . ARG A 1 499 ? 27.405 -4.628 26.588 1.00 88.37 499 A 1 +ATOM 3898 O O . ARG A 1 499 ? 26.327 -5.002 26.126 1.00 86.03 499 A 1 +ATOM 3899 C CB . ARG A 1 499 ? 26.544 -4.602 28.958 1.00 86.20 499 A 1 +ATOM 3900 C CG . ARG A 1 499 ? 26.534 -3.915 30.335 1.00 77.96 499 A 1 +ATOM 3901 C CD . ARG A 1 499 ? 25.604 -4.653 31.312 1.00 75.01 499 A 1 +ATOM 3902 N NE . ARG A 1 499 ? 24.198 -4.660 30.872 1.00 64.07 499 A 1 +ATOM 3903 C CZ . ARG A 1 499 ? 23.265 -3.764 31.150 1.00 56.79 499 A 1 +ATOM 3904 N NH1 . ARG A 1 499 ? 23.488 -2.718 31.913 1.00 51.11 499 A 1 +ATOM 3905 N NH2 . ARG A 1 499 ? 22.066 -3.904 30.671 1.00 50.05 499 A 1 +ATOM 3906 N N . HIS A 1 500 ? 28.566 -4.812 25.964 1.00 89.68 500 A 1 +ATOM 3907 C CA . HIS A 1 500 ? 28.693 -5.622 24.763 1.00 89.62 500 A 1 +ATOM 3908 C C . HIS A 1 500 ? 28.930 -7.077 25.143 1.00 89.02 500 A 1 +ATOM 3909 O O . HIS A 1 500 ? 29.842 -7.359 25.920 1.00 86.68 500 A 1 +ATOM 3910 C CB . HIS A 1 500 ? 29.831 -5.095 23.888 1.00 90.08 500 A 1 +ATOM 3911 C CG . HIS A 1 500 ? 29.584 -3.709 23.377 1.00 90.77 500 A 1 +ATOM 3912 N ND1 . HIS A 1 500 ? 28.659 -3.357 22.417 1.00 79.70 500 A 1 +ATOM 3913 C CD2 . HIS A 1 500 ? 30.239 -2.558 23.760 1.00 79.77 500 A 1 +ATOM 3914 C CE1 . HIS A 1 500 ? 28.767 -2.027 22.221 1.00 83.01 500 A 1 +ATOM 3915 N NE2 . HIS A 1 500 ? 29.708 -1.516 23.013 1.00 84.60 500 A 1 +ATOM 3916 N N . ASN A 1 501 ? 28.136 -8.002 24.608 1.00 88.22 501 A 1 +ATOM 3917 C CA . ASN A 1 501 ? 28.388 -9.422 24.825 1.00 87.34 501 A 1 +ATOM 3918 C C . ASN A 1 501 ? 29.633 -9.843 24.033 1.00 87.58 501 A 1 +ATOM 3919 O O . ASN A 1 501 ? 29.739 -9.545 22.839 1.00 84.97 501 A 1 +ATOM 3920 C CB . ASN A 1 501 ? 27.162 -10.248 24.431 1.00 84.77 501 A 1 +ATOM 3921 C CG . ASN A 1 501 ? 25.911 -9.979 25.255 1.00 82.94 501 A 1 +ATOM 3922 O OD1 . ASN A 1 501 ? 25.918 -9.448 26.355 1.00 74.52 501 A 1 +ATOM 3923 N ND2 . ASN A 1 501 ? 24.768 -10.369 24.734 1.00 74.36 501 A 1 +ATOM 3924 N N . ILE A 1 502 ? 30.553 -10.521 24.694 1.00 86.78 502 A 1 +ATOM 3925 C CA . ILE A 1 502 ? 31.734 -11.122 24.069 1.00 86.41 502 A 1 +ATOM 3926 C C . ILE A 1 502 ? 31.376 -12.568 23.706 1.00 85.87 502 A 1 +ATOM 3927 O O . ILE A 1 502 ? 30.576 -13.206 24.386 1.00 81.87 502 A 1 +ATOM 3928 C CB . ILE A 1 502 ? 32.965 -11.031 25.002 1.00 85.76 502 A 1 +ATOM 3929 C CG1 . ILE A 1 502 ? 33.197 -9.581 25.489 1.00 81.89 502 A 1 +ATOM 3930 C CG2 . ILE A 1 502 ? 34.228 -11.556 24.299 1.00 81.32 502 A 1 +ATOM 3931 C CD1 . ILE A 1 502 ? 34.332 -9.430 26.517 1.00 76.97 502 A 1 +ATOM 3932 N N . GLU A 1 503 ? 31.980 -13.105 22.649 1.00 84.66 503 A 1 +ATOM 3933 C CA . GLU A 1 503 ? 31.738 -14.473 22.169 1.00 82.48 503 A 1 +ATOM 3934 C C . GLU A 1 503 ? 32.016 -15.556 23.228 1.00 81.88 503 A 1 +ATOM 3935 O O . GLU A 1 503 ? 31.425 -16.636 23.167 1.00 76.51 503 A 1 +ATOM 3936 C CB . GLU A 1 503 ? 32.621 -14.728 20.939 1.00 80.25 503 A 1 +ATOM 3937 C CG . GLU A 1 503 ? 32.239 -13.873 19.726 1.00 75.70 503 A 1 +ATOM 3938 C CD . GLU A 1 503 ? 33.161 -14.081 18.513 1.00 72.55 503 A 1 +ATOM 3939 O OE1 . GLU A 1 503 ? 32.794 -13.599 17.421 1.00 64.49 503 A 1 +ATOM 3940 O OE2 . GLU A 1 503 ? 34.237 -14.692 18.671 1.00 69.33 503 A 1 +ATOM 3941 N N . ASP A 1 504 ? 32.864 -15.284 24.213 1.00 82.41 504 A 1 +ATOM 3942 C CA . ASP A 1 504 ? 33.173 -16.203 25.315 1.00 79.45 504 A 1 +ATOM 3943 C C . ASP A 1 504 ? 32.113 -16.210 26.439 1.00 78.67 504 A 1 +ATOM 3944 O O . ASP A 1 504 ? 32.263 -16.925 27.431 1.00 71.14 504 A 1 +ATOM 3945 C CB . ASP A 1 504 ? 34.591 -15.922 25.839 1.00 76.54 504 A 1 +ATOM 3946 C CG . ASP A 1 504 ? 34.740 -14.627 26.648 1.00 74.29 504 A 1 +ATOM 3947 O OD1 . ASP A 1 504 ? 33.755 -13.875 26.806 1.00 66.02 504 A 1 +ATOM 3948 O OD2 . ASP A 1 504 ? 35.857 -14.377 27.153 1.00 68.15 504 A 1 +ATOM 3949 N N . GLY A 1 505 ? 31.021 -15.436 26.290 1.00 78.19 505 A 1 +ATOM 3950 C CA . GLY A 1 505 ? 29.945 -15.287 27.270 1.00 75.71 505 A 1 +ATOM 3951 C C . GLY A 1 505 ? 30.186 -14.205 28.325 1.00 77.75 505 A 1 +ATOM 3952 O O . GLY A 1 505 ? 29.314 -13.966 29.165 1.00 72.67 505 A 1 +ATOM 3953 N N . SER A 1 506 ? 31.344 -13.544 28.305 1.00 80.42 506 A 1 +ATOM 3954 C CA . SER A 1 506 ? 31.613 -12.388 29.154 1.00 81.16 506 A 1 +ATOM 3955 C C . SER A 1 506 ? 31.049 -11.094 28.557 1.00 82.61 506 A 1 +ATOM 3956 O O . SER A 1 506 ? 30.365 -11.099 27.525 1.00 79.67 506 A 1 +ATOM 3957 C CB . SER A 1 506 ? 33.110 -12.333 29.494 1.00 77.67 506 A 1 +ATOM 3958 O OG . SER A 1 506 ? 33.870 -11.806 28.438 1.00 72.10 506 A 1 +ATOM 3959 N N . VAL A 1 507 ? 31.272 -9.972 29.235 1.00 84.43 507 A 1 +ATOM 3960 C CA . VAL A 1 507 ? 30.746 -8.665 28.824 1.00 85.08 507 A 1 +ATOM 3961 C C . VAL A 1 507 ? 31.867 -7.641 28.731 1.00 86.65 507 A 1 +ATOM 3962 O O . VAL A 1 507 ? 32.547 -7.362 29.725 1.00 83.56 507 A 1 +ATOM 3963 C CB . VAL A 1 507 ? 29.625 -8.197 29.768 1.00 81.17 507 A 1 +ATOM 3964 C CG1 . VAL A 1 507 ? 29.079 -6.822 29.370 1.00 70.94 507 A 1 +ATOM 3965 C CG2 . VAL A 1 507 ? 28.437 -9.173 29.767 1.00 70.85 507 A 1 +ATOM 3966 N N . GLN A 1 508 ? 32.011 -7.018 27.578 1.00 88.25 508 A 1 +ATOM 3967 C CA . GLN A 1 508 ? 32.842 -5.842 27.366 1.00 89.06 508 A 1 +ATOM 3968 C C . GLN A 1 508 ? 32.072 -4.588 27.784 1.00 89.89 508 A 1 +ATOM 3969 O O . GLN A 1 508 ? 31.062 -4.237 27.176 1.00 87.79 508 A 1 +ATOM 3970 C CB . GLN A 1 508 ? 33.266 -5.781 25.887 1.00 89.02 508 A 1 +ATOM 3971 C CG . GLN A 1 508 ? 34.079 -4.541 25.521 1.00 87.15 508 A 1 +ATOM 3972 C CD . GLN A 1 508 ? 35.448 -4.503 26.211 1.00 88.57 508 A 1 +ATOM 3973 O OE1 . GLN A 1 508 ? 36.271 -5.380 26.022 1.00 80.44 508 A 1 +ATOM 3974 N NE2 . GLN A 1 508 ? 35.715 -3.505 27.005 1.00 78.67 508 A 1 +ATOM 3975 N N . LEU A 1 509 ? 32.546 -3.912 28.805 1.00 89.35 509 A 1 +ATOM 3976 C CA . LEU A 1 509 ? 31.987 -2.624 29.210 1.00 89.59 509 A 1 +ATOM 3977 C C . LEU A 1 509 ? 32.524 -1.502 28.316 1.00 90.13 509 A 1 +ATOM 3978 O O . LEU A 1 509 ? 33.700 -1.492 27.965 1.00 88.57 509 A 1 +ATOM 3979 C CB . LEU A 1 509 ? 32.289 -2.356 30.695 1.00 87.60 509 A 1 +ATOM 3980 C CG . LEU A 1 509 ? 31.521 -3.284 31.663 1.00 79.92 509 A 1 +ATOM 3981 C CD1 . LEU A 1 509 ? 32.050 -3.099 33.080 1.00 72.07 509 A 1 +ATOM 3982 C CD2 . LEU A 1 509 ? 30.019 -2.980 31.684 1.00 71.83 509 A 1 +ATOM 3983 N N . ALA A 1 510 ? 31.649 -0.548 27.985 1.00 91.36 510 A 1 +ATOM 3984 C CA . ALA A 1 510 ? 32.004 0.701 27.328 1.00 91.87 510 A 1 +ATOM 3985 C C . ALA A 1 510 ? 31.338 1.868 28.071 1.00 91.78 510 A 1 +ATOM 3986 O O . ALA A 1 510 ? 30.130 2.074 27.981 1.00 89.62 510 A 1 +ATOM 3987 C CB . ALA A 1 510 ? 31.616 0.620 25.845 1.00 91.69 510 A 1 +ATOM 3988 N N . ASP A 1 511 ? 32.145 2.618 28.847 1.00 91.97 511 A 1 +ATOM 3989 C CA . ASP A 1 511 ? 31.671 3.763 29.617 1.00 91.64 511 A 1 +ATOM 3990 C C . ASP A 1 511 ? 31.541 4.980 28.703 1.00 92.13 511 A 1 +ATOM 3991 O O . ASP A 1 511 ? 32.526 5.434 28.107 1.00 90.18 511 A 1 +ATOM 3992 C CB . ASP A 1 511 ? 32.607 4.039 30.809 1.00 89.88 511 A 1 +ATOM 3993 C CG . ASP A 1 511 ? 32.376 3.132 32.024 1.00 80.14 511 A 1 +ATOM 3994 O OD1 . ASP A 1 511 ? 31.604 2.158 31.961 1.00 71.57 511 A 1 +ATOM 3995 O OD2 . ASP A 1 511 ? 32.885 3.444 33.127 1.00 70.57 511 A 1 +ATOM 3996 N N . HIS A 1 512 ? 30.329 5.509 28.580 1.00 92.01 512 A 1 +ATOM 3997 C CA . HIS A 1 512 ? 30.005 6.626 27.706 1.00 92.04 512 A 1 +ATOM 3998 C C . HIS A 1 512 ? 29.830 7.908 28.514 1.00 91.58 512 A 1 +ATOM 3999 O O . HIS A 1 512 ? 28.970 7.990 29.390 1.00 89.17 512 A 1 +ATOM 4000 C CB . HIS A 1 512 ? 28.733 6.320 26.915 1.00 91.85 512 A 1 +ATOM 4001 C CG . HIS A 1 512 ? 28.883 5.243 25.888 1.00 92.69 512 A 1 +ATOM 4002 N ND1 . HIS A 1 512 ? 29.239 3.929 26.102 1.00 83.79 512 A 1 +ATOM 4003 C CD2 . HIS A 1 512 ? 28.662 5.368 24.529 1.00 84.50 512 A 1 +ATOM 4004 C CE1 . HIS A 1 512 ? 29.241 3.293 24.926 1.00 86.01 512 A 1 +ATOM 4005 N NE2 . HIS A 1 512 ? 28.881 4.130 23.948 1.00 87.56 512 A 1 +ATOM 4006 N N . TYR A 1 513 ? 30.595 8.911 28.161 1.00 92.01 513 A 1 +ATOM 4007 C CA . TYR A 1 513 ? 30.448 10.280 28.638 1.00 91.80 513 A 1 +ATOM 4008 C C . TYR A 1 513 ? 30.040 11.148 27.457 1.00 91.85 513 A 1 +ATOM 4009 O O . TYR A 1 513 ? 30.803 11.298 26.503 1.00 89.45 513 A 1 +ATOM 4010 C CB . TYR A 1 513 ? 31.754 10.762 29.260 1.00 90.65 513 A 1 +ATOM 4011 C CG . TYR A 1 513 ? 32.161 9.966 30.482 1.00 86.45 513 A 1 +ATOM 4012 C CD1 . TYR A 1 513 ? 31.689 10.324 31.756 1.00 78.39 513 A 1 +ATOM 4013 C CD2 . TYR A 1 513 ? 32.976 8.822 30.343 1.00 77.66 513 A 1 +ATOM 4014 C CE1 . TYR A 1 513 ? 32.026 9.558 32.883 1.00 76.34 513 A 1 +ATOM 4015 C CE2 . TYR A 1 513 ? 33.315 8.048 31.461 1.00 75.35 513 A 1 +ATOM 4016 C CZ . TYR A 1 513 ? 32.838 8.418 32.732 1.00 79.63 513 A 1 +ATOM 4017 O OH . TYR A 1 513 ? 33.154 7.648 33.825 1.00 77.63 513 A 1 +ATOM 4018 N N . GLN A 1 514 ? 28.846 11.712 27.507 1.00 92.76 514 A 1 +ATOM 4019 C CA . GLN A 1 514 ? 28.268 12.511 26.437 1.00 92.56 514 A 1 +ATOM 4020 C C . GLN A 1 514 ? 27.967 13.923 26.922 1.00 92.87 514 A 1 +ATOM 4021 O O . GLN A 1 514 ? 27.533 14.138 28.048 1.00 91.28 514 A 1 +ATOM 4022 C CB . GLN A 1 514 ? 27.034 11.777 25.889 1.00 91.40 514 A 1 +ATOM 4023 C CG . GLN A 1 514 ? 26.136 12.611 24.958 1.00 89.22 514 A 1 +ATOM 4024 C CD . GLN A 1 514 ? 24.923 11.831 24.462 1.00 89.84 514 A 1 +ATOM 4025 O OE1 . GLN A 1 514 ? 24.902 10.616 24.428 1.00 82.87 514 A 1 +ATOM 4026 N NE2 . GLN A 1 514 ? 23.870 12.499 24.067 1.00 81.51 514 A 1 +ATOM 4027 N N . GLN A 1 515 ? 28.143 14.876 26.016 1.00 92.71 515 A 1 +ATOM 4028 C CA . GLN A 1 515 ? 27.708 16.250 26.189 1.00 92.49 515 A 1 +ATOM 4029 C C . GLN A 1 515 ? 26.975 16.710 24.935 1.00 92.93 515 A 1 +ATOM 4030 O O . GLN A 1 515 ? 27.473 16.513 23.831 1.00 90.92 515 A 1 +ATOM 4031 C CB . GLN A 1 515 ? 28.939 17.098 26.515 1.00 89.99 515 A 1 +ATOM 4032 C CG . GLN A 1 515 ? 28.569 18.569 26.678 1.00 77.82 515 A 1 +ATOM 4033 C CD . GLN A 1 515 ? 29.629 19.371 27.410 1.00 75.81 515 A 1 +ATOM 4034 O OE1 . GLN A 1 515 ? 30.828 19.171 27.332 1.00 66.61 515 A 1 +ATOM 4035 N NE2 . GLN A 1 515 ? 29.191 20.326 28.187 1.00 64.00 515 A 1 +ATOM 4036 N N . ASN A 1 516 ? 25.817 17.345 25.107 1.00 92.44 516 A 1 +ATOM 4037 C CA . ASN A 1 516 ? 25.074 17.955 24.016 1.00 92.40 516 A 1 +ATOM 4038 C C . ASN A 1 516 ? 24.959 19.461 24.254 1.00 92.31 516 A 1 +ATOM 4039 O O . ASN A 1 516 ? 24.618 19.894 25.353 1.00 89.68 516 A 1 +ATOM 4040 C CB . ASN A 1 516 ? 23.686 17.308 23.873 1.00 91.74 516 A 1 +ATOM 4041 C CG . ASN A 1 516 ? 23.730 15.858 23.411 1.00 91.76 516 A 1 +ATOM 4042 O OD1 . ASN A 1 516 ? 24.345 14.999 24.001 1.00 79.31 516 A 1 +ATOM 4043 N ND2 . ASN A 1 516 ? 23.046 15.550 22.333 1.00 79.18 516 A 1 +ATOM 4044 N N . THR A 1 517 ? 25.228 20.246 23.225 1.00 92.41 517 A 1 +ATOM 4045 C CA . THR A 1 517 ? 25.123 21.710 23.240 1.00 92.16 517 A 1 +ATOM 4046 C C . THR A 1 517 ? 24.364 22.173 21.998 1.00 92.45 517 A 1 +ATOM 4047 O O . THR A 1 517 ? 24.633 21.661 20.918 1.00 90.14 517 A 1 +ATOM 4048 C CB . THR A 1 517 ? 26.500 22.379 23.288 1.00 90.89 517 A 1 +ATOM 4049 O OG1 . THR A 1 517 ? 27.427 21.755 22.420 1.00 79.37 517 A 1 +ATOM 4050 C CG2 . THR A 1 517 ? 27.102 22.311 24.681 1.00 77.74 517 A 1 +ATOM 4051 N N . PRO A 1 518 ? 23.422 23.132 22.121 1.00 92.41 518 A 1 +ATOM 4052 C CA . PRO A 1 518 ? 22.685 23.615 20.960 1.00 91.71 518 A 1 +ATOM 4053 C C . PRO A 1 518 ? 23.611 24.330 19.974 1.00 91.77 518 A 1 +ATOM 4054 O O . PRO A 1 518 ? 24.601 24.952 20.378 1.00 89.55 518 A 1 +ATOM 4055 C CB . PRO A 1 518 ? 21.592 24.533 21.529 1.00 90.11 518 A 1 +ATOM 4056 C CG . PRO A 1 518 ? 22.208 25.048 22.825 1.00 87.04 518 A 1 +ATOM 4057 C CD . PRO A 1 518 ? 23.053 23.873 23.318 1.00 89.95 518 A 1 +ATOM 4058 N N . ILE A 1 519 ? 23.292 24.227 18.676 1.00 91.31 519 A 1 +ATOM 4059 C CA . ILE A 1 519 ? 24.012 24.936 17.601 1.00 90.65 519 A 1 +ATOM 4060 C C . ILE A 1 519 ? 23.484 26.368 17.467 1.00 90.02 519 A 1 +ATOM 4061 O O . ILE A 1 519 ? 24.277 27.294 17.300 1.00 85.40 519 A 1 +ATOM 4062 C CB . ILE A 1 519 ? 23.884 24.158 16.264 1.00 89.27 519 A 1 +ATOM 4063 C CG1 . ILE A 1 519 ? 24.594 22.786 16.367 1.00 83.74 519 A 1 +ATOM 4064 C CG2 . ILE A 1 519 ? 24.473 24.967 15.088 1.00 82.90 519 A 1 +ATOM 4065 C CD1 . ILE A 1 519 ? 24.311 21.843 15.185 1.00 79.78 519 A 1 +ATOM 4066 N N . GLY A 1 520 ? 22.149 26.527 17.541 1.00 88.03 520 A 1 +ATOM 4067 C CA . GLY A 1 520 ? 21.507 27.837 17.475 1.00 86.62 520 A 1 +ATOM 4068 C C . GLY A 1 520 ? 21.436 28.531 18.841 1.00 87.10 520 A 1 +ATOM 4069 O O . GLY A 1 520 ? 21.541 27.900 19.889 1.00 83.41 520 A 1 +ATOM 4070 N N . ASP A 1 521 ? 21.194 29.854 18.797 1.00 87.09 521 A 1 +ATOM 4071 C CA . ASP A 1 521 ? 21.036 30.685 20.003 1.00 84.94 521 A 1 +ATOM 4072 C C . ASP A 1 521 ? 19.599 30.685 20.548 1.00 84.74 521 A 1 +ATOM 4073 O O . ASP A 1 521 ? 19.262 31.429 21.471 1.00 78.22 521 A 1 +ATOM 4074 C CB . ASP A 1 521 ? 21.495 32.119 19.687 1.00 81.15 521 A 1 +ATOM 4075 C CG . ASP A 1 521 ? 22.967 32.211 19.281 1.00 73.63 521 A 1 +ATOM 4076 O OD1 . ASP A 1 521 ? 23.788 31.523 19.918 1.00 64.27 521 A 1 +ATOM 4077 O OD2 . ASP A 1 521 ? 23.249 32.991 18.351 1.00 63.37 521 A 1 +ATOM 4078 N N . GLY A 1 522 ? 18.712 29.869 19.966 1.00 83.55 522 A 1 +ATOM 4079 C CA . GLY A 1 522 ? 17.315 29.765 20.362 1.00 82.70 522 A 1 +ATOM 4080 C C . GLY A 1 522 ? 17.139 29.181 21.771 1.00 84.22 522 A 1 +ATOM 4081 O O . GLY A 1 522 ? 18.020 28.497 22.294 1.00 81.07 522 A 1 +ATOM 4082 N N . PRO A 1 523 ? 15.980 29.429 22.408 1.00 84.79 523 A 1 +ATOM 4083 C CA . PRO A 1 523 ? 15.679 28.835 23.700 1.00 84.01 523 A 1 +ATOM 4084 C C . PRO A 1 523 ? 15.586 27.311 23.568 1.00 85.44 523 A 1 +ATOM 4085 O O . PRO A 1 523 ? 14.912 26.796 22.679 1.00 82.34 523 A 1 +ATOM 4086 C CB . PRO A 1 523 ? 14.374 29.476 24.153 1.00 80.62 523 A 1 +ATOM 4087 C CG . PRO A 1 523 ? 13.676 29.832 22.832 1.00 77.00 523 A 1 +ATOM 4088 C CD . PRO A 1 523 ? 14.846 30.184 21.909 1.00 79.36 523 A 1 +ATOM 4089 N N . VAL A 1 524 ? 16.222 26.602 24.507 1.00 85.65 524 A 1 +ATOM 4090 C CA . VAL A 1 524 ? 16.180 25.139 24.617 1.00 86.99 524 A 1 +ATOM 4091 C C . VAL A 1 524 ? 15.622 24.723 25.971 1.00 87.33 524 A 1 +ATOM 4092 O O . VAL A 1 524 ? 15.711 25.461 26.956 1.00 84.56 524 A 1 +ATOM 4093 C CB . VAL A 1 524 ? 17.558 24.500 24.364 1.00 85.86 524 A 1 +ATOM 4094 C CG1 . VAL A 1 524 ? 18.022 24.757 22.930 1.00 75.63 524 A 1 +ATOM 4095 C CG2 . VAL A 1 524 ? 18.633 25.001 25.333 1.00 75.78 524 A 1 +ATOM 4096 N N . LEU A 1 525 ? 15.043 23.537 26.026 1.00 88.23 525 A 1 +ATOM 4097 C CA . LEU A 1 525 ? 14.557 22.951 27.275 1.00 87.93 525 A 1 +ATOM 4098 C C . LEU A 1 525 ? 15.727 22.314 28.028 1.00 88.88 525 A 1 +ATOM 4099 O O . LEU A 1 525 ? 16.402 21.421 27.510 1.00 87.17 525 A 1 +ATOM 4100 C CB . LEU A 1 525 ? 13.439 21.947 26.979 1.00 85.58 525 A 1 +ATOM 4101 C CG . LEU A 1 525 ? 12.181 22.570 26.334 1.00 82.69 525 A 1 +ATOM 4102 C CD1 . LEU A 1 525 ? 11.207 21.462 25.918 1.00 75.98 525 A 1 +ATOM 4103 C CD2 . LEU A 1 525 ? 11.448 23.509 27.294 1.00 76.27 525 A 1 +ATOM 4104 N N . LEU A 1 526 ? 15.960 22.756 29.247 1.00 88.13 526 A 1 +ATOM 4105 C CA . LEU A 1 526 ? 16.913 22.132 30.155 1.00 88.59 526 A 1 +ATOM 4106 C C . LEU A 1 526 ? 16.150 21.166 31.073 1.00 88.67 526 A 1 +ATOM 4107 O O . LEU A 1 526 ? 15.312 21.628 31.848 1.00 85.45 526 A 1 +ATOM 4108 C CB . LEU A 1 526 ? 17.687 23.199 30.947 1.00 87.08 526 A 1 +ATOM 4109 C CG . LEU A 1 526 ? 18.602 24.082 30.087 1.00 84.42 526 A 1 +ATOM 4110 C CD1 . LEU A 1 526 ? 19.289 25.119 30.974 1.00 77.17 526 A 1 +ATOM 4111 C CD2 . LEU A 1 526 ? 19.692 23.284 29.369 1.00 76.47 526 A 1 +ATOM 4112 N N . PRO A 1 527 ? 16.401 19.860 30.969 1.00 88.79 527 A 1 +ATOM 4113 C CA . PRO A 1 527 ? 15.613 18.866 31.674 1.00 88.75 527 A 1 +ATOM 4114 C C . PRO A 1 527 ? 15.981 18.755 33.156 1.00 88.96 527 A 1 +ATOM 4115 O O . PRO A 1 527 ? 17.115 19.008 33.560 1.00 86.49 527 A 1 +ATOM 4116 C CB . PRO A 1 527 ? 15.883 17.557 30.939 1.00 87.29 527 A 1 +ATOM 4117 C CG . PRO A 1 527 ? 17.321 17.719 30.470 1.00 86.00 527 A 1 +ATOM 4118 C CD . PRO A 1 527 ? 17.383 19.202 30.120 1.00 87.98 527 A 1 +ATOM 4119 N N . ASP A 1 528 ? 15.027 18.261 33.951 1.00 88.05 528 A 1 +ATOM 4120 C CA . ASP A 1 528 ? 15.351 17.599 35.202 1.00 87.07 528 A 1 +ATOM 4121 C C . ASP A 1 528 ? 16.016 16.233 34.941 1.00 87.58 528 A 1 +ATOM 4122 O O . ASP A 1 528 ? 15.992 15.705 33.824 1.00 84.73 528 A 1 +ATOM 4123 C CB . ASP A 1 528 ? 14.090 17.447 36.071 1.00 84.68 528 A 1 +ATOM 4124 C CG . ASP A 1 528 ? 13.600 18.776 36.646 1.00 81.24 528 A 1 +ATOM 4125 O OD1 . ASP A 1 528 ? 14.446 19.672 36.873 1.00 74.19 528 A 1 +ATOM 4126 O OD2 . ASP A 1 528 ? 12.387 18.877 36.900 1.00 74.21 528 A 1 +ATOM 4127 N N . ASN A 1 529 ? 16.618 15.661 35.971 1.00 88.24 529 A 1 +ATOM 4128 C CA . ASN A 1 529 ? 17.273 14.364 35.843 1.00 87.65 529 A 1 +ATOM 4129 C C . ASN A 1 529 ? 16.260 13.283 35.460 1.00 87.15 529 A 1 +ATOM 4130 O O . ASN A 1 529 ? 15.289 13.044 36.170 1.00 83.24 529 A 1 +ATOM 4131 C CB . ASN A 1 529 ? 17.990 13.993 37.149 1.00 85.68 529 A 1 +ATOM 4132 C CG . ASN A 1 529 ? 19.205 14.851 37.454 1.00 83.57 529 A 1 +ATOM 4133 O OD1 . ASN A 1 529 ? 19.683 15.657 36.679 1.00 75.35 529 A 1 +ATOM 4134 N ND2 . ASN A 1 529 ? 19.776 14.681 38.627 1.00 75.14 529 A 1 +ATOM 4135 N N . HIS A 1 530 ? 16.539 12.593 34.373 1.00 88.38 530 A 1 +ATOM 4136 C CA . HIS A 1 530 ? 15.729 11.506 33.854 1.00 88.52 530 A 1 +ATOM 4137 C C . HIS A 1 530 ? 16.610 10.546 33.051 1.00 88.75 530 A 1 +ATOM 4138 O O . HIS A 1 530 ? 17.830 10.717 33.000 1.00 86.85 530 A 1 +ATOM 4139 C CB . HIS A 1 530 ? 14.576 12.076 33.005 1.00 87.85 530 A 1 +ATOM 4140 C CG . HIS A 1 530 ? 15.011 12.754 31.739 1.00 88.27 530 A 1 +ATOM 4141 N ND1 . HIS A 1 530 ? 15.638 13.980 31.637 1.00 81.23 530 A 1 +ATOM 4142 C CD2 . HIS A 1 530 ? 14.809 12.304 30.456 1.00 80.33 530 A 1 +ATOM 4143 C CE1 . HIS A 1 530 ? 15.794 14.258 30.348 1.00 82.75 530 A 1 +ATOM 4144 N NE2 . HIS A 1 530 ? 15.310 13.267 29.599 1.00 84.12 530 A 1 +ATOM 4145 N N . TYR A 1 531 ? 16.025 9.534 32.459 1.00 89.73 531 A 1 +ATOM 4146 C CA . TYR A 1 531 ? 16.754 8.599 31.608 1.00 89.48 531 A 1 +ATOM 4147 C C . TYR A 1 531 ? 15.955 8.208 30.370 1.00 90.07 531 A 1 +ATOM 4148 O O . TYR A 1 531 ? 14.728 8.286 30.350 1.00 88.76 531 A 1 +ATOM 4149 C CB . TYR A 1 531 ? 17.206 7.376 32.420 1.00 87.48 531 A 1 +ATOM 4150 C CG . TYR A 1 531 ? 16.081 6.514 32.961 1.00 85.41 531 A 1 +ATOM 4151 C CD1 . TYR A 1 531 ? 15.509 6.794 34.224 1.00 78.43 531 A 1 +ATOM 4152 C CD2 . TYR A 1 531 ? 15.615 5.415 32.222 1.00 77.07 531 A 1 +ATOM 4153 C CE1 . TYR A 1 531 ? 14.491 5.983 34.741 1.00 75.30 531 A 1 +ATOM 4154 C CE2 . TYR A 1 531 ? 14.588 4.598 32.727 1.00 74.48 531 A 1 +ATOM 4155 C CZ . TYR A 1 531 ? 14.029 4.884 33.991 1.00 79.32 531 A 1 +ATOM 4156 O OH . TYR A 1 531 ? 13.034 4.083 34.492 1.00 77.38 531 A 1 +ATOM 4157 N N . LEU A 1 532 ? 16.660 7.770 29.335 1.00 89.64 532 A 1 +ATOM 4158 C CA . LEU A 1 532 ? 16.074 7.125 28.172 1.00 89.56 532 A 1 +ATOM 4159 C C . LEU A 1 532 ? 16.282 5.612 28.289 1.00 89.05 532 A 1 +ATOM 4160 O O . LEU A 1 532 ? 17.420 5.146 28.296 1.00 87.32 532 A 1 +ATOM 4161 C CB . LEU A 1 532 ? 16.697 7.677 26.870 1.00 89.67 532 A 1 +ATOM 4162 C CG . LEU A 1 532 ? 16.681 9.206 26.734 1.00 89.24 532 A 1 +ATOM 4163 C CD1 . LEU A 1 532 ? 17.330 9.605 25.400 1.00 81.10 532 A 1 +ATOM 4164 C CD2 . LEU A 1 532 ? 15.266 9.769 26.764 1.00 81.31 532 A 1 +ATOM 4165 N N . SER A 1 533 ? 15.184 4.859 28.368 1.00 88.78 533 A 1 +ATOM 4166 C CA . SER A 1 533 ? 15.212 3.403 28.241 1.00 87.54 533 A 1 +ATOM 4167 C C . SER A 1 533 ? 15.335 3.048 26.761 1.00 87.71 533 A 1 +ATOM 4168 O O . SER A 1 533 ? 14.445 3.363 25.976 1.00 86.09 533 A 1 +ATOM 4169 C CB . SER A 1 533 ? 13.960 2.789 28.853 1.00 85.61 533 A 1 +ATOM 4170 O OG . SER A 1 533 ? 14.016 1.381 28.753 1.00 75.11 533 A 1 +ATOM 4171 N N . THR A 1 534 ? 16.450 2.429 26.388 1.00 88.19 534 A 1 +ATOM 4172 C CA . THR A 1 534 ? 16.787 2.147 24.991 1.00 87.74 534 A 1 +ATOM 4173 C C . THR A 1 534 ? 16.936 0.659 24.744 1.00 86.84 534 A 1 +ATOM 4174 O O . THR A 1 534 ? 17.637 -0.036 25.481 1.00 84.69 534 A 1 +ATOM 4175 C CB . THR A 1 534 ? 18.059 2.896 24.561 1.00 87.00 534 A 1 +ATOM 4176 O OG1 . THR A 1 534 ? 17.959 4.265 24.877 1.00 76.74 534 A 1 +ATOM 4177 C CG2 . THR A 1 534 ? 18.279 2.811 23.058 1.00 74.56 534 A 1 +ATOM 4178 N N . GLN A 1 535 ? 16.284 0.170 23.687 1.00 87.82 535 A 1 +ATOM 4179 C CA . GLN A 1 535 ? 16.358 -1.209 23.222 1.00 86.49 535 A 1 +ATOM 4180 C C . GLN A 1 535 ? 16.705 -1.210 21.739 1.00 87.11 535 A 1 +ATOM 4181 O O . GLN A 1 535 ? 16.020 -0.560 20.952 1.00 85.02 535 A 1 +ATOM 4182 C CB . GLN A 1 535 ? 15.005 -1.910 23.422 1.00 84.23 535 A 1 +ATOM 4183 C CG . GLN A 1 535 ? 14.538 -1.935 24.878 1.00 80.31 535 A 1 +ATOM 4184 C CD . GLN A 1 535 ? 13.129 -2.507 24.963 1.00 77.27 535 A 1 +ATOM 4185 O OE1 . GLN A 1 535 ? 12.909 -3.699 24.873 1.00 68.71 535 A 1 +ATOM 4186 N NE2 . GLN A 1 535 ? 12.128 -1.661 25.089 1.00 65.78 535 A 1 +ATOM 4187 N N . SER A 1 536 ? 17.739 -1.957 21.361 1.00 87.56 536 A 1 +ATOM 4188 C CA . SER A 1 536 ? 18.218 -2.030 19.982 1.00 87.29 536 A 1 +ATOM 4189 C C . SER A 1 536 ? 18.255 -3.482 19.508 1.00 86.90 536 A 1 +ATOM 4190 O O . SER A 1 536 ? 18.776 -4.351 20.204 1.00 84.45 536 A 1 +ATOM 4191 C CB . SER A 1 536 ? 19.597 -1.379 19.844 1.00 86.18 536 A 1 +ATOM 4192 O OG . SER A 1 536 ? 19.649 -0.100 20.461 1.00 79.42 536 A 1 +ATOM 4193 N N . ALA A 1 537 ? 17.717 -3.737 18.316 1.00 87.18 537 A 1 +ATOM 4194 C CA . ALA A 1 537 ? 17.793 -5.028 17.652 1.00 86.83 537 A 1 +ATOM 4195 C C . ALA A 1 537 ? 18.631 -4.908 16.379 1.00 87.79 537 A 1 +ATOM 4196 O O . ALA A 1 537 ? 18.294 -4.150 15.472 1.00 85.51 537 A 1 +ATOM 4197 C CB . ALA A 1 537 ? 16.380 -5.542 17.386 1.00 84.16 537 A 1 +ATOM 4198 N N . LEU A 1 538 ? 19.717 -5.668 16.311 1.00 87.96 538 A 1 +ATOM 4199 C CA . LEU A 1 538 ? 20.608 -5.708 15.158 1.00 88.01 538 A 1 +ATOM 4200 C C . LEU A 1 538 ? 20.214 -6.867 14.240 1.00 87.53 538 A 1 +ATOM 4201 O O . LEU A 1 538 ? 19.986 -7.988 14.697 1.00 85.30 538 A 1 +ATOM 4202 C CB . LEU A 1 538 ? 22.074 -5.845 15.601 1.00 87.65 538 A 1 +ATOM 4203 C CG . LEU A 1 538 ? 22.543 -4.879 16.706 1.00 86.77 538 A 1 +ATOM 4204 C CD1 . LEU A 1 538 ? 24.041 -5.042 16.921 1.00 76.60 538 A 1 +ATOM 4205 C CD2 . LEU A 1 538 ? 22.278 -3.417 16.368 1.00 77.25 538 A 1 +ATOM 4206 N N . SER A 1 539 ? 20.192 -6.621 12.943 1.00 87.73 539 A 1 +ATOM 4207 C CA . SER A 1 539 ? 19.934 -7.656 11.947 1.00 86.62 539 A 1 +ATOM 4208 C C . SER A 1 539 ? 20.794 -7.451 10.700 1.00 87.61 539 A 1 +ATOM 4209 O O . SER A 1 539 ? 21.581 -6.500 10.608 1.00 85.92 539 A 1 +ATOM 4210 C CB . SER A 1 539 ? 18.432 -7.727 11.637 1.00 83.88 539 A 1 +ATOM 4211 O OG . SER A 1 539 ? 17.979 -6.539 11.023 1.00 76.92 539 A 1 +ATOM 4212 N N . LYS A 1 540 ? 20.683 -8.384 9.761 1.00 86.57 540 A 1 +ATOM 4213 C CA . LYS A 1 540 ? 21.326 -8.307 8.449 1.00 85.87 540 A 1 +ATOM 4214 C C . LYS A 1 540 ? 20.262 -8.346 7.358 1.00 85.71 540 A 1 +ATOM 4215 O O . LYS A 1 540 ? 19.250 -9.029 7.498 1.00 82.18 540 A 1 +ATOM 4216 C CB . LYS A 1 540 ? 22.352 -9.438 8.291 1.00 84.16 540 A 1 +ATOM 4217 C CG . LYS A 1 540 ? 23.563 -9.366 9.253 1.00 83.01 540 A 1 +ATOM 4218 C CD . LYS A 1 540 ? 24.473 -8.163 8.997 1.00 81.13 540 A 1 +ATOM 4219 C CE . LYS A 1 540 ? 25.721 -8.221 9.879 1.00 79.26 540 A 1 +ATOM 4220 N NZ . LYS A 1 540 ? 26.626 -7.045 9.665 1.00 75.06 540 A 1 +ATOM 4221 N N . ASP A 1 541 ? 20.531 -7.624 6.281 1.00 85.78 541 A 1 +ATOM 4222 C CA . ASP A 1 541 ? 19.779 -7.760 5.043 1.00 85.14 541 A 1 +ATOM 4223 C C . ASP A 1 541 ? 20.453 -8.853 4.203 1.00 84.83 541 A 1 +ATOM 4224 O O . ASP A 1 541 ? 21.586 -8.670 3.769 1.00 81.63 541 A 1 +ATOM 4225 C CB . ASP A 1 541 ? 19.757 -6.402 4.338 1.00 83.36 541 A 1 +ATOM 4226 C CG . ASP A 1 541 ? 19.063 -6.395 2.973 1.00 81.61 541 A 1 +ATOM 4227 O OD1 . ASP A 1 541 ? 18.676 -7.476 2.479 1.00 73.50 541 A 1 +ATOM 4228 O OD2 . ASP A 1 541 ? 18.977 -5.280 2.412 1.00 74.17 541 A 1 +ATOM 4229 N N . PRO A 1 542 ? 19.802 -10.006 3.965 1.00 82.42 542 A 1 +ATOM 4230 C CA . PRO A 1 542 ? 20.414 -11.107 3.226 1.00 79.33 542 A 1 +ATOM 4231 C C . PRO A 1 542 ? 20.728 -10.766 1.765 1.00 80.31 542 A 1 +ATOM 4232 O O . PRO A 1 542 ? 21.530 -11.442 1.133 1.00 76.65 542 A 1 +ATOM 4233 C CB . PRO A 1 542 ? 19.408 -12.262 3.341 1.00 76.73 542 A 1 +ATOM 4234 C CG . PRO A 1 542 ? 18.077 -11.554 3.533 1.00 74.64 542 A 1 +ATOM 4235 C CD . PRO A 1 542 ? 18.443 -10.332 4.359 1.00 76.76 542 A 1 +ATOM 4236 N N . ASN A 1 543 ? 20.119 -9.706 1.221 1.00 82.46 543 A 1 +ATOM 4237 C CA . ASN A 1 543 ? 20.359 -9.238 -0.141 1.00 83.23 543 A 1 +ATOM 4238 C C . ASN A 1 543 ? 21.494 -8.204 -0.233 1.00 84.55 543 A 1 +ATOM 4239 O O . ASN A 1 543 ? 21.958 -7.892 -1.330 1.00 80.71 543 A 1 +ATOM 4240 C CB . ASN A 1 543 ? 19.048 -8.674 -0.705 1.00 80.56 543 A 1 +ATOM 4241 C CG . ASN A 1 543 ? 17.941 -9.713 -0.708 1.00 75.92 543 A 1 +ATOM 4242 O OD1 . ASN A 1 543 ? 18.076 -10.809 -1.231 1.00 66.87 543 A 1 +ATOM 4243 N ND2 . ASN A 1 543 ? 16.808 -9.390 -0.129 1.00 65.50 543 A 1 +ATOM 4244 N N . GLU A 1 544 ? 21.966 -7.681 0.899 1.00 84.45 544 A 1 +ATOM 4245 C CA . GLU A 1 544 ? 23.062 -6.724 0.945 1.00 85.81 544 A 1 +ATOM 4246 C C . GLU A 1 544 ? 24.410 -7.441 1.046 1.00 85.62 544 A 1 +ATOM 4247 O O . GLU A 1 544 ? 24.704 -8.138 2.011 1.00 82.00 544 A 1 +ATOM 4248 C CB . GLU A 1 544 ? 22.831 -5.738 2.095 1.00 85.36 544 A 1 +ATOM 4249 C CG . GLU A 1 544 ? 23.903 -4.654 2.189 1.00 83.02 544 A 1 +ATOM 4250 C CD . GLU A 1 544 ? 24.031 -3.823 0.903 1.00 84.59 544 A 1 +ATOM 4251 O OE1 . GLU A 1 544 ? 24.993 -4.059 0.136 1.00 75.15 544 A 1 +ATOM 4252 O OE2 . GLU A 1 544 ? 23.191 -2.935 0.656 1.00 78.05 544 A 1 +ATOM 4253 N N . LYS A 1 545 ? 25.250 -7.237 0.034 1.00 87.37 545 A 1 +ATOM 4254 C CA . LYS A 1 545 ? 26.582 -7.856 -0.036 1.00 87.67 545 A 1 +ATOM 4255 C C . LYS A 1 545 ? 27.671 -7.049 0.657 1.00 89.03 545 A 1 +ATOM 4256 O O . LYS A 1 545 ? 28.742 -7.584 0.912 1.00 84.42 545 A 1 +ATOM 4257 C CB . LYS A 1 545 ? 26.970 -8.103 -1.500 1.00 84.43 545 A 1 +ATOM 4258 C CG . LYS A 1 545 ? 26.032 -9.119 -2.168 1.00 75.58 545 A 1 +ATOM 4259 C CD . LYS A 1 545 ? 26.553 -9.475 -3.569 1.00 65.15 545 A 1 +ATOM 4260 C CE . LYS A 1 545 ? 25.595 -10.498 -4.192 1.00 54.93 545 A 1 +ATOM 4261 N NZ . LYS A 1 545 ? 26.069 -10.978 -5.502 1.00 46.66 545 A 1 +ATOM 4262 N N . ARG A 1 546 ? 27.428 -5.765 0.888 1.00 88.36 546 A 1 +ATOM 4263 C CA . ARG A 1 546 ? 28.369 -4.900 1.600 1.00 88.78 546 A 1 +ATOM 4264 C C . ARG A 1 546 ? 28.332 -5.213 3.090 1.00 89.46 546 A 1 +ATOM 4265 O O . ARG A 1 546 ? 27.336 -5.743 3.596 1.00 87.18 546 A 1 +ATOM 4266 C CB . ARG A 1 546 ? 28.046 -3.424 1.341 1.00 88.04 546 A 1 +ATOM 4267 C CG . ARG A 1 546 ? 28.226 -3.050 -0.142 1.00 85.67 546 A 1 +ATOM 4268 C CD . ARG A 1 546 ? 27.706 -1.637 -0.431 1.00 84.45 546 A 1 +ATOM 4269 N NE . ARG A 1 546 ? 26.240 -1.621 -0.371 1.00 78.98 546 A 1 +ATOM 4270 C CZ . ARG A 1 546 ? 25.453 -0.598 -0.634 1.00 74.94 546 A 1 +ATOM 4271 N NH1 . ARG A 1 546 ? 25.916 0.563 -1.015 1.00 68.40 546 A 1 +ATOM 4272 N NH2 . ARG A 1 546 ? 24.159 -0.730 -0.517 1.00 67.73 546 A 1 +ATOM 4273 N N . ASP A 1 547 ? 29.399 -4.864 3.794 1.00 90.13 547 A 1 +ATOM 4274 C CA . ASP A 1 547 ? 29.367 -4.889 5.245 1.00 91.28 547 A 1 +ATOM 4275 C C . ASP A 1 547 ? 28.361 -3.844 5.739 1.00 91.96 547 A 1 +ATOM 4276 O O . ASP A 1 547 ? 28.393 -2.689 5.316 1.00 88.96 547 A 1 +ATOM 4277 C CB . ASP A 1 547 ? 30.771 -4.683 5.826 1.00 89.76 547 A 1 +ATOM 4278 C CG . ASP A 1 547 ? 30.862 -5.138 7.282 1.00 89.15 547 A 1 +ATOM 4279 O OD1 . ASP A 1 547 ? 29.864 -5.696 7.807 1.00 80.79 547 A 1 +ATOM 4280 O OD2 . ASP A 1 547 ? 31.965 -4.993 7.859 1.00 81.31 547 A 1 +ATOM 4281 N N . HIS A 1 548 ? 27.412 -4.272 6.539 1.00 92.17 548 A 1 +ATOM 4282 C CA . HIS A 1 548 ? 26.252 -3.469 6.900 1.00 91.80 548 A 1 +ATOM 4283 C C . HIS A 1 548 ? 25.628 -3.911 8.223 1.00 92.05 548 A 1 +ATOM 4284 O O . HIS A 1 548 ? 25.870 -5.003 8.724 1.00 89.87 548 A 1 +ATOM 4285 C CB . HIS A 1 548 ? 25.207 -3.520 5.765 1.00 89.97 548 A 1 +ATOM 4286 C CG . HIS A 1 548 ? 24.491 -4.829 5.665 1.00 88.92 548 A 1 +ATOM 4287 N ND1 . HIS A 1 548 ? 25.028 -6.014 5.204 1.00 79.28 548 A 1 +ATOM 4288 C CD2 . HIS A 1 548 ? 23.205 -5.089 6.065 1.00 78.52 548 A 1 +ATOM 4289 C CE1 . HIS A 1 548 ? 24.082 -6.957 5.325 1.00 80.52 548 A 1 +ATOM 4290 N NE2 . HIS A 1 548 ? 22.970 -6.434 5.837 1.00 82.50 548 A 1 +ATOM 4291 N N . MET A 1 549 ? 24.780 -3.025 8.747 1.00 92.08 549 A 1 +ATOM 4292 C CA . MET A 1 549 ? 23.938 -3.269 9.905 1.00 92.18 549 A 1 +ATOM 4293 C C . MET A 1 549 ? 22.539 -2.726 9.616 1.00 92.42 549 A 1 +ATOM 4294 O O . MET A 1 549 ? 22.399 -1.561 9.242 1.00 91.18 549 A 1 +ATOM 4295 C CB . MET A 1 549 ? 24.581 -2.591 11.125 1.00 91.37 549 A 1 +ATOM 4296 C CG . MET A 1 549 ? 23.728 -2.641 12.389 1.00 89.31 549 A 1 +ATOM 4297 S SD . MET A 1 549 ? 24.542 -1.970 13.875 1.00 88.35 549 A 1 +ATOM 4298 C CE . MET A 1 549 ? 24.661 -0.217 13.448 1.00 79.38 549 A 1 +ATOM 4299 N N . VAL A 1 550 ? 21.533 -3.553 9.811 1.00 90.52 550 A 1 +ATOM 4300 C CA . VAL A 1 550 ? 20.155 -3.078 9.932 1.00 89.87 550 A 1 +ATOM 4301 C C . VAL A 1 550 ? 19.854 -2.963 11.415 1.00 89.68 550 A 1 +ATOM 4302 O O . VAL A 1 550 ? 20.099 -3.909 12.169 1.00 88.16 550 A 1 +ATOM 4303 C CB . VAL A 1 550 ? 19.145 -3.996 9.226 1.00 88.49 550 A 1 +ATOM 4304 C CG1 . VAL A 1 550 ? 17.714 -3.467 9.354 1.00 80.64 550 A 1 +ATOM 4305 C CG2 . VAL A 1 550 ? 19.469 -4.120 7.729 1.00 79.43 550 A 1 +ATOM 4306 N N . LEU A 1 551 ? 19.362 -1.812 11.836 1.00 90.22 551 A 1 +ATOM 4307 C CA . LEU A 1 551 ? 19.103 -1.516 13.232 1.00 90.03 551 A 1 +ATOM 4308 C C . LEU A 1 551 ? 17.675 -1.031 13.414 1.00 89.96 551 A 1 +ATOM 4309 O O . LEU A 1 551 ? 17.207 -0.120 12.733 1.00 88.42 551 A 1 +ATOM 4310 C CB . LEU A 1 551 ? 20.165 -0.527 13.736 1.00 88.71 551 A 1 +ATOM 4311 C CG . LEU A 1 551 ? 20.032 -0.261 15.244 1.00 86.75 551 A 1 +ATOM 4312 C CD1 . LEU A 1 551 ? 21.378 -0.414 15.930 1.00 76.04 551 A 1 +ATOM 4313 C CD2 . LEU A 1 551 ? 19.509 1.145 15.505 1.00 75.43 551 A 1 +ATOM 4314 N N . LEU A 1 552 ? 16.994 -1.653 14.369 1.00 89.18 552 A 1 +ATOM 4315 C CA . LEU A 1 552 ? 15.709 -1.199 14.864 1.00 88.29 552 A 1 +ATOM 4316 C C . LEU A 1 552 ? 15.882 -0.855 16.342 1.00 88.37 552 A 1 +ATOM 4317 O O . LEU A 1 552 ? 16.365 -1.674 17.112 1.00 86.46 552 A 1 +ATOM 4318 C CB . LEU A 1 552 ? 14.659 -2.283 14.623 1.00 86.28 552 A 1 +ATOM 4319 C CG . LEU A 1 552 ? 13.241 -1.772 14.948 1.00 80.53 552 A 1 +ATOM 4320 C CD1 . LEU A 1 552 ? 12.380 -1.716 13.684 1.00 71.29 552 A 1 +ATOM 4321 C CD2 . LEU A 1 552 ? 12.552 -2.668 15.966 1.00 71.58 552 A 1 +ATOM 4322 N N . GLU A 1 553 ? 15.482 0.359 16.713 1.00 89.22 553 A 1 +ATOM 4323 C CA . GLU A 1 553 ? 15.667 0.866 18.063 1.00 89.34 553 A 1 +ATOM 4324 C C . GLU A 1 553 ? 14.367 1.461 18.593 1.00 89.43 553 A 1 +ATOM 4325 O O . GLU A 1 553 ? 13.613 2.094 17.853 1.00 87.79 553 A 1 +ATOM 4326 C CB . GLU A 1 553 ? 16.834 1.863 18.073 1.00 88.22 553 A 1 +ATOM 4327 C CG . GLU A 1 553 ? 17.265 2.296 19.481 1.00 82.42 553 A 1 +ATOM 4328 C CD . GLU A 1 553 ? 18.574 3.086 19.414 1.00 82.70 553 A 1 +ATOM 4329 O OE1 . GLU A 1 553 ? 18.540 4.310 19.644 1.00 74.31 553 A 1 +ATOM 4330 O OE2 . GLU A 1 553 ? 19.616 2.475 19.104 1.00 76.21 553 A 1 +ATOM 4331 N N . PHE A 1 554 ? 14.102 1.240 19.872 1.00 88.95 554 A 1 +ATOM 4332 C CA . PHE A 1 554 ? 13.028 1.882 20.613 1.00 87.92 554 A 1 +ATOM 4333 C C . PHE A 1 554 ? 13.615 2.641 21.788 1.00 87.95 554 A 1 +ATOM 4334 O O . PHE A 1 554 ? 14.352 2.074 22.600 1.00 85.91 554 A 1 +ATOM 4335 C CB . PHE A 1 554 ? 12.003 0.851 21.084 1.00 85.95 554 A 1 +ATOM 4336 C CG . PHE A 1 554 ? 11.206 0.227 19.968 1.00 83.04 554 A 1 +ATOM 4337 C CD1 . PHE A 1 554 ? 10.052 0.875 19.465 1.00 74.94 554 A 1 +ATOM 4338 C CD2 . PHE A 1 554 ? 11.595 -1.006 19.413 1.00 74.46 554 A 1 +ATOM 4339 C CE1 . PHE A 1 554 ? 9.305 0.303 18.435 1.00 72.80 554 A 1 +ATOM 4340 C CE2 . PHE A 1 554 ? 10.842 -1.590 18.374 1.00 71.96 554 A 1 +ATOM 4341 C CZ . PHE A 1 554 ? 9.699 -0.930 17.894 1.00 76.86 554 A 1 +ATOM 4342 N N . VAL A 1 555 ? 13.260 3.920 21.901 1.00 88.88 555 A 1 +ATOM 4343 C CA . VAL A 1 555 ? 13.756 4.815 22.939 1.00 89.58 555 A 1 +ATOM 4344 C C . VAL A 1 555 ? 12.583 5.504 23.614 1.00 89.37 555 A 1 +ATOM 4345 O O . VAL A 1 555 ? 11.785 6.176 22.970 1.00 87.90 555 A 1 +ATOM 4346 C CB . VAL A 1 555 ? 14.747 5.850 22.379 1.00 89.03 555 A 1 +ATOM 4347 C CG1 . VAL A 1 555 ? 15.474 6.541 23.534 1.00 79.67 555 A 1 +ATOM 4348 C CG2 . VAL A 1 555 ? 15.804 5.223 21.462 1.00 79.63 555 A 1 +ATOM 4349 N N . THR A 1 556 ? 12.464 5.343 24.928 1.00 89.03 556 A 1 +ATOM 4350 C CA . THR A 1 556 ? 11.403 5.978 25.715 1.00 88.05 556 A 1 +ATOM 4351 C C . THR A 1 556 ? 12.003 6.702 26.916 1.00 88.07 556 A 1 +ATOM 4352 O O . THR A 1 556 ? 12.762 6.107 27.671 1.00 86.67 556 A 1 +ATOM 4353 C CB . THR A 1 556 ? 10.353 4.956 26.162 1.00 85.91 556 A 1 +ATOM 4354 O OG1 . THR A 1 556 ? 9.826 4.285 25.031 1.00 72.97 556 A 1 +ATOM 4355 C CG2 . THR A 1 556 ? 9.163 5.598 26.867 1.00 70.79 556 A 1 +ATOM 4356 N N . ALA A 1 557 ? 11.637 7.968 27.084 1.00 89.29 557 A 1 +ATOM 4357 C CA . ALA A 1 557 ? 12.020 8.723 28.268 1.00 88.76 557 A 1 +ATOM 4358 C C . ALA A 1 557 ? 11.221 8.257 29.492 1.00 87.90 557 A 1 +ATOM 4359 O O . ALA A 1 557 ? 10.014 8.013 29.416 1.00 85.69 557 A 1 +ATOM 4360 C CB . ALA A 1 557 ? 11.836 10.218 28.008 1.00 88.44 557 A 1 +ATOM 4361 N N . ALA A 1 558 ? 11.907 8.151 30.635 1.00 87.50 558 A 1 +ATOM 4362 C CA . ALA A 1 558 ? 11.343 7.712 31.903 1.00 85.81 558 A 1 +ATOM 4363 C C . ALA A 1 558 ? 12.099 8.359 33.079 1.00 85.56 558 A 1 +ATOM 4364 O O . ALA A 1 558 ? 13.039 9.135 32.890 1.00 81.63 558 A 1 +ATOM 4365 C CB . ALA A 1 558 ? 11.385 6.172 31.939 1.00 82.79 558 A 1 +ATOM 4366 N N . GLY A 1 559 ? 11.683 8.043 34.308 1.00 82.36 559 A 1 +ATOM 4367 C CA . GLY A 1 559 ? 12.357 8.489 35.535 1.00 80.46 559 A 1 +ATOM 4368 C C . GLY A 1 559 ? 11.798 9.763 36.167 1.00 80.36 559 A 1 +ATOM 4369 O O . GLY A 1 559 ? 12.192 10.090 37.283 1.00 74.51 559 A 1 +ATOM 4370 N N . ILE A 1 560 ? 10.861 10.443 35.524 1.00 78.36 560 A 1 +ATOM 4371 C CA . ILE A 1 560 ? 10.058 11.514 36.127 1.00 75.55 560 A 1 +ATOM 4372 C C . ILE A 1 560 ? 8.634 10.979 36.282 1.00 72.93 560 A 1 +ATOM 4373 O O . ILE A 1 560 ? 7.943 10.720 35.304 1.00 66.43 560 A 1 +ATOM 4374 C CB . ILE A 1 560 ? 10.143 12.819 35.319 1.00 71.99 560 A 1 +ATOM 4375 C CG1 . ILE A 1 560 ? 11.620 13.283 35.223 1.00 69.01 560 A 1 +ATOM 4376 C CG2 . ILE A 1 560 ? 9.269 13.909 35.979 1.00 67.17 560 A 1 +ATOM 4377 C CD1 . ILE A 1 560 ? 11.846 14.516 34.344 1.00 63.08 560 A 1 +ATOM 4378 N N . THR A 1 561 ? 8.217 10.784 37.531 1.00 70.63 561 A 1 +ATOM 4379 C CA . THR A 1 561 ? 6.845 10.386 37.847 1.00 67.57 561 A 1 +ATOM 4380 C C . THR A 1 561 ? 5.915 11.599 37.770 1.00 66.45 561 A 1 +ATOM 4381 O O . THR A 1 561 ? 6.312 12.709 38.115 1.00 60.76 561 A 1 +ATOM 4382 C CB . THR A 1 561 ? 6.753 9.724 39.226 1.00 61.33 561 A 1 +ATOM 4383 O OG1 . THR A 1 561 ? 7.458 10.472 40.194 1.00 54.93 561 A 1 +ATOM 4384 C CG2 . THR A 1 561 ? 7.377 8.330 39.207 1.00 51.81 561 A 1 +ATOM 4385 N N . LEU A 1 562 ? 4.667 11.382 37.340 1.00 60.50 562 A 1 +ATOM 4386 C CA . LEU A 1 562 ? 3.607 12.376 37.523 1.00 58.35 562 A 1 +ATOM 4387 C C . LEU A 1 562 ? 3.506 12.700 39.018 1.00 57.51 562 A 1 +ATOM 4388 O O . LEU A 1 562 ? 3.120 11.843 39.815 1.00 51.89 562 A 1 +ATOM 4389 C CB . LEU A 1 562 ? 2.281 11.830 36.962 1.00 53.89 562 A 1 +ATOM 4390 C CG . LEU A 1 562 ? 1.990 12.316 35.536 1.00 49.45 562 A 1 +ATOM 4391 C CD1 . LEU A 1 562 ? 1.500 11.176 34.646 1.00 43.76 562 A 1 +ATOM 4392 C CD2 . LEU A 1 562 ? 0.913 13.399 35.551 1.00 45.43 562 A 1 +ATOM 4393 N N . GLY A 1 563 ? 3.891 13.912 39.384 1.00 46.48 563 A 1 +ATOM 4394 C CA . GLY A 1 563 ? 3.699 14.398 40.744 1.00 44.57 563 A 1 +ATOM 4395 C C . GLY A 1 563 ? 2.199 14.426 41.070 1.00 43.88 563 A 1 +ATOM 4396 O O . GLY A 1 563 ? 1.373 14.695 40.197 1.00 41.20 563 A 1 +ATOM 4397 N N . MET A 1 564 ? 1.850 14.182 42.328 1.00 35.98 564 A 1 +ATOM 4398 C CA . MET A 1 564 ? 0.455 14.283 42.781 1.00 34.78 564 A 1 +ATOM 4399 C C . MET A 1 564 ? -0.172 15.646 42.455 1.00 35.47 564 A 1 +ATOM 4400 O O . MET A 1 564 ? -1.369 15.721 42.254 1.00 33.54 564 A 1 +ATOM 4401 C CB . MET A 1 564 ? 0.357 14.045 44.291 1.00 32.70 564 A 1 +ATOM 4402 C CG . MET A 1 564 ? 0.447 12.568 44.675 1.00 29.72 564 A 1 +ATOM 4403 S SD . MET A 1 564 ? -0.075 12.300 46.401 1.00 26.72 564 A 1 +ATOM 4404 C CE . MET A 1 564 ? 0.236 10.537 46.573 1.00 24.64 564 A 1 +ATOM 4405 N N . ASP A 1 565 ? 0.627 16.712 42.364 1.00 37.41 565 A 1 +ATOM 4406 C CA . ASP A 1 565 ? 0.132 18.079 42.157 1.00 36.80 565 A 1 +ATOM 4407 C C . ASP A 1 565 ? -0.643 18.275 40.839 1.00 36.48 565 A 1 +ATOM 4408 O O . ASP A 1 565 ? -1.583 19.073 40.804 1.00 34.82 565 A 1 +ATOM 4409 C CB . ASP A 1 565 ? 1.310 19.060 42.209 1.00 34.94 565 A 1 +ATOM 4410 C CG . ASP A 1 565 ? 1.909 19.222 43.601 1.00 31.83 565 A 1 +ATOM 4411 O OD1 . ASP A 1 565 ? 1.179 18.999 44.593 1.00 29.81 565 A 1 +ATOM 4412 O OD2 . ASP A 1 565 ? 3.106 19.579 43.676 1.00 30.13 565 A 1 +ATOM 4413 N N . GLU A 1 566 ? -0.298 17.558 39.762 1.00 34.55 566 A 1 +ATOM 4414 C CA . GLU A 1 566 ? -1.073 17.642 38.511 1.00 34.50 566 A 1 +ATOM 4415 C C . GLU A 1 566 ? -2.343 16.778 38.530 1.00 33.93 566 A 1 +ATOM 4416 O O . GLU A 1 566 ? -3.266 17.047 37.771 1.00 32.96 566 A 1 +ATOM 4417 C CB . GLU A 1 566 ? -0.217 17.295 37.281 1.00 33.81 566 A 1 +ATOM 4418 C CG . GLU A 1 566 ? 0.714 18.453 36.877 1.00 31.42 566 A 1 +ATOM 4419 C CD . GLU A 1 566 ? 1.247 18.327 35.448 1.00 29.16 566 A 1 +ATOM 4420 O OE1 . GLU A 1 566 ? 1.662 19.375 34.890 1.00 26.26 566 A 1 +ATOM 4421 O OE2 . GLU A 1 566 ? 1.226 17.200 34.891 1.00 29.25 566 A 1 +ATOM 4422 N N . LEU A 1 567 ? -2.420 15.775 39.398 1.00 31.60 567 A 1 +ATOM 4423 C CA . LEU A 1 567 ? -3.645 15.000 39.617 1.00 30.88 567 A 1 +ATOM 4424 C C . LEU A 1 567 ? -4.705 15.789 40.398 1.00 30.61 567 A 1 +ATOM 4425 O O . LEU A 1 567 ? -5.886 15.452 40.299 1.00 29.92 567 A 1 +ATOM 4426 C CB . LEU A 1 567 ? -3.288 13.692 40.352 1.00 29.84 567 A 1 +ATOM 4427 C CG . LEU A 1 567 ? -2.964 12.527 39.395 1.00 28.10 567 A 1 +ATOM 4428 C CD1 . LEU A 1 567 ? -2.139 11.470 40.108 1.00 27.18 567 A 1 +ATOM 4429 C CD2 . LEU A 1 567 ? -4.247 11.869 38.881 1.00 29.97 567 A 1 +ATOM 4430 N N . TYR A 1 568 ? -4.296 16.805 41.146 1.00 30.57 568 A 1 +ATOM 4431 C CA . TYR A 1 568 ? -5.196 17.638 41.954 1.00 29.04 568 A 1 +ATOM 4432 C C . TYR A 1 568 ? -5.584 18.968 41.295 1.00 28.93 568 A 1 +ATOM 4433 O O . TYR A 1 568 ? -6.280 19.769 41.926 1.00 26.81 568 A 1 +ATOM 4434 C CB . TYR A 1 568 ? -4.584 17.859 43.345 1.00 27.37 568 A 1 +ATOM 4435 C CG . TYR A 1 568 ? -4.781 16.697 44.290 1.00 25.28 568 A 1 +ATOM 4436 C CD1 . TYR A 1 568 ? -6.025 16.503 44.921 1.00 22.78 568 A 1 +ATOM 4437 C CD2 . TYR A 1 568 ? -3.727 15.797 44.572 1.00 21.80 568 A 1 +ATOM 4438 C CE1 . TYR A 1 568 ? -6.222 15.435 45.806 1.00 21.36 568 A 1 +ATOM 4439 C CE2 . TYR A 1 568 ? -3.920 14.727 45.452 1.00 21.80 568 A 1 +ATOM 4440 C CZ . TYR A 1 568 ? -5.164 14.541 46.072 1.00 22.86 568 A 1 +ATOM 4441 O OH . TYR A 1 568 ? -5.348 13.497 46.933 1.00 21.94 568 A 1 +ATOM 4442 N N . LYS A 1 569 ? -5.166 19.240 40.040 1.00 29.89 569 A 1 +ATOM 4443 C CA . LYS A 1 569 ? -5.616 20.397 39.279 1.00 29.43 569 A 1 +ATOM 4444 C C . LYS A 1 569 ? -6.714 20.041 38.293 1.00 27.65 569 A 1 +ATOM 4445 O O . LYS A 1 569 ? -6.590 19.014 37.608 1.00 24.86 569 A 1 +ATOM 4446 C CB . LYS A 1 569 ? -4.461 21.112 38.573 1.00 28.71 569 A 1 +ATOM 4447 C CG . LYS A 1 569 ? -3.805 22.129 39.507 1.00 27.51 569 A 1 +ATOM 4448 C CD . LYS A 1 569 ? -2.754 22.929 38.723 1.00 25.98 569 A 1 +ATOM 4449 C CE . LYS A 1 569 ? -2.126 23.979 39.636 1.00 21.83 569 A 1 +ATOM 4450 N NZ . LYS A 1 569 ? -1.053 24.695 38.935 1.00 21.06 569 A 1 +ATOM 4451 O OXT . LYS A 1 569 ? -7.668 20.864 38.240 1.00 23.25 569 A 1 +ATOM 4452 N N . MET B 2 1 ? -21.773 16.394 -54.725 1.00 23.16 1 B 1 +ATOM 4453 C CA . MET B 2 1 ? -20.952 16.774 -53.550 1.00 24.97 1 B 1 +ATOM 4454 C C . MET B 2 1 ? -20.291 15.494 -53.057 1.00 26.14 1 B 1 +ATOM 4455 O O . MET B 2 1 ? -21.011 14.544 -52.801 1.00 24.40 1 B 1 +ATOM 4456 C CB . MET B 2 1 ? -21.807 17.430 -52.464 1.00 23.32 1 B 1 +ATOM 4457 C CG . MET B 2 1 ? -22.114 18.907 -52.780 1.00 21.28 1 B 1 +ATOM 4458 S SD . MET B 2 1 ? -23.327 19.649 -51.665 1.00 20.27 1 B 1 +ATOM 4459 C CE . MET B 2 1 ? -23.082 21.417 -52.011 1.00 17.79 1 B 1 +ATOM 4460 N N . ASN B 2 2 ? -18.962 15.401 -53.053 1.00 24.20 2 B 1 +ATOM 4461 C CA . ASN B 2 2 ? -18.259 14.118 -52.913 1.00 24.92 2 B 1 +ATOM 4462 C C . ASN B 2 2 ? -18.280 13.645 -51.452 1.00 25.35 2 B 1 +ATOM 4463 O O . ASN B 2 2 ? -17.724 14.314 -50.586 1.00 23.95 2 B 1 +ATOM 4464 C CB . ASN B 2 2 ? -16.833 14.249 -53.475 1.00 23.26 2 B 1 +ATOM 4465 C CG . ASN B 2 2 ? -16.802 14.268 -54.998 1.00 20.53 2 B 1 +ATOM 4466 O OD1 . ASN B 2 2 ? -17.797 14.070 -55.654 1.00 19.72 2 B 1 +ATOM 4467 N ND2 . ASN B 2 2 ? -15.658 14.530 -55.589 1.00 19.85 2 B 1 +ATOM 4468 N N . SER B 2 3 ? -18.910 12.514 -51.221 1.00 24.49 3 B 1 +ATOM 4469 C CA . SER B 2 3 ? -19.003 11.834 -49.932 1.00 26.11 3 B 1 +ATOM 4470 C C . SER B 2 3 ? -17.668 11.157 -49.587 1.00 26.14 3 B 1 +ATOM 4471 O O . SER B 2 3 ? -17.563 9.932 -49.629 1.00 24.83 3 B 1 +ATOM 4472 C CB . SER B 2 3 ? -20.150 10.809 -49.989 1.00 24.61 3 B 1 +ATOM 4473 O OG . SER B 2 3 ? -19.954 9.913 -51.061 1.00 23.05 3 B 1 +ATOM 4474 N N . THR B 2 4 ? -16.641 11.933 -49.302 1.00 29.28 4 B 1 +ATOM 4475 C CA . THR B 2 4 ? -15.393 11.396 -48.743 1.00 30.44 4 B 1 +ATOM 4476 C C . THR B 2 4 ? -15.684 10.922 -47.323 1.00 30.03 4 B 1 +ATOM 4477 O O . THR B 2 4 ? -15.671 11.723 -46.390 1.00 28.00 4 B 1 +ATOM 4478 C CB . THR B 2 4 ? -14.271 12.447 -48.754 1.00 28.23 4 B 1 +ATOM 4479 O OG1 . THR B 2 4 ? -14.753 13.707 -48.344 1.00 26.16 4 B 1 +ATOM 4480 C CG2 . THR B 2 4 ? -13.687 12.616 -50.156 1.00 25.89 4 B 1 +ATOM 4481 N N . ALA B 2 5 ? -16.009 9.630 -47.209 1.00 29.45 5 B 1 +ATOM 4482 C CA . ALA B 2 5 ? -16.150 8.992 -45.911 1.00 30.97 5 B 1 +ATOM 4483 C C . ALA B 2 5 ? -14.829 9.180 -45.141 1.00 31.25 5 B 1 +ATOM 4484 O O . ALA B 2 5 ? -13.776 8.762 -45.616 1.00 29.99 5 B 1 +ATOM 4485 C CB . ALA B 2 5 ? -16.494 7.509 -46.129 1.00 29.22 5 B 1 +ATOM 4486 N N . GLN B 2 6 ? -14.895 9.850 -43.997 1.00 32.85 6 B 1 +ATOM 4487 C CA . GLN B 2 6 ? -13.752 9.954 -43.094 1.00 34.19 6 B 1 +ATOM 4488 C C . GLN B 2 6 ? -13.482 8.547 -42.549 1.00 34.33 6 B 1 +ATOM 4489 O O . GLN B 2 6 ? -14.266 8.026 -41.763 1.00 33.09 6 B 1 +ATOM 4490 C CB . GLN B 2 6 ? -14.030 10.969 -41.983 1.00 32.72 6 B 1 +ATOM 4491 C CG . GLN B 2 6 ? -13.834 12.424 -42.454 1.00 30.59 6 B 1 +ATOM 4492 C CD . GLN B 2 6 ? -14.161 13.456 -41.363 1.00 28.44 6 B 1 +ATOM 4493 O OE1 . GLN B 2 6 ? -15.169 13.361 -40.692 1.00 28.21 6 B 1 +ATOM 4494 N NE2 . GLN B 2 6 ? -13.352 14.464 -41.179 1.00 28.81 6 B 1 +ATOM 4495 N N . GLN B 2 7 ? -12.417 7.925 -43.040 1.00 34.92 7 B 1 +ATOM 4496 C CA . GLN B 2 7 ? -11.924 6.647 -42.538 1.00 37.10 7 B 1 +ATOM 4497 C C . GLN B 2 7 ? -11.363 6.863 -41.131 1.00 37.55 7 B 1 +ATOM 4498 O O . GLN B 2 7 ? -10.789 7.918 -40.859 1.00 36.56 7 B 1 +ATOM 4499 C CB . GLN B 2 7 ? -10.864 6.090 -43.502 1.00 36.08 7 B 1 +ATOM 4500 C CG . GLN B 2 7 ? -11.490 5.560 -44.803 1.00 34.18 7 B 1 +ATOM 4501 C CD . GLN B 2 7 ? -10.459 5.068 -45.821 1.00 31.56 7 B 1 +ATOM 4502 O OE1 . GLN B 2 7 ? -9.383 5.613 -45.974 1.00 31.02 7 B 1 +ATOM 4503 N NE2 . GLN B 2 7 ? -10.772 4.030 -46.571 1.00 30.81 7 B 1 +ATOM 4504 N N . GLY B 2 8 ? -11.565 5.889 -40.265 1.00 39.50 8 B 1 +ATOM 4505 C CA . GLY B 2 8 ? -10.906 5.847 -38.962 1.00 41.03 8 B 1 +ATOM 4506 C C . GLY B 2 8 ? -9.381 5.806 -39.104 1.00 41.51 8 B 1 +ATOM 4507 O O . GLY B 2 8 ? -8.853 5.742 -40.221 1.00 40.27 8 B 1 +ATOM 4508 N N . LEU B 2 9 ? -8.681 5.848 -37.978 1.00 41.55 9 B 1 +ATOM 4509 C CA . LEU B 2 9 ? -7.210 5.788 -37.927 1.00 42.59 9 B 1 +ATOM 4510 C C . LEU B 2 9 ? -6.671 4.526 -38.589 1.00 43.14 9 B 1 +ATOM 4511 O O . LEU B 2 9 ? -5.717 4.592 -39.358 1.00 41.29 9 B 1 +ATOM 4512 C CB . LEU B 2 9 ? -6.780 5.815 -36.452 1.00 39.91 9 B 1 +ATOM 4513 C CG . LEU B 2 9 ? -6.229 7.189 -36.037 1.00 37.44 9 B 1 +ATOM 4514 C CD1 . LEU B 2 9 ? -6.733 7.548 -34.652 1.00 35.51 9 B 1 +ATOM 4515 C CD2 . LEU B 2 9 ? -4.710 7.170 -36.007 1.00 36.26 9 B 1 +ATOM 4516 N N . ILE B 2 10 ? -7.309 3.406 -38.286 1.00 41.64 10 B 1 +ATOM 4517 C CA . ILE B 2 10 ? -7.067 2.142 -38.966 1.00 42.92 10 B 1 +ATOM 4518 C C . ILE B 2 10 ? -8.042 2.113 -40.141 1.00 43.27 10 B 1 +ATOM 4519 O O . ILE B 2 10 ? -9.254 2.038 -39.936 1.00 41.68 10 B 1 +ATOM 4520 C CB . ILE B 2 10 ? -7.230 0.944 -38.010 1.00 41.24 10 B 1 +ATOM 4521 C CG1 . ILE B 2 10 ? -6.288 1.108 -36.795 1.00 39.22 10 B 1 +ATOM 4522 C CG2 . ILE B 2 10 ? -6.931 -0.356 -38.774 1.00 38.73 10 B 1 +ATOM 4523 C CD1 . ILE B 2 10 ? -6.424 0.023 -35.736 1.00 36.77 10 B 1 +ATOM 4524 N N . PRO B 2 11 ? -7.554 2.201 -41.383 1.00 40.02 11 B 1 +ATOM 4525 C CA . PRO B 2 11 ? -8.438 2.095 -42.529 1.00 41.03 11 B 1 +ATOM 4526 C C . PRO B 2 11 ? -9.116 0.731 -42.460 1.00 40.77 11 B 1 +ATOM 4527 O O . PRO B 2 11 ? -8.461 -0.302 -42.581 1.00 39.55 11 B 1 +ATOM 4528 C CB . PRO B 2 11 ? -7.548 2.281 -43.763 1.00 39.64 11 B 1 +ATOM 4529 C CG . PRO B 2 11 ? -6.154 1.892 -43.274 1.00 39.74 11 B 1 +ATOM 4530 C CD . PRO B 2 11 ? -6.164 2.282 -41.801 1.00 42.28 11 B 1 +ATOM 4531 N N . CYS B 2 12 ? -10.426 0.739 -42.258 1.00 40.41 12 B 1 +ATOM 4532 C CA . CYS B 2 12 ? -11.197 -0.495 -42.157 1.00 40.41 12 B 1 +ATOM 4533 C C . CYS B 2 12 ? -11.089 -1.225 -43.503 1.00 39.48 12 B 1 +ATOM 4534 O O . CYS B 2 12 ? -11.701 -0.814 -44.495 1.00 37.56 12 B 1 +ATOM 4535 C CB . CYS B 2 12 ? -12.628 -0.151 -41.743 1.00 37.93 12 B 1 +ATOM 4536 S SG . CYS B 2 12 ? -13.488 -1.651 -41.195 1.00 35.11 12 B 1 +ATOM 4537 N N . TYR B 2 13 ? -10.283 -2.281 -43.551 1.00 38.26 13 B 1 +ATOM 4538 C CA . TYR B 2 13 ? -9.885 -2.941 -44.802 1.00 38.58 13 B 1 +ATOM 4539 C C . TYR B 2 13 ? -11.078 -3.504 -45.584 1.00 37.68 13 B 1 +ATOM 4540 O O . TYR B 2 13 ? -11.001 -3.683 -46.798 1.00 35.84 13 B 1 +ATOM 4541 C CB . TYR B 2 13 ? -8.874 -4.057 -44.505 1.00 36.42 13 B 1 +ATOM 4542 C CG . TYR B 2 13 ? -7.445 -3.568 -44.417 1.00 34.71 13 B 1 +ATOM 4543 C CD1 . TYR B 2 13 ? -6.636 -3.569 -45.578 1.00 32.95 13 B 1 +ATOM 4544 C CD2 . TYR B 2 13 ? -6.917 -3.089 -43.208 1.00 32.29 13 B 1 +ATOM 4545 C CE1 . TYR B 2 13 ? -5.325 -3.084 -45.524 1.00 30.52 13 B 1 +ATOM 4546 C CE2 . TYR B 2 13 ? -5.606 -2.593 -43.148 1.00 30.81 13 B 1 +ATOM 4547 C CZ . TYR B 2 13 ? -4.809 -2.589 -44.312 1.00 30.22 13 B 1 +ATOM 4548 O OH . TYR B 2 13 ? -3.544 -2.084 -44.264 1.00 28.69 13 B 1 +ATOM 4549 N N . LEU B 2 14 ? -12.198 -3.720 -44.894 1.00 34.36 14 B 1 +ATOM 4550 C CA . LEU B 2 14 ? -13.451 -4.150 -45.500 1.00 35.62 14 B 1 +ATOM 4551 C C . LEU B 2 14 ? -14.042 -3.127 -46.473 1.00 35.61 14 B 1 +ATOM 4552 O O . LEU B 2 14 ? -14.722 -3.524 -47.412 1.00 33.75 14 B 1 +ATOM 4553 C CB . LEU B 2 14 ? -14.450 -4.449 -44.376 1.00 33.12 14 B 1 +ATOM 4554 C CG . LEU B 2 14 ? -14.256 -5.868 -43.840 1.00 30.39 14 B 1 +ATOM 4555 C CD1 . LEU B 2 14 ? -14.630 -5.924 -42.379 1.00 28.82 14 B 1 +ATOM 4556 C CD2 . LEU B 2 14 ? -15.123 -6.856 -44.632 1.00 30.53 14 B 1 +ATOM 4557 N N . ASN B 2 15 ? -13.785 -1.837 -46.299 1.00 33.79 15 B 1 +ATOM 4558 C CA . ASN B 2 15 ? -14.317 -0.842 -47.226 1.00 34.47 15 B 1 +ATOM 4559 C C . ASN B 2 15 ? -13.706 -0.943 -48.625 1.00 34.11 15 B 1 +ATOM 4560 O O . ASN B 2 15 ? -14.320 -0.483 -49.585 1.00 32.65 15 B 1 +ATOM 4561 C CB . ASN B 2 15 ? -14.169 0.575 -46.641 1.00 32.35 15 B 1 +ATOM 4562 C CG . ASN B 2 15 ? -15.388 1.030 -45.868 1.00 29.78 15 B 1 +ATOM 4563 O OD1 . ASN B 2 15 ? -16.475 0.500 -45.969 1.00 28.91 15 B 1 +ATOM 4564 N ND2 . ASN B 2 15 ? -15.255 2.091 -45.088 1.00 28.90 15 B 1 +ATOM 4565 N N . GLY B 2 16 ? -12.530 -1.556 -48.755 1.00 34.58 16 B 1 +ATOM 4566 C CA . GLY B 2 16 ? -11.915 -1.739 -50.076 1.00 34.89 16 B 1 +ATOM 4567 C C . GLY B 2 16 ? -12.691 -2.682 -50.986 1.00 34.60 16 B 1 +ATOM 4568 O O . GLY B 2 16 ? -12.771 -2.441 -52.194 1.00 32.96 16 B 1 +ATOM 4569 N N . SER B 2 17 ? -13.299 -3.741 -50.435 1.00 31.02 17 B 1 +ATOM 4570 C CA . SER B 2 17 ? -14.010 -4.742 -51.239 1.00 32.09 17 B 1 +ATOM 4571 C C . SER B 2 17 ? -15.511 -4.488 -51.370 1.00 32.14 17 B 1 +ATOM 4572 O O . SER B 2 17 ? -16.093 -4.795 -52.406 1.00 30.70 17 B 1 +ATOM 4573 C CB . SER B 2 17 ? -13.771 -6.151 -50.684 1.00 29.96 17 B 1 +ATOM 4574 O OG . SER B 2 17 ? -14.309 -6.279 -49.380 1.00 28.64 17 B 1 +ATOM 4575 N N . LEU B 2 18 ? -16.140 -3.973 -50.316 1.00 32.65 18 B 1 +ATOM 4576 C CA . LEU B 2 18 ? -17.601 -3.848 -50.259 1.00 33.99 18 B 1 +ATOM 4577 C C . LEU B 2 18 ? -18.148 -2.502 -50.748 1.00 33.58 18 B 1 +ATOM 4578 O O . LEU B 2 18 ? -19.367 -2.384 -50.889 1.00 32.22 18 B 1 +ATOM 4579 C CB . LEU B 2 18 ? -18.114 -4.173 -48.843 1.00 32.15 18 B 1 +ATOM 4580 C CG . LEU B 2 18 ? -18.328 -5.672 -48.609 1.00 29.94 18 B 1 +ATOM 4581 C CD1 . LEU B 2 18 ? -18.490 -5.948 -47.118 1.00 28.85 18 B 1 +ATOM 4582 C CD2 . LEU B 2 18 ? -19.597 -6.177 -49.315 1.00 30.16 18 B 1 +ATOM 4583 N N . CYS B 2 19 ? -17.299 -1.515 -51.032 1.00 33.12 19 B 1 +ATOM 4584 C CA . CYS B 2 19 ? -17.773 -0.403 -51.843 1.00 34.42 19 B 1 +ATOM 4585 C C . CYS B 2 19 ? -18.177 -0.991 -53.203 1.00 32.97 19 B 1 +ATOM 4586 O O . CYS B 2 19 ? -17.290 -1.497 -53.899 1.00 31.56 19 B 1 +ATOM 4587 C CB . CYS B 2 19 ? -16.708 0.683 -51.973 1.00 33.05 19 B 1 +ATOM 4588 S SG . CYS B 2 19 ? -16.833 1.821 -50.546 1.00 30.40 19 B 1 +ATOM 4589 N N . PRO B 2 20 ? -19.461 -0.985 -53.563 1.00 28.50 20 B 1 +ATOM 4590 C CA . PRO B 2 20 ? -19.853 -1.443 -54.875 1.00 29.63 20 B 1 +ATOM 4591 C C . PRO B 2 20 ? -19.142 -0.536 -55.865 1.00 29.53 20 B 1 +ATOM 4592 O O . PRO B 2 20 ? -19.442 0.661 -55.955 1.00 28.25 20 B 1 +ATOM 4593 C CB . PRO B 2 20 ? -21.386 -1.337 -54.909 1.00 28.20 20 B 1 +ATOM 4594 C CG . PRO B 2 20 ? -21.696 -0.247 -53.881 1.00 28.85 20 B 1 +ATOM 4595 C CD . PRO B 2 20 ? -20.572 -0.398 -52.849 1.00 31.88 20 B 1 +ATOM 4596 N N . GLY B 2 21 ? -18.139 -1.079 -56.524 1.00 27.65 21 B 1 +ATOM 4597 C CA . GLY B 2 21 ? -17.452 -0.364 -57.573 1.00 28.61 21 B 1 +ATOM 4598 C C . GLY B 2 21 ? -18.509 0.001 -58.601 1.00 28.48 21 B 1 +ATOM 4599 O O . GLY B 2 21 ? -19.046 -0.876 -59.275 1.00 26.70 21 B 1 +ATOM 4600 N N . THR B 2 22 ? -18.848 1.284 -58.683 1.00 27.68 22 B 1 +ATOM 4601 C CA . THR B 2 22 ? -19.440 1.809 -59.902 1.00 29.55 22 B 1 +ATOM 4602 C C . THR B 2 22 ? -18.497 1.375 -61.006 1.00 28.82 22 B 1 +ATOM 4603 O O . THR B 2 22 ? -17.332 1.758 -60.981 1.00 27.15 22 B 1 +ATOM 4604 C CB . THR B 2 22 ? -19.552 3.333 -59.877 1.00 27.69 22 B 1 +ATOM 4605 O OG1 . THR B 2 22 ? -18.402 3.904 -59.288 1.00 26.08 22 B 1 +ATOM 4606 C CG2 . THR B 2 22 ? -20.765 3.796 -59.070 1.00 26.24 22 B 1 +ATOM 4607 N N . LEU B 2 23 ? -18.991 0.505 -61.881 1.00 29.22 23 B 1 +ATOM 4608 C CA . LEU B 2 23 ? -18.242 0.031 -63.036 1.00 31.64 23 B 1 +ATOM 4609 C C . LEU B 2 23 ? -17.655 1.261 -63.732 1.00 30.51 23 B 1 +ATOM 4610 O O . LEU B 2 23 ? -18.441 2.053 -64.256 1.00 29.31 23 B 1 +ATOM 4611 C CB . LEU B 2 23 ? -19.208 -0.708 -63.985 1.00 30.55 23 B 1 +ATOM 4612 C CG . LEU B 2 23 ? -19.429 -2.185 -63.615 1.00 28.11 23 B 1 +ATOM 4613 C CD1 . LEU B 2 23 ? -20.759 -2.683 -64.163 1.00 27.62 23 B 1 +ATOM 4614 C CD2 . LEU B 2 23 ? -18.315 -3.059 -64.205 1.00 29.39 23 B 1 +ATOM 4615 N N . PRO B 2 24 ? -16.342 1.481 -63.685 1.00 28.76 24 B 1 +ATOM 4616 C CA . PRO B 2 24 ? -15.776 2.561 -64.458 1.00 31.00 24 B 1 +ATOM 4617 C C . PRO B 2 24 ? -16.069 2.230 -65.918 1.00 30.80 24 B 1 +ATOM 4618 O O . PRO B 2 24 ? -15.849 1.090 -66.352 1.00 29.49 24 B 1 +ATOM 4619 C CB . PRO B 2 24 ? -14.291 2.598 -64.108 1.00 29.76 24 B 1 +ATOM 4620 C CG . PRO B 2 24 ? -13.984 1.164 -63.674 1.00 30.12 24 B 1 +ATOM 4621 C CD . PRO B 2 24 ? -15.303 0.675 -63.078 1.00 33.53 24 B 1 +ATOM 4622 N N . GLU B 2 25 ? -16.624 3.193 -66.645 1.00 30.61 25 B 1 +ATOM 4623 C CA . GLU B 2 25 ? -16.743 3.042 -68.094 1.00 32.46 25 B 1 +ATOM 4624 C C . GLU B 2 25 ? -15.358 2.747 -68.678 1.00 30.95 25 B 1 +ATOM 4625 O O . GLU B 2 25 ? -14.337 3.265 -68.221 1.00 30.56 25 B 1 +ATOM 4626 C CB . GLU B 2 25 ? -17.404 4.271 -68.741 1.00 32.05 25 B 1 +ATOM 4627 C CG . GLU B 2 25 ? -18.927 4.261 -68.538 1.00 30.67 25 B 1 +ATOM 4628 C CD . GLU B 2 25 ? -19.636 5.428 -69.241 1.00 29.39 25 B 1 +ATOM 4629 O OE1 . GLU B 2 25 ? -20.804 5.209 -69.671 1.00 26.21 25 B 1 +ATOM 4630 O OE2 . GLU B 2 25 ? -19.054 6.515 -69.329 1.00 30.53 25 B 1 +ATOM 4631 N N . LYS B 2 26 ? -15.331 1.859 -69.667 1.00 32.14 26 B 1 +ATOM 4632 C CA . LYS B 2 26 ? -14.120 1.347 -70.323 1.00 34.25 26 B 1 +ATOM 4633 C C . LYS B 2 26 ? -13.446 2.401 -71.213 1.00 32.80 26 B 1 +ATOM 4634 O O . LYS B 2 26 ? -13.063 2.054 -72.322 1.00 31.53 26 B 1 +ATOM 4635 C CB . LYS B 2 26 ? -14.467 0.113 -71.160 1.00 33.38 26 B 1 +ATOM 4636 C CG . LYS B 2 26 ? -14.551 -1.207 -70.406 1.00 31.16 26 B 1 +ATOM 4637 C CD . LYS B 2 26 ? -14.765 -2.305 -71.450 1.00 29.29 26 B 1 +ATOM 4638 C CE . LYS B 2 26 ? -14.697 -3.697 -70.837 1.00 25.92 26 B 1 +ATOM 4639 N NZ . LYS B 2 26 ? -14.882 -4.756 -71.866 1.00 24.98 26 B 1 +ATOM 4640 N N . ASP B 2 27 ? -13.349 3.652 -70.819 1.00 32.66 27 B 1 +ATOM 4641 C CA . ASP B 2 27 ? -12.739 4.618 -71.719 1.00 34.30 27 B 1 +ATOM 4642 C C . ASP B 2 27 ? -11.279 4.254 -71.986 1.00 32.54 27 B 1 +ATOM 4643 O O . ASP B 2 27 ? -10.506 3.918 -71.086 1.00 31.20 27 B 1 +ATOM 4644 C CB . ASP B 2 27 ? -12.983 6.063 -71.263 1.00 32.68 27 B 1 +ATOM 4645 C CG . ASP B 2 27 ? -13.911 6.833 -72.207 1.00 30.01 27 B 1 +ATOM 4646 O OD1 . ASP B 2 27 ? -14.126 6.356 -73.348 1.00 30.09 27 B 1 +ATOM 4647 O OD2 . ASP B 2 27 ? -14.366 7.928 -71.804 1.00 29.90 27 B 1 +ATOM 4648 N N . VAL B 2 28 ? -10.929 4.241 -73.284 1.00 31.19 28 B 1 +ATOM 4649 C CA . VAL B 2 28 ? -9.819 3.467 -73.868 1.00 33.89 28 B 1 +ATOM 4650 C C . VAL B 2 28 ? -8.467 4.186 -73.755 1.00 32.74 28 B 1 +ATOM 4651 O O . VAL B 2 28 ? -7.460 3.674 -74.231 1.00 31.07 28 B 1 +ATOM 4652 C CB . VAL B 2 28 ? -10.156 3.153 -75.347 1.00 32.27 28 B 1 +ATOM 4653 C CG1 . VAL B 2 28 ? -9.164 2.228 -76.057 1.00 29.66 28 B 1 +ATOM 4654 C CG2 . VAL B 2 28 ? -11.530 2.475 -75.487 1.00 31.90 28 B 1 +ATOM 4655 N N . SER B 2 29 ? -8.419 5.391 -73.183 1.00 29.53 29 B 1 +ATOM 4656 C CA . SER B 2 29 ? -7.316 6.329 -73.389 1.00 32.82 29 B 1 +ATOM 4657 C C . SER B 2 29 ? -5.948 5.827 -72.898 1.00 32.15 29 B 1 +ATOM 4658 O O . SER B 2 29 ? -5.824 4.808 -72.230 1.00 30.97 29 B 1 +ATOM 4659 C CB . SER B 2 29 ? -7.679 7.714 -72.843 1.00 31.52 29 B 1 +ATOM 4660 O OG . SER B 2 29 ? -7.874 7.670 -71.449 1.00 30.36 29 B 1 +ATOM 4661 N N . GLY B 2 30 ? -4.893 6.554 -73.295 1.00 29.09 30 B 1 +ATOM 4662 C CA . GLY B 2 30 ? -3.560 6.013 -73.517 1.00 31.40 30 B 1 +ATOM 4663 C C . GLY B 2 30 ? -2.701 5.576 -72.331 1.00 31.07 30 B 1 +ATOM 4664 O O . GLY B 2 30 ? -3.024 5.712 -71.162 1.00 29.36 30 B 1 +ATOM 4665 N N . GLU B 2 31 ? -1.545 5.060 -72.712 1.00 27.30 31 B 1 +ATOM 4666 C CA . GLU B 2 31 ? -0.520 4.377 -71.917 1.00 29.91 31 B 1 +ATOM 4667 C C . GLU B 2 31 ? 0.320 5.271 -70.976 1.00 28.69 31 B 1 +ATOM 4668 O O . GLU B 2 31 ? 1.523 5.042 -70.867 1.00 27.96 31 B 1 +ATOM 4669 C CB . GLU B 2 31 ? 0.467 3.655 -72.858 1.00 29.37 31 B 1 +ATOM 4670 C CG . GLU B 2 31 ? -0.073 2.474 -73.668 1.00 27.98 31 B 1 +ATOM 4671 C CD . GLU B 2 31 ? 1.085 1.774 -74.419 1.00 26.76 31 B 1 +ATOM 4672 O OE1 . GLU B 2 31 ? 1.066 0.531 -74.508 1.00 23.41 31 B 1 +ATOM 4673 O OE2 . GLU B 2 31 ? 2.013 2.469 -74.884 1.00 28.73 31 B 1 +ATOM 4674 N N . GLU B 2 32 ? -0.222 6.283 -70.319 1.00 28.41 32 B 1 +ATOM 4675 C CA . GLU B 2 32 ? 0.611 6.976 -69.329 1.00 30.98 32 B 1 +ATOM 4676 C C . GLU B 2 32 ? 0.960 5.991 -68.203 1.00 29.74 32 B 1 +ATOM 4677 O O . GLU B 2 32 ? 0.204 5.732 -67.274 1.00 28.97 32 B 1 +ATOM 4678 C CB . GLU B 2 32 ? 0.026 8.309 -68.856 1.00 30.11 32 B 1 +ATOM 4679 C CG . GLU B 2 32 ? 0.327 9.422 -69.875 1.00 28.16 32 B 1 +ATOM 4680 C CD . GLU B 2 32 ? 0.002 10.843 -69.389 1.00 27.07 32 B 1 +ATOM 4681 O OE1 . GLU B 2 32 ? 0.533 11.789 -70.023 1.00 23.96 32 B 1 +ATOM 4682 O OE2 . GLU B 2 32 ? -0.768 10.987 -68.417 1.00 28.89 32 B 1 +ATOM 4683 N N . LYS B 2 33 ? 2.163 5.398 -68.329 1.00 29.21 33 B 1 +ATOM 4684 C CA . LYS B 2 33 ? 2.828 4.552 -67.340 1.00 31.58 33 B 1 +ATOM 4685 C C . LYS B 2 33 ? 3.179 5.393 -66.115 1.00 31.13 33 B 1 +ATOM 4686 O O . LYS B 2 33 ? 4.347 5.722 -65.901 1.00 29.73 33 B 1 +ATOM 4687 C CB . LYS B 2 33 ? 4.099 3.933 -67.928 1.00 30.06 33 B 1 +ATOM 4688 C CG . LYS B 2 33 ? 3.839 2.807 -68.920 1.00 27.74 33 B 1 +ATOM 4689 C CD . LYS B 2 33 ? 5.185 2.271 -69.427 1.00 26.62 33 B 1 +ATOM 4690 C CE . LYS B 2 33 ? 4.941 1.083 -70.357 1.00 23.38 33 B 1 +ATOM 4691 N NZ . LYS B 2 33 ? 6.191 0.604 -70.972 1.00 23.75 33 B 1 +ATOM 4692 N N . ASP B 2 34 ? 2.170 5.792 -65.382 1.00 30.92 34 B 1 +ATOM 4693 C CA . ASP B 2 34 ? 2.377 6.704 -64.276 1.00 33.00 34 B 1 +ATOM 4694 C C . ASP B 2 34 ? 3.213 6.044 -63.172 1.00 32.78 34 B 1 +ATOM 4695 O O . ASP B 2 34 ? 3.106 4.855 -62.877 1.00 31.46 34 B 1 +ATOM 4696 C CB . ASP B 2 34 ? 1.034 7.276 -63.803 1.00 31.23 34 B 1 +ATOM 4697 C CG . ASP B 2 34 ? 1.168 8.704 -63.271 1.00 28.48 34 B 1 +ATOM 4698 O OD1 . ASP B 2 34 ? 2.327 9.182 -63.167 1.00 28.29 34 B 1 +ATOM 4699 O OD2 . ASP B 2 34 ? 0.121 9.290 -62.942 1.00 27.43 34 B 1 +ATOM 4700 N N . SER B 2 35 ? 4.112 6.815 -62.575 1.00 30.52 35 B 1 +ATOM 4701 C CA . SER B 2 35 ? 5.178 6.363 -61.676 1.00 33.01 35 B 1 +ATOM 4702 C C . SER B 2 35 ? 4.702 5.929 -60.282 1.00 33.26 35 B 1 +ATOM 4703 O O . SER B 2 35 ? 5.517 5.718 -59.387 1.00 31.98 35 B 1 +ATOM 4704 C CB . SER B 2 35 ? 6.224 7.479 -61.563 1.00 31.08 35 B 1 +ATOM 4705 O OG . SER B 2 35 ? 5.625 8.661 -61.080 1.00 29.90 35 B 1 +ATOM 4706 N N . SER B 2 36 ? 3.403 5.779 -60.090 1.00 33.18 36 B 1 +ATOM 4707 C CA . SER B 2 36 ? 2.774 5.324 -58.847 1.00 35.22 36 B 1 +ATOM 4708 C C . SER B 2 36 ? 3.067 3.863 -58.494 1.00 35.04 36 B 1 +ATOM 4709 O O . SER B 2 36 ? 2.774 3.439 -57.380 1.00 33.48 36 B 1 +ATOM 4710 C CB . SER B 2 36 ? 1.264 5.548 -58.945 1.00 33.71 36 B 1 +ATOM 4711 O OG . SER B 2 36 ? 0.735 4.873 -60.064 1.00 32.82 36 B 1 +ATOM 4712 N N . ALA B 2 37 ? 3.685 3.083 -59.371 1.00 34.10 37 B 1 +ATOM 4713 C CA . ALA B 2 37 ? 3.940 1.652 -59.205 1.00 35.99 37 B 1 +ATOM 4714 C C . ALA B 2 37 ? 4.742 1.296 -57.941 1.00 36.41 37 B 1 +ATOM 4715 O O . ALA B 2 37 ? 4.509 0.248 -57.347 1.00 35.10 37 B 1 +ATOM 4716 C CB . ALA B 2 37 ? 4.674 1.159 -60.459 1.00 33.67 37 B 1 +ATOM 4717 N N . GLY B 2 38 ? 5.670 2.154 -57.503 1.00 36.48 38 B 1 +ATOM 4718 C CA . GLY B 2 38 ? 6.539 1.849 -56.360 1.00 38.02 38 B 1 +ATOM 4719 C C . GLY B 2 38 ? 5.822 1.759 -55.010 1.00 38.58 38 B 1 +ATOM 4720 O O . GLY B 2 38 ? 6.347 1.164 -54.075 1.00 37.00 38 B 1 +ATOM 4721 N N . CYS B 2 39 ? 4.620 2.322 -54.926 1.00 42.59 39 B 1 +ATOM 4722 C CA . CYS B 2 39 ? 3.840 2.301 -53.696 1.00 43.27 39 B 1 +ATOM 4723 C C . CYS B 2 39 ? 2.821 1.145 -53.624 1.00 42.71 39 B 1 +ATOM 4724 O O . CYS B 2 39 ? 2.135 0.979 -52.620 1.00 41.02 39 B 1 +ATOM 4725 C CB . CYS B 2 39 ? 3.167 3.667 -53.539 1.00 41.55 39 B 1 +ATOM 4726 S SG . CYS B 2 39 ? 2.680 3.921 -51.826 1.00 38.95 39 B 1 +ATOM 4727 N N . SER B 2 40 ? 2.690 0.367 -54.696 1.00 38.22 40 B 1 +ATOM 4728 C CA . SER B 2 40 ? 1.615 -0.614 -54.858 1.00 39.70 40 B 1 +ATOM 4729 C C . SER B 2 40 ? 1.816 -1.929 -54.112 1.00 40.74 40 B 1 +ATOM 4730 O O . SER B 2 40 ? 0.851 -2.652 -53.914 1.00 38.99 40 B 1 +ATOM 4731 C CB . SER B 2 40 ? 1.396 -0.906 -56.335 1.00 37.36 40 B 1 +ATOM 4732 O OG . SER B 2 40 ? 2.523 -1.554 -56.900 1.00 35.65 40 B 1 +ATOM 4733 N N . GLU B 2 41 ? 3.036 -2.258 -53.726 1.00 40.82 41 B 1 +ATOM 4734 C CA . GLU B 2 41 ? 3.293 -3.450 -52.926 1.00 42.09 41 B 1 +ATOM 4735 C C . GLU B 2 41 ? 2.803 -3.220 -51.492 1.00 43.16 41 B 1 +ATOM 4736 O O . GLU B 2 41 ? 3.577 -3.046 -50.555 1.00 41.70 41 B 1 +ATOM 4737 C CB . GLU B 2 41 ? 4.759 -3.908 -53.001 1.00 39.75 41 B 1 +ATOM 4738 C CG . GLU B 2 41 ? 5.100 -4.565 -54.341 1.00 36.40 41 B 1 +ATOM 4739 C CD . GLU B 2 41 ? 6.496 -5.230 -54.365 1.00 33.74 41 B 1 +ATOM 4740 O OE1 . GLU B 2 41 ? 6.743 -6.023 -55.308 1.00 29.60 41 B 1 +ATOM 4741 O OE2 . GLU B 2 41 ? 7.312 -4.953 -53.461 1.00 33.38 41 B 1 +ATOM 4742 N N . GLN B 2 42 ? 1.468 -3.231 -51.306 1.00 45.58 42 B 1 +ATOM 4743 C CA . GLN B 2 42 ? 0.877 -3.519 -50.020 1.00 45.94 42 B 1 +ATOM 4744 C C . GLN B 2 42 ? 1.409 -4.882 -49.593 1.00 46.85 42 B 1 +ATOM 4745 O O . GLN B 2 42 ? 0.996 -5.917 -50.118 1.00 45.12 42 B 1 +ATOM 4746 C CB . GLN B 2 42 ? -0.661 -3.533 -50.086 1.00 43.31 42 B 1 +ATOM 4747 C CG . GLN B 2 42 ? -1.255 -2.124 -50.090 1.00 40.14 42 B 1 +ATOM 4748 C CD . GLN B 2 42 ? -2.786 -2.129 -50.032 1.00 37.09 42 B 1 +ATOM 4749 O OE1 . GLN B 2 42 ? -3.464 -3.095 -50.338 1.00 35.27 42 B 1 +ATOM 4750 N NE2 . GLN B 2 42 ? -3.390 -1.033 -49.630 1.00 34.16 42 B 1 +ATOM 4751 N N . LEU B 2 43 ? 2.361 -4.875 -48.681 1.00 47.62 43 B 1 +ATOM 4752 C CA . LEU B 2 43 ? 2.776 -6.073 -47.971 1.00 48.78 43 B 1 +ATOM 4753 C C . LEU B 2 43 ? 1.534 -6.622 -47.274 1.00 50.14 43 B 1 +ATOM 4754 O O . LEU B 2 43 ? 1.127 -6.140 -46.220 1.00 48.29 43 B 1 +ATOM 4755 C CB . LEU B 2 43 ? 3.917 -5.713 -47.000 1.00 45.50 43 B 1 +ATOM 4756 C CG . LEU B 2 43 ? 5.318 -6.005 -47.583 1.00 41.95 43 B 1 +ATOM 4757 C CD1 . LEU B 2 43 ? 6.340 -4.977 -47.106 1.00 39.00 43 B 1 +ATOM 4758 C CD2 . LEU B 2 43 ? 5.798 -7.389 -47.149 1.00 39.80 43 B 1 +ATOM 4759 N N . LEU B 2 44 ? 0.907 -7.600 -47.902 1.00 53.40 44 B 1 +ATOM 4760 C CA . LEU B 2 44 ? -0.165 -8.414 -47.347 1.00 54.27 44 B 1 +ATOM 4761 C C . LEU B 2 44 ? 0.441 -9.251 -46.227 1.00 55.91 44 B 1 +ATOM 4762 O O . LEU B 2 44 ? 0.812 -10.405 -46.405 1.00 53.12 44 B 1 +ATOM 4763 C CB . LEU B 2 44 ? -0.795 -9.261 -48.470 1.00 49.84 44 B 1 +ATOM 4764 C CG . LEU B 2 44 ? -2.061 -8.628 -49.077 1.00 45.32 44 B 1 +ATOM 4765 C CD1 . LEU B 2 44 ? -2.225 -9.040 -50.541 1.00 41.34 44 B 1 +ATOM 4766 C CD2 . LEU B 2 44 ? -3.310 -9.087 -48.314 1.00 41.07 44 B 1 +ATOM 4767 N N . ILE B 2 45 ? 0.604 -8.610 -45.074 1.00 57.35 45 B 1 +ATOM 4768 C CA . ILE B 2 45 ? 1.070 -9.280 -43.877 1.00 59.20 45 B 1 +ATOM 4769 C C . ILE B 2 45 ? -0.032 -10.243 -43.464 1.00 61.49 45 B 1 +ATOM 4770 O O . ILE B 2 45 ? -1.176 -9.832 -43.265 1.00 58.29 45 B 1 +ATOM 4771 C CB . ILE B 2 45 ? 1.440 -8.260 -42.794 1.00 55.99 45 B 1 +ATOM 4772 C CG1 . ILE B 2 45 ? 2.636 -7.378 -43.259 1.00 52.50 45 B 1 +ATOM 4773 C CG2 . ILE B 2 45 ? 1.812 -9.002 -41.508 1.00 51.50 45 B 1 +ATOM 4774 C CD1 . ILE B 2 45 ? 2.767 -6.071 -42.493 1.00 48.41 45 B 1 +ATOM 4775 N N . SER B 2 46 ? 0.311 -11.522 -43.399 1.00 64.25 46 B 1 +ATOM 4776 C CA . SER B 2 46 ? -0.652 -12.539 -43.017 1.00 66.02 46 B 1 +ATOM 4777 C C . SER B 2 46 ? -1.207 -12.232 -41.625 1.00 68.81 46 B 1 +ATOM 4778 O O . SER B 2 46 ? -0.469 -11.893 -40.704 1.00 65.29 46 B 1 +ATOM 4779 C CB . SER B 2 46 ? -0.017 -13.937 -43.044 1.00 60.70 46 B 1 +ATOM 4780 O OG . SER B 2 46 ? -0.963 -14.883 -42.591 1.00 53.97 46 B 1 +ATOM 4781 N N . THR B 2 47 ? -2.514 -12.406 -41.466 1.00 68.50 47 B 1 +ATOM 4782 C CA . THR B 2 47 ? -3.202 -12.345 -40.175 1.00 69.95 47 B 1 +ATOM 4783 C C . THR B 2 47 ? -2.558 -13.252 -39.130 1.00 72.52 47 B 1 +ATOM 4784 O O . THR B 2 47 ? -2.511 -12.914 -37.950 1.00 70.96 47 B 1 +ATOM 4785 C CB . THR B 2 47 ? -4.673 -12.750 -40.350 1.00 66.61 47 B 1 +ATOM 4786 O OG1 . THR B 2 47 ? -4.769 -13.925 -41.130 1.00 60.03 47 B 1 +ATOM 4787 C CG2 . THR B 2 47 ? -5.470 -11.677 -41.073 1.00 56.93 47 B 1 +ATOM 4788 N N . GLU B 2 48 ? -1.969 -14.368 -39.568 1.00 70.41 48 B 1 +ATOM 4789 C CA . GLU B 2 48 ? -1.217 -15.286 -38.707 1.00 71.82 48 B 1 +ATOM 4790 C C . GLU B 2 48 ? 0.023 -14.639 -38.079 1.00 73.87 48 B 1 +ATOM 4791 O O . GLU B 2 48 ? 0.351 -14.934 -36.937 1.00 74.48 48 B 1 +ATOM 4792 C CB . GLU B 2 48 ? -0.765 -16.500 -39.528 1.00 69.85 48 B 1 +ATOM 4793 C CG . GLU B 2 48 ? -1.927 -17.300 -40.117 1.00 63.81 48 B 1 +ATOM 4794 C CD . GLU B 2 48 ? -1.454 -18.448 -41.022 1.00 55.25 48 B 1 +ATOM 4795 O OE1 . GLU B 2 48 ? -2.288 -19.336 -41.291 1.00 49.15 48 B 1 +ATOM 4796 O OE2 . GLU B 2 48 ? -0.286 -18.408 -41.463 1.00 51.44 48 B 1 +ATOM 4797 N N . VAL B 2 49 ? 0.703 -13.734 -38.786 1.00 74.63 49 B 1 +ATOM 4798 C CA . VAL B 2 49 ? 1.879 -13.026 -38.266 1.00 75.74 49 B 1 +ATOM 4799 C C . VAL B 2 49 ? 1.466 -12.075 -37.152 1.00 76.80 49 B 1 +ATOM 4800 O O . VAL B 2 49 ? 2.076 -12.097 -36.084 1.00 76.74 49 B 1 +ATOM 4801 C CB . VAL B 2 49 ? 2.641 -12.274 -39.375 1.00 74.88 49 B 1 +ATOM 4802 C CG1 . VAL B 2 49 ? 3.835 -11.496 -38.818 1.00 68.13 49 B 1 +ATOM 4803 C CG2 . VAL B 2 49 ? 3.176 -13.256 -40.427 1.00 68.00 49 B 1 +ATOM 4804 N N . PHE B 2 50 ? 0.388 -11.312 -37.359 1.00 77.10 50 B 1 +ATOM 4805 C CA . PHE B 2 50 ? -0.159 -10.431 -36.324 1.00 77.78 50 B 1 +ATOM 4806 C C . PHE B 2 50 ? -0.586 -11.215 -35.074 1.00 78.61 50 B 1 +ATOM 4807 O O . PHE B 2 50 ? -0.222 -10.837 -33.958 1.00 78.32 50 B 1 +ATOM 4808 C CB . PHE B 2 50 ? -1.347 -9.648 -36.874 1.00 75.49 50 B 1 +ATOM 4809 C CG . PHE B 2 50 ? -0.947 -8.351 -37.533 1.00 71.78 50 B 1 +ATOM 4810 C CD1 . PHE B 2 50 ? -0.753 -7.206 -36.729 1.00 65.30 50 B 1 +ATOM 4811 C CD2 . PHE B 2 50 ? -0.772 -8.266 -38.917 1.00 64.44 50 B 1 +ATOM 4812 C CE1 . PHE B 2 50 ? -0.394 -5.986 -37.319 1.00 61.72 50 B 1 +ATOM 4813 C CE2 . PHE B 2 50 ? -0.407 -7.043 -39.508 1.00 61.01 50 B 1 +ATOM 4814 C CZ . PHE B 2 50 ? -0.225 -5.910 -38.706 1.00 62.89 50 B 1 +ATOM 4815 N N . LEU B 2 51 ? -1.297 -12.329 -35.259 1.00 76.52 51 B 1 +ATOM 4816 C CA . LEU B 2 51 ? -1.718 -13.198 -34.166 1.00 77.61 51 B 1 +ATOM 4817 C C . LEU B 2 51 ? -0.528 -13.781 -33.404 1.00 78.92 51 B 1 +ATOM 4818 O O . LEU B 2 51 ? -0.508 -13.755 -32.176 1.00 80.01 51 B 1 +ATOM 4819 C CB . LEU B 2 51 ? -2.609 -14.318 -34.731 1.00 76.76 51 B 1 +ATOM 4820 C CG . LEU B 2 51 ? -4.104 -14.005 -34.543 1.00 70.42 51 B 1 +ATOM 4821 C CD1 . LEU B 2 51 ? -4.950 -14.753 -35.562 1.00 62.84 51 B 1 +ATOM 4822 C CD2 . LEU B 2 51 ? -4.548 -14.411 -33.140 1.00 62.87 51 B 1 +ATOM 4823 N N . THR B 2 52 ? 0.482 -14.258 -34.116 1.00 79.38 52 B 1 +ATOM 4824 C CA . THR B 2 52 ? 1.674 -14.860 -33.504 1.00 79.24 52 B 1 +ATOM 4825 C C . THR B 2 52 ? 2.452 -13.830 -32.689 1.00 79.33 52 B 1 +ATOM 4826 O O . THR B 2 52 ? 2.783 -14.088 -31.538 1.00 80.38 52 B 1 +ATOM 4827 C CB . THR B 2 52 ? 2.575 -15.505 -34.560 1.00 79.08 52 B 1 +ATOM 4828 O OG1 . THR B 2 52 ? 1.845 -16.425 -35.330 1.00 71.01 52 B 1 +ATOM 4829 C CG2 . THR B 2 52 ? 3.722 -16.287 -33.929 1.00 68.21 52 B 1 +ATOM 4830 N N . LEU B 2 53 ? 2.690 -12.642 -33.250 1.00 80.74 53 B 1 +ATOM 4831 C CA . LEU B 2 53 ? 3.367 -11.551 -32.546 1.00 81.16 53 B 1 +ATOM 4832 C C . LEU B 2 53 ? 2.557 -11.076 -31.327 1.00 81.60 53 B 1 +ATOM 4833 O O . LEU B 2 53 ? 3.128 -10.875 -30.261 1.00 81.79 53 B 1 +ATOM 4834 C CB . LEU B 2 53 ? 3.615 -10.385 -33.511 1.00 81.06 53 B 1 +ATOM 4835 C CG . LEU B 2 53 ? 4.665 -10.652 -34.605 1.00 77.95 53 B 1 +ATOM 4836 C CD1 . LEU B 2 53 ? 4.695 -9.479 -35.588 1.00 70.65 53 B 1 +ATOM 4837 C CD2 . LEU B 2 53 ? 6.080 -10.804 -34.033 1.00 71.11 53 B 1 +ATOM 4838 N N . GLY B 2 54 ? 1.240 -10.965 -31.453 1.00 82.33 54 B 1 +ATOM 4839 C CA . GLY B 2 54 ? 0.355 -10.591 -30.361 1.00 81.22 54 B 1 +ATOM 4840 C C . GLY B 2 54 ? 0.374 -11.600 -29.211 1.00 82.52 54 B 1 +ATOM 4841 O O . GLY B 2 54 ? 0.488 -11.216 -28.057 1.00 82.29 54 B 1 +ATOM 4842 N N . ILE B 2 55 ? 0.343 -12.906 -29.522 1.00 81.73 55 B 1 +ATOM 4843 C CA . ILE B 2 55 ? 0.405 -13.970 -28.519 1.00 81.80 55 B 1 +ATOM 4844 C C . ILE B 2 55 ? 1.771 -13.984 -27.816 1.00 82.45 55 B 1 +ATOM 4845 O O . ILE B 2 55 ? 1.811 -14.092 -26.588 1.00 83.12 55 B 1 +ATOM 4846 C CB . ILE B 2 55 ? 0.070 -15.345 -29.144 1.00 80.97 55 B 1 +ATOM 4847 C CG1 . ILE B 2 55 ? -1.424 -15.394 -29.538 1.00 74.67 55 B 1 +ATOM 4848 C CG2 . ILE B 2 55 ? 0.391 -16.501 -28.183 1.00 71.16 55 B 1 +ATOM 4849 C CD1 . ILE B 2 55 ? -1.782 -16.562 -30.464 1.00 63.87 55 B 1 +ATOM 4850 N N . ILE B 2 56 ? 2.872 -13.865 -28.564 1.00 83.00 56 B 1 +ATOM 4851 C CA . ILE B 2 56 ? 4.224 -13.828 -27.984 1.00 83.82 56 B 1 +ATOM 4852 C C . ILE B 2 56 ? 4.349 -12.640 -27.035 1.00 84.33 56 B 1 +ATOM 4853 O O . ILE B 2 56 ? 4.703 -12.833 -25.874 1.00 83.87 56 B 1 +ATOM 4854 C CB . ILE B 2 56 ? 5.304 -13.813 -29.089 1.00 84.05 56 B 1 +ATOM 4855 C CG1 . ILE B 2 56 ? 5.333 -15.175 -29.818 1.00 78.90 56 B 1 +ATOM 4856 C CG2 . ILE B 2 56 ? 6.689 -13.518 -28.500 1.00 77.06 56 B 1 +ATOM 4857 C CD1 . ILE B 2 56 ? 6.141 -15.156 -31.131 1.00 69.32 56 B 1 +ATOM 4858 N N . SER B 2 57 ? 3.982 -11.442 -27.483 1.00 85.42 57 B 1 +ATOM 4859 C CA . SER B 2 57 ? 4.042 -10.234 -26.661 1.00 84.85 57 B 1 +ATOM 4860 C C . SER B 2 57 ? 3.166 -10.343 -25.411 1.00 85.40 57 B 1 +ATOM 4861 O O . SER B 2 57 ? 3.601 -10.000 -24.308 1.00 84.59 57 B 1 +ATOM 4862 C CB . SER B 2 57 ? 3.625 -9.022 -27.491 1.00 83.93 57 B 1 +ATOM 4863 O OG . SER B 2 57 ? 3.592 -7.876 -26.669 1.00 72.32 57 B 1 +ATOM 4864 N N . LEU B 2 58 ? 1.961 -10.891 -25.544 1.00 84.59 58 B 1 +ATOM 4865 C CA . LEU B 2 58 ? 1.066 -11.102 -24.410 1.00 84.51 58 B 1 +ATOM 4866 C C . LEU B 2 58 ? 1.681 -12.042 -23.374 1.00 84.99 58 B 1 +ATOM 4867 O O . LEU B 2 58 ? 1.672 -11.736 -22.186 1.00 85.08 58 B 1 +ATOM 4868 C CB . LEU B 2 58 ? -0.282 -11.628 -24.935 1.00 83.50 58 B 1 +ATOM 4869 C CG . LEU B 2 58 ? -1.366 -11.722 -23.844 1.00 79.16 58 B 1 +ATOM 4870 C CD1 . LEU B 2 58 ? -1.849 -10.345 -23.415 1.00 70.29 58 B 1 +ATOM 4871 C CD2 . LEU B 2 58 ? -2.571 -12.500 -24.364 1.00 70.65 58 B 1 +ATOM 4872 N N . LEU B 2 59 ? 2.252 -13.174 -23.809 1.00 84.98 59 B 1 +ATOM 4873 C CA . LEU B 2 59 ? 2.886 -14.140 -22.916 1.00 84.97 59 B 1 +ATOM 4874 C C . LEU B 2 59 ? 4.120 -13.560 -22.222 1.00 84.96 59 B 1 +ATOM 4875 O O . LEU B 2 59 ? 4.285 -13.748 -21.016 1.00 84.87 59 B 1 +ATOM 4876 C CB . LEU B 2 59 ? 3.254 -15.409 -23.707 1.00 84.62 59 B 1 +ATOM 4877 C CG . LEU B 2 59 ? 2.056 -16.284 -24.109 1.00 79.12 59 B 1 +ATOM 4878 C CD1 . LEU B 2 59 ? 2.538 -17.413 -25.019 1.00 70.90 59 B 1 +ATOM 4879 C CD2 . LEU B 2 59 ? 1.361 -16.922 -22.903 1.00 71.50 59 B 1 +ATOM 4880 N N . GLU B 2 60 ? 4.961 -12.831 -22.951 1.00 84.56 60 B 1 +ATOM 4881 C CA . GLU B 2 60 ? 6.151 -12.185 -22.389 1.00 85.33 60 B 1 +ATOM 4882 C C . GLU B 2 60 ? 5.785 -11.129 -21.344 1.00 85.55 60 B 1 +ATOM 4883 O O . GLU B 2 60 ? 6.348 -11.124 -20.250 1.00 84.53 60 B 1 +ATOM 4884 C CB . GLU B 2 60 ? 6.975 -11.544 -23.502 1.00 83.00 60 B 1 +ATOM 4885 C CG . GLU B 2 60 ? 7.715 -12.562 -24.384 1.00 78.08 60 B 1 +ATOM 4886 C CD . GLU B 2 60 ? 8.615 -11.870 -25.416 1.00 78.21 60 B 1 +ATOM 4887 O OE1 . GLU B 2 60 ? 9.492 -12.570 -25.981 1.00 67.99 60 B 1 +ATOM 4888 O OE2 . GLU B 2 60 ? 8.479 -10.640 -25.624 1.00 74.09 60 B 1 +ATOM 4889 N N . ASN B 2 61 ? 4.806 -10.283 -21.635 1.00 88.98 61 B 1 +ATOM 4890 C CA . ASN B 2 61 ? 4.379 -9.247 -20.701 1.00 88.45 61 B 1 +ATOM 4891 C C . ASN B 2 61 ? 3.640 -9.822 -19.481 1.00 88.26 61 B 1 +ATOM 4892 O O . ASN B 2 61 ? 3.852 -9.353 -18.361 1.00 86.85 61 B 1 +ATOM 4893 C CB . ASN B 2 61 ? 3.578 -8.180 -21.454 1.00 88.25 61 B 1 +ATOM 4894 C CG . ASN B 2 61 ? 4.494 -7.292 -22.285 1.00 86.52 61 B 1 +ATOM 4895 O OD1 . ASN B 2 61 ? 5.419 -6.699 -21.764 1.00 76.35 61 B 1 +ATOM 4896 N ND2 . ASN B 2 61 ? 4.264 -7.186 -23.565 1.00 75.57 61 B 1 +ATOM 4897 N N . ILE B 2 62 ? 2.851 -10.895 -19.654 1.00 86.49 62 B 1 +ATOM 4898 C CA . ILE B 2 62 ? 2.288 -11.649 -18.522 1.00 85.80 62 B 1 +ATOM 4899 C C . ILE B 2 62 ? 3.417 -12.206 -17.645 1.00 85.77 62 B 1 +ATOM 4900 O O . ILE B 2 62 ? 3.326 -12.121 -16.417 1.00 85.06 62 B 1 +ATOM 4901 C CB . ILE B 2 62 ? 1.347 -12.768 -19.013 1.00 85.54 62 B 1 +ATOM 4902 C CG1 . ILE B 2 62 ? 0.033 -12.159 -19.538 1.00 80.37 62 B 1 +ATOM 4903 C CG2 . ILE B 2 62 ? 1.025 -13.785 -17.894 1.00 78.60 62 B 1 +ATOM 4904 C CD1 . ILE B 2 62 ? -0.849 -13.150 -20.323 1.00 70.88 62 B 1 +ATOM 4905 N N . LEU B 2 63 ? 4.491 -12.731 -18.252 1.00 86.90 63 B 1 +ATOM 4906 C CA . LEU B 2 63 ? 5.633 -13.251 -17.522 1.00 85.95 63 B 1 +ATOM 4907 C C . LEU B 2 63 ? 6.346 -12.150 -16.717 1.00 85.93 63 B 1 +ATOM 4908 O O . LEU B 2 63 ? 6.701 -12.380 -15.557 1.00 85.19 63 B 1 +ATOM 4909 C CB . LEU B 2 63 ? 6.584 -13.931 -18.523 1.00 84.95 63 B 1 +ATOM 4910 C CG . LEU B 2 63 ? 7.715 -14.729 -17.848 1.00 78.45 63 B 1 +ATOM 4911 C CD1 . LEU B 2 63 ? 7.192 -16.042 -17.259 1.00 69.92 63 B 1 +ATOM 4912 C CD2 . LEU B 2 63 ? 8.786 -15.059 -18.876 1.00 70.12 63 B 1 +ATOM 4913 N N . VAL B 2 64 ? 6.492 -10.942 -17.276 1.00 88.05 64 B 1 +ATOM 4914 C CA . VAL B 2 64 ? 7.050 -9.774 -16.572 1.00 87.46 64 B 1 +ATOM 4915 C C . VAL B 2 64 ? 6.194 -9.407 -15.364 1.00 87.44 64 B 1 +ATOM 4916 O O . VAL B 2 64 ? 6.717 -9.289 -14.258 1.00 86.64 64 B 1 +ATOM 4917 C CB . VAL B 2 64 ? 7.195 -8.564 -17.521 1.00 86.85 64 B 1 +ATOM 4918 C CG1 . VAL B 2 64 ? 7.577 -7.273 -16.781 1.00 77.81 64 B 1 +ATOM 4919 C CG2 . VAL B 2 64 ? 8.284 -8.812 -18.572 1.00 76.90 64 B 1 +ATOM 4920 N N . VAL B 2 65 ? 4.884 -9.284 -15.546 1.00 87.51 65 B 1 +ATOM 4921 C CA . VAL B 2 65 ? 3.958 -8.948 -14.455 1.00 86.67 65 B 1 +ATOM 4922 C C . VAL B 2 65 ? 3.971 -10.045 -13.378 1.00 86.05 65 B 1 +ATOM 4923 O O . VAL B 2 65 ? 4.092 -9.740 -12.192 1.00 85.41 65 B 1 +ATOM 4924 C CB . VAL B 2 65 ? 2.536 -8.708 -15.000 1.00 86.78 65 B 1 +ATOM 4925 C CG1 . VAL B 2 65 ? 1.522 -8.474 -13.877 1.00 78.34 65 B 1 +ATOM 4926 C CG2 . VAL B 2 65 ? 2.504 -7.461 -15.894 1.00 78.19 65 B 1 +ATOM 4927 N N . ALA B 2 66 ? 3.924 -11.314 -13.785 1.00 86.45 66 B 1 +ATOM 4928 C CA . ALA B 2 66 ? 3.980 -12.442 -12.859 1.00 84.72 66 B 1 +ATOM 4929 C C . ALA B 2 66 ? 5.294 -12.486 -12.060 1.00 84.19 66 B 1 +ATOM 4930 O O . ALA B 2 66 ? 5.276 -12.718 -10.851 1.00 82.47 66 B 1 +ATOM 4931 C CB . ALA B 2 66 ? 3.765 -13.731 -13.655 1.00 84.13 66 B 1 +ATOM 4932 N N . ALA B 2 67 ? 6.425 -12.201 -12.710 1.00 85.87 67 B 1 +ATOM 4933 C CA . ALA B 2 67 ? 7.718 -12.150 -12.053 1.00 84.18 67 B 1 +ATOM 4934 C C . ALA B 2 67 ? 7.784 -11.041 -10.991 1.00 83.71 67 B 1 +ATOM 4935 O O . ALA B 2 67 ? 8.252 -11.282 -9.877 1.00 82.38 67 B 1 +ATOM 4936 C CB . ALA B 2 67 ? 8.807 -11.978 -13.117 1.00 83.86 67 B 1 +ATOM 4937 N N . ILE B 2 68 ? 7.264 -9.846 -11.301 1.00 85.53 68 B 1 +ATOM 4938 C CA . ILE B 2 68 ? 7.225 -8.718 -10.357 1.00 84.81 68 B 1 +ATOM 4939 C C . ILE B 2 68 ? 6.286 -9.022 -9.174 1.00 83.27 68 B 1 +ATOM 4940 O O . ILE B 2 68 ? 6.609 -8.697 -8.033 1.00 81.43 68 B 1 +ATOM 4941 C CB . ILE B 2 68 ? 6.829 -7.418 -11.088 1.00 85.57 68 B 1 +ATOM 4942 C CG1 . ILE B 2 68 ? 7.953 -7.014 -12.077 1.00 82.58 68 B 1 +ATOM 4943 C CG2 . ILE B 2 68 ? 6.584 -6.270 -10.093 1.00 80.53 68 B 1 +ATOM 4944 C CD1 . ILE B 2 68 ? 7.548 -5.913 -13.072 1.00 75.45 68 B 1 +ATOM 4945 N N . ILE B 2 69 ? 5.157 -9.673 -9.417 1.00 84.89 69 B 1 +ATOM 4946 C CA . ILE B 2 69 ? 4.231 -10.053 -8.342 1.00 82.53 69 B 1 +ATOM 4947 C C . ILE B 2 69 ? 4.855 -11.108 -7.420 1.00 81.05 69 B 1 +ATOM 4948 O O . ILE B 2 69 ? 4.735 -11.002 -6.201 1.00 79.17 69 B 1 +ATOM 4949 C CB . ILE B 2 69 ? 2.879 -10.506 -8.930 1.00 82.98 69 B 1 +ATOM 4950 C CG1 . ILE B 2 69 ? 2.151 -9.306 -9.577 1.00 77.93 69 B 1 +ATOM 4951 C CG2 . ILE B 2 69 ? 1.973 -11.127 -7.841 1.00 76.08 69 B 1 +ATOM 4952 C CD1 . ILE B 2 69 ? 0.938 -9.702 -10.428 1.00 69.41 69 B 1 +ATOM 4953 N N . LYS B 2 70 ? 5.530 -12.104 -8.002 1.00 82.64 70 B 1 +ATOM 4954 C CA . LYS B 2 70 ? 6.080 -13.253 -7.263 1.00 80.28 70 B 1 +ATOM 4955 C C . LYS B 2 70 ? 7.308 -12.894 -6.431 1.00 79.60 70 B 1 +ATOM 4956 O O . LYS B 2 70 ? 7.437 -13.354 -5.304 1.00 74.75 70 B 1 +ATOM 4957 C CB . LYS B 2 70 ? 6.384 -14.383 -8.262 1.00 77.14 70 B 1 +ATOM 4958 C CG . LYS B 2 70 ? 6.834 -15.687 -7.563 1.00 68.17 70 B 1 +ATOM 4959 C CD . LYS B 2 70 ? 7.158 -16.793 -8.568 1.00 63.27 70 B 1 +ATOM 4960 C CE . LYS B 2 70 ? 7.654 -18.055 -7.827 1.00 54.43 70 B 1 +ATOM 4961 N NZ . LYS B 2 70 ? 8.098 -19.128 -8.735 1.00 48.97 70 B 1 +ATOM 4962 N N . ASN B 2 71 ? 8.231 -12.102 -6.981 1.00 79.73 71 B 1 +ATOM 4963 C CA . ASN B 2 71 ? 9.512 -11.827 -6.334 1.00 78.29 71 B 1 +ATOM 4964 C C . ASN B 2 71 ? 9.458 -10.535 -5.506 1.00 77.93 71 B 1 +ATOM 4965 O O . ASN B 2 71 ? 9.403 -9.442 -6.058 1.00 73.91 71 B 1 +ATOM 4966 C CB . ASN B 2 71 ? 10.624 -11.822 -7.393 1.00 75.67 71 B 1 +ATOM 4967 C CG . ASN B 2 71 ? 12.017 -11.676 -6.785 1.00 74.66 71 B 1 +ATOM 4968 O OD1 . ASN B 2 71 ? 12.204 -11.393 -5.616 1.00 65.57 71 B 1 +ATOM 4969 N ND2 . ASN B 2 71 ? 13.041 -11.867 -7.580 1.00 66.99 71 B 1 +ATOM 4970 N N . GLN B 2 72 ? 9.550 -10.664 -4.185 1.00 78.14 72 B 1 +ATOM 4971 C CA . GLN B 2 72 ? 9.528 -9.505 -3.288 1.00 76.78 72 B 1 +ATOM 4972 C C . GLN B 2 72 ? 10.708 -8.541 -3.507 1.00 77.69 72 B 1 +ATOM 4973 O O . GLN B 2 72 ? 10.545 -7.343 -3.304 1.00 72.43 72 B 1 +ATOM 4974 C CB . GLN B 2 72 ? 9.486 -9.944 -1.822 1.00 72.75 72 B 1 +ATOM 4975 C CG . GLN B 2 72 ? 8.163 -10.634 -1.443 1.00 65.03 72 B 1 +ATOM 4976 C CD . GLN B 2 72 ? 7.988 -10.773 0.070 1.00 57.47 72 B 1 +ATOM 4977 O OE1 . GLN B 2 72 ? 8.753 -10.272 0.857 1.00 49.87 72 B 1 +ATOM 4978 N NE2 . GLN B 2 72 ? 6.950 -11.445 0.530 1.00 48.10 72 B 1 +ATOM 4979 N N . ASN B 2 73 ? 11.845 -9.018 -3.990 1.00 76.46 73 B 1 +ATOM 4980 C CA . ASN B 2 73 ? 12.986 -8.158 -4.316 1.00 75.13 73 B 1 +ATOM 4981 C C . ASN B 2 73 ? 12.685 -7.192 -5.488 1.00 76.29 73 B 1 +ATOM 4982 O O . ASN B 2 73 ? 13.384 -6.196 -5.664 1.00 73.52 73 B 1 +ATOM 4983 C CB . ASN B 2 73 ? 14.205 -9.025 -4.656 1.00 72.45 73 B 1 +ATOM 4984 C CG . ASN B 2 73 ? 14.709 -9.850 -3.485 1.00 68.74 73 B 1 +ATOM 4985 O OD1 . ASN B 2 73 ? 14.473 -9.572 -2.323 1.00 60.64 73 B 1 +ATOM 4986 N ND2 . ASN B 2 73 ? 15.448 -10.896 -3.776 1.00 60.78 73 B 1 +ATOM 4987 N N . LEU B 2 74 ? 11.635 -7.475 -6.268 1.00 76.58 74 B 1 +ATOM 4988 C CA . LEU B 2 74 ? 11.155 -6.608 -7.344 1.00 77.99 74 B 1 +ATOM 4989 C C . LEU B 2 74 ? 10.020 -5.667 -6.893 1.00 78.80 74 B 1 +ATOM 4990 O O . LEU B 2 74 ? 9.491 -4.921 -7.713 1.00 76.28 74 B 1 +ATOM 4991 C CB . LEU B 2 74 ? 10.735 -7.468 -8.552 1.00 77.30 74 B 1 +ATOM 4992 C CG . LEU B 2 74 ? 11.848 -8.384 -9.100 1.00 76.93 74 B 1 +ATOM 4993 C CD1 . LEU B 2 74 ? 11.304 -9.207 -10.268 1.00 68.20 74 B 1 +ATOM 4994 C CD2 . LEU B 2 74 ? 13.063 -7.606 -9.607 1.00 69.96 74 B 1 +ATOM 4995 N N . HIS B 2 75 ? 9.647 -5.678 -5.605 1.00 80.45 75 B 1 +ATOM 4996 C CA . HIS B 2 75 ? 8.615 -4.785 -5.077 1.00 79.70 75 B 1 +ATOM 4997 C C . HIS B 2 75 ? 9.160 -3.384 -4.756 1.00 79.05 75 B 1 +ATOM 4998 O O . HIS B 2 75 ? 9.002 -2.864 -3.646 1.00 75.16 75 B 1 +ATOM 4999 C CB . HIS B 2 75 ? 7.885 -5.425 -3.884 1.00 78.46 75 B 1 +ATOM 5000 C CG . HIS B 2 75 ? 7.138 -6.677 -4.211 1.00 78.59 75 B 1 +ATOM 5001 N ND1 . HIS B 2 75 ? 6.657 -7.567 -3.277 1.00 67.00 75 B 1 +ATOM 5002 C CD2 . HIS B 2 75 ? 6.789 -7.172 -5.438 1.00 67.94 75 B 1 +ATOM 5003 C CE1 . HIS B 2 75 ? 6.065 -8.580 -3.923 1.00 69.22 75 B 1 +ATOM 5004 N NE2 . HIS B 2 75 ? 6.119 -8.371 -5.241 1.00 70.72 75 B 1 +ATOM 5005 N N . SER B 2 76 ? 9.792 -2.769 -5.742 1.00 79.85 76 B 1 +ATOM 5006 C CA . SER B 2 76 ? 10.288 -1.397 -5.669 1.00 80.22 76 B 1 +ATOM 5007 C C . SER B 2 76 ? 9.531 -0.495 -6.652 1.00 82.75 76 B 1 +ATOM 5008 O O . SER B 2 76 ? 9.009 -0.994 -7.650 1.00 81.09 76 B 1 +ATOM 5009 C CB . SER B 2 76 ? 11.800 -1.375 -5.911 1.00 76.14 76 B 1 +ATOM 5010 O OG . SER B 2 76 ? 12.109 -1.556 -7.271 1.00 67.73 76 B 1 +ATOM 5011 N N . PRO B 2 77 ? 9.482 0.824 -6.410 1.00 80.07 77 B 1 +ATOM 5012 C CA . PRO B 2 77 ? 8.781 1.765 -7.283 1.00 81.56 77 B 1 +ATOM 5013 C C . PRO B 2 77 ? 9.155 1.648 -8.764 1.00 83.29 77 B 1 +ATOM 5014 O O . PRO B 2 77 ? 8.272 1.627 -9.621 1.00 82.62 77 B 1 +ATOM 5015 C CB . PRO B 2 77 ? 9.124 3.147 -6.724 1.00 79.74 77 B 1 +ATOM 5016 C CG . PRO B 2 77 ? 9.286 2.881 -5.233 1.00 75.95 77 B 1 +ATOM 5017 C CD . PRO B 2 77 ? 9.945 1.506 -5.210 1.00 77.86 77 B 1 +ATOM 5018 N N . MET B 2 78 ? 10.436 1.471 -9.078 1.00 82.59 78 B 1 +ATOM 5019 C CA . MET B 2 78 ? 10.904 1.290 -10.458 1.00 83.32 78 B 1 +ATOM 5020 C C . MET B 2 78 ? 10.235 0.092 -11.144 1.00 85.28 78 B 1 +ATOM 5021 O O . MET B 2 78 ? 9.765 0.204 -12.274 1.00 84.66 78 B 1 +ATOM 5022 C CB . MET B 2 78 ? 12.432 1.106 -10.464 1.00 80.79 78 B 1 +ATOM 5023 C CG . MET B 2 78 ? 12.969 0.958 -11.879 1.00 74.17 78 B 1 +ATOM 5024 S SD . MET B 2 78 ? 14.742 0.609 -11.973 1.00 68.34 78 B 1 +ATOM 5025 C CE . MET B 2 78 ? 14.916 0.456 -13.762 1.00 60.26 78 B 1 +ATOM 5026 N N . TYR B 2 79 ? 10.182 -1.059 -10.466 1.00 85.18 79 B 1 +ATOM 5027 C CA . TYR B 2 79 ? 9.586 -2.256 -11.039 1.00 86.08 79 B 1 +ATOM 5028 C C . TYR B 2 79 ? 8.062 -2.181 -11.127 1.00 87.45 79 B 1 +ATOM 5029 O O . TYR B 2 79 ? 7.490 -2.796 -12.008 1.00 87.30 79 B 1 +ATOM 5030 C CB . TYR B 2 79 ? 10.036 -3.496 -10.263 1.00 84.87 79 B 1 +ATOM 5031 C CG . TYR B 2 79 ? 11.469 -3.886 -10.529 1.00 82.29 79 B 1 +ATOM 5032 C CD1 . TYR B 2 79 ? 11.835 -4.418 -11.781 1.00 73.19 79 B 1 +ATOM 5033 C CD2 . TYR B 2 79 ? 12.445 -3.735 -9.532 1.00 73.34 79 B 1 +ATOM 5034 C CE1 . TYR B 2 79 ? 13.166 -4.798 -12.031 1.00 71.52 79 B 1 +ATOM 5035 C CE2 . TYR B 2 79 ? 13.767 -4.107 -9.771 1.00 70.79 79 B 1 +ATOM 5036 C CZ . TYR B 2 79 ? 14.131 -4.642 -11.021 1.00 75.81 79 B 1 +ATOM 5037 O OH . TYR B 2 79 ? 15.435 -5.006 -11.252 1.00 72.86 79 B 1 +ATOM 5038 N N . PHE B 2 80 ? 7.402 -1.381 -10.279 1.00 86.65 80 B 1 +ATOM 5039 C CA . PHE B 2 80 ? 5.983 -1.094 -10.458 1.00 87.90 80 B 1 +ATOM 5040 C C . PHE B 2 80 ? 5.722 -0.236 -11.697 1.00 89.16 80 B 1 +ATOM 5041 O O . PHE B 2 80 ? 4.766 -0.494 -12.417 1.00 88.21 80 B 1 +ATOM 5042 C CB . PHE B 2 80 ? 5.396 -0.444 -9.206 1.00 87.06 80 B 1 +ATOM 5043 C CG . PHE B 2 80 ? 5.402 -1.311 -7.962 1.00 85.65 80 B 1 +ATOM 5044 C CD1 . PHE B 2 80 ? 5.163 -2.697 -8.023 1.00 75.13 80 B 1 +ATOM 5045 C CD2 . PHE B 2 80 ? 5.614 -0.709 -6.702 1.00 73.17 80 B 1 +ATOM 5046 C CE1 . PHE B 2 80 ? 5.168 -3.479 -6.858 1.00 71.48 80 B 1 +ATOM 5047 C CE2 . PHE B 2 80 ? 5.611 -1.488 -5.541 1.00 70.54 80 B 1 +ATOM 5048 C CZ . PHE B 2 80 ? 5.398 -2.875 -5.622 1.00 75.20 80 B 1 +ATOM 5049 N N . PHE B 2 81 ? 6.595 0.712 -12.013 1.00 87.24 81 B 1 +ATOM 5050 C CA . PHE B 2 81 ? 6.500 1.454 -13.269 1.00 88.11 81 B 1 +ATOM 5051 C C . PHE B 2 81 ? 6.820 0.574 -14.485 1.00 88.96 81 B 1 +ATOM 5052 O O . PHE B 2 81 ? 6.138 0.694 -15.496 1.00 88.33 81 B 1 +ATOM 5053 C CB . PHE B 2 81 ? 7.413 2.684 -13.219 1.00 88.10 81 B 1 +ATOM 5054 C CG . PHE B 2 81 ? 7.111 3.683 -12.123 1.00 87.55 81 B 1 +ATOM 5055 C CD1 . PHE B 2 81 ? 5.788 4.068 -11.833 1.00 75.93 81 B 1 +ATOM 5056 C CD2 . PHE B 2 81 ? 8.165 4.265 -11.398 1.00 75.07 81 B 1 +ATOM 5057 C CE1 . PHE B 2 81 ? 5.519 4.997 -10.819 1.00 75.31 81 B 1 +ATOM 5058 C CE2 . PHE B 2 81 ? 7.903 5.197 -10.382 1.00 74.07 81 B 1 +ATOM 5059 C CZ . PHE B 2 81 ? 6.580 5.563 -10.086 1.00 83.62 81 B 1 +ATOM 5060 N N . ILE B 2 82 ? 7.759 -0.359 -14.369 1.00 87.84 82 B 1 +ATOM 5061 C CA . ILE B 2 82 ? 8.002 -1.378 -15.401 1.00 87.64 82 B 1 +ATOM 5062 C C . ILE B 2 82 ? 6.772 -2.276 -15.573 1.00 87.77 82 B 1 +ATOM 5063 O O . ILE B 2 82 ? 6.398 -2.586 -16.700 1.00 87.27 82 B 1 +ATOM 5064 C CB . ILE B 2 82 ? 9.269 -2.202 -15.061 1.00 87.04 82 B 1 +ATOM 5065 C CG1 . ILE B 2 82 ? 10.522 -1.315 -15.278 1.00 82.76 82 B 1 +ATOM 5066 C CG2 . ILE B 2 82 ? 9.371 -3.479 -15.904 1.00 80.10 82 B 1 +ATOM 5067 C CD1 . ILE B 2 82 ? 11.825 -1.937 -14.773 1.00 72.32 82 B 1 +ATOM 5068 N N . CYS B 2 83 ? 6.104 -2.656 -14.483 1.00 88.11 83 B 1 +ATOM 5069 C CA . CYS B 2 83 ? 4.852 -3.405 -14.543 1.00 88.42 83 B 1 +ATOM 5070 C C . CYS B 2 83 ? 3.751 -2.610 -15.266 1.00 88.91 83 B 1 +ATOM 5071 O O . CYS B 2 83 ? 3.051 -3.168 -16.098 1.00 88.42 83 B 1 +ATOM 5072 C CB . CYS B 2 83 ? 4.438 -3.789 -13.115 1.00 87.89 83 B 1 +ATOM 5073 S SG . CYS B 2 83 ? 3.042 -4.940 -13.119 1.00 79.89 83 B 1 +ATOM 5074 N N . SER B 2 84 ? 3.638 -1.306 -15.008 1.00 89.01 84 B 1 +ATOM 5075 C CA . SER B 2 84 ? 2.710 -0.423 -15.727 1.00 89.16 84 B 1 +ATOM 5076 C C . SER B 2 84 ? 3.025 -0.369 -17.220 1.00 89.03 84 B 1 +ATOM 5077 O O . SER B 2 84 ? 2.105 -0.437 -18.028 1.00 88.35 84 B 1 +ATOM 5078 C CB . SER B 2 84 ? 2.761 0.988 -15.127 1.00 89.46 84 B 1 +ATOM 5079 O OG . SER B 2 84 ? 1.831 1.846 -15.744 1.00 81.57 84 B 1 +ATOM 5080 N N . LEU B 2 85 ? 4.302 -0.304 -17.598 1.00 89.16 85 B 1 +ATOM 5081 C CA . LEU B 2 85 ? 4.736 -0.338 -18.996 1.00 88.81 85 B 1 +ATOM 5082 C C . LEU B 2 85 ? 4.391 -1.677 -19.655 1.00 88.77 85 B 1 +ATOM 5083 O O . LEU B 2 85 ? 3.804 -1.687 -20.730 1.00 88.16 85 B 1 +ATOM 5084 C CB . LEU B 2 85 ? 6.241 -0.030 -19.057 1.00 88.45 85 B 1 +ATOM 5085 C CG . LEU B 2 85 ? 6.793 0.122 -20.490 1.00 85.16 85 B 1 +ATOM 5086 C CD1 . LEU B 2 85 ? 6.172 1.304 -21.228 1.00 73.90 85 B 1 +ATOM 5087 C CD2 . LEU B 2 85 ? 8.296 0.362 -20.431 1.00 74.40 85 B 1 +ATOM 5088 N N . ALA B 2 86 ? 4.643 -2.803 -18.976 1.00 89.35 86 B 1 +ATOM 5089 C CA . ALA B 2 86 ? 4.284 -4.128 -19.473 1.00 88.65 86 B 1 +ATOM 5090 C C . ALA B 2 86 ? 2.769 -4.292 -19.682 1.00 88.69 86 B 1 +ATOM 5091 O O . ALA B 2 86 ? 2.340 -4.925 -20.641 1.00 87.72 86 B 1 +ATOM 5092 C CB . ALA B 2 86 ? 4.831 -5.179 -18.496 1.00 88.63 86 B 1 +ATOM 5093 N N . VAL B 2 87 ? 1.934 -3.695 -18.810 1.00 88.74 87 B 1 +ATOM 5094 C CA . VAL B 2 87 ? 0.472 -3.696 -19.000 1.00 88.24 87 B 1 +ATOM 5095 C C . VAL B 2 87 ? 0.071 -2.833 -20.198 1.00 87.96 87 B 1 +ATOM 5096 O O . VAL B 2 87 ? -0.838 -3.214 -20.931 1.00 87.14 87 B 1 +ATOM 5097 C CB . VAL B 2 87 ? -0.259 -3.273 -17.718 1.00 87.92 87 B 1 +ATOM 5098 C CG1 . VAL B 2 87 ? -1.775 -3.184 -17.910 1.00 79.57 87 B 1 +ATOM 5099 C CG2 . VAL B 2 87 ? -0.035 -4.282 -16.588 1.00 79.22 87 B 1 +ATOM 5100 N N . ALA B 2 88 ? 0.756 -1.713 -20.451 1.00 89.24 88 B 1 +ATOM 5101 C CA . ALA B 2 88 ? 0.526 -0.904 -21.647 1.00 88.43 88 B 1 +ATOM 5102 C C . ALA B 2 88 ? 0.891 -1.668 -22.936 1.00 88.08 88 B 1 +ATOM 5103 O O . ALA B 2 88 ? 0.121 -1.661 -23.892 1.00 86.40 88 B 1 +ATOM 5104 C CB . ALA B 2 88 ? 1.300 0.408 -21.513 1.00 88.41 88 B 1 +ATOM 5105 N N . ASP B 2 89 ? 2.004 -2.417 -22.914 1.00 89.37 89 B 1 +ATOM 5106 C CA . ASP B 2 89 ? 2.419 -3.272 -24.033 1.00 87.83 89 B 1 +ATOM 5107 C C . ASP B 2 89 ? 1.445 -4.437 -24.268 1.00 86.77 89 B 1 +ATOM 5108 O O . ASP B 2 89 ? 1.123 -4.776 -25.404 1.00 84.74 89 B 1 +ATOM 5109 C CB . ASP B 2 89 ? 3.832 -3.799 -23.760 1.00 87.36 89 B 1 +ATOM 5110 C CG . ASP B 2 89 ? 4.922 -2.728 -23.866 1.00 84.89 89 B 1 +ATOM 5111 O OD1 . ASP B 2 89 ? 4.694 -1.724 -24.562 1.00 75.46 89 B 1 +ATOM 5112 O OD2 . ASP B 2 89 ? 5.995 -2.978 -23.284 1.00 76.06 89 B 1 +ATOM 5113 N N . MET B 2 90 ? 0.897 -5.015 -23.200 1.00 87.69 90 B 1 +ATOM 5114 C CA . MET B 2 90 ? -0.191 -5.987 -23.296 1.00 86.83 90 B 1 +ATOM 5115 C C . MET B 2 90 ? -1.422 -5.387 -23.974 1.00 86.40 90 B 1 +ATOM 5116 O O . MET B 2 90 ? -2.061 -6.067 -24.760 1.00 84.80 90 B 1 +ATOM 5117 C CB . MET B 2 90 ? -0.595 -6.498 -21.913 1.00 86.09 90 B 1 +ATOM 5118 C CG . MET B 2 90 ? 0.365 -7.532 -21.347 1.00 80.68 90 B 1 +ATOM 5119 S SD . MET B 2 90 ? -0.036 -8.091 -19.657 1.00 79.54 90 B 1 +ATOM 5120 C CE . MET B 2 90 ? -1.662 -8.812 -19.937 1.00 67.68 90 B 1 +ATOM 5121 N N . LEU B 2 91 ? -1.750 -4.123 -23.689 1.00 86.69 91 B 1 +ATOM 5122 C CA . LEU B 2 91 ? -2.910 -3.451 -24.270 1.00 85.35 91 B 1 +ATOM 5123 C C . LEU B 2 91 ? -2.800 -3.338 -25.793 1.00 84.56 91 B 1 +ATOM 5124 O O . LEU B 2 91 ? -3.754 -3.645 -26.495 1.00 82.90 91 B 1 +ATOM 5125 C CB . LEU B 2 91 ? -3.094 -2.072 -23.615 1.00 84.13 91 B 1 +ATOM 5126 C CG . LEU B 2 91 ? -4.575 -1.668 -23.526 1.00 78.37 91 B 1 +ATOM 5127 C CD1 . LEU B 2 91 ? -5.176 -2.112 -22.198 1.00 70.46 91 B 1 +ATOM 5128 C CD2 . LEU B 2 91 ? -4.737 -0.153 -23.633 1.00 69.66 91 B 1 +ATOM 5129 N N . VAL B 2 92 ? -1.618 -2.980 -26.314 1.00 84.71 92 B 1 +ATOM 5130 C CA . VAL B 2 92 ? -1.337 -2.989 -27.766 1.00 83.24 92 B 1 +ATOM 5131 C C . VAL B 2 92 ? -1.507 -4.388 -28.342 1.00 82.96 92 B 1 +ATOM 5132 O O . VAL B 2 92 ? -2.165 -4.572 -29.360 1.00 80.84 92 B 1 +ATOM 5133 C CB . VAL B 2 92 ? 0.094 -2.499 -28.072 1.00 81.42 92 B 1 +ATOM 5134 C CG1 . VAL B 2 92 ? 0.500 -2.710 -29.534 1.00 71.35 92 B 1 +ATOM 5135 C CG2 . VAL B 2 92 ? 0.222 -1.003 -27.804 1.00 71.13 92 B 1 +ATOM 5136 N N . SER B 2 93 ? -0.935 -5.388 -27.674 1.00 82.74 93 B 1 +ATOM 5137 C CA . SER B 2 93 ? -0.967 -6.776 -28.134 1.00 80.89 93 B 1 +ATOM 5138 C C . SER B 2 93 ? -2.392 -7.317 -28.201 1.00 81.07 93 B 1 +ATOM 5139 O O . SER B 2 93 ? -2.766 -7.952 -29.181 1.00 79.28 93 B 1 +ATOM 5140 C CB . SER B 2 93 ? -0.131 -7.652 -27.208 1.00 79.40 93 B 1 +ATOM 5141 O OG . SER B 2 93 ? 1.165 -7.115 -27.080 1.00 68.79 93 B 1 +ATOM 5142 N N . VAL B 2 94 ? -3.203 -7.034 -27.181 1.00 82.59 94 B 1 +ATOM 5143 C CA . VAL B 2 94 ? -4.614 -7.425 -27.131 1.00 81.71 94 B 1 +ATOM 5144 C C . VAL B 2 94 ? -5.429 -6.690 -28.190 1.00 81.23 94 B 1 +ATOM 5145 O O . VAL B 2 94 ? -6.249 -7.323 -28.846 1.00 80.14 94 B 1 +ATOM 5146 C CB . VAL B 2 94 ? -5.201 -7.203 -25.722 1.00 81.54 94 B 1 +ATOM 5147 C CG1 . VAL B 2 94 ? -6.716 -7.409 -25.671 1.00 73.98 94 B 1 +ATOM 5148 C CG2 . VAL B 2 94 ? -4.582 -8.186 -24.720 1.00 73.94 94 B 1 +ATOM 5149 N N . SER B 2 95 ? -5.187 -5.397 -28.395 1.00 83.09 95 B 1 +ATOM 5150 C CA . SER B 2 95 ? -5.861 -4.611 -29.427 1.00 81.36 95 B 1 +ATOM 5151 C C . SER B 2 95 ? -5.617 -5.203 -30.814 1.00 81.16 95 B 1 +ATOM 5152 O O . SER B 2 95 ? -6.569 -5.631 -31.474 1.00 79.21 95 B 1 +ATOM 5153 C CB . SER B 2 95 ? -5.398 -3.154 -29.377 1.00 80.50 95 B 1 +ATOM 5154 O OG . SER B 2 95 ? -6.077 -2.385 -30.345 1.00 68.97 95 B 1 +ATOM 5155 N N . ASN B 2 96 ? -4.358 -5.344 -31.205 1.00 79.54 96 B 1 +ATOM 5156 C CA . ASN B 2 96 ? -3.999 -5.853 -32.531 1.00 77.92 96 B 1 +ATOM 5157 C C . ASN B 2 96 ? -4.439 -7.305 -32.746 1.00 78.33 96 B 1 +ATOM 5158 O O . ASN B 2 96 ? -4.931 -7.650 -33.817 1.00 76.42 96 B 1 +ATOM 5159 C CB . ASN B 2 96 ? -2.481 -5.712 -32.715 1.00 75.46 96 B 1 +ATOM 5160 C CG . ASN B 2 96 ? -2.038 -4.260 -32.851 1.00 66.90 96 B 1 +ATOM 5161 O OD1 . ASN B 2 96 ? -2.773 -3.392 -33.268 1.00 59.32 96 B 1 +ATOM 5162 N ND2 . ASN B 2 96 ? -0.801 -3.960 -32.529 1.00 58.27 96 B 1 +ATOM 5163 N N . ALA B 2 97 ? -4.297 -8.169 -31.731 1.00 77.77 97 B 1 +ATOM 5164 C CA . ALA B 2 97 ? -4.762 -9.546 -31.832 1.00 76.74 97 B 1 +ATOM 5165 C C . ALA B 2 97 ? -6.291 -9.624 -31.973 1.00 77.88 97 B 1 +ATOM 5166 O O . ALA B 2 97 ? -6.789 -10.378 -32.808 1.00 76.89 97 B 1 +ATOM 5167 C CB . ALA B 2 97 ? -4.264 -10.337 -30.617 1.00 75.41 97 B 1 +ATOM 5168 N N . SER B 2 98 ? -7.028 -8.826 -31.197 1.00 77.43 98 B 1 +ATOM 5169 C CA . SER B 2 98 ? -8.487 -8.802 -31.240 1.00 77.29 98 B 1 +ATOM 5170 C C . SER B 2 98 ? -8.993 -8.290 -32.580 1.00 77.54 98 B 1 +ATOM 5171 O O . SER B 2 98 ? -9.866 -8.912 -33.181 1.00 76.49 98 B 1 +ATOM 5172 C CB . SER B 2 98 ? -9.070 -7.935 -30.119 1.00 76.59 98 B 1 +ATOM 5173 O OG . SER B 2 98 ? -8.640 -8.392 -28.856 1.00 68.46 98 B 1 +ATOM 5174 N N . GLU B 2 99 ? -8.402 -7.211 -33.086 1.00 77.50 99 B 1 +ATOM 5175 C CA . GLU B 2 99 ? -8.727 -6.665 -34.399 1.00 77.07 99 B 1 +ATOM 5176 C C . GLU B 2 99 ? -8.462 -7.684 -35.507 1.00 76.85 99 B 1 +ATOM 5177 O O . GLU B 2 99 ? -9.322 -7.954 -36.336 1.00 75.56 99 B 1 +ATOM 5178 C CB . GLU B 2 99 ? -7.899 -5.395 -34.611 1.00 74.89 99 B 1 +ATOM 5179 C CG . GLU B 2 99 ? -8.289 -4.694 -35.911 1.00 68.39 99 B 1 +ATOM 5180 C CD . GLU B 2 99 ? -7.508 -3.399 -36.151 1.00 65.64 99 B 1 +ATOM 5181 O OE1 . GLU B 2 99 ? -7.848 -2.722 -37.139 1.00 58.19 99 B 1 +ATOM 5182 O OE2 . GLU B 2 99 ? -6.564 -3.113 -35.385 1.00 59.67 99 B 1 +ATOM 5183 N N . THR B 2 100 ? -7.305 -8.342 -35.473 1.00 76.17 100 B 1 +ATOM 5184 C CA . THR B 2 100 ? -6.927 -9.371 -36.444 1.00 74.38 100 B 1 +ATOM 5185 C C . THR B 2 100 ? -7.913 -10.539 -36.435 1.00 74.75 100 B 1 +ATOM 5186 O O . THR B 2 100 ? -8.313 -11.018 -37.500 1.00 74.39 100 B 1 +ATOM 5187 C CB . THR B 2 100 ? -5.512 -9.888 -36.152 1.00 73.23 100 B 1 +ATOM 5188 O OG1 . THR B 2 100 ? -4.579 -8.836 -36.156 1.00 66.45 100 B 1 +ATOM 5189 C CG2 . THR B 2 100 ? -5.035 -10.866 -37.211 1.00 64.22 100 B 1 +ATOM 5190 N N . ILE B 2 101 ? -8.336 -10.995 -35.249 1.00 74.50 101 B 1 +ATOM 5191 C CA . ILE B 2 101 ? -9.332 -12.061 -35.112 1.00 74.44 101 B 1 +ATOM 5192 C C . ILE B 2 101 ? -10.683 -11.618 -35.680 1.00 74.70 101 B 1 +ATOM 5193 O O . ILE B 2 101 ? -11.307 -12.379 -36.420 1.00 75.39 101 B 1 +ATOM 5194 C CB . ILE B 2 101 ? -9.459 -12.506 -33.638 1.00 74.71 101 B 1 +ATOM 5195 C CG1 . ILE B 2 101 ? -8.184 -13.255 -33.189 1.00 70.22 101 B 1 +ATOM 5196 C CG2 . ILE B 2 101 ? -10.682 -13.412 -33.414 1.00 68.37 101 B 1 +ATOM 5197 C CD1 . ILE B 2 101 ? -8.050 -13.393 -31.668 1.00 62.44 101 B 1 +ATOM 5198 N N . VAL B 2 102 ? -11.129 -10.399 -35.370 1.00 75.50 102 B 1 +ATOM 5199 C CA . VAL B 2 102 ? -12.404 -9.871 -35.868 1.00 74.80 102 B 1 +ATOM 5200 C C . VAL B 2 102 ? -12.387 -9.751 -37.388 1.00 73.96 102 B 1 +ATOM 5201 O O . VAL B 2 102 ? -13.311 -10.242 -38.040 1.00 73.93 102 B 1 +ATOM 5202 C CB . VAL B 2 102 ? -12.750 -8.540 -35.185 1.00 74.41 102 B 1 +ATOM 5203 C CG1 . VAL B 2 102 ? -13.952 -7.853 -35.835 1.00 68.36 102 B 1 +ATOM 5204 C CG2 . VAL B 2 102 ? -13.111 -8.792 -33.714 1.00 68.57 102 B 1 +ATOM 5205 N N . ILE B 2 103 ? -11.332 -9.192 -37.969 1.00 75.18 103 B 1 +ATOM 5206 C CA . ILE B 2 103 ? -11.179 -9.081 -39.424 1.00 73.18 103 B 1 +ATOM 5207 C C . ILE B 2 103 ? -11.170 -10.469 -40.077 1.00 73.00 103 B 1 +ATOM 5208 O O . ILE B 2 103 ? -11.873 -10.694 -41.065 1.00 71.45 103 B 1 +ATOM 5209 C CB . ILE B 2 103 ? -9.921 -8.261 -39.782 1.00 71.17 103 B 1 +ATOM 5210 C CG1 . ILE B 2 103 ? -10.104 -6.787 -39.349 1.00 65.93 103 B 1 +ATOM 5211 C CG2 . ILE B 2 103 ? -9.616 -8.330 -41.286 1.00 62.82 103 B 1 +ATOM 5212 C CD1 . ILE B 2 103 ? -8.823 -5.948 -39.418 1.00 58.51 103 B 1 +ATOM 5213 N N . ALA B 2 104 ? -10.433 -11.432 -39.513 1.00 73.85 104 B 1 +ATOM 5214 C CA . ALA B 2 104 ? -10.391 -12.794 -40.029 1.00 72.76 104 B 1 +ATOM 5215 C C . ALA B 2 104 ? -11.763 -13.489 -39.965 1.00 72.65 104 B 1 +ATOM 5216 O O . ALA B 2 104 ? -12.154 -14.175 -40.913 1.00 71.77 104 B 1 +ATOM 5217 C CB . ALA B 2 104 ? -9.330 -13.584 -39.251 1.00 71.48 104 B 1 +ATOM 5218 N N . LEU B 2 105 ? -12.526 -13.288 -38.883 1.00 74.44 105 B 1 +ATOM 5219 C CA . LEU B 2 105 ? -13.871 -13.843 -38.730 1.00 73.02 105 B 1 +ATOM 5220 C C . LEU B 2 105 ? -14.873 -13.231 -39.716 1.00 72.34 105 B 1 +ATOM 5221 O O . LEU B 2 105 ? -15.716 -13.945 -40.253 1.00 72.36 105 B 1 +ATOM 5222 C CB . LEU B 2 105 ? -14.353 -13.633 -37.285 1.00 73.25 105 B 1 +ATOM 5223 C CG . LEU B 2 105 ? -13.705 -14.567 -36.245 1.00 69.38 105 B 1 +ATOM 5224 C CD1 . LEU B 2 105 ? -14.097 -14.105 -34.849 1.00 63.99 105 B 1 +ATOM 5225 C CD2 . LEU B 2 105 ? -14.155 -16.011 -36.411 1.00 64.89 105 B 1 +ATOM 5226 N N . ILE B 2 106 ? -14.766 -11.925 -39.987 1.00 73.20 106 B 1 +ATOM 5227 C CA . ILE B 2 106 ? -15.619 -11.243 -40.973 1.00 71.70 106 B 1 +ATOM 5228 C C . ILE B 2 106 ? -15.277 -11.705 -42.386 1.00 70.81 106 B 1 +ATOM 5229 O O . ILE B 2 106 ? -16.162 -12.098 -43.132 1.00 68.64 106 B 1 +ATOM 5230 C CB . ILE B 2 106 ? -15.508 -9.712 -40.823 1.00 70.78 106 B 1 +ATOM 5231 C CG1 . ILE B 2 106 ? -16.048 -9.233 -39.463 1.00 67.12 106 B 1 +ATOM 5232 C CG2 . ILE B 2 106 ? -16.309 -9.026 -41.945 1.00 66.05 106 B 1 +ATOM 5233 C CD1 . ILE B 2 106 ? -15.586 -7.809 -39.096 1.00 62.10 106 B 1 +ATOM 5234 N N . ASN B 2 107 ? -13.983 -11.726 -42.725 1.00 74.12 107 B 1 +ATOM 5235 C CA . ASN B 2 107 ? -13.530 -12.164 -44.047 1.00 71.27 107 B 1 +ATOM 5236 C C . ASN B 2 107 ? -13.803 -13.651 -44.299 1.00 69.07 107 B 1 +ATOM 5237 O O . ASN B 2 107 ? -14.101 -14.045 -45.419 1.00 64.94 107 B 1 +ATOM 5238 C CB . ASN B 2 107 ? -12.023 -11.865 -44.192 1.00 68.97 107 B 1 +ATOM 5239 C CG . ASN B 2 107 ? -11.735 -10.383 -44.360 1.00 64.75 107 B 1 +ATOM 5240 O OD1 . ASN B 2 107 ? -12.577 -9.574 -44.683 1.00 59.02 107 B 1 +ATOM 5241 N ND2 . ASN B 2 107 ? -10.487 -9.990 -44.184 1.00 59.16 107 B 1 +ATOM 5242 N N . GLY B 2 108 ? -13.751 -14.475 -43.244 1.00 70.15 108 B 1 +ATOM 5243 C CA . GLY B 2 108 ? -14.126 -15.889 -43.284 1.00 67.80 108 B 1 +ATOM 5244 C C . GLY B 2 108 ? -15.639 -16.147 -43.382 1.00 66.77 108 B 1 +ATOM 5245 O O . GLY B 2 108 ? -16.044 -17.299 -43.457 1.00 61.00 108 B 1 +ATOM 5246 N N . GLY B 2 109 ? -16.460 -15.097 -43.331 1.00 66.34 109 B 1 +ATOM 5247 C CA . GLY B 2 109 ? -17.918 -15.189 -43.374 1.00 64.50 109 B 1 +ATOM 5248 C C . GLY B 2 109 ? -18.565 -15.791 -42.123 1.00 63.92 109 B 1 +ATOM 5249 O O . GLY B 2 109 ? -19.775 -15.992 -42.087 1.00 58.20 109 B 1 +ATOM 5250 N N . SER B 2 110 ? -17.779 -16.069 -41.087 1.00 62.43 110 B 1 +ATOM 5251 C CA . SER B 2 110 ? -18.261 -16.673 -39.840 1.00 62.77 110 B 1 +ATOM 5252 C C . SER B 2 110 ? -18.969 -15.666 -38.931 1.00 62.70 110 B 1 +ATOM 5253 O O . SER B 2 110 ? -19.770 -16.057 -38.085 1.00 58.70 110 B 1 +ATOM 5254 C CB . SER B 2 110 ? -17.084 -17.282 -39.068 1.00 59.47 110 B 1 +ATOM 5255 O OG . SER B 2 110 ? -16.358 -18.168 -39.885 1.00 55.18 110 B 1 +ATOM 5256 N N . LEU B 2 111 ? -18.671 -14.383 -39.105 1.00 61.69 111 B 1 +ATOM 5257 C CA . LEU B 2 111 ? -19.223 -13.315 -38.296 1.00 62.69 111 B 1 +ATOM 5258 C C . LEU B 2 111 ? -19.784 -12.219 -39.214 1.00 63.65 111 B 1 +ATOM 5259 O O . LEU B 2 111 ? -19.038 -11.496 -39.870 1.00 60.12 111 B 1 +ATOM 5260 C CB . LEU B 2 111 ? -18.132 -12.798 -37.334 1.00 58.80 111 B 1 +ATOM 5261 C CG . LEU B 2 111 ? -18.708 -12.302 -36.004 1.00 54.10 111 B 1 +ATOM 5262 C CD1 . LEU B 2 111 ? -18.945 -13.457 -35.040 1.00 51.01 111 B 1 +ATOM 5263 C CD2 . LEU B 2 111 ? -17.732 -11.336 -35.333 1.00 51.61 111 B 1 +ATOM 5264 N N . THR B 2 112 ? -21.109 -12.084 -39.230 1.00 64.35 112 B 1 +ATOM 5265 C CA . THR B 2 112 ? -21.785 -10.986 -39.926 1.00 64.82 112 B 1 +ATOM 5266 C C . THR B 2 112 ? -22.042 -9.858 -38.932 1.00 64.37 112 B 1 +ATOM 5267 O O . THR B 2 112 ? -22.999 -9.919 -38.155 1.00 60.64 112 B 1 +ATOM 5268 C CB . THR B 2 112 ? -23.084 -11.458 -40.599 1.00 60.90 112 B 1 +ATOM 5269 O OG1 . THR B 2 112 ? -23.835 -12.270 -39.738 1.00 54.71 112 B 1 +ATOM 5270 C CG2 . THR B 2 112 ? -22.794 -12.265 -41.862 1.00 52.30 112 B 1 +ATOM 5271 N N . ILE B 2 113 ? -21.191 -8.841 -38.973 1.00 64.33 113 B 1 +ATOM 5272 C CA . ILE B 2 113 ? -21.327 -7.657 -38.116 1.00 65.06 113 B 1 +ATOM 5273 C C . ILE B 2 113 ? -21.821 -6.485 -38.980 1.00 66.46 113 B 1 +ATOM 5274 O O . ILE B 2 113 ? -21.293 -6.278 -40.077 1.00 63.72 113 B 1 +ATOM 5275 C CB . ILE B 2 113 ? -20.005 -7.342 -37.383 1.00 60.80 113 B 1 +ATOM 5276 C CG1 . ILE B 2 113 ? -19.484 -8.578 -36.622 1.00 55.88 113 B 1 +ATOM 5277 C CG2 . ILE B 2 113 ? -20.232 -6.188 -36.396 1.00 53.99 113 B 1 +ATOM 5278 C CD1 . ILE B 2 113 ? -18.175 -8.328 -35.855 1.00 50.59 113 B 1 +ATOM 5279 N N . PRO B 2 114 ? -22.811 -5.706 -38.526 1.00 67.63 114 B 1 +ATOM 5280 C CA . PRO B 2 114 ? -23.247 -4.530 -39.260 1.00 68.23 114 B 1 +ATOM 5281 C C . PRO B 2 114 ? -22.117 -3.496 -39.361 1.00 68.80 114 B 1 +ATOM 5282 O O . PRO B 2 114 ? -21.335 -3.321 -38.431 1.00 66.57 114 B 1 +ATOM 5283 C CB . PRO B 2 114 ? -24.471 -4.002 -38.503 1.00 65.25 114 B 1 +ATOM 5284 C CG . PRO B 2 114 ? -24.285 -4.538 -37.079 1.00 63.04 114 B 1 +ATOM 5285 C CD . PRO B 2 114 ? -23.551 -5.863 -37.289 1.00 65.67 114 B 1 +ATOM 5286 N N . VAL B 2 115 ? -22.067 -2.754 -40.474 1.00 69.41 115 B 1 +ATOM 5287 C CA . VAL B 2 115 ? -20.989 -1.792 -40.773 1.00 69.88 115 B 1 +ATOM 5288 C C . VAL B 2 115 ? -20.810 -0.744 -39.674 1.00 70.43 115 B 1 +ATOM 5289 O O . VAL B 2 115 ? -19.686 -0.358 -39.349 1.00 67.57 115 B 1 +ATOM 5290 C CB . VAL B 2 115 ? -21.255 -1.095 -42.127 1.00 67.07 115 B 1 +ATOM 5291 C CG1 . VAL B 2 115 ? -20.155 -0.095 -42.503 1.00 59.54 115 B 1 +ATOM 5292 C CG2 . VAL B 2 115 ? -21.353 -2.115 -43.267 1.00 58.53 115 B 1 +ATOM 5293 N N . THR B 2 116 ? -21.906 -0.319 -39.037 1.00 70.50 116 B 1 +ATOM 5294 C CA . THR B 2 116 ? -21.873 0.606 -37.898 1.00 70.62 116 B 1 +ATOM 5295 C C . THR B 2 116 ? -21.103 0.023 -36.710 1.00 71.78 116 B 1 +ATOM 5296 O O . THR B 2 116 ? -20.345 0.740 -36.070 1.00 69.33 116 B 1 +ATOM 5297 C CB . THR B 2 116 ? -23.296 0.938 -37.435 1.00 67.82 116 B 1 +ATOM 5298 O OG1 . THR B 2 116 ? -24.065 -0.245 -37.323 1.00 61.40 116 B 1 +ATOM 5299 C CG2 . THR B 2 116 ? -24.012 1.836 -38.441 1.00 58.03 116 B 1 +ATOM 5300 N N . PHE B 2 117 ? -21.243 -1.282 -36.454 1.00 71.62 117 B 1 +ATOM 5301 C CA . PHE B 2 117 ? -20.546 -1.974 -35.385 1.00 71.61 117 B 1 +ATOM 5302 C C . PHE B 2 117 ? -19.063 -2.158 -35.702 1.00 72.50 117 B 1 +ATOM 5303 O O . PHE B 2 117 ? -18.232 -1.982 -34.824 1.00 71.78 117 B 1 +ATOM 5304 C CB . PHE B 2 117 ? -21.230 -3.314 -35.152 1.00 69.21 117 B 1 +ATOM 5305 C CG . PHE B 2 117 ? -20.825 -3.993 -33.886 1.00 63.10 117 B 1 +ATOM 5306 C CD1 . PHE B 2 117 ? -19.674 -4.807 -33.835 1.00 56.15 117 B 1 +ATOM 5307 C CD2 . PHE B 2 117 ? -21.642 -3.870 -32.744 1.00 55.47 117 B 1 +ATOM 5308 C CE1 . PHE B 2 117 ? -19.369 -5.535 -32.675 1.00 49.55 117 B 1 +ATOM 5309 C CE2 . PHE B 2 117 ? -21.347 -4.608 -31.584 1.00 49.32 117 B 1 +ATOM 5310 C CZ . PHE B 2 117 ? -20.224 -5.449 -31.565 1.00 48.98 117 B 1 +ATOM 5311 N N . ILE B 2 118 ? -18.726 -2.419 -36.969 1.00 70.33 118 B 1 +ATOM 5312 C CA . ILE B 2 118 ? -17.325 -2.474 -37.424 1.00 70.12 118 B 1 +ATOM 5313 C C . ILE B 2 118 ? -16.644 -1.136 -37.179 1.00 71.43 118 B 1 +ATOM 5314 O O . ILE B 2 118 ? -15.577 -1.102 -36.587 1.00 70.49 118 B 1 +ATOM 5315 C CB . ILE B 2 118 ? -17.239 -2.905 -38.903 1.00 68.40 118 B 1 +ATOM 5316 C CG1 . ILE B 2 118 ? -17.841 -4.307 -39.109 1.00 63.58 118 B 1 +ATOM 5317 C CG2 . ILE B 2 118 ? -15.772 -2.894 -39.368 1.00 61.12 118 B 1 +ATOM 5318 C CD1 . ILE B 2 118 ? -18.021 -4.695 -40.584 1.00 56.58 118 B 1 +ATOM 5319 N N . LYS B 2 119 ? -17.291 -0.021 -37.542 1.00 72.70 119 B 1 +ATOM 5320 C CA . LYS B 2 119 ? -16.760 1.327 -37.301 1.00 72.80 119 B 1 +ATOM 5321 C C . LYS B 2 119 ? -16.601 1.621 -35.800 1.00 73.74 119 B 1 +ATOM 5322 O O . LYS B 2 119 ? -15.624 2.250 -35.409 1.00 72.81 119 B 1 +ATOM 5323 C CB . LYS B 2 119 ? -17.659 2.360 -37.993 1.00 71.39 119 B 1 +ATOM 5324 C CG . LYS B 2 119 ? -16.962 3.736 -38.102 1.00 63.13 119 B 1 +ATOM 5325 C CD . LYS B 2 119 ? -17.863 4.790 -38.746 1.00 57.05 119 B 1 +ATOM 5326 C CE . LYS B 2 119 ? -17.084 6.115 -38.819 1.00 50.49 119 B 1 +ATOM 5327 N NZ . LYS B 2 119 ? -17.925 7.290 -39.174 1.00 44.44 119 B 1 +ATOM 5328 N N . SER B 2 120 ? -17.520 1.150 -34.954 1.00 72.70 120 B 1 +ATOM 5329 C CA . SER B 2 120 ? -17.401 1.278 -33.498 1.00 72.66 120 B 1 +ATOM 5330 C C . SER B 2 120 ? -16.235 0.447 -32.951 1.00 74.34 120 B 1 +ATOM 5331 O O . SER B 2 120 ? -15.497 0.941 -32.110 1.00 73.13 120 B 1 +ATOM 5332 C CB . SER B 2 120 ? -18.690 0.871 -32.793 1.00 70.44 120 B 1 +ATOM 5333 O OG . SER B 2 120 ? -19.753 1.710 -33.179 1.00 61.84 120 B 1 +ATOM 5334 N N . MET B 2 121 ? -16.044 -0.786 -33.450 1.00 73.23 121 B 1 +ATOM 5335 C CA . MET B 2 121 ? -14.891 -1.610 -33.065 1.00 72.59 121 B 1 +ATOM 5336 C C . MET B 2 121 ? -13.569 -0.970 -33.488 1.00 73.81 121 B 1 +ATOM 5337 O O . MET B 2 121 ? -12.646 -0.938 -32.684 1.00 73.49 121 B 1 +ATOM 5338 C CB . MET B 2 121 ? -14.992 -3.013 -33.671 1.00 71.02 121 B 1 +ATOM 5339 C CG . MET B 2 121 ? -15.979 -3.886 -32.914 1.00 64.37 121 B 1 +ATOM 5340 S SD . MET B 2 121 ? -15.656 -5.674 -33.055 1.00 58.47 121 B 1 +ATOM 5341 C CE . MET B 2 121 ? -14.181 -5.792 -32.017 1.00 51.60 121 B 1 +ATOM 5342 N N . ASP B 2 122 ? -13.500 -0.431 -34.693 1.00 76.42 122 B 1 +ATOM 5343 C CA . ASP B 2 122 ? -12.323 0.266 -35.218 1.00 76.04 122 B 1 +ATOM 5344 C C . ASP B 2 122 ? -11.937 1.444 -34.308 1.00 77.17 122 B 1 +ATOM 5345 O O . ASP B 2 122 ? -10.807 1.520 -33.822 1.00 75.80 122 B 1 +ATOM 5346 C CB . ASP B 2 122 ? -12.661 0.711 -36.652 1.00 73.68 122 B 1 +ATOM 5347 C CG . ASP B 2 122 ? -11.457 0.856 -37.575 1.00 66.77 122 B 1 +ATOM 5348 O OD1 . ASP B 2 122 ? -10.530 0.024 -37.468 1.00 58.61 122 B 1 +ATOM 5349 O OD2 . ASP B 2 122 ? -11.531 1.715 -38.482 1.00 58.37 122 B 1 +ATOM 5350 N N . ASN B 2 123 ? -12.905 2.264 -33.907 1.00 77.65 123 B 1 +ATOM 5351 C CA . ASN B 2 123 ? -12.682 3.350 -32.947 1.00 77.49 123 B 1 +ATOM 5352 C C . ASN B 2 123 ? -12.210 2.838 -31.577 1.00 78.02 123 B 1 +ATOM 5353 O O . ASN B 2 123 ? -11.446 3.523 -30.894 1.00 77.30 123 B 1 +ATOM 5354 C CB . ASN B 2 123 ? -13.983 4.145 -32.764 1.00 76.59 123 B 1 +ATOM 5355 C CG . ASN B 2 123 ? -14.398 4.975 -33.966 1.00 72.88 123 B 1 +ATOM 5356 O OD1 . ASN B 2 123 ? -13.686 5.217 -34.912 1.00 65.43 123 B 1 +ATOM 5357 N ND2 . ASN B 2 123 ? -15.606 5.501 -33.921 1.00 65.35 123 B 1 +ATOM 5358 N N . VAL B 2 124 ? -12.650 1.653 -31.137 1.00 77.91 124 B 1 +ATOM 5359 C CA . VAL B 2 124 ? -12.194 1.046 -29.880 1.00 77.87 124 B 1 +ATOM 5360 C C . VAL B 2 124 ? -10.753 0.588 -29.987 1.00 78.12 124 B 1 +ATOM 5361 O O . VAL B 2 124 ? -9.976 0.853 -29.079 1.00 78.25 124 B 1 +ATOM 5362 C CB . VAL B 2 124 ? -13.092 -0.114 -29.435 1.00 77.34 124 B 1 +ATOM 5363 C CG1 . VAL B 2 124 ? -12.559 -0.829 -28.180 1.00 70.42 124 B 1 +ATOM 5364 C CG2 . VAL B 2 124 ? -14.489 0.404 -29.114 1.00 70.43 124 B 1 +ATOM 5365 N N . PHE B 2 125 ? -10.381 -0.066 -31.098 1.00 78.13 125 B 1 +ATOM 5366 C CA . PHE B 2 125 ? -9.004 -0.494 -31.320 1.00 78.10 125 B 1 +ATOM 5367 C C . PHE B 2 125 ? -8.057 0.697 -31.433 1.00 78.26 125 B 1 +ATOM 5368 O O . PHE B 2 125 ? -7.037 0.732 -30.740 1.00 77.46 125 B 1 +ATOM 5369 C CB . PHE B 2 125 ? -8.932 -1.397 -32.548 1.00 77.63 125 B 1 +ATOM 5370 C CG . PHE B 2 125 ? -9.715 -2.695 -32.435 1.00 72.99 125 B 1 +ATOM 5371 C CD1 . PHE B 2 125 ? -9.611 -3.490 -31.274 1.00 66.24 125 B 1 +ATOM 5372 C CD2 . PHE B 2 125 ? -10.519 -3.125 -33.501 1.00 65.94 125 B 1 +ATOM 5373 C CE1 . PHE B 2 125 ? -10.319 -4.698 -31.184 1.00 62.59 125 B 1 +ATOM 5374 C CE2 . PHE B 2 125 ? -11.219 -4.333 -33.413 1.00 61.31 125 B 1 +ATOM 5375 C CZ . PHE B 2 125 ? -11.128 -5.126 -32.252 1.00 63.74 125 B 1 +ATOM 5376 N N . ASP B 2 126 ? -8.450 1.734 -32.162 1.00 79.34 126 B 1 +ATOM 5377 C CA . ASP B 2 126 ? -7.711 2.993 -32.232 1.00 78.24 126 B 1 +ATOM 5378 C C . ASP B 2 126 ? -7.540 3.631 -30.857 1.00 78.61 126 B 1 +ATOM 5379 O O . ASP B 2 126 ? -6.444 4.039 -30.468 1.00 77.64 126 B 1 +ATOM 5380 C CB . ASP B 2 126 ? -8.468 3.972 -33.148 1.00 75.91 126 B 1 +ATOM 5381 C CG . ASP B 2 126 ? -8.303 3.687 -34.640 1.00 71.43 126 B 1 +ATOM 5382 O OD1 . ASP B 2 126 ? -7.411 2.890 -34.987 1.00 65.02 126 B 1 +ATOM 5383 O OD2 . ASP B 2 126 ? -8.991 4.383 -35.420 1.00 64.38 126 B 1 +ATOM 5384 N N . SER B 2 127 ? -8.609 3.663 -30.064 1.00 79.96 127 B 1 +ATOM 5385 C CA . SER B 2 127 ? -8.563 4.171 -28.693 1.00 79.71 127 B 1 +ATOM 5386 C C . SER B 2 127 ? -7.643 3.346 -27.792 1.00 80.76 127 B 1 +ATOM 5387 O O . SER B 2 127 ? -6.914 3.915 -26.984 1.00 80.07 127 B 1 +ATOM 5388 C CB . SER B 2 127 ? -9.964 4.205 -28.099 1.00 78.70 127 B 1 +ATOM 5389 O OG . SER B 2 127 ? -9.894 4.615 -26.751 1.00 67.91 127 B 1 +ATOM 5390 N N . MET B 2 128 ? -7.630 2.011 -27.929 1.00 79.91 128 B 1 +ATOM 5391 C CA . MET B 2 128 ? -6.734 1.134 -27.176 1.00 80.46 128 B 1 +ATOM 5392 C C . MET B 2 128 ? -5.272 1.387 -27.543 1.00 81.02 128 B 1 +ATOM 5393 O O . MET B 2 128 ? -4.442 1.483 -26.636 1.00 81.28 128 B 1 +ATOM 5394 C CB . MET B 2 128 ? -7.097 -0.333 -27.401 1.00 80.54 128 B 1 +ATOM 5395 C CG . MET B 2 128 ? -8.358 -0.754 -26.650 1.00 75.61 128 B 1 +ATOM 5396 S SD . MET B 2 128 ? -8.829 -2.490 -26.888 1.00 70.91 128 B 1 +ATOM 5397 C CE . MET B 2 128 ? -7.510 -3.324 -25.988 1.00 60.76 128 B 1 +ATOM 5398 N N . ILE B 2 129 ? -4.954 1.552 -28.815 1.00 81.16 129 B 1 +ATOM 5399 C CA . ILE B 2 129 ? -3.604 1.876 -29.279 1.00 81.07 129 B 1 +ATOM 5400 C C . ILE B 2 129 ? -3.169 3.243 -28.742 1.00 81.37 129 B 1 +ATOM 5401 O O . ILE B 2 129 ? -2.087 3.374 -28.160 1.00 80.96 129 B 1 +ATOM 5402 C CB . ILE B 2 129 ? -3.511 1.797 -30.819 1.00 79.91 129 B 1 +ATOM 5403 C CG1 . ILE B 2 129 ? -3.708 0.348 -31.299 1.00 73.50 129 B 1 +ATOM 5404 C CG2 . ILE B 2 129 ? -2.143 2.316 -31.307 1.00 70.51 129 B 1 +ATOM 5405 C CD1 . ILE B 2 129 ? -3.928 0.222 -32.813 1.00 63.99 129 B 1 +ATOM 5406 N N . CYS B 2 130 ? -4.023 4.261 -28.845 1.00 81.02 130 B 1 +ATOM 5407 C CA . CYS B 2 130 ? -3.746 5.593 -28.321 1.00 80.63 130 B 1 +ATOM 5408 C C . CYS B 2 130 ? -3.605 5.610 -26.790 1.00 82.22 130 B 1 +ATOM 5409 O O . CYS B 2 130 ? -2.726 6.284 -26.259 1.00 81.64 130 B 1 +ATOM 5410 C CB . CYS B 2 130 ? -4.853 6.548 -28.785 1.00 78.02 130 B 1 +ATOM 5411 S SG . CYS B 2 130 ? -4.704 6.842 -30.571 1.00 66.31 130 B 1 +ATOM 5412 N N . SER B 2 131 ? -4.434 4.850 -26.079 1.00 82.38 131 B 1 +ATOM 5413 C CA . SER B 2 131 ? -4.345 4.716 -24.627 1.00 82.95 131 B 1 +ATOM 5414 C C . SER B 2 131 ? -3.068 4.000 -24.202 1.00 84.10 131 B 1 +ATOM 5415 O O . SER B 2 131 ? -2.421 4.423 -23.250 1.00 83.42 131 B 1 +ATOM 5416 C CB . SER B 2 131 ? -5.554 3.958 -24.069 1.00 82.45 131 B 1 +ATOM 5417 O OG . SER B 2 131 ? -6.740 4.637 -24.387 1.00 72.07 131 B 1 +ATOM 5418 N N . SER B 2 132 ? -2.676 2.949 -24.924 1.00 83.50 132 B 1 +ATOM 5419 C CA . SER B 2 132 ? -1.418 2.248 -24.687 1.00 83.66 132 B 1 +ATOM 5420 C C . SER B 2 132 ? -0.216 3.162 -24.910 1.00 84.50 132 B 1 +ATOM 5421 O O . SER B 2 132 ? 0.667 3.225 -24.065 1.00 84.29 132 B 1 +ATOM 5422 C CB . SER B 2 132 ? -1.297 1.027 -25.577 1.00 83.27 132 B 1 +ATOM 5423 O OG . SER B 2 132 ? -0.056 0.420 -25.302 1.00 71.68 132 B 1 +ATOM 5424 N N . LEU B 2 133 ? -0.227 3.948 -25.988 1.00 83.75 133 B 1 +ATOM 5425 C CA . LEU B 2 133 ? 0.815 4.923 -26.279 1.00 83.24 133 B 1 +ATOM 5426 C C . LEU B 2 133 ? 0.980 5.937 -25.150 1.00 84.35 133 B 1 +ATOM 5427 O O . LEU B 2 133 ? 2.093 6.176 -24.681 1.00 84.12 133 B 1 +ATOM 5428 C CB . LEU B 2 133 ? 0.417 5.609 -27.588 1.00 81.60 133 B 1 +ATOM 5429 C CG . LEU B 2 133 ? 1.341 6.748 -28.007 1.00 77.84 133 B 1 +ATOM 5430 C CD1 . LEU B 2 133 ? 2.684 6.229 -28.492 1.00 69.17 133 B 1 +ATOM 5431 C CD2 . LEU B 2 133 ? 0.645 7.514 -29.128 1.00 70.00 133 B 1 +ATOM 5432 N N . LEU B 2 134 ? -0.130 6.508 -24.669 1.00 83.67 134 B 1 +ATOM 5433 C CA . LEU B 2 134 ? -0.134 7.432 -23.533 1.00 84.02 134 B 1 +ATOM 5434 C C . LEU B 2 134 ? 0.337 6.747 -22.246 1.00 85.22 134 B 1 +ATOM 5435 O O . LEU B 2 134 ? 1.148 7.320 -21.520 1.00 85.08 134 B 1 +ATOM 5436 C CB . LEU B 2 134 ? -1.551 8.006 -23.359 1.00 82.55 134 B 1 +ATOM 5437 C CG . LEU B 2 134 ? -1.805 9.251 -24.213 1.00 75.58 134 B 1 +ATOM 5438 C CD1 . LEU B 2 134 ? -3.306 9.496 -24.330 1.00 67.59 134 B 1 +ATOM 5439 C CD2 . LEU B 2 134 ? -1.177 10.491 -23.572 1.00 66.71 134 B 1 +ATOM 5440 N N . ALA B 2 135 ? -0.120 5.520 -21.977 1.00 86.29 135 B 1 +ATOM 5441 C CA . ALA B 2 135 ? 0.290 4.771 -20.797 1.00 87.02 135 B 1 +ATOM 5442 C C . ALA B 2 135 ? 1.784 4.410 -20.837 1.00 87.79 135 B 1 +ATOM 5443 O O . ALA B 2 135 ? 2.476 4.558 -19.825 1.00 86.77 135 B 1 +ATOM 5444 C CB . ALA B 2 135 ? -0.595 3.525 -20.660 1.00 87.20 135 B 1 +ATOM 5445 N N . SER B 2 136 ? 2.300 4.015 -21.996 1.00 87.07 136 B 1 +ATOM 5446 C CA . SER B 2 136 ? 3.717 3.729 -22.214 1.00 86.41 136 B 1 +ATOM 5447 C C . SER B 2 136 ? 4.572 4.966 -21.987 1.00 86.67 136 B 1 +ATOM 5448 O O . SER B 2 136 ? 5.519 4.932 -21.209 1.00 86.20 136 B 1 +ATOM 5449 C CB . SER B 2 136 ? 3.953 3.184 -23.618 1.00 86.17 136 B 1 +ATOM 5450 O OG . SER B 2 136 ? 3.339 1.919 -23.761 1.00 74.84 136 B 1 +ATOM 5451 N N . ILE B 2 137 ? 4.208 6.100 -22.600 1.00 85.98 137 B 1 +ATOM 5452 C CA . ILE B 2 137 ? 5.000 7.321 -22.454 1.00 85.36 137 B 1 +ATOM 5453 C C . ILE B 2 137 ? 4.949 7.880 -21.030 1.00 86.20 137 B 1 +ATOM 5454 O O . ILE B 2 137 ? 5.968 8.308 -20.500 1.00 86.16 137 B 1 +ATOM 5455 C CB . ILE B 2 137 ? 4.630 8.354 -23.546 1.00 83.69 137 B 1 +ATOM 5456 C CG1 . ILE B 2 137 ? 5.888 9.207 -23.831 1.00 72.57 137 B 1 +ATOM 5457 C CG2 . ILE B 2 137 ? 3.432 9.235 -23.178 1.00 69.54 137 B 1 +ATOM 5458 C CD1 . ILE B 2 137 ? 5.768 10.057 -25.084 1.00 62.86 137 B 1 +ATOM 5459 N N . CYS B 2 138 ? 3.792 7.826 -20.378 1.00 86.52 138 B 1 +ATOM 5460 C CA . CYS B 2 138 ? 3.656 8.223 -18.981 1.00 86.81 138 B 1 +ATOM 5461 C C . CYS B 2 138 ? 4.426 7.289 -18.032 1.00 87.12 138 B 1 +ATOM 5462 O O . CYS B 2 138 ? 5.049 7.760 -17.086 1.00 86.86 138 B 1 +ATOM 5463 C CB . CYS B 2 138 ? 2.178 8.289 -18.603 1.00 86.33 138 B 1 +ATOM 5464 S SG . CYS B 2 138 ? 1.351 9.677 -19.432 1.00 79.56 138 B 1 +ATOM 5465 N N . SER B 2 139 ? 4.439 5.984 -18.307 1.00 88.00 139 B 1 +ATOM 5466 C CA . SER B 2 139 ? 5.197 5.007 -17.518 1.00 87.89 139 B 1 +ATOM 5467 C C . SER B 2 139 ? 6.707 5.195 -17.698 1.00 87.70 139 B 1 +ATOM 5468 O O . SER B 2 139 ? 7.444 5.203 -16.709 1.00 87.06 139 B 1 +ATOM 5469 C CB . SER B 2 139 ? 4.788 3.578 -17.877 1.00 88.40 139 B 1 +ATOM 5470 O OG . SER B 2 139 ? 3.412 3.404 -17.624 1.00 79.47 139 B 1 +ATOM 5471 N N . LEU B 2 140 ? 7.167 5.440 -18.920 1.00 86.69 140 B 1 +ATOM 5472 C CA . LEU B 2 140 ? 8.563 5.791 -19.199 1.00 85.92 140 B 1 +ATOM 5473 C C . LEU B 2 140 ? 8.963 7.107 -18.523 1.00 85.89 140 B 1 +ATOM 5474 O O . LEU B 2 140 ? 10.060 7.202 -17.978 1.00 85.94 140 B 1 +ATOM 5475 C CB . LEU B 2 140 ? 8.785 5.881 -20.711 1.00 86.01 140 B 1 +ATOM 5476 C CG . LEU B 2 140 ? 8.836 4.526 -21.429 1.00 83.02 140 B 1 +ATOM 5477 C CD1 . LEU B 2 140 ? 8.805 4.745 -22.941 1.00 73.41 140 B 1 +ATOM 5478 C CD2 . LEU B 2 140 ? 10.107 3.749 -21.104 1.00 74.17 140 B 1 +ATOM 5479 N N . LEU B 2 141 ? 8.075 8.104 -18.485 1.00 86.78 141 B 1 +ATOM 5480 C CA . LEU B 2 141 ? 8.297 9.357 -17.772 1.00 86.20 141 B 1 +ATOM 5481 C C . LEU B 2 141 ? 8.406 9.120 -16.258 1.00 86.42 141 B 1 +ATOM 5482 O O . LEU B 2 141 ? 9.305 9.666 -15.626 1.00 85.98 141 B 1 +ATOM 5483 C CB . LEU B 2 141 ? 7.186 10.353 -18.120 1.00 86.11 141 B 1 +ATOM 5484 C CG . LEU B 2 141 ? 7.419 11.768 -17.535 1.00 81.52 141 B 1 +ATOM 5485 C CD1 . LEU B 2 141 ? 8.584 12.480 -18.210 1.00 71.45 141 B 1 +ATOM 5486 C CD2 . LEU B 2 141 ? 6.175 12.628 -17.727 1.00 71.67 141 B 1 +ATOM 5487 N N . ALA B 2 142 ? 7.547 8.275 -15.697 1.00 86.91 142 B 1 +ATOM 5488 C CA . ALA B 2 142 ? 7.619 7.905 -14.290 1.00 86.98 142 B 1 +ATOM 5489 C C . ALA B 2 142 ? 8.943 7.192 -13.953 1.00 86.65 142 B 1 +ATOM 5490 O O . ALA B 2 142 ? 9.584 7.533 -12.959 1.00 85.76 142 B 1 +ATOM 5491 C CB . ALA B 2 142 ? 6.398 7.052 -13.937 1.00 87.36 142 B 1 +ATOM 5492 N N . ILE B 2 143 ? 9.403 6.276 -14.813 1.00 87.15 143 B 1 +ATOM 5493 C CA . ILE B 2 143 ? 10.717 5.632 -14.671 1.00 85.84 143 B 1 +ATOM 5494 C C . ILE B 2 143 ? 11.840 6.672 -14.769 1.00 85.29 143 B 1 +ATOM 5495 O O . ILE B 2 143 ? 12.778 6.625 -13.985 1.00 84.47 143 B 1 +ATOM 5496 C CB . ILE B 2 143 ? 10.911 4.500 -15.723 1.00 85.93 143 B 1 +ATOM 5497 C CG1 . ILE B 2 143 ? 9.907 3.352 -15.499 1.00 82.91 143 B 1 +ATOM 5498 C CG2 . ILE B 2 143 ? 12.337 3.925 -15.654 1.00 81.07 143 B 1 +ATOM 5499 C CD1 . ILE B 2 143 ? 9.784 2.389 -16.698 1.00 76.36 143 B 1 +ATOM 5500 N N . ALA B 2 144 ? 11.736 7.627 -15.687 1.00 85.52 144 B 1 +ATOM 5501 C CA . ALA B 2 144 ? 12.729 8.692 -15.841 1.00 83.31 144 B 1 +ATOM 5502 C C . ALA B 2 144 ? 12.809 9.579 -14.593 1.00 82.96 144 B 1 +ATOM 5503 O O . ALA B 2 144 ? 13.906 9.844 -14.106 1.00 82.50 144 B 1 +ATOM 5504 C CB . ALA B 2 144 ? 12.425 9.509 -17.099 1.00 82.90 144 B 1 +ATOM 5505 N N . ILE B 2 145 ? 11.661 9.970 -14.032 1.00 84.74 145 B 1 +ATOM 5506 C CA . ILE B 2 145 ? 11.586 10.749 -12.796 1.00 84.07 145 B 1 +ATOM 5507 C C . ILE B 2 145 ? 12.153 9.949 -11.623 1.00 83.23 145 B 1 +ATOM 5508 O O . ILE B 2 145 ? 12.982 10.469 -10.878 1.00 82.01 145 B 1 +ATOM 5509 C CB . ILE B 2 145 ? 10.135 11.214 -12.536 1.00 84.37 145 B 1 +ATOM 5510 C CG1 . ILE B 2 145 ? 9.694 12.234 -13.612 1.00 80.67 145 B 1 +ATOM 5511 C CG2 . ILE B 2 145 ? 9.994 11.845 -11.141 1.00 79.03 145 B 1 +ATOM 5512 C CD1 . ILE B 2 145 ? 8.183 12.498 -13.636 1.00 71.80 145 B 1 +ATOM 5513 N N . ASP B 2 146 ? 11.785 8.670 -11.493 1.00 84.51 146 B 1 +ATOM 5514 C CA . ASP B 2 146 ? 12.309 7.776 -10.454 1.00 82.92 146 B 1 +ATOM 5515 C C . ASP B 2 146 ? 13.840 7.662 -10.534 1.00 81.63 146 B 1 +ATOM 5516 O O . ASP B 2 146 ? 14.539 7.816 -9.527 1.00 80.15 146 B 1 +ATOM 5517 C CB . ASP B 2 146 ? 11.634 6.411 -10.596 1.00 82.63 146 B 1 +ATOM 5518 C CG . ASP B 2 146 ? 12.220 5.393 -9.618 1.00 80.68 146 B 1 +ATOM 5519 O OD1 . ASP B 2 146 ? 11.940 5.495 -8.415 1.00 71.03 146 B 1 +ATOM 5520 O OD2 . ASP B 2 146 ? 12.995 4.521 -10.067 1.00 71.35 146 B 1 +ATOM 5521 N N . ARG B 2 147 ? 14.396 7.463 -11.736 1.00 83.08 147 B 1 +ATOM 5522 C CA . ARG B 2 147 ? 15.852 7.413 -11.927 1.00 80.67 147 B 1 +ATOM 5523 C C . ARG B 2 147 ? 16.520 8.756 -11.661 1.00 79.80 147 B 1 +ATOM 5524 O O . ARG B 2 147 ? 17.606 8.776 -11.087 1.00 77.86 147 B 1 +ATOM 5525 C CB . ARG B 2 147 ? 16.194 6.923 -13.334 1.00 78.73 147 B 1 +ATOM 5526 C CG . ARG B 2 147 ? 15.865 5.449 -13.625 1.00 72.85 147 B 1 +ATOM 5527 C CD . ARG B 2 147 ? 16.493 4.440 -12.659 1.00 69.52 147 B 1 +ATOM 5528 N NE . ARG B 2 147 ? 15.634 4.155 -11.518 1.00 65.24 147 B 1 +ATOM 5529 C CZ . ARG B 2 147 ? 15.927 3.366 -10.487 1.00 60.24 147 B 1 +ATOM 5530 N NH1 . ARG B 2 147 ? 17.064 2.733 -10.397 1.00 54.72 147 B 1 +ATOM 5531 N NH2 . ARG B 2 147 ? 15.071 3.183 -9.530 1.00 55.15 147 B 1 +ATOM 5532 N N . TYR B 2 148 ? 15.875 9.866 -12.029 1.00 78.69 148 B 1 +ATOM 5533 C CA . TYR B 2 148 ? 16.353 11.215 -11.731 1.00 77.44 148 B 1 +ATOM 5534 C C . TYR B 2 148 ? 16.476 11.419 -10.218 1.00 76.52 148 B 1 +ATOM 5535 O O . TYR B 2 148 ? 17.548 11.769 -9.736 1.00 75.91 148 B 1 +ATOM 5536 C CB . TYR B 2 148 ? 15.415 12.236 -12.379 1.00 77.35 148 B 1 +ATOM 5537 C CG . TYR B 2 148 ? 15.891 13.663 -12.265 1.00 76.58 148 B 1 +ATOM 5538 C CD1 . TYR B 2 148 ? 15.576 14.448 -11.139 1.00 69.15 148 B 1 +ATOM 5539 C CD2 . TYR B 2 148 ? 16.679 14.223 -13.292 1.00 69.32 148 B 1 +ATOM 5540 C CE1 . TYR B 2 148 ? 16.055 15.754 -11.024 1.00 67.15 148 B 1 +ATOM 5541 C CE2 . TYR B 2 148 ? 17.162 15.542 -13.189 1.00 66.22 148 B 1 +ATOM 5542 C CZ . TYR B 2 148 ? 16.854 16.302 -12.050 1.00 70.89 148 B 1 +ATOM 5543 O OH . TYR B 2 148 ? 17.345 17.569 -11.925 1.00 68.95 148 B 1 +ATOM 5544 N N . ILE B 2 149 ? 15.430 11.097 -9.464 1.00 79.00 149 B 1 +ATOM 5545 C CA . ILE B 2 149 ? 15.437 11.197 -8.005 1.00 78.51 149 B 1 +ATOM 5546 C C . ILE B 2 149 ? 16.496 10.266 -7.399 1.00 76.47 149 B 1 +ATOM 5547 O O . ILE B 2 149 ? 17.231 10.678 -6.516 1.00 74.35 149 B 1 +ATOM 5548 C CB . ILE B 2 149 ? 14.027 10.931 -7.432 1.00 79.73 149 B 1 +ATOM 5549 C CG1 . ILE B 2 149 ? 13.031 12.012 -7.920 1.00 77.28 149 B 1 +ATOM 5550 C CG2 . ILE B 2 149 ? 14.073 10.928 -5.901 1.00 76.36 149 B 1 +ATOM 5551 C CD1 . ILE B 2 149 ? 11.561 11.663 -7.642 1.00 70.99 149 B 1 +ATOM 5552 N N . THR B 2 150 ? 16.651 9.043 -7.926 1.00 77.16 150 B 1 +ATOM 5553 C CA . THR B 2 150 ? 17.679 8.110 -7.451 1.00 73.75 150 B 1 +ATOM 5554 C C . THR B 2 150 ? 19.098 8.659 -7.621 1.00 71.47 150 B 1 +ATOM 5555 O O . THR B 2 150 ? 19.961 8.380 -6.796 1.00 69.53 150 B 1 +ATOM 5556 C CB . THR B 2 150 ? 17.616 6.769 -8.197 1.00 72.57 150 B 1 +ATOM 5557 O OG1 . THR B 2 150 ? 16.323 6.236 -8.262 1.00 64.12 150 B 1 +ATOM 5558 C CG2 . THR B 2 150 ? 18.452 5.692 -7.505 1.00 62.85 150 B 1 +ATOM 5559 N N . ILE B 2 151 ? 19.360 9.405 -8.684 1.00 73.39 151 B 1 +ATOM 5560 C CA . ILE B 2 151 ? 20.694 9.945 -8.976 1.00 69.92 151 B 1 +ATOM 5561 C C . ILE B 2 151 ? 20.965 11.218 -8.173 1.00 67.75 151 B 1 +ATOM 5562 O O . ILE B 2 151 ? 22.047 11.371 -7.618 1.00 64.80 151 B 1 +ATOM 5563 C CB . ILE B 2 151 ? 20.865 10.166 -10.499 1.00 68.24 151 B 1 +ATOM 5564 C CG1 . ILE B 2 151 ? 20.893 8.802 -11.221 1.00 64.03 151 B 1 +ATOM 5565 C CG2 . ILE B 2 151 ? 22.154 10.947 -10.817 1.00 62.90 151 B 1 +ATOM 5566 C CD1 . ILE B 2 151 ? 20.722 8.909 -12.752 1.00 57.78 151 B 1 +ATOM 5567 N N . PHE B 2 152 ? 19.987 12.133 -8.103 1.00 71.41 152 B 1 +ATOM 5568 C CA . PHE B 2 152 ? 20.181 13.441 -7.468 1.00 69.45 152 B 1 +ATOM 5569 C C . PHE B 2 152 ? 19.903 13.469 -5.974 1.00 68.57 152 B 1 +ATOM 5570 O O . PHE B 2 152 ? 20.504 14.264 -5.256 1.00 65.35 152 B 1 +ATOM 5571 C CB . PHE B 2 152 ? 19.333 14.496 -8.195 1.00 67.08 152 B 1 +ATOM 5572 C CG . PHE B 2 152 ? 19.910 14.806 -9.541 1.00 64.91 152 B 1 +ATOM 5573 C CD1 . PHE B 2 152 ? 21.140 15.471 -9.601 1.00 60.25 152 B 1 +ATOM 5574 C CD2 . PHE B 2 152 ? 19.322 14.302 -10.707 1.00 59.65 152 B 1 +ATOM 5575 C CE1 . PHE B 2 152 ? 21.813 15.575 -10.824 1.00 56.37 152 B 1 +ATOM 5576 C CE2 . PHE B 2 152 ? 19.987 14.400 -11.937 1.00 54.89 152 B 1 +ATOM 5577 C CZ . PHE B 2 152 ? 21.250 15.013 -11.981 1.00 56.00 152 B 1 +ATOM 5578 N N . TYR B 2 153 ? 18.994 12.599 -5.518 1.00 70.64 153 B 1 +ATOM 5579 C CA . TYR B 2 153 ? 18.544 12.538 -4.131 1.00 70.07 153 B 1 +ATOM 5580 C C . TYR B 2 153 ? 18.711 11.119 -3.577 1.00 68.53 153 B 1 +ATOM 5581 O O . TYR B 2 153 ? 17.827 10.616 -2.894 1.00 65.31 153 B 1 +ATOM 5582 C CB . TYR B 2 153 ? 17.105 13.056 -4.029 1.00 69.03 153 B 1 +ATOM 5583 C CG . TYR B 2 153 ? 16.909 14.476 -4.503 1.00 66.86 153 B 1 +ATOM 5584 C CD1 . TYR B 2 153 ? 17.143 15.556 -3.624 1.00 61.50 153 B 1 +ATOM 5585 C CD2 . TYR B 2 153 ? 16.493 14.738 -5.822 1.00 61.25 153 B 1 +ATOM 5586 C CE1 . TYR B 2 153 ? 16.955 16.868 -4.051 1.00 57.73 153 B 1 +ATOM 5587 C CE2 . TYR B 2 153 ? 16.305 16.055 -6.260 1.00 57.74 153 B 1 +ATOM 5588 C CZ . TYR B 2 153 ? 16.531 17.130 -5.375 1.00 59.52 153 B 1 +ATOM 5589 O OH . TYR B 2 153 ? 16.342 18.424 -5.791 1.00 57.25 153 B 1 +ATOM 5590 N N . ALA B 2 154 ? 19.846 10.466 -3.869 1.00 65.26 154 B 1 +ATOM 5591 C CA . ALA B 2 154 ? 20.093 9.056 -3.548 1.00 63.17 154 B 1 +ATOM 5592 C C . ALA B 2 154 ? 19.783 8.699 -2.089 1.00 63.02 154 B 1 +ATOM 5593 O O . ALA B 2 154 ? 19.114 7.706 -1.818 1.00 59.42 154 B 1 +ATOM 5594 C CB . ALA B 2 154 ? 21.565 8.751 -3.891 1.00 58.77 154 B 1 +ATOM 5595 N N . LEU B 2 155 ? 20.205 9.553 -1.154 1.00 61.40 155 B 1 +ATOM 5596 C CA . LEU B 2 155 ? 20.008 9.380 0.286 1.00 58.99 155 B 1 +ATOM 5597 C C . LEU B 2 155 ? 18.541 9.578 0.709 1.00 60.68 155 B 1 +ATOM 5598 O O . LEU B 2 155 ? 18.054 8.931 1.631 1.00 56.04 155 B 1 +ATOM 5599 C CB . LEU B 2 155 ? 20.926 10.386 1.015 1.00 52.89 155 B 1 +ATOM 5600 C CG . LEU B 2 155 ? 22.430 10.214 0.721 1.00 47.38 155 B 1 +ATOM 5601 C CD1 . LEU B 2 155 ? 23.202 11.399 1.276 1.00 42.28 155 B 1 +ATOM 5602 C CD2 . LEU B 2 155 ? 22.996 8.931 1.324 1.00 42.54 155 B 1 +ATOM 5603 N N . ARG B 2 156 ? 17.808 10.452 0.008 1.00 66.36 156 B 1 +ATOM 5604 C CA . ARG B 2 156 ? 16.392 10.758 0.296 1.00 67.83 156 B 1 +ATOM 5605 C C . ARG B 2 156 ? 15.419 9.962 -0.575 1.00 69.33 156 B 1 +ATOM 5606 O O . ARG B 2 156 ? 14.211 10.133 -0.450 1.00 65.64 156 B 1 +ATOM 5607 C CB . ARG B 2 156 ? 16.129 12.263 0.148 1.00 64.90 156 B 1 +ATOM 5608 C CG . ARG B 2 156 ? 17.005 13.116 1.072 1.00 58.31 156 B 1 +ATOM 5609 C CD . ARG B 2 156 ? 16.540 14.567 1.020 1.00 54.61 156 B 1 +ATOM 5610 N NE . ARG B 2 156 ? 17.438 15.451 1.781 1.00 47.17 156 B 1 +ATOM 5611 C CZ . ARG B 2 156 ? 17.176 16.687 2.168 1.00 41.74 156 B 1 +ATOM 5612 N NH1 . ARG B 2 156 ? 16.045 17.279 1.908 1.00 38.09 156 B 1 +ATOM 5613 N NH2 . ARG B 2 156 ? 18.065 17.357 2.836 1.00 37.35 156 B 1 +ATOM 5614 N N . TYR B 2 157 ? 15.931 9.110 -1.450 1.00 69.58 157 B 1 +ATOM 5615 C CA . TYR B 2 157 ? 15.130 8.408 -2.448 1.00 69.59 157 B 1 +ATOM 5616 C C . TYR B 2 157 ? 13.943 7.663 -1.830 1.00 69.79 157 B 1 +ATOM 5617 O O . TYR B 2 157 ? 12.802 7.863 -2.248 1.00 66.87 157 B 1 +ATOM 5618 C CB . TYR B 2 157 ? 16.025 7.441 -3.228 1.00 68.51 157 B 1 +ATOM 5619 C CG . TYR B 2 157 ? 15.248 6.544 -4.169 1.00 68.66 157 B 1 +ATOM 5620 C CD1 . TYR B 2 157 ? 14.958 5.218 -3.811 1.00 61.05 157 B 1 +ATOM 5621 C CD2 . TYR B 2 157 ? 14.756 7.056 -5.383 1.00 62.23 157 B 1 +ATOM 5622 C CE1 . TYR B 2 157 ? 14.187 4.403 -4.650 1.00 60.30 157 B 1 +ATOM 5623 C CE2 . TYR B 2 157 ? 13.985 6.248 -6.230 1.00 60.97 157 B 1 +ATOM 5624 C CZ . TYR B 2 157 ? 13.700 4.915 -5.863 1.00 66.36 157 B 1 +ATOM 5625 O OH . TYR B 2 157 ? 12.941 4.125 -6.682 1.00 64.74 157 B 1 +ATOM 5626 N N . HIS B 2 158 ? 14.193 6.872 -0.792 1.00 70.64 158 B 1 +ATOM 5627 C CA . HIS B 2 158 ? 13.154 6.078 -0.126 1.00 69.79 158 B 1 +ATOM 5628 C C . HIS B 2 158 ? 12.078 6.931 0.560 1.00 70.45 158 B 1 +ATOM 5629 O O . HIS B 2 158 ? 10.943 6.478 0.708 1.00 67.14 158 B 1 +ATOM 5630 C CB . HIS B 2 158 ? 13.818 5.130 0.871 1.00 66.39 158 B 1 +ATOM 5631 C CG . HIS B 2 158 ? 14.591 4.036 0.183 1.00 63.11 158 B 1 +ATOM 5632 N ND1 . HIS B 2 158 ? 14.033 3.034 -0.602 1.00 55.15 158 B 1 +ATOM 5633 C CD2 . HIS B 2 158 ? 15.945 3.834 0.161 1.00 55.23 158 B 1 +ATOM 5634 C CE1 . HIS B 2 158 ? 15.030 2.265 -1.068 1.00 52.69 158 B 1 +ATOM 5635 N NE2 . HIS B 2 158 ? 16.205 2.723 -0.629 1.00 53.21 158 B 1 +ATOM 5636 N N . ASN B 2 159 ? 12.379 8.174 0.918 1.00 74.01 159 B 1 +ATOM 5637 C CA . ASN B 2 159 ? 11.422 9.100 1.517 1.00 74.94 159 B 1 +ATOM 5638 C C . ASN B 2 159 ? 10.596 9.854 0.466 1.00 77.05 159 B 1 +ATOM 5639 O O . ASN B 2 159 ? 9.421 10.155 0.685 1.00 73.80 159 B 1 +ATOM 5640 C CB . ASN B 2 159 ? 12.188 10.075 2.412 1.00 71.49 159 B 1 +ATOM 5641 C CG . ASN B 2 159 ? 12.921 9.336 3.517 1.00 63.95 159 B 1 +ATOM 5642 O OD1 . ASN B 2 159 ? 12.414 8.410 4.114 1.00 55.82 159 B 1 +ATOM 5643 N ND2 . ASN B 2 159 ? 14.145 9.726 3.792 1.00 55.30 159 B 1 +ATOM 5644 N N . ILE B 2 160 ? 11.208 10.150 -0.686 1.00 76.09 160 B 1 +ATOM 5645 C CA . ILE B 2 160 ? 10.540 10.850 -1.790 1.00 77.75 160 B 1 +ATOM 5646 C C . ILE B 2 160 ? 9.677 9.887 -2.597 1.00 79.07 160 B 1 +ATOM 5647 O O . ILE B 2 160 ? 8.500 10.151 -2.840 1.00 76.57 160 B 1 +ATOM 5648 C CB . ILE B 2 160 ? 11.578 11.593 -2.662 1.00 75.70 160 B 1 +ATOM 5649 C CG1 . ILE B 2 160 ? 12.340 12.650 -1.834 1.00 69.27 160 B 1 +ATOM 5650 C CG2 . ILE B 2 160 ? 10.869 12.277 -3.848 1.00 67.68 160 B 1 +ATOM 5651 C CD1 . ILE B 2 160 ? 13.559 13.242 -2.554 1.00 62.15 160 B 1 +ATOM 5652 N N . VAL B 2 161 ? 10.256 8.752 -2.988 1.00 77.45 161 B 1 +ATOM 5653 C CA . VAL B 2 161 ? 9.614 7.735 -3.825 1.00 78.09 161 B 1 +ATOM 5654 C C . VAL B 2 161 ? 9.228 6.533 -2.973 1.00 76.98 161 B 1 +ATOM 5655 O O . VAL B 2 161 ? 9.914 5.514 -2.915 1.00 74.38 161 B 1 +ATOM 5656 C CB . VAL B 2 161 ? 10.478 7.342 -5.039 1.00 76.79 161 B 1 +ATOM 5657 C CG1 . VAL B 2 161 ? 9.657 6.493 -6.014 1.00 68.54 161 B 1 +ATOM 5658 C CG2 . VAL B 2 161 ? 10.958 8.572 -5.807 1.00 68.50 161 B 1 +ATOM 5659 N N . THR B 2 162 ? 8.096 6.655 -2.301 1.00 80.12 162 B 1 +ATOM 5660 C CA . THR B 2 162 ? 7.512 5.557 -1.539 1.00 80.40 162 B 1 +ATOM 5661 C C . THR B 2 162 ? 6.653 4.668 -2.448 1.00 82.56 162 B 1 +ATOM 5662 O O . THR B 2 162 ? 6.090 5.136 -3.444 1.00 80.52 162 B 1 +ATOM 5663 C CB . THR B 2 162 ? 6.680 6.049 -0.349 1.00 75.61 162 B 1 +ATOM 5664 O OG1 . THR B 2 162 ? 5.550 6.773 -0.772 1.00 67.16 162 B 1 +ATOM 5665 C CG2 . THR B 2 162 ? 7.488 6.938 0.591 1.00 64.85 162 B 1 +ATOM 5666 N N . ILE B 2 163 ? 6.477 3.401 -2.073 1.00 79.77 163 B 1 +ATOM 5667 C CA . ILE B 2 163 ? 5.586 2.459 -2.774 1.00 80.60 163 B 1 +ATOM 5668 C C . ILE B 2 163 ? 4.173 3.050 -2.922 1.00 82.75 163 B 1 +ATOM 5669 O O . ILE B 2 163 ? 3.573 2.976 -3.984 1.00 81.39 163 B 1 +ATOM 5670 C CB . ILE B 2 163 ? 5.546 1.100 -2.037 1.00 78.16 163 B 1 +ATOM 5671 C CG1 . ILE B 2 163 ? 6.930 0.413 -2.128 1.00 70.94 163 B 1 +ATOM 5672 C CG2 . ILE B 2 163 ? 4.443 0.183 -2.597 1.00 67.24 163 B 1 +ATOM 5673 C CD1 . ILE B 2 163 ? 7.064 -0.866 -1.282 1.00 61.31 163 B 1 +ATOM 5674 N N . ARG B 2 164 ? 3.684 3.690 -1.884 1.00 81.07 164 B 1 +ATOM 5675 C CA . ARG B 2 164 ? 2.351 4.329 -1.911 1.00 82.73 164 B 1 +ATOM 5676 C C . ARG B 2 164 ? 2.266 5.442 -2.951 1.00 84.43 164 B 1 +ATOM 5677 O O . ARG B 2 164 ? 1.288 5.505 -3.689 1.00 82.71 164 B 1 +ATOM 5678 C CB . ARG B 2 164 ? 2.017 4.835 -0.494 1.00 81.43 164 B 1 +ATOM 5679 C CG . ARG B 2 164 ? 0.583 5.374 -0.397 1.00 71.43 164 B 1 +ATOM 5680 C CD . ARG B 2 164 ? 0.295 5.874 1.024 1.00 66.04 164 B 1 +ATOM 5681 N NE . ARG B 2 164 ? -1.080 6.406 1.154 1.00 55.61 164 B 1 +ATOM 5682 C CZ . ARG B 2 164 ? -1.572 7.010 2.225 1.00 47.38 164 B 1 +ATOM 5683 N NH1 . ARG B 2 164 ? -0.851 7.220 3.291 1.00 41.96 164 B 1 +ATOM 5684 N NH2 . ARG B 2 164 ? -2.799 7.416 2.249 1.00 41.68 164 B 1 +ATOM 5685 N N . ARG B 2 165 ? 3.259 6.302 -3.031 1.00 82.87 165 B 1 +ATOM 5686 C CA . ARG B 2 165 ? 3.308 7.374 -4.036 1.00 84.75 165 B 1 +ATOM 5687 C C . ARG B 2 165 ? 3.453 6.799 -5.453 1.00 85.83 165 B 1 +ATOM 5688 O O . ARG B 2 165 ? 2.771 7.274 -6.349 1.00 85.13 165 B 1 +ATOM 5689 C CB . ARG B 2 165 ? 4.444 8.365 -3.735 1.00 83.45 165 B 1 +ATOM 5690 C CG . ARG B 2 165 ? 4.125 9.291 -2.541 1.00 79.93 165 B 1 +ATOM 5691 C CD . ARG B 2 165 ? 5.305 10.242 -2.279 1.00 77.45 165 B 1 +ATOM 5692 N NE . ARG B 2 165 ? 5.082 11.119 -1.126 1.00 71.30 165 B 1 +ATOM 5693 C CZ . ARG B 2 165 ? 5.993 11.894 -0.543 1.00 65.19 165 B 1 +ATOM 5694 N NH1 . ARG B 2 165 ? 7.217 11.951 -0.978 1.00 60.26 165 B 1 +ATOM 5695 N NH2 . ARG B 2 165 ? 5.704 12.619 0.499 1.00 59.12 165 B 1 +ATOM 5696 N N . ALA B 2 166 ? 4.264 5.761 -5.625 1.00 84.61 166 B 1 +ATOM 5697 C CA . ALA B 2 166 ? 4.395 5.090 -6.914 1.00 85.27 166 B 1 +ATOM 5698 C C . ALA B 2 166 ? 3.065 4.493 -7.389 1.00 86.53 166 B 1 +ATOM 5699 O O . ALA B 2 166 ? 2.669 4.704 -8.529 1.00 86.37 166 B 1 +ATOM 5700 C CB . ALA B 2 166 ? 5.487 4.018 -6.797 1.00 84.50 166 B 1 +ATOM 5701 N N . LEU B 2 167 ? 2.326 3.821 -6.500 1.00 86.02 167 B 1 +ATOM 5702 C CA . LEU B 2 167 ? 1.001 3.275 -6.819 1.00 86.53 167 B 1 +ATOM 5703 C C . LEU B 2 167 ? -0.026 4.371 -7.134 1.00 87.93 167 B 1 +ATOM 5704 O O . LEU B 2 167 ? -0.828 4.204 -8.051 1.00 88.05 167 B 1 +ATOM 5705 C CB . LEU B 2 167 ? 0.507 2.389 -5.655 1.00 86.22 167 B 1 +ATOM 5706 C CG . LEU B 2 167 ? 1.288 1.074 -5.469 1.00 81.18 167 B 1 +ATOM 5707 C CD1 . LEU B 2 167 ? 0.806 0.370 -4.208 1.00 72.35 167 B 1 +ATOM 5708 C CD2 . LEU B 2 167 ? 1.104 0.115 -6.650 1.00 72.68 167 B 1 +ATOM 5709 N N . LEU B 2 168 ? 0.020 5.501 -6.429 1.00 86.92 168 B 1 +ATOM 5710 C CA . LEU B 2 168 ? -0.821 6.659 -6.743 1.00 87.44 168 B 1 +ATOM 5711 C C . LEU B 2 168 ? -0.497 7.244 -8.125 1.00 88.39 168 B 1 +ATOM 5712 O O . LEU B 2 168 ? -1.416 7.575 -8.865 1.00 88.53 168 B 1 +ATOM 5713 C CB . LEU B 2 168 ? -0.661 7.740 -5.656 1.00 87.89 168 B 1 +ATOM 5714 C CG . LEU B 2 168 ? -1.463 7.476 -4.374 1.00 77.96 168 B 1 +ATOM 5715 C CD1 . LEU B 2 168 ? -1.008 8.428 -3.266 1.00 68.80 168 B 1 +ATOM 5716 C CD2 . LEU B 2 168 ? -2.964 7.704 -4.601 1.00 69.60 168 B 1 +ATOM 5717 N N . VAL B 2 169 ? 0.770 7.331 -8.476 1.00 87.36 169 B 1 +ATOM 5718 C CA . VAL B 2 169 ? 1.192 7.785 -9.808 1.00 87.52 169 B 1 +ATOM 5719 C C . VAL B 2 169 ? 0.700 6.825 -10.885 1.00 88.16 169 B 1 +ATOM 5720 O O . VAL B 2 169 ? 0.130 7.278 -11.872 1.00 87.98 169 B 1 +ATOM 5721 C CB . VAL B 2 169 ? 2.722 7.978 -9.872 1.00 86.85 169 B 1 +ATOM 5722 C CG1 . VAL B 2 169 ? 3.227 8.224 -11.296 1.00 77.12 169 B 1 +ATOM 5723 C CG2 . VAL B 2 169 ? 3.143 9.201 -9.038 1.00 76.49 169 B 1 +ATOM 5724 N N . ILE B 2 170 ? 0.832 5.517 -10.679 1.00 87.97 170 B 1 +ATOM 5725 C CA . ILE B 2 170 ? 0.322 4.508 -11.618 1.00 87.95 170 B 1 +ATOM 5726 C C . ILE B 2 170 ? -1.202 4.624 -11.775 1.00 88.02 170 B 1 +ATOM 5727 O O . ILE B 2 170 ? -1.689 4.663 -12.898 1.00 88.00 170 B 1 +ATOM 5728 C CB . ILE B 2 170 ? 0.754 3.089 -11.178 1.00 88.19 170 B 1 +ATOM 5729 C CG1 . ILE B 2 170 ? 2.281 2.925 -11.334 1.00 83.74 170 B 1 +ATOM 5730 C CG2 . ILE B 2 170 ? 0.028 2.002 -12.001 1.00 81.43 170 B 1 +ATOM 5731 C CD1 . ILE B 2 170 ? 2.844 1.702 -10.619 1.00 74.03 170 B 1 +ATOM 5732 N N . ALA B 2 171 ? -1.941 4.736 -10.671 1.00 88.86 171 B 1 +ATOM 5733 C CA . ALA B 2 171 ? -3.383 4.925 -10.718 1.00 88.23 171 B 1 +ATOM 5734 C C . ALA B 2 171 ? -3.767 6.212 -11.482 1.00 88.29 171 B 1 +ATOM 5735 O O . ALA B 2 171 ? -4.689 6.195 -12.299 1.00 87.41 171 B 1 +ATOM 5736 C CB . ALA B 2 171 ? -3.932 4.927 -9.289 1.00 88.37 171 B 1 +ATOM 5737 N N . GLY B 2 172 ? -3.031 7.299 -11.264 1.00 89.88 172 B 1 +ATOM 5738 C CA . GLY B 2 172 ? -3.205 8.550 -11.994 1.00 88.78 172 B 1 +ATOM 5739 C C . GLY B 2 172 ? -2.951 8.391 -13.499 1.00 88.67 172 B 1 +ATOM 5740 O O . GLY B 2 172 ? -3.782 8.820 -14.295 1.00 87.53 172 B 1 +ATOM 5741 N N . ILE B 2 173 ? -1.862 7.724 -13.871 1.00 88.59 173 B 1 +ATOM 5742 C CA . ILE B 2 173 ? -1.521 7.428 -15.271 1.00 87.83 173 B 1 +ATOM 5743 C C . ILE B 2 173 ? -2.670 6.673 -15.949 1.00 87.47 173 B 1 +ATOM 5744 O O . ILE B 2 173 ? -3.186 7.130 -16.960 1.00 86.34 173 B 1 +ATOM 5745 C CB . ILE B 2 173 ? -0.190 6.646 -15.368 1.00 87.46 173 B 1 +ATOM 5746 C CG1 . ILE B 2 173 ? 1.002 7.570 -15.022 1.00 83.65 173 B 1 +ATOM 5747 C CG2 . ILE B 2 173 ? 0.010 6.039 -16.777 1.00 82.07 173 B 1 +ATOM 5748 C CD1 . ILE B 2 173 ? 2.321 6.819 -14.781 1.00 77.02 173 B 1 +ATOM 5749 N N . TRP B 2 174 ? -3.094 5.546 -15.370 1.00 88.89 174 B 1 +ATOM 5750 C CA . TRP B 2 174 ? -4.149 4.720 -15.955 1.00 88.23 174 B 1 +ATOM 5751 C C . TRP B 2 174 ? -5.498 5.434 -16.012 1.00 87.67 174 B 1 +ATOM 5752 O O . TRP B 2 174 ? -6.220 5.298 -17.001 1.00 85.26 174 B 1 +ATOM 5753 C CB . TRP B 2 174 ? -4.225 3.384 -15.220 1.00 87.58 174 B 1 +ATOM 5754 C CG . TRP B 2 174 ? -3.147 2.439 -15.664 1.00 88.46 174 B 1 +ATOM 5755 C CD1 . TRP B 2 174 ? -1.972 2.212 -15.034 1.00 82.02 174 B 1 +ATOM 5756 C CD2 . TRP B 2 174 ? -3.106 1.677 -16.901 1.00 86.27 174 B 1 +ATOM 5757 N NE1 . TRP B 2 174 ? -1.198 1.349 -15.805 1.00 82.91 174 B 1 +ATOM 5758 C CE2 . TRP B 2 174 ? -1.857 1.012 -16.970 1.00 84.44 174 B 1 +ATOM 5759 C CE3 . TRP B 2 174 ? -4.004 1.509 -17.978 1.00 85.01 174 B 1 +ATOM 5760 C CZ2 . TRP B 2 174 ? -1.493 0.220 -18.081 1.00 84.63 174 B 1 +ATOM 5761 C CZ3 . TRP B 2 174 ? -3.645 0.707 -19.077 1.00 81.52 174 B 1 +ATOM 5762 C CH2 . TRP B 2 174 ? -2.399 0.078 -19.132 1.00 81.83 174 B 1 +ATOM 5763 N N . THR B 2 175 ? -5.819 6.240 -15.004 1.00 87.72 175 B 1 +ATOM 5764 C CA . THR B 2 175 ? -7.041 7.059 -15.018 1.00 86.35 175 B 1 +ATOM 5765 C C . THR B 2 175 ? -7.004 8.073 -16.162 1.00 85.85 175 B 1 +ATOM 5766 O O . THR B 2 175 ? -7.938 8.142 -16.951 1.00 85.49 175 B 1 +ATOM 5767 C CB . THR B 2 175 ? -7.249 7.771 -13.670 1.00 86.12 175 B 1 +ATOM 5768 O OG1 . THR B 2 175 ? -7.237 6.843 -12.616 1.00 76.73 175 B 1 +ATOM 5769 C CG2 . THR B 2 175 ? -8.598 8.494 -13.610 1.00 73.73 175 B 1 +ATOM 5770 N N . CYS B 2 176 ? -5.906 8.821 -16.306 1.00 88.19 176 B 1 +ATOM 5771 C CA . CYS B 2 176 ? -5.736 9.782 -17.383 1.00 85.75 176 B 1 +ATOM 5772 C C . CYS B 2 176 ? -5.768 9.119 -18.766 1.00 84.97 176 B 1 +ATOM 5773 O O . CYS B 2 176 ? -6.436 9.622 -19.670 1.00 83.04 176 B 1 +ATOM 5774 C CB . CYS B 2 176 ? -4.422 10.553 -17.194 1.00 83.68 176 B 1 +ATOM 5775 S SG . CYS B 2 176 ? -4.564 11.713 -15.808 1.00 68.46 176 B 1 +ATOM 5776 N N . CYS B 2 177 ? -5.099 7.973 -18.929 1.00 86.78 177 B 1 +ATOM 5777 C CA . CYS B 2 177 ? -5.087 7.240 -20.185 1.00 84.98 177 B 1 +ATOM 5778 C C . CYS B 2 177 ? -6.482 6.705 -20.541 1.00 84.06 177 B 1 +ATOM 5779 O O . CYS B 2 177 ? -6.906 6.814 -21.684 1.00 82.68 177 B 1 +ATOM 5780 C CB . CYS B 2 177 ? -4.065 6.102 -20.113 1.00 84.38 177 B 1 +ATOM 5781 S SG . CYS B 2 177 ? -2.394 6.816 -19.956 1.00 74.07 177 B 1 +ATOM 5782 N N . THR B 2 178 ? -7.210 6.191 -19.549 1.00 84.04 178 B 1 +ATOM 5783 C CA . THR B 2 178 ? -8.567 5.680 -19.749 1.00 82.37 178 B 1 +ATOM 5784 C C . THR B 2 178 ? -9.534 6.802 -20.127 1.00 81.68 178 B 1 +ATOM 5785 O O . THR B 2 178 ? -10.278 6.670 -21.094 1.00 81.59 178 B 1 +ATOM 5786 C CB . THR B 2 178 ? -9.077 4.946 -18.510 1.00 81.85 178 B 1 +ATOM 5787 O OG1 . THR B 2 178 ? -8.171 3.967 -18.078 1.00 73.16 178 B 1 +ATOM 5788 C CG2 . THR B 2 178 ? -10.380 4.219 -18.819 1.00 70.86 178 B 1 +ATOM 5789 N N . VAL B 2 179 ? -9.484 7.931 -19.418 1.00 81.99 179 B 1 +ATOM 5790 C CA . VAL B 2 179 ? -10.289 9.114 -19.756 1.00 81.00 179 B 1 +ATOM 5791 C C . VAL B 2 179 ? -9.947 9.626 -21.161 1.00 80.18 179 B 1 +ATOM 5792 O O . VAL B 2 179 ? -10.856 9.917 -21.941 1.00 79.62 179 B 1 +ATOM 5793 C CB . VAL B 2 179 ? -10.107 10.227 -18.701 1.00 81.48 179 B 1 +ATOM 5794 C CG1 . VAL B 2 179 ? -10.768 11.547 -19.113 1.00 74.85 179 B 1 +ATOM 5795 C CG2 . VAL B 2 179 ? -10.734 9.810 -17.371 1.00 74.22 179 B 1 +ATOM 5796 N N . SER B 2 180 ? -8.671 9.673 -21.519 1.00 82.64 180 B 1 +ATOM 5797 C CA . SER B 2 180 ? -8.235 10.080 -22.858 1.00 79.70 180 B 1 +ATOM 5798 C C . SER B 2 180 ? -8.738 9.118 -23.936 1.00 78.89 180 B 1 +ATOM 5799 O O . SER B 2 180 ? -9.199 9.568 -24.982 1.00 76.90 180 B 1 +ATOM 5800 C CB . SER B 2 180 ? -6.711 10.182 -22.935 1.00 78.24 180 B 1 +ATOM 5801 O OG . SER B 2 180 ? -6.217 11.096 -21.975 1.00 67.69 180 B 1 +ATOM 5802 N N . GLY B 2 181 ? -8.716 7.810 -23.674 1.00 79.93 181 B 1 +ATOM 5803 C CA . GLY B 2 181 ? -9.270 6.796 -24.563 1.00 77.89 181 B 1 +ATOM 5804 C C . GLY B 2 181 ? -10.778 6.931 -24.756 1.00 77.81 181 B 1 +ATOM 5805 O O . GLY B 2 181 ? -11.270 6.898 -25.883 1.00 77.15 181 B 1 +ATOM 5806 N N . ILE B 2 182 ? -11.524 7.172 -23.670 1.00 78.74 182 B 1 +ATOM 5807 C CA . ILE B 2 182 ? -12.976 7.415 -23.736 1.00 77.80 182 B 1 +ATOM 5808 C C . ILE B 2 182 ? -13.264 8.674 -24.568 1.00 77.41 182 B 1 +ATOM 5809 O O . ILE B 2 182 ? -14.099 8.640 -25.469 1.00 77.31 182 B 1 +ATOM 5810 C CB . ILE B 2 182 ? -13.581 7.510 -22.319 1.00 78.31 182 B 1 +ATOM 5811 C CG1 . ILE B 2 182 ? -13.509 6.146 -21.594 1.00 73.95 182 B 1 +ATOM 5812 C CG2 . ILE B 2 182 ? -15.051 7.981 -22.379 1.00 71.08 182 B 1 +ATOM 5813 C CD1 . ILE B 2 182 ? -13.762 6.235 -20.088 1.00 64.05 182 B 1 +ATOM 5814 N N . LEU B 2 183 ? -12.545 9.765 -24.305 1.00 78.30 183 B 1 +ATOM 5815 C CA . LEU B 2 183 ? -12.672 10.996 -25.082 1.00 77.48 183 B 1 +ATOM 5816 C C . LEU B 2 183 ? -12.360 10.763 -26.558 1.00 76.78 183 B 1 +ATOM 5817 O O . LEU B 2 183 ? -13.060 11.283 -27.414 1.00 75.96 183 B 1 +ATOM 5818 C CB . LEU B 2 183 ? -11.758 12.085 -24.495 1.00 77.04 183 B 1 +ATOM 5819 C CG . LEU B 2 183 ? -12.220 12.659 -23.145 1.00 72.59 183 B 1 +ATOM 5820 C CD1 . LEU B 2 183 ? -11.136 13.598 -22.600 1.00 65.79 183 B 1 +ATOM 5821 C CD2 . LEU B 2 183 ? -13.520 13.451 -23.255 1.00 66.36 183 B 1 +ATOM 5822 N N . PHE B 2 184 ? -11.355 9.933 -26.861 1.00 77.52 184 B 1 +ATOM 5823 C CA . PHE B 2 184 ? -11.023 9.576 -28.231 1.00 76.23 184 B 1 +ATOM 5824 C C . PHE B 2 184 ? -12.170 8.845 -28.931 1.00 75.87 184 B 1 +ATOM 5825 O O . PHE B 2 184 ? -12.496 9.182 -30.064 1.00 74.57 184 B 1 +ATOM 5826 C CB . PHE B 2 184 ? -9.733 8.759 -28.253 1.00 74.00 184 B 1 +ATOM 5827 C CG . PHE B 2 184 ? -9.247 8.524 -29.665 1.00 67.54 184 B 1 +ATOM 5828 C CD1 . PHE B 2 184 ? -9.647 7.372 -30.364 1.00 60.30 184 B 1 +ATOM 5829 C CD2 . PHE B 2 184 ? -8.486 9.507 -30.305 1.00 58.96 184 B 1 +ATOM 5830 C CE1 . PHE B 2 184 ? -9.298 7.218 -31.716 1.00 55.06 184 B 1 +ATOM 5831 C CE2 . PHE B 2 184 ? -8.144 9.361 -31.660 1.00 54.40 184 B 1 +ATOM 5832 C CZ . PHE B 2 184 ? -8.559 8.220 -32.364 1.00 54.83 184 B 1 +ATOM 5833 N N . ILE B 2 185 ? -12.848 7.904 -28.263 1.00 75.35 185 B 1 +ATOM 5834 C CA . ILE B 2 185 ? -14.008 7.195 -28.819 1.00 73.91 185 B 1 +ATOM 5835 C C . ILE B 2 185 ? -15.170 8.167 -29.072 1.00 73.62 185 B 1 +ATOM 5836 O O . ILE B 2 185 ? -15.747 8.169 -30.154 1.00 72.65 185 B 1 +ATOM 5837 C CB . ILE B 2 185 ? -14.446 6.035 -27.895 1.00 73.04 185 B 1 +ATOM 5838 C CG1 . ILE B 2 185 ? -13.346 4.952 -27.822 1.00 68.95 185 B 1 +ATOM 5839 C CG2 . ILE B 2 185 ? -15.754 5.392 -28.395 1.00 67.23 185 B 1 +ATOM 5840 C CD1 . ILE B 2 185 ? -13.541 3.966 -26.656 1.00 61.67 185 B 1 +ATOM 5841 N N . ILE B 2 186 ? -15.485 9.011 -28.085 1.00 75.77 186 B 1 +ATOM 5842 C CA . ILE B 2 186 ? -16.609 9.961 -28.182 1.00 74.41 186 B 1 +ATOM 5843 C C . ILE B 2 186 ? -16.378 10.979 -29.303 1.00 73.07 186 B 1 +ATOM 5844 O O . ILE B 2 186 ? -17.296 11.305 -30.056 1.00 70.63 186 B 1 +ATOM 5845 C CB . ILE B 2 186 ? -16.809 10.679 -26.830 1.00 74.72 186 B 1 +ATOM 5846 C CG1 . ILE B 2 186 ? -17.190 9.681 -25.717 1.00 70.72 186 B 1 +ATOM 5847 C CG2 . ILE B 2 186 ? -17.911 11.752 -26.928 1.00 69.13 186 B 1 +ATOM 5848 C CD1 . ILE B 2 186 ? -16.917 10.242 -24.324 1.00 63.96 186 B 1 +ATOM 5849 N N . TYR B 2 187 ? -15.154 11.470 -29.428 1.00 75.17 187 B 1 +ATOM 5850 C CA . TYR B 2 187 ? -14.757 12.481 -30.397 1.00 73.49 187 B 1 +ATOM 5851 C C . TYR B 2 187 ? -13.951 11.908 -31.572 1.00 72.24 187 B 1 +ATOM 5852 O O . TYR B 2 187 ? -13.186 12.636 -32.195 1.00 67.68 187 B 1 +ATOM 5853 C CB . TYR B 2 187 ? -14.011 13.612 -29.685 1.00 71.99 187 B 1 +ATOM 5854 C CG . TYR B 2 187 ? -14.814 14.313 -28.622 1.00 69.27 187 B 1 +ATOM 5855 C CD1 . TYR B 2 187 ? -15.796 15.244 -28.972 1.00 63.48 187 B 1 +ATOM 5856 C CD2 . TYR B 2 187 ? -14.574 14.053 -27.259 1.00 62.94 187 B 1 +ATOM 5857 C CE1 . TYR B 2 187 ? -16.536 15.895 -27.977 1.00 59.25 187 B 1 +ATOM 5858 C CE2 . TYR B 2 187 ? -15.307 14.695 -26.256 1.00 58.66 187 B 1 +ATOM 5859 C CZ . TYR B 2 187 ? -16.289 15.618 -26.615 1.00 59.87 187 B 1 +ATOM 5860 O OH . TYR B 2 187 ? -17.007 16.252 -25.631 1.00 56.78 187 B 1 +ATOM 5861 N N . SER B 2 188 ? -14.133 10.620 -31.881 1.00 70.81 188 B 1 +ATOM 5862 C CA . SER B 2 188 ? -13.388 9.914 -32.935 1.00 68.33 188 B 1 +ATOM 5863 C C . SER B 2 188 ? -13.439 10.597 -34.310 1.00 68.54 188 B 1 +ATOM 5864 O O . SER B 2 188 ? -12.466 10.559 -35.059 1.00 63.87 188 B 1 +ATOM 5865 C CB . SER B 2 188 ? -13.919 8.481 -33.071 1.00 63.86 188 B 1 +ATOM 5866 O OG . SER B 2 188 ? -15.316 8.444 -33.253 1.00 57.20 188 B 1 +ATOM 5867 N N . GLU B 2 189 ? -14.538 11.288 -34.613 1.00 69.17 189 B 1 +ATOM 5868 C CA . GLU B 2 189 ? -14.674 12.062 -35.852 1.00 68.97 189 B 1 +ATOM 5869 C C . GLU B 2 189 ? -14.024 13.456 -35.775 1.00 69.94 189 B 1 +ATOM 5870 O O . GLU B 2 189 ? -13.943 14.161 -36.785 1.00 64.12 189 B 1 +ATOM 5871 C CB . GLU B 2 189 ? -16.154 12.144 -36.259 1.00 63.67 189 B 1 +ATOM 5872 C CG . GLU B 2 189 ? -16.779 10.749 -36.468 1.00 56.88 189 B 1 +ATOM 5873 C CD . GLU B 2 189 ? -18.134 10.773 -37.171 1.00 50.37 189 B 1 +ATOM 5874 O OE1 . GLU B 2 189 ? -18.505 9.697 -37.709 1.00 44.09 189 B 1 +ATOM 5875 O OE2 . GLU B 2 189 ? -18.798 11.835 -37.217 1.00 44.84 189 B 1 +ATOM 5876 N N . SER B 2 190 ? -13.541 13.875 -34.604 1.00 69.57 190 B 1 +ATOM 5877 C CA . SER B 2 190 ? -12.926 15.179 -34.397 1.00 70.05 190 B 1 +ATOM 5878 C C . SER B 2 190 ? -11.406 15.113 -34.554 1.00 72.35 190 B 1 +ATOM 5879 O O . SER B 2 190 ? -10.684 14.558 -33.720 1.00 68.35 190 B 1 +ATOM 5880 C CB . SER B 2 190 ? -13.303 15.732 -33.028 1.00 65.09 190 B 1 +ATOM 5881 O OG . SER B 2 190 ? -12.729 17.018 -32.858 1.00 56.85 190 B 1 +ATOM 5882 N N . THR B 2 191 ? -10.900 15.797 -35.560 1.00 70.93 191 B 1 +ATOM 5883 C CA . THR B 2 191 ? -9.458 16.007 -35.738 1.00 71.90 191 B 1 +ATOM 5884 C C . THR B 2 191 ? -8.806 16.735 -34.560 1.00 73.76 191 B 1 +ATOM 5885 O O . THR B 2 191 ? -7.607 16.615 -34.348 1.00 70.68 191 B 1 +ATOM 5886 C CB . THR B 2 191 ? -9.185 16.810 -37.017 1.00 68.53 191 B 1 +ATOM 5887 O OG1 . THR B 2 191 ? -10.034 17.930 -37.086 1.00 61.41 191 B 1 +ATOM 5888 C CG2 . THR B 2 191 ? -9.444 15.975 -38.273 1.00 58.17 191 B 1 +ATOM 5889 N N . MET B 2 192 ? -9.593 17.464 -33.755 1.00 72.15 192 B 1 +ATOM 5890 C CA . MET B 2 192 ? -9.075 18.221 -32.620 1.00 72.83 192 B 1 +ATOM 5891 C C . MET B 2 192 ? -8.542 17.312 -31.503 1.00 74.34 192 B 1 +ATOM 5892 O O . MET B 2 192 ? -7.512 17.618 -30.914 1.00 72.64 192 B 1 +ATOM 5893 C CB . MET B 2 192 ? -10.160 19.166 -32.098 1.00 70.49 192 B 1 +ATOM 5894 C CG . MET B 2 192 ? -9.564 20.503 -31.677 1.00 63.00 192 B 1 +ATOM 5895 S SD . MET B 2 192 ? -10.709 21.578 -30.798 1.00 53.91 192 B 1 +ATOM 5896 C CE . MET B 2 192 ? -9.756 23.117 -30.812 1.00 47.05 192 B 1 +ATOM 5897 N N . VAL B 2 193 ? -9.199 16.172 -31.257 1.00 72.82 193 B 1 +ATOM 5898 C CA . VAL B 2 193 ? -8.734 15.177 -30.279 1.00 72.35 193 B 1 +ATOM 5899 C C . VAL B 2 193 ? -7.398 14.579 -30.713 1.00 73.97 193 B 1 +ATOM 5900 O O . VAL B 2 193 ? -6.479 14.474 -29.910 1.00 73.09 193 B 1 +ATOM 5901 C CB . VAL B 2 193 ? -9.775 14.069 -30.078 1.00 69.66 193 B 1 +ATOM 5902 C CG1 . VAL B 2 193 ? -9.291 12.985 -29.103 1.00 62.65 193 B 1 +ATOM 5903 C CG2 . VAL B 2 193 ? -11.059 14.667 -29.500 1.00 61.15 193 B 1 +ATOM 5904 N N . LEU B 2 194 ? -7.278 14.277 -32.003 1.00 73.42 194 B 1 +ATOM 5905 C CA . LEU B 2 194 ? -6.045 13.772 -32.605 1.00 74.30 194 B 1 +ATOM 5906 C C . LEU B 2 194 ? -4.888 14.772 -32.471 1.00 76.40 194 B 1 +ATOM 5907 O O . LEU B 2 194 ? -3.786 14.402 -32.070 1.00 76.74 194 B 1 +ATOM 5908 C CB . LEU B 2 194 ? -6.354 13.420 -34.066 1.00 72.69 194 B 1 +ATOM 5909 C CG . LEU B 2 194 ? -6.135 11.934 -34.363 1.00 66.91 194 B 1 +ATOM 5910 C CD1 . LEU B 2 194 ? -7.187 11.433 -35.348 1.00 60.41 194 B 1 +ATOM 5911 C CD2 . LEU B 2 194 ? -4.756 11.700 -34.939 1.00 60.14 194 B 1 +ATOM 5912 N N . ILE B 2 195 ? -5.155 16.059 -32.706 1.00 74.83 195 B 1 +ATOM 5913 C CA . ILE B 2 195 ? -4.175 17.132 -32.523 1.00 76.29 195 B 1 +ATOM 5914 C C . ILE B 2 195 ? -3.762 17.246 -31.050 1.00 77.57 195 B 1 +ATOM 5915 O O . ILE B 2 195 ? -2.575 17.365 -30.754 1.00 77.62 195 B 1 +ATOM 5916 C CB . ILE B 2 195 ? -4.718 18.468 -33.066 1.00 76.41 195 B 1 +ATOM 5917 C CG1 . ILE B 2 195 ? -4.866 18.403 -34.602 1.00 71.32 195 B 1 +ATOM 5918 C CG2 . ILE B 2 195 ? -3.790 19.646 -32.692 1.00 68.82 195 B 1 +ATOM 5919 C CD1 . ILE B 2 195 ? -5.729 19.533 -35.192 1.00 62.47 195 B 1 +ATOM 5920 N N . CYS B 2 196 ? -4.719 17.171 -30.113 1.00 77.58 196 B 1 +ATOM 5921 C CA . CYS B 2 196 ? -4.421 17.172 -28.683 1.00 76.72 196 B 1 +ATOM 5922 C C . CYS B 2 196 ? -3.538 15.983 -28.280 1.00 77.43 196 B 1 +ATOM 5923 O O . CYS B 2 196 ? -2.564 16.178 -27.553 1.00 77.40 196 B 1 +ATOM 5924 C CB . CYS B 2 196 ? -5.727 17.169 -27.882 1.00 74.93 196 B 1 +ATOM 5925 S SG . CYS B 2 196 ? -6.468 18.832 -27.886 1.00 63.84 196 B 1 +ATOM 5926 N N . LEU B 2 197 ? -3.828 14.793 -28.812 1.00 75.85 197 B 1 +ATOM 5927 C CA . LEU B 2 197 ? -3.055 13.574 -28.557 1.00 75.71 197 B 1 +ATOM 5928 C C . LEU B 2 197 ? -1.612 13.698 -29.064 1.00 77.03 197 B 1 +ATOM 5929 O O . LEU B 2 197 ? -0.676 13.438 -28.316 1.00 77.58 197 B 1 +ATOM 5930 C CB . LEU B 2 197 ? -3.794 12.389 -29.209 1.00 74.31 197 B 1 +ATOM 5931 C CG . LEU B 2 197 ? -4.166 11.291 -28.196 1.00 68.09 197 B 1 +ATOM 5932 C CD1 . LEU B 2 197 ? -5.453 10.591 -28.626 1.00 61.52 197 B 1 +ATOM 5933 C CD2 . LEU B 2 197 ? -3.052 10.267 -28.081 1.00 61.07 197 B 1 +ATOM 5934 N N . ILE B 2 198 ? -1.446 14.176 -30.292 1.00 76.56 198 B 1 +ATOM 5935 C CA . ILE B 2 198 ? -0.123 14.430 -30.881 1.00 78.04 198 B 1 +ATOM 5936 C C . ILE B 2 198 ? 0.637 15.486 -30.078 1.00 79.57 198 B 1 +ATOM 5937 O O . ILE B 2 198 ? 1.800 15.292 -29.741 1.00 80.33 198 B 1 +ATOM 5938 C CB . ILE B 2 198 ? -0.285 14.835 -32.366 1.00 77.98 198 B 1 +ATOM 5939 C CG1 . ILE B 2 198 ? -0.790 13.637 -33.190 1.00 73.53 198 B 1 +ATOM 5940 C CG2 . ILE B 2 198 ? 1.043 15.349 -32.950 1.00 71.41 198 B 1 +ATOM 5941 C CD1 . ILE B 2 198 ? -1.275 14.015 -34.594 1.00 65.34 198 B 1 +ATOM 5942 N N . THR B 2 199 ? -0.024 16.589 -29.724 1.00 80.81 199 B 1 +ATOM 5943 C CA . THR B 2 199 ? 0.596 17.678 -28.963 1.00 80.23 199 B 1 +ATOM 5944 C C . THR B 2 199 ? 1.021 17.210 -27.569 1.00 80.00 199 B 1 +ATOM 5945 O O . THR B 2 199 ? 2.136 17.501 -27.134 1.00 80.30 199 B 1 +ATOM 5946 C CB . THR B 2 199 ? -0.360 18.881 -28.833 1.00 80.16 199 B 1 +ATOM 5947 O OG1 . THR B 2 199 ? -0.852 19.260 -30.092 1.00 70.74 199 B 1 +ATOM 5948 C CG2 . THR B 2 199 ? 0.350 20.109 -28.257 1.00 67.46 199 B 1 +ATOM 5949 N N . MET B 2 200 ? 0.166 16.436 -26.885 1.00 80.01 200 B 1 +ATOM 5950 C CA . MET B 2 200 ? 0.471 15.865 -25.572 1.00 78.88 200 B 1 +ATOM 5951 C C . MET B 2 200 ? 1.652 14.897 -25.645 1.00 79.98 200 B 1 +ATOM 5952 O O . MET B 2 200 ? 2.560 14.978 -24.821 1.00 79.61 200 B 1 +ATOM 5953 C CB . MET B 2 200 ? -0.781 15.196 -25.006 1.00 76.03 200 B 1 +ATOM 5954 C CG . MET B 2 200 ? -0.608 14.829 -23.531 1.00 65.82 200 B 1 +ATOM 5955 S SD . MET B 2 200 ? -2.039 13.998 -22.780 1.00 59.17 200 B 1 +ATOM 5956 C CE . MET B 2 200 ? -3.256 15.337 -22.751 1.00 51.22 200 B 1 +ATOM 5957 N N . PHE B 2 201 ? 1.681 14.038 -26.672 1.00 79.52 201 B 1 +ATOM 5958 C CA . PHE B 2 201 ? 2.803 13.125 -26.904 1.00 79.42 201 B 1 +ATOM 5959 C C . PHE B 2 201 ? 4.116 13.874 -27.092 1.00 80.95 201 B 1 +ATOM 5960 O O . PHE B 2 201 ? 5.076 13.595 -26.390 1.00 81.57 201 B 1 +ATOM 5961 C CB . PHE B 2 201 ? 2.517 12.244 -28.106 1.00 77.54 201 B 1 +ATOM 5962 C CG . PHE B 2 201 ? 3.645 11.282 -28.423 1.00 74.48 201 B 1 +ATOM 5963 C CD1 . PHE B 2 201 ? 4.630 11.623 -29.359 1.00 65.43 201 B 1 +ATOM 5964 C CD2 . PHE B 2 201 ? 3.694 10.030 -27.798 1.00 64.77 201 B 1 +ATOM 5965 C CE1 . PHE B 2 201 ? 5.640 10.699 -29.700 1.00 61.73 201 B 1 +ATOM 5966 C CE2 . PHE B 2 201 ? 4.692 9.102 -28.136 1.00 60.54 201 B 1 +ATOM 5967 C CZ . PHE B 2 201 ? 5.669 9.425 -29.095 1.00 64.73 201 B 1 +ATOM 5968 N N . PHE B 2 202 ? 4.157 14.860 -28.017 1.00 80.93 202 B 1 +ATOM 5969 C CA . PHE B 2 202 ? 5.374 15.635 -28.257 1.00 82.59 202 B 1 +ATOM 5970 C C . PHE B 2 202 ? 5.810 16.411 -27.019 1.00 83.76 202 B 1 +ATOM 5971 O O . PHE B 2 202 ? 7.006 16.470 -26.725 1.00 83.19 202 B 1 +ATOM 5972 C CB . PHE B 2 202 ? 5.190 16.568 -29.455 1.00 81.09 202 B 1 +ATOM 5973 C CG . PHE B 2 202 ? 5.528 15.904 -30.767 1.00 76.72 202 B 1 +ATOM 5974 C CD1 . PHE B 2 202 ? 6.872 15.667 -31.111 1.00 68.22 202 B 1 +ATOM 5975 C CD2 . PHE B 2 202 ? 4.518 15.486 -31.637 1.00 67.61 202 B 1 +ATOM 5976 C CE1 . PHE B 2 202 ? 7.192 15.026 -32.311 1.00 65.40 202 B 1 +ATOM 5977 C CE2 . PHE B 2 202 ? 4.832 14.845 -32.840 1.00 63.26 202 B 1 +ATOM 5978 C CZ . PHE B 2 202 ? 6.172 14.612 -33.175 1.00 68.48 202 B 1 +ATOM 5979 N N . THR B 2 203 ? 4.868 16.954 -26.250 1.00 82.79 203 B 1 +ATOM 5980 C CA . THR B 2 203 ? 5.157 17.661 -25.000 1.00 82.37 203 B 1 +ATOM 5981 C C . THR B 2 203 ? 5.795 16.719 -23.979 1.00 82.26 203 B 1 +ATOM 5982 O O . THR B 2 203 ? 6.847 17.036 -23.421 1.00 82.32 203 B 1 +ATOM 5983 C CB . THR B 2 203 ? 3.899 18.311 -24.408 1.00 82.19 203 B 1 +ATOM 5984 O OG1 . THR B 2 203 ? 3.274 19.136 -25.362 1.00 71.99 203 B 1 +ATOM 5985 C CG2 . THR B 2 203 ? 4.227 19.213 -23.215 1.00 68.50 203 B 1 +ATOM 5986 N N . MET B 2 204 ? 5.215 15.523 -23.782 1.00 81.12 204 B 1 +ATOM 5987 C CA . MET B 2 204 ? 5.782 14.496 -22.902 1.00 80.31 204 B 1 +ATOM 5988 C C . MET B 2 204 ? 7.164 14.038 -23.368 1.00 81.52 204 B 1 +ATOM 5989 O O . MET B 2 204 ? 8.057 13.861 -22.552 1.00 81.79 204 B 1 +ATOM 5990 C CB . MET B 2 204 ? 4.824 13.294 -22.847 1.00 78.71 204 B 1 +ATOM 5991 C CG . MET B 2 204 ? 3.599 13.538 -21.973 1.00 70.13 204 B 1 +ATOM 5992 S SD . MET B 2 204 ? 3.950 13.458 -20.191 1.00 62.56 204 B 1 +ATOM 5993 C CE . MET B 2 204 ? 2.255 13.367 -19.559 1.00 54.04 204 B 1 +ATOM 5994 N N . LEU B 2 205 ? 7.355 13.877 -24.671 1.00 81.75 205 B 1 +ATOM 5995 C CA . LEU B 2 205 ? 8.606 13.422 -25.263 1.00 81.18 205 B 1 +ATOM 5996 C C . LEU B 2 205 ? 9.722 14.459 -25.097 1.00 81.78 205 B 1 +ATOM 5997 O O . LEU B 2 205 ? 10.841 14.117 -24.716 1.00 81.97 205 B 1 +ATOM 5998 C CB . LEU B 2 205 ? 8.338 13.057 -26.733 1.00 79.70 205 B 1 +ATOM 5999 C CG . LEU B 2 205 ? 9.038 11.762 -27.204 1.00 73.08 205 B 1 +ATOM 6000 C CD1 . LEU B 2 205 ? 8.251 11.149 -28.363 1.00 64.79 205 B 1 +ATOM 6001 C CD2 . LEU B 2 205 ? 10.451 12.014 -27.687 1.00 65.41 205 B 1 +ATOM 6002 N N . VAL B 2 206 ? 9.403 15.740 -25.282 1.00 83.47 206 B 1 +ATOM 6003 C CA . VAL B 2 206 ? 10.323 16.855 -25.014 1.00 83.88 206 B 1 +ATOM 6004 C C . VAL B 2 206 ? 10.670 16.918 -23.530 1.00 83.44 206 B 1 +ATOM 6005 O O . VAL B 2 206 ? 11.839 17.089 -23.175 1.00 83.70 206 B 1 +ATOM 6006 C CB . VAL B 2 206 ? 9.729 18.187 -25.510 1.00 83.74 206 B 1 +ATOM 6007 C CG1 . VAL B 2 206 ? 10.559 19.402 -25.063 1.00 74.54 206 B 1 +ATOM 6008 C CG2 . VAL B 2 206 ? 9.696 18.222 -27.038 1.00 73.58 206 B 1 +ATOM 6009 N N . LEU B 2 207 ? 9.682 16.745 -22.663 1.00 82.90 207 B 1 +ATOM 6010 C CA . LEU B 2 207 ? 9.885 16.757 -21.213 1.00 82.61 207 B 1 +ATOM 6011 C C . LEU B 2 207 ? 10.777 15.596 -20.766 1.00 82.81 207 B 1 +ATOM 6012 O O . LEU B 2 207 ? 11.725 15.800 -20.007 1.00 83.04 207 B 1 +ATOM 6013 C CB . LEU B 2 207 ? 8.508 16.752 -20.527 1.00 82.46 207 B 1 +ATOM 6014 C CG . LEU B 2 207 ? 8.440 17.648 -19.274 1.00 73.04 207 B 1 +ATOM 6015 C CD1 . LEU B 2 207 ? 7.140 18.447 -19.259 1.00 63.73 207 B 1 +ATOM 6016 C CD2 . LEU B 2 207 ? 8.510 16.816 -17.993 1.00 65.28 207 B 1 +ATOM 6017 N N . MET B 2 208 ? 10.554 14.393 -21.314 1.00 81.86 208 B 1 +ATOM 6018 C CA . MET B 2 208 ? 11.413 13.230 -21.081 1.00 80.82 208 B 1 +ATOM 6019 C C . MET B 2 208 ? 12.834 13.452 -21.603 1.00 80.93 208 B 1 +ATOM 6020 O O . MET B 2 208 ? 13.793 13.174 -20.894 1.00 81.07 208 B 1 +ATOM 6021 C CB . MET B 2 208 ? 10.817 11.981 -21.732 1.00 79.98 208 B 1 +ATOM 6022 C CG . MET B 2 208 ? 10.442 10.954 -20.664 1.00 72.83 208 B 1 +ATOM 6023 S SD . MET B 2 208 ? 10.112 9.291 -21.286 1.00 68.21 208 B 1 +ATOM 6024 C CE . MET B 2 208 ? 8.548 9.559 -22.122 1.00 58.97 208 B 1 +ATOM 6025 N N . ALA B 2 209 ? 12.967 13.964 -22.814 1.00 81.19 209 B 1 +ATOM 6026 C CA . ALA B 2 209 ? 14.258 14.256 -23.404 1.00 79.98 209 B 1 +ATOM 6027 C C . ALA B 2 209 ? 15.042 15.289 -22.577 1.00 80.45 209 B 1 +ATOM 6028 O O . ALA B 2 209 ? 16.226 15.098 -22.338 1.00 79.69 209 B 1 +ATOM 6029 C CB . ALA B 2 209 ? 14.057 14.714 -24.847 1.00 78.91 209 B 1 +ATOM 6030 N N . SER B 2 210 ? 14.375 16.342 -22.085 1.00 81.35 210 B 1 +ATOM 6031 C CA . SER B 2 210 ? 15.009 17.352 -21.238 1.00 81.24 210 B 1 +ATOM 6032 C C . SER B 2 210 ? 15.469 16.768 -19.899 1.00 81.14 210 B 1 +ATOM 6033 O O . SER B 2 210 ? 16.623 16.964 -19.524 1.00 81.32 210 B 1 +ATOM 6034 C CB . SER B 2 210 ? 14.081 18.554 -21.039 1.00 81.65 210 B 1 +ATOM 6035 O OG . SER B 2 210 ? 12.998 18.266 -20.192 1.00 70.81 210 B 1 +ATOM 6036 N N . LEU B 2 211 ? 14.620 15.972 -19.241 1.00 80.95 211 B 1 +ATOM 6037 C CA . LEU B 2 211 ? 14.975 15.236 -18.023 1.00 79.87 211 B 1 +ATOM 6038 C C . LEU B 2 211 ? 16.146 14.287 -18.255 1.00 79.37 211 B 1 +ATOM 6039 O O . LEU B 2 211 ? 17.073 14.225 -17.449 1.00 78.75 211 B 1 +ATOM 6040 C CB . LEU B 2 211 ? 13.750 14.435 -17.525 1.00 79.89 211 B 1 +ATOM 6041 C CG . LEU B 2 211 ? 12.853 15.226 -16.555 1.00 75.00 211 B 1 +ATOM 6042 C CD1 . LEU B 2 211 ? 11.470 14.595 -16.479 1.00 66.13 211 B 1 +ATOM 6043 C CD2 . LEU B 2 211 ? 13.453 15.221 -15.144 1.00 67.10 211 B 1 +ATOM 6044 N N . TYR B 2 212 ? 16.133 13.577 -19.389 1.00 80.57 212 B 1 +ATOM 6045 C CA . TYR B 2 212 ? 17.167 12.623 -19.739 1.00 78.15 212 B 1 +ATOM 6046 C C . TYR B 2 212 ? 18.508 13.307 -20.027 1.00 78.36 212 B 1 +ATOM 6047 O O . TYR B 2 212 ? 19.541 12.887 -19.507 1.00 77.68 212 B 1 +ATOM 6048 C CB . TYR B 2 212 ? 16.674 11.787 -20.926 1.00 75.63 212 B 1 +ATOM 6049 C CG . TYR B 2 212 ? 17.591 10.617 -21.157 1.00 69.86 212 B 1 +ATOM 6050 C CD1 . TYR B 2 212 ? 18.644 10.726 -22.070 1.00 62.11 212 B 1 +ATOM 6051 C CD2 . TYR B 2 212 ? 17.478 9.488 -20.334 1.00 61.64 212 B 1 +ATOM 6052 C CE1 . TYR B 2 212 ? 19.635 9.746 -22.112 1.00 57.07 212 B 1 +ATOM 6053 C CE2 . TYR B 2 212 ? 18.473 8.507 -20.366 1.00 56.42 212 B 1 +ATOM 6054 C CZ . TYR B 2 212 ? 19.565 8.659 -21.230 1.00 58.16 212 B 1 +ATOM 6055 O OH . TYR B 2 212 ? 20.607 7.796 -21.170 1.00 54.91 212 B 1 +ATOM 6056 N N . VAL B 2 213 ? 18.498 14.391 -20.787 1.00 78.16 213 B 1 +ATOM 6057 C CA . VAL B 2 213 ? 19.695 15.194 -21.053 1.00 78.21 213 B 1 +ATOM 6058 C C . VAL B 2 213 ? 20.248 15.778 -19.757 1.00 78.18 213 B 1 +ATOM 6059 O O . VAL B 2 213 ? 21.456 15.714 -19.526 1.00 78.16 213 B 1 +ATOM 6060 C CB . VAL B 2 213 ? 19.392 16.310 -22.077 1.00 79.04 213 B 1 +ATOM 6061 C CG1 . VAL B 2 213 ? 20.544 17.317 -22.208 1.00 72.44 213 B 1 +ATOM 6062 C CG2 . VAL B 2 213 ? 19.166 15.709 -23.472 1.00 72.91 213 B 1 +ATOM 6063 N N . HIS B 2 214 ? 19.369 16.264 -18.878 1.00 80.06 214 B 1 +ATOM 6064 C CA . HIS B 2 214 ? 19.781 16.794 -17.583 1.00 78.77 214 B 1 +ATOM 6065 C C . HIS B 2 214 ? 20.384 15.706 -16.690 1.00 77.84 214 B 1 +ATOM 6066 O O . HIS B 2 214 ? 21.475 15.902 -16.144 1.00 77.68 214 B 1 +ATOM 6067 C CB . HIS B 2 214 ? 18.598 17.508 -16.923 1.00 78.72 214 B 1 +ATOM 6068 C CG . HIS B 2 214 ? 19.036 18.484 -15.880 1.00 74.29 214 B 1 +ATOM 6069 N ND1 . HIS B 2 214 ? 19.739 19.651 -16.105 1.00 63.05 214 B 1 +ATOM 6070 C CD2 . HIS B 2 214 ? 18.827 18.413 -14.530 1.00 63.19 214 B 1 +ATOM 6071 C CE1 . HIS B 2 214 ? 19.939 20.256 -14.916 1.00 62.64 214 B 1 +ATOM 6072 N NE2 . HIS B 2 214 ? 19.399 19.536 -13.941 1.00 63.21 214 B 1 +ATOM 6073 N N . MET B 2 215 ? 19.764 14.524 -16.623 1.00 78.18 215 B 1 +ATOM 6074 C CA . MET B 2 215 ? 20.339 13.357 -15.949 1.00 75.60 215 B 1 +ATOM 6075 C C . MET B 2 215 ? 21.712 13.000 -16.499 1.00 73.80 215 B 1 +ATOM 6076 O O . MET B 2 215 ? 22.632 12.767 -15.729 1.00 73.14 215 B 1 +ATOM 6077 C CB . MET B 2 215 ? 19.446 12.124 -16.099 1.00 75.01 215 B 1 +ATOM 6078 C CG . MET B 2 215 ? 18.459 11.964 -14.955 1.00 69.48 215 B 1 +ATOM 6079 S SD . MET B 2 215 ? 17.630 10.353 -14.920 1.00 66.81 215 B 1 +ATOM 6080 C CE . MET B 2 215 ? 16.486 10.566 -16.287 1.00 58.77 215 B 1 +ATOM 6081 N N . PHE B 2 216 ? 21.858 12.945 -17.822 1.00 75.92 216 B 1 +ATOM 6082 C CA . PHE B 2 216 ? 23.104 12.529 -18.447 1.00 73.84 216 B 1 +ATOM 6083 C C . PHE B 2 216 ? 24.235 13.540 -18.208 1.00 73.23 216 B 1 +ATOM 6084 O O . PHE B 2 216 ? 25.353 13.150 -17.892 1.00 72.60 216 B 1 +ATOM 6085 C CB . PHE B 2 216 ? 22.859 12.293 -19.943 1.00 72.01 216 B 1 +ATOM 6086 C CG . PHE B 2 216 ? 23.948 11.457 -20.567 1.00 66.24 216 B 1 +ATOM 6087 C CD1 . PHE B 2 216 ? 25.059 12.053 -21.184 1.00 59.29 216 B 1 +ATOM 6088 C CD2 . PHE B 2 216 ? 23.853 10.041 -20.518 1.00 58.14 216 B 1 +ATOM 6089 C CE1 . PHE B 2 216 ? 26.076 11.253 -21.753 1.00 53.56 216 B 1 +ATOM 6090 C CE2 . PHE B 2 216 ? 24.864 9.247 -21.083 1.00 52.41 216 B 1 +ATOM 6091 C CZ . PHE B 2 216 ? 25.962 9.854 -21.703 1.00 53.38 216 B 1 +ATOM 6092 N N . LEU B 2 217 ? 23.936 14.832 -18.295 1.00 74.78 217 B 1 +ATOM 6093 C CA . LEU B 2 217 ? 24.894 15.892 -18.012 1.00 74.76 217 B 1 +ATOM 6094 C C . LEU B 2 217 ? 25.350 15.878 -16.556 1.00 73.09 217 B 1 +ATOM 6095 O O . LEU B 2 217 ? 26.555 15.891 -16.281 1.00 72.97 217 B 1 +ATOM 6096 C CB . LEU B 2 217 ? 24.270 17.256 -18.364 1.00 76.67 217 B 1 +ATOM 6097 C CG . LEU B 2 217 ? 24.168 17.541 -19.873 1.00 72.60 217 B 1 +ATOM 6098 C CD1 . LEU B 2 217 ? 23.343 18.798 -20.097 1.00 66.67 217 B 1 +ATOM 6099 C CD2 . LEU B 2 217 ? 25.549 17.757 -20.504 1.00 67.51 217 B 1 +ATOM 6100 N N . LEU B 2 218 ? 24.395 15.766 -15.608 1.00 72.87 218 B 1 +ATOM 6101 C CA . LEU B 2 218 ? 24.694 15.756 -14.177 1.00 70.40 218 B 1 +ATOM 6102 C C . LEU B 2 218 ? 25.321 14.436 -13.724 1.00 69.74 218 B 1 +ATOM 6103 O O . LEU B 2 218 ? 26.276 14.464 -12.958 1.00 67.25 218 B 1 +ATOM 6104 C CB . LEU B 2 218 ? 23.424 16.125 -13.401 1.00 68.66 218 B 1 +ATOM 6105 C CG . LEU B 2 218 ? 23.177 17.643 -13.375 1.00 62.40 218 B 1 +ATOM 6106 C CD1 . LEU B 2 218 ? 21.726 17.972 -13.092 1.00 57.18 218 B 1 +ATOM 6107 C CD2 . LEU B 2 218 ? 24.033 18.317 -12.300 1.00 56.72 218 B 1 +ATOM 6108 N N . ALA B 2 219 ? 24.892 13.293 -14.268 1.00 69.64 219 B 1 +ATOM 6109 C CA . ALA B 2 219 ? 25.543 12.014 -14.026 1.00 67.26 219 B 1 +ATOM 6110 C C . ALA B 2 219 ? 26.981 12.011 -14.553 1.00 66.93 219 B 1 +ATOM 6111 O O . ALA B 2 219 ? 27.877 11.465 -13.916 1.00 64.80 219 B 1 +ATOM 6112 C CB . ALA B 2 219 ? 24.731 10.882 -14.669 1.00 64.34 219 B 1 +ATOM 6113 N N . ARG B 2 220 ? 27.242 12.675 -15.680 1.00 69.68 220 B 1 +ATOM 6114 C CA . ARG B 2 220 ? 28.604 12.837 -16.212 1.00 69.65 220 B 1 +ATOM 6115 C C . ARG B 2 220 ? 29.450 13.746 -15.328 1.00 69.08 220 B 1 +ATOM 6116 O O . ARG B 2 220 ? 30.636 13.472 -15.166 1.00 68.52 220 B 1 +ATOM 6117 C CB . ARG B 2 220 ? 28.521 13.342 -17.652 1.00 68.50 220 B 1 +ATOM 6118 C CG . ARG B 2 220 ? 29.845 13.179 -18.415 1.00 61.38 220 B 1 +ATOM 6119 C CD . ARG B 2 220 ? 29.692 13.681 -19.848 1.00 58.52 220 B 1 +ATOM 6120 N NE . ARG B 2 220 ? 30.890 13.413 -20.658 1.00 51.99 220 B 1 +ATOM 6121 C CZ . ARG B 2 220 ? 31.092 13.794 -21.923 1.00 46.70 220 B 1 +ATOM 6122 N NH1 . ARG B 2 220 ? 30.207 14.500 -22.559 1.00 42.45 220 B 1 +ATOM 6123 N NH2 . ARG B 2 220 ? 32.172 13.462 -22.556 1.00 41.34 220 B 1 +ATOM 6124 N N . GLN B 2 221 ? 28.884 14.801 -14.748 1.00 69.68 221 B 1 +ATOM 6125 C CA . GLN B 2 221 ? 29.575 15.633 -13.755 1.00 68.93 221 B 1 +ATOM 6126 C C . GLN B 2 221 ? 29.830 14.863 -12.458 1.00 68.39 221 B 1 +ATOM 6127 O O . GLN B 2 221 ? 30.938 14.911 -11.936 1.00 65.15 221 B 1 +ATOM 6128 C CB . GLN B 2 221 ? 28.776 16.899 -13.445 1.00 67.97 221 B 1 +ATOM 6129 C CG . GLN B 2 221 ? 28.981 17.998 -14.497 1.00 62.68 221 B 1 +ATOM 6130 C CD . GLN B 2 221 ? 28.305 19.316 -14.092 1.00 58.64 221 B 1 +ATOM 6131 O OE1 . GLN B 2 221 ? 27.523 19.377 -13.163 1.00 53.16 221 B 1 +ATOM 6132 N NE2 . GLN B 2 221 ? 28.600 20.405 -14.757 1.00 50.52 221 B 1 +ATOM 6133 N N . HIS B 2 222 ? 28.838 14.108 -11.963 1.00 66.91 222 B 1 +ATOM 6134 C CA . HIS B 2 222 ? 28.989 13.261 -10.782 1.00 63.53 222 B 1 +ATOM 6135 C C . HIS B 2 222 ? 30.017 12.160 -11.020 1.00 62.70 222 B 1 +ATOM 6136 O O . HIS B 2 222 ? 30.933 12.008 -10.213 1.00 61.25 222 B 1 +ATOM 6137 C CB . HIS B 2 222 ? 27.629 12.692 -10.344 1.00 60.21 222 B 1 +ATOM 6138 C CG . HIS B 2 222 ? 27.183 13.247 -9.031 1.00 56.27 222 B 1 +ATOM 6139 N ND1 . HIS B 2 222 ? 26.752 14.535 -8.788 1.00 50.96 222 B 1 +ATOM 6140 C CD2 . HIS B 2 222 ? 27.165 12.605 -7.820 1.00 50.16 222 B 1 +ATOM 6141 C CE1 . HIS B 2 222 ? 26.477 14.652 -7.477 1.00 47.18 222 B 1 +ATOM 6142 N NE2 . HIS B 2 222 ? 26.721 13.498 -6.858 1.00 46.88 222 B 1 +ATOM 6143 N N . MET B 2 223 ? 29.986 11.473 -12.166 1.00 64.34 223 B 1 +ATOM 6144 C CA . MET B 2 223 ? 31.033 10.522 -12.549 1.00 62.62 223 B 1 +ATOM 6145 C C . MET B 2 223 ? 32.412 11.172 -12.587 1.00 61.90 223 B 1 +ATOM 6146 O O . MET B 2 223 ? 33.352 10.555 -12.127 1.00 59.99 223 B 1 +ATOM 6147 C CB . MET B 2 223 ? 30.777 9.892 -13.916 1.00 60.39 223 B 1 +ATOM 6148 C CG . MET B 2 223 ? 30.010 8.594 -13.823 1.00 55.83 223 B 1 +ATOM 6149 S SD . MET B 2 223 ? 30.092 7.632 -15.369 1.00 51.76 223 B 1 +ATOM 6150 C CE . MET B 2 223 ? 28.874 8.539 -16.357 1.00 47.45 223 B 1 +ATOM 6151 N N . LYS B 2 224 ? 32.536 12.379 -13.108 1.00 67.56 224 B 1 +ATOM 6152 C CA . LYS B 2 224 ? 33.830 13.077 -13.113 1.00 67.25 224 B 1 +ATOM 6153 C C . LYS B 2 224 ? 34.308 13.384 -11.696 1.00 65.13 224 B 1 +ATOM 6154 O O . LYS B 2 224 ? 35.484 13.209 -11.424 1.00 63.22 224 B 1 +ATOM 6155 C CB . LYS B 2 224 ? 33.772 14.363 -13.945 1.00 67.55 224 B 1 +ATOM 6156 C CG . LYS B 2 224 ? 33.930 14.096 -15.446 1.00 62.43 224 B 1 +ATOM 6157 C CD . LYS B 2 224 ? 33.971 15.436 -16.183 1.00 59.34 224 B 1 +ATOM 6158 C CE . LYS B 2 224 ? 34.262 15.251 -17.678 1.00 51.56 224 B 1 +ATOM 6159 N NZ . LYS B 2 224 ? 34.472 16.557 -18.345 1.00 46.19 224 B 1 +ATOM 6160 N N . ARG B 2 225 ? 33.427 13.822 -10.804 1.00 62.64 225 B 1 +ATOM 6161 C CA . ARG B 2 225 ? 33.774 14.058 -9.395 1.00 60.43 225 B 1 +ATOM 6162 C C . ARG B 2 225 ? 34.160 12.770 -8.676 1.00 58.74 225 B 1 +ATOM 6163 O O . ARG B 2 225 ? 35.144 12.764 -7.955 1.00 57.15 225 B 1 +ATOM 6164 C CB . ARG B 2 225 ? 32.628 14.758 -8.646 1.00 58.73 225 B 1 +ATOM 6165 C CG . ARG B 2 225 ? 32.690 16.283 -8.805 1.00 54.15 225 B 1 +ATOM 6166 C CD . ARG B 2 225 ? 31.612 16.927 -7.933 1.00 52.13 225 B 1 +ATOM 6167 N NE . ARG B 2 225 ? 31.757 18.391 -7.865 1.00 46.28 225 B 1 +ATOM 6168 C CZ . ARG B 2 225 ? 30.956 19.229 -7.211 1.00 42.12 225 B 1 +ATOM 6169 N NH1 . ARG B 2 225 ? 29.893 18.793 -6.578 1.00 39.30 225 B 1 +ATOM 6170 N NH2 . ARG B 2 225 ? 31.214 20.505 -7.184 1.00 37.89 225 B 1 +ATOM 6171 N N . ILE B 2 226 ? 33.413 11.681 -8.908 1.00 57.64 226 B 1 +ATOM 6172 C CA . ILE B 2 226 ? 33.649 10.404 -8.234 1.00 55.59 226 B 1 +ATOM 6173 C C . ILE B 2 226 ? 34.818 9.640 -8.869 1.00 55.18 226 B 1 +ATOM 6174 O O . ILE B 2 226 ? 35.581 9.018 -8.147 1.00 52.45 226 B 1 +ATOM 6175 C CB . ILE B 2 226 ? 32.344 9.589 -8.173 1.00 52.38 226 B 1 +ATOM 6176 C CG1 . ILE B 2 226 ? 31.338 10.347 -7.267 1.00 49.16 226 B 1 +ATOM 6177 C CG2 . ILE B 2 226 ? 32.598 8.170 -7.625 1.00 48.92 226 B 1 +ATOM 6178 C CD1 . ILE B 2 226 ? 29.913 9.831 -7.355 1.00 45.90 226 B 1 +ATOM 6179 N N . ALA B 2 227 ? 35.032 9.747 -10.178 1.00 57.08 227 B 1 +ATOM 6180 C CA . ALA B 2 227 ? 36.236 9.233 -10.814 1.00 57.11 227 B 1 +ATOM 6181 C C . ALA B 2 227 ? 37.500 9.997 -10.386 1.00 56.15 227 B 1 +ATOM 6182 O O . ALA B 2 227 ? 38.596 9.440 -10.451 1.00 54.04 227 B 1 +ATOM 6183 C CB . ALA B 2 227 ? 36.067 9.271 -12.338 1.00 55.90 227 B 1 +ATOM 6184 N N . ALA B 2 228 ? 37.367 11.245 -9.943 1.00 57.15 228 B 1 +ATOM 6185 C CA . ALA B 2 228 ? 38.456 11.992 -9.323 1.00 57.01 228 B 1 +ATOM 6186 C C . ALA B 2 228 ? 38.724 11.552 -7.872 1.00 55.59 228 B 1 +ATOM 6187 O O . ALA B 2 228 ? 39.817 11.791 -7.361 1.00 52.65 228 B 1 +ATOM 6188 C CB . ALA B 2 228 ? 38.143 13.492 -9.411 1.00 55.43 228 B 1 +ATOM 6189 N N . LEU B 2 229 ? 37.748 10.872 -7.221 1.00 49.97 229 B 1 +ATOM 6190 C CA . LEU B 2 229 ? 37.964 10.198 -5.948 1.00 48.62 229 B 1 +ATOM 6191 C C . LEU B 2 229 ? 38.538 8.800 -6.242 1.00 48.13 229 B 1 +ATOM 6192 O O . LEU B 2 229 ? 37.887 8.005 -6.918 1.00 45.12 229 B 1 +ATOM 6193 C CB . LEU B 2 229 ? 36.643 10.140 -5.159 1.00 45.04 229 B 1 +ATOM 6194 C CG . LEU B 2 229 ? 36.312 11.476 -4.459 1.00 41.47 229 B 1 +ATOM 6195 C CD1 . LEU B 2 229 ? 34.829 11.563 -4.132 1.00 38.60 229 B 1 +ATOM 6196 C CD2 . LEU B 2 229 ? 37.103 11.622 -3.154 1.00 40.10 229 B 1 +ATOM 6197 N N . PRO B 2 230 ? 39.747 8.459 -5.755 1.00 41.32 230 B 1 +ATOM 6198 C CA . PRO B 2 230 ? 40.462 7.245 -6.141 1.00 42.00 230 B 1 +ATOM 6199 C C . PRO B 2 230 ? 39.802 5.943 -5.671 1.00 43.66 230 B 1 +ATOM 6200 O O . PRO B 2 230 ? 40.238 4.856 -6.034 1.00 41.27 230 B 1 +ATOM 6201 C CB . PRO B 2 230 ? 41.863 7.416 -5.553 1.00 38.24 230 B 1 +ATOM 6202 C CG . PRO B 2 230 ? 41.656 8.356 -4.365 1.00 38.02 230 B 1 +ATOM 6203 C CD . PRO B 2 230 ? 40.533 9.269 -4.841 1.00 41.28 230 B 1 +ATOM 6204 N N . GLY B 2 231 ? 38.765 6.031 -4.820 1.00 36.61 231 B 1 +ATOM 6205 C CA . GLY B 2 231 ? 38.096 4.886 -4.228 1.00 37.26 231 B 1 +ATOM 6206 C C . GLY B 2 231 ? 37.155 4.155 -5.183 1.00 38.34 231 B 1 +ATOM 6207 O O . GLY B 2 231 ? 36.669 4.697 -6.168 1.00 35.88 231 B 1 +ATOM 6208 N N . ASN B 2 232 ? 36.855 2.895 -4.842 1.00 38.31 232 B 1 +ATOM 6209 C CA . ASN B 2 232 ? 35.841 2.100 -5.530 1.00 39.13 232 B 1 +ATOM 6210 C C . ASN B 2 232 ? 34.506 2.853 -5.529 1.00 40.33 232 B 1 +ATOM 6211 O O . ASN B 2 232 ? 33.913 3.055 -4.473 1.00 37.38 232 B 1 +ATOM 6212 C CB . ASN B 2 232 ? 35.698 0.732 -4.846 1.00 35.26 232 B 1 +ATOM 6213 C CG . ASN B 2 232 ? 36.672 -0.311 -5.366 1.00 31.83 232 B 1 +ATOM 6214 O OD1 . ASN B 2 232 ? 37.044 -0.323 -6.528 1.00 29.89 232 B 1 +ATOM 6215 N ND2 . ASN B 2 232 ? 37.074 -1.245 -4.541 1.00 29.27 232 B 1 +ATOM 6216 N N . ALA B 2 233 ? 34.019 3.217 -6.716 1.00 40.20 233 B 1 +ATOM 6217 C CA . ALA B 2 233 ? 32.699 3.801 -6.864 1.00 41.07 233 B 1 +ATOM 6218 C C . ALA B 2 233 ? 31.675 2.890 -6.149 1.00 41.75 233 B 1 +ATOM 6219 O O . ALA B 2 233 ? 31.626 1.694 -6.451 1.00 39.98 233 B 1 +ATOM 6220 C CB . ALA B 2 233 ? 32.378 3.960 -8.354 1.00 38.75 233 B 1 +ATOM 6221 N N . PRO B 2 234 ? 30.909 3.410 -5.209 1.00 42.76 234 B 1 +ATOM 6222 C CA . PRO B 2 234 ? 30.039 2.594 -4.378 1.00 43.61 234 B 1 +ATOM 6223 C C . PRO B 2 234 ? 29.080 1.782 -5.248 1.00 45.00 234 B 1 +ATOM 6224 O O . PRO B 2 234 ? 28.530 2.280 -6.235 1.00 43.15 234 B 1 +ATOM 6225 C CB . PRO B 2 234 ? 29.350 3.563 -3.407 1.00 40.46 234 B 1 +ATOM 6226 C CG . PRO B 2 234 ? 29.518 4.944 -4.048 1.00 40.67 234 B 1 +ATOM 6227 C CD . PRO B 2 234 ? 30.821 4.810 -4.826 1.00 42.37 234 B 1 +ATOM 6228 N N . ILE B 2 235 ? 28.861 0.519 -4.877 1.00 41.51 235 B 1 +ATOM 6229 C CA . ILE B 2 235 ? 28.047 -0.445 -5.645 1.00 41.87 235 B 1 +ATOM 6230 C C . ILE B 2 235 ? 26.657 0.120 -5.966 1.00 44.28 235 B 1 +ATOM 6231 O O . ILE B 2 235 ? 26.120 -0.113 -7.049 1.00 41.76 235 B 1 +ATOM 6232 C CB . ILE B 2 235 ? 27.946 -1.774 -4.855 1.00 38.11 235 B 1 +ATOM 6233 C CG1 . ILE B 2 235 ? 29.339 -2.444 -4.743 1.00 35.31 235 B 1 +ATOM 6234 C CG2 . ILE B 2 235 ? 26.942 -2.753 -5.499 1.00 34.84 235 B 1 +ATOM 6235 C CD1 . ILE B 2 235 ? 29.393 -3.645 -3.787 1.00 32.00 235 B 1 +ATOM 6236 N N . GLN B 2 236 ? 26.125 0.928 -5.066 1.00 46.86 236 B 1 +ATOM 6237 C CA . GLN B 2 236 ? 24.854 1.637 -5.211 1.00 48.23 236 B 1 +ATOM 6238 C C . GLN B 2 236 ? 24.841 2.536 -6.457 1.00 51.72 236 B 1 +ATOM 6239 O O . GLN B 2 236 ? 23.903 2.491 -7.243 1.00 50.00 236 B 1 +ATOM 6240 C CB . GLN B 2 236 ? 24.621 2.457 -3.940 1.00 44.60 236 B 1 +ATOM 6241 C CG . GLN B 2 236 ? 23.163 2.508 -3.479 1.00 40.34 236 B 1 +ATOM 6242 C CD . GLN B 2 236 ? 23.049 3.045 -2.036 1.00 36.54 236 B 1 +ATOM 6243 O OE1 . GLN B 2 236 ? 24.045 3.258 -1.374 1.00 34.88 236 B 1 +ATOM 6244 N NE2 . GLN B 2 236 ? 21.865 3.237 -1.512 1.00 33.08 236 B 1 +ATOM 6245 N N . GLN B 2 237 ? 25.915 3.270 -6.722 1.00 51.97 237 B 1 +ATOM 6246 C CA . GLN B 2 237 ? 26.006 4.129 -7.900 1.00 52.80 237 B 1 +ATOM 6247 C C . GLN B 2 237 ? 26.039 3.319 -9.195 1.00 55.75 237 B 1 +ATOM 6248 O O . GLN B 2 237 ? 25.428 3.701 -10.199 1.00 54.09 237 B 1 +ATOM 6249 C CB . GLN B 2 237 ? 27.248 5.010 -7.772 1.00 49.45 237 B 1 +ATOM 6250 C CG . GLN B 2 237 ? 27.118 6.233 -8.677 1.00 45.89 237 B 1 +ATOM 6251 C CD . GLN B 2 237 ? 28.384 7.089 -8.670 1.00 42.51 237 B 1 +ATOM 6252 O OE1 . GLN B 2 237 ? 29.431 6.680 -8.193 1.00 40.42 237 B 1 +ATOM 6253 N NE2 . GLN B 2 237 ? 28.319 8.268 -9.213 1.00 38.04 237 B 1 +ATOM 6254 N N . ARG B 2 238 ? 26.679 2.134 -9.175 1.00 54.23 238 B 1 +ATOM 6255 C CA . ARG B 2 238 ? 26.698 1.213 -10.314 1.00 55.36 238 B 1 +ATOM 6256 C C . ARG B 2 238 ? 25.317 0.606 -10.584 1.00 57.68 238 B 1 +ATOM 6257 O O . ARG B 2 238 ? 24.971 0.395 -11.738 1.00 56.10 238 B 1 +ATOM 6258 C CB . ARG B 2 238 ? 27.773 0.139 -10.064 1.00 52.50 238 B 1 +ATOM 6259 C CG . ARG B 2 238 ? 28.318 -0.436 -11.365 1.00 48.49 238 B 1 +ATOM 6260 C CD . ARG B 2 238 ? 29.406 -1.475 -11.059 1.00 44.85 238 B 1 +ATOM 6261 N NE . ARG B 2 238 ? 30.145 -1.885 -12.267 1.00 40.11 238 B 1 +ATOM 6262 C CZ . ARG B 2 238 ? 31.142 -2.743 -12.306 1.00 35.68 238 B 1 +ATOM 6263 N NH1 . ARG B 2 238 ? 31.549 -3.389 -11.241 1.00 33.07 238 B 1 +ATOM 6264 N NH2 . ARG B 2 238 ? 31.770 -2.978 -13.422 1.00 31.71 238 B 1 +ATOM 6265 N N . ALA B 2 239 ? 24.529 0.362 -9.547 1.00 54.58 239 B 1 +ATOM 6266 C CA . ALA B 2 239 ? 23.139 -0.066 -9.666 1.00 55.50 239 B 1 +ATOM 6267 C C . ALA B 2 239 ? 22.258 1.051 -10.247 1.00 59.20 239 B 1 +ATOM 6268 O O . ALA B 2 239 ? 21.537 0.820 -11.217 1.00 57.12 239 B 1 +ATOM 6269 C CB . ALA B 2 239 ? 22.643 -0.544 -8.300 1.00 51.79 239 B 1 +ATOM 6270 N N . ASN B 2 240 ? 22.402 2.280 -9.757 1.00 59.94 240 B 1 +ATOM 6271 C CA . ASN B 2 240 ? 21.689 3.450 -10.263 1.00 61.49 240 B 1 +ATOM 6272 C C . ASN B 2 240 ? 21.998 3.707 -11.744 1.00 65.42 240 B 1 +ATOM 6273 O O . ASN B 2 240 ? 21.082 3.907 -12.547 1.00 64.42 240 B 1 +ATOM 6274 C CB . ASN B 2 240 ? 22.031 4.665 -9.385 1.00 57.72 240 B 1 +ATOM 6275 C CG . ASN B 2 240 ? 21.476 4.543 -7.973 1.00 52.70 240 B 1 +ATOM 6276 O OD1 . ASN B 2 240 ? 20.715 3.650 -7.659 1.00 48.95 240 B 1 +ATOM 6277 N ND2 . ASN B 2 240 ? 21.846 5.448 -7.084 1.00 48.58 240 B 1 +ATOM 6278 N N . MET B 2 241 ? 23.268 3.583 -12.146 1.00 63.46 241 B 1 +ATOM 6279 C CA . MET B 2 241 ? 23.666 3.664 -13.547 1.00 66.03 241 B 1 +ATOM 6280 C C . MET B 2 241 ? 23.060 2.567 -14.402 1.00 70.91 241 B 1 +ATOM 6281 O O . MET B 2 241 ? 22.634 2.836 -15.519 1.00 69.15 241 B 1 +ATOM 6282 C CB . MET B 2 241 ? 25.181 3.562 -13.688 1.00 61.86 241 B 1 +ATOM 6283 C CG . MET B 2 241 ? 25.807 4.927 -13.508 1.00 55.64 241 B 1 +ATOM 6284 S SD . MET B 2 241 ? 27.551 4.907 -13.963 1.00 50.69 241 B 1 +ATOM 6285 C CE . MET B 2 241 ? 27.718 6.684 -14.097 1.00 45.54 241 B 1 +ATOM 6286 N N . LYS B 2 242 ? 22.984 1.318 -13.912 1.00 68.55 242 B 1 +ATOM 6287 C CA . LYS B 2 242 ? 22.332 0.239 -14.657 1.00 71.27 242 B 1 +ATOM 6288 C C . LYS B 2 242 ? 20.862 0.562 -14.927 1.00 74.60 242 B 1 +ATOM 6289 O O . LYS B 2 242 ? 20.416 0.335 -16.041 1.00 72.70 242 B 1 +ATOM 6290 C CB . LYS B 2 242 ? 22.452 -1.098 -13.918 1.00 67.79 242 B 1 +ATOM 6291 C CG . LYS B 2 242 ? 23.789 -1.810 -14.177 1.00 60.25 242 B 1 +ATOM 6292 C CD . LYS B 2 242 ? 23.767 -3.176 -13.483 1.00 55.96 242 B 1 +ATOM 6293 C CE . LYS B 2 242 ? 25.008 -4.009 -13.811 1.00 47.85 242 B 1 +ATOM 6294 N NZ . LYS B 2 242 ? 24.901 -5.377 -13.233 1.00 42.79 242 B 1 +ATOM 6295 N N . GLY B 2 243 ? 20.155 1.118 -13.947 1.00 70.56 243 B 1 +ATOM 6296 C CA . GLY B 2 243 ? 18.784 1.577 -14.115 1.00 72.26 243 B 1 +ATOM 6297 C C . GLY B 2 243 ? 18.657 2.696 -15.150 1.00 75.82 243 B 1 +ATOM 6298 O O . GLY B 2 243 ? 17.836 2.594 -16.056 1.00 75.25 243 B 1 +ATOM 6299 N N . ALA B 2 244 ? 19.527 3.696 -15.093 1.00 71.60 244 B 1 +ATOM 6300 C CA . ALA B 2 244 ? 19.559 4.788 -16.064 1.00 73.74 244 B 1 +ATOM 6301 C C . ALA B 2 244 ? 19.845 4.286 -17.493 1.00 76.57 244 B 1 +ATOM 6302 O O . ALA B 2 244 ? 19.151 4.669 -18.429 1.00 76.94 244 B 1 +ATOM 6303 C CB . ALA B 2 244 ? 20.581 5.836 -15.615 1.00 71.67 244 B 1 +ATOM 6304 N N . ILE B 2 245 ? 20.811 3.362 -17.676 1.00 74.84 245 B 1 +ATOM 6305 C CA . ILE B 2 245 ? 21.097 2.765 -18.982 1.00 77.39 245 B 1 +ATOM 6306 C C . ILE B 2 245 ? 19.896 1.945 -19.493 1.00 79.70 245 B 1 +ATOM 6307 O O . ILE B 2 245 ? 19.604 1.982 -20.679 1.00 80.21 245 B 1 +ATOM 6308 C CB . ILE B 2 245 ? 22.378 1.901 -18.945 1.00 76.57 245 B 1 +ATOM 6309 C CG1 . ILE B 2 245 ? 23.627 2.752 -18.642 1.00 70.20 245 B 1 +ATOM 6310 C CG2 . ILE B 2 245 ? 22.599 1.168 -20.282 1.00 68.99 245 B 1 +ATOM 6311 C CD1 . ILE B 2 245 ? 24.834 1.921 -18.175 1.00 62.60 245 B 1 +ATOM 6312 N N . THR B 2 246 ? 19.203 1.227 -18.613 1.00 78.41 246 B 1 +ATOM 6313 C CA . THR B 2 246 ? 17.993 0.470 -18.993 1.00 79.56 246 B 1 +ATOM 6314 C C . THR B 2 246 ? 16.911 1.409 -19.503 1.00 81.29 246 B 1 +ATOM 6315 O O . THR B 2 246 ? 16.385 1.181 -20.587 1.00 81.30 246 B 1 +ATOM 6316 C CB . THR B 2 246 ? 17.452 -0.376 -17.834 1.00 79.01 246 B 1 +ATOM 6317 O OG1 . THR B 2 246 ? 18.477 -1.191 -17.317 1.00 70.70 246 B 1 +ATOM 6318 C CG2 . THR B 2 246 ? 16.331 -1.308 -18.273 1.00 69.61 246 B 1 +ATOM 6319 N N . LEU B 2 247 ? 16.653 2.508 -18.796 1.00 80.31 247 B 1 +ATOM 6320 C CA . LEU B 2 247 ? 15.741 3.560 -19.240 1.00 80.71 247 B 1 +ATOM 6321 C C . LEU B 2 247 ? 16.141 4.116 -20.606 1.00 82.07 247 B 1 +ATOM 6322 O O . LEU B 2 247 ? 15.284 4.277 -21.464 1.00 82.38 247 B 1 +ATOM 6323 C CB . LEU B 2 247 ? 15.718 4.660 -18.173 1.00 79.84 247 B 1 +ATOM 6324 C CG . LEU B 2 247 ? 14.906 5.908 -18.565 1.00 76.09 247 B 1 +ATOM 6325 C CD1 . LEU B 2 247 ? 13.420 5.625 -18.651 1.00 68.30 247 B 1 +ATOM 6326 C CD2 . LEU B 2 247 ? 15.162 7.002 -17.531 1.00 68.77 247 B 1 +ATOM 6327 N N . THR B 2 248 ? 17.420 4.346 -20.855 1.00 79.57 248 B 1 +ATOM 6328 C CA . THR B 2 248 ? 17.899 4.835 -22.158 1.00 79.11 248 B 1 +ATOM 6329 C C . THR B 2 248 ? 17.541 3.902 -23.287 1.00 80.77 248 B 1 +ATOM 6330 O O . THR B 2 248 ? 17.147 4.349 -24.353 1.00 81.10 248 B 1 +ATOM 6331 C CB . THR B 2 248 ? 19.429 4.941 -22.220 1.00 77.37 248 B 1 +ATOM 6332 O OG1 . THR B 2 248 ? 19.964 5.424 -21.006 1.00 69.49 248 B 1 +ATOM 6333 C CG2 . THR B 2 248 ? 19.894 5.870 -23.348 1.00 67.35 248 B 1 +ATOM 6334 N N . ILE B 2 249 ? 17.745 2.603 -23.071 1.00 81.10 249 B 1 +ATOM 6335 C CA . ILE B 2 249 ? 17.488 1.587 -24.083 1.00 83.01 249 B 1 +ATOM 6336 C C . ILE B 2 249 ? 15.982 1.495 -24.346 1.00 84.05 249 B 1 +ATOM 6337 O O . ILE B 2 249 ? 15.582 1.533 -25.505 1.00 84.30 249 B 1 +ATOM 6338 C CB . ILE B 2 249 ? 18.095 0.228 -23.669 1.00 83.34 249 B 1 +ATOM 6339 C CG1 . ILE B 2 249 ? 19.645 0.327 -23.579 1.00 77.97 249 B 1 +ATOM 6340 C CG2 . ILE B 2 249 ? 17.718 -0.863 -24.682 1.00 76.70 249 B 1 +ATOM 6341 C CD1 . ILE B 2 249 ? 20.277 -0.858 -22.823 1.00 69.97 249 B 1 +ATOM 6342 N N . LEU B 2 250 ? 15.165 1.478 -23.292 1.00 84.33 250 B 1 +ATOM 6343 C CA . LEU B 2 250 ? 13.703 1.469 -23.404 1.00 84.49 250 B 1 +ATOM 6344 C C . LEU B 2 250 ? 13.189 2.698 -24.160 1.00 84.75 250 B 1 +ATOM 6345 O O . LEU B 2 250 ? 12.402 2.559 -25.089 1.00 84.89 250 B 1 +ATOM 6346 C CB . LEU B 2 250 ? 13.079 1.426 -21.995 1.00 84.75 250 B 1 +ATOM 6347 C CG . LEU B 2 250 ? 13.249 0.081 -21.253 1.00 82.21 250 B 1 +ATOM 6348 C CD1 . LEU B 2 250 ? 12.783 0.225 -19.806 1.00 73.01 250 B 1 +ATOM 6349 C CD2 . LEU B 2 250 ? 12.442 -1.023 -21.915 1.00 73.32 250 B 1 +ATOM 6350 N N . LEU B 2 251 ? 13.682 3.882 -23.830 1.00 83.61 251 B 1 +ATOM 6351 C CA . LEU B 2 251 ? 13.330 5.125 -24.512 1.00 82.62 251 B 1 +ATOM 6352 C C . LEU B 2 251 ? 13.753 5.121 -25.983 1.00 83.10 251 B 1 +ATOM 6353 O O . LEU B 2 251 ? 12.988 5.536 -26.843 1.00 82.84 251 B 1 +ATOM 6354 C CB . LEU B 2 251 ? 13.980 6.314 -23.769 1.00 81.51 251 B 1 +ATOM 6355 C CG . LEU B 2 251 ? 12.939 7.212 -23.090 1.00 73.80 251 B 1 +ATOM 6356 C CD1 . LEU B 2 251 ? 13.534 7.858 -21.835 1.00 65.67 251 B 1 +ATOM 6357 C CD2 . LEU B 2 251 ? 12.482 8.315 -24.037 1.00 65.45 251 B 1 +ATOM 6358 N N . GLY B 2 252 ? 14.955 4.620 -26.270 1.00 83.31 252 B 1 +ATOM 6359 C CA . GLY B 2 252 ? 15.454 4.509 -27.635 1.00 82.71 252 B 1 +ATOM 6360 C C . GLY B 2 252 ? 14.594 3.589 -28.493 1.00 83.58 252 B 1 +ATOM 6361 O O . GLY B 2 252 ? 14.173 3.979 -29.576 1.00 83.12 252 B 1 +ATOM 6362 N N . VAL B 2 253 ? 14.289 2.391 -27.982 1.00 85.28 253 B 1 +ATOM 6363 C CA . VAL B 2 253 ? 13.428 1.423 -28.670 1.00 85.76 253 B 1 +ATOM 6364 C C . VAL B 2 253 ? 12.020 1.984 -28.851 1.00 85.59 253 B 1 +ATOM 6365 O O . VAL B 2 253 ? 11.500 1.961 -29.960 1.00 84.61 253 B 1 +ATOM 6366 C CB . VAL B 2 253 ? 13.410 0.074 -27.923 1.00 85.78 253 B 1 +ATOM 6367 C CG1 . VAL B 2 253 ? 12.412 -0.900 -28.537 1.00 76.17 253 B 1 +ATOM 6368 C CG2 . VAL B 2 253 ? 14.790 -0.589 -27.988 1.00 76.51 253 B 1 +ATOM 6369 N N . PHE B 2 254 ? 11.448 2.586 -27.810 1.00 85.63 254 B 1 +ATOM 6370 C CA . PHE B 2 254 ? 10.132 3.213 -27.864 1.00 84.75 254 B 1 +ATOM 6371 C C . PHE B 2 254 ? 10.046 4.280 -28.954 1.00 84.55 254 B 1 +ATOM 6372 O O . PHE B 2 254 ? 9.151 4.243 -29.792 1.00 84.77 254 B 1 +ATOM 6373 C CB . PHE B 2 254 ? 9.809 3.808 -26.486 1.00 84.05 254 B 1 +ATOM 6374 C CG . PHE B 2 254 ? 8.452 4.480 -26.441 1.00 83.14 254 B 1 +ATOM 6375 C CD1 . PHE B 2 254 ? 8.331 5.866 -26.659 1.00 73.82 254 B 1 +ATOM 6376 C CD2 . PHE B 2 254 ? 7.301 3.714 -26.210 1.00 73.52 254 B 1 +ATOM 6377 C CE1 . PHE B 2 254 ? 7.071 6.474 -26.653 1.00 71.67 254 B 1 +ATOM 6378 C CE2 . PHE B 2 254 ? 6.036 4.321 -26.193 1.00 70.85 254 B 1 +ATOM 6379 C CZ . PHE B 2 254 ? 5.926 5.699 -26.421 1.00 77.00 254 B 1 +ATOM 6380 N N . VAL B 2 255 ? 10.999 5.205 -28.998 1.00 84.33 255 B 1 +ATOM 6381 C CA . VAL B 2 255 ? 11.011 6.268 -30.008 1.00 83.55 255 B 1 +ATOM 6382 C C . VAL B 2 255 ? 11.134 5.694 -31.414 1.00 83.69 255 B 1 +ATOM 6383 O O . VAL B 2 255 ? 10.410 6.130 -32.308 1.00 83.07 255 B 1 +ATOM 6384 C CB . VAL B 2 255 ? 12.125 7.292 -29.719 1.00 82.33 255 B 1 +ATOM 6385 C CG1 . VAL B 2 255 ? 12.316 8.306 -30.857 1.00 74.88 255 B 1 +ATOM 6386 C CG2 . VAL B 2 255 ? 11.795 8.105 -28.459 1.00 74.51 255 B 1 +ATOM 6387 N N . VAL B 2 256 ? 12.001 4.703 -31.628 1.00 85.78 256 B 1 +ATOM 6388 C CA . VAL B 2 256 ? 12.188 4.085 -32.950 1.00 85.41 256 B 1 +ATOM 6389 C C . VAL B 2 256 ? 10.933 3.345 -33.406 1.00 85.13 256 B 1 +ATOM 6390 O O . VAL B 2 256 ? 10.542 3.495 -34.560 1.00 84.10 256 B 1 +ATOM 6391 C CB . VAL B 2 256 ? 13.426 3.158 -32.938 1.00 85.23 256 B 1 +ATOM 6392 C CG1 . VAL B 2 256 ? 13.549 2.326 -34.223 1.00 77.24 256 B 1 +ATOM 6393 C CG2 . VAL B 2 256 ? 14.711 3.990 -32.823 1.00 76.59 256 B 1 +ATOM 6394 N N . CYS B 2 257 ? 10.288 2.595 -32.521 1.00 84.67 257 B 1 +ATOM 6395 C CA . CYS B 2 257 ? 9.110 1.802 -32.868 1.00 84.33 257 B 1 +ATOM 6396 C C . CYS B 2 257 ? 7.844 2.652 -33.075 1.00 83.71 257 B 1 +ATOM 6397 O O . CYS B 2 257 ? 7.054 2.356 -33.965 1.00 82.91 257 B 1 +ATOM 6398 C CB . CYS B 2 257 ? 8.895 0.731 -31.793 1.00 84.34 257 B 1 +ATOM 6399 S SG . CYS B 2 257 ? 10.246 -0.502 -31.855 1.00 79.66 257 B 1 +ATOM 6400 N N . TRP B 2 258 ? 7.672 3.716 -32.295 1.00 84.89 258 B 1 +ATOM 6401 C CA . TRP B 2 258 ? 6.482 4.563 -32.368 1.00 84.18 258 B 1 +ATOM 6402 C C . TRP B 2 258 ? 6.599 5.741 -33.347 1.00 83.53 258 B 1 +ATOM 6403 O O . TRP B 2 258 ? 5.578 6.273 -33.792 1.00 82.08 258 B 1 +ATOM 6404 C CB . TRP B 2 258 ? 6.107 5.027 -30.961 1.00 83.39 258 B 1 +ATOM 6405 C CG . TRP B 2 258 ? 5.451 3.973 -30.115 1.00 83.38 258 B 1 +ATOM 6406 C CD1 . TRP B 2 258 ? 6.072 3.115 -29.287 1.00 75.41 258 B 1 +ATOM 6407 C CD2 . TRP B 2 258 ? 4.022 3.674 -30.015 1.00 80.38 258 B 1 +ATOM 6408 N NE1 . TRP B 2 258 ? 5.121 2.308 -28.656 1.00 76.10 258 B 1 +ATOM 6409 C CE2 . TRP B 2 258 ? 3.856 2.627 -29.073 1.00 78.09 258 B 1 +ATOM 6410 C CE3 . TRP B 2 258 ? 2.871 4.209 -30.620 1.00 78.77 258 B 1 +ATOM 6411 C CZ2 . TRP B 2 258 ? 2.574 2.123 -28.730 1.00 78.37 258 B 1 +ATOM 6412 C CZ3 . TRP B 2 258 ? 1.595 3.702 -30.277 1.00 74.65 258 B 1 +ATOM 6413 C CH2 . TRP B 2 258 ? 1.453 2.678 -29.348 1.00 74.87 258 B 1 +ATOM 6414 N N . ALA B 2 259 ? 7.808 6.154 -33.729 1.00 82.65 259 B 1 +ATOM 6415 C CA . ALA B 2 259 ? 7.998 7.282 -34.636 1.00 81.75 259 B 1 +ATOM 6416 C C . ALA B 2 259 ? 7.254 7.151 -35.987 1.00 82.03 259 B 1 +ATOM 6417 O O . ALA B 2 259 ? 6.624 8.127 -36.396 1.00 80.83 259 B 1 +ATOM 6418 C CB . ALA B 2 259 ? 9.498 7.551 -34.833 1.00 80.73 259 B 1 +ATOM 6419 N N . PRO B 2 260 ? 7.257 5.988 -36.677 1.00 82.81 260 B 1 +ATOM 6420 C CA . PRO B 2 260 ? 6.520 5.841 -37.934 1.00 81.59 260 B 1 +ATOM 6421 C C . PRO B 2 260 ? 5.003 5.980 -37.753 1.00 81.15 260 B 1 +ATOM 6422 O O . PRO B 2 260 ? 4.346 6.650 -38.550 1.00 79.24 260 B 1 +ATOM 6423 C CB . PRO B 2 260 ? 6.888 4.456 -38.471 1.00 80.63 260 B 1 +ATOM 6424 C CG . PRO B 2 260 ? 8.217 4.144 -37.786 1.00 79.47 260 B 1 +ATOM 6425 C CD . PRO B 2 260 ? 8.038 4.797 -36.424 1.00 82.83 260 B 1 +ATOM 6426 N N . PHE B 2 261 ? 4.453 5.421 -36.663 1.00 82.47 261 B 1 +ATOM 6427 C CA . PHE B 2 261 ? 3.042 5.559 -36.318 1.00 80.63 261 B 1 +ATOM 6428 C C . PHE B 2 261 ? 2.674 7.025 -36.032 1.00 80.15 261 B 1 +ATOM 6429 O O . PHE B 2 261 ? 1.672 7.522 -36.529 1.00 79.59 261 B 1 +ATOM 6430 C CB . PHE B 2 261 ? 2.738 4.669 -35.109 1.00 79.25 261 B 1 +ATOM 6431 C CG . PHE B 2 261 ? 1.286 4.743 -34.677 1.00 77.96 261 B 1 +ATOM 6432 C CD1 . PHE B 2 261 ? 0.909 5.547 -33.587 1.00 69.81 261 B 1 +ATOM 6433 C CD2 . PHE B 2 261 ? 0.311 4.015 -35.376 1.00 69.54 261 B 1 +ATOM 6434 C CE1 . PHE B 2 261 ? -0.437 5.608 -33.191 1.00 67.43 261 B 1 +ATOM 6435 C CE2 . PHE B 2 261 ? -1.030 4.075 -34.983 1.00 66.63 261 B 1 +ATOM 6436 C CZ . PHE B 2 261 ? -1.408 4.869 -33.892 1.00 71.47 261 B 1 +ATOM 6437 N N . PHE B 2 262 ? 3.525 7.744 -35.321 1.00 80.97 262 B 1 +ATOM 6438 C CA . PHE B 2 262 ? 3.334 9.178 -35.109 1.00 80.25 262 B 1 +ATOM 6439 C C . PHE B 2 262 ? 3.345 9.975 -36.394 1.00 80.67 262 B 1 +ATOM 6440 O O . PHE B 2 262 ? 2.532 10.883 -36.573 1.00 79.45 262 B 1 +ATOM 6441 C CB . PHE B 2 262 ? 4.388 9.727 -34.125 1.00 78.30 262 B 1 +ATOM 6442 C CG . PHE B 2 262 ? 3.713 9.959 -32.814 1.00 74.96 262 B 1 +ATOM 6443 C CD1 . PHE B 2 262 ? 2.958 11.131 -32.630 1.00 67.11 262 B 1 +ATOM 6444 C CD2 . PHE B 2 262 ? 3.659 8.932 -31.878 1.00 66.03 262 B 1 +ATOM 6445 C CE1 . PHE B 2 262 ? 2.098 11.252 -31.536 1.00 63.35 262 B 1 +ATOM 6446 C CE2 . PHE B 2 262 ? 2.800 9.048 -30.785 1.00 62.07 262 B 1 +ATOM 6447 C CZ . PHE B 2 262 ? 2.004 10.193 -30.626 1.00 65.66 262 B 1 +ATOM 6448 N N . LEU B 2 263 ? 4.255 9.637 -37.307 1.00 79.15 263 B 1 +ATOM 6449 C CA . LEU B 2 263 ? 4.317 10.271 -38.604 1.00 78.94 263 B 1 +ATOM 6450 C C . LEU B 2 263 ? 3.030 10.014 -39.398 1.00 78.43 263 B 1 +ATOM 6451 O O . LEU B 2 263 ? 2.501 10.950 -39.993 1.00 77.78 263 B 1 +ATOM 6452 C CB . LEU B 2 263 ? 5.581 9.796 -39.337 1.00 78.94 263 B 1 +ATOM 6453 C CG . LEU B 2 263 ? 5.945 10.701 -40.535 1.00 72.97 263 B 1 +ATOM 6454 C CD1 . LEU B 2 263 ? 6.463 12.068 -40.082 1.00 64.80 263 B 1 +ATOM 6455 C CD2 . LEU B 2 263 ? 7.051 10.049 -41.365 1.00 65.24 263 B 1 +ATOM 6456 N N . HIS B 2 264 ? 2.490 8.789 -39.339 1.00 80.73 264 B 1 +ATOM 6457 C CA . HIS B 2 264 ? 1.192 8.456 -39.935 1.00 78.89 264 B 1 +ATOM 6458 C C . HIS B 2 264 ? 0.065 9.339 -39.384 1.00 78.32 264 B 1 +ATOM 6459 O O . HIS B 2 264 ? -0.660 9.950 -40.171 1.00 77.32 264 B 1 +ATOM 6460 C CB . HIS B 2 264 ? 0.908 6.961 -39.719 1.00 77.59 264 B 1 +ATOM 6461 C CG . HIS B 2 264 ? -0.418 6.531 -40.264 1.00 75.73 264 B 1 +ATOM 6462 N ND1 . HIS B 2 264 ? -0.661 6.063 -41.536 1.00 64.34 264 B 1 +ATOM 6463 C CD2 . HIS B 2 264 ? -1.616 6.525 -39.602 1.00 65.87 264 B 1 +ATOM 6464 C CE1 . HIS B 2 264 ? -1.971 5.771 -41.638 1.00 64.67 264 B 1 +ATOM 6465 N NE2 . HIS B 2 264 ? -2.574 6.041 -40.480 1.00 65.13 264 B 1 +ATOM 6466 N N . LEU B 2 265 ? -0.046 9.497 -38.057 1.00 78.30 265 B 1 +ATOM 6467 C CA . LEU B 2 265 ? -1.051 10.358 -37.431 1.00 76.66 265 B 1 +ATOM 6468 C C . LEU B 2 265 ? -0.927 11.828 -37.876 1.00 76.30 265 B 1 +ATOM 6469 O O . LEU B 2 265 ? -1.930 12.484 -38.160 1.00 76.35 265 B 1 +ATOM 6470 C CB . LEU B 2 265 ? -0.929 10.284 -35.902 1.00 75.65 265 B 1 +ATOM 6471 C CG . LEU B 2 265 ? -1.327 8.938 -35.266 1.00 72.64 265 B 1 +ATOM 6472 C CD1 . LEU B 2 265 ? -1.160 9.039 -33.743 1.00 66.93 265 B 1 +ATOM 6473 C CD2 . LEU B 2 265 ? -2.775 8.578 -35.563 1.00 66.92 265 B 1 +ATOM 6474 N N . ILE B 2 266 ? 0.292 12.333 -37.954 1.00 76.39 266 B 1 +ATOM 6475 C CA . ILE B 2 266 ? 0.544 13.698 -38.423 1.00 76.15 266 B 1 +ATOM 6476 C C . ILE B 2 266 ? 0.125 13.849 -39.885 1.00 75.39 266 B 1 +ATOM 6477 O O . ILE B 2 266 ? -0.537 14.830 -40.235 1.00 74.43 266 B 1 +ATOM 6478 C CB . ILE B 2 266 ? 2.026 14.079 -38.198 1.00 76.23 266 B 1 +ATOM 6479 C CG1 . ILE B 2 266 ? 2.333 14.187 -36.689 1.00 72.54 266 B 1 +ATOM 6480 C CG2 . ILE B 2 266 ? 2.369 15.424 -38.888 1.00 71.56 266 B 1 +ATOM 6481 C CD1 . ILE B 2 266 ? 3.830 14.198 -36.368 1.00 65.68 266 B 1 +ATOM 6482 N N . LEU B 2 267 ? 0.468 12.886 -40.741 1.00 77.42 267 B 1 +ATOM 6483 C CA . LEU B 2 267 ? 0.114 12.902 -42.156 1.00 75.90 267 B 1 +ATOM 6484 C C . LEU B 2 267 ? -1.397 12.809 -42.388 1.00 74.95 267 B 1 +ATOM 6485 O O . LEU B 2 267 ? -1.908 13.497 -43.275 1.00 73.52 267 B 1 +ATOM 6486 C CB . LEU B 2 267 ? 0.857 11.777 -42.891 1.00 75.52 267 B 1 +ATOM 6487 C CG . LEU B 2 267 ? 2.378 11.983 -43.010 1.00 72.62 267 B 1 +ATOM 6488 C CD1 . LEU B 2 267 ? 2.995 10.740 -43.661 1.00 66.03 267 B 1 +ATOM 6489 C CD2 . LEU B 2 267 ? 2.760 13.200 -43.840 1.00 67.59 267 B 1 +ATOM 6490 N N . MET B 2 268 ? -2.129 12.050 -41.570 1.00 77.64 268 B 1 +ATOM 6491 C CA . MET B 2 268 ? -3.597 12.006 -41.626 1.00 75.14 268 B 1 +ATOM 6492 C C . MET B 2 268 ? -4.235 13.385 -41.450 1.00 74.02 268 B 1 +ATOM 6493 O O . MET B 2 268 ? -5.248 13.678 -42.084 1.00 72.02 268 B 1 +ATOM 6494 C CB . MET B 2 268 ? -4.154 11.072 -40.548 1.00 73.03 268 B 1 +ATOM 6495 C CG . MET B 2 268 ? -4.104 9.611 -40.960 1.00 66.83 268 B 1 +ATOM 6496 S SD . MET B 2 268 ? -5.022 8.512 -39.843 1.00 62.78 268 B 1 +ATOM 6497 C CE . MET B 2 268 ? -6.727 8.938 -40.271 1.00 56.22 268 B 1 +ATOM 6498 N N . ILE B 2 269 ? -3.658 14.235 -40.599 1.00 75.29 269 B 1 +ATOM 6499 C CA . ILE B 2 269 ? -4.189 15.567 -40.321 1.00 73.96 269 B 1 +ATOM 6500 C C . ILE B 2 269 ? -3.710 16.593 -41.356 1.00 72.79 269 B 1 +ATOM 6501 O O . ILE B 2 269 ? -4.489 17.419 -41.825 1.00 68.72 269 B 1 +ATOM 6502 C CB . ILE B 2 269 ? -3.824 15.998 -38.887 1.00 72.58 269 B 1 +ATOM 6503 C CG1 . ILE B 2 269 ? -4.429 15.021 -37.862 1.00 67.86 269 B 1 +ATOM 6504 C CG2 . ILE B 2 269 ? -4.327 17.432 -38.602 1.00 65.79 269 B 1 +ATOM 6505 C CD1 . ILE B 2 269 ? -3.900 15.232 -36.443 1.00 61.33 269 B 1 +ATOM 6506 N N . THR B 2 270 ? -2.428 16.543 -41.689 1.00 74.63 270 B 1 +ATOM 6507 C CA . THR B 2 270 ? -1.784 17.590 -42.491 1.00 73.02 270 B 1 +ATOM 6508 C C . THR B 2 270 ? -1.891 17.365 -43.994 1.00 70.82 270 B 1 +ATOM 6509 O O . THR B 2 270 ? -1.944 18.329 -44.750 1.00 65.66 270 B 1 +ATOM 6510 C CB . THR B 2 270 ? -0.313 17.747 -42.124 1.00 71.72 270 B 1 +ATOM 6511 O OG1 . THR B 2 270 ? 0.381 16.532 -42.248 1.00 66.92 270 B 1 +ATOM 6512 C CG2 . THR B 2 270 ? -0.127 18.235 -40.683 1.00 64.53 270 B 1 +ATOM 6513 N N . CYS B 2 271 ? -1.906 16.099 -44.430 1.00 72.80 271 B 1 +ATOM 6514 C CA . CYS B 2 271 ? -1.681 15.751 -45.823 1.00 70.96 271 B 1 +ATOM 6515 C C . CYS B 2 271 ? -2.548 14.568 -46.310 1.00 70.46 271 B 1 +ATOM 6516 O O . CYS B 2 271 ? -2.049 13.704 -47.034 1.00 63.60 271 B 1 +ATOM 6517 C CB . CYS B 2 271 ? -0.173 15.499 -45.975 1.00 66.23 271 B 1 +ATOM 6518 S SG . CYS B 2 271 ? 0.422 15.513 -47.663 1.00 60.02 271 B 1 +ATOM 6519 N N . PRO B 2 272 ? -3.837 14.500 -45.990 1.00 70.74 272 B 1 +ATOM 6520 C CA . PRO B 2 272 ? -4.646 13.299 -46.240 1.00 69.29 272 B 1 +ATOM 6521 C C . PRO B 2 272 ? -4.886 12.988 -47.726 1.00 69.82 272 B 1 +ATOM 6522 O O . PRO B 2 272 ? -5.280 11.882 -48.062 1.00 65.10 272 B 1 +ATOM 6523 C CB . PRO B 2 272 ? -5.963 13.564 -45.507 1.00 65.88 272 B 1 +ATOM 6524 C CG . PRO B 2 272 ? -6.071 15.087 -45.470 1.00 64.60 272 B 1 +ATOM 6525 C CD . PRO B 2 272 ? -4.613 15.515 -45.309 1.00 66.81 272 B 1 +ATOM 6526 N N . ARG B 2 273 ? -4.671 13.961 -48.607 1.00 71.42 273 B 1 +ATOM 6527 C CA . ARG B 2 273 ? -4.946 13.821 -50.049 1.00 72.02 273 B 1 +ATOM 6528 C C . ARG B 2 273 ? -3.696 13.759 -50.921 1.00 72.86 273 B 1 +ATOM 6529 O O . ARG B 2 273 ? -3.832 13.568 -52.129 1.00 65.94 273 B 1 +ATOM 6530 C CB . ARG B 2 273 ? -5.862 14.953 -50.519 1.00 66.85 273 B 1 +ATOM 6531 C CG . ARG B 2 273 ? -7.268 14.869 -49.891 1.00 60.00 273 B 1 +ATOM 6532 C CD . ARG B 2 273 ? -8.173 15.926 -50.527 1.00 54.61 273 B 1 +ATOM 6533 N NE . ARG B 2 273 ? -9.536 15.860 -49.981 1.00 48.13 273 B 1 +ATOM 6534 C CZ . ARG B 2 273 ? -10.543 16.651 -50.300 1.00 41.29 273 B 1 +ATOM 6535 N NH1 . ARG B 2 273 ? -10.411 17.617 -51.174 1.00 38.75 273 B 1 +ATOM 6536 N NH2 . ARG B 2 273 ? -11.711 16.488 -49.743 1.00 37.54 273 B 1 +ATOM 6537 N N . ASN B 2 274 ? -2.513 13.953 -50.367 1.00 69.56 274 B 1 +ATOM 6538 C CA . ASN B 2 274 ? -1.288 13.930 -51.155 1.00 70.18 274 B 1 +ATOM 6539 C C . ASN B 2 274 ? -0.892 12.466 -51.438 1.00 71.27 274 B 1 +ATOM 6540 O O . ASN B 2 274 ? -0.803 11.689 -50.497 1.00 66.32 274 B 1 +ATOM 6541 C CB . ASN B 2 274 ? -0.214 14.713 -50.399 1.00 65.80 274 B 1 +ATOM 6542 C CG . ASN B 2 274 ? 1.106 14.838 -51.141 1.00 60.56 274 B 1 +ATOM 6543 O OD1 . ASN B 2 274 ? 1.536 13.963 -51.874 1.00 54.00 274 B 1 +ATOM 6544 N ND2 . ASN B 2 274 ? 1.809 15.926 -50.945 1.00 54.43 274 B 1 +ATOM 6545 N N . PRO B 2 275 ? -0.604 12.094 -52.690 1.00 69.11 275 B 1 +ATOM 6546 C CA . PRO B 2 275 ? -0.263 10.716 -53.043 1.00 68.78 275 B 1 +ATOM 6547 C C . PRO B 2 275 ? 0.963 10.173 -52.305 1.00 68.95 275 B 1 +ATOM 6548 O O . PRO B 2 275 ? 0.996 8.993 -51.976 1.00 64.37 275 B 1 +ATOM 6549 C CB . PRO B 2 275 ? -0.061 10.729 -54.569 1.00 65.84 275 B 1 +ATOM 6550 C CG . PRO B 2 275 ? 0.234 12.186 -54.897 1.00 65.11 275 B 1 +ATOM 6551 C CD . PRO B 2 275 ? -0.591 12.948 -53.867 1.00 67.58 275 B 1 +ATOM 6552 N N . TYR B 2 276 ? 1.936 11.006 -51.948 1.00 70.60 276 B 1 +ATOM 6553 C CA . TYR B 2 276 ? 3.058 10.572 -51.111 1.00 70.42 276 B 1 +ATOM 6554 C C . TYR B 2 276 ? 2.618 10.251 -49.678 1.00 70.25 276 B 1 +ATOM 6555 O O . TYR B 2 276 ? 3.114 9.296 -49.081 1.00 66.39 276 B 1 +ATOM 6556 C CB . TYR B 2 276 ? 4.150 11.639 -51.091 1.00 69.13 276 B 1 +ATOM 6557 C CG . TYR B 2 276 ? 4.904 11.735 -52.399 1.00 65.24 276 B 1 +ATOM 6558 C CD1 . TYR B 2 276 ? 5.885 10.779 -52.716 1.00 59.21 276 B 1 +ATOM 6559 C CD2 . TYR B 2 276 ? 4.624 12.769 -53.305 1.00 58.98 276 B 1 +ATOM 6560 C CE1 . TYR B 2 276 ? 6.580 10.853 -53.932 1.00 53.20 276 B 1 +ATOM 6561 C CE2 . TYR B 2 276 ? 5.314 12.849 -54.526 1.00 53.44 276 B 1 +ATOM 6562 C CZ . TYR B 2 276 ? 6.293 11.891 -54.836 1.00 54.07 276 B 1 +ATOM 6563 O OH . TYR B 2 276 ? 6.977 11.956 -56.028 1.00 52.21 276 B 1 +ATOM 6564 N N . CYS B 2 277 ? 1.665 11.012 -49.140 1.00 70.67 277 B 1 +ATOM 6565 C CA . CYS B 2 277 ? 1.130 10.781 -47.812 1.00 68.89 277 B 1 +ATOM 6566 C C . CYS B 2 277 ? 0.217 9.549 -47.781 1.00 68.71 277 B 1 +ATOM 6567 O O . CYS B 2 277 ? 0.330 8.742 -46.865 1.00 65.73 277 B 1 +ATOM 6568 C CB . CYS B 2 277 ? 0.410 12.039 -47.320 1.00 66.64 277 B 1 +ATOM 6569 S SG . CYS B 2 277 ? 1.518 13.477 -47.214 1.00 62.00 277 B 1 +ATOM 6570 N N . THR B 2 278 ? -0.618 9.345 -48.807 1.00 72.21 278 B 1 +ATOM 6571 C CA . THR B 2 278 ? -1.425 8.122 -48.936 1.00 70.81 278 B 1 +ATOM 6572 C C . THR B 2 278 ? -0.559 6.885 -49.125 1.00 70.70 278 B 1 +ATOM 6573 O O . THR B 2 278 ? -0.860 5.850 -48.547 1.00 67.82 278 B 1 +ATOM 6574 C CB . THR B 2 278 ? -2.444 8.210 -50.075 1.00 68.19 278 B 1 +ATOM 6575 O OG1 . THR B 2 278 ? -1.841 8.641 -51.271 1.00 62.24 278 B 1 +ATOM 6576 C CG2 . THR B 2 278 ? -3.552 9.220 -49.761 1.00 59.57 278 B 1 +ATOM 6577 N N . CYS B 2 279 ? 0.563 6.992 -49.835 1.00 73.06 279 B 1 +ATOM 6578 C CA . CYS B 2 279 ? 1.553 5.929 -49.941 1.00 72.10 279 B 1 +ATOM 6579 C C . CYS B 2 279 ? 2.140 5.553 -48.574 1.00 72.12 279 B 1 +ATOM 6580 O O . CYS B 2 279 ? 2.176 4.384 -48.220 1.00 67.73 279 B 1 +ATOM 6581 C CB . CYS B 2 279 ? 2.663 6.380 -50.906 1.00 68.91 279 B 1 +ATOM 6582 S SG . CYS B 2 279 ? 3.892 5.087 -51.200 1.00 60.20 279 B 1 +ATOM 6583 N N . PHE B 2 280 ? 2.539 6.551 -47.781 1.00 69.46 280 B 1 +ATOM 6584 C CA . PHE B 2 280 ? 3.064 6.291 -46.436 1.00 69.82 280 B 1 +ATOM 6585 C C . PHE B 2 280 ? 2.001 5.670 -45.524 1.00 70.28 280 B 1 +ATOM 6586 O O . PHE B 2 280 ? 2.277 4.687 -44.835 1.00 68.26 280 B 1 +ATOM 6587 C CB . PHE B 2 280 ? 3.630 7.595 -45.863 1.00 68.25 280 B 1 +ATOM 6588 C CG . PHE B 2 280 ? 4.509 7.359 -44.656 1.00 67.68 280 B 1 +ATOM 6589 C CD1 . PHE B 2 280 ? 3.960 7.332 -43.369 1.00 61.18 280 B 1 +ATOM 6590 C CD2 . PHE B 2 280 ? 5.890 7.120 -44.821 1.00 61.29 280 B 1 +ATOM 6591 C CE1 . PHE B 2 280 ? 4.783 7.072 -42.253 1.00 58.78 280 B 1 +ATOM 6592 C CE2 . PHE B 2 280 ? 6.708 6.864 -43.721 1.00 58.25 280 B 1 +ATOM 6593 C CZ . PHE B 2 280 ? 6.152 6.836 -42.432 1.00 62.19 280 B 1 +ATOM 6594 N N . MET B 2 281 ? 0.762 6.177 -45.585 1.00 68.71 281 B 1 +ATOM 6595 C CA . MET B 2 281 ? -0.360 5.644 -44.805 1.00 67.28 281 B 1 +ATOM 6596 C C . MET B 2 281 ? -0.778 4.223 -45.232 1.00 68.06 281 B 1 +ATOM 6597 O O . MET B 2 281 ? -1.264 3.476 -44.400 1.00 66.05 281 B 1 +ATOM 6598 C CB . MET B 2 281 ? -1.553 6.599 -44.897 1.00 65.15 281 B 1 +ATOM 6599 C CG . MET B 2 281 ? -1.296 7.936 -44.186 1.00 62.40 281 B 1 +ATOM 6600 S SD . MET B 2 281 ? -2.730 9.047 -44.079 1.00 57.35 281 B 1 +ATOM 6601 C CE . MET B 2 281 ? -3.087 9.360 -45.815 1.00 52.52 281 B 1 +ATOM 6602 N N . SER B 2 282 ? -0.546 3.828 -46.489 1.00 71.49 282 B 1 +ATOM 6603 C CA . SER B 2 282 ? -0.864 2.468 -46.950 1.00 69.93 282 B 1 +ATOM 6604 C C . SER B 2 282 ? -0.017 1.382 -46.275 1.00 70.73 282 B 1 +ATOM 6605 O O . SER B 2 282 ? -0.425 0.229 -46.224 1.00 66.49 282 B 1 +ATOM 6606 C CB . SER B 2 282 ? -0.734 2.365 -48.475 1.00 66.15 282 B 1 +ATOM 6607 O OG . SER B 2 282 ? 0.609 2.353 -48.893 1.00 58.76 282 B 1 +ATOM 6608 N N . HIS B 2 283 ? 1.131 1.743 -45.699 1.00 70.90 283 B 1 +ATOM 6609 C CA . HIS B 2 283 ? 1.987 0.841 -44.932 1.00 71.24 283 B 1 +ATOM 6610 C C . HIS B 2 283 ? 1.638 0.808 -43.432 1.00 72.29 283 B 1 +ATOM 6611 O O . HIS B 2 283 ? 2.447 0.367 -42.620 1.00 69.72 283 B 1 +ATOM 6612 C CB . HIS B 2 283 ? 3.459 1.186 -45.185 1.00 69.64 283 B 1 +ATOM 6613 C CG . HIS B 2 283 ? 3.873 1.001 -46.615 1.00 67.68 283 B 1 +ATOM 6614 N ND1 . HIS B 2 283 ? 3.609 1.852 -47.658 1.00 58.62 283 B 1 +ATOM 6615 C CD2 . HIS B 2 283 ? 4.561 -0.064 -47.149 1.00 59.76 283 B 1 +ATOM 6616 C CE1 . HIS B 2 283 ? 4.112 1.322 -48.776 1.00 58.35 283 B 1 +ATOM 6617 N NE2 . HIS B 2 283 ? 4.709 0.161 -48.507 1.00 59.08 283 B 1 +ATOM 6618 N N . PHE B 2 284 ? 0.432 1.231 -43.045 1.00 73.02 284 B 1 +ATOM 6619 C CA . PHE B 2 284 ? -0.010 1.289 -41.651 1.00 73.24 284 B 1 +ATOM 6620 C C . PHE B 2 284 ? 0.181 -0.027 -40.895 1.00 75.09 284 B 1 +ATOM 6621 O O . PHE B 2 284 ? 0.683 -0.034 -39.774 1.00 73.78 284 B 1 +ATOM 6622 C CB . PHE B 2 284 ? -1.482 1.714 -41.621 1.00 70.46 284 B 1 +ATOM 6623 C CG . PHE B 2 284 ? -2.011 1.885 -40.225 1.00 67.55 284 B 1 +ATOM 6624 C CD1 . PHE B 2 284 ? -2.880 0.938 -39.669 1.00 60.96 284 B 1 +ATOM 6625 C CD2 . PHE B 2 284 ? -1.616 2.998 -39.461 1.00 60.01 284 B 1 +ATOM 6626 C CE1 . PHE B 2 284 ? -3.360 1.119 -38.363 1.00 56.25 284 B 1 +ATOM 6627 C CE2 . PHE B 2 284 ? -2.093 3.174 -38.159 1.00 56.42 284 B 1 +ATOM 6628 C CZ . PHE B 2 284 ? -2.975 2.236 -37.602 1.00 57.98 284 B 1 +ATOM 6629 N N . ASN B 2 285 ? -0.120 -1.170 -41.531 1.00 74.15 285 B 1 +ATOM 6630 C CA . ASN B 2 285 ? 0.101 -2.485 -40.931 1.00 74.68 285 B 1 +ATOM 6631 C C . ASN B 2 285 ? 1.564 -2.727 -40.543 1.00 76.63 285 B 1 +ATOM 6632 O O . ASN B 2 285 ? 1.847 -3.383 -39.547 1.00 75.71 285 B 1 +ATOM 6633 C CB . ASN B 2 285 ? -0.362 -3.570 -41.908 1.00 71.69 285 B 1 +ATOM 6634 C CG . ASN B 2 285 ? -1.864 -3.736 -41.937 1.00 67.28 285 B 1 +ATOM 6635 O OD1 . ASN B 2 285 ? -2.598 -3.187 -41.153 1.00 60.11 285 B 1 +ATOM 6636 N ND2 . ASN B 2 285 ? -2.358 -4.545 -42.849 1.00 59.72 285 B 1 +ATOM 6637 N N . MET B 2 286 ? 2.516 -2.182 -41.301 1.00 74.61 286 B 1 +ATOM 6638 C CA . MET B 2 286 ? 3.936 -2.302 -40.987 1.00 75.90 286 B 1 +ATOM 6639 C C . MET B 2 286 ? 4.299 -1.497 -39.739 1.00 78.13 286 B 1 +ATOM 6640 O O . MET B 2 286 ? 5.127 -1.930 -38.942 1.00 78.04 286 B 1 +ATOM 6641 C CB . MET B 2 286 ? 4.747 -1.886 -42.217 1.00 74.72 286 B 1 +ATOM 6642 C CG . MET B 2 286 ? 6.212 -2.330 -42.102 1.00 67.35 286 B 1 +ATOM 6643 S SD . MET B 2 286 ? 7.191 -1.939 -43.577 1.00 60.22 286 B 1 +ATOM 6644 C CE . MET B 2 286 ? 8.758 -2.714 -43.116 1.00 51.49 286 B 1 +ATOM 6645 N N . TYR B 2 287 ? 3.620 -0.354 -39.525 1.00 76.80 287 B 1 +ATOM 6646 C CA . TYR B 2 287 ? 3.808 0.444 -38.309 1.00 77.52 287 B 1 +ATOM 6647 C C . TYR B 2 287 ? 3.192 -0.237 -37.087 1.00 78.80 287 B 1 +ATOM 6648 O O . TYR B 2 287 ? 3.816 -0.238 -36.031 1.00 78.83 287 B 1 +ATOM 6649 C CB . TYR B 2 287 ? 3.240 1.859 -38.508 1.00 76.92 287 B 1 +ATOM 6650 C CG . TYR B 2 287 ? 3.686 2.552 -39.782 1.00 76.10 287 B 1 +ATOM 6651 C CD1 . TYR B 2 287 ? 4.994 2.363 -40.284 1.00 68.01 287 B 1 +ATOM 6652 C CD2 . TYR B 2 287 ? 2.784 3.347 -40.504 1.00 68.96 287 B 1 +ATOM 6653 C CE1 . TYR B 2 287 ? 5.380 2.925 -41.508 1.00 65.90 287 B 1 +ATOM 6654 C CE2 . TYR B 2 287 ? 3.159 3.921 -41.726 1.00 65.93 287 B 1 +ATOM 6655 C CZ . TYR B 2 287 ? 4.452 3.696 -42.238 1.00 70.21 287 B 1 +ATOM 6656 O OH . TYR B 2 287 ? 4.814 4.212 -43.450 1.00 66.91 287 B 1 +ATOM 6657 N N . LEU B 2 288 ? 2.051 -0.915 -37.241 1.00 79.21 288 B 1 +ATOM 6658 C CA . LEU B 2 288 ? 1.467 -1.743 -36.186 1.00 78.62 288 B 1 +ATOM 6659 C C . LEU B 2 288 ? 2.390 -2.904 -35.795 1.00 79.48 288 B 1 +ATOM 6660 O O . LEU B 2 288 ? 2.567 -3.171 -34.606 1.00 79.71 288 B 1 +ATOM 6661 C CB . LEU B 2 288 ? 0.101 -2.285 -36.626 1.00 77.35 288 B 1 +ATOM 6662 C CG . LEU B 2 288 ? -1.020 -1.243 -36.720 1.00 72.15 288 B 1 +ATOM 6663 C CD1 . LEU B 2 288 ? -2.299 -1.946 -37.196 1.00 65.81 288 B 1 +ATOM 6664 C CD2 . LEU B 2 288 ? -1.309 -0.590 -35.366 1.00 65.03 288 B 1 +ATOM 6665 N N . ILE B 2 289 ? 3.036 -3.567 -36.773 1.00 78.85 289 B 1 +ATOM 6666 C CA . ILE B 2 289 ? 4.053 -4.586 -36.480 1.00 79.68 289 B 1 +ATOM 6667 C C . ILE B 2 289 ? 5.222 -3.983 -35.705 1.00 80.95 289 B 1 +ATOM 6668 O O . ILE B 2 289 ? 5.691 -4.598 -34.756 1.00 80.90 289 B 1 +ATOM 6669 C CB . ILE B 2 289 ? 4.545 -5.280 -37.772 1.00 78.81 289 B 1 +ATOM 6670 C CG1 . ILE B 2 289 ? 3.442 -6.241 -38.245 1.00 73.85 289 B 1 +ATOM 6671 C CG2 . ILE B 2 289 ? 5.865 -6.054 -37.562 1.00 71.26 289 B 1 +ATOM 6672 C CD1 . ILE B 2 289 ? 3.756 -6.927 -39.566 1.00 64.42 289 B 1 +ATOM 6673 N N . LEU B 2 290 ? 5.669 -2.786 -36.071 1.00 80.32 290 B 1 +ATOM 6674 C CA . LEU B 2 290 ? 6.771 -2.125 -35.372 1.00 81.10 290 B 1 +ATOM 6675 C C . LEU B 2 290 ? 6.418 -1.838 -33.905 1.00 81.86 290 B 1 +ATOM 6676 O O . LEU B 2 290 ? 7.253 -2.040 -33.025 1.00 81.92 290 B 1 +ATOM 6677 C CB . LEU B 2 290 ? 7.154 -0.841 -36.123 1.00 81.40 290 B 1 +ATOM 6678 C CG . LEU B 2 290 ? 8.681 -0.648 -36.163 1.00 75.68 290 B 1 +ATOM 6679 C CD1 . LEU B 2 290 ? 9.308 -1.451 -37.309 1.00 67.85 290 B 1 +ATOM 6680 C CD2 . LEU B 2 290 ? 9.031 0.818 -36.402 1.00 68.60 290 B 1 +ATOM 6681 N N . ILE B 2 291 ? 5.178 -1.426 -33.631 1.00 82.86 291 B 1 +ATOM 6682 C CA . ILE B 2 291 ? 4.660 -1.221 -32.275 1.00 82.88 291 B 1 +ATOM 6683 C C . ILE B 2 291 ? 4.604 -2.552 -31.506 1.00 82.86 291 B 1 +ATOM 6684 O O . ILE B 2 291 ? 5.077 -2.619 -30.374 1.00 82.27 291 B 1 +ATOM 6685 C CB . ILE B 2 291 ? 3.284 -0.524 -32.320 1.00 82.35 291 B 1 +ATOM 6686 C CG1 . ILE B 2 291 ? 3.423 0.921 -32.867 1.00 76.90 291 B 1 +ATOM 6687 C CG2 . ILE B 2 291 ? 2.650 -0.478 -30.925 1.00 75.09 291 B 1 +ATOM 6688 C CD1 . ILE B 2 291 ? 2.080 1.529 -33.282 1.00 69.61 291 B 1 +ATOM 6689 N N . MET B 2 292 ? 4.109 -3.635 -32.131 1.00 82.04 292 B 1 +ATOM 6690 C CA . MET B 2 292 ? 4.139 -4.962 -31.508 1.00 81.45 292 B 1 +ATOM 6691 C C . MET B 2 292 ? 5.567 -5.449 -31.240 1.00 82.26 292 B 1 +ATOM 6692 O O . MET B 2 292 ? 5.812 -6.079 -30.218 1.00 82.43 292 B 1 +ATOM 6693 C CB . MET B 2 292 ? 3.400 -5.999 -32.356 1.00 80.87 292 B 1 +ATOM 6694 C CG . MET B 2 292 ? 1.894 -5.892 -32.170 1.00 75.30 292 B 1 +ATOM 6695 S SD . MET B 2 292 ? 1.006 -7.383 -32.693 1.00 70.31 292 B 1 +ATOM 6696 C CE . MET B 2 292 ? 1.043 -7.135 -34.476 1.00 59.27 292 B 1 +ATOM 6697 N N . CYS B 2 293 ? 6.523 -5.134 -32.104 1.00 83.55 293 B 1 +ATOM 6698 C CA . CYS B 2 293 ? 7.924 -5.419 -31.854 1.00 83.81 293 B 1 +ATOM 6699 C C . CYS B 2 293 ? 8.448 -4.692 -30.612 1.00 83.96 293 B 1 +ATOM 6700 O O . CYS B 2 293 ? 9.235 -5.281 -29.881 1.00 83.27 293 B 1 +ATOM 6701 C CB . CYS B 2 293 ? 8.773 -5.057 -33.082 1.00 83.25 293 B 1 +ATOM 6702 S SG . CYS B 2 293 ? 8.474 -6.242 -34.428 1.00 75.99 293 B 1 +ATOM 6703 N N . ASN B 2 294 ? 8.005 -3.455 -30.334 1.00 85.34 294 B 1 +ATOM 6704 C CA . ASN B 2 294 ? 8.347 -2.771 -29.079 1.00 85.52 294 B 1 +ATOM 6705 C C . ASN B 2 294 ? 7.879 -3.574 -27.866 1.00 85.24 294 B 1 +ATOM 6706 O O . ASN B 2 294 ? 8.677 -3.858 -26.976 1.00 82.61 294 B 1 +ATOM 6707 C CB . ASN B 2 294 ? 7.766 -1.348 -29.076 1.00 84.42 294 B 1 +ATOM 6708 C CG . ASN B 2 294 ? 8.220 -0.576 -27.856 1.00 82.30 294 B 1 +ATOM 6709 O OD1 . ASN B 2 294 ? 9.341 -0.133 -27.775 1.00 69.30 294 B 1 +ATOM 6710 N ND2 . ASN B 2 294 ? 7.368 -0.415 -26.878 1.00 71.19 294 B 1 +ATOM 6711 N N . SER B 2 295 ? 6.627 -4.045 -27.897 1.00 85.61 295 B 1 +ATOM 6712 C CA . SER B 2 295 ? 6.049 -4.840 -26.817 1.00 84.38 295 B 1 +ATOM 6713 C C . SER B 2 295 ? 6.725 -6.203 -26.599 1.00 84.58 295 B 1 +ATOM 6714 O O . SER B 2 295 ? 6.670 -6.735 -25.496 1.00 83.27 295 B 1 +ATOM 6715 C CB . SER B 2 295 ? 4.555 -5.072 -27.097 1.00 82.95 295 B 1 +ATOM 6716 O OG . SER B 2 295 ? 3.887 -3.842 -27.308 1.00 70.66 295 B 1 +ATOM 6717 N N . ILE B 2 296 ? 7.376 -6.764 -27.629 1.00 85.23 296 B 1 +ATOM 6718 C CA . ILE B 2 296 ? 8.177 -7.999 -27.534 1.00 85.77 296 B 1 +ATOM 6719 C C . ILE B 2 296 ? 9.595 -7.701 -27.034 1.00 86.25 296 B 1 +ATOM 6720 O O . ILE B 2 296 ? 10.172 -8.478 -26.279 1.00 85.31 296 B 1 +ATOM 6721 C CB . ILE B 2 296 ? 8.200 -8.707 -28.909 1.00 85.19 296 B 1 +ATOM 6722 C CG1 . ILE B 2 296 ? 6.791 -9.228 -29.270 1.00 79.62 296 B 1 +ATOM 6723 C CG2 . ILE B 2 296 ? 9.207 -9.863 -28.955 1.00 78.81 296 B 1 +ATOM 6724 C CD1 . ILE B 2 296 ? 6.649 -9.700 -30.714 1.00 72.29 296 B 1 +ATOM 6725 N N . ILE B 2 297 ? 10.182 -6.577 -27.459 1.00 86.09 297 B 1 +ATOM 6726 C CA . ILE B 2 297 ? 11.559 -6.213 -27.129 1.00 86.44 297 B 1 +ATOM 6727 C C . ILE B 2 297 ? 11.691 -5.783 -25.665 1.00 86.24 297 B 1 +ATOM 6728 O O . ILE B 2 297 ? 12.685 -6.119 -25.018 1.00 84.99 297 B 1 +ATOM 6729 C CB . ILE B 2 297 ? 12.076 -5.139 -28.121 1.00 85.79 297 B 1 +ATOM 6730 C CG1 . ILE B 2 297 ? 12.279 -5.761 -29.521 1.00 79.21 297 B 1 +ATOM 6731 C CG2 . ILE B 2 297 ? 13.403 -4.527 -27.643 1.00 77.81 297 B 1 +ATOM 6732 C CD1 . ILE B 2 297 ? 12.406 -4.708 -30.645 1.00 69.16 297 B 1 +ATOM 6733 N N . ASP B 2 298 ? 10.697 -5.075 -25.120 1.00 87.37 298 B 1 +ATOM 6734 C CA . ASP B 2 298 ? 10.755 -4.552 -23.755 1.00 87.17 298 B 1 +ATOM 6735 C C . ASP B 2 298 ? 10.975 -5.651 -22.688 1.00 86.22 298 B 1 +ATOM 6736 O O . ASP B 2 298 ? 11.927 -5.537 -21.905 1.00 84.59 298 B 1 +ATOM 6737 C CB . ASP B 2 298 ? 9.522 -3.671 -23.467 1.00 85.79 298 B 1 +ATOM 6738 C CG . ASP B 2 298 ? 9.639 -2.248 -24.026 1.00 84.69 298 B 1 +ATOM 6739 O OD1 . ASP B 2 298 ? 10.683 -1.927 -24.645 1.00 75.22 298 B 1 +ATOM 6740 O OD2 . ASP B 2 298 ? 8.738 -1.442 -23.743 1.00 76.43 298 B 1 +ATOM 6741 N N . PRO B 2 299 ? 10.224 -6.789 -22.686 1.00 86.78 299 B 1 +ATOM 6742 C CA . PRO B 2 299 ? 10.502 -7.914 -21.794 1.00 85.64 299 B 1 +ATOM 6743 C C . PRO B 2 299 ? 11.914 -8.494 -21.939 1.00 85.84 299 B 1 +ATOM 6744 O O . PRO B 2 299 ? 12.557 -8.838 -20.943 1.00 84.58 299 B 1 +ATOM 6745 C CB . PRO B 2 299 ? 9.447 -8.968 -22.119 1.00 83.83 299 B 1 +ATOM 6746 C CG . PRO B 2 299 ? 8.284 -8.150 -22.662 1.00 82.31 299 B 1 +ATOM 6747 C CD . PRO B 2 299 ? 8.982 -7.019 -23.399 1.00 84.97 299 B 1 +ATOM 6748 N N . ILE B 2 300 ? 12.430 -8.563 -23.169 1.00 85.98 300 B 1 +ATOM 6749 C CA . ILE B 2 300 ? 13.790 -9.035 -23.444 1.00 85.23 300 B 1 +ATOM 6750 C C . ILE B 2 300 ? 14.818 -8.085 -22.820 1.00 84.76 300 B 1 +ATOM 6751 O O . ILE B 2 300 ? 15.791 -8.532 -22.199 1.00 83.91 300 B 1 +ATOM 6752 C CB . ILE B 2 300 ? 14.017 -9.221 -24.966 1.00 85.47 300 B 1 +ATOM 6753 C CG1 . ILE B 2 300 ? 13.041 -10.272 -25.536 1.00 82.62 300 B 1 +ATOM 6754 C CG2 . ILE B 2 300 ? 15.469 -9.626 -25.257 1.00 81.43 300 B 1 +ATOM 6755 C CD1 . ILE B 2 300 ? 13.048 -10.374 -27.069 1.00 74.20 300 B 1 +ATOM 6756 N N . ILE B 2 301 ? 14.588 -6.769 -22.913 1.00 85.56 301 B 1 +ATOM 6757 C CA . ILE B 2 301 ? 15.431 -5.763 -22.272 1.00 84.72 301 B 1 +ATOM 6758 C C . ILE B 2 301 ? 15.417 -5.946 -20.749 1.00 83.99 301 B 1 +ATOM 6759 O O . ILE B 2 301 ? 16.484 -5.965 -20.134 1.00 82.54 301 B 1 +ATOM 6760 C CB . ILE B 2 301 ? 15.011 -4.329 -22.677 1.00 85.30 301 B 1 +ATOM 6761 C CG1 . ILE B 2 301 ? 15.282 -4.084 -24.177 1.00 81.77 301 B 1 +ATOM 6762 C CG2 . ILE B 2 301 ? 15.774 -3.277 -21.844 1.00 80.43 301 B 1 +ATOM 6763 C CD1 . ILE B 2 301 ? 14.568 -2.840 -24.733 1.00 73.27 301 B 1 +ATOM 6764 N N . TYR B 2 302 ? 14.252 -6.160 -20.142 1.00 85.97 302 B 1 +ATOM 6765 C CA . TYR B 2 302 ? 14.161 -6.407 -18.694 1.00 83.56 302 B 1 +ATOM 6766 C C . TYR B 2 302 ? 14.933 -7.661 -18.296 1.00 82.79 302 B 1 +ATOM 6767 O O . TYR B 2 302 ? 15.745 -7.621 -17.367 1.00 81.39 302 B 1 +ATOM 6768 C CB . TYR B 2 302 ? 12.702 -6.518 -18.238 1.00 82.75 302 B 1 +ATOM 6769 C CG . TYR B 2 302 ? 11.778 -5.395 -18.648 1.00 81.29 302 B 1 +ATOM 6770 C CD1 . TYR B 2 302 ? 12.221 -4.061 -18.687 1.00 72.88 302 B 1 +ATOM 6771 C CD2 . TYR B 2 302 ? 10.448 -5.684 -19.019 1.00 72.97 302 B 1 +ATOM 6772 C CE1 . TYR B 2 302 ? 11.374 -3.036 -19.136 1.00 70.96 302 B 1 +ATOM 6773 C CE2 . TYR B 2 302 ? 9.587 -4.676 -19.461 1.00 70.34 302 B 1 +ATOM 6774 C CZ . TYR B 2 302 ? 10.058 -3.350 -19.536 1.00 75.58 302 B 1 +ATOM 6775 O OH . TYR B 2 302 ? 9.233 -2.370 -20.004 1.00 73.01 302 B 1 +ATOM 6776 N N . ALA B 2 303 ? 14.756 -8.758 -19.030 1.00 83.16 303 B 1 +ATOM 6777 C CA . ALA B 2 303 ? 15.462 -10.008 -18.778 1.00 80.42 303 B 1 +ATOM 6778 C C . ALA B 2 303 ? 16.983 -9.848 -18.911 1.00 80.00 303 B 1 +ATOM 6779 O O . ALA B 2 303 ? 17.750 -10.387 -18.104 1.00 77.87 303 B 1 +ATOM 6780 C CB . ALA B 2 303 ? 14.940 -11.062 -19.757 1.00 79.14 303 B 1 +ATOM 6781 N N . PHE B 2 304 ? 17.441 -9.075 -19.898 1.00 82.50 304 B 1 +ATOM 6782 C CA . PHE B 2 304 ? 18.874 -8.886 -20.123 1.00 81.02 304 B 1 +ATOM 6783 C C . PHE B 2 304 ? 19.524 -7.940 -19.106 1.00 80.26 304 B 1 +ATOM 6784 O O . PHE B 2 304 ? 20.664 -8.158 -18.688 1.00 77.52 304 B 1 +ATOM 6785 C CB . PHE B 2 304 ? 19.093 -8.405 -21.565 1.00 79.84 304 B 1 +ATOM 6786 C CG . PHE B 2 304 ? 20.502 -8.667 -22.033 1.00 73.67 304 B 1 +ATOM 6787 C CD1 . PHE B 2 304 ? 21.502 -7.683 -21.907 1.00 66.59 304 B 1 +ATOM 6788 C CD2 . PHE B 2 304 ? 20.843 -9.928 -22.578 1.00 64.52 304 B 1 +ATOM 6789 C CE1 . PHE B 2 304 ? 22.814 -7.946 -22.333 1.00 59.87 304 B 1 +ATOM 6790 C CE2 . PHE B 2 304 ? 22.148 -10.193 -23.000 1.00 58.36 304 B 1 +ATOM 6791 C CZ . PHE B 2 304 ? 23.133 -9.205 -22.877 1.00 59.96 304 B 1 +ATOM 6792 N N . ARG B 2 305 ? 18.795 -6.902 -18.673 1.00 81.30 305 B 1 +ATOM 6793 C CA . ARG B 2 305 ? 19.325 -5.831 -17.826 1.00 80.97 305 B 1 +ATOM 6794 C C . ARG B 2 305 ? 19.168 -6.081 -16.329 1.00 79.86 305 B 1 +ATOM 6795 O O . ARG B 2 305 ? 20.021 -5.637 -15.558 1.00 76.04 305 B 1 +ATOM 6796 C CB . ARG B 2 305 ? 18.694 -4.498 -18.233 1.00 79.93 305 B 1 +ATOM 6797 C CG . ARG B 2 305 ? 19.045 -4.052 -19.663 1.00 76.52 305 B 1 +ATOM 6798 C CD . ARG B 2 305 ? 20.540 -3.784 -19.895 1.00 74.44 305 B 1 +ATOM 6799 N NE . ARG B 2 305 ? 21.007 -2.697 -19.031 1.00 72.81 305 B 1 +ATOM 6800 C CZ . ARG B 2 305 ? 22.253 -2.272 -18.914 1.00 68.74 305 B 1 +ATOM 6801 N NH1 . ARG B 2 305 ? 23.238 -2.799 -19.592 1.00 62.10 305 B 1 +ATOM 6802 N NH2 . ARG B 2 305 ? 22.527 -1.298 -18.101 1.00 64.45 305 B 1 +ATOM 6803 N N . SER B 2 306 ? 18.128 -6.799 -15.911 1.00 80.53 306 B 1 +ATOM 6804 C CA . SER B 2 306 ? 17.887 -7.146 -14.514 1.00 79.75 306 B 1 +ATOM 6805 C C . SER B 2 306 ? 18.271 -8.594 -14.231 1.00 79.85 306 B 1 +ATOM 6806 O O . SER B 2 306 ? 17.673 -9.537 -14.739 1.00 77.14 306 B 1 +ATOM 6807 C CB . SER B 2 306 ? 16.427 -6.888 -14.138 1.00 76.97 306 B 1 +ATOM 6808 O OG . SER B 2 306 ? 16.233 -7.254 -12.789 1.00 69.77 306 B 1 +ATOM 6809 N N . GLN B 2 307 ? 19.293 -8.782 -13.383 1.00 78.87 307 B 1 +ATOM 6810 C CA . GLN B 2 307 ? 19.694 -10.113 -12.937 1.00 78.97 307 B 1 +ATOM 6811 C C . GLN B 2 307 ? 18.588 -10.783 -12.115 1.00 80.49 307 B 1 +ATOM 6812 O O . GLN B 2 307 ? 18.375 -11.986 -12.245 1.00 77.57 307 B 1 +ATOM 6813 C CB . GLN B 2 307 ? 21.006 -9.998 -12.153 1.00 75.21 307 B 1 +ATOM 6814 C CG . GLN B 2 307 ? 21.599 -11.375 -11.810 1.00 65.70 307 B 1 +ATOM 6815 C CD . GLN B 2 307 ? 22.985 -11.280 -11.157 1.00 59.61 307 B 1 +ATOM 6816 O OE1 . GLN B 2 307 ? 23.549 -10.216 -10.940 1.00 52.12 307 B 1 +ATOM 6817 N NE2 . GLN B 2 307 ? 23.590 -12.394 -10.831 1.00 49.53 307 B 1 +ATOM 6818 N N . GLU B 2 308 ? 17.866 -9.996 -11.318 1.00 77.67 308 B 1 +ATOM 6819 C CA . GLU B 2 308 ? 16.779 -10.480 -10.470 1.00 78.50 308 B 1 +ATOM 6820 C C . GLU B 2 308 ? 15.563 -10.919 -11.288 1.00 79.81 308 B 1 +ATOM 6821 O O . GLU B 2 308 ? 15.047 -12.013 -11.080 1.00 77.68 308 B 1 +ATOM 6822 C CB . GLU B 2 308 ? 16.416 -9.382 -9.455 1.00 76.33 308 B 1 +ATOM 6823 C CG . GLU B 2 308 ? 15.751 -9.938 -8.191 1.00 70.16 308 B 1 +ATOM 6824 C CD . GLU B 2 308 ? 16.669 -10.884 -7.397 1.00 65.54 308 B 1 +ATOM 6825 O OE1 . GLU B 2 308 ? 16.135 -11.675 -6.597 1.00 58.91 308 B 1 +ATOM 6826 O OE2 . GLU B 2 308 ? 17.905 -10.855 -7.618 1.00 60.81 308 B 1 +ATOM 6827 N N . MET B 2 309 ? 15.186 -10.157 -12.316 1.00 79.42 309 B 1 +ATOM 6828 C CA . MET B 2 309 ? 14.162 -10.568 -13.290 1.00 80.93 309 B 1 +ATOM 6829 C C . MET B 2 309 ? 14.554 -11.871 -13.988 1.00 81.12 309 B 1 +ATOM 6830 O O . MET B 2 309 ? 13.760 -12.797 -14.068 1.00 80.35 309 B 1 +ATOM 6831 C CB . MET B 2 309 ? 13.960 -9.474 -14.350 1.00 81.55 309 B 1 +ATOM 6832 C CG . MET B 2 309 ? 13.058 -8.349 -13.856 1.00 78.07 309 B 1 +ATOM 6833 S SD . MET B 2 309 ? 11.299 -8.772 -13.844 1.00 75.52 309 B 1 +ATOM 6834 C CE . MET B 2 309 ? 10.891 -8.413 -15.566 1.00 66.37 309 B 1 +ATOM 6835 N N . ARG B 2 310 ? 15.806 -11.975 -14.454 1.00 81.46 310 B 1 +ATOM 6836 C CA . ARG B 2 310 ? 16.305 -13.177 -15.146 1.00 81.76 310 B 1 +ATOM 6837 C C . ARG B 2 310 ? 16.279 -14.414 -14.256 1.00 81.64 310 B 1 +ATOM 6838 O O . ARG B 2 310 ? 15.971 -15.500 -14.735 1.00 79.90 310 B 1 +ATOM 6839 C CB . ARG B 2 310 ? 17.723 -12.900 -15.647 1.00 81.01 310 B 1 +ATOM 6840 C CG . ARG B 2 310 ? 18.109 -13.823 -16.816 1.00 75.36 310 B 1 +ATOM 6841 C CD . ARG B 2 310 ? 19.572 -13.643 -17.222 1.00 73.92 310 B 1 +ATOM 6842 N NE . ARG B 2 310 ? 19.902 -12.222 -17.421 1.00 67.95 310 B 1 +ATOM 6843 C CZ . ARG B 2 310 ? 21.074 -11.696 -17.756 1.00 61.80 310 B 1 +ATOM 6844 N NH1 . ARG B 2 310 ? 22.114 -12.433 -18.027 1.00 56.36 310 B 1 +ATOM 6845 N NH2 . ARG B 2 310 ? 21.208 -10.405 -17.820 1.00 56.35 310 B 1 +ATOM 6846 N N . LYS B 2 311 ? 16.616 -14.257 -12.975 1.00 80.89 311 B 1 +ATOM 6847 C CA . LYS B 2 311 ? 16.520 -15.318 -11.974 1.00 80.30 311 B 1 +ATOM 6848 C C . LYS B 2 311 ? 15.072 -15.749 -11.780 1.00 80.79 311 B 1 +ATOM 6849 O O . LYS B 2 311 ? 14.781 -16.938 -11.866 1.00 78.66 311 B 1 +ATOM 6850 C CB . LYS B 2 311 ? 17.160 -14.832 -10.667 1.00 78.62 311 B 1 +ATOM 6851 C CG . LYS B 2 311 ? 17.235 -15.942 -9.609 1.00 69.65 311 B 1 +ATOM 6852 C CD . LYS B 2 311 ? 17.743 -15.378 -8.284 1.00 65.10 311 B 1 +ATOM 6853 C CE . LYS B 2 311 ? 17.670 -16.445 -7.190 1.00 55.31 311 B 1 +ATOM 6854 N NZ . LYS B 2 311 ? 17.843 -15.847 -5.845 1.00 49.53 311 B 1 +ATOM 6855 N N . THR B 2 312 ? 14.157 -14.787 -11.626 1.00 80.92 312 B 1 +ATOM 6856 C CA . THR B 2 312 ? 12.726 -15.058 -11.426 1.00 80.66 312 B 1 +ATOM 6857 C C . THR B 2 312 ? 12.092 -15.718 -12.653 1.00 80.83 312 B 1 +ATOM 6858 O O . THR B 2 312 ? 11.324 -16.661 -12.505 1.00 79.95 312 B 1 +ATOM 6859 C CB . THR B 2 312 ? 11.966 -13.775 -11.080 1.00 80.45 312 B 1 +ATOM 6860 O OG1 . THR B 2 312 ? 12.647 -13.016 -10.120 1.00 71.86 312 B 1 +ATOM 6861 C CG2 . THR B 2 312 ? 10.598 -14.095 -10.483 1.00 70.88 312 B 1 +ATOM 6862 N N . PHE B 2 313 ? 12.456 -15.302 -13.874 1.00 81.16 313 B 1 +ATOM 6863 C CA . PHE B 2 313 ? 12.029 -15.963 -15.100 1.00 80.84 313 B 1 +ATOM 6864 C C . PHE B 2 313 ? 12.505 -17.413 -15.157 1.00 79.67 313 B 1 +ATOM 6865 O O . PHE B 2 313 ? 11.711 -18.310 -15.423 1.00 78.33 313 B 1 +ATOM 6866 C CB . PHE B 2 313 ? 12.526 -15.198 -16.328 1.00 81.37 313 B 1 +ATOM 6867 C CG . PHE B 2 313 ? 11.938 -13.816 -16.563 1.00 81.43 313 B 1 +ATOM 6868 C CD1 . PHE B 2 313 ? 10.707 -13.419 -16.022 1.00 73.98 313 B 1 +ATOM 6869 C CD2 . PHE B 2 313 ? 12.626 -12.928 -17.412 1.00 73.80 313 B 1 +ATOM 6870 C CE1 . PHE B 2 313 ? 10.172 -12.158 -16.315 1.00 73.20 313 B 1 +ATOM 6871 C CE2 . PHE B 2 313 ? 12.093 -11.672 -17.712 1.00 72.75 313 B 1 +ATOM 6872 C CZ . PHE B 2 313 ? 10.867 -11.280 -17.166 1.00 77.95 313 B 1 +ATOM 6873 N N . LYS B 2 314 ? 13.780 -17.666 -14.839 1.00 81.62 314 B 1 +ATOM 6874 C CA . LYS B 2 314 ? 14.298 -19.031 -14.747 1.00 80.06 314 B 1 +ATOM 6875 C C . LYS B 2 314 ? 13.529 -19.856 -13.721 1.00 78.30 314 B 1 +ATOM 6876 O O . LYS B 2 314 ? 13.204 -20.999 -14.012 1.00 75.89 314 B 1 +ATOM 6877 C CB . LYS B 2 314 ? 15.791 -19.051 -14.411 1.00 79.58 314 B 1 +ATOM 6878 C CG . LYS B 2 314 ? 16.662 -18.773 -15.644 1.00 71.20 314 B 1 +ATOM 6879 C CD . LYS B 2 314 ? 18.133 -18.904 -15.254 1.00 66.87 314 B 1 +ATOM 6880 C CE . LYS B 2 314 ? 19.021 -18.748 -16.498 1.00 57.37 314 B 1 +ATOM 6881 N NZ . LYS B 2 314 ? 20.431 -19.042 -16.182 1.00 50.79 314 B 1 +ATOM 6882 N N . GLU B 2 315 ? 13.207 -19.303 -12.572 1.00 79.14 315 B 1 +ATOM 6883 C CA . GLU B 2 315 ? 12.417 -19.992 -11.554 1.00 77.65 315 B 1 +ATOM 6884 C C . GLU B 2 315 ? 11.000 -20.309 -12.034 1.00 76.70 315 B 1 +ATOM 6885 O O . GLU B 2 315 ? 10.513 -21.402 -11.781 1.00 74.56 315 B 1 +ATOM 6886 C CB . GLU B 2 315 ? 12.364 -19.154 -10.270 1.00 75.53 315 B 1 +ATOM 6887 C CG . GLU B 2 315 ? 13.679 -19.187 -9.489 1.00 67.25 315 B 1 +ATOM 6888 C CD . GLU B 2 315 ? 13.703 -18.201 -8.308 1.00 62.94 315 B 1 +ATOM 6889 O OE1 . GLU B 2 315 ? 14.812 -17.991 -7.753 1.00 55.89 315 B 1 +ATOM 6890 O OE2 . GLU B 2 315 ? 12.641 -17.629 -7.978 1.00 57.71 315 B 1 +ATOM 6891 N N . ILE B 2 316 ? 10.340 -19.401 -12.767 1.00 76.94 316 B 1 +ATOM 6892 C CA . ILE B 2 316 ? 9.005 -19.631 -13.330 1.00 75.92 316 B 1 +ATOM 6893 C C . ILE B 2 316 ? 9.061 -20.728 -14.401 1.00 74.19 316 B 1 +ATOM 6894 O O . ILE B 2 316 ? 8.280 -21.678 -14.337 1.00 71.48 316 B 1 +ATOM 6895 C CB . ILE B 2 316 ? 8.387 -18.316 -13.854 1.00 76.29 316 B 1 +ATOM 6896 C CG1 . ILE B 2 316 ? 8.091 -17.363 -12.681 1.00 72.50 316 B 1 +ATOM 6897 C CG2 . ILE B 2 316 ? 7.086 -18.592 -14.632 1.00 70.96 316 B 1 +ATOM 6898 C CD1 . ILE B 2 316 ? 7.762 -15.925 -13.113 1.00 66.41 316 B 1 +ATOM 6899 N N . PHE B 2 317 ? 10.010 -20.634 -15.355 1.00 77.38 317 B 1 +ATOM 6900 C CA . PHE B 2 317 ? 10.177 -21.650 -16.401 1.00 74.60 317 B 1 +ATOM 6901 C C . PHE B 2 317 ? 10.619 -22.999 -15.832 1.00 71.77 317 B 1 +ATOM 6902 O O . PHE B 2 317 ? 10.045 -24.025 -16.183 1.00 66.88 317 B 1 +ATOM 6903 C CB . PHE B 2 317 ? 11.176 -21.159 -17.457 1.00 72.42 317 B 1 +ATOM 6904 C CG . PHE B 2 317 ? 10.540 -20.311 -18.532 1.00 68.07 317 B 1 +ATOM 6905 C CD1 . PHE B 2 317 ? 9.752 -20.923 -19.522 1.00 61.53 317 B 1 +ATOM 6906 C CD2 . PHE B 2 317 ? 10.726 -18.929 -18.558 1.00 60.17 317 B 1 +ATOM 6907 C CE1 . PHE B 2 317 ? 9.157 -20.146 -20.528 1.00 54.91 317 B 1 +ATOM 6908 C CE2 . PHE B 2 317 ? 10.131 -18.140 -19.568 1.00 54.14 317 B 1 +ATOM 6909 C CZ . PHE B 2 317 ? 9.341 -18.765 -20.551 1.00 55.02 317 B 1 +ATOM 6910 N N . CYS B 2 318 ? 11.588 -23.021 -14.918 1.00 71.85 318 B 1 +ATOM 6911 C CA . CYS B 2 318 ? 12.011 -24.246 -14.253 1.00 70.14 318 B 1 +ATOM 6912 C C . CYS B 2 318 ? 10.871 -24.832 -13.441 1.00 67.05 318 B 1 +ATOM 6913 O O . CYS B 2 318 ? 10.679 -26.030 -13.505 1.00 61.41 318 B 1 +ATOM 6914 C CB . CYS B 2 318 ? 13.258 -24.017 -13.392 1.00 67.09 318 B 1 +ATOM 6915 S SG . CYS B 2 318 ? 14.719 -23.799 -14.450 1.00 58.65 318 B 1 +ATOM 6916 N N . CYS B 2 319 ? 10.051 -24.052 -12.750 1.00 64.72 319 B 1 +ATOM 6917 C CA . CYS B 2 319 ? 8.934 -24.578 -11.975 1.00 62.55 319 B 1 +ATOM 6918 C C . CYS B 2 319 ? 7.867 -25.254 -12.850 1.00 60.78 319 B 1 +ATOM 6919 O O . CYS B 2 319 ? 7.276 -26.238 -12.432 1.00 56.91 319 B 1 +ATOM 6920 C CB . CYS B 2 319 ? 8.347 -23.453 -11.103 1.00 59.39 319 B 1 +ATOM 6921 S SG . CYS B 2 319 ? 7.492 -24.147 -9.659 1.00 53.70 319 B 1 +ATOM 6922 N N . SER B 2 320 ? 7.663 -24.778 -14.083 1.00 59.20 320 B 1 +ATOM 6923 C CA . SER B 2 320 ? 6.768 -25.449 -15.040 1.00 57.95 320 B 1 +ATOM 6924 C C . SER B 2 320 ? 7.323 -26.778 -15.554 1.00 56.67 320 B 1 +ATOM 6925 O O . SER B 2 320 ? 6.566 -27.731 -15.719 1.00 53.86 320 B 1 +ATOM 6926 C CB . SER B 2 320 ? 6.423 -24.505 -16.200 1.00 55.22 320 B 1 +ATOM 6927 O OG . SER B 2 320 ? 7.529 -24.236 -17.021 1.00 51.83 320 B 1 +ATOM 6928 N N . GLN B 2 321 ? 8.651 -26.901 -15.739 1.00 56.72 321 B 1 +ATOM 6929 C CA . GLN B 2 321 ? 9.312 -28.171 -16.074 1.00 56.10 321 B 1 +ATOM 6930 C C . GLN B 2 321 ? 9.575 -29.052 -14.841 1.00 54.87 321 B 1 +ATOM 6931 O O . GLN B 2 321 ? 9.644 -30.276 -14.947 1.00 52.29 321 B 1 +ATOM 6932 C CB . GLN B 2 321 ? 10.628 -27.897 -16.808 1.00 53.78 321 B 1 +ATOM 6933 C CG . GLN B 2 321 ? 10.416 -27.391 -18.245 1.00 49.89 321 B 1 +ATOM 6934 C CD . GLN B 2 321 ? 11.722 -27.282 -19.033 1.00 45.65 321 B 1 +ATOM 6935 O OE1 . GLN B 2 321 ? 12.819 -27.283 -18.508 1.00 43.52 321 B 1 +ATOM 6936 N NE2 . GLN B 2 321 ? 11.651 -27.176 -20.341 1.00 41.63 321 B 1 +ATOM 6937 N N . ALA B 2 322 ? 9.718 -28.449 -13.668 1.00 45.75 322 B 1 +ATOM 6938 C CA . ALA B 2 322 ? 10.101 -29.098 -12.417 1.00 45.44 322 B 1 +ATOM 6939 C C . ALA B 2 322 ? 8.964 -29.825 -11.702 1.00 45.42 322 B 1 +ATOM 6940 O O . ALA B 2 322 ? 9.162 -30.278 -10.576 1.00 43.69 322 B 1 +ATOM 6941 C CB . ALA B 2 322 ? 10.812 -28.111 -11.485 1.00 43.15 322 B 1 +ATOM 6942 N N . LEU B 2 323 ? 7.849 -30.066 -12.355 1.00 40.19 323 B 1 +ATOM 6943 C CA . LEU B 2 323 ? 7.039 -31.242 -12.047 1.00 40.72 323 B 1 +ATOM 6944 C C . LEU B 2 323 ? 7.903 -32.525 -12.043 1.00 41.01 323 B 1 +ATOM 6945 O O . LEU B 2 323 ? 7.628 -33.434 -11.273 1.00 39.99 323 B 1 +ATOM 6946 C CB . LEU B 2 323 ? 5.878 -31.356 -13.056 1.00 38.68 323 B 1 +ATOM 6947 C CG . LEU B 2 323 ? 4.581 -30.696 -12.548 1.00 35.38 323 B 1 +ATOM 6948 C CD1 . LEU B 2 323 ? 3.666 -30.340 -13.711 1.00 33.07 323 B 1 +ATOM 6949 C CD2 . LEU B 2 323 ? 3.818 -31.650 -11.620 1.00 35.74 323 B 1 +ATOM 6950 N N . SER B 2 324 ? 8.975 -32.570 -12.837 1.00 37.91 324 B 1 +ATOM 6951 C CA . SER B 2 324 ? 9.934 -33.682 -12.837 1.00 38.80 324 B 1 +ATOM 6952 C C . SER B 2 324 ? 11.089 -33.529 -11.842 1.00 39.58 324 B 1 +ATOM 6953 O O . SER B 2 324 ? 11.558 -34.528 -11.299 1.00 38.51 324 B 1 +ATOM 6954 C CB . SER B 2 324 ? 10.480 -33.882 -14.254 1.00 36.94 324 B 1 +ATOM 6955 O OG . SER B 2 324 ? 11.261 -32.784 -14.671 1.00 34.52 324 B 1 +ATOM 6956 N N . CYS B 2 325 ? 11.574 -32.324 -11.580 1.00 39.92 325 B 1 +ATOM 6957 C CA . CYS B 2 325 ? 12.763 -32.082 -10.766 1.00 40.56 325 B 1 +ATOM 6958 C C . CYS B 2 325 ? 12.497 -31.961 -9.248 1.00 40.27 325 B 1 +ATOM 6959 O O . CYS B 2 325 ? 13.328 -31.416 -8.523 1.00 39.25 325 B 1 +ATOM 6960 C CB . CYS B 2 325 ? 13.559 -30.896 -11.329 1.00 38.47 325 B 1 +ATOM 6961 S SG . CYS B 2 325 ? 14.457 -31.399 -12.820 1.00 35.38 325 B 1 +ATOM 6962 N N . ILE B 2 326 ? 11.398 -32.510 -8.762 1.00 38.44 326 B 1 +ATOM 6963 C CA . ILE B 2 326 ? 11.075 -32.550 -7.317 1.00 38.92 326 B 1 +ATOM 6964 C C . ILE B 2 326 ? 12.164 -33.272 -6.506 1.00 39.15 326 B 1 +ATOM 6965 O O . ILE B 2 326 ? 12.369 -32.964 -5.337 1.00 38.08 326 B 1 +ATOM 6966 C CB . ILE B 2 326 ? 9.681 -33.209 -7.121 1.00 37.03 326 B 1 +ATOM 6967 C CG1 . ILE B 2 326 ? 8.573 -32.371 -7.795 1.00 35.07 326 B 1 +ATOM 6968 C CG2 . ILE B 2 326 ? 9.346 -33.414 -5.625 1.00 35.71 326 B 1 +ATOM 6969 C CD1 . ILE B 2 326 ? 7.198 -33.052 -7.822 1.00 33.78 326 B 1 +ATOM 6970 N N . SER B 2 327 ? 12.887 -34.191 -7.109 1.00 35.42 327 B 1 +ATOM 6971 C CA . SER B 2 327 ? 13.807 -35.074 -6.384 1.00 36.32 327 B 1 +ATOM 6972 C C . SER B 2 327 ? 14.967 -34.365 -5.670 1.00 37.01 327 B 1 +ATOM 6973 O O . SER B 2 327 ? 15.433 -34.862 -4.647 1.00 35.47 327 B 1 +ATOM 6974 C CB . SER B 2 327 ? 14.387 -36.120 -7.344 1.00 33.79 327 B 1 +ATOM 6975 O OG . SER B 2 327 ? 15.170 -35.502 -8.350 1.00 31.47 327 B 1 +ATOM 6976 N N . PHE B 2 328 ? 15.449 -33.239 -6.203 1.00 35.29 328 B 1 +ATOM 6977 C CA . PHE B 2 328 ? 16.679 -32.635 -5.685 1.00 35.37 328 B 1 +ATOM 6978 C C . PHE B 2 328 ? 16.479 -31.830 -4.400 1.00 35.84 328 B 1 +ATOM 6979 O O . PHE B 2 328 ? 17.445 -31.597 -3.667 1.00 34.72 328 B 1 +ATOM 6980 C CB . PHE B 2 328 ? 17.388 -31.841 -6.791 1.00 32.96 328 B 1 +ATOM 6981 C CG . PHE B 2 328 ? 18.872 -32.128 -6.831 1.00 30.08 328 B 1 +ATOM 6982 C CD1 . PHE B 2 328 ? 19.777 -31.394 -6.045 1.00 27.85 328 B 1 +ATOM 6983 C CD2 . PHE B 2 328 ? 19.356 -33.163 -7.652 1.00 28.03 328 B 1 +ATOM 6984 C CE1 . PHE B 2 328 ? 21.149 -31.688 -6.073 1.00 26.41 328 B 1 +ATOM 6985 C CE2 . PHE B 2 328 ? 20.725 -33.457 -7.692 1.00 25.73 328 B 1 +ATOM 6986 C CZ . PHE B 2 328 ? 21.628 -32.722 -6.905 1.00 26.39 328 B 1 +ATOM 6987 N N . LEU B 2 329 ? 15.247 -31.465 -4.076 1.00 36.44 329 B 1 +ATOM 6988 C CA . LEU B 2 329 ? 14.884 -30.812 -2.805 1.00 37.39 329 B 1 +ATOM 6989 C C . LEU B 2 329 ? 14.890 -31.782 -1.604 1.00 37.59 329 B 1 +ATOM 6990 O O . LEU B 2 329 ? 14.256 -31.525 -0.586 1.00 36.16 329 B 1 +ATOM 6991 C CB . LEU B 2 329 ? 13.533 -30.083 -2.980 1.00 35.24 329 B 1 +ATOM 6992 C CG . LEU B 2 329 ? 13.646 -28.737 -3.712 1.00 32.24 329 B 1 +ATOM 6993 C CD1 . LEU B 2 329 ? 12.276 -28.295 -4.223 1.00 30.34 329 B 1 +ATOM 6994 C CD2 . LEU B 2 329 ? 14.165 -27.637 -2.776 1.00 31.81 329 B 1 +ATOM 6995 N N . SER B 2 330 ? 15.597 -32.886 -1.705 1.00 35.97 330 B 1 +ATOM 6996 C CA . SER B 2 330 ? 15.565 -33.985 -0.731 1.00 37.10 330 B 1 +ATOM 6997 C C . SER B 2 330 ? 16.003 -33.622 0.686 1.00 38.34 330 B 1 +ATOM 6998 O O . SER B 2 330 ? 15.437 -34.148 1.647 1.00 36.34 330 B 1 +ATOM 6999 C CB . SER B 2 330 ? 16.447 -35.131 -1.235 1.00 34.21 330 B 1 +ATOM 7000 O OG . SER B 2 330 ? 17.771 -34.682 -1.481 1.00 31.93 330 B 1 +ATOM 7001 N N . ARG B 2 331 ? 17.035 -32.788 0.832 1.00 40.53 331 B 1 +ATOM 7002 C CA . ARG B 2 331 ? 17.656 -32.543 2.145 1.00 41.01 331 B 1 +ATOM 7003 C C . ARG B 2 331 ? 16.978 -31.459 2.968 1.00 41.90 331 B 1 +ATOM 7004 O O . ARG B 2 331 ? 17.228 -31.398 4.170 1.00 39.30 331 B 1 +ATOM 7005 C CB . ARG B 2 331 ? 19.151 -32.228 2.011 1.00 37.40 331 B 1 +ATOM 7006 C CG . ARG B 2 331 ? 19.993 -33.493 1.816 1.00 34.47 331 B 1 +ATOM 7007 C CD . ARG B 2 331 ? 21.470 -33.116 1.917 1.00 31.30 331 B 1 +ATOM 7008 N NE . ARG B 2 331 ? 22.346 -34.286 1.750 1.00 28.47 331 B 1 +ATOM 7009 C CZ . ARG B 2 331 ? 23.675 -34.268 1.779 1.00 25.95 331 B 1 +ATOM 7010 N NH1 . ARG B 2 331 ? 24.328 -33.163 1.975 1.00 24.45 331 B 1 +ATOM 7011 N NH2 . ARG B 2 331 ? 24.348 -35.358 1.613 1.00 22.80 331 B 1 +ATOM 7012 N N . VAL B 2 332 ? 16.190 -30.614 2.343 1.00 47.08 332 B 1 +ATOM 7013 C CA . VAL B 2 332 ? 15.384 -29.637 3.071 1.00 47.52 332 B 1 +ATOM 7014 C C . VAL B 2 332 ? 14.250 -30.430 3.719 1.00 50.29 332 B 1 +ATOM 7015 O O . VAL B 2 332 ? 13.527 -31.149 3.030 1.00 47.34 332 B 1 +ATOM 7016 C CB . VAL B 2 332 ? 14.867 -28.525 2.140 1.00 43.13 332 B 1 +ATOM 7017 C CG1 . VAL B 2 332 ? 14.095 -27.483 2.937 1.00 39.34 332 B 1 +ATOM 7018 C CG2 . VAL B 2 332 ? 16.040 -27.812 1.452 1.00 38.82 332 B 1 +ATOM 7019 N N . SER B 2 333 ? 14.137 -30.367 5.039 1.00 56.13 333 B 1 +ATOM 7020 C CA . SER B 2 333 ? 13.035 -31.040 5.711 1.00 57.73 333 B 1 +ATOM 7021 C C . SER B 2 333 ? 11.711 -30.492 5.184 1.00 61.81 333 B 1 +ATOM 7022 O O . SER B 2 333 ? 11.581 -29.284 4.976 1.00 57.89 333 B 1 +ATOM 7023 C CB . SER B 2 333 ? 13.127 -30.888 7.230 1.00 51.77 333 B 1 +ATOM 7024 O OG . SER B 2 333 ? 12.791 -29.589 7.651 1.00 47.40 333 B 1 +ATOM 7025 N N . LYS B 2 334 ? 10.705 -31.345 5.000 1.00 63.09 334 B 1 +ATOM 7026 C CA . LYS B 2 334 ? 9.387 -30.913 4.490 1.00 66.33 334 B 1 +ATOM 7027 C C . LYS B 2 334 ? 8.795 -29.742 5.279 1.00 72.44 334 B 1 +ATOM 7028 O O . LYS B 2 334 ? 8.100 -28.913 4.712 1.00 67.74 334 B 1 +ATOM 7029 C CB . LYS B 2 334 ? 8.402 -32.084 4.539 1.00 58.79 334 B 1 +ATOM 7030 C CG . LYS B 2 334 ? 8.655 -33.122 3.441 1.00 50.66 334 B 1 +ATOM 7031 C CD . LYS B 2 334 ? 7.547 -34.185 3.490 1.00 44.62 334 B 1 +ATOM 7032 C CE . LYS B 2 334 ? 7.688 -35.179 2.345 1.00 38.08 334 B 1 +ATOM 7033 N NZ . LYS B 2 334 ? 6.591 -36.156 2.369 1.00 33.10 334 B 1 +ATOM 7034 N N . GLY B 2 335 ? 9.097 -29.667 6.568 1.00 71.68 335 B 1 +ATOM 7035 C CA . GLY B 2 335 ? 8.667 -28.568 7.416 1.00 74.30 335 B 1 +ATOM 7036 C C . GLY B 2 335 ? 9.322 -27.225 7.090 1.00 77.87 335 B 1 +ATOM 7037 O O . GLY B 2 335 ? 8.714 -26.196 7.339 1.00 73.98 335 B 1 +ATOM 7038 N N . GLU B 2 336 ? 10.525 -27.210 6.490 1.00 76.52 336 B 1 +ATOM 7039 C CA . GLU B 2 336 ? 11.208 -25.948 6.157 1.00 77.60 336 B 1 +ATOM 7040 C C . GLU B 2 336 ? 10.458 -25.160 5.081 1.00 79.78 336 B 1 +ATOM 7041 O O . GLU B 2 336 ? 10.410 -23.934 5.139 1.00 76.82 336 B 1 +ATOM 7042 C CB . GLU B 2 336 ? 12.656 -26.215 5.733 1.00 73.84 336 B 1 +ATOM 7043 C CG . GLU B 2 336 ? 13.480 -24.919 5.672 1.00 68.03 336 B 1 +ATOM 7044 C CD . GLU B 2 336 ? 14.925 -25.111 5.174 1.00 62.99 336 B 1 +ATOM 7045 O OE1 . GLU B 2 336 ? 15.515 -24.121 4.692 1.00 55.98 336 B 1 +ATOM 7046 O OE2 . GLU B 2 336 ? 15.460 -26.238 5.241 1.00 58.19 336 B 1 +ATOM 7047 N N . GLU B 2 337 ? 9.805 -25.844 4.125 1.00 76.30 337 B 1 +ATOM 7048 C CA . GLU B 2 337 ? 9.028 -25.197 3.061 1.00 76.97 337 B 1 +ATOM 7049 C C . GLU B 2 337 ? 7.865 -24.366 3.612 1.00 79.93 337 B 1 +ATOM 7050 O O . GLU B 2 337 ? 7.520 -23.338 3.030 1.00 77.30 337 B 1 +ATOM 7051 C CB . GLU B 2 337 ? 8.482 -26.246 2.080 1.00 71.81 337 B 1 +ATOM 7052 C CG . GLU B 2 337 ? 9.591 -26.965 1.297 1.00 62.44 337 B 1 +ATOM 7053 C CD . GLU B 2 337 ? 9.046 -27.928 0.224 1.00 55.13 337 B 1 +ATOM 7054 O OE1 . GLU B 2 337 ? 9.873 -28.405 -0.591 1.00 46.95 337 B 1 +ATOM 7055 O OE2 . GLU B 2 337 ? 7.823 -28.213 0.215 1.00 49.29 337 B 1 +ATOM 7056 N N . LEU B 2 338 ? 7.312 -24.746 4.765 1.00 81.77 338 B 1 +ATOM 7057 C CA . LEU B 2 338 ? 6.238 -24.003 5.432 1.00 83.32 338 B 1 +ATOM 7058 C C . LEU B 2 338 ? 6.693 -22.627 5.942 1.00 85.48 338 B 1 +ATOM 7059 O O . LEU B 2 338 ? 5.864 -21.755 6.184 1.00 82.86 338 B 1 +ATOM 7060 C CB . LEU B 2 338 ? 5.685 -24.843 6.596 1.00 81.74 338 B 1 +ATOM 7061 C CG . LEU B 2 338 ? 5.109 -26.212 6.192 1.00 79.21 338 B 1 +ATOM 7062 C CD1 . LEU B 2 338 ? 4.751 -27.007 7.442 1.00 72.46 338 B 1 +ATOM 7063 C CD2 . LEU B 2 338 ? 3.848 -26.069 5.350 1.00 72.45 338 B 1 +ATOM 7064 N N . PHE B 2 339 ? 8.005 -22.422 6.080 1.00 84.96 339 B 1 +ATOM 7065 C CA . PHE B 2 339 ? 8.602 -21.203 6.617 1.00 86.17 339 B 1 +ATOM 7066 C C . PHE B 2 339 ? 9.317 -20.350 5.554 1.00 85.69 339 B 1 +ATOM 7067 O O . PHE B 2 339 ? 10.066 -19.431 5.905 1.00 80.99 339 B 1 +ATOM 7068 C CB . PHE B 2 339 ? 9.548 -21.573 7.767 1.00 86.15 339 B 1 +ATOM 7069 C CG . PHE B 2 339 ? 8.858 -22.213 8.953 1.00 87.91 339 B 1 +ATOM 7070 C CD1 . PHE B 2 339 ? 8.312 -21.406 9.964 1.00 79.14 339 B 1 +ATOM 7071 C CD2 . PHE B 2 339 ? 8.757 -23.604 9.040 1.00 79.38 339 B 1 +ATOM 7072 C CE1 . PHE B 2 339 ? 7.674 -21.993 11.059 1.00 78.71 339 B 1 +ATOM 7073 C CE2 . PHE B 2 339 ? 8.116 -24.201 10.140 1.00 78.63 339 B 1 +ATOM 7074 C CZ . PHE B 2 339 ? 7.571 -23.394 11.154 1.00 86.84 339 B 1 +ATOM 7075 N N . THR B 2 340 ? 9.087 -20.625 4.260 1.00 86.29 340 B 1 +ATOM 7076 C CA . THR B 2 340 ? 9.722 -19.869 3.162 1.00 82.70 340 B 1 +ATOM 7077 C C . THR B 2 340 ? 9.222 -18.428 3.034 1.00 81.07 340 B 1 +ATOM 7078 O O . THR B 2 340 ? 9.909 -17.583 2.455 1.00 73.01 340 B 1 +ATOM 7079 C CB . THR B 2 340 ? 9.504 -20.568 1.814 1.00 78.96 340 B 1 +ATOM 7080 O OG1 . THR B 2 340 ? 8.141 -20.820 1.590 1.00 71.14 340 B 1 +ATOM 7081 C CG2 . THR B 2 340 ? 10.260 -21.890 1.724 1.00 67.99 340 B 1 +ATOM 7082 N N . GLY B 2 341 ? 8.042 -18.128 3.560 1.00 82.92 341 B 1 +ATOM 7083 C CA . GLY B 2 341 ? 7.431 -16.812 3.546 1.00 83.28 341 B 1 +ATOM 7084 C C . GLY B 2 341 ? 7.044 -16.328 4.941 1.00 85.81 341 B 1 +ATOM 7085 O O . GLY B 2 341 ? 7.392 -16.935 5.954 1.00 82.77 341 B 1 +ATOM 7086 N N . VAL B 2 342 ? 6.305 -15.241 4.980 1.00 87.02 342 B 1 +ATOM 7087 C CA . VAL B 2 342 ? 5.718 -14.727 6.219 1.00 87.82 342 B 1 +ATOM 7088 C C . VAL B 2 342 ? 4.580 -15.654 6.642 1.00 88.37 342 B 1 +ATOM 7089 O O . VAL B 2 342 ? 3.629 -15.873 5.888 1.00 85.67 342 B 1 +ATOM 7090 C CB . VAL B 2 342 ? 5.221 -13.283 6.059 1.00 85.48 342 B 1 +ATOM 7091 C CG1 . VAL B 2 342 ? 4.638 -12.754 7.365 1.00 75.98 342 B 1 +ATOM 7092 C CG2 . VAL B 2 342 ? 6.368 -12.346 5.655 1.00 74.84 342 B 1 +ATOM 7093 N N . VAL B 2 343 ? 4.683 -16.186 7.859 1.00 89.82 343 B 1 +ATOM 7094 C CA . VAL B 2 343 ? 3.702 -17.095 8.445 1.00 90.30 343 B 1 +ATOM 7095 C C . VAL B 2 343 ? 2.958 -16.373 9.563 1.00 91.12 343 B 1 +ATOM 7096 O O . VAL B 2 343 ? 3.594 -15.799 10.443 1.00 89.70 343 B 1 +ATOM 7097 C CB . VAL B 2 343 ? 4.381 -18.374 8.962 1.00 88.92 343 B 1 +ATOM 7098 C CG1 . VAL B 2 343 ? 3.373 -19.331 9.607 1.00 80.94 343 B 1 +ATOM 7099 C CG2 . VAL B 2 343 ? 5.076 -19.131 7.826 1.00 79.66 343 B 1 +ATOM 7100 N N . PRO B 2 344 ? 1.618 -16.380 9.567 1.00 90.82 344 B 1 +ATOM 7101 C CA . PRO B 2 344 ? 0.849 -15.852 10.682 1.00 90.84 344 B 1 +ATOM 7102 C C . PRO B 2 344 ? 1.042 -16.706 11.937 1.00 91.20 344 B 1 +ATOM 7103 O O . PRO B 2 344 ? 1.052 -17.938 11.876 1.00 90.01 344 B 1 +ATOM 7104 C CB . PRO B 2 344 ? -0.599 -15.836 10.207 1.00 89.27 344 B 1 +ATOM 7105 C CG . PRO B 2 344 ? -0.653 -16.897 9.116 1.00 86.20 344 B 1 +ATOM 7106 C CD . PRO B 2 344 ? 0.751 -16.886 8.517 1.00 88.91 344 B 1 +ATOM 7107 N N . ILE B 2 345 ? 1.147 -16.039 13.080 1.00 92.59 345 B 1 +ATOM 7108 C CA . ILE B 2 345 ? 1.329 -16.668 14.389 1.00 92.76 345 B 1 +ATOM 7109 C C . ILE B 2 345 ? 0.139 -16.320 15.283 1.00 92.40 345 B 1 +ATOM 7110 O O . ILE B 2 345 ? -0.273 -15.166 15.371 1.00 90.39 345 B 1 +ATOM 7111 C CB . ILE B 2 345 ? 2.653 -16.236 15.059 1.00 91.94 345 B 1 +ATOM 7112 C CG1 . ILE B 2 345 ? 3.872 -16.472 14.132 1.00 86.40 345 B 1 +ATOM 7113 C CG2 . ILE B 2 345 ? 2.855 -17.006 16.380 1.00 84.91 345 B 1 +ATOM 7114 C CD1 . ILE B 2 345 ? 5.162 -15.839 14.659 1.00 83.95 345 B 1 +ATOM 7115 N N . LEU B 2 346 ? -0.354 -17.324 15.989 1.00 92.40 346 B 1 +ATOM 7116 C CA . LEU B 2 346 ? -1.281 -17.199 17.095 1.00 92.17 346 B 1 +ATOM 7117 C C . LEU B 2 346 ? -0.623 -17.761 18.352 1.00 92.11 346 B 1 +ATOM 7118 O O . LEU B 2 346 ? -0.122 -18.884 18.340 1.00 90.75 346 B 1 +ATOM 7119 C CB . LEU B 2 346 ? -2.571 -17.945 16.739 1.00 91.08 346 B 1 +ATOM 7120 C CG . LEU B 2 346 ? -3.568 -18.070 17.905 1.00 84.42 346 B 1 +ATOM 7121 C CD1 . LEU B 2 346 ? -4.039 -16.705 18.406 1.00 75.52 346 B 1 +ATOM 7122 C CD2 . LEU B 2 346 ? -4.789 -18.880 17.462 1.00 74.37 346 B 1 +ATOM 7123 N N . VAL B 2 347 ? -0.672 -17.002 19.440 1.00 93.13 347 B 1 +ATOM 7124 C CA . VAL B 2 347 ? -0.200 -17.464 20.744 1.00 92.85 347 B 1 +ATOM 7125 C C . VAL B 2 347 ? -1.338 -17.343 21.754 1.00 92.82 347 B 1 +ATOM 7126 O O . VAL B 2 347 ? -1.925 -16.273 21.896 1.00 91.52 347 B 1 +ATOM 7127 C CB . VAL B 2 347 ? 1.048 -16.700 21.217 1.00 91.82 347 B 1 +ATOM 7128 C CG1 . VAL B 2 347 ? 1.606 -17.303 22.501 1.00 84.11 347 B 1 +ATOM 7129 C CG2 . VAL B 2 347 ? 2.159 -16.715 20.162 1.00 82.74 347 B 1 +ATOM 7130 N N . GLU B 2 348 ? -1.641 -18.418 22.463 1.00 92.59 348 B 1 +ATOM 7131 C CA . GLU B 2 348 ? -2.588 -18.430 23.569 1.00 92.45 348 B 1 +ATOM 7132 C C . GLU B 2 348 ? -1.895 -18.976 24.811 1.00 92.60 348 B 1 +ATOM 7133 O O . GLU B 2 348 ? -1.293 -20.056 24.775 1.00 90.92 348 B 1 +ATOM 7134 C CB . GLU B 2 348 ? -3.839 -19.250 23.231 1.00 91.10 348 B 1 +ATOM 7135 C CG . GLU B 2 348 ? -4.705 -18.562 22.161 1.00 83.48 348 B 1 +ATOM 7136 C CD . GLU B 2 348 ? -6.015 -19.306 21.844 1.00 77.92 348 B 1 +ATOM 7137 O OE1 . GLU B 2 348 ? -6.866 -18.716 21.141 1.00 67.11 348 B 1 +ATOM 7138 O OE2 . GLU B 2 348 ? -6.181 -20.480 22.241 1.00 68.74 348 B 1 +ATOM 7139 N N . LEU B 2 349 ? -1.963 -18.214 25.900 1.00 93.41 349 B 1 +ATOM 7140 C CA . LEU B 2 349 ? -1.387 -18.606 27.171 1.00 93.44 349 B 1 +ATOM 7141 C C . LEU B 2 349 ? -2.432 -18.477 28.278 1.00 93.53 349 B 1 +ATOM 7142 O O . LEU B 2 349 ? -2.986 -17.395 28.478 1.00 91.84 349 B 1 +ATOM 7143 C CB . LEU B 2 349 ? -0.110 -17.779 27.439 1.00 92.57 349 B 1 +ATOM 7144 C CG . LEU B 2 349 ? 0.564 -18.038 28.808 1.00 91.85 349 B 1 +ATOM 7145 C CD1 . LEU B 2 349 ? 2.060 -17.795 28.708 1.00 80.82 349 B 1 +ATOM 7146 C CD2 . LEU B 2 349 ? 0.055 -17.125 29.917 1.00 81.10 349 B 1 +ATOM 7147 N N . ASP B 2 350 ? -2.631 -19.561 29.040 1.00 93.21 350 B 1 +ATOM 7148 C CA . ASP B 2 350 ? -3.328 -19.540 30.318 1.00 93.17 350 B 1 +ATOM 7149 C C . ASP B 2 350 ? -2.315 -19.744 31.439 1.00 92.93 350 B 1 +ATOM 7150 O O . ASP B 2 350 ? -1.522 -20.687 31.431 1.00 90.23 350 B 1 +ATOM 7151 C CB . ASP B 2 350 ? -4.450 -20.581 30.343 1.00 91.74 350 B 1 +ATOM 7152 C CG . ASP B 2 350 ? -5.657 -20.165 29.495 1.00 86.69 350 B 1 +ATOM 7153 O OD1 . ASP B 2 350 ? -6.056 -18.976 29.580 1.00 77.77 350 B 1 +ATOM 7154 O OD2 . ASP B 2 350 ? -6.218 -21.036 28.808 1.00 76.63 350 B 1 +ATOM 7155 N N . GLY B 2 351 ? -2.309 -18.816 32.399 1.00 93.47 351 B 1 +ATOM 7156 C CA . GLY B 2 351 ? -1.353 -18.779 33.481 1.00 92.87 351 B 1 +ATOM 7157 C C . GLY B 2 351 ? -1.993 -18.767 34.862 1.00 93.62 351 B 1 +ATOM 7158 O O . GLY B 2 351 ? -3.065 -18.205 35.074 1.00 91.30 351 B 1 +ATOM 7159 N N . ASP B 2 352 ? -1.294 -19.359 35.819 1.00 93.58 352 B 1 +ATOM 7160 C CA . ASP B 2 352 ? -1.614 -19.332 37.252 1.00 93.88 352 B 1 +ATOM 7161 C C . ASP B 2 352 ? -0.302 -19.166 38.025 1.00 93.98 352 B 1 +ATOM 7162 O O . ASP B 2 352 ? 0.511 -20.094 38.085 1.00 90.35 352 B 1 +ATOM 7163 C CB . ASP B 2 352 ? -2.364 -20.627 37.616 1.00 92.01 352 B 1 +ATOM 7164 C CG . ASP B 2 352 ? -2.819 -20.735 39.078 1.00 89.31 352 B 1 +ATOM 7165 O OD1 . ASP B 2 352 ? -2.308 -20.003 39.955 1.00 79.80 352 B 1 +ATOM 7166 O OD2 . ASP B 2 352 ? -3.687 -21.599 39.335 1.00 78.54 352 B 1 +ATOM 7167 N N . VAL B 2 353 ? -0.084 -17.983 38.596 1.00 93.41 353 B 1 +ATOM 7168 C CA . VAL B 2 353 ? 1.107 -17.657 39.385 1.00 93.32 353 B 1 +ATOM 7169 C C . VAL B 2 353 ? 0.680 -17.338 40.808 1.00 92.94 353 B 1 +ATOM 7170 O O . VAL B 2 353 ? -0.025 -16.366 41.034 1.00 90.45 353 B 1 +ATOM 7171 C CB . VAL B 2 353 ? 1.901 -16.488 38.763 1.00 92.64 353 B 1 +ATOM 7172 C CG1 . VAL B 2 353 ? 3.128 -16.156 39.604 1.00 85.01 353 B 1 +ATOM 7173 C CG2 . VAL B 2 353 ? 2.389 -16.846 37.351 1.00 83.84 353 B 1 +ATOM 7174 N N . ASN B 2 354 ? 1.080 -18.156 41.771 1.00 92.87 354 B 1 +ATOM 7175 C CA . ASN B 2 354 ? 0.651 -18.047 43.175 1.00 92.25 354 B 1 +ATOM 7176 C C . ASN B 2 354 ? -0.887 -17.966 43.350 1.00 92.19 354 B 1 +ATOM 7177 O O . ASN B 2 354 ? -1.387 -17.304 44.242 1.00 86.43 354 B 1 +ATOM 7178 C CB . ASN B 2 354 ? 1.393 -16.889 43.869 1.00 90.68 354 B 1 +ATOM 7179 C CG . ASN B 2 354 ? 2.761 -17.246 44.416 1.00 90.11 354 B 1 +ATOM 7180 O OD1 . ASN B 2 354 ? 3.386 -18.224 44.063 1.00 80.64 354 B 1 +ATOM 7181 N ND2 . ASN B 2 354 ? 3.241 -16.442 45.336 1.00 80.98 354 B 1 +ATOM 7182 N N . GLY B 2 355 ? -1.651 -18.610 42.464 1.00 91.59 355 B 1 +ATOM 7183 C CA . GLY B 2 355 ? -3.108 -18.531 42.448 1.00 91.02 355 B 1 +ATOM 7184 C C . GLY B 2 355 ? -3.684 -17.335 41.670 1.00 92.14 355 B 1 +ATOM 7185 O O . GLY B 2 355 ? -4.888 -17.325 41.399 1.00 87.88 355 B 1 +ATOM 7186 N N . HIS B 2 356 ? -2.864 -16.356 41.257 1.00 92.60 356 B 1 +ATOM 7187 C CA . HIS B 2 356 ? -3.264 -15.276 40.359 1.00 91.66 356 B 1 +ATOM 7188 C C . HIS B 2 356 ? -3.404 -15.820 38.935 1.00 92.57 356 B 1 +ATOM 7189 O O . HIS B 2 356 ? -2.420 -16.078 38.256 1.00 90.26 356 B 1 +ATOM 7190 C CB . HIS B 2 356 ? -2.264 -14.129 40.411 1.00 90.33 356 B 1 +ATOM 7191 C CG . HIS B 2 356 ? -2.143 -13.490 41.770 1.00 88.80 356 B 1 +ATOM 7192 N ND1 . HIS B 2 356 ? -3.074 -12.659 42.373 1.00 76.48 356 B 1 +ATOM 7193 C CD2 . HIS B 2 356 ? -1.082 -13.619 42.629 1.00 76.58 356 B 1 +ATOM 7194 C CE1 . HIS B 2 356 ? -2.575 -12.304 43.562 1.00 78.89 356 B 1 +ATOM 7195 N NE2 . HIS B 2 356 ? -1.374 -12.864 43.752 1.00 79.94 356 B 1 +ATOM 7196 N N . LYS B 2 357 ? -4.655 -15.979 38.478 1.00 91.70 357 B 1 +ATOM 7197 C CA . LYS B 2 357 ? -4.956 -16.482 37.141 1.00 92.37 357 B 1 +ATOM 7198 C C . LYS B 2 357 ? -5.000 -15.349 36.121 1.00 92.33 357 B 1 +ATOM 7199 O O . LYS B 2 357 ? -5.546 -14.284 36.385 1.00 89.37 357 B 1 +ATOM 7200 C CB . LYS B 2 357 ? -6.256 -17.277 37.130 1.00 90.91 357 B 1 +ATOM 7201 C CG . LYS B 2 357 ? -6.124 -18.539 38.005 1.00 86.44 357 B 1 +ATOM 7202 C CD . LYS B 2 357 ? -7.345 -19.447 37.858 1.00 81.10 357 B 1 +ATOM 7203 C CE . LYS B 2 357 ? -7.087 -20.679 38.716 1.00 72.28 357 B 1 +ATOM 7204 N NZ . LYS B 2 357 ? -8.121 -21.708 38.507 1.00 62.94 357 B 1 +ATOM 7205 N N . PHE B 2 358 ? -4.471 -15.622 34.935 1.00 93.85 358 B 1 +ATOM 7206 C CA . PHE B 2 358 ? -4.493 -14.697 33.815 1.00 94.03 358 B 1 +ATOM 7207 C C . PHE B 2 358 ? -4.452 -15.447 32.487 1.00 94.37 358 B 1 +ATOM 7208 O O . PHE B 2 358 ? -3.945 -16.564 32.415 1.00 92.48 358 B 1 +ATOM 7209 C CB . PHE B 2 358 ? -3.319 -13.713 33.928 1.00 93.27 358 B 1 +ATOM 7210 C CG . PHE B 2 358 ? -1.942 -14.357 33.881 1.00 93.81 358 B 1 +ATOM 7211 C CD1 . PHE B 2 358 ? -1.346 -14.862 35.059 1.00 85.76 358 B 1 +ATOM 7212 C CD2 . PHE B 2 358 ? -1.248 -14.461 32.663 1.00 85.79 358 B 1 +ATOM 7213 C CE1 . PHE B 2 358 ? -0.083 -15.451 35.013 1.00 85.41 358 B 1 +ATOM 7214 C CE2 . PHE B 2 358 ? 0.025 -15.056 32.615 1.00 84.29 358 B 1 +ATOM 7215 C CZ . PHE B 2 358 ? 0.606 -15.547 33.793 1.00 91.31 358 B 1 +ATOM 7216 N N . SER B 2 359 ? -4.961 -14.815 31.451 1.00 93.16 359 B 1 +ATOM 7217 C CA . SER B 2 359 ? -4.845 -15.303 30.084 1.00 92.95 359 B 1 +ATOM 7218 C C . SER B 2 359 ? -4.210 -14.235 29.199 1.00 92.67 359 B 1 +ATOM 7219 O O . SER B 2 359 ? -4.469 -13.039 29.356 1.00 90.55 359 B 1 +ATOM 7220 C CB . SER B 2 359 ? -6.195 -15.746 29.525 1.00 92.05 359 B 1 +ATOM 7221 O OG . SER B 2 359 ? -6.795 -16.733 30.338 1.00 84.00 359 B 1 +ATOM 7222 N N . VAL B 2 360 ? -3.377 -14.666 28.270 1.00 93.66 360 B 1 +ATOM 7223 C CA . VAL B 2 360 ? -2.735 -13.813 27.269 1.00 93.44 360 B 1 +ATOM 7224 C C . VAL B 2 360 ? -3.052 -14.370 25.883 1.00 93.12 360 B 1 +ATOM 7225 O O . VAL B 2 360 ? -2.864 -15.557 25.640 1.00 91.66 360 B 1 +ATOM 7226 C CB . VAL B 2 360 ? -1.216 -13.702 27.501 1.00 92.64 360 B 1 +ATOM 7227 C CG1 . VAL B 2 360 ? -0.519 -12.880 26.413 1.00 84.48 360 B 1 +ATOM 7228 C CG2 . VAL B 2 360 ? -0.911 -13.034 28.848 1.00 82.82 360 B 1 +ATOM 7229 N N . SER B 2 361 ? -3.491 -13.508 24.980 1.00 93.31 361 B 1 +ATOM 7230 C CA . SER B 2 361 ? -3.634 -13.830 23.565 1.00 92.62 361 B 1 +ATOM 7231 C C . SER B 2 361 ? -2.669 -12.971 22.757 1.00 92.46 361 B 1 +ATOM 7232 O O . SER B 2 361 ? -2.581 -11.763 22.976 1.00 90.51 361 B 1 +ATOM 7233 C CB . SER B 2 361 ? -5.074 -13.621 23.110 1.00 91.07 361 B 1 +ATOM 7234 O OG . SER B 2 361 ? -5.243 -14.067 21.781 1.00 77.56 361 B 1 +ATOM 7235 N N . GLY B 2 362 ? -1.926 -13.592 21.846 1.00 92.28 362 B 1 +ATOM 7236 C CA . GLY B 2 362 ? -0.961 -12.939 20.986 1.00 91.53 362 B 1 +ATOM 7237 C C . GLY B 2 362 ? -1.206 -13.244 19.519 1.00 92.16 362 B 1 +ATOM 7238 O O . GLY B 2 362 ? -1.490 -14.378 19.145 1.00 90.16 362 B 1 +ATOM 7239 N N . GLU B 2 363 ? -1.069 -12.218 18.691 1.00 91.51 363 B 1 +ATOM 7240 C CA . GLU B 2 363 ? -1.195 -12.299 17.245 1.00 91.35 363 B 1 +ATOM 7241 C C . GLU B 2 363 ? -0.002 -11.619 16.589 1.00 91.27 363 B 1 +ATOM 7242 O O . GLU B 2 363 ? 0.490 -10.597 17.073 1.00 88.20 363 B 1 +ATOM 7243 C CB . GLU B 2 363 ? -2.488 -11.619 16.769 1.00 87.90 363 B 1 +ATOM 7244 C CG . GLU B 2 363 ? -3.761 -12.306 17.274 1.00 76.38 363 B 1 +ATOM 7245 C CD . GLU B 2 363 ? -5.027 -11.534 16.870 1.00 74.23 363 B 1 +ATOM 7246 O OE1 . GLU B 2 363 ? -5.993 -11.508 17.666 1.00 64.95 363 B 1 +ATOM 7247 O OE2 . GLU B 2 363 ? -5.071 -10.958 15.763 1.00 66.54 363 B 1 +ATOM 7248 N N . GLY B 2 364 ? 0.457 -12.177 15.473 1.00 90.95 364 B 1 +ATOM 7249 C CA . GLY B 2 364 ? 1.547 -11.579 14.730 1.00 90.63 364 B 1 +ATOM 7250 C C . GLY B 2 364 ? 1.964 -12.376 13.511 1.00 91.71 364 B 1 +ATOM 7251 O O . GLY B 2 364 ? 1.206 -13.181 12.968 1.00 89.80 364 B 1 +ATOM 7252 N N . GLU B 2 365 ? 3.176 -12.115 13.075 1.00 90.64 365 B 1 +ATOM 7253 C CA . GLU B 2 365 ? 3.791 -12.761 11.924 1.00 90.57 365 B 1 +ATOM 7254 C C . GLU B 2 365 ? 5.242 -13.136 12.227 1.00 90.45 365 B 1 +ATOM 7255 O O . GLU B 2 365 ? 5.950 -12.444 12.976 1.00 87.97 365 B 1 +ATOM 7256 C CB . GLU B 2 365 ? 3.668 -11.864 10.677 1.00 87.33 365 B 1 +ATOM 7257 C CG . GLU B 2 365 ? 4.331 -10.490 10.823 1.00 79.07 365 B 1 +ATOM 7258 C CD . GLU B 2 365 ? 4.189 -9.583 9.582 1.00 78.68 365 B 1 +ATOM 7259 O OE1 . GLU B 2 365 ? 5.047 -8.683 9.418 1.00 68.59 365 B 1 +ATOM 7260 O OE2 . GLU B 2 365 ? 3.228 -9.777 8.803 1.00 71.44 365 B 1 +ATOM 7261 N N . GLY B 2 366 ? 5.675 -14.248 11.633 1.00 90.55 366 B 1 +ATOM 7262 C CA . GLY B 2 366 ? 7.059 -14.689 11.667 1.00 90.14 366 B 1 +ATOM 7263 C C . GLY B 2 366 ? 7.614 -14.847 10.259 1.00 90.31 366 B 1 +ATOM 7264 O O . GLY B 2 366 ? 6.953 -15.385 9.373 1.00 88.25 366 B 1 +ATOM 7265 N N . ASP B 2 367 ? 8.840 -14.394 10.061 1.00 89.50 367 B 1 +ATOM 7266 C CA . ASP B 2 367 ? 9.592 -14.552 8.822 1.00 89.00 367 B 1 +ATOM 7267 C C . ASP B 2 367 ? 10.919 -15.258 9.129 1.00 89.01 367 B 1 +ATOM 7268 O O . ASP B 2 367 ? 11.913 -14.631 9.511 1.00 85.91 367 B 1 +ATOM 7269 C CB . ASP B 2 367 ? 9.770 -13.189 8.140 1.00 86.36 367 B 1 +ATOM 7270 C CG . ASP B 2 367 ? 10.407 -13.301 6.750 1.00 82.52 367 B 1 +ATOM 7271 O OD1 . ASP B 2 367 ? 11.022 -14.357 6.435 1.00 74.00 367 B 1 +ATOM 7272 O OD2 . ASP B 2 367 ? 10.309 -12.312 5.997 1.00 74.73 367 B 1 +ATOM 7273 N N . ALA B 2 368 ? 10.937 -16.581 8.965 1.00 88.43 368 B 1 +ATOM 7274 C CA . ALA B 2 368 ? 12.093 -17.410 9.265 1.00 88.38 368 B 1 +ATOM 7275 C C . ALA B 2 368 ? 13.298 -17.114 8.355 1.00 88.30 368 B 1 +ATOM 7276 O O . ALA B 2 368 ? 14.439 -17.366 8.748 1.00 85.81 368 B 1 +ATOM 7277 C CB . ALA B 2 368 ? 11.681 -18.881 9.172 1.00 87.40 368 B 1 +ATOM 7278 N N . THR B 2 369 ? 13.067 -16.544 7.167 1.00 87.35 369 B 1 +ATOM 7279 C CA . THR B 2 369 ? 14.142 -16.160 6.241 1.00 85.41 369 B 1 +ATOM 7280 C C . THR B 2 369 ? 15.025 -15.065 6.828 1.00 85.75 369 B 1 +ATOM 7281 O O . THR B 2 369 ? 16.235 -15.045 6.607 1.00 83.24 369 B 1 +ATOM 7282 C CB . THR B 2 369 ? 13.556 -15.676 4.901 1.00 83.24 369 B 1 +ATOM 7283 O OG1 . THR B 2 369 ? 12.530 -16.525 4.463 1.00 74.49 369 B 1 +ATOM 7284 C CG2 . THR B 2 369 ? 14.612 -15.650 3.796 1.00 70.67 369 B 1 +ATOM 7285 N N . TYR B 2 370 ? 14.423 -14.171 7.616 1.00 86.14 370 B 1 +ATOM 7286 C CA . TYR B 2 370 ? 15.106 -13.085 8.323 1.00 85.10 370 B 1 +ATOM 7287 C C . TYR B 2 370 ? 15.273 -13.377 9.819 1.00 85.96 370 B 1 +ATOM 7288 O O . TYR B 2 370 ? 15.901 -12.589 10.523 1.00 83.14 370 B 1 +ATOM 7289 C CB . TYR B 2 370 ? 14.341 -11.779 8.087 1.00 82.87 370 B 1 +ATOM 7290 C CG . TYR B 2 370 ? 14.347 -11.330 6.640 1.00 79.06 370 B 1 +ATOM 7291 C CD1 . TYR B 2 370 ? 15.301 -10.404 6.182 1.00 71.97 370 B 1 +ATOM 7292 C CD2 . TYR B 2 370 ? 13.412 -11.863 5.730 1.00 71.00 370 B 1 +ATOM 7293 C CE1 . TYR B 2 370 ? 15.325 -10.006 4.834 1.00 68.04 370 B 1 +ATOM 7294 C CE2 . TYR B 2 370 ? 13.431 -11.475 4.369 1.00 67.09 370 B 1 +ATOM 7295 C CZ . TYR B 2 370 ? 14.393 -10.547 3.930 1.00 69.61 370 B 1 +ATOM 7296 O OH . TYR B 2 370 ? 14.421 -10.173 2.616 1.00 66.87 370 B 1 +ATOM 7297 N N . GLY B 2 371 ? 14.726 -14.491 10.305 1.00 86.95 371 B 1 +ATOM 7298 C CA . GLY B 2 371 ? 14.659 -14.805 11.734 1.00 87.36 371 B 1 +ATOM 7299 C C . GLY B 2 371 ? 13.839 -13.781 12.523 1.00 88.47 371 B 1 +ATOM 7300 O O . GLY B 2 371 ? 14.145 -13.530 13.683 1.00 86.06 371 B 1 +ATOM 7301 N N . LYS B 2 372 ? 12.852 -13.162 11.894 1.00 89.29 372 B 1 +ATOM 7302 C CA . LYS B 2 372 ? 12.098 -12.029 12.443 1.00 89.58 372 B 1 +ATOM 7303 C C . LYS B 2 372 ? 10.733 -12.470 12.951 1.00 89.78 372 B 1 +ATOM 7304 O O . LYS B 2 372 ? 9.969 -13.096 12.236 1.00 88.27 372 B 1 +ATOM 7305 C CB . LYS B 2 372 ? 11.986 -10.944 11.361 1.00 87.14 372 B 1 +ATOM 7306 C CG . LYS B 2 372 ? 11.297 -9.675 11.882 1.00 83.01 372 B 1 +ATOM 7307 C CD . LYS B 2 372 ? 11.043 -8.683 10.736 1.00 80.68 372 B 1 +ATOM 7308 C CE . LYS B 2 372 ? 10.219 -7.509 11.264 1.00 73.10 372 B 1 +ATOM 7309 N NZ . LYS B 2 372 ? 9.522 -6.791 10.170 1.00 66.37 372 B 1 +ATOM 7310 N N . LEU B 2 373 ? 10.416 -12.053 14.164 1.00 89.31 373 B 1 +ATOM 7311 C CA . LEU B 2 373 ? 9.105 -12.215 14.790 1.00 89.46 373 B 1 +ATOM 7312 C C . LEU B 2 373 ? 8.532 -10.841 15.116 1.00 89.85 373 B 1 +ATOM 7313 O O . LEU B 2 373 ? 9.219 -9.993 15.670 1.00 87.70 373 B 1 +ATOM 7314 C CB . LEU B 2 373 ? 9.271 -13.055 16.069 1.00 87.95 373 B 1 +ATOM 7315 C CG . LEU B 2 373 ? 9.649 -14.524 15.793 1.00 85.33 373 B 1 +ATOM 7316 C CD1 . LEU B 2 373 ? 10.222 -15.167 17.045 1.00 74.47 373 B 1 +ATOM 7317 C CD2 . LEU B 2 373 ? 8.420 -15.316 15.372 1.00 74.11 373 B 1 +ATOM 7318 N N . THR B 2 374 ? 7.264 -10.614 14.777 1.00 90.59 374 B 1 +ATOM 7319 C CA . THR B 2 374 ? 6.533 -9.395 15.141 1.00 90.14 374 B 1 +ATOM 7320 C C . THR B 2 374 ? 5.198 -9.806 15.736 1.00 90.44 374 B 1 +ATOM 7321 O O . THR B 2 374 ? 4.368 -10.361 15.037 1.00 88.63 374 B 1 +ATOM 7322 C CB . THR B 2 374 ? 6.315 -8.472 13.936 1.00 88.08 374 B 1 +ATOM 7323 O OG1 . THR B 2 374 ? 7.488 -8.338 13.166 1.00 74.34 374 B 1 +ATOM 7324 C CG2 . THR B 2 374 ? 5.908 -7.067 14.376 1.00 71.82 374 B 1 +ATOM 7325 N N . LEU B 2 375 ? 5.011 -9.555 17.035 1.00 90.97 375 B 1 +ATOM 7326 C CA . LEU B 2 375 ? 3.858 -10.033 17.784 1.00 91.32 375 B 1 +ATOM 7327 C C . LEU B 2 375 ? 3.296 -8.939 18.682 1.00 91.62 375 B 1 +ATOM 7328 O O . LEU B 2 375 ? 4.028 -8.140 19.256 1.00 89.95 375 B 1 +ATOM 7329 C CB . LEU B 2 375 ? 4.265 -11.281 18.594 1.00 90.40 375 B 1 +ATOM 7330 C CG . LEU B 2 375 ? 4.375 -12.552 17.721 1.00 88.25 375 B 1 +ATOM 7331 C CD1 . LEU B 2 375 ? 5.476 -13.476 18.203 1.00 76.98 375 B 1 +ATOM 7332 C CD2 . LEU B 2 375 ? 3.064 -13.343 17.728 1.00 76.97 375 B 1 +ATOM 7333 N N . LYS B 2 376 ? 1.972 -8.939 18.848 1.00 92.21 376 B 1 +ATOM 7334 C CA . LYS B 2 376 ? 1.265 -8.142 19.847 1.00 92.65 376 B 1 +ATOM 7335 C C . LYS B 2 376 ? 0.531 -9.087 20.790 1.00 92.77 376 B 1 +ATOM 7336 O O . LYS B 2 376 ? -0.307 -9.865 20.349 1.00 91.21 376 B 1 +ATOM 7337 C CB . LYS B 2 376 ? 0.329 -7.140 19.157 1.00 91.26 376 B 1 +ATOM 7338 C CG . LYS B 2 376 ? -0.447 -6.271 20.172 1.00 88.72 376 B 1 +ATOM 7339 C CD . LYS B 2 376 ? -1.305 -5.228 19.450 1.00 86.40 376 B 1 +ATOM 7340 C CE . LYS B 2 376 ? -2.068 -4.362 20.462 1.00 81.07 376 B 1 +ATOM 7341 N NZ . LYS B 2 376 ? -2.863 -3.310 19.799 1.00 74.84 376 B 1 +ATOM 7342 N N . PHE B 2 377 ? 0.825 -8.982 22.067 1.00 93.67 377 B 1 +ATOM 7343 C CA . PHE B 2 377 ? 0.212 -9.758 23.126 1.00 93.63 377 B 1 +ATOM 7344 C C . PHE B 2 377 ? -0.723 -8.887 23.945 1.00 93.56 377 B 1 +ATOM 7345 O O . PHE B 2 377 ? -0.390 -7.748 24.255 1.00 91.57 377 B 1 +ATOM 7346 C CB . PHE B 2 377 ? 1.288 -10.367 24.018 1.00 92.94 377 B 1 +ATOM 7347 C CG . PHE B 2 377 ? 2.236 -11.269 23.275 1.00 93.14 377 B 1 +ATOM 7348 C CD1 . PHE B 2 377 ? 1.889 -12.611 23.039 1.00 82.15 377 B 1 +ATOM 7349 C CD2 . PHE B 2 377 ? 3.455 -10.773 22.779 1.00 82.89 377 B 1 +ATOM 7350 C CE1 . PHE B 2 377 ? 2.753 -13.453 22.326 1.00 82.54 377 B 1 +ATOM 7351 C CE2 . PHE B 2 377 ? 4.322 -11.611 22.060 1.00 82.00 377 B 1 +ATOM 7352 C CZ . PHE B 2 377 ? 3.967 -12.950 21.839 1.00 90.68 377 B 1 +ATOM 7353 N N . ILE B 2 378 ? -1.868 -9.421 24.326 1.00 93.44 378 B 1 +ATOM 7354 C CA . ILE B 2 378 ? -2.883 -8.722 25.108 1.00 93.00 378 B 1 +ATOM 7355 C C . ILE B 2 378 ? -3.256 -9.601 26.300 1.00 93.36 378 B 1 +ATOM 7356 O O . ILE B 2 378 ? -3.597 -10.765 26.121 1.00 91.47 378 B 1 +ATOM 7357 C CB . ILE B 2 378 ? -4.108 -8.393 24.228 1.00 91.19 378 B 1 +ATOM 7358 C CG1 . ILE B 2 378 ? -3.705 -7.471 23.047 1.00 80.94 378 B 1 +ATOM 7359 C CG2 . ILE B 2 378 ? -5.207 -7.729 25.076 1.00 78.41 378 B 1 +ATOM 7360 C CD1 . ILE B 2 378 ? -4.755 -7.369 21.946 1.00 71.44 378 B 1 +ATOM 7361 N N . CYS B 2 379 ? -3.242 -9.025 27.498 1.00 92.59 379 B 1 +ATOM 7362 C CA . CYS B 2 379 ? -3.830 -9.673 28.657 1.00 92.24 379 B 1 +ATOM 7363 C C . CYS B 2 379 ? -5.355 -9.568 28.554 1.00 91.61 379 B 1 +ATOM 7364 O O . CYS B 2 379 ? -5.927 -8.483 28.662 1.00 89.58 379 B 1 +ATOM 7365 C CB . CYS B 2 379 ? -3.265 -9.061 29.947 1.00 91.81 379 B 1 +ATOM 7366 S SG . CYS B 2 379 ? -3.887 -9.996 31.368 1.00 89.75 379 B 1 +ATOM 7367 N N . THR B 2 380 ? -6.021 -10.697 28.332 1.00 92.01 380 B 1 +ATOM 7368 C CA . THR B 2 380 ? -7.480 -10.746 28.138 1.00 91.06 380 B 1 +ATOM 7369 C C . THR B 2 380 ? -8.254 -10.737 29.450 1.00 91.21 380 B 1 +ATOM 7370 O O . THR B 2 380 ? -9.451 -10.449 29.447 1.00 87.76 380 B 1 +ATOM 7371 C CB . THR B 2 380 ? -7.880 -11.963 27.291 1.00 89.77 380 B 1 +ATOM 7372 O OG1 . THR B 2 380 ? -7.424 -13.144 27.891 1.00 82.49 380 B 1 +ATOM 7373 C CG2 . THR B 2 380 ? -7.284 -11.903 25.888 1.00 79.46 380 B 1 +ATOM 7374 N N . THR B 2 381 ? -7.584 -10.992 30.567 1.00 91.50 381 B 1 +ATOM 7375 C CA . THR B 2 381 ? -8.150 -11.028 31.924 1.00 90.89 381 B 1 +ATOM 7376 C C . THR B 2 381 ? -7.994 -9.710 32.691 1.00 90.61 381 B 1 +ATOM 7377 O O . THR B 2 381 ? -8.358 -9.649 33.864 1.00 85.81 381 B 1 +ATOM 7378 C CB . THR B 2 381 ? -7.555 -12.193 32.717 1.00 89.74 381 B 1 +ATOM 7379 O OG1 . THR B 2 381 ? -6.151 -12.208 32.589 1.00 82.37 381 B 1 +ATOM 7380 C CG2 . THR B 2 381 ? -8.058 -13.533 32.189 1.00 79.98 381 B 1 +ATOM 7381 N N . GLY B 2 382 ? -7.509 -8.654 32.052 1.00 90.44 382 B 1 +ATOM 7382 C CA . GLY B 2 382 ? -7.343 -7.323 32.640 1.00 89.69 382 B 1 +ATOM 7383 C C . GLY B 2 382 ? -5.880 -6.941 32.788 1.00 90.63 382 B 1 +ATOM 7384 O O . GLY B 2 382 ? -5.170 -6.820 31.794 1.00 86.89 382 B 1 +ATOM 7385 N N . LYS B 2 383 ? -5.433 -6.708 34.036 1.00 91.38 383 B 1 +ATOM 7386 C CA . LYS B 2 383 ? -4.035 -6.390 34.338 1.00 91.58 383 B 1 +ATOM 7387 C C . LYS B 2 383 ? -3.244 -7.672 34.547 1.00 92.38 383 B 1 +ATOM 7388 O O . LYS B 2 383 ? -3.667 -8.539 35.303 1.00 88.95 383 B 1 +ATOM 7389 C CB . LYS B 2 383 ? -3.963 -5.454 35.555 1.00 88.48 383 B 1 +ATOM 7390 C CG . LYS B 2 383 ? -2.542 -4.913 35.756 1.00 76.69 383 B 1 +ATOM 7391 C CD . LYS B 2 383 ? -2.444 -3.985 36.971 1.00 69.36 383 B 1 +ATOM 7392 C CE . LYS B 2 383 ? -0.992 -3.532 37.115 1.00 58.13 383 B 1 +ATOM 7393 N NZ . LYS B 2 383 ? -0.746 -2.739 38.348 1.00 49.97 383 B 1 +ATOM 7394 N N . LEU B 2 384 ? -2.090 -7.769 33.905 1.00 91.97 384 B 1 +ATOM 7395 C CA . LEU B 2 384 ? -1.195 -8.909 34.070 1.00 92.49 384 B 1 +ATOM 7396 C C . LEU B 2 384 ? -0.605 -8.902 35.490 1.00 92.68 384 B 1 +ATOM 7397 O O . LEU B 2 384 ? -0.069 -7.882 35.907 1.00 90.66 384 B 1 +ATOM 7398 C CB . LEU B 2 384 ? -0.118 -8.823 32.979 1.00 91.93 384 B 1 +ATOM 7399 C CG . LEU B 2 384 ? 0.629 -10.153 32.774 1.00 90.66 384 B 1 +ATOM 7400 C CD1 . LEU B 2 384 ? -0.227 -11.157 32.004 1.00 80.02 384 B 1 +ATOM 7401 C CD2 . LEU B 2 384 ? 1.901 -9.915 31.960 1.00 79.96 384 B 1 +ATOM 7402 N N . PRO B 2 385 ? -0.679 -10.013 36.238 1.00 93.25 385 B 1 +ATOM 7403 C CA . PRO B 2 385 ? -0.183 -10.068 37.615 1.00 92.69 385 B 1 +ATOM 7404 C C . PRO B 2 385 ? 1.346 -10.205 37.731 1.00 93.07 385 B 1 +ATOM 7405 O O . PRO B 2 385 ? 1.891 -10.144 38.826 1.00 90.56 385 B 1 +ATOM 7406 C CB . PRO B 2 385 ? -0.913 -11.258 38.247 1.00 91.52 385 B 1 +ATOM 7407 C CG . PRO B 2 385 ? -1.095 -12.215 37.073 1.00 89.51 385 B 1 +ATOM 7408 C CD . PRO B 2 385 ? -1.351 -11.258 35.900 1.00 92.04 385 B 1 +ATOM 7409 N N . VAL B 2 386 ? 2.035 -10.389 36.616 1.00 93.45 386 B 1 +ATOM 7410 C CA . VAL B 2 386 ? 3.496 -10.507 36.529 1.00 93.60 386 B 1 +ATOM 7411 C C . VAL B 2 386 ? 4.046 -9.533 35.474 1.00 93.99 386 B 1 +ATOM 7412 O O . VAL B 2 386 ? 3.313 -9.158 34.562 1.00 92.14 386 B 1 +ATOM 7413 C CB . VAL B 2 386 ? 3.931 -11.948 36.231 1.00 92.96 386 B 1 +ATOM 7414 C CG1 . VAL B 2 386 ? 3.489 -12.904 37.349 1.00 84.72 386 B 1 +ATOM 7415 C CG2 . VAL B 2 386 ? 3.405 -12.490 34.904 1.00 81.82 386 B 1 +ATOM 7416 N N . PRO B 2 387 ? 5.312 -9.118 35.547 1.00 93.89 387 B 1 +ATOM 7417 C CA . PRO B 2 387 ? 5.901 -8.267 34.529 1.00 93.28 387 B 1 +ATOM 7418 C C . PRO B 2 387 ? 5.939 -8.955 33.161 1.00 93.56 387 B 1 +ATOM 7419 O O . PRO B 2 387 ? 6.364 -10.106 33.058 1.00 92.10 387 B 1 +ATOM 7420 C CB . PRO B 2 387 ? 7.318 -7.927 35.021 1.00 91.77 387 B 1 +ATOM 7421 C CG . PRO B 2 387 ? 7.252 -8.176 36.524 1.00 89.56 387 B 1 +ATOM 7422 C CD . PRO B 2 387 ? 6.251 -9.326 36.640 1.00 91.50 387 B 1 +ATOM 7423 N N . TRP B 2 388 ? 5.577 -8.235 32.092 1.00 93.18 388 B 1 +ATOM 7424 C CA . TRP B 2 388 ? 5.628 -8.744 30.716 1.00 93.34 388 B 1 +ATOM 7425 C C . TRP B 2 388 ? 6.973 -9.385 30.321 1.00 93.48 388 B 1 +ATOM 7426 O O . TRP B 2 388 ? 6.944 -10.445 29.702 1.00 91.69 388 B 1 +ATOM 7427 C CB . TRP B 2 388 ? 5.280 -7.615 29.738 1.00 93.01 388 B 1 +ATOM 7428 C CG . TRP B 2 388 ? 3.816 -7.374 29.573 1.00 92.98 388 B 1 +ATOM 7429 C CD1 . TRP B 2 388 ? 3.122 -6.310 30.026 1.00 89.51 388 B 1 +ATOM 7430 C CD2 . TRP B 2 388 ? 2.855 -8.219 28.877 1.00 92.22 388 B 1 +ATOM 7431 N NE1 . TRP B 2 388 ? 1.789 -6.434 29.659 1.00 90.23 388 B 1 +ATOM 7432 C CE2 . TRP B 2 388 ? 1.589 -7.593 28.959 1.00 91.50 388 B 1 +ATOM 7433 C CE3 . TRP B 2 388 ? 2.945 -9.450 28.196 1.00 91.76 388 B 1 +ATOM 7434 C CZ2 . TRP B 2 388 ? 0.434 -8.171 28.395 1.00 91.67 388 B 1 +ATOM 7435 C CZ3 . TRP B 2 388 ? 1.791 -10.030 27.627 1.00 89.56 388 B 1 +ATOM 7436 C CH2 . TRP B 2 388 ? 0.554 -9.398 27.731 1.00 89.80 388 B 1 +ATOM 7437 N N . PRO B 2 389 ? 8.146 -8.847 30.719 1.00 92.95 389 B 1 +ATOM 7438 C CA . PRO B 2 389 ? 9.428 -9.467 30.396 1.00 92.35 389 B 1 +ATOM 7439 C C . PRO B 2 389 ? 9.579 -10.914 30.891 1.00 92.44 389 B 1 +ATOM 7440 O O . PRO B 2 389 ? 10.253 -11.706 30.242 1.00 90.77 389 B 1 +ATOM 7441 C CB . PRO B 2 389 ? 10.491 -8.557 31.012 1.00 91.15 389 B 1 +ATOM 7442 C CG . PRO B 2 389 ? 9.828 -7.189 31.009 1.00 89.15 389 B 1 +ATOM 7443 C CD . PRO B 2 389 ? 8.372 -7.539 31.322 1.00 91.39 389 B 1 +ATOM 7444 N N . THR B 2 390 ? 8.932 -11.290 31.993 1.00 93.42 390 B 1 +ATOM 7445 C CA . THR B 2 390 ? 9.012 -12.656 32.532 1.00 93.19 390 B 1 +ATOM 7446 C C . THR B 2 390 ? 8.291 -13.686 31.654 1.00 93.15 390 B 1 +ATOM 7447 O O . THR B 2 390 ? 8.561 -14.878 31.769 1.00 90.98 390 B 1 +ATOM 7448 C CB . THR B 2 390 ? 8.451 -12.757 33.956 1.00 92.66 390 B 1 +ATOM 7449 O OG1 . THR B 2 390 ? 7.061 -12.557 33.992 1.00 83.94 390 B 1 +ATOM 7450 C CG2 . THR B 2 390 ? 9.099 -11.745 34.901 1.00 82.38 390 B 1 +ATOM 7451 N N . LEU B 2 391 ? 7.406 -13.221 30.759 1.00 92.84 391 B 1 +ATOM 7452 C CA . LEU B 2 391 ? 6.659 -14.070 29.830 1.00 92.77 391 B 1 +ATOM 7453 C C . LEU B 2 391 ? 7.271 -14.111 28.428 1.00 92.73 391 B 1 +ATOM 7454 O O . LEU B 2 391 ? 6.881 -14.971 27.645 1.00 90.39 391 B 1 +ATOM 7455 C CB . LEU B 2 391 ? 5.196 -13.604 29.766 1.00 92.16 391 B 1 +ATOM 7456 C CG . LEU B 2 391 ? 4.426 -13.667 31.106 1.00 91.79 391 B 1 +ATOM 7457 C CD1 . LEU B 2 391 ? 2.980 -13.260 30.846 1.00 83.59 391 B 1 +ATOM 7458 C CD2 . LEU B 2 391 ? 4.426 -15.071 31.707 1.00 83.14 391 B 1 +ATOM 7459 N N . VAL B 2 392 ? 8.229 -13.249 28.096 1.00 92.77 392 B 1 +ATOM 7460 C CA . VAL B 2 392 ? 8.808 -13.169 26.740 1.00 91.86 392 B 1 +ATOM 7461 C C . VAL B 2 392 ? 9.332 -14.519 26.274 1.00 90.91 392 B 1 +ATOM 7462 O O . VAL B 2 392 ? 8.991 -14.972 25.184 1.00 88.13 392 B 1 +ATOM 7463 C CB . VAL B 2 392 ? 9.913 -12.100 26.658 1.00 90.98 392 B 1 +ATOM 7464 C CG1 . VAL B 2 392 ? 10.677 -12.132 25.332 1.00 84.24 392 B 1 +ATOM 7465 C CG2 . VAL B 2 392 ? 9.309 -10.699 26.803 1.00 83.27 392 B 1 +ATOM 7466 N N . THR B 2 393 ? 10.097 -15.215 27.117 1.00 92.19 393 B 1 +ATOM 7467 C CA . THR B 2 393 ? 10.619 -16.540 26.778 1.00 90.92 393 B 1 +ATOM 7468 C C . THR B 2 393 ? 9.511 -17.569 26.572 1.00 90.79 393 B 1 +ATOM 7469 O O . THR B 2 393 ? 9.614 -18.399 25.676 1.00 87.42 393 B 1 +ATOM 7470 C CB . THR B 2 393 ? 11.565 -17.062 27.859 1.00 89.71 393 B 1 +ATOM 7471 O OG1 . THR B 2 393 ? 10.954 -17.010 29.129 1.00 80.46 393 B 1 +ATOM 7472 C CG2 . THR B 2 393 ? 12.849 -16.243 27.907 1.00 79.70 393 B 1 +ATOM 7473 N N . THR B 2 394 ? 8.447 -17.513 27.341 1.00 91.30 394 B 1 +ATOM 7474 C CA . THR B 2 394 ? 7.313 -18.426 27.208 1.00 90.60 394 B 1 +ATOM 7475 C C . THR B 2 394 ? 6.530 -18.157 25.926 1.00 90.67 394 B 1 +ATOM 7476 O O . THR B 2 394 ? 6.118 -19.097 25.249 1.00 87.69 394 B 1 +ATOM 7477 C CB . THR B 2 394 ? 6.401 -18.316 28.436 1.00 90.03 394 B 1 +ATOM 7478 O OG1 . THR B 2 394 ? 7.160 -18.600 29.592 1.00 81.31 394 B 1 +ATOM 7479 C CG2 . THR B 2 394 ? 5.257 -19.305 28.417 1.00 79.54 394 B 1 +ATOM 7480 N N . LEU B 2 395 ? 6.379 -16.885 25.547 1.00 90.40 395 B 1 +ATOM 7481 C CA . LEU B 2 395 ? 5.565 -16.452 24.418 1.00 88.70 395 B 1 +ATOM 7482 C C . LEU B 2 395 ? 6.300 -16.570 23.074 1.00 87.77 395 B 1 +ATOM 7483 O O . LEU B 2 395 ? 5.803 -17.240 22.170 1.00 82.27 395 B 1 +ATOM 7484 C CB . LEU B 2 395 ? 5.081 -15.019 24.690 1.00 88.22 395 B 1 +ATOM 7485 C CG . LEU B 2 395 ? 4.121 -14.869 25.887 1.00 89.13 395 B 1 +ATOM 7486 C CD1 . LEU B 2 395 ? 3.918 -13.392 26.206 1.00 81.61 395 B 1 +ATOM 7487 C CD2 . LEU B 2 395 ? 2.757 -15.497 25.625 1.00 82.29 395 B 1 +ATOM 7488 N N . THR B 2 396 ? 7.482 -15.954 22.936 1.00 82.68 396 B 1 +ATOM 7489 C CA . THR B 2 396 ? 8.189 -15.854 21.648 1.00 77.90 396 B 1 +ATOM 7490 C C . THR B 2 396 ? 9.378 -16.789 21.524 1.00 78.45 396 B 1 +ATOM 7491 O O . THR B 2 396 ? 9.520 -17.425 20.485 1.00 73.39 396 B 1 +ATOM 7492 C CB . THR B 2 396 ? 8.655 -14.437 21.326 1.00 73.87 396 B 1 +ATOM 7493 O OG1 . THR B 2 396 ? 9.362 -13.893 22.407 1.00 71.17 396 B 1 +ATOM 7494 C CG2 . THR B 2 396 ? 7.472 -13.540 21.015 1.00 70.27 396 B 1 +ATOM 7495 N N . TYR B 2 397 ? 10.164 -16.994 22.580 1.00 81.91 397 B 1 +ATOM 7496 C CA . TYR B 2 397 ? 11.101 -18.125 22.603 1.00 79.74 397 B 1 +ATOM 7497 C C . TYR B 2 397 ? 10.337 -19.467 22.684 1.00 79.28 397 B 1 +ATOM 7498 O O . TYR B 2 397 ? 10.940 -20.523 22.681 1.00 72.32 397 B 1 +ATOM 7499 C CB . TYR B 2 397 ? 12.109 -18.028 23.760 1.00 77.74 397 B 1 +ATOM 7500 C CG . TYR B 2 397 ? 13.065 -16.848 23.838 1.00 77.95 397 B 1 +ATOM 7501 C CD1 . TYR B 2 397 ? 14.415 -17.097 24.161 1.00 68.16 397 B 1 +ATOM 7502 C CD2 . TYR B 2 397 ? 12.645 -15.527 23.703 1.00 67.80 397 B 1 +ATOM 7503 C CE1 . TYR B 2 397 ? 15.319 -16.046 24.342 1.00 69.01 397 B 1 +ATOM 7504 C CE2 . TYR B 2 397 ? 13.541 -14.459 23.869 1.00 69.67 397 B 1 +ATOM 7505 C CZ . TYR B 2 397 ? 14.880 -14.721 24.195 1.00 77.21 397 B 1 +ATOM 7506 O OH . TYR B 2 397 ? 15.760 -13.681 24.363 1.00 73.21 397 B 1 +ATOM 7507 N N . GLY B 2 398 ? 9.010 -19.406 22.738 1.00 79.71 398 B 1 +ATOM 7508 C CA . GLY B 2 398 ? 8.102 -20.513 22.509 1.00 76.41 398 B 1 +ATOM 7509 C C . GLY B 2 398 ? 7.915 -20.867 21.032 1.00 80.98 398 B 1 +ATOM 7510 O O . GLY B 2 398 ? 7.493 -21.980 20.740 1.00 75.33 398 B 1 +ATOM 7511 N N . VAL B 2 399 ? 8.270 -19.964 20.097 1.00 86.06 399 B 1 +ATOM 7512 C CA . VAL B 2 399 ? 8.115 -20.183 18.650 1.00 87.26 399 B 1 +ATOM 7513 C C . VAL B 2 399 ? 9.463 -20.145 17.909 1.00 88.89 399 B 1 +ATOM 7514 O O . VAL B 2 399 ? 9.631 -19.495 16.889 1.00 85.33 399 B 1 +ATOM 7515 C CB . VAL B 2 399 ? 7.046 -19.261 18.025 1.00 83.91 399 B 1 +ATOM 7516 C CG1 . VAL B 2 399 ? 5.651 -19.658 18.516 1.00 77.73 399 B 1 +ATOM 7517 C CG2 . VAL B 2 399 ? 7.253 -17.783 18.338 1.00 76.83 399 B 1 +ATOM 7518 N N . GLN B 2 400 ? 10.437 -20.882 18.429 1.00 88.63 400 B 1 +ATOM 7519 C CA . GLN B 2 400 ? 11.814 -20.940 17.908 1.00 89.01 400 B 1 +ATOM 7520 C C . GLN B 2 400 ? 11.925 -21.532 16.488 1.00 89.93 400 B 1 +ATOM 7521 O O . GLN B 2 400 ? 12.977 -21.424 15.850 1.00 87.45 400 B 1 +ATOM 7522 C CB . GLN B 2 400 ? 12.696 -21.706 18.896 1.00 87.71 400 B 1 +ATOM 7523 C CG . GLN B 2 400 ? 12.882 -20.924 20.203 1.00 86.66 400 B 1 +ATOM 7524 C CD . GLN B 2 400 ? 13.670 -21.685 21.264 1.00 83.08 400 B 1 +ATOM 7525 O OE1 . GLN B 2 400 ? 13.447 -22.851 21.543 1.00 73.86 400 B 1 +ATOM 7526 N NE2 . GLN B 2 400 ? 14.607 -21.040 21.928 1.00 72.28 400 B 1 +ATOM 7527 N N . CYS B 2 401 ? 10.850 -22.083 15.940 1.00 91.21 401 B 1 +ATOM 7528 C CA . CYS B 2 401 ? 10.753 -22.482 14.532 1.00 91.17 401 B 1 +ATOM 7529 C C . CYS B 2 401 ? 10.912 -21.301 13.548 1.00 91.47 401 B 1 +ATOM 7530 O O . CYS B 2 401 ? 11.222 -21.526 12.388 1.00 89.76 401 B 1 +ATOM 7531 C CB . CYS B 2 401 ? 9.424 -23.212 14.314 1.00 90.18 401 B 1 +ATOM 7532 S SG . CYS B 2 401 ? 8.030 -22.219 14.912 1.00 87.31 401 B 1 +ATOM 7533 N N . PHE B 2 402 ? 10.777 -20.055 13.996 1.00 91.67 402 B 1 +ATOM 7534 C CA . PHE B 2 402 ? 11.060 -18.867 13.194 1.00 91.41 402 B 1 +ATOM 7535 C C . PHE B 2 402 ? 12.518 -18.399 13.254 1.00 91.27 402 B 1 +ATOM 7536 O O . PHE B 2 402 ? 12.858 -17.379 12.645 1.00 89.03 402 B 1 +ATOM 7537 C CB . PHE B 2 402 ? 10.098 -17.744 13.572 1.00 91.23 402 B 1 +ATOM 7538 C CG . PHE B 2 402 ? 8.685 -18.030 13.142 1.00 91.46 402 B 1 +ATOM 7539 C CD1 . PHE B 2 402 ? 8.337 -17.905 11.791 1.00 81.94 402 B 1 +ATOM 7540 C CD2 . PHE B 2 402 ? 7.735 -18.467 14.071 1.00 81.89 402 B 1 +ATOM 7541 C CE1 . PHE B 2 402 ? 7.044 -18.201 11.361 1.00 81.64 402 B 1 +ATOM 7542 C CE2 . PHE B 2 402 ? 6.426 -18.772 13.640 1.00 81.19 402 B 1 +ATOM 7543 C CZ . PHE B 2 402 ? 6.085 -18.639 12.289 1.00 89.73 402 B 1 +ATOM 7544 N N . SER B 2 403 ? 13.386 -19.129 13.941 1.00 91.45 403 B 1 +ATOM 7545 C CA . SER B 2 403 ? 14.813 -18.834 13.904 1.00 90.89 403 B 1 +ATOM 7546 C C . SER B 2 403 ? 15.370 -18.989 12.487 1.00 90.68 403 B 1 +ATOM 7547 O O . SER B 2 403 ? 15.013 -19.910 11.744 1.00 89.16 403 B 1 +ATOM 7548 C CB . SER B 2 403 ? 15.587 -19.694 14.909 1.00 90.14 403 B 1 +ATOM 7549 O OG . SER B 2 403 ? 15.414 -21.069 14.670 1.00 79.81 403 B 1 +ATOM 7550 N N . ARG B 2 404 ? 16.265 -18.089 12.118 1.00 90.10 404 B 1 +ATOM 7551 C CA . ARG B 2 404 ? 17.025 -18.197 10.874 1.00 89.50 404 B 1 +ATOM 7552 C C . ARG B 2 404 ? 18.190 -19.146 11.089 1.00 89.62 404 B 1 +ATOM 7553 O O . ARG B 2 404 ? 19.166 -18.791 11.753 1.00 88.50 404 B 1 +ATOM 7554 C CB . ARG B 2 404 ? 17.483 -16.797 10.441 1.00 88.01 404 B 1 +ATOM 7555 C CG . ARG B 2 404 ? 18.343 -16.856 9.176 1.00 82.92 404 B 1 +ATOM 7556 C CD . ARG B 2 404 ? 18.875 -15.472 8.824 1.00 79.57 404 B 1 +ATOM 7557 N NE . ARG B 2 404 ? 19.937 -15.572 7.814 1.00 72.01 404 B 1 +ATOM 7558 C CZ . ARG B 2 404 ? 20.814 -14.634 7.506 1.00 65.83 404 B 1 +ATOM 7559 N NH1 . ARG B 2 404 ? 20.763 -13.450 8.045 1.00 59.12 404 B 1 +ATOM 7560 N NH2 . ARG B 2 404 ? 21.758 -14.885 6.655 1.00 58.74 404 B 1 +ATOM 7561 N N . TYR B 2 405 ? 18.116 -20.309 10.465 1.00 88.24 405 B 1 +ATOM 7562 C CA . TYR B 2 405 ? 19.268 -21.196 10.325 1.00 88.97 405 B 1 +ATOM 7563 C C . TYR B 2 405 ? 20.016 -20.825 9.031 1.00 88.16 405 B 1 +ATOM 7564 O O . TYR B 2 405 ? 19.417 -20.831 7.954 1.00 85.27 405 B 1 +ATOM 7565 C CB . TYR B 2 405 ? 18.809 -22.653 10.363 1.00 89.57 405 B 1 +ATOM 7566 C CG . TYR B 2 405 ? 18.597 -23.165 11.777 1.00 90.19 405 B 1 +ATOM 7567 C CD1 . TYR B 2 405 ? 19.555 -24.006 12.379 1.00 81.52 405 B 1 +ATOM 7568 C CD2 . TYR B 2 405 ? 17.466 -22.783 12.524 1.00 81.43 405 B 1 +ATOM 7569 C CE1 . TYR B 2 405 ? 19.390 -24.472 13.690 1.00 81.63 405 B 1 +ATOM 7570 C CE2 . TYR B 2 405 ? 17.293 -23.230 13.845 1.00 81.04 405 B 1 +ATOM 7571 C CZ . TYR B 2 405 ? 18.262 -24.074 14.428 1.00 89.13 405 B 1 +ATOM 7572 O OH . TYR B 2 405 ? 18.098 -24.512 15.715 1.00 88.47 405 B 1 +ATOM 7573 N N . PRO B 2 406 ? 21.311 -20.478 9.104 1.00 87.71 406 B 1 +ATOM 7574 C CA . PRO B 2 406 ? 22.156 -20.325 7.920 1.00 85.64 406 B 1 +ATOM 7575 C C . PRO B 2 406 ? 22.165 -21.602 7.078 1.00 85.10 406 B 1 +ATOM 7576 O O . PRO B 2 406 ? 21.986 -22.696 7.613 1.00 82.45 406 B 1 +ATOM 7577 C CB . PRO B 2 406 ? 23.554 -20.005 8.451 1.00 83.54 406 B 1 +ATOM 7578 C CG . PRO B 2 406 ? 23.299 -19.429 9.841 1.00 81.70 406 B 1 +ATOM 7579 C CD . PRO B 2 406 ? 22.072 -20.212 10.304 1.00 85.08 406 B 1 +ATOM 7580 N N . ASP B 2 407 ? 22.451 -21.500 5.781 1.00 84.01 407 B 1 +ATOM 7581 C CA . ASP B 2 407 ? 22.355 -22.639 4.858 1.00 82.19 407 B 1 +ATOM 7582 C C . ASP B 2 407 ? 23.198 -23.855 5.288 1.00 81.90 407 B 1 +ATOM 7583 O O . ASP B 2 407 ? 22.744 -24.989 5.171 1.00 78.45 407 B 1 +ATOM 7584 C CB . ASP B 2 407 ? 22.725 -22.194 3.435 1.00 79.57 407 B 1 +ATOM 7585 C CG . ASP B 2 407 ? 21.694 -21.248 2.811 1.00 74.82 407 B 1 +ATOM 7586 O OD1 . ASP B 2 407 ? 20.486 -21.444 3.057 1.00 67.57 407 B 1 +ATOM 7587 O OD2 . ASP B 2 407 ? 22.127 -20.327 2.076 1.00 66.77 407 B 1 +ATOM 7588 N N . HIS B 2 408 ? 24.384 -23.621 5.854 1.00 83.88 408 B 1 +ATOM 7589 C CA . HIS B 2 408 ? 25.246 -24.682 6.372 1.00 82.10 408 B 1 +ATOM 7590 C C . HIS B 2 408 ? 24.746 -25.318 7.679 1.00 82.49 408 B 1 +ATOM 7591 O O . HIS B 2 408 ? 25.252 -26.366 8.081 1.00 79.86 408 B 1 +ATOM 7592 C CB . HIS B 2 408 ? 26.667 -24.137 6.545 1.00 80.31 408 B 1 +ATOM 7593 C CG . HIS B 2 408 ? 26.798 -23.094 7.626 1.00 77.91 408 B 1 +ATOM 7594 N ND1 . HIS B 2 408 ? 26.589 -21.740 7.494 1.00 69.12 408 B 1 +ATOM 7595 C CD2 . HIS B 2 408 ? 27.199 -23.304 8.930 1.00 69.07 408 B 1 +ATOM 7596 C CE1 . HIS B 2 408 ? 26.856 -21.151 8.678 1.00 68.82 408 B 1 +ATOM 7597 N NE2 . HIS B 2 408 ? 27.229 -22.068 9.567 1.00 70.12 408 B 1 +ATOM 7598 N N . MET B 2 409 ? 23.751 -24.715 8.335 1.00 83.23 409 B 1 +ATOM 7599 C CA . MET B 2 409 ? 23.170 -25.206 9.591 1.00 85.01 409 B 1 +ATOM 7600 C C . MET B 2 409 ? 21.758 -25.766 9.440 1.00 85.44 409 B 1 +ATOM 7601 O O . MET B 2 409 ? 21.187 -26.236 10.419 1.00 82.77 409 B 1 +ATOM 7602 C CB . MET B 2 409 ? 23.185 -24.098 10.651 1.00 84.71 409 B 1 +ATOM 7603 C CG . MET B 2 409 ? 24.598 -23.667 11.059 1.00 82.60 409 B 1 +ATOM 7604 S SD . MET B 2 409 ? 24.639 -22.463 12.420 1.00 82.42 409 B 1 +ATOM 7605 C CE . MET B 2 409 ? 24.008 -23.479 13.776 1.00 73.58 409 B 1 +ATOM 7606 N N . LYS B 2 410 ? 21.167 -25.762 8.230 1.00 85.65 410 B 1 +ATOM 7607 C CA . LYS B 2 410 ? 19.771 -26.200 8.019 1.00 84.80 410 B 1 +ATOM 7608 C C . LYS B 2 410 ? 19.484 -27.622 8.494 1.00 85.38 410 B 1 +ATOM 7609 O O . LYS B 2 410 ? 18.389 -27.913 8.947 1.00 82.20 410 B 1 +ATOM 7610 C CB . LYS B 2 410 ? 19.408 -26.075 6.543 1.00 82.30 410 B 1 +ATOM 7611 C CG . LYS B 2 410 ? 19.225 -24.606 6.159 1.00 78.83 410 B 1 +ATOM 7612 C CD . LYS B 2 410 ? 18.746 -24.511 4.714 1.00 72.76 410 B 1 +ATOM 7613 C CE . LYS B 2 410 ? 18.389 -23.058 4.403 1.00 67.66 410 B 1 +ATOM 7614 N NZ . LYS B 2 410 ? 17.366 -22.996 3.355 1.00 60.22 410 B 1 +ATOM 7615 N N . GLN B 2 411 ? 20.486 -28.497 8.432 1.00 86.49 411 B 1 +ATOM 7616 C CA . GLN B 2 411 ? 20.413 -29.866 8.937 1.00 85.67 411 B 1 +ATOM 7617 C C . GLN B 2 411 ? 20.331 -29.965 10.472 1.00 87.10 411 B 1 +ATOM 7618 O O . GLN B 2 411 ? 20.138 -31.054 10.999 1.00 84.82 411 B 1 +ATOM 7619 C CB . GLN B 2 411 ? 21.597 -30.666 8.382 1.00 82.72 411 B 1 +ATOM 7620 C CG . GLN B 2 411 ? 22.955 -30.150 8.896 1.00 72.91 411 B 1 +ATOM 7621 C CD . GLN B 2 411 ? 24.160 -30.840 8.247 1.00 64.56 411 B 1 +ATOM 7622 O OE1 . GLN B 2 411 ? 24.044 -31.781 7.470 1.00 55.81 411 B 1 +ATOM 7623 N NE2 . GLN B 2 411 ? 25.361 -30.395 8.533 1.00 53.19 411 B 1 +ATOM 7624 N N . HIS B 2 412 ? 20.459 -28.843 11.177 1.00 87.68 412 B 1 +ATOM 7625 C CA . HIS B 2 412 ? 20.382 -28.745 12.632 1.00 87.92 412 B 1 +ATOM 7626 C C . HIS B 2 412 ? 19.084 -28.088 13.121 1.00 89.11 412 B 1 +ATOM 7627 O O . HIS B 2 412 ? 18.911 -27.889 14.326 1.00 86.90 412 B 1 +ATOM 7628 C CB . HIS B 2 412 ? 21.630 -28.023 13.153 1.00 87.60 412 B 1 +ATOM 7629 C CG . HIS B 2 412 ? 22.907 -28.715 12.770 1.00 88.13 412 B 1 +ATOM 7630 N ND1 . HIS B 2 412 ? 23.379 -29.901 13.287 1.00 77.19 412 B 1 +ATOM 7631 C CD2 . HIS B 2 412 ? 23.809 -28.313 11.824 1.00 77.53 412 B 1 +ATOM 7632 C CE1 . HIS B 2 412 ? 24.539 -30.203 12.668 1.00 79.28 412 B 1 +ATOM 7633 N NE2 . HIS B 2 412 ? 24.826 -29.262 11.769 1.00 80.81 412 B 1 +ATOM 7634 N N . ASP B 2 413 ? 18.152 -27.779 12.229 1.00 88.98 413 B 1 +ATOM 7635 C CA . ASP B 2 413 ? 16.890 -27.138 12.581 1.00 89.87 413 B 1 +ATOM 7636 C C . ASP B 2 413 ? 15.824 -28.167 12.990 1.00 90.26 413 B 1 +ATOM 7637 O O . ASP B 2 413 ? 14.963 -28.569 12.201 1.00 88.39 413 B 1 +ATOM 7638 C CB . ASP B 2 413 ? 16.428 -26.218 11.449 1.00 88.86 413 B 1 +ATOM 7639 C CG . ASP B 2 413 ? 15.295 -25.277 11.872 1.00 88.79 413 B 1 +ATOM 7640 O OD1 . ASP B 2 413 ? 14.623 -25.508 12.898 1.00 81.16 413 B 1 +ATOM 7641 O OD2 . ASP B 2 413 ? 15.090 -24.279 11.151 1.00 81.63 413 B 1 +ATOM 7642 N N . PHE B 2 414 ? 15.876 -28.587 14.250 1.00 90.95 414 B 1 +ATOM 7643 C CA . PHE B 2 414 ? 14.846 -29.454 14.826 1.00 91.27 414 B 1 +ATOM 7644 C C . PHE B 2 414 ? 13.447 -28.834 14.717 1.00 91.78 414 B 1 +ATOM 7645 O O . PHE B 2 414 ? 12.499 -29.523 14.357 1.00 90.93 414 B 1 +ATOM 7646 C CB . PHE B 2 414 ? 15.188 -29.741 16.295 1.00 91.35 414 B 1 +ATOM 7647 C CG . PHE B 2 414 ? 14.059 -30.395 17.063 1.00 91.35 414 B 1 +ATOM 7648 C CD1 . PHE B 2 414 ? 13.140 -29.607 17.791 1.00 83.81 414 B 1 +ATOM 7649 C CD2 . PHE B 2 414 ? 13.882 -31.781 17.012 1.00 83.89 414 B 1 +ATOM 7650 C CE1 . PHE B 2 414 ? 12.056 -30.205 18.452 1.00 84.67 414 B 1 +ATOM 7651 C CE2 . PHE B 2 414 ? 12.795 -32.391 17.672 1.00 83.53 414 B 1 +ATOM 7652 C CZ . PHE B 2 414 ? 11.884 -31.600 18.394 1.00 89.81 414 B 1 +ATOM 7653 N N . PHE B 2 415 ? 13.312 -27.549 15.011 1.00 92.17 415 B 1 +ATOM 7654 C CA . PHE B 2 415 ? 12.025 -26.885 15.180 1.00 92.11 415 B 1 +ATOM 7655 C C . PHE B 2 415 ? 11.174 -26.919 13.908 1.00 92.47 415 B 1 +ATOM 7656 O O . PHE B 2 415 ? 10.016 -27.317 13.959 1.00 90.81 415 B 1 +ATOM 7657 C CB . PHE B 2 415 ? 12.251 -25.438 15.617 1.00 91.72 415 B 1 +ATOM 7658 C CG . PHE B 2 415 ? 13.093 -25.262 16.858 1.00 91.95 415 B 1 +ATOM 7659 C CD1 . PHE B 2 415 ? 12.524 -25.465 18.127 1.00 82.70 415 B 1 +ATOM 7660 C CD2 . PHE B 2 415 ? 14.439 -24.878 16.756 1.00 81.97 415 B 1 +ATOM 7661 C CE1 . PHE B 2 415 ? 13.287 -25.281 19.282 1.00 82.09 415 B 1 +ATOM 7662 C CE2 . PHE B 2 415 ? 15.210 -24.691 17.908 1.00 81.26 415 B 1 +ATOM 7663 C CZ . PHE B 2 415 ? 14.639 -24.886 19.177 1.00 89.61 415 B 1 +ATOM 7664 N N . LYS B 2 416 ? 11.751 -26.556 12.762 1.00 90.12 416 B 1 +ATOM 7665 C CA . LYS B 2 416 ? 11.050 -26.629 11.470 1.00 89.86 416 B 1 +ATOM 7666 C C . LYS B 2 416 ? 10.823 -28.076 11.038 1.00 89.61 416 B 1 +ATOM 7667 O O . LYS B 2 416 ? 9.786 -28.368 10.473 1.00 87.77 416 B 1 +ATOM 7668 C CB . LYS B 2 416 ? 11.807 -25.866 10.386 1.00 89.05 416 B 1 +ATOM 7669 C CG . LYS B 2 416 ? 11.831 -24.352 10.643 1.00 87.88 416 B 1 +ATOM 7670 C CD . LYS B 2 416 ? 12.542 -23.607 9.502 1.00 85.98 416 B 1 +ATOM 7671 C CE . LYS B 2 416 ? 12.822 -22.152 9.881 1.00 84.01 416 B 1 +ATOM 7672 N NZ . LYS B 2 416 ? 13.819 -22.056 10.973 1.00 79.97 416 B 1 +ATOM 7673 N N . SER B 2 417 ? 11.757 -28.977 11.325 1.00 90.33 417 B 1 +ATOM 7674 C CA . SER B 2 417 ? 11.661 -30.386 10.920 1.00 89.47 417 B 1 +ATOM 7675 C C . SER B 2 417 ? 10.486 -31.136 11.546 1.00 89.62 417 B 1 +ATOM 7676 O O . SER B 2 417 ? 9.982 -32.073 10.939 1.00 87.52 417 B 1 +ATOM 7677 C CB . SER B 2 417 ? 12.972 -31.121 11.229 1.00 88.61 417 B 1 +ATOM 7678 O OG . SER B 2 417 ? 13.113 -31.440 12.591 1.00 83.61 417 B 1 +ATOM 7679 N N . ALA B 2 418 ? 10.021 -30.700 12.726 1.00 89.54 418 B 1 +ATOM 7680 C CA . ALA B 2 418 ? 8.864 -31.272 13.407 1.00 89.58 418 B 1 +ATOM 7681 C C . ALA B 2 418 ? 7.514 -30.778 12.846 1.00 89.70 418 B 1 +ATOM 7682 O O . ALA B 2 418 ? 6.465 -31.296 13.228 1.00 87.31 418 B 1 +ATOM 7683 C CB . ALA B 2 418 ? 9.003 -30.969 14.902 1.00 89.36 418 B 1 +ATOM 7684 N N . MET B 2 419 ? 7.514 -29.784 11.966 1.00 89.15 419 B 1 +ATOM 7685 C CA . MET B 2 419 ? 6.293 -29.232 11.372 1.00 88.83 419 B 1 +ATOM 7686 C C . MET B 2 419 ? 5.814 -30.069 10.176 1.00 87.88 419 B 1 +ATOM 7687 O O . MET B 2 419 ? 6.642 -30.641 9.476 1.00 83.38 419 B 1 +ATOM 7688 C CB . MET B 2 419 ? 6.512 -27.768 10.996 1.00 88.63 419 B 1 +ATOM 7689 C CG . MET B 2 419 ? 6.842 -26.882 12.201 1.00 86.91 419 B 1 +ATOM 7690 S SD . MET B 2 419 ? 5.523 -26.778 13.437 1.00 88.12 419 B 1 +ATOM 7691 C CE . MET B 2 419 ? 6.446 -26.003 14.780 1.00 80.88 419 B 1 +ATOM 7692 N N . PRO B 2 420 ? 4.489 -30.147 9.875 1.00 88.25 420 B 1 +ATOM 7693 C CA . PRO B 2 420 ? 3.400 -29.355 10.466 1.00 88.21 420 B 1 +ATOM 7694 C C . PRO B 2 420 ? 2.797 -29.920 11.755 1.00 88.90 420 B 1 +ATOM 7695 O O . PRO B 2 420 ? 2.058 -29.206 12.427 1.00 86.10 420 B 1 +ATOM 7696 C CB . PRO B 2 420 ? 2.343 -29.301 9.362 1.00 85.60 420 B 1 +ATOM 7697 C CG . PRO B 2 420 ? 2.498 -30.654 8.664 1.00 82.38 420 B 1 +ATOM 7698 C CD . PRO B 2 420 ? 4.010 -30.883 8.719 1.00 84.53 420 B 1 +ATOM 7699 N N . GLU B 2 421 ? 3.091 -31.172 12.114 1.00 88.51 421 B 1 +ATOM 7700 C CA . GLU B 2 421 ? 2.520 -31.825 13.301 1.00 88.54 421 B 1 +ATOM 7701 C C . GLU B 2 421 ? 2.938 -31.110 14.592 1.00 89.78 421 B 1 +ATOM 7702 O O . GLU B 2 421 ? 2.160 -31.023 15.544 1.00 87.06 421 B 1 +ATOM 7703 C CB . GLU B 2 421 ? 2.948 -33.301 13.368 1.00 86.59 421 B 1 +ATOM 7704 C CG . GLU B 2 421 ? 2.454 -34.170 12.195 1.00 79.83 421 B 1 +ATOM 7705 C CD . GLU B 2 421 ? 3.302 -34.096 10.917 1.00 72.49 421 B 1 +ATOM 7706 O OE1 . GLU B 2 421 ? 2.938 -34.800 9.953 1.00 62.31 421 B 1 +ATOM 7707 O OE2 . GLU B 2 421 ? 4.298 -33.341 10.895 1.00 63.27 421 B 1 +ATOM 7708 N N . GLY B 2 422 ? 4.139 -30.561 14.593 1.00 90.23 422 B 1 +ATOM 7709 C CA . GLY B 2 422 ? 4.676 -29.700 15.622 1.00 90.77 422 B 1 +ATOM 7710 C C . GLY B 2 422 ? 5.437 -30.424 16.726 1.00 91.93 422 B 1 +ATOM 7711 O O . GLY B 2 422 ? 5.838 -31.580 16.605 1.00 89.34 422 B 1 +ATOM 7712 N N . TYR B 2 423 ? 5.670 -29.703 17.808 1.00 92.69 423 B 1 +ATOM 7713 C CA . TYR B 2 423 ? 6.398 -30.191 18.972 1.00 93.14 423 B 1 +ATOM 7714 C C . TYR B 2 423 ? 5.775 -29.700 20.279 1.00 93.73 423 B 1 +ATOM 7715 O O . TYR B 2 423 ? 5.166 -28.627 20.337 1.00 92.34 423 B 1 +ATOM 7716 C CB . TYR B 2 423 ? 7.883 -29.821 18.871 1.00 92.33 423 B 1 +ATOM 7717 C CG . TYR B 2 423 ? 8.170 -28.343 18.704 1.00 92.28 423 B 1 +ATOM 7718 C CD1 . TYR B 2 423 ? 8.435 -27.813 17.422 1.00 80.54 423 B 1 +ATOM 7719 C CD2 . TYR B 2 423 ? 8.182 -27.475 19.812 1.00 80.49 423 B 1 +ATOM 7720 C CE1 . TYR B 2 423 ? 8.702 -26.446 17.249 1.00 80.17 423 B 1 +ATOM 7721 C CE2 . TYR B 2 423 ? 8.439 -26.105 19.652 1.00 78.92 423 B 1 +ATOM 7722 C CZ . TYR B 2 423 ? 8.701 -25.592 18.368 1.00 88.99 423 B 1 +ATOM 7723 O OH . TYR B 2 423 ? 8.948 -24.257 18.206 1.00 88.10 423 B 1 +ATOM 7724 N N . VAL B 2 424 ? 5.952 -30.477 21.323 1.00 93.24 424 B 1 +ATOM 7725 C CA . VAL B 2 424 ? 5.714 -30.054 22.701 1.00 93.20 424 B 1 +ATOM 7726 C C . VAL B 2 424 ? 6.973 -29.372 23.210 1.00 93.22 424 B 1 +ATOM 7727 O O . VAL B 2 424 ? 8.069 -29.919 23.070 1.00 91.66 424 B 1 +ATOM 7728 C CB . VAL B 2 424 ? 5.319 -31.241 23.599 1.00 92.31 424 B 1 +ATOM 7729 C CG1 . VAL B 2 424 ? 5.046 -30.786 25.037 1.00 83.55 424 B 1 +ATOM 7730 C CG2 . VAL B 2 424 ? 4.050 -31.928 23.085 1.00 83.32 424 B 1 +ATOM 7731 N N . GLN B 2 425 ? 6.820 -28.210 23.822 1.00 93.49 425 B 1 +ATOM 7732 C CA . GLN B 2 425 ? 7.888 -27.502 24.503 1.00 93.10 425 B 1 +ATOM 7733 C C . GLN B 2 425 ? 7.555 -27.385 25.986 1.00 93.39 425 B 1 +ATOM 7734 O O . GLN B 2 425 ? 6.592 -26.715 26.364 1.00 92.30 425 B 1 +ATOM 7735 C CB . GLN B 2 425 ? 8.118 -26.143 23.825 1.00 92.21 425 B 1 +ATOM 7736 C CG . GLN B 2 425 ? 9.276 -25.384 24.459 1.00 90.28 425 B 1 +ATOM 7737 C CD . GLN B 2 425 ? 9.618 -24.114 23.672 1.00 89.45 425 B 1 +ATOM 7738 O OE1 . GLN B 2 425 ? 10.185 -24.156 22.591 1.00 82.15 425 B 1 +ATOM 7739 N NE2 . GLN B 2 425 ? 9.282 -22.971 24.192 1.00 79.23 425 B 1 +ATOM 7740 N N . GLU B 2 426 ? 8.362 -28.008 26.834 1.00 92.64 426 B 1 +ATOM 7741 C CA . GLU B 2 426 ? 8.242 -27.925 28.280 1.00 92.76 426 B 1 +ATOM 7742 C C . GLU B 2 426 ? 9.409 -27.104 28.839 1.00 92.43 426 B 1 +ATOM 7743 O O . GLU B 2 426 ? 10.555 -27.292 28.430 1.00 90.48 426 B 1 +ATOM 7744 C CB . GLU B 2 426 ? 8.170 -29.323 28.904 1.00 91.71 426 B 1 +ATOM 7745 C CG . GLU B 2 426 ? 6.902 -30.087 28.461 1.00 85.92 426 B 1 +ATOM 7746 C CD . GLU B 2 426 ? 6.798 -31.490 29.062 1.00 84.42 426 B 1 +ATOM 7747 O OE1 . GLU B 2 426 ? 5.729 -31.821 29.612 1.00 75.01 426 B 1 +ATOM 7748 O OE2 . GLU B 2 426 ? 7.765 -32.261 28.941 1.00 76.74 426 B 1 +ATOM 7749 N N . ARG B 2 427 ? 9.113 -26.209 29.782 1.00 93.14 427 B 1 +ATOM 7750 C CA . ARG B 2 427 ? 10.146 -25.450 30.491 1.00 93.17 427 B 1 +ATOM 7751 C C . ARG B 2 427 ? 9.922 -25.447 31.989 1.00 93.61 427 B 1 +ATOM 7752 O O . ARG B 2 427 ? 8.796 -25.456 32.476 1.00 91.60 427 B 1 +ATOM 7753 C CB . ARG B 2 427 ? 10.244 -24.003 29.980 1.00 91.46 427 B 1 +ATOM 7754 C CG . ARG B 2 427 ? 10.845 -23.898 28.574 1.00 87.83 427 B 1 +ATOM 7755 C CD . ARG B 2 427 ? 10.963 -22.423 28.187 1.00 86.75 427 B 1 +ATOM 7756 N NE . ARG B 2 427 ? 11.578 -22.248 26.871 1.00 85.09 427 B 1 +ATOM 7757 C CZ . ARG B 2 427 ? 11.363 -21.253 26.022 1.00 84.76 427 B 1 +ATOM 7758 N NH1 . ARG B 2 427 ? 10.542 -20.280 26.297 1.00 76.79 427 B 1 +ATOM 7759 N NH2 . ARG B 2 427 ? 11.962 -21.222 24.887 1.00 79.42 427 B 1 +ATOM 7760 N N . THR B 2 428 ? 11.030 -25.366 32.710 1.00 93.19 428 B 1 +ATOM 7761 C CA . THR B 2 428 ? 11.066 -24.908 34.092 1.00 93.01 428 B 1 +ATOM 7762 C C . THR B 2 428 ? 11.991 -23.698 34.149 1.00 93.11 428 B 1 +ATOM 7763 O O . THR B 2 428 ? 13.132 -23.778 33.697 1.00 91.27 428 B 1 +ATOM 7764 C CB . THR B 2 428 ? 11.525 -26.008 35.059 1.00 92.34 428 B 1 +ATOM 7765 O OG1 . THR B 2 428 ? 10.745 -27.168 34.871 1.00 82.49 428 B 1 +ATOM 7766 C CG2 . THR B 2 428 ? 11.348 -25.598 36.514 1.00 80.41 428 B 1 +ATOM 7767 N N . ILE B 2 429 ? 11.486 -22.593 34.667 1.00 94.08 429 B 1 +ATOM 7768 C CA . ILE B 2 429 ? 12.197 -21.318 34.759 1.00 93.91 429 B 1 +ATOM 7769 C C . ILE B 2 429 ? 12.370 -20.993 36.237 1.00 93.96 429 B 1 +ATOM 7770 O O . ILE B 2 429 ? 11.375 -20.751 36.922 1.00 92.30 429 B 1 +ATOM 7771 C CB . ILE B 2 429 ? 11.421 -20.198 34.026 1.00 93.66 429 B 1 +ATOM 7772 C CG1 . ILE B 2 429 ? 11.084 -20.582 32.572 1.00 91.10 429 B 1 +ATOM 7773 C CG2 . ILE B 2 429 ? 12.222 -18.891 34.103 1.00 90.49 429 B 1 +ATOM 7774 C CD1 . ILE B 2 429 ? 10.164 -19.580 31.849 1.00 87.56 429 B 1 +ATOM 7775 N N . PHE B 2 430 ? 13.596 -20.988 36.723 1.00 93.85 430 B 1 +ATOM 7776 C CA . PHE B 2 430 ? 13.906 -20.669 38.113 1.00 92.97 430 B 1 +ATOM 7777 C C . PHE B 2 430 ? 14.351 -19.222 38.215 1.00 92.43 430 B 1 +ATOM 7778 O O . PHE B 2 430 ? 15.443 -18.870 37.752 1.00 90.34 430 B 1 +ATOM 7779 C CB . PHE B 2 430 ? 14.973 -21.628 38.647 1.00 92.20 430 B 1 +ATOM 7780 C CG . PHE B 2 430 ? 14.551 -23.073 38.698 1.00 89.28 430 B 1 +ATOM 7781 C CD1 . PHE B 2 430 ? 13.826 -23.559 39.802 1.00 81.54 430 B 1 +ATOM 7782 C CD2 . PHE B 2 430 ? 14.867 -23.952 37.639 1.00 81.41 430 B 1 +ATOM 7783 C CE1 . PHE B 2 430 ? 13.440 -24.907 39.856 1.00 80.76 430 B 1 +ATOM 7784 C CE2 . PHE B 2 430 ? 14.475 -25.293 37.694 1.00 79.69 430 B 1 +ATOM 7785 C CZ . PHE B 2 430 ? 13.765 -25.774 38.804 1.00 84.53 430 B 1 +ATOM 7786 N N . PHE B 2 431 ? 13.530 -18.372 38.839 1.00 93.89 431 B 1 +ATOM 7787 C CA . PHE B 2 431 ? 13.922 -17.010 39.188 1.00 93.40 431 B 1 +ATOM 7788 C C . PHE B 2 431 ? 14.794 -17.063 40.443 1.00 92.86 431 B 1 +ATOM 7789 O O . PHE B 2 431 ? 14.390 -17.611 41.469 1.00 90.03 431 B 1 +ATOM 7790 C CB . PHE B 2 431 ? 12.687 -16.136 39.368 1.00 93.22 431 B 1 +ATOM 7791 C CG . PHE B 2 431 ? 11.910 -15.926 38.091 1.00 93.40 431 B 1 +ATOM 7792 C CD1 . PHE B 2 431 ? 12.195 -14.814 37.270 1.00 83.48 431 B 1 +ATOM 7793 C CD2 . PHE B 2 431 ? 10.931 -16.844 37.687 1.00 83.46 431 B 1 +ATOM 7794 C CE1 . PHE B 2 431 ? 11.505 -14.629 36.065 1.00 83.98 431 B 1 +ATOM 7795 C CE2 . PHE B 2 431 ? 10.243 -16.669 36.475 1.00 83.12 431 B 1 +ATOM 7796 C CZ . PHE B 2 431 ? 10.535 -15.558 35.663 1.00 91.42 431 B 1 +ATOM 7797 N N . LYS B 2 432 ? 16.001 -16.520 40.344 1.00 91.23 432 B 1 +ATOM 7798 C CA . LYS B 2 432 ? 16.944 -16.529 41.460 1.00 90.52 432 B 1 +ATOM 7799 C C . LYS B 2 432 ? 16.356 -15.774 42.655 1.00 89.52 432 B 1 +ATOM 7800 O O . LYS B 2 432 ? 15.886 -14.658 42.495 1.00 86.28 432 B 1 +ATOM 7801 C CB . LYS B 2 432 ? 18.288 -15.954 41.000 1.00 89.88 432 B 1 +ATOM 7802 C CG . LYS B 2 432 ? 19.342 -16.126 42.093 1.00 84.13 432 B 1 +ATOM 7803 C CD . LYS B 2 432 ? 20.658 -15.455 41.712 1.00 78.02 432 B 1 +ATOM 7804 C CE . LYS B 2 432 ? 21.597 -15.574 42.902 1.00 68.77 432 B 1 +ATOM 7805 N NZ . LYS B 2 432 ? 22.817 -14.760 42.725 1.00 60.08 432 B 1 +ATOM 7806 N N . ASP B 2 433 ? 16.432 -16.388 43.841 1.00 90.24 433 B 1 +ATOM 7807 C CA . ASP B 2 433 ? 15.894 -15.861 45.103 1.00 89.65 433 B 1 +ATOM 7808 C C . ASP B 2 433 ? 14.371 -15.592 45.090 1.00 90.18 433 B 1 +ATOM 7809 O O . ASP B 2 433 ? 13.862 -14.864 45.939 1.00 85.57 433 B 1 +ATOM 7810 C CB . ASP B 2 433 ? 16.748 -14.676 45.603 1.00 87.90 433 B 1 +ATOM 7811 C CG . ASP B 2 433 ? 18.234 -15.018 45.713 1.00 80.17 433 B 1 +ATOM 7812 O OD1 . ASP B 2 433 ? 18.547 -16.119 46.235 1.00 71.21 433 B 1 +ATOM 7813 O OD2 . ASP B 2 433 ? 19.080 -14.204 45.273 1.00 69.02 433 B 1 +ATOM 7814 N N . ASP B 2 434 ? 13.638 -16.213 44.149 1.00 90.85 434 B 1 +ATOM 7815 C CA . ASP B 2 434 ? 12.187 -16.124 44.001 1.00 91.93 434 B 1 +ATOM 7816 C C . ASP B 2 434 ? 11.605 -17.470 43.513 1.00 92.53 434 B 1 +ATOM 7817 O O . ASP B 2 434 ? 12.290 -18.496 43.551 1.00 86.76 434 B 1 +ATOM 7818 C CB . ASP B 2 434 ? 11.853 -14.933 43.083 1.00 90.10 434 B 1 +ATOM 7819 C CG . ASP B 2 434 ? 10.533 -14.246 43.441 1.00 90.25 434 B 1 +ATOM 7820 O OD1 . ASP B 2 434 ? 9.599 -14.933 43.914 1.00 81.72 434 B 1 +ATOM 7821 O OD2 . ASP B 2 434 ? 10.446 -13.011 43.266 1.00 82.48 434 B 1 +ATOM 7822 N N . GLY B 2 435 ? 10.371 -17.478 43.083 1.00 92.49 435 B 1 +ATOM 7823 C CA . GLY B 2 435 ? 9.660 -18.663 42.643 1.00 92.42 435 B 1 +ATOM 7824 C C . GLY B 2 435 ? 10.114 -19.247 41.299 1.00 93.48 435 B 1 +ATOM 7825 O O . GLY B 2 435 ? 11.156 -18.908 40.740 1.00 90.55 435 B 1 +ATOM 7826 N N . ASN B 2 436 ? 9.297 -20.143 40.765 1.00 94.10 436 B 1 +ATOM 7827 C CA . ASN B 2 436 ? 9.543 -20.768 39.473 1.00 94.14 436 B 1 +ATOM 7828 C C . ASN B 2 436 ? 8.280 -20.871 38.622 1.00 94.36 436 B 1 +ATOM 7829 O O . ASN B 2 436 ? 7.173 -21.056 39.138 1.00 92.14 436 B 1 +ATOM 7830 C CB . ASN B 2 436 ? 10.232 -22.132 39.662 1.00 92.48 436 B 1 +ATOM 7831 C CG . ASN B 2 436 ? 9.366 -23.144 40.404 1.00 89.18 436 B 1 +ATOM 7832 O OD1 . ASN B 2 436 ? 8.582 -23.889 39.833 1.00 77.87 436 B 1 +ATOM 7833 N ND2 . ASN B 2 436 ? 9.508 -23.220 41.710 1.00 77.31 436 B 1 +ATOM 7834 N N . TYR B 2 437 ? 8.469 -20.806 37.314 1.00 94.59 437 B 1 +ATOM 7835 C CA . TYR B 2 437 ? 7.444 -21.141 36.343 1.00 94.41 437 B 1 +ATOM 7836 C C . TYR B 2 437 ? 7.670 -22.548 35.798 1.00 94.39 437 B 1 +ATOM 7837 O O . TYR B 2 437 ? 8.788 -22.921 35.453 1.00 92.37 437 B 1 +ATOM 7838 C CB . TYR B 2 437 ? 7.409 -20.128 35.193 1.00 93.64 437 B 1 +ATOM 7839 C CG . TYR B 2 437 ? 7.042 -18.700 35.529 1.00 93.16 437 B 1 +ATOM 7840 C CD1 . TYR B 2 437 ? 6.398 -18.353 36.731 1.00 85.69 437 B 1 +ATOM 7841 C CD2 . TYR B 2 437 ? 7.312 -17.684 34.586 1.00 85.50 437 B 1 +ATOM 7842 C CE1 . TYR B 2 437 ? 6.047 -17.021 37.004 1.00 85.07 437 B 1 +ATOM 7843 C CE2 . TYR B 2 437 ? 6.965 -16.354 34.848 1.00 85.06 437 B 1 +ATOM 7844 C CZ . TYR B 2 437 ? 6.336 -16.016 36.063 1.00 90.52 437 B 1 +ATOM 7845 O OH . TYR B 2 437 ? 6.007 -14.719 36.324 1.00 88.56 437 B 1 +ATOM 7846 N N . LYS B 2 438 ? 6.593 -23.311 35.668 1.00 93.21 438 B 1 +ATOM 7847 C CA . LYS B 2 438 ? 6.542 -24.494 34.808 1.00 93.54 438 B 1 +ATOM 7848 C C . LYS B 2 438 ? 5.610 -24.201 33.650 1.00 93.35 438 B 1 +ATOM 7849 O O . LYS B 2 438 ? 4.488 -23.755 33.869 1.00 91.11 438 B 1 +ATOM 7850 C CB . LYS B 2 438 ? 6.093 -25.729 35.588 1.00 92.55 438 B 1 +ATOM 7851 C CG . LYS B 2 438 ? 7.213 -26.203 36.525 1.00 83.85 438 B 1 +ATOM 7852 C CD . LYS B 2 438 ? 6.843 -27.523 37.198 1.00 79.89 438 B 1 +ATOM 7853 C CE . LYS B 2 438 ? 8.026 -27.966 38.053 1.00 70.50 438 B 1 +ATOM 7854 N NZ . LYS B 2 438 ? 7.800 -29.288 38.668 1.00 61.33 438 B 1 +ATOM 7855 N N . THR B 2 439 ? 6.077 -24.459 32.443 1.00 94.24 439 B 1 +ATOM 7856 C CA . THR B 2 439 ? 5.308 -24.229 31.223 1.00 93.83 439 B 1 +ATOM 7857 C C . THR B 2 439 ? 5.249 -25.488 30.382 1.00 93.63 439 B 1 +ATOM 7858 O O . THR B 2 439 ? 6.236 -26.219 30.270 1.00 92.03 439 B 1 +ATOM 7859 C CB . THR B 2 439 ? 5.848 -23.061 30.392 1.00 92.62 439 B 1 +ATOM 7860 O OG1 . THR B 2 439 ? 7.138 -23.324 29.895 1.00 80.17 439 B 1 +ATOM 7861 C CG2 . THR B 2 439 ? 5.954 -21.775 31.208 1.00 80.10 439 B 1 +ATOM 7862 N N . ARG B 2 440 ? 4.103 -25.728 29.768 1.00 92.78 440 B 1 +ATOM 7863 C CA . ARG B 2 440 ? 3.907 -26.720 28.717 1.00 93.23 440 B 1 +ATOM 7864 C C . ARG B 2 440 ? 3.243 -26.022 27.542 1.00 92.82 440 B 1 +ATOM 7865 O O . ARG B 2 440 ? 2.197 -25.410 27.713 1.00 90.85 440 B 1 +ATOM 7866 C CB . ARG B 2 440 ? 3.078 -27.889 29.253 1.00 92.36 440 B 1 +ATOM 7867 C CG . ARG B 2 440 ? 2.823 -28.944 28.173 1.00 88.63 440 B 1 +ATOM 7868 C CD . ARG B 2 440 ? 1.913 -30.041 28.705 1.00 86.57 440 B 1 +ATOM 7869 N NE . ARG B 2 440 ? 1.553 -31.004 27.648 1.00 80.17 440 B 1 +ATOM 7870 C CZ . ARG B 2 440 ? 2.180 -32.129 27.348 1.00 74.72 440 B 1 +ATOM 7871 N NH1 . ARG B 2 440 ? 3.185 -32.579 28.048 1.00 65.69 440 B 1 +ATOM 7872 N NH2 . ARG B 2 440 ? 1.801 -32.817 26.323 1.00 69.51 440 B 1 +ATOM 7873 N N . ALA B 2 441 ? 3.845 -26.127 26.368 1.00 93.42 441 B 1 +ATOM 7874 C CA . ALA B 2 441 ? 3.315 -25.556 25.149 1.00 93.07 441 B 1 +ATOM 7875 C C . ALA B 2 441 ? 3.231 -26.612 24.044 1.00 93.31 441 B 1 +ATOM 7876 O O . ALA B 2 441 ? 4.112 -27.458 23.916 1.00 91.70 441 B 1 +ATOM 7877 C CB . ALA B 2 441 ? 4.193 -24.371 24.738 1.00 91.67 441 B 1 +ATOM 7878 N N . GLU B 2 442 ? 2.191 -26.526 23.214 1.00 92.63 442 B 1 +ATOM 7879 C CA . GLU B 2 442 ? 2.119 -27.212 21.929 1.00 92.72 442 B 1 +ATOM 7880 C C . GLU B 2 442 ? 2.256 -26.186 20.812 1.00 92.58 442 B 1 +ATOM 7881 O O . GLU B 2 442 ? 1.444 -25.266 20.700 1.00 90.41 442 B 1 +ATOM 7882 C CB . GLU B 2 442 ? 0.816 -28.008 21.782 1.00 91.47 442 B 1 +ATOM 7883 C CG . GLU B 2 442 ? 0.732 -29.194 22.745 1.00 85.19 442 B 1 +ATOM 7884 C CD . GLU B 2 442 ? -0.465 -30.122 22.465 1.00 85.01 442 B 1 +ATOM 7885 O OE1 . GLU B 2 442 ? -0.578 -31.144 23.180 1.00 76.65 442 B 1 +ATOM 7886 O OE2 . GLU B 2 442 ? -1.245 -29.846 21.529 1.00 78.94 442 B 1 +ATOM 7887 N N . VAL B 2 443 ? 3.292 -26.351 19.996 1.00 93.16 443 B 1 +ATOM 7888 C CA . VAL B 2 443 ? 3.585 -25.484 18.849 1.00 92.94 443 B 1 +ATOM 7889 C C . VAL B 2 443 ? 3.375 -26.299 17.585 1.00 92.65 443 B 1 +ATOM 7890 O O . VAL B 2 443 ? 4.104 -27.255 17.337 1.00 90.98 443 B 1 +ATOM 7891 C CB . VAL B 2 443 ? 5.010 -24.927 18.903 1.00 92.28 443 B 1 +ATOM 7892 C CG1 . VAL B 2 443 ? 5.229 -23.900 17.793 1.00 84.75 443 B 1 +ATOM 7893 C CG2 . VAL B 2 443 ? 5.297 -24.235 20.239 1.00 81.95 443 B 1 +ATOM 7894 N N . LYS B 2 444 ? 2.366 -25.952 16.790 1.00 92.16 444 B 1 +ATOM 7895 C CA . LYS B 2 444 ? 1.971 -26.702 15.594 1.00 92.14 444 B 1 +ATOM 7896 C C . LYS B 2 444 ? 1.262 -25.812 14.578 1.00 91.95 444 B 1 +ATOM 7897 O O . LYS B 2 444 ? 0.800 -24.727 14.913 1.00 90.08 444 B 1 +ATOM 7898 C CB . LYS B 2 444 ? 1.094 -27.904 16.000 1.00 89.80 444 B 1 +ATOM 7899 C CG . LYS B 2 444 ? -0.234 -27.510 16.662 1.00 84.12 444 B 1 +ATOM 7900 C CD . LYS B 2 444 ? -0.945 -28.758 17.219 1.00 84.61 444 B 1 +ATOM 7901 C CE . LYS B 2 444 ? -2.225 -28.360 17.931 1.00 74.31 444 B 1 +ATOM 7902 N NZ . LYS B 2 444 ? -2.740 -29.471 18.762 1.00 68.39 444 B 1 +ATOM 7903 N N . PHE B 2 445 ? 1.147 -26.287 13.347 1.00 91.37 445 B 1 +ATOM 7904 C CA . PHE B 2 445 ? 0.312 -25.630 12.359 1.00 90.63 445 B 1 +ATOM 7905 C C . PHE B 2 445 ? -1.162 -26.005 12.537 1.00 90.49 445 B 1 +ATOM 7906 O O . PHE B 2 445 ? -1.517 -27.176 12.631 1.00 87.82 445 B 1 +ATOM 7907 C CB . PHE B 2 445 ? 0.813 -25.933 10.946 1.00 89.60 445 B 1 +ATOM 7908 C CG . PHE B 2 445 ? 1.917 -24.992 10.504 1.00 89.30 445 B 1 +ATOM 7909 C CD1 . PHE B 2 445 ? 1.583 -23.789 9.847 1.00 79.88 445 B 1 +ATOM 7910 C CD2 . PHE B 2 445 ? 3.264 -25.299 10.734 1.00 79.21 445 B 1 +ATOM 7911 C CE1 . PHE B 2 445 ? 2.589 -22.912 9.423 1.00 79.04 445 B 1 +ATOM 7912 C CE2 . PHE B 2 445 ? 4.275 -24.424 10.313 1.00 78.70 445 B 1 +ATOM 7913 C CZ . PHE B 2 445 ? 3.937 -23.226 9.658 1.00 86.52 445 B 1 +ATOM 7914 N N . GLU B 2 446 ? -2.031 -25.004 12.536 1.00 88.69 446 B 1 +ATOM 7915 C CA . GLU B 2 446 ? -3.478 -25.134 12.365 1.00 88.15 446 B 1 +ATOM 7916 C C . GLU B 2 446 ? -3.867 -24.455 11.044 1.00 88.16 446 B 1 +ATOM 7917 O O . GLU B 2 446 ? -4.095 -23.250 10.976 1.00 83.85 446 B 1 +ATOM 7918 C CB . GLU B 2 446 ? -4.244 -24.575 13.580 1.00 86.91 446 B 1 +ATOM 7919 C CG . GLU B 2 446 ? -4.039 -25.393 14.872 1.00 83.66 446 B 1 +ATOM 7920 C CD . GLU B 2 446 ? -4.858 -24.878 16.079 1.00 81.99 446 B 1 +ATOM 7921 O OE1 . GLU B 2 446 ? -4.574 -25.313 17.222 1.00 73.30 446 B 1 +ATOM 7922 O OE2 . GLU B 2 446 ? -5.775 -24.049 15.908 1.00 76.03 446 B 1 +ATOM 7923 N N . GLY B 2 447 ? -3.871 -25.227 9.948 1.00 85.75 447 B 1 +ATOM 7924 C CA . GLY B 2 447 ? -3.926 -24.704 8.589 1.00 85.14 447 B 1 +ATOM 7925 C C . GLY B 2 447 ? -2.614 -24.001 8.230 1.00 86.13 447 B 1 +ATOM 7926 O O . GLY B 2 447 ? -1.540 -24.588 8.328 1.00 81.93 447 B 1 +ATOM 7927 N N . ASP B 2 448 ? -2.697 -22.746 7.829 1.00 87.93 448 B 1 +ATOM 7928 C CA . ASP B 2 448 ? -1.580 -21.895 7.426 1.00 87.35 448 B 1 +ATOM 7929 C C . ASP B 2 448 ? -1.053 -20.990 8.546 1.00 88.94 448 B 1 +ATOM 7930 O O . ASP B 2 448 ? -0.160 -20.180 8.319 1.00 85.12 448 B 1 +ATOM 7931 C CB . ASP B 2 448 ? -1.996 -21.092 6.176 1.00 83.07 448 B 1 +ATOM 7932 C CG . ASP B 2 448 ? -3.269 -20.242 6.376 1.00 73.80 448 B 1 +ATOM 7933 O OD1 . ASP B 2 448 ? -4.226 -20.731 7.018 1.00 62.41 448 B 1 +ATOM 7934 O OD2 . ASP B 2 448 ? -3.319 -19.112 5.857 1.00 63.93 448 B 1 +ATOM 7935 N N . THR B 2 449 ? -1.580 -21.125 9.769 1.00 89.49 449 B 1 +ATOM 7936 C CA . THR B 2 449 ? -1.157 -20.366 10.951 1.00 90.02 449 B 1 +ATOM 7937 C C . THR B 2 449 ? -0.377 -21.260 11.899 1.00 90.69 449 B 1 +ATOM 7938 O O . THR B 2 449 ? -0.826 -22.351 12.235 1.00 88.54 449 B 1 +ATOM 7939 C CB . THR B 2 449 ? -2.356 -19.754 11.677 1.00 88.64 449 B 1 +ATOM 7940 O OG1 . THR B 2 449 ? -2.988 -18.854 10.790 1.00 77.76 449 B 1 +ATOM 7941 C CG2 . THR B 2 449 ? -2.012 -18.944 12.909 1.00 76.34 449 B 1 +ATOM 7942 N N . LEU B 2 450 ? 0.770 -20.761 12.358 1.00 91.33 450 B 1 +ATOM 7943 C CA . LEU B 2 450 ? 1.475 -21.397 13.452 1.00 91.79 450 B 1 +ATOM 7944 C C . LEU B 2 450 ? 0.812 -21.006 14.771 1.00 91.83 450 B 1 +ATOM 7945 O O . LEU B 2 450 ? 0.690 -19.828 15.088 1.00 90.70 450 B 1 +ATOM 7946 C CB . LEU B 2 450 ? 2.950 -21.000 13.426 1.00 91.47 450 B 1 +ATOM 7947 C CG . LEU B 2 450 ? 3.743 -21.858 14.425 1.00 90.45 450 B 1 +ATOM 7948 C CD1 . LEU B 2 450 ? 4.205 -23.164 13.779 1.00 78.72 450 B 1 +ATOM 7949 C CD2 . LEU B 2 450 ? 4.963 -21.102 14.930 1.00 78.77 450 B 1 +ATOM 7950 N N . VAL B 2 451 ? 0.423 -22.003 15.559 1.00 92.57 451 B 1 +ATOM 7951 C CA . VAL B 2 451 ? -0.237 -21.808 16.848 1.00 92.54 451 B 1 +ATOM 7952 C C . VAL B 2 451 ? 0.665 -22.309 17.973 1.00 92.45 451 B 1 +ATOM 7953 O O . VAL B 2 451 ? 1.155 -23.429 17.927 1.00 90.93 451 B 1 +ATOM 7954 C CB . VAL B 2 451 ? -1.619 -22.488 16.881 1.00 91.13 451 B 1 +ATOM 7955 C CG1 . VAL B 2 451 ? -2.358 -22.169 18.182 1.00 81.01 451 B 1 +ATOM 7956 C CG2 . VAL B 2 451 ? -2.489 -22.007 15.712 1.00 80.02 451 B 1 +ATOM 7957 N N . ASN B 2 452 ? 0.851 -21.472 18.991 1.00 93.30 452 B 1 +ATOM 7958 C CA . ASN B 2 452 ? 1.530 -21.807 20.240 1.00 92.84 452 B 1 +ATOM 7959 C C . ASN B 2 452 ? 0.513 -21.709 21.381 1.00 93.01 452 B 1 +ATOM 7960 O O . ASN B 2 452 ? 0.117 -20.612 21.762 1.00 91.73 452 B 1 +ATOM 7961 C CB . ASN B 2 452 ? 2.729 -20.861 20.411 1.00 91.73 452 B 1 +ATOM 7962 C CG . ASN B 2 452 ? 3.524 -21.118 21.682 1.00 90.98 452 B 1 +ATOM 7963 O OD1 . ASN B 2 452 ? 3.424 -22.147 22.325 1.00 80.69 452 B 1 +ATOM 7964 N ND2 . ASN B 2 452 ? 4.374 -20.189 22.067 1.00 80.88 452 B 1 +ATOM 7965 N N . ARG B 2 453 ? 0.087 -22.848 21.904 1.00 92.28 453 B 1 +ATOM 7966 C CA . ARG B 2 453 ? -0.831 -22.943 23.045 1.00 92.20 453 B 1 +ATOM 7967 C C . ARG B 2 453 ? -0.045 -23.324 24.292 1.00 92.20 453 B 1 +ATOM 7968 O O . ARG B 2 453 ? 0.617 -24.359 24.295 1.00 90.47 453 B 1 +ATOM 7969 C CB . ARG B 2 453 ? -1.945 -23.955 22.780 1.00 90.88 453 B 1 +ATOM 7970 C CG . ARG B 2 453 ? -2.871 -23.514 21.644 1.00 83.82 453 B 1 +ATOM 7971 C CD . ARG B 2 453 ? -4.003 -24.530 21.458 1.00 82.41 453 B 1 +ATOM 7972 N NE . ARG B 2 453 ? -4.822 -24.218 20.279 1.00 78.41 453 B 1 +ATOM 7973 C CZ . ARG B 2 453 ? -5.788 -23.311 20.197 1.00 73.60 453 B 1 +ATOM 7974 N NH1 . ARG B 2 453 ? -6.238 -22.677 21.240 1.00 64.04 453 B 1 +ATOM 7975 N NH2 . ARG B 2 453 ? -6.288 -23.009 19.047 1.00 68.82 453 B 1 +ATOM 7976 N N . ILE B 2 454 ? -0.135 -22.507 25.331 1.00 93.64 454 B 1 +ATOM 7977 C CA . ILE B 2 454 ? 0.731 -22.594 26.500 1.00 93.98 454 B 1 +ATOM 7978 C C . ILE B 2 454 ? -0.107 -22.641 27.777 1.00 93.92 454 B 1 +ATOM 7979 O O . ILE B 2 454 ? -0.974 -21.799 27.992 1.00 92.17 454 B 1 +ATOM 7980 C CB . ILE B 2 454 ? 1.718 -21.402 26.551 1.00 93.14 454 B 1 +ATOM 7981 C CG1 . ILE B 2 454 ? 2.418 -21.135 25.195 1.00 85.61 454 B 1 +ATOM 7982 C CG2 . ILE B 2 454 ? 2.766 -21.643 27.646 1.00 84.09 454 B 1 +ATOM 7983 C CD1 . ILE B 2 454 ? 3.085 -19.755 25.112 1.00 82.84 454 B 1 +ATOM 7984 N N . GLU B 2 455 ? 0.214 -23.566 28.653 1.00 93.37 455 B 1 +ATOM 7985 C CA . GLU B 2 455 ? -0.176 -23.529 30.054 1.00 93.20 455 B 1 +ATOM 7986 C C . GLU B 2 455 ? 1.047 -23.169 30.903 1.00 93.39 455 B 1 +ATOM 7987 O O . GLU B 2 455 ? 2.120 -23.764 30.744 1.00 91.58 455 B 1 +ATOM 7988 C CB . GLU B 2 455 ? -0.771 -24.868 30.504 1.00 91.95 455 B 1 +ATOM 7989 C CG . GLU B 2 455 ? -2.138 -25.152 29.870 1.00 78.73 455 B 1 +ATOM 7990 C CD . GLU B 2 455 ? -2.772 -26.464 30.367 1.00 74.22 455 B 1 +ATOM 7991 O OE1 . GLU B 2 455 ? -3.973 -26.685 30.081 1.00 64.84 455 B 1 +ATOM 7992 O OE2 . GLU B 2 455 ? -2.069 -27.260 31.036 1.00 66.33 455 B 1 +ATOM 7993 N N . LEU B 2 456 ? 0.884 -22.187 31.802 1.00 93.74 456 B 1 +ATOM 7994 C CA . LEU B 2 456 ? 1.927 -21.756 32.721 1.00 93.88 456 B 1 +ATOM 7995 C C . LEU B 2 456 ? 1.435 -21.875 34.153 1.00 93.71 456 B 1 +ATOM 7996 O O . LEU B 2 456 ? 0.385 -21.342 34.514 1.00 92.19 456 B 1 +ATOM 7997 C CB . LEU B 2 456 ? 2.387 -20.330 32.348 1.00 93.07 456 B 1 +ATOM 7998 C CG . LEU B 2 456 ? 3.485 -19.744 33.263 1.00 93.18 456 B 1 +ATOM 7999 C CD1 . LEU B 2 456 ? 4.308 -18.714 32.486 1.00 82.66 456 B 1 +ATOM 8000 C CD2 . LEU B 2 456 ? 2.934 -19.013 34.487 1.00 82.39 456 B 1 +ATOM 8001 N N . LYS B 2 457 ? 2.245 -22.520 35.002 1.00 93.41 457 B 1 +ATOM 8002 C CA . LYS B 2 457 ? 2.010 -22.561 36.441 1.00 93.71 457 B 1 +ATOM 8003 C C . LYS B 2 457 ? 3.226 -22.038 37.193 1.00 93.68 457 B 1 +ATOM 8004 O O . LYS B 2 457 ? 4.314 -22.588 37.054 1.00 91.01 457 B 1 +ATOM 8005 C CB . LYS B 2 457 ? 1.603 -23.979 36.840 1.00 92.49 457 B 1 +ATOM 8006 C CG . LYS B 2 457 ? 1.093 -23.990 38.287 1.00 84.20 457 B 1 +ATOM 8007 C CD . LYS B 2 457 ? 0.185 -25.188 38.552 1.00 77.87 457 B 1 +ATOM 8008 C CE . LYS B 2 457 ? -0.444 -25.020 39.936 1.00 68.67 457 B 1 +ATOM 8009 N NZ . LYS B 2 457 ? -1.702 -25.798 40.057 1.00 59.83 457 B 1 +ATOM 8010 N N . GLY B 2 458 ? 3.027 -20.977 37.974 1.00 93.69 458 B 1 +ATOM 8011 C CA . GLY B 2 458 ? 4.035 -20.392 38.848 1.00 93.12 458 B 1 +ATOM 8012 C C . GLY B 2 458 ? 3.721 -20.680 40.309 1.00 93.45 458 B 1 +ATOM 8013 O O . GLY B 2 458 ? 2.573 -20.610 40.731 1.00 90.72 458 B 1 +ATOM 8014 N N . ILE B 2 459 ? 4.747 -21.019 41.080 1.00 93.54 459 B 1 +ATOM 8015 C CA . ILE B 2 459 ? 4.650 -21.331 42.508 1.00 93.22 459 B 1 +ATOM 8016 C C . ILE B 2 459 ? 5.811 -20.695 43.282 1.00 93.28 459 B 1 +ATOM 8017 O O . ILE B 2 459 ? 6.849 -20.387 42.703 1.00 89.48 459 B 1 +ATOM 8018 C CB . ILE B 2 459 ? 4.594 -22.859 42.756 1.00 90.94 459 B 1 +ATOM 8019 C CG1 . ILE B 2 459 ? 5.808 -23.603 42.155 1.00 81.42 459 B 1 +ATOM 8020 C CG2 . ILE B 2 459 ? 3.268 -23.428 42.230 1.00 79.78 459 B 1 +ATOM 8021 C CD1 . ILE B 2 459 ? 5.899 -25.080 42.576 1.00 76.00 459 B 1 +ATOM 8022 N N . ASP B 2 460 ? 5.624 -20.535 44.583 1.00 91.94 460 B 1 +ATOM 8023 C CA . ASP B 2 460 ? 6.657 -20.094 45.538 1.00 92.01 460 B 1 +ATOM 8024 C C . ASP B 2 460 ? 7.233 -18.694 45.252 1.00 92.48 460 B 1 +ATOM 8025 O O . ASP B 2 460 ? 8.367 -18.402 45.618 1.00 87.96 460 B 1 +ATOM 8026 C CB . ASP B 2 460 ? 7.731 -21.179 45.719 1.00 90.41 460 B 1 +ATOM 8027 C CG . ASP B 2 460 ? 7.151 -22.559 46.058 1.00 87.20 460 B 1 +ATOM 8028 O OD1 . ASP B 2 460 ? 6.138 -22.608 46.791 1.00 78.78 460 B 1 +ATOM 8029 O OD2 . ASP B 2 460 ? 7.714 -23.570 45.575 1.00 78.06 460 B 1 +ATOM 8030 N N . PHE B 2 461 ? 6.446 -17.817 44.615 1.00 93.06 461 B 1 +ATOM 8031 C CA . PHE B 2 461 ? 6.828 -16.415 44.427 1.00 93.23 461 B 1 +ATOM 8032 C C . PHE B 2 461 ? 6.587 -15.600 45.692 1.00 92.77 461 B 1 +ATOM 8033 O O . PHE B 2 461 ? 5.611 -15.801 46.420 1.00 88.90 461 B 1 +ATOM 8034 C CB . PHE B 2 461 ? 6.078 -15.811 43.236 1.00 93.01 461 B 1 +ATOM 8035 C CG . PHE B 2 461 ? 6.617 -16.281 41.909 1.00 94.29 461 B 1 +ATOM 8036 C CD1 . PHE B 2 461 ? 7.697 -15.610 41.307 1.00 87.94 461 B 1 +ATOM 8037 C CD2 . PHE B 2 461 ? 6.095 -17.430 41.290 1.00 87.24 461 B 1 +ATOM 8038 C CE1 . PHE B 2 461 ? 8.253 -16.088 40.115 1.00 86.75 461 B 1 +ATOM 8039 C CE2 . PHE B 2 461 ? 6.655 -17.910 40.097 1.00 86.74 461 B 1 +ATOM 8040 C CZ . PHE B 2 461 ? 7.734 -17.238 39.517 1.00 92.58 461 B 1 +ATOM 8041 N N . LYS B 2 462 ? 7.457 -14.621 45.918 1.00 92.94 462 B 1 +ATOM 8042 C CA . LYS B 2 462 ? 7.301 -13.610 46.968 1.00 92.47 462 B 1 +ATOM 8043 C C . LYS B 2 462 ? 6.366 -12.508 46.467 1.00 91.81 462 B 1 +ATOM 8044 O O . LYS B 2 462 ? 6.622 -11.936 45.409 1.00 88.83 462 B 1 +ATOM 8045 C CB . LYS B 2 462 ? 8.666 -13.040 47.349 1.00 90.80 462 B 1 +ATOM 8046 C CG . LYS B 2 462 ? 9.625 -14.101 47.913 1.00 86.35 462 B 1 +ATOM 8047 C CD . LYS B 2 462 ? 11.010 -13.487 48.095 1.00 84.46 462 B 1 +ATOM 8048 C CE . LYS B 2 462 ? 12.020 -14.564 48.512 1.00 75.84 462 B 1 +ATOM 8049 N NZ . LYS B 2 462 ? 13.399 -14.069 48.352 1.00 67.99 462 B 1 +ATOM 8050 N N . GLU B 2 463 ? 5.347 -12.159 47.249 1.00 91.32 463 B 1 +ATOM 8051 C CA . GLU B 2 463 ? 4.383 -11.108 46.884 1.00 90.00 463 B 1 +ATOM 8052 C C . GLU B 2 463 ? 5.033 -9.721 46.739 1.00 89.90 463 B 1 +ATOM 8053 O O . GLU B 2 463 ? 4.614 -8.910 45.919 1.00 85.45 463 B 1 +ATOM 8054 C CB . GLU B 2 463 ? 3.261 -11.052 47.939 1.00 88.23 463 B 1 +ATOM 8055 C CG . GLU B 2 463 ? 2.320 -12.278 47.918 1.00 81.68 463 B 1 +ATOM 8056 C CD . GLU B 2 463 ? 1.443 -12.377 46.659 1.00 77.00 463 B 1 +ATOM 8057 O OE1 . GLU B 2 463 ? 1.060 -13.516 46.291 1.00 68.66 463 B 1 +ATOM 8058 O OE2 . GLU B 2 463 ? 1.142 -11.332 46.057 1.00 70.83 463 B 1 +ATOM 8059 N N . ASP B 2 464 ? 6.099 -9.453 47.477 1.00 90.33 464 B 1 +ATOM 8060 C CA . ASP B 2 464 ? 6.909 -8.234 47.407 1.00 89.45 464 B 1 +ATOM 8061 C C . ASP B 2 464 ? 8.206 -8.406 46.599 1.00 90.28 464 B 1 +ATOM 8062 O O . ASP B 2 464 ? 9.053 -7.505 46.577 1.00 84.18 464 B 1 +ATOM 8063 C CB . ASP B 2 464 ? 7.188 -7.741 48.834 1.00 86.09 464 B 1 +ATOM 8064 C CG . ASP B 2 464 ? 8.148 -8.644 49.623 1.00 76.47 464 B 1 +ATOM 8065 O OD1 . ASP B 2 464 ? 8.117 -9.883 49.403 1.00 65.47 464 B 1 +ATOM 8066 O OD2 . ASP B 2 464 ? 8.908 -8.096 50.448 1.00 65.94 464 B 1 +ATOM 8067 N N . GLY B 2 465 ? 8.378 -9.547 45.941 1.00 90.58 465 B 1 +ATOM 8068 C CA . GLY B 2 465 ? 9.511 -9.854 45.083 1.00 89.91 465 B 1 +ATOM 8069 C C . GLY B 2 465 ? 9.514 -9.047 43.781 1.00 91.05 465 B 1 +ATOM 8070 O O . GLY B 2 465 ? 8.610 -8.265 43.495 1.00 87.51 465 B 1 +ATOM 8071 N N . ASN B 2 466 ? 10.553 -9.246 42.976 1.00 92.03 466 B 1 +ATOM 8072 C CA . ASN B 2 466 ? 10.697 -8.521 41.713 1.00 91.32 466 B 1 +ATOM 8073 C C . ASN B 2 466 ? 9.631 -8.891 40.673 1.00 91.74 466 B 1 +ATOM 8074 O O . ASN B 2 466 ? 9.359 -8.100 39.774 1.00 88.22 466 B 1 +ATOM 8075 C CB . ASN B 2 466 ? 12.104 -8.771 41.154 1.00 90.02 466 B 1 +ATOM 8076 C CG . ASN B 2 466 ? 13.201 -8.214 42.044 1.00 88.85 466 B 1 +ATOM 8077 O OD1 . ASN B 2 466 ? 13.023 -7.277 42.798 1.00 79.19 466 B 1 +ATOM 8078 N ND2 . ASN B 2 466 ? 14.386 -8.792 41.972 1.00 78.38 466 B 1 +ATOM 8079 N N . ILE B 2 467 ? 9.019 -10.067 40.788 1.00 92.25 467 B 1 +ATOM 8080 C CA . ILE B 2 467 ? 8.024 -10.579 39.847 1.00 92.42 467 B 1 +ATOM 8081 C C . ILE B 2 467 ? 6.626 -10.081 40.229 1.00 92.28 467 B 1 +ATOM 8082 O O . ILE B 2 467 ? 6.071 -9.226 39.529 1.00 89.52 467 B 1 +ATOM 8083 C CB . ILE B 2 467 ? 8.109 -12.120 39.725 1.00 92.22 467 B 1 +ATOM 8084 C CG1 . ILE B 2 467 ? 9.548 -12.658 39.535 1.00 87.88 467 B 1 +ATOM 8085 C CG2 . ILE B 2 467 ? 7.198 -12.614 38.581 1.00 85.96 467 B 1 +ATOM 8086 C CD1 . ILE B 2 467 ? 10.343 -12.017 38.385 1.00 78.84 467 B 1 +ATOM 8087 N N . LEU B 2 468 ? 6.079 -10.514 41.354 1.00 92.25 468 B 1 +ATOM 8088 C CA . LEU B 2 468 ? 4.749 -10.076 41.797 1.00 91.98 468 B 1 +ATOM 8089 C C . LEU B 2 468 ? 4.721 -8.608 42.239 1.00 91.50 468 B 1 +ATOM 8090 O O . LEU B 2 468 ? 3.714 -7.923 42.049 1.00 87.72 468 B 1 +ATOM 8091 C CB . LEU B 2 468 ? 4.248 -11.006 42.915 1.00 91.42 468 B 1 +ATOM 8092 C CG . LEU B 2 468 ? 3.985 -12.457 42.471 1.00 90.59 468 B 1 +ATOM 8093 C CD1 . LEU B 2 468 ? 3.558 -13.292 43.670 1.00 83.03 468 B 1 +ATOM 8094 C CD2 . LEU B 2 468 ? 2.882 -12.558 41.418 1.00 82.48 468 B 1 +ATOM 8095 N N . GLY B 2 469 ? 5.831 -8.089 42.736 1.00 91.58 469 B 1 +ATOM 8096 C CA . GLY B 2 469 ? 6.013 -6.675 43.071 1.00 90.23 469 B 1 +ATOM 8097 C C . GLY B 2 469 ? 6.259 -5.758 41.864 1.00 90.67 469 B 1 +ATOM 8098 O O . GLY B 2 469 ? 6.441 -4.557 42.068 1.00 86.68 469 B 1 +ATOM 8099 N N . HIS B 2 470 ? 6.291 -6.286 40.636 1.00 90.52 470 B 1 +ATOM 8100 C CA . HIS B 2 470 ? 6.462 -5.525 39.391 1.00 89.77 470 B 1 +ATOM 8101 C C . HIS B 2 470 ? 7.701 -4.605 39.364 1.00 89.85 470 B 1 +ATOM 8102 O O . HIS B 2 470 ? 7.620 -3.475 38.895 1.00 85.18 470 B 1 +ATOM 8103 C CB . HIS B 2 470 ? 5.159 -4.783 39.035 1.00 88.12 470 B 1 +ATOM 8104 C CG . HIS B 2 470 ? 4.068 -5.665 38.527 1.00 88.33 470 B 1 +ATOM 8105 N ND1 . HIS B 2 470 ? 3.874 -6.020 37.208 1.00 76.00 470 B 1 +ATOM 8106 C CD2 . HIS B 2 470 ? 3.028 -6.225 39.242 1.00 76.53 470 B 1 +ATOM 8107 C CE1 . HIS B 2 470 ? 2.757 -6.754 37.137 1.00 78.77 470 B 1 +ATOM 8108 N NE2 . HIS B 2 470 ? 2.213 -6.902 38.349 1.00 80.31 470 B 1 +ATOM 8109 N N . LYS B 2 471 ? 8.844 -5.084 39.803 1.00 89.24 471 B 1 +ATOM 8110 C CA . LYS B 2 471 ? 10.101 -4.322 39.914 1.00 89.26 471 B 1 +ATOM 8111 C C . LYS B 2 471 ? 11.062 -4.527 38.735 1.00 89.55 471 B 1 +ATOM 8112 O O . LYS B 2 471 ? 12.243 -4.186 38.841 1.00 86.02 471 B 1 +ATOM 8113 C CB . LYS B 2 471 ? 10.782 -4.632 41.257 1.00 88.41 471 B 1 +ATOM 8114 C CG . LYS B 2 471 ? 9.898 -4.304 42.471 1.00 88.12 471 B 1 +ATOM 8115 C CD . LYS B 2 471 ? 10.589 -4.709 43.777 1.00 84.12 471 B 1 +ATOM 8116 C CE . LYS B 2 471 ? 9.635 -4.506 44.957 1.00 78.30 471 B 1 +ATOM 8117 N NZ . LYS B 2 471 ? 10.073 -5.244 46.158 1.00 68.58 471 B 1 +ATOM 8118 N N . LEU B 2 472 ? 10.606 -5.119 37.649 1.00 90.11 472 B 1 +ATOM 8119 C CA . LEU B 2 472 ? 11.413 -5.311 36.445 1.00 90.38 472 B 1 +ATOM 8120 C C . LEU B 2 472 ? 11.145 -4.203 35.425 1.00 89.72 472 B 1 +ATOM 8121 O O . LEU B 2 472 ? 9.996 -3.828 35.179 1.00 86.95 472 B 1 +ATOM 8122 C CB . LEU B 2 472 ? 11.159 -6.692 35.826 1.00 90.49 472 B 1 +ATOM 8123 C CG . LEU B 2 472 ? 11.407 -7.896 36.756 1.00 89.87 472 B 1 +ATOM 8124 C CD1 . LEU B 2 472 ? 11.260 -9.181 35.950 1.00 81.55 472 B 1 +ATOM 8125 C CD2 . LEU B 2 472 ? 12.797 -7.894 37.377 1.00 82.33 472 B 1 +ATOM 8126 N N . GLU B 2 473 ? 12.199 -3.738 34.768 1.00 88.50 473 B 1 +ATOM 8127 C CA . GLU B 2 473 ? 12.096 -2.793 33.668 1.00 87.61 473 B 1 +ATOM 8128 C C . GLU B 2 473 ? 11.373 -3.405 32.459 1.00 88.18 473 B 1 +ATOM 8129 O O . GLU B 2 473 ? 11.501 -4.595 32.165 1.00 85.80 473 B 1 +ATOM 8130 C CB . GLU B 2 473 ? 13.489 -2.307 33.235 1.00 85.19 473 B 1 +ATOM 8131 C CG . GLU B 2 473 ? 14.230 -1.527 34.321 1.00 81.05 473 B 1 +ATOM 8132 C CD . GLU B 2 473 ? 15.591 -0.983 33.827 1.00 80.30 473 B 1 +ATOM 8133 O OE1 . GLU B 2 473 ? 16.222 -0.212 34.574 1.00 70.82 473 B 1 +ATOM 8134 O OE2 . GLU B 2 473 ? 16.012 -1.311 32.694 1.00 73.74 473 B 1 +ATOM 8135 N N . TYR B 2 474 ? 10.656 -2.569 31.710 1.00 87.28 474 B 1 +ATOM 8136 C CA . TYR B 2 474 ? 9.991 -2.974 30.468 1.00 86.88 474 B 1 +ATOM 8137 C C . TYR B 2 474 ? 10.959 -2.946 29.269 1.00 86.20 474 B 1 +ATOM 8138 O O . TYR B 2 474 ? 10.819 -2.171 28.325 1.00 81.94 474 B 1 +ATOM 8139 C CB . TYR B 2 474 ? 8.727 -2.145 30.250 1.00 86.07 474 B 1 +ATOM 8140 C CG . TYR B 2 474 ? 7.867 -2.664 29.117 1.00 86.76 474 B 1 +ATOM 8141 C CD1 . TYR B 2 474 ? 7.860 -2.007 27.870 1.00 77.82 474 B 1 +ATOM 8142 C CD2 . TYR B 2 474 ? 7.107 -3.839 29.284 1.00 77.74 474 B 1 +ATOM 8143 C CE1 . TYR B 2 474 ? 7.084 -2.505 26.809 1.00 78.05 474 B 1 +ATOM 8144 C CE2 . TYR B 2 474 ? 6.328 -4.344 28.228 1.00 77.66 474 B 1 +ATOM 8145 C CZ . TYR B 2 474 ? 6.310 -3.672 26.987 1.00 86.67 474 B 1 +ATOM 8146 O OH . TYR B 2 474 ? 5.558 -4.150 25.957 1.00 85.12 474 B 1 +ATOM 8147 N N . ASN B 2 475 ? 11.974 -3.777 29.336 1.00 89.03 475 B 1 +ATOM 8148 C CA . ASN B 2 475 ? 12.982 -3.952 28.303 1.00 88.15 475 B 1 +ATOM 8149 C C . ASN B 2 475 ? 13.501 -5.393 28.317 1.00 88.87 475 B 1 +ATOM 8150 O O . ASN B 2 475 ? 13.097 -6.203 29.163 1.00 86.27 475 B 1 +ATOM 8151 C CB . ASN B 2 475 ? 14.075 -2.876 28.482 1.00 85.14 475 B 1 +ATOM 8152 C CG . ASN B 2 475 ? 14.846 -2.977 29.787 1.00 83.75 475 B 1 +ATOM 8153 O OD1 . ASN B 2 475 ? 15.113 -4.036 30.315 1.00 75.30 475 B 1 +ATOM 8154 N ND2 . ASN B 2 475 ? 15.278 -1.845 30.311 1.00 75.71 475 B 1 +ATOM 8155 N N . TYR B 2 476 ? 14.364 -5.722 27.357 1.00 86.50 476 B 1 +ATOM 8156 C CA . TYR B 2 476 ? 14.878 -7.082 27.230 1.00 87.38 476 B 1 +ATOM 8157 C C . TYR B 2 476 ? 16.319 -7.083 26.730 1.00 86.32 476 B 1 +ATOM 8158 O O . TYR B 2 476 ? 16.672 -6.331 25.821 1.00 80.94 476 B 1 +ATOM 8159 C CB . TYR B 2 476 ? 13.948 -7.892 26.329 1.00 87.00 476 B 1 +ATOM 8160 C CG . TYR B 2 476 ? 13.795 -9.322 26.792 1.00 88.11 476 B 1 +ATOM 8161 C CD1 . TYR B 2 476 ? 14.484 -10.360 26.161 1.00 80.48 476 B 1 +ATOM 8162 C CD2 . TYR B 2 476 ? 12.960 -9.597 27.889 1.00 80.75 476 B 1 +ATOM 8163 C CE1 . TYR B 2 476 ? 14.322 -11.686 26.603 1.00 79.77 476 B 1 +ATOM 8164 C CE2 . TYR B 2 476 ? 12.794 -10.918 28.343 1.00 80.31 476 B 1 +ATOM 8165 C CZ . TYR B 2 476 ? 13.475 -11.966 27.694 1.00 87.48 476 B 1 +ATOM 8166 O OH . TYR B 2 476 ? 13.309 -13.253 28.128 1.00 85.67 476 B 1 +ATOM 8167 N N . ASN B 2 477 ? 17.153 -7.923 27.304 1.00 87.65 477 B 1 +ATOM 8168 C CA . ASN B 2 477 ? 18.537 -8.085 26.898 1.00 86.70 477 B 1 +ATOM 8169 C C . ASN B 2 477 ? 18.673 -9.131 25.786 1.00 86.72 477 B 1 +ATOM 8170 O O . ASN B 2 477 ? 17.783 -9.945 25.564 1.00 82.83 477 B 1 +ATOM 8171 C CB . ASN B 2 477 ? 19.382 -8.425 28.137 1.00 84.38 477 B 1 +ATOM 8172 C CG . ASN B 2 477 ? 19.490 -7.261 29.109 1.00 84.04 477 B 1 +ATOM 8173 O OD1 . ASN B 2 477 ? 19.875 -6.156 28.761 1.00 76.12 477 B 1 +ATOM 8174 N ND2 . ASN B 2 477 ? 19.195 -7.483 30.373 1.00 74.23 477 B 1 +ATOM 8175 N N . SER B 2 478 ? 19.822 -9.141 25.118 1.00 85.88 478 B 1 +ATOM 8176 C CA . SER B 2 478 ? 20.177 -10.208 24.182 1.00 85.18 478 B 1 +ATOM 8177 C C . SER B 2 478 ? 20.742 -11.420 24.915 1.00 85.43 478 B 1 +ATOM 8178 O O . SER B 2 478 ? 21.495 -11.279 25.878 1.00 82.77 478 B 1 +ATOM 8179 C CB . SER B 2 478 ? 21.175 -9.702 23.142 1.00 82.28 478 B 1 +ATOM 8180 O OG . SER B 2 478 ? 20.551 -8.716 22.361 1.00 71.54 478 B 1 +ATOM 8181 N N . HIS B 2 479 ? 20.394 -12.616 24.430 1.00 87.09 479 B 1 +ATOM 8182 C CA . HIS B 2 479 ? 20.820 -13.876 25.026 1.00 86.49 479 B 1 +ATOM 8183 C C . HIS B 2 479 ? 21.141 -14.914 23.950 1.00 86.51 479 B 1 +ATOM 8184 O O . HIS B 2 479 ? 20.549 -14.909 22.875 1.00 84.15 479 B 1 +ATOM 8185 C CB . HIS B 2 479 ? 19.722 -14.425 25.947 1.00 85.52 479 B 1 +ATOM 8186 C CG . HIS B 2 479 ? 19.263 -13.442 26.984 1.00 86.14 479 B 1 +ATOM 8187 N ND1 . HIS B 2 479 ? 18.211 -12.562 26.842 1.00 75.68 479 B 1 +ATOM 8188 C CD2 . HIS B 2 479 ? 19.808 -13.217 28.222 1.00 75.99 479 B 1 +ATOM 8189 C CE1 . HIS B 2 479 ? 18.125 -11.828 27.968 1.00 77.33 479 B 1 +ATOM 8190 N NE2 . HIS B 2 479 ? 19.083 -12.197 28.834 1.00 79.19 479 B 1 +ATOM 8191 N N . ASN B 2 480 ? 22.027 -15.846 24.300 1.00 86.93 480 B 1 +ATOM 8192 C CA . ASN B 2 480 ? 22.270 -17.055 23.535 1.00 86.79 480 B 1 +ATOM 8193 C C . ASN B 2 480 ? 21.542 -18.231 24.192 1.00 87.24 480 B 1 +ATOM 8194 O O . ASN B 2 480 ? 21.687 -18.483 25.388 1.00 84.80 480 B 1 +ATOM 8195 C CB . ASN B 2 480 ? 23.777 -17.297 23.404 1.00 84.76 480 B 1 +ATOM 8196 C CG . ASN B 2 480 ? 24.464 -16.218 22.591 1.00 83.38 480 B 1 +ATOM 8197 O OD1 . ASN B 2 480 ? 23.857 -15.465 21.838 1.00 75.58 480 B 1 +ATOM 8198 N ND2 . ASN B 2 480 ? 25.766 -16.113 22.731 1.00 75.27 480 B 1 +ATOM 8199 N N . VAL B 2 481 ? 20.763 -18.941 23.388 1.00 88.87 481 B 1 +ATOM 8200 C CA . VAL B 2 481 ? 19.948 -20.076 23.802 1.00 89.24 481 B 1 +ATOM 8201 C C . VAL B 2 481 ? 20.649 -21.340 23.320 1.00 89.86 481 B 1 +ATOM 8202 O O . VAL B 2 481 ? 20.612 -21.653 22.131 1.00 87.48 481 B 1 +ATOM 8203 C CB . VAL B 2 481 ? 18.537 -19.935 23.197 1.00 87.57 481 B 1 +ATOM 8204 C CG1 . VAL B 2 481 ? 17.656 -21.123 23.571 1.00 79.33 481 B 1 +ATOM 8205 C CG2 . VAL B 2 481 ? 17.846 -18.662 23.698 1.00 78.93 481 B 1 +ATOM 8206 N N . TYR B 2 482 ? 21.311 -22.054 24.213 1.00 89.05 482 B 1 +ATOM 8207 C CA . TYR B 2 482 ? 22.130 -23.218 23.860 1.00 88.13 482 B 1 +ATOM 8208 C C . TYR B 2 482 ? 21.280 -24.470 23.670 1.00 88.73 482 B 1 +ATOM 8209 O O . TYR B 2 482 ? 20.527 -24.857 24.569 1.00 87.08 482 B 1 +ATOM 8210 C CB . TYR B 2 482 ? 23.223 -23.433 24.910 1.00 85.54 482 B 1 +ATOM 8211 C CG . TYR B 2 482 ? 24.202 -22.291 24.998 1.00 79.12 482 B 1 +ATOM 8212 C CD1 . TYR B 2 482 ? 25.300 -22.214 24.114 1.00 71.12 482 B 1 +ATOM 8213 C CD2 . TYR B 2 482 ? 24.003 -21.254 25.935 1.00 70.71 482 B 1 +ATOM 8214 C CE1 . TYR B 2 482 ? 26.194 -21.135 24.173 1.00 67.09 482 B 1 +ATOM 8215 C CE2 . TYR B 2 482 ? 24.892 -20.158 25.999 1.00 66.05 482 B 1 +ATOM 8216 C CZ . TYR B 2 482 ? 25.983 -20.104 25.111 1.00 69.89 482 B 1 +ATOM 8217 O OH . TYR B 2 482 ? 26.847 -19.032 25.164 1.00 66.85 482 B 1 +ATOM 8218 N N . ILE B 2 483 ? 21.416 -25.105 22.510 1.00 89.88 483 B 1 +ATOM 8219 C CA . ILE B 2 483 ? 20.638 -26.264 22.081 1.00 90.66 483 B 1 +ATOM 8220 C C . ILE B 2 483 ? 21.548 -27.483 21.972 1.00 90.45 483 B 1 +ATOM 8221 O O . ILE B 2 483 ? 22.644 -27.422 21.417 1.00 88.18 483 B 1 +ATOM 8222 C CB . ILE B 2 483 ? 19.912 -25.973 20.755 1.00 90.11 483 B 1 +ATOM 8223 C CG1 . ILE B 2 483 ? 18.968 -24.749 20.915 1.00 86.26 483 B 1 +ATOM 8224 C CG2 . ILE B 2 483 ? 19.130 -27.202 20.272 1.00 85.27 483 B 1 +ATOM 8225 C CD1 . ILE B 2 483 ? 18.305 -24.300 19.619 1.00 80.94 483 B 1 +ATOM 8226 N N . MET B 2 484 ? 21.063 -28.611 22.453 1.00 90.54 484 B 1 +ATOM 8227 C CA . MET B 2 484 ? 21.713 -29.906 22.349 1.00 89.96 484 B 1 +ATOM 8228 C C . MET B 2 484 ? 20.676 -31.005 22.078 1.00 90.34 484 B 1 +ATOM 8229 O O . MET B 2 484 ? 19.540 -30.914 22.541 1.00 88.54 484 B 1 +ATOM 8230 C CB . MET B 2 484 ? 22.576 -30.230 23.581 1.00 87.45 484 B 1 +ATOM 8231 C CG . MET B 2 484 ? 22.321 -29.396 24.838 1.00 75.73 484 B 1 +ATOM 8232 S SD . MET B 2 484 ? 23.440 -29.718 26.245 1.00 70.38 484 B 1 +ATOM 8233 C CE . MET B 2 484 ? 22.935 -31.394 26.682 1.00 58.49 484 B 1 +ATOM 8234 N N . ALA B 2 485 ? 21.070 -32.031 21.333 1.00 89.96 485 B 1 +ATOM 8235 C CA . ALA B 2 485 ? 20.175 -33.142 21.042 1.00 89.63 485 B 1 +ATOM 8236 C C . ALA B 2 485 ? 19.832 -33.953 22.307 1.00 89.53 485 B 1 +ATOM 8237 O O . ALA B 2 485 ? 20.696 -34.252 23.125 1.00 86.51 485 B 1 +ATOM 8238 C CB . ALA B 2 485 ? 20.813 -34.024 19.963 1.00 87.67 485 B 1 +ATOM 8239 N N . ASP B 2 486 ? 18.570 -34.369 22.420 1.00 89.55 486 B 1 +ATOM 8240 C CA . ASP B 2 486 ? 18.121 -35.371 23.390 1.00 89.01 486 B 1 +ATOM 8241 C C . ASP B 2 486 ? 17.648 -36.618 22.634 1.00 88.63 486 B 1 +ATOM 8242 O O . ASP B 2 486 ? 16.459 -36.821 22.380 1.00 84.24 486 B 1 +ATOM 8243 C CB . ASP B 2 486 ? 17.038 -34.801 24.322 1.00 86.83 486 B 1 +ATOM 8244 C CG . ASP B 2 486 ? 16.713 -35.732 25.495 1.00 85.35 486 B 1 +ATOM 8245 O OD1 . ASP B 2 486 ? 17.156 -36.900 25.514 1.00 76.12 486 B 1 +ATOM 8246 O OD2 . ASP B 2 486 ? 16.064 -35.263 26.463 1.00 76.24 486 B 1 +ATOM 8247 N N . LYS B 2 487 ? 18.609 -37.477 22.270 1.00 88.04 487 B 1 +ATOM 8248 C CA . LYS B 2 487 ? 18.352 -38.677 21.468 1.00 86.65 487 B 1 +ATOM 8249 C C . LYS B 2 487 ? 17.351 -39.637 22.117 1.00 86.68 487 B 1 +ATOM 8250 O O . LYS B 2 487 ? 16.625 -40.309 21.404 1.00 82.61 487 B 1 +ATOM 8251 C CB . LYS B 2 487 ? 19.671 -39.413 21.174 1.00 84.13 487 B 1 +ATOM 8252 C CG . LYS B 2 487 ? 20.604 -38.609 20.256 1.00 74.63 487 B 1 +ATOM 8253 C CD . LYS B 2 487 ? 21.862 -39.399 19.887 1.00 68.64 487 B 1 +ATOM 8254 C CE . LYS B 2 487 ? 22.739 -38.548 18.968 1.00 59.20 487 B 1 +ATOM 8255 N NZ . LYS B 2 487 ? 23.996 -39.234 18.546 1.00 51.91 487 B 1 +ATOM 8256 N N . GLN B 2 488 ? 17.288 -39.697 23.442 1.00 87.38 488 B 1 +ATOM 8257 C CA . GLN B 2 488 ? 16.377 -40.603 24.154 1.00 86.16 488 B 1 +ATOM 8258 C C . GLN B 2 488 ? 14.908 -40.228 23.940 1.00 86.90 488 B 1 +ATOM 8259 O O . GLN B 2 488 ? 14.062 -41.111 23.889 1.00 83.48 488 B 1 +ATOM 8260 C CB . GLN B 2 488 ? 16.674 -40.598 25.654 1.00 84.98 488 B 1 +ATOM 8261 C CG . GLN B 2 488 ? 17.973 -41.320 26.001 1.00 74.89 488 B 1 +ATOM 8262 C CD . GLN B 2 488 ? 18.183 -41.439 27.512 1.00 65.53 488 B 1 +ATOM 8263 O OE1 . GLN B 2 488 ? 17.520 -40.821 28.329 1.00 58.00 488 B 1 +ATOM 8264 N NE2 . GLN B 2 488 ? 19.118 -42.251 27.951 1.00 55.57 488 B 1 +ATOM 8265 N N . LYS B 2 489 ? 14.602 -38.933 23.799 1.00 87.20 489 B 1 +ATOM 8266 C CA . LYS B 2 489 ? 13.244 -38.441 23.554 1.00 86.84 489 B 1 +ATOM 8267 C C . LYS B 2 489 ? 13.007 -38.016 22.107 1.00 87.80 489 B 1 +ATOM 8268 O O . LYS B 2 489 ? 11.981 -37.409 21.828 1.00 82.81 489 B 1 +ATOM 8269 C CB . LYS B 2 489 ? 12.906 -37.327 24.550 1.00 84.76 489 B 1 +ATOM 8270 C CG . LYS B 2 489 ? 12.867 -37.841 26.001 1.00 81.21 489 B 1 +ATOM 8271 C CD . LYS B 2 489 ? 12.075 -36.845 26.850 1.00 74.37 489 B 1 +ATOM 8272 C CE . LYS B 2 489 ? 12.035 -37.180 28.325 1.00 66.91 489 B 1 +ATOM 8273 N NZ . LYS B 2 489 ? 11.259 -36.128 29.048 1.00 59.26 489 B 1 +ATOM 8274 N N . ASN B 2 490 ? 13.944 -38.324 21.202 1.00 88.84 490 B 1 +ATOM 8275 C CA . ASN B 2 490 ? 13.908 -37.897 19.806 1.00 89.12 490 B 1 +ATOM 8276 C C . ASN B 2 490 ? 13.697 -36.379 19.656 1.00 90.43 490 B 1 +ATOM 8277 O O . ASN B 2 490 ? 12.938 -35.930 18.803 1.00 86.71 490 B 1 +ATOM 8278 C CB . ASN B 2 490 ? 12.901 -38.763 19.034 1.00 86.74 490 B 1 +ATOM 8279 C CG . ASN B 2 490 ? 13.072 -38.653 17.526 1.00 83.14 490 B 1 +ATOM 8280 O OD1 . ASN B 2 490 ? 14.174 -38.619 17.016 1.00 74.09 490 B 1 +ATOM 8281 N ND2 . ASN B 2 490 ? 11.985 -38.653 16.782 1.00 72.88 490 B 1 +ATOM 8282 N N . GLY B 2 491 ? 14.316 -35.595 20.517 1.00 90.34 491 B 1 +ATOM 8283 C CA . GLY B 2 491 ? 14.111 -34.162 20.592 1.00 90.67 491 B 1 +ATOM 8284 C C . GLY B 2 491 ? 15.381 -33.402 20.961 1.00 91.85 491 B 1 +ATOM 8285 O O . GLY B 2 491 ? 16.497 -33.842 20.696 1.00 88.90 491 B 1 +ATOM 8286 N N . ILE B 2 492 ? 15.194 -32.267 21.590 1.00 92.30 492 B 1 +ATOM 8287 C CA . ILE B 2 492 ? 16.283 -31.394 22.030 1.00 92.55 492 B 1 +ATOM 8288 C C . ILE B 2 492 ? 16.120 -31.005 23.495 1.00 92.74 492 B 1 +ATOM 8289 O O . ILE B 2 492 ? 15.008 -30.923 24.026 1.00 90.84 492 B 1 +ATOM 8290 C CB . ILE B 2 492 ? 16.419 -30.155 21.122 1.00 91.19 492 B 1 +ATOM 8291 C CG1 . ILE B 2 492 ? 15.140 -29.292 21.111 1.00 83.90 492 B 1 +ATOM 8292 C CG2 . ILE B 2 492 ? 16.827 -30.579 19.702 1.00 80.76 492 B 1 +ATOM 8293 C CD1 . ILE B 2 492 ? 15.307 -27.945 20.411 1.00 80.83 492 B 1 +ATOM 8294 N N . LYS B 2 493 ? 17.240 -30.718 24.134 1.00 91.67 493 B 1 +ATOM 8295 C CA . LYS B 2 493 ? 17.330 -30.009 25.407 1.00 91.29 493 B 1 +ATOM 8296 C C . LYS B 2 493 ? 17.947 -28.644 25.182 1.00 91.20 493 B 1 +ATOM 8297 O O . LYS B 2 493 ? 18.868 -28.499 24.382 1.00 88.21 493 B 1 +ATOM 8298 C CB . LYS B 2 493 ? 18.148 -30.817 26.420 1.00 88.95 493 B 1 +ATOM 8299 C CG . LYS B 2 493 ? 17.256 -31.832 27.126 1.00 78.77 493 B 1 +ATOM 8300 C CD . LYS B 2 493 ? 18.086 -32.753 28.028 1.00 76.64 493 B 1 +ATOM 8301 C CE . LYS B 2 493 ? 17.133 -33.664 28.789 1.00 64.74 493 B 1 +ATOM 8302 N NZ . LYS B 2 493 ? 17.751 -34.966 29.108 1.00 57.81 493 B 1 +ATOM 8303 N N . VAL B 2 494 ? 17.444 -27.664 25.902 1.00 91.57 494 B 1 +ATOM 8304 C CA . VAL B 2 494 ? 17.884 -26.273 25.796 1.00 90.78 494 B 1 +ATOM 8305 C C . VAL B 2 494 ? 18.080 -25.729 27.202 1.00 91.10 494 B 1 +ATOM 8306 O O . VAL B 2 494 ? 17.250 -25.962 28.082 1.00 89.17 494 B 1 +ATOM 8307 C CB . VAL B 2 494 ? 16.876 -25.436 24.990 1.00 88.67 494 B 1 +ATOM 8308 C CG1 . VAL B 2 494 ? 17.458 -24.070 24.645 1.00 81.17 494 B 1 +ATOM 8309 C CG2 . VAL B 2 494 ? 16.446 -26.117 23.680 1.00 80.21 494 B 1 +ATOM 8310 N N . ASN B 2 495 ? 19.181 -25.036 27.420 1.00 90.72 495 B 1 +ATOM 8311 C CA . ASN B 2 495 ? 19.483 -24.404 28.703 1.00 89.57 495 B 1 +ATOM 8312 C C . ASN B 2 495 ? 20.085 -23.015 28.452 1.00 89.87 495 B 1 +ATOM 8313 O O . ASN B 2 495 ? 20.976 -22.865 27.613 1.00 86.75 495 B 1 +ATOM 8314 C CB . ASN B 2 495 ? 20.411 -25.326 29.509 1.00 85.73 495 B 1 +ATOM 8315 C CG . ASN B 2 495 ? 20.676 -24.826 30.917 1.00 74.57 495 B 1 +ATOM 8316 O OD1 . ASN B 2 495 ? 20.269 -23.775 31.353 1.00 63.30 495 B 1 +ATOM 8317 N ND2 . ASN B 2 495 ? 21.411 -25.591 31.703 1.00 64.07 495 B 1 +ATOM 8318 N N . PHE B 2 496 ? 19.570 -22.029 29.161 1.00 90.32 496 B 1 +ATOM 8319 C CA . PHE B 2 496 ? 20.047 -20.652 29.057 1.00 90.39 496 B 1 +ATOM 8320 C C . PHE B 2 496 ? 19.630 -19.843 30.283 1.00 91.02 496 B 1 +ATOM 8321 O O . PHE B 2 496 ? 18.687 -20.197 30.994 1.00 89.63 496 B 1 +ATOM 8322 C CB . PHE B 2 496 ? 19.517 -20.009 27.771 1.00 89.16 496 B 1 +ATOM 8323 C CG . PHE B 2 496 ? 18.011 -19.992 27.610 1.00 89.08 496 B 1 +ATOM 8324 C CD1 . PHE B 2 496 ? 17.325 -21.149 27.168 1.00 81.74 496 B 1 +ATOM 8325 C CD2 . PHE B 2 496 ? 17.286 -18.816 27.845 1.00 81.70 496 B 1 +ATOM 8326 C CE1 . PHE B 2 496 ? 15.938 -21.124 26.955 1.00 80.77 496 B 1 +ATOM 8327 C CE2 . PHE B 2 496 ? 15.893 -18.786 27.630 1.00 80.69 496 B 1 +ATOM 8328 C CZ . PHE B 2 496 ? 15.222 -19.940 27.180 1.00 85.84 496 B 1 +ATOM 8329 N N . LYS B 2 497 ? 20.328 -18.743 30.516 1.00 89.27 497 B 1 +ATOM 8330 C CA . LYS B 2 497 ? 20.027 -17.796 31.588 1.00 88.65 497 B 1 +ATOM 8331 C C . LYS B 2 497 ? 19.518 -16.504 30.989 1.00 88.58 497 B 1 +ATOM 8332 O O . LYS B 2 497 ? 20.228 -15.885 30.197 1.00 86.15 497 B 1 +ATOM 8333 C CB . LYS B 2 497 ? 21.257 -17.550 32.467 1.00 86.94 497 B 1 +ATOM 8334 C CG . LYS B 2 497 ? 21.825 -18.859 33.028 1.00 79.68 497 B 1 +ATOM 8335 C CD . LYS B 2 497 ? 22.811 -18.595 34.172 1.00 76.29 497 B 1 +ATOM 8336 C CE . LYS B 2 497 ? 23.270 -19.932 34.729 1.00 66.64 497 B 1 +ATOM 8337 N NZ . LYS B 2 497 ? 23.148 -19.965 36.206 1.00 58.42 497 B 1 +ATOM 8338 N N . ILE B 2 498 ? 18.329 -16.077 31.403 1.00 89.87 498 B 1 +ATOM 8339 C CA . ILE B 2 498 ? 17.808 -14.755 31.079 1.00 90.27 498 B 1 +ATOM 8340 C C . ILE B 2 498 ? 18.230 -13.772 32.174 1.00 90.07 498 B 1 +ATOM 8341 O O . ILE B 2 498 ? 18.241 -14.104 33.359 1.00 88.68 498 B 1 +ATOM 8342 C CB . ILE B 2 498 ? 16.292 -14.798 30.848 1.00 89.97 498 B 1 +ATOM 8343 C CG1 . ILE B 2 498 ? 15.913 -15.696 29.644 1.00 85.88 498 B 1 +ATOM 8344 C CG2 . ILE B 2 498 ? 15.701 -13.396 30.664 1.00 85.86 498 B 1 +ATOM 8345 C CD1 . ILE B 2 498 ? 16.478 -15.260 28.280 1.00 80.52 498 B 1 +ATOM 8346 N N . ARG B 2 499 ? 18.583 -12.559 31.749 1.00 89.26 499 B 1 +ATOM 8347 C CA . ARG B 2 499 ? 18.936 -11.442 32.619 1.00 88.07 499 B 1 +ATOM 8348 C C . ARG B 2 499 ? 17.858 -10.371 32.490 1.00 88.47 499 B 1 +ATOM 8349 O O . ARG B 2 499 ? 17.841 -9.648 31.489 1.00 86.26 499 B 1 +ATOM 8350 C CB . ARG B 2 499 ? 20.320 -10.897 32.237 1.00 86.31 499 B 1 +ATOM 8351 C CG . ARG B 2 499 ? 21.451 -11.935 32.341 1.00 78.23 499 B 1 +ATOM 8352 C CD . ARG B 2 499 ? 22.797 -11.331 31.934 1.00 75.41 499 B 1 +ATOM 8353 N NE . ARG B 2 499 ? 22.818 -10.872 30.530 1.00 64.08 499 B 1 +ATOM 8354 C CZ . ARG B 2 499 ? 23.177 -11.561 29.451 1.00 56.94 499 B 1 +ATOM 8355 N NH1 . ARG B 2 499 ? 23.606 -12.796 29.519 1.00 51.09 499 B 1 +ATOM 8356 N NH2 . ARG B 2 499 ? 23.120 -11.017 28.266 1.00 50.14 499 B 1 +ATOM 8357 N N . HIS B 2 500 ? 16.974 -10.272 33.460 1.00 89.69 500 B 1 +ATOM 8358 C CA . HIS B 2 500 ? 15.991 -9.199 33.534 1.00 89.52 500 B 1 +ATOM 8359 C C . HIS B 2 500 ? 16.585 -8.009 34.277 1.00 88.94 500 B 1 +ATOM 8360 O O . HIS B 2 500 ? 17.085 -8.177 35.383 1.00 86.52 500 B 1 +ATOM 8361 C CB . HIS B 2 500 ? 14.719 -9.697 34.224 1.00 90.11 500 B 1 +ATOM 8362 C CG . HIS B 2 500 ? 14.018 -10.786 33.470 1.00 90.73 500 B 1 +ATOM 8363 N ND1 . HIS B 2 500 ? 13.330 -10.632 32.277 1.00 79.66 500 B 1 +ATOM 8364 C CD2 . HIS B 2 500 ? 13.921 -12.101 33.828 1.00 79.77 500 B 1 +ATOM 8365 C CE1 . HIS B 2 500 ? 12.834 -11.830 31.948 1.00 82.83 500 B 1 +ATOM 8366 N NE2 . HIS B 2 500 ? 13.169 -12.747 32.857 1.00 84.49 500 B 1 +ATOM 8367 N N . ASN B 2 501 ? 16.536 -6.812 33.687 1.00 88.00 501 B 1 +ATOM 8368 C CA . ASN B 2 501 ? 16.973 -5.610 34.387 1.00 87.22 501 B 1 +ATOM 8369 C C . ASN B 2 501 ? 15.941 -5.260 35.477 1.00 87.67 501 B 1 +ATOM 8370 O O . ASN B 2 501 ? 14.743 -5.202 35.201 1.00 85.20 501 B 1 +ATOM 8371 C CB . ASN B 2 501 ? 17.154 -4.450 33.399 1.00 84.84 501 B 1 +ATOM 8372 C CG . ASN B 2 501 ? 18.233 -4.677 32.351 1.00 83.19 501 B 1 +ATOM 8373 O OD1 . ASN B 2 501 ? 19.135 -5.492 32.453 1.00 74.78 501 B 1 +ATOM 8374 N ND2 . ASN B 2 501 ? 18.172 -3.909 31.287 1.00 74.66 501 B 1 +ATOM 8375 N N . ILE B 2 502 ? 16.415 -5.038 36.675 1.00 86.57 502 B 1 +ATOM 8376 C CA . ILE B 2 502 ? 15.604 -4.553 37.798 1.00 86.24 502 B 1 +ATOM 8377 C C . ILE B 2 502 ? 15.695 -3.021 37.810 1.00 85.69 502 B 1 +ATOM 8378 O O . ILE B 2 502 ? 16.714 -2.454 37.423 1.00 81.56 502 B 1 +ATOM 8379 C CB . ILE B 2 502 ? 16.066 -5.187 39.126 1.00 85.63 502 B 1 +ATOM 8380 C CG1 . ILE B 2 502 ? 16.113 -6.731 39.036 1.00 81.82 502 B 1 +ATOM 8381 C CG2 . ILE B 2 502 ? 15.145 -4.768 40.289 1.00 81.61 502 B 1 +ATOM 8382 C CD1 . ILE B 2 502 ? 16.684 -7.427 40.284 1.00 77.22 502 B 1 +ATOM 8383 N N . GLU B 2 503 ? 14.655 -2.344 38.287 1.00 84.19 503 B 1 +ATOM 8384 C CA . GLU B 2 503 ? 14.583 -0.873 38.351 1.00 81.99 503 B 1 +ATOM 8385 C C . GLU B 2 503 ? 15.716 -0.235 39.184 1.00 81.39 503 B 1 +ATOM 8386 O O . GLU B 2 503 ? 16.081 0.910 38.943 1.00 75.79 503 B 1 +ATOM 8387 C CB . GLU B 2 503 ? 13.229 -0.473 38.958 1.00 79.65 503 B 1 +ATOM 8388 C CG . GLU B 2 503 ? 12.033 -0.825 38.056 1.00 75.28 503 B 1 +ATOM 8389 C CD . GLU B 2 503 ? 10.668 -0.483 38.683 1.00 72.28 503 B 1 +ATOM 8390 O OE1 . GLU B 2 503 ? 9.669 -0.517 37.926 1.00 64.03 503 B 1 +ATOM 8391 O OE2 . GLU B 2 503 ? 10.614 -0.213 39.895 1.00 68.80 503 B 1 +ATOM 8392 N N . ASP B 2 504 ? 16.296 -0.976 40.116 1.00 81.62 504 B 1 +ATOM 8393 C CA . ASP B 2 504 ? 17.424 -0.513 40.938 1.00 78.99 504 B 1 +ATOM 8394 C C . ASP B 2 504 ? 18.794 -0.596 40.227 1.00 78.47 504 B 1 +ATOM 8395 O O . ASP B 2 504 ? 19.829 -0.257 40.812 1.00 71.15 504 B 1 +ATOM 8396 C CB . ASP B 2 504 ? 17.412 -1.248 42.296 1.00 76.18 504 B 1 +ATOM 8397 C CG . ASP B 2 504 ? 17.826 -2.723 42.244 1.00 73.73 504 B 1 +ATOM 8398 O OD1 . ASP B 2 504 ? 18.110 -3.249 41.141 1.00 65.56 504 B 1 +ATOM 8399 O OD2 . ASP B 2 504 ? 17.894 -3.352 43.321 1.00 67.69 504 B 1 +ATOM 8400 N N . GLY B 2 505 ? 18.825 -1.038 38.953 1.00 78.05 505 B 1 +ATOM 8401 C CA . GLY B 2 505 ? 20.035 -1.222 38.147 1.00 75.73 505 B 1 +ATOM 8402 C C . GLY B 2 505 ? 20.703 -2.589 38.298 1.00 77.98 505 B 1 +ATOM 8403 O O . GLY B 2 505 ? 21.692 -2.869 37.609 1.00 72.99 505 B 1 +ATOM 8404 N N . SER B 2 506 ? 20.182 -3.457 39.173 1.00 80.44 506 B 1 +ATOM 8405 C CA . SER B 2 506 ? 20.635 -4.843 39.291 1.00 81.25 506 B 1 +ATOM 8406 C C . SER B 2 506 ? 19.975 -5.750 38.245 1.00 82.74 506 B 1 +ATOM 8407 O O . SER B 2 506 ? 19.240 -5.292 37.362 1.00 79.81 506 B 1 +ATOM 8408 C CB . SER B 2 506 ? 20.468 -5.328 40.737 1.00 77.74 506 B 1 +ATOM 8409 O OG . SER B 2 506 ? 19.140 -5.671 41.026 1.00 72.20 506 B 1 +ATOM 8410 N N . VAL B 2 507 ? 20.286 -7.051 38.280 1.00 84.20 507 B 1 +ATOM 8411 C CA . VAL B 2 507 ? 19.781 -8.021 37.310 1.00 85.06 507 B 1 +ATOM 8412 C C . VAL B 2 507 ? 19.131 -9.199 38.019 1.00 86.69 507 B 1 +ATOM 8413 O O . VAL B 2 507 ? 19.780 -9.901 38.799 1.00 83.70 507 B 1 +ATOM 8414 C CB . VAL B 2 507 ? 20.901 -8.488 36.351 1.00 81.25 507 B 1 +ATOM 8415 C CG1 . VAL B 2 507 ? 20.399 -9.525 35.352 1.00 70.84 507 B 1 +ATOM 8416 C CG2 . VAL B 2 507 ? 21.475 -7.312 35.544 1.00 70.77 507 B 1 +ATOM 8417 N N . GLN B 2 508 ? 17.885 -9.468 37.691 1.00 88.25 508 B 1 +ATOM 8418 C CA . GLN B 2 508 ? 17.179 -10.688 38.064 1.00 88.95 508 B 1 +ATOM 8419 C C . GLN B 2 508 ? 17.535 -11.804 37.078 1.00 89.88 508 B 1 +ATOM 8420 O O . GLN B 2 508 ? 17.208 -11.727 35.896 1.00 87.76 508 B 1 +ATOM 8421 C CB . GLN B 2 508 ? 15.662 -10.409 38.091 1.00 88.90 508 B 1 +ATOM 8422 C CG . GLN B 2 508 ? 14.805 -11.650 38.389 1.00 86.87 508 B 1 +ATOM 8423 C CD . GLN B 2 508 ? 15.018 -12.186 39.803 1.00 88.45 508 B 1 +ATOM 8424 O OE1 . GLN B 2 508 ? 14.792 -11.510 40.784 1.00 80.24 508 B 1 +ATOM 8425 N NE2 . GLN B 2 508 ? 15.462 -13.417 39.929 1.00 78.30 508 B 1 +ATOM 8426 N N . LEU B 2 509 ? 18.185 -12.841 37.564 1.00 89.46 509 B 1 +ATOM 8427 C CA . LEU B 2 509 ? 18.450 -14.026 36.761 1.00 89.66 509 B 1 +ATOM 8428 C C . LEU B 2 509 ? 17.208 -14.930 36.715 1.00 90.34 509 B 1 +ATOM 8429 O O . LEU B 2 509 ? 16.525 -15.100 37.721 1.00 88.81 509 B 1 +ATOM 8430 C CB . LEU B 2 509 ? 19.672 -14.779 37.315 1.00 87.72 509 B 1 +ATOM 8431 C CG . LEU B 2 509 ? 21.006 -14.031 37.111 1.00 79.97 509 B 1 +ATOM 8432 C CD1 . LEU B 2 509 ? 22.121 -14.743 37.885 1.00 71.96 509 B 1 +ATOM 8433 C CD2 . LEU B 2 509 ? 21.421 -13.982 35.645 1.00 71.84 509 B 1 +ATOM 8434 N N . ALA B 2 510 ? 16.967 -15.528 35.543 1.00 91.47 510 B 1 +ATOM 8435 C CA . ALA B 2 510 ? 15.977 -16.575 35.346 1.00 91.95 510 B 1 +ATOM 8436 C C . ALA B 2 510 ? 16.612 -17.730 34.566 1.00 91.57 510 B 1 +ATOM 8437 O O . ALA B 2 510 ? 16.856 -17.626 33.364 1.00 89.52 510 B 1 +ATOM 8438 C CB . ALA B 2 510 ? 14.747 -15.985 34.658 1.00 91.84 510 B 1 +ATOM 8439 N N . ASP B 2 511 ? 16.914 -18.828 35.271 1.00 91.85 511 B 1 +ATOM 8440 C CA . ASP B 2 511 ? 17.533 -20.014 34.685 1.00 91.62 511 B 1 +ATOM 8441 C C . ASP B 2 511 ? 16.457 -20.852 33.989 1.00 92.12 511 B 1 +ATOM 8442 O O . ASP B 2 511 ? 15.513 -21.319 34.617 1.00 90.13 511 B 1 +ATOM 8443 C CB . ASP B 2 511 ? 18.288 -20.831 35.755 1.00 89.83 511 B 1 +ATOM 8444 C CG . ASP B 2 511 ? 19.685 -20.293 36.095 1.00 79.96 511 B 1 +ATOM 8445 O OD1 . ASP B 2 511 ? 20.083 -19.204 35.643 1.00 71.17 511 B 1 +ATOM 8446 O OD2 . ASP B 2 511 ? 20.476 -21.011 36.742 1.00 70.45 511 B 1 +ATOM 8447 N N . HIS B 2 512 ? 16.604 -21.034 32.677 1.00 92.10 512 B 1 +ATOM 8448 C CA . HIS B 2 512 ? 15.655 -21.750 31.838 1.00 92.12 512 B 1 +ATOM 8449 C C . HIS B 2 512 ? 16.172 -23.139 31.496 1.00 91.56 512 B 1 +ATOM 8450 O O . HIS B 2 512 ? 17.235 -23.281 30.884 1.00 89.10 512 B 1 +ATOM 8451 C CB . HIS B 2 512 ? 15.371 -20.954 30.567 1.00 91.92 512 B 1 +ATOM 8452 C CG . HIS B 2 512 ? 14.602 -19.683 30.775 1.00 92.70 512 B 1 +ATOM 8453 N ND1 . HIS B 2 512 ? 14.988 -18.606 31.544 1.00 83.51 512 B 1 +ATOM 8454 C CD2 . HIS B 2 512 ? 13.394 -19.366 30.217 1.00 84.27 512 B 1 +ATOM 8455 C CE1 . HIS B 2 512 ? 14.025 -17.673 31.455 1.00 85.98 512 B 1 +ATOM 8456 N NE2 . HIS B 2 512 ? 13.050 -18.086 30.648 1.00 87.54 512 B 1 +ATOM 8457 N N . TYR B 2 513 ? 15.389 -24.140 31.821 1.00 92.02 513 B 1 +ATOM 8458 C CA . TYR B 2 513 ? 15.580 -25.516 31.390 1.00 91.84 513 B 1 +ATOM 8459 C C . TYR B 2 513 ? 14.424 -25.895 30.477 1.00 91.75 513 B 1 +ATOM 8460 O O . TYR B 2 513 ? 13.277 -25.920 30.909 1.00 89.34 513 B 1 +ATOM 8461 C CB . TYR B 2 513 ? 15.659 -26.444 32.606 1.00 90.59 513 B 1 +ATOM 8462 C CG . TYR B 2 513 ? 16.837 -26.144 33.505 1.00 86.31 513 B 1 +ATOM 8463 C CD1 . TYR B 2 513 ? 18.085 -26.753 33.268 1.00 77.82 513 B 1 +ATOM 8464 C CD2 . TYR B 2 513 ? 16.703 -25.223 34.567 1.00 77.14 513 B 1 +ATOM 8465 C CE1 . TYR B 2 513 ? 19.186 -26.444 34.073 1.00 75.67 513 B 1 +ATOM 8466 C CE2 . TYR B 2 513 ? 17.810 -24.906 35.381 1.00 74.68 513 B 1 +ATOM 8467 C CZ . TYR B 2 513 ? 19.048 -25.517 35.130 1.00 79.36 513 B 1 +ATOM 8468 O OH . TYR B 2 513 ? 20.131 -25.199 35.909 1.00 77.16 513 B 1 +ATOM 8469 N N . GLN B 2 514 ? 14.727 -26.163 29.223 1.00 92.87 514 B 1 +ATOM 8470 C CA . GLN B 2 514 ? 13.741 -26.460 28.199 1.00 92.66 514 B 1 +ATOM 8471 C C . GLN B 2 514 ? 13.971 -27.850 27.612 1.00 92.96 514 B 1 +ATOM 8472 O O . GLN B 2 514 ? 15.104 -28.279 27.420 1.00 91.43 514 B 1 +ATOM 8473 C CB . GLN B 2 514 ? 13.771 -25.342 27.141 1.00 91.44 514 B 1 +ATOM 8474 C CG . GLN B 2 514 ? 12.999 -25.652 25.849 1.00 89.23 514 B 1 +ATOM 8475 C CD . GLN B 2 514 ? 13.081 -24.499 24.844 1.00 89.48 514 B 1 +ATOM 8476 O OE1 . GLN B 2 514 ? 13.320 -23.363 25.180 1.00 82.49 514 B 1 +ATOM 8477 N NE2 . GLN B 2 514 ? 12.885 -24.769 23.578 1.00 80.81 514 B 1 +ATOM 8478 N N . GLN B 2 515 ? 12.865 -28.516 27.287 1.00 92.64 515 B 1 +ATOM 8479 C CA . GLN B 2 515 ? 12.867 -29.739 26.512 1.00 92.37 515 B 1 +ATOM 8480 C C . GLN B 2 515 ? 11.827 -29.633 25.399 1.00 92.84 515 B 1 +ATOM 8481 O O . GLN B 2 515 ? 10.696 -29.239 25.657 1.00 90.85 515 B 1 +ATOM 8482 C CB . GLN B 2 515 ? 12.609 -30.906 27.472 1.00 89.86 515 B 1 +ATOM 8483 C CG . GLN B 2 515 ? 12.553 -32.223 26.710 1.00 77.35 515 B 1 +ATOM 8484 C CD . GLN B 2 515 ? 12.689 -33.439 27.608 1.00 75.30 515 B 1 +ATOM 8485 O OE1 . GLN B 2 515 ? 12.323 -33.494 28.780 1.00 66.13 515 B 1 +ATOM 8486 N NE2 . GLN B 2 515 ? 13.251 -34.489 27.062 1.00 63.43 515 B 1 +ATOM 8487 N N . ASN B 2 516 ? 12.205 -30.025 24.181 1.00 92.53 516 B 1 +ATOM 8488 C CA . ASN B 2 516 ? 11.287 -30.105 23.048 1.00 92.40 516 B 1 +ATOM 8489 C C . ASN B 2 516 ? 11.222 -31.547 22.555 1.00 92.41 516 B 1 +ATOM 8490 O O . ASN B 2 516 ? 12.248 -32.199 22.375 1.00 89.95 516 B 1 +ATOM 8491 C CB . ASN B 2 516 ? 11.726 -29.151 21.931 1.00 91.81 516 B 1 +ATOM 8492 C CG . ASN B 2 516 ? 11.591 -27.680 22.292 1.00 91.61 516 B 1 +ATOM 8493 O OD1 . ASN B 2 516 ? 12.148 -27.184 23.244 1.00 78.28 516 B 1 +ATOM 8494 N ND2 . ASN B 2 516 ? 10.844 -26.933 21.507 1.00 78.30 516 B 1 +ATOM 8495 N N . THR B 2 517 ? 10.011 -32.038 22.327 1.00 92.53 517 B 1 +ATOM 8496 C CA . THR B 2 517 ? 9.739 -33.374 21.808 1.00 92.29 517 B 1 +ATOM 8497 C C . THR B 2 517 ? 8.728 -33.287 20.669 1.00 92.49 517 B 1 +ATOM 8498 O O . THR B 2 517 ? 7.753 -32.548 20.811 1.00 90.12 517 B 1 +ATOM 8499 C CB . THR B 2 517 ? 9.210 -34.318 22.900 1.00 90.80 517 B 1 +ATOM 8500 O OG1 . THR B 2 517 ? 8.257 -33.682 23.719 1.00 78.39 517 B 1 +ATOM 8501 C CG2 . THR B 2 517 ? 10.333 -34.786 23.813 1.00 76.53 517 B 1 +ATOM 8502 N N . PRO B 2 518 ? 8.928 -33.995 19.545 1.00 92.30 518 B 1 +ATOM 8503 C CA . PRO B 2 518 ? 7.979 -33.949 18.439 1.00 91.71 518 B 1 +ATOM 8504 C C . PRO B 2 518 ? 6.624 -34.528 18.854 1.00 91.76 518 B 1 +ATOM 8505 O O . PRO B 2 518 ? 6.557 -35.439 19.683 1.00 89.54 518 B 1 +ATOM 8506 C CB . PRO B 2 518 ? 8.643 -34.730 17.298 1.00 90.10 518 B 1 +ATOM 8507 C CG . PRO B 2 518 ? 9.545 -35.724 18.029 1.00 86.97 518 B 1 +ATOM 8508 C CD . PRO B 2 518 ? 9.990 -34.954 19.269 1.00 89.89 518 B 1 +ATOM 8509 N N . ILE B 2 519 ? 5.536 -33.989 18.274 1.00 91.30 519 B 1 +ATOM 8510 C CA . ILE B 2 519 ? 4.175 -34.492 18.480 1.00 90.65 519 B 1 +ATOM 8511 C C . ILE B 2 519 ? 3.903 -35.674 17.539 1.00 90.10 519 B 1 +ATOM 8512 O O . ILE B 2 519 ? 3.304 -36.663 17.955 1.00 85.21 519 B 1 +ATOM 8513 C CB . ILE B 2 519 ? 3.141 -33.357 18.274 1.00 89.18 519 B 1 +ATOM 8514 C CG1 . ILE B 2 519 ? 3.321 -32.266 19.360 1.00 83.46 519 B 1 +ATOM 8515 C CG2 . ILE B 2 519 ? 1.696 -33.894 18.292 1.00 82.48 519 B 1 +ATOM 8516 C CD1 . ILE B 2 519 ? 2.504 -30.984 19.102 1.00 79.60 519 B 1 +ATOM 8517 N N . GLY B 2 520 ? 4.348 -35.538 16.278 1.00 87.91 520 B 1 +ATOM 8518 C CA . GLY B 2 520 ? 4.212 -36.590 15.277 1.00 86.44 520 B 1 +ATOM 8519 C C . GLY B 2 520 ? 5.344 -37.617 15.341 1.00 87.02 520 B 1 +ATOM 8520 O O . GLY B 2 520 ? 6.415 -37.363 15.863 1.00 83.08 520 B 1 +ATOM 8521 N N . ASP B 2 521 ? 5.101 -38.782 14.716 1.00 86.58 521 B 1 +ATOM 8522 C CA . ASP B 2 521 ? 6.082 -39.871 14.612 1.00 84.50 521 B 1 +ATOM 8523 C C . ASP B 2 521 ? 7.031 -39.715 13.418 1.00 84.23 521 B 1 +ATOM 8524 O O . ASP B 2 521 ? 7.825 -40.600 13.101 1.00 77.46 521 B 1 +ATOM 8525 C CB . ASP B 2 521 ? 5.335 -41.213 14.535 1.00 80.38 521 B 1 +ATOM 8526 C CG . ASP B 2 521 ? 4.482 -41.506 15.767 1.00 72.68 521 B 1 +ATOM 8527 O OD1 . ASP B 2 521 ? 4.962 -41.235 16.889 1.00 63.11 521 B 1 +ATOM 8528 O OD2 . ASP B 2 521 ? 3.366 -42.017 15.577 1.00 62.81 521 B 1 +ATOM 8529 N N . GLY B 2 522 ? 6.938 -38.592 12.700 1.00 83.18 522 B 1 +ATOM 8530 C CA . GLY B 2 522 ? 7.758 -38.300 11.528 1.00 82.41 522 B 1 +ATOM 8531 C C . GLY B 2 522 ? 9.245 -38.130 11.880 1.00 84.00 522 B 1 +ATOM 8532 O O . GLY B 2 522 ? 9.602 -37.844 13.019 1.00 80.80 522 B 1 +ATOM 8533 N N . PRO B 2 523 ? 10.142 -38.296 10.883 1.00 84.56 523 B 1 +ATOM 8534 C CA . PRO B 2 523 ? 11.558 -38.051 11.093 1.00 83.81 523 B 1 +ATOM 8535 C C . PRO B 2 523 ? 11.797 -36.571 11.418 1.00 85.24 523 B 1 +ATOM 8536 O O . PRO B 2 523 ? 11.285 -35.684 10.732 1.00 82.41 523 B 1 +ATOM 8537 C CB . PRO B 2 523 ? 12.248 -38.490 9.799 1.00 80.53 523 B 1 +ATOM 8538 C CG . PRO B 2 523 ? 11.161 -38.290 8.734 1.00 76.92 523 B 1 +ATOM 8539 C CD . PRO B 2 523 ? 9.867 -38.605 9.490 1.00 79.70 523 B 1 +ATOM 8540 N N . VAL B 2 524 ? 12.615 -36.327 12.435 1.00 85.75 524 B 1 +ATOM 8541 C CA . VAL B 2 524 ? 13.047 -34.989 12.856 1.00 86.87 524 B 1 +ATOM 8542 C C . VAL B 2 524 ? 14.563 -34.878 12.786 1.00 87.11 524 B 1 +ATOM 8543 O O . VAL B 2 524 ? 15.286 -35.871 12.884 1.00 84.24 524 B 1 +ATOM 8544 C CB . VAL B 2 524 ? 12.523 -34.623 14.257 1.00 85.74 524 B 1 +ATOM 8545 C CG1 . VAL B 2 524 ? 10.994 -34.555 14.272 1.00 75.13 524 B 1 +ATOM 8546 C CG2 . VAL B 2 524 ? 12.985 -35.604 15.342 1.00 75.16 524 B 1 +ATOM 8547 N N . LEU B 2 525 ? 15.049 -33.656 12.615 1.00 88.23 525 B 1 +ATOM 8548 C CA . LEU B 2 525 ? 16.473 -33.368 12.645 1.00 88.02 525 B 1 +ATOM 8549 C C . LEU B 2 525 ? 16.947 -33.254 14.091 1.00 88.97 525 B 1 +ATOM 8550 O O . LEU B 2 525 ? 16.457 -32.424 14.850 1.00 87.43 525 B 1 +ATOM 8551 C CB . LEU B 2 525 ? 16.760 -32.094 11.831 1.00 85.86 525 B 1 +ATOM 8552 C CG . LEU B 2 525 ? 16.431 -32.213 10.328 1.00 82.90 525 B 1 +ATOM 8553 C CD1 . LEU B 2 525 ? 16.579 -30.847 9.652 1.00 75.55 525 B 1 +ATOM 8554 C CD2 . LEU B 2 525 ? 17.344 -33.203 9.603 1.00 75.91 525 B 1 +ATOM 8555 N N . LEU B 2 526 ? 17.912 -34.086 14.460 1.00 88.30 526 B 1 +ATOM 8556 C CA . LEU B 2 526 ? 18.596 -33.978 15.748 1.00 88.77 526 B 1 +ATOM 8557 C C . LEU B 2 526 ? 19.890 -33.182 15.549 1.00 88.78 526 B 1 +ATOM 8558 O O . LEU B 2 526 ? 20.769 -33.646 14.825 1.00 85.51 526 B 1 +ATOM 8559 C CB . LEU B 2 526 ? 18.852 -35.374 16.336 1.00 87.43 526 B 1 +ATOM 8560 C CG . LEU B 2 526 ? 17.576 -36.147 16.716 1.00 84.61 526 B 1 +ATOM 8561 C CD1 . LEU B 2 526 ? 17.955 -37.519 17.256 1.00 77.13 526 B 1 +ATOM 8562 C CD2 . LEU B 2 526 ? 16.744 -35.438 17.792 1.00 76.45 526 B 1 +ATOM 8563 N N . PRO B 2 527 ? 19.997 -31.992 16.141 1.00 89.17 527 B 1 +ATOM 8564 C CA . PRO B 2 527 ? 21.109 -31.098 15.873 1.00 89.08 527 B 1 +ATOM 8565 C C . PRO B 2 527 ? 22.389 -31.505 16.599 1.00 89.19 527 B 1 +ATOM 8566 O O . PRO B 2 527 ? 22.360 -32.115 17.674 1.00 86.59 527 B 1 +ATOM 8567 C CB . PRO B 2 527 ? 20.624 -29.729 16.341 1.00 87.47 527 B 1 +ATOM 8568 C CG . PRO B 2 527 ? 19.708 -30.059 17.510 1.00 86.10 527 B 1 +ATOM 8569 C CD . PRO B 2 527 ? 19.045 -31.359 17.047 1.00 88.11 527 B 1 +ATOM 8570 N N . ASP B 2 528 ? 23.520 -31.071 16.061 1.00 88.36 528 B 1 +ATOM 8571 C CA . ASP B 2 528 ? 24.734 -30.886 16.848 1.00 87.57 528 B 1 +ATOM 8572 C C . ASP B 2 528 ? 24.578 -29.688 17.798 1.00 87.85 528 B 1 +ATOM 8573 O O . ASP B 2 528 ? 23.668 -28.865 17.664 1.00 85.34 528 B 1 +ATOM 8574 C CB . ASP B 2 528 ? 25.952 -30.722 15.932 1.00 85.23 528 B 1 +ATOM 8575 C CG . ASP B 2 528 ? 26.353 -32.019 15.222 1.00 81.76 528 B 1 +ATOM 8576 O OD1 . ASP B 2 528 ? 26.110 -33.108 15.798 1.00 74.69 528 B 1 +ATOM 8577 O OD2 . ASP B 2 528 ? 26.939 -31.917 14.128 1.00 74.86 528 B 1 +ATOM 8578 N N . ASN B 2 529 ? 25.474 -29.586 18.779 1.00 88.42 529 B 1 +ATOM 8579 C CA . ASN B 2 529 ? 25.429 -28.489 19.732 1.00 88.09 529 B 1 +ATOM 8580 C C . ASN B 2 529 ? 25.623 -27.144 19.023 1.00 87.59 529 B 1 +ATOM 8581 O O . ASN B 2 529 ? 26.623 -26.918 18.359 1.00 83.77 529 B 1 +ATOM 8582 C CB . ASN B 2 529 ? 26.501 -28.682 20.820 1.00 86.22 529 B 1 +ATOM 8583 C CG . ASN B 2 529 ? 26.222 -29.844 21.758 1.00 83.62 529 B 1 +ATOM 8584 O OD1 . ASN B 2 529 ? 25.192 -30.482 21.777 1.00 75.30 529 B 1 +ATOM 8585 N ND2 . ASN B 2 529 ? 27.176 -30.149 22.616 1.00 75.27 529 B 1 +ATOM 8586 N N . HIS B 2 530 ? 24.671 -26.254 19.222 1.00 89.07 530 B 1 +ATOM 8587 C CA . HIS B 2 530 ? 24.676 -24.906 18.671 1.00 89.01 530 B 1 +ATOM 8588 C C . HIS B 2 530 ? 23.870 -23.977 19.579 1.00 89.18 530 B 1 +ATOM 8589 O O . HIS B 2 530 ? 23.406 -24.398 20.644 1.00 87.35 530 B 1 +ATOM 8590 C CB . HIS B 2 530 ? 24.125 -24.939 17.232 1.00 88.42 530 B 1 +ATOM 8591 C CG . HIS B 2 530 ? 22.675 -25.295 17.131 1.00 88.48 530 B 1 +ATOM 8592 N ND1 . HIS B 2 530 ? 22.121 -26.541 17.332 1.00 81.23 530 B 1 +ATOM 8593 C CD2 . HIS B 2 530 ? 21.648 -24.458 16.765 1.00 80.30 530 B 1 +ATOM 8594 C CE1 . HIS B 2 530 ? 20.804 -26.455 17.093 1.00 82.95 530 B 1 +ATOM 8595 N NE2 . HIS B 2 530 ? 20.480 -25.210 16.742 1.00 84.43 530 B 1 +ATOM 8596 N N . TYR B 2 531 ? 23.713 -22.729 19.188 1.00 89.94 531 B 1 +ATOM 8597 C CA . TYR B 2 531 ? 22.902 -21.776 19.928 1.00 89.76 531 B 1 +ATOM 8598 C C . TYR B 2 531 ? 22.085 -20.873 19.007 1.00 90.25 531 B 1 +ATOM 8599 O O . TYR B 2 531 ? 22.423 -20.663 17.841 1.00 89.16 531 B 1 +ATOM 8600 C CB . TYR B 2 531 ? 23.769 -20.969 20.909 1.00 87.74 531 B 1 +ATOM 8601 C CG . TYR B 2 531 ? 24.812 -20.086 20.253 1.00 85.52 531 B 1 +ATOM 8602 C CD1 . TYR B 2 531 ? 26.103 -20.586 19.970 1.00 78.27 531 B 1 +ATOM 8603 C CD2 . TYR B 2 531 ? 24.517 -18.740 19.953 1.00 77.05 531 B 1 +ATOM 8604 C CE1 . TYR B 2 531 ? 27.078 -19.767 19.388 1.00 75.41 531 B 1 +ATOM 8605 C CE2 . TYR B 2 531 ? 25.486 -17.907 19.368 1.00 74.62 531 B 1 +ATOM 8606 C CZ . TYR B 2 531 ? 26.763 -18.424 19.095 1.00 79.47 531 B 1 +ATOM 8607 O OH . TYR B 2 531 ? 27.712 -17.607 18.525 1.00 77.37 531 B 1 +ATOM 8608 N N . LEU B 2 532 ? 21.014 -20.316 19.545 1.00 89.81 532 B 1 +ATOM 8609 C CA . LEU B 2 532 ? 20.249 -19.246 18.917 1.00 89.78 532 B 1 +ATOM 8610 C C . LEU B 2 532 ? 20.618 -17.919 19.580 1.00 89.19 532 B 1 +ATOM 8611 O O . LEU B 2 532 ? 20.371 -17.735 20.773 1.00 87.50 532 B 1 +ATOM 8612 C CB . LEU B 2 532 ? 18.741 -19.519 19.019 1.00 89.96 532 B 1 +ATOM 8613 C CG . LEU B 2 532 ? 18.282 -20.903 18.521 1.00 89.41 532 B 1 +ATOM 8614 C CD1 . LEU B 2 532 ? 16.768 -21.031 18.683 1.00 80.35 532 B 1 +ATOM 8615 C CD2 . LEU B 2 532 ? 18.628 -21.121 17.055 1.00 80.66 532 B 1 +ATOM 8616 N N . SER B 2 533 ? 21.197 -16.997 18.814 1.00 88.96 533 B 1 +ATOM 8617 C CA . SER B 2 533 ? 21.381 -15.614 19.245 1.00 87.94 533 B 1 +ATOM 8618 C C . SER B 2 533 ? 20.050 -14.878 19.101 1.00 88.21 533 B 1 +ATOM 8619 O O . SER B 2 533 ? 19.528 -14.751 17.994 1.00 86.74 533 B 1 +ATOM 8620 C CB . SER B 2 533 ? 22.471 -14.935 18.411 1.00 86.24 533 B 1 +ATOM 8621 O OG . SER B 2 533 ? 22.661 -13.606 18.848 1.00 75.66 533 B 1 +ATOM 8622 N N . THR B 2 534 ? 19.493 -14.428 20.225 1.00 88.47 534 B 1 +ATOM 8623 C CA . THR B 2 534 ? 18.151 -13.842 20.279 1.00 87.94 534 B 1 +ATOM 8624 C C . THR B 2 534 ? 18.193 -12.413 20.797 1.00 87.03 534 B 1 +ATOM 8625 O O . THR B 2 534 ? 18.804 -12.129 21.826 1.00 85.09 534 B 1 +ATOM 8626 C CB . THR B 2 534 ? 17.206 -14.693 21.134 1.00 87.30 534 B 1 +ATOM 8627 O OG1 . THR B 2 534 ? 17.251 -16.042 20.724 1.00 76.25 534 B 1 +ATOM 8628 C CG2 . THR B 2 534 ? 15.758 -14.245 20.987 1.00 74.01 534 B 1 +ATOM 8629 N N . GLN B 2 535 ? 17.519 -11.518 20.088 1.00 87.81 535 B 1 +ATOM 8630 C CA . GLN B 2 535 ? 17.357 -10.111 20.438 1.00 86.65 535 B 1 +ATOM 8631 C C . GLN B 2 535 ? 15.874 -9.765 20.419 1.00 87.52 535 B 1 +ATOM 8632 O O . GLN B 2 535 ? 15.209 -10.001 19.411 1.00 85.66 535 B 1 +ATOM 8633 C CB . GLN B 2 535 ? 18.091 -9.224 19.431 1.00 84.66 535 B 1 +ATOM 8634 C CG . GLN B 2 535 ? 19.590 -9.509 19.340 1.00 80.95 535 B 1 +ATOM 8635 C CD . GLN B 2 535 ? 20.206 -8.701 18.201 1.00 78.22 535 B 1 +ATOM 8636 O OE1 . GLN B 2 535 ? 20.444 -7.516 18.317 1.00 69.35 535 B 1 +ATOM 8637 N NE2 . GLN B 2 535 ? 20.435 -9.318 17.061 1.00 66.49 535 B 1 +ATOM 8638 N N . SER B 2 536 ? 15.369 -9.179 21.497 1.00 87.79 536 B 1 +ATOM 8639 C CA . SER B 2 536 ? 13.963 -8.813 21.634 1.00 87.26 536 B 1 +ATOM 8640 C C . SER B 2 536 ? 13.823 -7.334 21.980 1.00 86.94 536 B 1 +ATOM 8641 O O . SER B 2 536 ? 14.492 -6.838 22.886 1.00 84.47 536 B 1 +ATOM 8642 C CB . SER B 2 536 ? 13.278 -9.685 22.691 1.00 86.26 536 B 1 +ATOM 8643 O OG . SER B 2 536 ? 13.553 -11.060 22.499 1.00 79.14 536 B 1 +ATOM 8644 N N . ALA B 2 537 ? 12.941 -6.632 21.283 1.00 87.36 537 B 1 +ATOM 8645 C CA . ALA B 2 537 ? 12.580 -5.251 21.574 1.00 86.94 537 B 1 +ATOM 8646 C C . ALA B 2 537 ? 11.118 -5.177 22.008 1.00 87.97 537 B 1 +ATOM 8647 O O . ALA B 2 537 ? 10.212 -5.549 21.257 1.00 85.92 537 B 1 +ATOM 8648 C CB . ALA B 2 537 ? 12.871 -4.386 20.343 1.00 84.53 537 B 1 +ATOM 8649 N N . LEU B 2 538 ? 10.891 -4.691 23.226 1.00 87.99 538 B 1 +ATOM 8650 C CA . LEU B 2 538 ? 9.558 -4.508 23.793 1.00 88.01 538 B 1 +ATOM 8651 C C . LEU B 2 538 ? 9.080 -3.082 23.552 1.00 87.40 538 B 1 +ATOM 8652 O O . LEU B 2 538 ? 9.809 -2.124 23.779 1.00 85.36 538 B 1 +ATOM 8653 C CB . LEU B 2 538 ? 9.547 -4.846 25.297 1.00 87.74 538 B 1 +ATOM 8654 C CG . LEU B 2 538 ? 10.223 -6.171 25.701 1.00 86.85 538 B 1 +ATOM 8655 C CD1 . LEU B 2 538 ? 10.003 -6.417 27.192 1.00 76.21 538 B 1 +ATOM 8656 C CD2 . LEU B 2 538 ? 9.673 -7.367 24.943 1.00 76.90 538 B 1 +ATOM 8657 N N . SER B 2 539 ? 7.834 -2.928 23.144 1.00 87.62 539 B 1 +ATOM 8658 C CA . SER B 2 539 ? 7.208 -1.620 22.974 1.00 86.51 539 B 1 +ATOM 8659 C C . SER B 2 539 ? 5.746 -1.639 23.414 1.00 87.54 539 B 1 +ATOM 8660 O O . SER B 2 539 ? 5.214 -2.674 23.837 1.00 86.03 539 B 1 +ATOM 8661 C CB . SER B 2 539 ? 7.400 -1.129 21.531 1.00 83.83 539 B 1 +ATOM 8662 O OG . SER B 2 539 ? 6.721 -1.958 20.610 1.00 77.32 539 B 1 +ATOM 8663 N N . LYS B 2 540 ? 5.111 -0.470 23.360 1.00 86.29 540 B 1 +ATOM 8664 C CA . LYS B 2 540 ? 3.684 -0.306 23.622 1.00 85.66 540 B 1 +ATOM 8665 C C . LYS B 2 540 ? 3.006 0.281 22.395 1.00 85.41 540 B 1 +ATOM 8666 O O . LYS B 2 540 ? 3.591 1.105 21.694 1.00 81.88 540 B 1 +ATOM 8667 C CB . LYS B 2 540 ? 3.463 0.569 24.868 1.00 84.02 540 B 1 +ATOM 8668 C CG . LYS B 2 540 ? 3.973 -0.045 26.190 1.00 82.99 540 B 1 +ATOM 8669 C CD . LYS B 2 540 ? 3.196 -1.302 26.619 1.00 81.36 540 B 1 +ATOM 8670 C CE . LYS B 2 540 ? 3.649 -1.786 27.995 1.00 79.59 540 B 1 +ATOM 8671 N NZ . LYS B 2 540 ? 2.929 -3.010 28.438 1.00 75.48 540 B 1 +ATOM 8672 N N . ASP B 2 541 ? 1.768 -0.131 22.170 1.00 85.69 541 B 1 +ATOM 8673 C CA . ASP B 2 541 ? 0.875 0.512 21.212 1.00 85.03 541 B 1 +ATOM 8674 C C . ASP B 2 541 ? 0.124 1.631 21.952 1.00 84.64 541 B 1 +ATOM 8675 O O . ASP B 2 541 ? -0.666 1.337 22.849 1.00 81.45 541 B 1 +ATOM 8676 C CB . ASP B 2 541 ? -0.057 -0.543 20.622 1.00 83.34 541 B 1 +ATOM 8677 C CG . ASP B 2 541 ? -1.118 0.001 19.656 1.00 81.52 541 B 1 +ATOM 8678 O OD1 . ASP B 2 541 ? -1.235 1.240 19.488 1.00 73.18 541 B 1 +ATOM 8679 O OD2 . ASP B 2 541 ? -1.860 -0.856 19.119 1.00 73.87 541 B 1 +ATOM 8680 N N . PRO B 2 542 ? 0.347 2.918 21.627 1.00 81.91 542 B 1 +ATOM 8681 C CA . PRO B 2 542 ? -0.294 4.031 22.326 1.00 78.93 542 B 1 +ATOM 8682 C C . PRO B 2 542 ? -1.819 4.058 22.168 1.00 80.02 542 B 1 +ATOM 8683 O O . PRO B 2 542 ? -2.503 4.688 22.967 1.00 76.38 542 B 1 +ATOM 8684 C CB . PRO B 2 542 ? 0.371 5.288 21.752 1.00 76.28 542 B 1 +ATOM 8685 C CG . PRO B 2 542 ? 0.802 4.859 20.353 1.00 74.29 542 B 1 +ATOM 8686 C CD . PRO B 2 542 ? 1.192 3.396 20.550 1.00 76.46 542 B 1 +ATOM 8687 N N . ASN B 2 543 ? -2.361 3.358 21.178 1.00 82.25 543 B 1 +ATOM 8688 C CA . ASN B 2 543 ? -3.802 3.261 20.938 1.00 82.82 543 B 1 +ATOM 8689 C C . ASN B 2 543 ? -4.454 2.070 21.672 1.00 84.16 543 B 1 +ATOM 8690 O O . ASN B 2 543 ? -5.677 1.990 21.742 1.00 80.41 543 B 1 +ATOM 8691 C CB . ASN B 2 543 ? -4.047 3.187 19.425 1.00 80.36 543 B 1 +ATOM 8692 C CG . ASN B 2 543 ? -3.502 4.400 18.691 1.00 75.91 543 B 1 +ATOM 8693 O OD1 . ASN B 2 543 ? -3.770 5.537 19.034 1.00 66.61 543 B 1 +ATOM 8694 N ND2 . ASN B 2 543 ? -2.727 4.181 17.656 1.00 65.38 543 B 1 +ATOM 8695 N N . GLU B 2 544 ? -3.661 1.162 22.232 1.00 83.99 544 B 1 +ATOM 8696 C CA . GLU B 2 544 ? -4.154 0.010 22.976 1.00 85.40 544 B 1 +ATOM 8697 C C . GLU B 2 544 ? -4.318 0.351 24.463 1.00 85.23 544 B 1 +ATOM 8698 O O . GLU B 2 544 ? -3.362 0.666 25.165 1.00 81.66 544 B 1 +ATOM 8699 C CB . GLU B 2 544 ? -3.238 -1.191 22.742 1.00 85.09 544 B 1 +ATOM 8700 C CG . GLU B 2 544 ? -3.698 -2.467 23.440 1.00 82.67 544 B 1 +ATOM 8701 C CD . GLU B 2 544 ? -5.113 -2.908 23.031 1.00 84.38 544 B 1 +ATOM 8702 O OE1 . GLU B 2 544 ? -6.059 -2.658 23.811 1.00 75.19 544 B 1 +ATOM 8703 O OE2 . GLU B 2 544 ? -5.279 -3.496 21.945 1.00 77.98 544 B 1 +ATOM 8704 N N . LYS B 2 545 ? -5.551 0.260 24.945 1.00 86.79 545 B 1 +ATOM 8705 C CA . LYS B 2 545 ? -5.884 0.569 26.343 1.00 87.06 545 B 1 +ATOM 8706 C C . LYS B 2 545 ? -5.756 -0.626 27.281 1.00 88.60 545 B 1 +ATOM 8707 O O . LYS B 2 545 ? -5.731 -0.438 28.485 1.00 83.80 545 B 1 +ATOM 8708 C CB . LYS B 2 545 ? -7.308 1.134 26.429 1.00 83.84 545 B 1 +ATOM 8709 C CG . LYS B 2 545 ? -7.425 2.474 25.696 1.00 75.30 545 B 1 +ATOM 8710 C CD . LYS B 2 545 ? -8.804 3.103 25.964 1.00 65.28 545 B 1 +ATOM 8711 C CE . LYS B 2 545 ? -8.868 4.444 25.238 1.00 55.01 545 B 1 +ATOM 8712 N NZ . LYS B 2 545 ? -10.117 5.183 25.552 1.00 46.85 545 B 1 +ATOM 8713 N N . ARG B 2 546 ? -5.751 -1.841 26.732 1.00 88.18 546 B 1 +ATOM 8714 C CA . ARG B 2 546 ? -5.561 -3.057 27.525 1.00 88.57 546 B 1 +ATOM 8715 C C . ARG B 2 546 ? -4.098 -3.187 27.927 1.00 89.26 546 B 1 +ATOM 8716 O O . ARG B 2 546 ? -3.216 -2.621 27.283 1.00 87.06 546 B 1 +ATOM 8717 C CB . ARG B 2 546 ? -6.033 -4.285 26.735 1.00 87.88 546 B 1 +ATOM 8718 C CG . ARG B 2 546 ? -7.543 -4.245 26.453 1.00 85.54 546 B 1 +ATOM 8719 C CD . ARG B 2 546 ? -7.957 -5.366 25.495 1.00 84.42 546 B 1 +ATOM 8720 N NE . ARG B 2 546 ? -7.468 -5.080 24.145 1.00 79.26 546 B 1 +ATOM 8721 C CZ . ARG B 2 546 ? -7.703 -5.785 23.048 1.00 75.49 546 B 1 +ATOM 8722 N NH1 . ARG B 2 546 ? -8.440 -6.858 23.068 1.00 68.64 546 B 1 +ATOM 8723 N NH2 . ARG B 2 546 ? -7.184 -5.411 21.919 1.00 68.38 546 B 1 +ATOM 8724 N N . ASP B 2 547 ? -3.849 -3.969 28.984 1.00 89.91 547 B 1 +ATOM 8725 C CA . ASP B 2 547 ? -2.494 -4.362 29.302 1.00 91.19 547 B 1 +ATOM 8726 C C . ASP B 2 547 ? -1.956 -5.249 28.171 1.00 92.08 547 B 1 +ATOM 8727 O O . ASP B 2 547 ? -2.609 -6.212 27.765 1.00 89.13 547 B 1 +ATOM 8728 C CB . ASP B 2 547 ? -2.428 -5.033 30.676 1.00 89.61 547 B 1 +ATOM 8729 C CG . ASP B 2 547 ? -1.006 -5.067 31.237 1.00 89.00 547 B 1 +ATOM 8730 O OD1 . ASP B 2 547 ? -0.094 -4.488 30.603 1.00 80.25 547 B 1 +ATOM 8731 O OD2 . ASP B 2 547 ? -0.841 -5.625 32.346 1.00 80.90 547 B 1 +ATOM 8732 N N . HIS B 2 548 ? -0.826 -4.871 27.612 1.00 92.37 548 B 1 +ATOM 8733 C CA . HIS B 2 548 ? -0.311 -5.464 26.385 1.00 92.01 548 B 1 +ATOM 8734 C C . HIS B 2 548 ? 1.202 -5.301 26.256 1.00 92.08 548 B 1 +ATOM 8735 O O . HIS B 2 548 ? 1.832 -4.480 26.921 1.00 89.89 548 B 1 +ATOM 8736 C CB . HIS B 2 548 ? -1.014 -4.855 25.165 1.00 90.13 548 B 1 +ATOM 8737 C CG . HIS B 2 548 ? -0.613 -3.441 24.874 1.00 88.92 548 B 1 +ATOM 8738 N ND1 . HIS B 2 548 ? -0.970 -2.322 25.609 1.00 78.98 548 B 1 +ATOM 8739 C CD2 . HIS B 2 548 ? 0.221 -3.018 23.870 1.00 78.34 548 B 1 +ATOM 8740 C CE1 . HIS B 2 548 ? -0.361 -1.264 25.061 1.00 80.42 548 B 1 +ATOM 8741 N NE2 . HIS B 2 548 ? 0.367 -1.651 24.004 1.00 82.23 548 B 1 +ATOM 8742 N N . MET B 2 549 ? 1.759 -6.087 25.340 1.00 92.15 549 B 1 +ATOM 8743 C CA . MET B 2 549 ? 3.147 -6.010 24.917 1.00 92.27 549 B 1 +ATOM 8744 C C . MET B 2 549 ? 3.190 -6.115 23.393 1.00 92.31 549 B 1 +ATOM 8745 O O . MET B 2 549 ? 2.640 -7.052 22.825 1.00 91.12 549 B 1 +ATOM 8746 C CB . MET B 2 549 ? 3.925 -7.140 25.590 1.00 91.50 549 B 1 +ATOM 8747 C CG . MET B 2 549 ? 5.379 -7.269 25.131 1.00 89.30 549 B 1 +ATOM 8748 S SD . MET B 2 549 ? 6.353 -8.506 26.036 1.00 88.42 549 B 1 +ATOM 8749 C CE . MET B 2 549 ? 5.535 -10.037 25.538 1.00 79.24 549 B 1 +ATOM 8750 N N . VAL B 2 550 ? 3.863 -5.177 22.747 1.00 90.52 550 B 1 +ATOM 8751 C CA . VAL B 2 550 ? 4.296 -5.339 21.358 1.00 89.75 550 B 1 +ATOM 8752 C C . VAL B 2 550 ? 5.738 -5.815 21.403 1.00 89.66 550 B 1 +ATOM 8753 O O . VAL B 2 550 ? 6.562 -5.210 22.089 1.00 88.21 550 B 1 +ATOM 8754 C CB . VAL B 2 550 ? 4.148 -4.057 20.533 1.00 88.58 550 B 1 +ATOM 8755 C CG1 . VAL B 2 550 ? 4.591 -4.263 19.085 1.00 80.96 550 B 1 +ATOM 8756 C CG2 . VAL B 2 550 ? 2.689 -3.581 20.515 1.00 79.57 550 B 1 +ATOM 8757 N N . LEU B 2 551 ? 6.025 -6.907 20.711 1.00 90.40 551 B 1 +ATOM 8758 C CA . LEU B 2 551 ? 7.331 -7.530 20.717 1.00 90.14 551 B 1 +ATOM 8759 C C . LEU B 2 551 ? 7.840 -7.721 19.297 1.00 89.99 551 B 1 +ATOM 8760 O O . LEU B 2 551 ? 7.150 -8.268 18.436 1.00 88.36 551 B 1 +ATOM 8761 C CB . LEU B 2 551 ? 7.263 -8.826 21.531 1.00 88.86 551 B 1 +ATOM 8762 C CG . LEU B 2 551 ? 8.649 -9.479 21.705 1.00 86.65 551 B 1 +ATOM 8763 C CD1 . LEU B 2 551 ? 8.860 -9.901 23.152 1.00 75.32 551 B 1 +ATOM 8764 C CD2 . LEU B 2 551 ? 8.782 -10.706 20.813 1.00 74.75 551 B 1 +ATOM 8765 N N . LEU B 2 552 ? 9.066 -7.270 19.069 1.00 89.27 552 B 1 +ATOM 8766 C CA . LEU B 2 552 ? 9.827 -7.552 17.863 1.00 88.38 552 B 1 +ATOM 8767 C C . LEU B 2 552 ? 11.066 -8.334 18.269 1.00 88.57 552 B 1 +ATOM 8768 O O . LEU B 2 552 ? 11.812 -7.904 19.141 1.00 86.80 552 B 1 +ATOM 8769 C CB . LEU B 2 552 ? 10.151 -6.236 17.151 1.00 86.48 552 B 1 +ATOM 8770 C CG . LEU B 2 552 ? 10.747 -6.492 15.754 1.00 80.40 552 B 1 +ATOM 8771 C CD1 . LEU B 2 552 ? 9.847 -5.910 14.664 1.00 71.14 552 B 1 +ATOM 8772 C CD2 . LEU B 2 552 ? 12.130 -5.870 15.626 1.00 71.34 552 B 1 +ATOM 8773 N N . GLU B 2 553 ? 11.271 -9.484 17.630 1.00 89.12 553 B 1 +ATOM 8774 C CA . GLU B 2 553 ? 12.361 -10.379 17.976 1.00 89.22 553 B 1 +ATOM 8775 C C . GLU B 2 553 ? 13.117 -10.814 16.719 1.00 89.30 553 B 1 +ATOM 8776 O O . GLU B 2 553 ? 12.530 -11.026 15.665 1.00 87.73 553 B 1 +ATOM 8777 C CB . GLU B 2 553 ? 11.796 -11.571 18.769 1.00 88.24 553 B 1 +ATOM 8778 C CG . GLU B 2 553 ? 12.875 -12.470 19.380 1.00 82.39 553 B 1 +ATOM 8779 C CD . GLU B 2 553 ? 12.244 -13.486 20.342 1.00 82.55 553 B 1 +ATOM 8780 O OE1 . GLU B 2 553 ? 12.206 -14.684 19.996 1.00 74.01 553 B 1 +ATOM 8781 O OE2 . GLU B 2 553 ? 11.766 -13.065 21.414 1.00 75.90 553 B 1 +ATOM 8782 N N . PHE B 2 554 ? 14.432 -10.922 16.857 1.00 89.08 554 B 1 +ATOM 8783 C CA . PHE B 2 554 ? 15.311 -11.497 15.849 1.00 88.04 554 B 1 +ATOM 8784 C C . PHE B 2 554 ? 16.056 -12.679 16.451 1.00 88.26 554 B 1 +ATOM 8785 O O . PHE B 2 554 ? 16.703 -12.550 17.489 1.00 86.32 554 B 1 +ATOM 8786 C CB . PHE B 2 554 ? 16.285 -10.449 15.315 1.00 86.14 554 B 1 +ATOM 8787 C CG . PHE B 2 554 ? 15.621 -9.371 14.484 1.00 83.10 554 B 1 +ATOM 8788 C CD1 . PHE B 2 554 ? 15.381 -9.583 13.114 1.00 75.29 554 B 1 +ATOM 8789 C CD2 . PHE B 2 554 ? 15.254 -8.149 15.070 1.00 74.79 554 B 1 +ATOM 8790 C CE1 . PHE B 2 554 ? 14.785 -8.584 12.338 1.00 73.05 554 B 1 +ATOM 8791 C CE2 . PHE B 2 554 ? 14.646 -7.147 14.298 1.00 72.20 554 B 1 +ATOM 8792 C CZ . PHE B 2 554 ? 14.411 -7.362 12.927 1.00 76.94 554 B 1 +ATOM 8793 N N . VAL B 2 555 ? 15.994 -13.822 15.764 1.00 88.87 555 B 1 +ATOM 8794 C CA . VAL B 2 555 ? 16.615 -15.060 16.212 1.00 89.66 555 B 1 +ATOM 8795 C C . VAL B 2 555 ? 17.457 -15.638 15.083 1.00 89.58 555 B 1 +ATOM 8796 O O . VAL B 2 555 ? 16.958 -15.904 13.991 1.00 88.13 555 B 1 +ATOM 8797 C CB . VAL B 2 555 ? 15.570 -16.086 16.684 1.00 89.18 555 B 1 +ATOM 8798 C CG1 . VAL B 2 555 ? 16.266 -17.222 17.443 1.00 79.47 555 B 1 +ATOM 8799 C CG2 . VAL B 2 555 ? 14.521 -15.469 17.628 1.00 79.13 555 B 1 +ATOM 8800 N N . THR B 2 556 ? 18.747 -15.849 15.334 1.00 89.21 556 B 1 +ATOM 8801 C CA . THR B 2 556 ? 19.661 -16.429 14.355 1.00 88.57 556 B 1 +ATOM 8802 C C . THR B 2 556 ? 20.432 -17.581 14.980 1.00 88.65 556 B 1 +ATOM 8803 O O . THR B 2 556 ? 21.030 -17.416 16.038 1.00 87.41 556 B 1 +ATOM 8804 C CB . THR B 2 556 ? 20.619 -15.370 13.795 1.00 86.56 556 B 1 +ATOM 8805 O OG1 . THR B 2 556 ? 19.877 -14.307 13.235 1.00 73.40 556 B 1 +ATOM 8806 C CG2 . THR B 2 556 ? 21.504 -15.909 12.678 1.00 71.30 556 B 1 +ATOM 8807 N N . ALA B 2 557 ? 20.434 -18.731 14.314 1.00 89.76 557 B 1 +ATOM 8808 C CA . ALA B 2 557 ? 21.253 -19.860 14.727 1.00 89.39 557 B 1 +ATOM 8809 C C . ALA B 2 557 ? 22.735 -19.601 14.421 1.00 88.40 557 B 1 +ATOM 8810 O O . ALA B 2 557 ? 23.083 -19.087 13.354 1.00 86.32 557 B 1 +ATOM 8811 C CB . ALA B 2 557 ? 20.745 -21.130 14.056 1.00 89.08 557 B 1 +ATOM 8812 N N . ALA B 2 558 ? 23.597 -19.984 15.352 1.00 87.91 558 B 1 +ATOM 8813 C CA . ALA B 2 558 ? 25.046 -19.823 15.264 1.00 86.51 558 B 1 +ATOM 8814 C C . ALA B 2 558 ? 25.760 -20.928 16.064 1.00 86.49 558 B 1 +ATOM 8815 O O . ALA B 2 558 ? 25.127 -21.800 16.654 1.00 83.02 558 B 1 +ATOM 8816 C CB . ALA B 2 558 ? 25.392 -18.410 15.762 1.00 83.78 558 B 1 +ATOM 8817 N N . GLY B 2 559 ? 27.100 -20.900 16.062 1.00 82.75 559 B 1 +ATOM 8818 C CA . GLY B 2 559 ? 27.931 -21.819 16.849 1.00 81.18 559 B 1 +ATOM 8819 C C . GLY B 2 559 ? 28.428 -23.060 16.107 1.00 81.17 559 B 1 +ATOM 8820 O O . GLY B 2 559 ? 29.259 -23.784 16.641 1.00 75.57 559 B 1 +ATOM 8821 N N . ILE B 2 560 ? 27.979 -23.295 14.879 1.00 78.86 560 B 1 +ATOM 8822 C CA . ILE B 2 560 ? 28.559 -24.287 13.969 1.00 76.48 560 B 1 +ATOM 8823 C C . ILE B 2 560 ? 29.256 -23.522 12.851 1.00 73.94 560 B 1 +ATOM 8824 O O . ILE B 2 560 ? 28.621 -22.847 12.053 1.00 67.45 560 B 1 +ATOM 8825 C CB . ILE B 2 560 ? 27.500 -25.294 13.464 1.00 72.95 560 B 1 +ATOM 8826 C CG1 . ILE B 2 560 ? 26.847 -26.016 14.667 1.00 69.56 560 B 1 +ATOM 8827 C CG2 . ILE B 2 560 ? 28.145 -26.304 12.501 1.00 67.55 560 B 1 +ATOM 8828 C CD1 . ILE B 2 560 ? 25.699 -26.961 14.300 1.00 63.55 560 B 1 +ATOM 8829 N N . THR B 2 561 ? 30.587 -23.614 12.812 1.00 70.80 561 B 1 +ATOM 8830 C CA . THR B 2 561 ? 31.390 -23.029 11.744 1.00 68.15 561 B 1 +ATOM 8831 C C . THR B 2 561 ? 31.363 -23.920 10.509 1.00 67.06 561 B 1 +ATOM 8832 O O . THR B 2 561 ? 31.336 -25.141 10.626 1.00 61.63 561 B 1 +ATOM 8833 C CB . THR B 2 561 ? 32.837 -22.775 12.201 1.00 62.13 561 B 1 +ATOM 8834 O OG1 . THR B 2 561 ? 33.358 -23.899 12.867 1.00 55.23 561 B 1 +ATOM 8835 C CG2 . THR B 2 561 ? 32.908 -21.604 13.179 1.00 52.30 561 B 1 +ATOM 8836 N N . LEU B 2 562 ? 31.406 -23.318 9.320 1.00 61.20 562 B 1 +ATOM 8837 C CA . LEU B 2 562 ? 31.705 -24.055 8.086 1.00 59.48 562 B 1 +ATOM 8838 C C . LEU B 2 562 ? 33.071 -24.726 8.259 1.00 58.14 562 B 1 +ATOM 8839 O O . LEU B 2 562 ? 34.093 -24.049 8.360 1.00 52.45 562 B 1 +ATOM 8840 C CB . LEU B 2 562 ? 31.691 -23.086 6.888 1.00 54.98 562 B 1 +ATOM 8841 C CG . LEU B 2 562 ? 30.363 -23.118 6.110 1.00 50.15 562 B 1 +ATOM 8842 C CD1 . LEU B 2 562 ? 29.840 -21.713 5.839 1.00 44.51 562 B 1 +ATOM 8843 C CD2 . LEU B 2 562 ? 30.535 -23.828 4.768 1.00 46.25 562 B 1 +ATOM 8844 N N . GLY B 2 563 ? 33.073 -26.059 8.331 1.00 45.69 563 B 1 +ATOM 8845 C CA . GLY B 2 563 ? 34.314 -26.821 8.322 1.00 44.36 563 B 1 +ATOM 8846 C C . GLY B 2 563 ? 35.069 -26.576 7.015 1.00 43.46 563 B 1 +ATOM 8847 O O . GLY B 2 563 ? 34.449 -26.403 5.963 1.00 40.95 563 B 1 +ATOM 8848 N N . MET B 2 564 ? 36.388 -26.596 7.061 1.00 36.48 564 B 1 +ATOM 8849 C CA . MET B 2 564 ? 37.209 -26.480 5.846 1.00 35.76 564 B 1 +ATOM 8850 C C . MET B 2 564 ? 36.850 -27.535 4.793 1.00 36.16 564 B 1 +ATOM 8851 O O . MET B 2 564 ? 37.024 -27.274 3.614 1.00 34.29 564 B 1 +ATOM 8852 C CB . MET B 2 564 ? 38.697 -26.619 6.190 1.00 33.69 564 B 1 +ATOM 8853 C CG . MET B 2 564 ? 39.300 -25.345 6.781 1.00 30.60 564 B 1 +ATOM 8854 S SD . MET B 2 564 ? 41.123 -25.400 6.772 1.00 27.58 564 B 1 +ATOM 8855 C CE . MET B 2 564 ? 41.507 -23.831 7.561 1.00 25.21 564 B 1 +ATOM 8856 N N . ASP B 2 565 ? 36.312 -28.685 5.198 1.00 36.93 565 B 1 +ATOM 8857 C CA . ASP B 2 565 ? 36.005 -29.789 4.288 1.00 36.83 565 B 1 +ATOM 8858 C C . ASP B 2 565 ? 34.989 -29.441 3.193 1.00 36.39 565 B 1 +ATOM 8859 O O . ASP B 2 565 ? 35.081 -29.969 2.081 1.00 34.77 565 B 1 +ATOM 8860 C CB . ASP B 2 565 ? 35.494 -30.990 5.101 1.00 34.93 565 B 1 +ATOM 8861 C CG . ASP B 2 565 ? 36.574 -31.664 5.951 1.00 31.90 565 B 1 +ATOM 8862 O OD1 . ASP B 2 565 ? 37.759 -31.554 5.586 1.00 29.83 565 B 1 +ATOM 8863 O OD2 . ASP B 2 565 ? 36.197 -32.291 6.963 1.00 30.22 565 B 1 +ATOM 8864 N N . GLU B 2 566 ? 34.020 -28.554 3.450 1.00 33.99 566 B 1 +ATOM 8865 C CA . GLU B 2 566 ? 33.083 -28.110 2.415 1.00 34.54 566 B 1 +ATOM 8866 C C . GLU B 2 566 ? 33.672 -27.035 1.488 1.00 33.84 566 B 1 +ATOM 8867 O O . GLU B 2 566 ? 33.197 -26.876 0.370 1.00 32.85 566 B 1 +ATOM 8868 C CB . GLU B 2 566 ? 31.746 -27.633 3.009 1.00 33.80 566 B 1 +ATOM 8869 C CG . GLU B 2 566 ? 30.848 -28.797 3.437 1.00 31.46 566 B 1 +ATOM 8870 C CD . GLU B 2 566 ? 29.382 -28.388 3.637 1.00 29.26 566 B 1 +ATOM 8871 O OE1 . GLU B 2 566 ? 28.524 -29.308 3.579 1.00 26.26 566 B 1 +ATOM 8872 O OE2 . GLU B 2 566 ? 29.110 -27.179 3.803 1.00 29.62 566 B 1 +ATOM 8873 N N . LEU B 2 567 ? 34.715 -26.327 1.909 1.00 31.01 567 B 1 +ATOM 8874 C CA . LEU B 2 567 ? 35.456 -25.403 1.052 1.00 30.66 567 B 1 +ATOM 8875 C C . LEU B 2 567 ? 36.337 -26.128 0.026 1.00 30.33 567 B 1 +ATOM 8876 O O . LEU B 2 567 ? 36.677 -25.539 -0.996 1.00 29.67 567 B 1 +ATOM 8877 C CB . LEU B 2 567 ? 36.305 -24.461 1.926 1.00 29.78 567 B 1 +ATOM 8878 C CG . LEU B 2 567 ? 35.567 -23.173 2.320 1.00 28.18 567 B 1 +ATOM 8879 C CD1 . LEU B 2 567 ? 36.197 -22.562 3.565 1.00 27.27 567 B 1 +ATOM 8880 C CD2 . LEU B 2 567 ? 35.640 -22.131 1.200 1.00 30.00 567 B 1 +ATOM 8881 N N . TYR B 2 568 ? 36.690 -27.389 0.302 1.00 30.46 568 B 1 +ATOM 8882 C CA . TYR B 2 568 ? 37.530 -28.207 -0.584 1.00 29.44 568 B 1 +ATOM 8883 C C . TYR B 2 568 ? 36.742 -29.175 -1.473 1.00 29.20 568 B 1 +ATOM 8884 O O . TYR B 2 568 ? 37.361 -29.963 -2.196 1.00 27.04 568 B 1 +ATOM 8885 C CB . TYR B 2 568 ? 38.586 -28.946 0.248 1.00 27.68 568 B 1 +ATOM 8886 C CG . TYR B 2 568 ? 39.784 -28.095 0.616 1.00 25.69 568 B 1 +ATOM 8887 C CD1 . TYR B 2 568 ? 40.779 -27.845 -0.349 1.00 23.16 568 B 1 +ATOM 8888 C CD2 . TYR B 2 568 ? 39.917 -27.556 1.909 1.00 22.33 568 B 1 +ATOM 8889 C CE1 . TYR B 2 568 ? 41.901 -27.064 -0.023 1.00 21.80 568 B 1 +ATOM 8890 C CE2 . TYR B 2 568 ? 41.027 -26.772 2.240 1.00 22.29 568 B 1 +ATOM 8891 C CZ . TYR B 2 568 ? 42.025 -26.525 1.278 1.00 23.31 568 B 1 +ATOM 8892 O OH . TYR B 2 568 ? 43.110 -25.758 1.598 1.00 22.41 568 B 1 +ATOM 8893 N N . LYS B 2 569 ? 35.405 -29.153 -1.445 1.00 30.29 569 B 1 +ATOM 8894 C CA . LYS B 2 569 ? 34.575 -29.909 -2.376 1.00 30.15 569 B 1 +ATOM 8895 C C . LYS B 2 569 ? 34.082 -29.060 -3.530 1.00 28.22 569 B 1 +ATOM 8896 O O . LYS B 2 569 ? 33.654 -27.920 -3.282 1.00 25.23 569 B 1 +ATOM 8897 C CB . LYS B 2 569 ? 33.406 -30.605 -1.677 1.00 29.33 569 B 1 +ATOM 8898 C CG . LYS B 2 569 ? 33.833 -31.974 -1.140 1.00 28.16 569 B 1 +ATOM 8899 C CD . LYS B 2 569 ? 32.605 -32.694 -0.573 1.00 26.59 569 B 1 +ATOM 8900 C CE . LYS B 2 569 ? 33.021 -34.081 -0.086 1.00 22.24 569 B 1 +ATOM 8901 N NZ . LYS B 2 569 ? 31.874 -34.766 0.560 1.00 21.62 569 B 1 +ATOM 8902 O OXT . LYS B 2 569 ? 34.142 -29.613 -4.661 1.00 24.05 569 B 1 +# diff --git a/tests/test_aa_specific_quenching.py b/tests/test_aa_specific_quenching.py new file mode 100644 index 0000000..004b560 --- /dev/null +++ b/tests/test_aa_specific_quenching.py @@ -0,0 +1,243 @@ +"""Tests for amino-acid specific PET quenching. + +Quenching in QuEst is resolved per residue type: each residue contributes its +own rate (``kQ``) inside its own contact radius (``quench_radius``), measured +from the dye centre to a quenching centre that sits on the residue's +redox-active moiety (``quench_atoms``) rather than on CB. +""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest + +from quest.core import build_donor_from_project, calculate_aa_quenching, simulate_project +from quest.core.dye_diffusion import ( + DEFAULT_QUENCHER_ATOMS, + REFERENCE_PET_QUENCHING, + default_amino_acid_interactions, + normalize_amino_acid_interactions, +) + +PDB_PATH = Path(__file__).parent / "148l.pdb" + + +def _project(**overrides): + project = { + "tau0": 4.2, + "n_photons": 5000, + "t_max": 500.0, + "t_step": 0.02, + "dg": 0.8, + "critical_distance": 8.5, + "slow_radius": 8.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": default_amino_acid_interactions(slow_factor=0.1), + "attachment": {"chain": "E", "residue": 10, "atom": "CB"}, + "pdb": str(PDB_PATH), + "n_bins": 64, + "parallel_trajectories": 1, + "fret": {"enabled": False, "dyes": [{"name": "D0", "D": 7.0, "random_seed": 3}]}, + } + project.update(overrides) + return project + + +class TestInteractionTable: + def test_defaults_cover_every_standard_residue(self) -> None: + table = normalize_amino_acid_interactions() + assert len(table) == 20 + for residue, params in table.items(): + assert set(params) == {"slow_factor", "kQ", "quench_radius", "quench_atoms"} + assert params["quench_atoms"] == list(DEFAULT_QUENCHER_ATOMS[residue]) + + def test_quench_atoms_are_the_redox_active_moiety(self) -> None: + table = normalize_amino_acid_interactions() + # The indole ring, not CB, mediates PET for tryptophan. + assert "NE1" in table["TRP"]["quench_atoms"] + assert "CB" not in table["TRP"]["quench_atoms"] + # Sulfur-centred quenchers are single atoms. + assert table["MET"]["quench_atoms"] == ["SD"] + assert table["CYS"]["quench_atoms"] == ["SG"] + # The imidazole ring for histidine. + assert set(table["HIS"]["quench_atoms"]) == {"CG", "ND1", "CD2", "CE1", "NE2"} + + def test_legacy_scalar_entry_is_read_as_slow_factor(self) -> None: + table = normalize_amino_acid_interactions({"TRP": 0.25}) + assert table["TRP"]["slow_factor"] == 0.25 + assert table["TRP"]["kQ"] == 0.0 + + def test_partial_override_keeps_defaults(self) -> None: + table = normalize_amino_acid_interactions({"TYR": {"kQ": 9.0}}) + assert table["TYR"]["kQ"] == 9.0 + assert table["TYR"]["quench_atoms"] == list(DEFAULT_QUENCHER_ATOMS["TYR"]) + assert table["TRP"]["kQ"] == 0.0 + + @pytest.mark.parametrize("bad", [None, 0.0, -1.0, "nonsense", float("nan")]) + def test_invalid_quench_radius_falls_back_to_global(self, bad) -> None: + table = normalize_amino_acid_interactions({"TRP": {"quench_radius": bad}}) + assert table["TRP"]["quench_radius"] is None + + def test_slow_factor_is_clamped(self) -> None: + table = normalize_amino_acid_interactions({"TRP": {"slow_factor": 5.0}, "TYR": {"slow_factor": -2.0}}) + assert table["TRP"]["slow_factor"] == 1.0 + assert table["TYR"]["slow_factor"] == 0.0 + + def test_reference_defaults_scale_with_dye_size(self) -> None: + small = default_amino_acid_interactions(dye_radius=3.0) + large = default_amino_acid_interactions(dye_radius=5.0) + # The radius is centre-to-centre, so a bigger dye reaches contact sooner. + assert large["TRP"]["quench_radius"] - small["TRP"]["quench_radius"] == pytest.approx(2.0) + assert small["TRP"]["kQ"] == large["TRP"]["kQ"] + + def test_kq_scale_only_touches_quenching_residues(self) -> None: + table = default_amino_acid_interactions(kQ_scale=0.5) + assert table["TRP"]["kQ"] == pytest.approx(REFERENCE_PET_QUENCHING["TRP"]["kQ"] * 0.5) + assert table["ALA"]["kQ"] == 0.0 + assert table["ALA"]["quench_radius"] is None + + +class TestQuenchingCentres: + @pytest.fixture(scope="class") + def model(self): + donor = build_donor_from_project(_project()) + return donor + + def test_quench_centre_sits_on_the_moiety_not_on_cb(self, model) -> None: + slow, quench, names = model.residue_site_data + names = np.asarray(names) + + # Tryptophan's indole centroid is several Angstrom away from CB. + trp_offset = np.linalg.norm(slow[names == "TRP"] - quench[names == "TRP"], axis=1) + assert trp_offset.size > 0 + assert np.all(trp_offset > 2.5) + + # Methionine quenches at the thioether sulfur. + met_offset = np.linalg.norm(slow[names == "MET"] - quench[names == "MET"], axis=1) + assert np.all(met_offset > 2.0) + + # Glycine has no side chain, so both centres coincide. + gly_offset = np.linalg.norm(slow[names == "GLY"] - quench[names == "GLY"], axis=1) + assert np.allclose(gly_offset, 0.0) + + def test_custom_quench_atoms_move_the_centre(self) -> None: + donor = build_donor_from_project( + _project( + amino_acid_interactions=normalize_amino_acid_interactions( + {"TRP": {"kQ": 1.0, "quench_atoms": ["CB"]}} + ) + ) + ) + slow, quench, names = donor.residue_site_data + names = np.asarray(names) + offset = np.linalg.norm(slow[names == "TRP"] - quench[names == "TRP"], axis=1) + assert np.allclose(offset, 0.0) + + def test_per_residue_radius_falls_back_to_critical_distance(self, model) -> None: + _slow, _quench, names = model.residue_site_data + radii = model._quench_radii_for_residue_names(names) + names = np.asarray(names) + # TRP defines its own radius, ALA inherits the project critical_distance. + assert np.allclose(radii[names == "TRP"], 8.5) + assert np.allclose(radii[names == "ALA"], 8.5) + + donor = build_donor_from_project(_project(critical_distance=3.0)) + _s, _q, names2 = donor.residue_site_data + radii2 = donor._quench_radii_for_residue_names(names2) + names2 = np.asarray(names2) + assert np.allclose(radii2[names2 == "ALA"], 3.0) + assert np.allclose(radii2[names2 == "TRP"], 8.5) + + +class TestQuenchingDecomposition: + def test_contributions_split_by_residue_type(self) -> None: + # Two quenchers of different type at known positions; the dye sits on + # top of the first for every frame. + trajectory = np.zeros((10, 3)) + contributions = calculate_aa_quenching( + trajectory, + {"TRP": np.array([[0.0, 0.0, 0.0]]), "TYR": np.array([[100.0, 0.0, 0.0]])}, + quench_radii={"TRP": 2.0, "TYR": 2.0}, + quench_rates={"TRP": 3.0, "TYR": 1.0}, + ) + assert contributions["TRP"]["mean_quench_rate"] == pytest.approx(3.0) + assert contributions["TRP"]["quench_rate_fraction"] == pytest.approx(1.0) + # The out-of-range residue type is still reported, with no contribution. + assert contributions["TYR"]["mean_quench_rate"] == 0.0 + assert contributions["TYR"]["fraction_frames_quenched"] == 0.0 + + def test_overlapping_centres_add_up(self) -> None: + trajectory = np.zeros((4, 3)) + contributions = calculate_aa_quenching( + trajectory, + {"TRP": np.array([[0.5, 0.0, 0.0], [-0.5, 0.0, 0.0]])}, + quench_radii={"TRP": 2.0}, + quench_rates={"TRP": 1.5}, + ) + assert contributions["TRP"]["mean_quench_rate"] == pytest.approx(3.0) + assert contributions["TRP"]["fraction_frames_quenched"] == pytest.approx(1.0) + + def test_zero_rate_residues_are_omitted(self) -> None: + contributions = calculate_aa_quenching( + np.zeros((3, 3)), + {"ALA": np.array([[0.0, 0.0, 0.0]])}, + quench_radii={"ALA": 5.0}, + quench_rates={"ALA": 0.0}, + ) + assert contributions == {} + + def test_empty_trajectory_is_handled(self) -> None: + assert calculate_aa_quenching(None, {}, quench_radii={}, quench_rates={}) == {} + + +class TestSimulationIsResidueSpecific: + def test_result_reports_per_residue_quenching(self) -> None: + result = simulate_project(_project(attachment={"chain": "E", "residue": 155, "atom": "CB"})) + rows = {row["residue_name"]: row for row in result.aa_residence} + + quenching = {name: row for name, row in rows.items() if row["mean_quench_rate"] > 0} + assert quenching, "expected at least one residue type to quench at this site" + + # Contributions are a decomposition, so the shares sum to one. + assert sum(row["quench_rate_fraction"] for row in quenching.values()) == pytest.approx(1.0) + + for row in quenching.values(): + assert row["kQ"] > 0.0 + assert row["quench_radius"] > 0.0 + assert 0.0 <= row["fraction_frames_quenched"] <= 1.0 + + # Residues without a redox-active side chain never contribute. + assert rows["ALA"]["mean_quench_rate"] == 0.0 + assert rows["LEU"]["mean_quench_rate"] == 0.0 + + def test_disabling_a_residue_type_removes_its_contribution(self) -> None: + with_trp = simulate_project(_project(attachment={"chain": "E", "residue": 155, "atom": "CB"})) + trp_share = next( + row["quench_rate_fraction"] + for row in with_trp.aa_residence + if row["residue_name"] == "TRP" + ) + assert trp_share > 0.0 + + table = default_amino_acid_interactions(slow_factor=0.1) + table["TRP"]["kQ"] = 0.0 + without_trp = simulate_project( + _project( + attachment={"chain": "E", "residue": 155, "atom": "CB"}, + amino_acid_interactions=table, + ) + ) + trp_row = next(row for row in without_trp.aa_residence if row["residue_name"] == "TRP") + assert trp_row["mean_quench_rate"] == 0.0 + # Removing the dominant quencher must raise the quantum yield. + assert without_trp.quantum_yield_donor > with_trp.quantum_yield_donor + + def test_quenching_is_site_dependent(self) -> None: + """A site buried among aromatics must quench more than an exposed one.""" + near_aromatics = simulate_project( + _project(attachment={"chain": "E", "residue": 155, "atom": "CB"}) + ) + far_site = simulate_project(_project(attachment={"chain": "E", "residue": 10, "atom": "CB"})) + assert near_aromatics.quantum_yield_donor < far_site.quantum_yield_donor diff --git a/tests/test_coarse_grained.py b/tests/test_coarse_grained.py new file mode 100644 index 0000000..f1fdf1d --- /dev/null +++ b/tests/test_coarse_grained.py @@ -0,0 +1,141 @@ +"""Tests for the coarse-grained structure representation. + +Coarse-graining keeps the backbone plus a CB pseudo-atom placed at the +side-chain centre of mass. It is a modelling choice, not a speed optimisation: +side chains no longer block the accessible volume, and every residue's quenching +centre collapses onto that pseudo-atom. +""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest + +from quest.core import build_donor_from_project, simulate_project +from quest.core.structure import Structure +from quest.core.dye_diffusion import default_amino_acid_interactions + +PDB_PATH = Path(__file__).parent / "148l.pdb" + +# Atoms kept by the coarse representation: backbone, the CB pseudo-atom, and +# proline's CG/CD, which the ring geometry needs. +COARSE_ATOMS = {"N", "CA", "C", "O", "CB", "H", "CG", "CD"} + + +def _project(**overrides): + project = { + "tau0": 4.2, + "n_photons": 4000, + "t_max": 400.0, + "t_step": 0.02, + "dg": 0.9, + "critical_distance": 8.5, + "slow_radius": 8.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": default_amino_acid_interactions(slow_factor=0.1), + "attachment": {"chain": "E", "residue": 155, "atom": "CB"}, + "pdb": str(PDB_PATH), + "n_bins": 64, + "parallel_trajectories": 1, + "fret": {"enabled": False, "dyes": [{"name": "D0", "D": 7.0, "random_seed": 5}]}, + } + project.update(overrides) + return project + + +class TestStructureCoarseGraining: + def test_coarse_structure_drops_side_chain_atoms(self) -> None: + """Regression: this used to raise KeyError on hydrogen-free structures.""" + all_atom = Structure(str(PDB_PATH), make_coarse=False) + coarse = Structure(str(PDB_PATH), make_coarse=True, auto_update=False) + + assert coarse.is_coarse is True + assert len(coarse.atoms) < len(all_atom.atoms) + + kept = {str(name).strip().upper() for name in coarse.atoms["atom_name"]} + assert kept <= COARSE_ATOMS, f"unexpected atoms kept: {kept - COARSE_ATOMS}" + # Side-chain atoms that drive PET are gone. + assert "NE1" not in kept + assert "SD" not in kept + + def test_cb_moves_to_the_side_chain_centre_of_mass(self) -> None: + all_atom = Structure(str(PDB_PATH), make_coarse=False) + coarse = Structure(str(PDB_PATH), make_coarse=True, auto_update=False) + + def cb_of(structure, res_id: int): + atoms = structure.atoms + mask = (atoms["res_id"] == res_id) & ( + np.char.strip(atoms["atom_name"].astype(str)) == "CB" + ) + return atoms["coord"][mask] + + # Tryptophan has a large side chain, so its CB must move noticeably. + trp_ids = sorted( + { + int(atom["res_id"]) + for atom in all_atom.atoms + if str(atom["res_name"]).strip().upper() == "TRP" + } + ) + assert trp_ids + + moved = False + for res_id in trp_ids: + before, after = cb_of(all_atom, res_id), cb_of(coarse, res_id) + if len(before) and len(after): + if np.linalg.norm(before[0] - after[0]) > 1.0: + moved = True + assert moved, "coarse CB should sit at the side-chain centre of mass" + + def test_torsion_rebuild_reports_that_it_is_unavailable(self) -> None: + """The cStructure extension is not shipped; say so instead of NameError.""" + coarse = Structure(str(PDB_PATH), make_coarse=True, auto_update=False) + with pytest.raises(NotImplementedError, match="cStructure"): + coarse.update() + + +class TestCoarseGrainedSimulation: + def test_project_flag_selects_the_representation(self) -> None: + all_atom = build_donor_from_project(_project(coarse_grained=False)) + coarse = build_donor_from_project(_project(coarse_grained=True)) + + assert all_atom.coarse_grained is False + assert coarse.coarse_grained is True + assert len(coarse.structure.atoms) < len(all_atom.structure.atoms) + + def test_quench_centres_collapse_onto_cb(self) -> None: + coarse = build_donor_from_project(_project(coarse_grained=True)) + slow_centers, quench_centers, names = coarse.residue_site_data + names = np.asarray(names) + offsets = np.linalg.norm(slow_centers - quench_centers, axis=1) + + # Without side-chain atoms the quenching centre falls back to CB, which + # now sits at the side-chain centre of mass. Proline is the exception: + # its ring atoms (CG, CD) survive coarse-graining. + assert np.allclose(offsets[names != "PRO"], 0.0) + assert np.all(offsets[names == "PRO"] > 0.0) + + # The all-atom representation keeps the moiety centres distinct from CB. + all_atom = build_donor_from_project(_project(coarse_grained=False)) + slow_centers, quench_centers, names = all_atom.residue_site_data + names = np.asarray(names) + offsets = np.linalg.norm(slow_centers - quench_centers, axis=1) + assert np.all(offsets[names == "TRP"] > 2.5) + assert np.all(offsets[names == "MET"] > 2.0) + + def test_simulation_runs_and_still_attributes_quenching(self) -> None: + result = simulate_project(_project(coarse_grained=True)) + assert 0.0 < result.quantum_yield_donor <= 1.0 + assert result.av_volume and result.av_volume > 0.0 + + rows = {row["residue_name"]: row for row in result.aa_residence} + assert rows, "expected residue-type metrics" + assert rows["ALA"]["mean_quench_rate"] == 0.0 + + def test_coarse_accessible_volume_is_larger(self) -> None: + """Removing side chains frees space the dye can reach.""" + all_atom = simulate_project(_project(coarse_grained=False)) + coarse = simulate_project(_project(coarse_grained=True)) + assert coarse.av_volume > all_atom.av_volume diff --git a/tests/test_core_api.py b/tests/test_core_api.py index cb10a58..0937360 100644 --- a/tests/test_core_api.py +++ b/tests/test_core_api.py @@ -2,17 +2,41 @@ import sys from pathlib import Path +from types import SimpleNamespace from typing import Dict, Any import json +import numpy as np + # Ensure vendored quest package (modules/quest) is on sys.path -ROOT = Path(__file__).resolve().parents[3] -QUEST_ROOT = ROOT / "modules" / "quest" +ROOT = Path(__file__).resolve().parents[1] +QUEST_ROOT = ROOT / "quest" if str(QUEST_ROOT) not in sys.path: sys.path.insert(0, str(QUEST_ROOT)) -from quest.core import load_project, simulate_project, DecaySimulationResult # type: ignore[import] +from quest.core import ( # type: ignore[import] + DecaySimulationResult, + autocorr_to_tau_window, + calculate_aa_residence, + diffusion_coefficient_grid, + load_project, + simulate_project, +) +from quest.core import av as fps # type: ignore[import] +from quest.core import autocorr # type: ignore[import] + +AAS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AAS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: @@ -20,7 +44,7 @@ def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: project: Dict[str, Any] = {} - project["pdb"] = str(Path(__file__).resolve().parents[3] / "test" / "data" / "atomic_coordinates" / "pdb_files" / "148l.pdb") + project["pdb"] = str(Path(__file__).resolve().parent / "148l.pdb") project["attachment"] = {"chain": "E", "residue": 10, "atom": "CB"} project["av_parameter"] = {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5} @@ -32,14 +56,10 @@ def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: project["n_bins"] = 512 project["skip_frame"] = 10 project["tau0"] = 4.2 - project["kQ"] = 2.0 - project["slow_fact"] = 0.1 project["critical_distance"] = 6.5 - project["quencher"] = {"TYR": ["CB"]} + project["amino_acid_interactions"] = _aa_interactions(TYR={"kQ": 2.0}) project["output_file"] = "test_out" project["save_avs"] = False - project["all_quencher_atoms"] = True - project["sticky_mode"] = "quencher" dyes = [ { @@ -79,6 +99,8 @@ def test_simulate_project_core_imports() -> None: assert result.fret_counts is None assert 0.0 < result.quantum_yield_donor <= 1.0 assert 0.0 <= result.collisions_fraction <= 1.0 + assert result.trajectory_autocorr is not None + assert len(result.trajectory_autocorr) == int(np.ceil(10.0 * project["tau0"] / project["t_step"])) + 1 def test_load_project_core_roundtrip(tmp_path: Path) -> None: @@ -92,3 +114,328 @@ def test_load_project_core_roundtrip(tmp_path: Path) -> None: result = simulate_project(loaded) assert isinstance(result, DecaySimulationResult) + + +def test_slow_factor_grid_combines_overlapping_slow_factors() -> None: + density = np.ones((5, 5, 5), dtype=np.uint8) + centers = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0]], dtype=np.float64) + radii = np.array([1.1, 1.1], dtype=np.float64) + factors = np.array([0.1, 0.1], dtype=np.float64) + + grid = fps.slow_factor_grid( + density=density, + ng=5, + dg=1.0, + slow_radius=radii, + rs=centers, + r0=np.zeros(3, dtype=np.float64), + slow_fact=factors, + ) + + assert np.isclose(grid[2, 2, 2], 0.01) + assert grid[0, 0, 0] == 1.0 + + +def test_quenching_grid_adds_overlapping_kq_values() -> None: + density = np.ones((5, 5, 5), dtype=np.uint8) + centers = np.array([[0.0, 0.0, 0.0], [0.5, 0.0, 0.0]], dtype=np.float64) + radii = np.array([1.1, 1.1], dtype=np.float64) + kq_values = np.array([1.5, 2.0], dtype=np.float64) + + grid = fps.additive_factor_grid( + density=density, + ng=5, + dg=1.0, + radius=radii, + rs=centers, + r0=np.zeros(3, dtype=np.float64), + values=kq_values, + ) + + assert np.isclose(grid[2, 2, 2], 3.5) + assert grid[0, 0, 0] == 0.0 + + +def test_diffusion_coefficient_grid_reports_combined_voxel_coefficients() -> None: + density = np.ones((3, 3, 3), dtype=np.uint8) + factors = np.ones((3, 3, 3), dtype=np.float64) + factors[1, 1, 1] = 0.01 + + coefficients = diffusion_coefficient_grid( + density, + diffusion_coefficient=7.0, + slow_factor_grid=factors, + ) + + assert coefficients.dtype == np.float32 + assert np.isclose(coefficients[1, 1, 1], 0.07) + assert np.isclose(coefficients[0, 0, 0], 7.0) + + +def test_rejected_diffusion_steps_remain_at_last_accepted_position() -> None: + density = np.zeros((3, 3, 3), dtype=np.uint8) + density[1, 1, 1] = 1 + slow_density = density.copy() + slow_grid = np.ones_like(density, dtype=np.float64) + + scalar_traj, scalar_accepted, _, scalar_rejected = fps.simulate_traj( + density, slow_density, 1.0, t_max=2.0, t_step=0.1, D=100.0, slow_fact=1.0 + ) + grid_traj, grid_accepted, _, grid_rejected = fps.simulate_traj( + density, slow_density, 1.0, t_max=2.0, t_step=0.1, D=100.0, slow_fact=slow_grid + ) + + assert scalar_rejected > 0 + assert grid_rejected > 0 + assert np.allclose(scalar_traj, np.zeros_like(scalar_traj)) + assert np.allclose(grid_traj, np.zeros_like(grid_traj)) + assert scalar_accepted[0] == 1 + assert grid_accepted[0] == 1 + + +def test_simulate_diffusion_combines_parallel_trajectories() -> None: + from quest.core.dye_diffusion import SimulateDiffusion # type: ignore[import] + + density = np.zeros((3, 3, 3), dtype=np.uint8) + density[1, 1, 1] = 1 + atom_dtype = [ + ("res_name", "U3"), + ("atom_name", "U4"), + ("coord", np.float64, (3,)), + ("radius", np.float64), + ] + av = SimpleNamespace( + density_fast=density, + density_slow=density.copy(), + x0=np.zeros(3, dtype=np.float64), + dg=1.0, + structure=SimpleNamespace(atoms=np.zeros(0, dtype=atom_dtype)), + ) + + diffusion = SimulateDiffusion(av, quencher={}, verbose=False) + diffusion.run( + D=100.0, + slow_fact=1.0, + t_max=2.0, + t_step=0.1, + random_seed=7, + parallel_trajectories=3, + verbose=False, + ) + + assert diffusion._traj is not None + assert diffusion._traj.shape == (60, 3) + assert diffusion.quenched.shape == (60,) + assert diffusion.k_quench.shape == (60,) + + +def test_parallel_trajectories_minus_one_uses_all_cores_capped_at_eight(monkeypatch) -> None: + from quest.core.dye_diffusion import SimulateDiffusion # type: ignore[import] + + monkeypatch.setattr("quest.core.dye_diffusion.os.cpu_count", lambda: 12) + + assert SimulateDiffusion._resolve_parallel_trajectories(-1) == 8 + assert SimulateDiffusion._resolve_parallel_trajectories(0) == 1 + assert SimulateDiffusion._resolve_parallel_trajectories(3) == 3 + assert SimulateDiffusion._resolve_parallel_trajectories(20) == 8 + + +def test_simulate_diffusion_samples_amino_acid_quenching_grid() -> None: + from quest.core.dye_diffusion import SimulateDiffusion # type: ignore[import] + + density = np.zeros((3, 3, 3), dtype=np.uint8) + density[1, 1, 1] = 1 + k_quench_grid = np.zeros((3, 3, 3), dtype=np.float32) + k_quench_grid[1, 1, 1] = 3.5 + atom_dtype = [ + ("res_name", "U3"), + ("atom_name", "U4"), + ("coord", np.float64, (3,)), + ("radius", np.float64), + ] + av = SimpleNamespace( + density_fast=density, + density_slow=density.copy(), + k_quench_grid=k_quench_grid, + x0=np.zeros(3, dtype=np.float64), + dg=1.0, + structure=SimpleNamespace(atoms=np.zeros(0, dtype=atom_dtype)), + ) + + diffusion = SimulateDiffusion(av, quencher={}, verbose=False) + diffusion.run(D=0.0, slow_fact=1.0, t_max=0.4, t_step=0.1, random_seed=7, verbose=False) + + assert diffusion._traj is not None + assert np.allclose(diffusion.k_quench, 3.5) + assert np.all(diffusion.quenched) + + +def test_autocorr_to_tau_window_caps_lags_at_ten_tau0() -> None: + series = np.linspace(0.0, 1.0, 100, dtype=np.float64) + + capped = autocorr_to_tau_window(series, tau0=2.0, t_step=0.5) + + assert len(capped) == 41 + assert np.isclose(capped[0], 1.0) + assert np.allclose(capped, autocorr(series)[:41]) + + +def test_autocorr_to_tau_window_keeps_short_series() -> None: + series = np.linspace(0.0, 1.0, 12, dtype=np.float64) + + capped = autocorr_to_tau_window(series, tau0=2.0, t_step=0.5) + + assert len(capped) == len(series) + + +def test_calculate_aa_residence_reports_event_statistics() -> None: + trajectory = np.array( + [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [3.0, 0.0, 0.0], + [0.2, 0.0, 0.0], + [5.0, 0.0, 0.0], + ], + dtype=np.float64, + ) + residence = calculate_aa_residence( + trajectory, + { + "ASP": np.array([[0.0, 0.0, 0.0]], dtype=np.float64), + "GLU": np.array([[5.0, 0.0, 0.0]], dtype=np.float64), + }, + t_step=0.2, + radius=1.0, + effective_slow_factors={"ASP": 0.001, "GLU": 0.1}, + ) + + by_residue = {row["residue_name"]: row for row in residence} + assert by_residue["ASP"]["frames_near"] == 3 + assert by_residue["ASP"]["event_count"] == 2 + assert np.isclose(by_residue["ASP"]["total_time_ns"], 0.6) + assert np.isclose(by_residue["ASP"]["mean_event_time_ns"], 0.3) + assert np.isclose(by_residue["ASP"]["max_event_time_ns"], 0.4) + assert by_residue["ASP"]["effective_slow_factor"] == 0.001 + assert by_residue["ASP"]["attributed_frames_near"] == 3 + assert np.isclose(by_residue["ASP"]["attributed_total_time_ns"], 0.6) + assert by_residue["GLU"]["frames_near"] == 1 + + +def test_calculate_aa_residence_attributes_overlaps_to_stickiest_residue() -> None: + trajectory = np.array( + [ + [0.1, 0.0, 0.0], + [0.2, 0.0, 0.0], + [3.0, 0.0, 0.0], + ], + dtype=np.float64, + ) + residence = calculate_aa_residence( + trajectory, + { + "ASP": np.array([[0.0, 0.0, 0.0]], dtype=np.float64), + "LYS": np.array([[0.3, 0.0, 0.0]], dtype=np.float64), + }, + t_step=0.5, + radius=1.0, + effective_slow_factors={"ASP": 0.001, "LYS": 0.99}, + ) + + by_residue = {row["residue_name"]: row for row in residence} + assert by_residue["ASP"]["frames_near"] == 2 + assert by_residue["LYS"]["frames_near"] == 2 + assert by_residue["ASP"]["attributed_frames_near"] == 2 + assert by_residue["LYS"]["attributed_frames_near"] == 0 + + +def test_build_donor_uses_amino_acid_interaction_grid() -> None: + project = _make_minimal_project(with_fret=False) + project["amino_acid_interactions"] = _aa_interactions( + ASP={"slow_factor": 0.5, "kQ": 1.5}, + GLU={"slow_factor": 0.2, "kQ": 2.0}, + ) + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + av = donor.av + + assert av.slow_factor_grid is not None + assert av.k_quench_grid is not None + slow_factors = av.slow_factor_grid[av.density_slow > 0] + assert slow_factors.min() < 0.2 + assert np.isclose(slow_factors.max(), 1.0) + assert av.k_quench_grid.max() >= 2.0 + + +def test_build_donor_always_uses_whole_protein_surface_centers() -> None: + project = _make_minimal_project(with_fret=False) + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + centers, residue_names = donor.slow_center_data + + assert donor.sticky_mode == "surface" + assert len(centers) == len(residue_names) + assert len(set(residue_names)) > 1 + + +def test_build_donor_reads_parallel_trajectory_count() -> None: + project = _make_minimal_project(with_fret=False) + project["parallel_trajectories"] = 4 + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + + assert donor.parallel_trajectories == 4 + + +def test_build_donor_defaults_parallel_trajectories_to_all_cores() -> None: + project = _make_minimal_project(with_fret=False) + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + + assert donor.parallel_trajectories == -1 + + +def test_amino_acid_interactions_clamp_slow_factor_and_kq() -> None: + project = _make_minimal_project(with_fret=False) + project["amino_acid_interactions"] = _aa_interactions( + ASP={"slow_factor": 0.5, "kQ": 3.0}, + GLU={"slow_factor": 2.0, "kQ": -1.0}, + ) + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + + assert np.isclose(donor._slow_facts_for_residue_names(["ASP"])[0], 0.5) + assert np.isclose(donor._slow_facts_for_residue_names(["GLU"])[0], 1.0) + assert np.isclose(donor._slow_facts_for_residue_names(["ALA"])[0], 1.0) + assert np.isclose(donor._slow_facts_for_residue_names([b"ASP"])[0], 0.5) + assert np.isclose(donor._kq_for_residue_names(["ASP"])[0], 3.0) + assert np.isclose(donor._kq_for_residue_names(["GLU"])[0], 0.0) + + +def test_build_donor_uses_project_amino_acid_interactions_as_source_of_truth() -> None: + project = _make_minimal_project(with_fret=False) + project["slow_radius"] = 3.0 + project["amino_acid_interactions"] = _aa_interactions(ASP={"slow_factor": 0.25, "kQ": 2.0}) + donor_dye = project["fret"]["dyes"][0] + donor_dye["slow_radius"] = 8.5 + donor_dye["amino_acid_interactions"] = _aa_interactions(ASP={"slow_factor": 0.5, "kQ": 4.0}) + + from quest.core import build_donor_from_project # type: ignore[import] + + donor = build_donor_from_project(project) + + assert donor.sticky_mode == "surface" + assert donor.stickiness_mode == "amino_acid" + assert donor.slow_radius == 3.0 + assert np.isclose(donor._slow_facts_for_residue_names(["ASP"])[0], 0.25) + assert np.isclose(donor._kq_for_residue_names(["ASP"])[0], 2.0) diff --git a/tests/test_fps_json.py b/tests/test_fps_json.py new file mode 100644 index 0000000..2de5c13 --- /dev/null +++ b/tests/test_fps_json.py @@ -0,0 +1,218 @@ +import os +import json +from pathlib import Path +import pytest +from click.testing import CliRunner +import numpy as np + +from quest import api +from quest.cli import cli + +# Test with 148l.pdb which is a T4 Lysozyme structure +PDB_PATH = Path(__file__).parent / "148l.pdb" +IMP_BFF_FPS_PATH = "/Users/tpeulen/dev/imp.bff/examples/structure/T4L/fret.fps.json" + +AMINO_ACIDS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AMINO_ACIDS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions + + +def _make_project() -> dict: + project = { + "pdb": str(PDB_PATH), + "attachment": {"chain": "E", "residue": 10, "atom": "CB"}, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "dg": 1.5, # larger spacing for faster tests + "slow_radius": 8.5, + "t_max": 10.0, + "t_step": 0.05, + "n_photons": 2000, + "n_bins": 64, + "skip_frame": 10, + "tau0": 4.2, + "critical_distance": 6.5, + "amino_acid_interactions": _aa_interactions(TYR={"slow_factor": 0.1, "kQ": 2.0}), + "output_file": "test_out", + "save_avs": False, + } + + dyes = [ + { + "name": "D0", + "role": "donor", + "attachment": project["attachment"], + "av_parameter": project["av_parameter"], + "D": 7.0, + } + ] + + project["fret"] = {"enabled": False, "dyes": dyes, "R0_matrix": []} + return project + +@pytest.fixture +def base_project(): + """Returns a basic QuEst project settings dictionary.""" + return _make_project() + +def test_load_fps_json(): + """Verify that we can load and parse an fps.json file.""" + if not os.path.exists(IMP_BFF_FPS_PATH): + pytest.skip(f"Reference file not found at {IMP_BFF_FPS_PATH}") + + data = api.load_fps_json(IMP_BFF_FPS_PATH) + assert "Positions" in data + assert "Distances" in data + assert "119A" in data["Positions"] + assert data["Positions"]["119A"]["residue_seq_number"] == 119 + +def test_normalize_to_fps_positions(base_project): + """Verify normalization of old list-of-sites to the fps.json schema.""" + sites_list = [ + {"chain": "E", "residue": 10, "atom": "CB", "residue_name": "ASP"}, + {"chain": "E", "residue": 5, "atom": "CB", "residue_name": "GLU", "name": "custom_name_5"} + ] + + fps_data = api.normalize_to_fps_positions(sites_list, base_project) + assert "Positions" in fps_data + positions = fps_data["Positions"] + + assert "10E" in positions + assert "custom_name_5" in positions + + pos_5 = positions["custom_name_5"] + assert pos_5["residue_seq_number"] == 5 + assert pos_5["atom_name"] == "CB" + assert pos_5["linker_length"] == 21.5 + +def test_run_fps_scan(base_project, tmp_path): + """Verify that running a scan on a mock/slice fps.json works and returns named results.""" + fps_data = { + "Positions": { + "site_10E": { + "chain_identifier": "E", + "residue_seq_number": 10, + "atom_name": "CB", + "residue_name": "ASP", + "linker_length": 20.0, + "linker_width": 0.5, + "radius1": 3.5, + "simulation_grid_resolution": 1.5, + "simulation_type": "AV1", + } + } + } + + generator = api.run_fps_scan( + fps_data=fps_data, + pdb_path=PDB_PATH, + project=base_project, + nbins=64, + tac_range=(0.0, 10.0), + project_dir=tmp_path + ) + + results = list(generator) + assert len(results) == 1 + res = results[0] + assert res["name"] == "site_10E" + assert res["status"] == "success", f"Scan failed: {res.get('error')}" + assert "lifetime" in res + assert res["lifetime"] is not None + assert "av_volume" in res + assert res["av_volume"] is not None + assert "contact_volume" in res + assert res["contact_volume"] is not None + assert "contact_to_free_ratio" in res + assert res["contact_to_free_ratio"] is not None + +def test_cli_scan_command(base_project, tmp_path): + """Verify that the quest scan command runs headlessly using CliRunner.""" + project_file = tmp_path / "project.json" + project_file.write_text(json.dumps(base_project, indent=2), encoding="utf-8") + + labeling_file = tmp_path / "labeling.json" + labeling_data = { + "Positions": { + "site_10E": { + "chain_identifier": "E", + "residue_seq_number": 10, + "atom_name": "CB", + "residue_name": "ASP", + "linker_length": 20.0, + "linker_width": 0.5, + "radius1": 3.5, + "simulation_grid_resolution": 1.5, + "simulation_type": "AV1", + } + } + } + labeling_file.write_text(json.dumps(labeling_data, indent=2), encoding="utf-8") + + output_file = tmp_path / "scan_results.json" + + runner = CliRunner() + result = runner.invoke(cli, [ + "scan", + "-p", str(project_file), + "-l", str(labeling_file), + "--pdb", str(PDB_PATH), + "-o", str(output_file), + "--nbins", "64", + "--tac-start", "0.0", + "--tac-stop", "10.0" + ]) + + assert result.exit_code == 0, f"CLI command failed: {result.output}" + assert output_file.exists() + + scan_results = json.loads(output_file.read_text(encoding="utf-8")) + assert "site_10E" in scan_results + assert scan_results["site_10E"]["status"] == "success" + assert "lifetime" in scan_results["site_10E"] + assert "av_volume" in scan_results["site_10E"] + assert "contact_volume" in scan_results["site_10E"] + assert "contact_to_free_ratio" in scan_results["site_10E"] + + +def test_run_fps_scan_buried_residue(base_project, tmp_path): + """Verify that running a scan on a buried residue fails gracefully and reports 'failed'.""" + fps_data = { + "Positions": { + "site_buried": { + "chain_identifier": "E", + "residue_seq_number": 10, + "atom_name": "CB", + "residue_name": "ASP", + "linker_length": 0.1, + "linker_width": 0.1, + "radius1": 10.0, + "simulation_grid_resolution": 1.5, + "simulation_type": "AV1", + } + } + } + + generator = api.run_fps_scan( + fps_data=fps_data, + pdb_path=PDB_PATH, + project=base_project, + nbins=64, + tac_range=(0.0, 10.0), + project_dir=tmp_path + ) + + results = list(generator) + assert len(results) == 1 + res = results[0] + assert res["name"] == "site_buried" + assert res["status"] == "failed" + assert "error" in res + assert "Accessible Volume is empty" in res["error"] diff --git a/tests/test_fret_physics.py b/tests/test_fret_physics.py new file mode 100644 index 0000000..5d3211f --- /dev/null +++ b/tests/test_fret_physics.py @@ -0,0 +1,343 @@ +"""FRET must follow the donor's diffusion, and fail loudly when it cannot run. + +The regression these guard: `calc_fret_rate` used to reduce both accessible +volumes to a single scalar rate and add it to every frame, so the FRET channel +was completely independent of the trajectory QuEst exists to simulate. A +broken acceptor specification degraded silently to a donor-only result. +""" + +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest + +from quest.core import build_donor_from_project +from quest.core import av as fps +from quest.core.av import fret_rate_trace +from quest.project import DEFAULT_FORSTER_RADIUS, template_project + +STRUCTURE = Path(__file__).parent / "148l.pdb" + + +class TestFretRateKernel: + def test_rate_at_the_forster_radius_is_one_over_tau0(self) -> None: + """By definition transfer and emission are equally likely at r = R0.""" + donor = np.array([[0.0, 0.0, 0.0]]) + acceptor = np.array([[52.0, 0.0, 0.0]]) + rate = fret_rate_trace(donor, acceptor, R0=52.0, tau0=4.0, r_min=1.0) + assert rate[0] == pytest.approx(1.0 / 4.0) + + def test_rate_follows_the_sixth_power(self) -> None: + acceptor = np.array([[40.0, 0.0, 0.0]]) + near = fret_rate_trace(np.array([[0.0, 0.0, 0.0]]), acceptor, 50.0, 4.0, r_min=1.0)[0] + far = fret_rate_trace(np.array([[-40.0, 0.0, 0.0]]), acceptor, 50.0, 4.0, r_min=1.0)[0] + # Twice the distance is 2^6 = 64 times slower. + assert near / far == pytest.approx(64.0, rel=1e-6) + + def test_the_rate_tracks_the_donor_position(self) -> None: + acceptor = np.array([[60.0, 0.0, 0.0]]) + trajectory = np.array([[0.0, 0.0, 0.0], [20.0, 0.0, 0.0], [40.0, 0.0, 0.0]]) + rates = fret_rate_trace(trajectory, acceptor, 52.0, 4.0, r_min=1.0) + assert rates[0] < rates[1] < rates[2] + + def test_the_acceptor_volume_is_averaged_over(self) -> None: + trajectory = np.array([[0.0, 0.0, 0.0]]) + cloud = np.array([[40.0, 0.0, 0.0], [80.0, 0.0, 0.0]]) + rate = fret_rate_trace(trajectory, cloud, 52.0, 4.0, r_min=1.0)[0] + singles = [ + fret_rate_trace(trajectory, cloud[i : i + 1], 52.0, 4.0, r_min=1.0)[0] + for i in range(2) + ] + # The *rate* is averaged (fast-acceptor limit), not the distance. + assert rate == pytest.approx(sum(singles) / 2.0) + + def test_overlapping_clouds_do_not_diverge(self) -> None: + """Both clouds hold dye centres and can overlap; (R0/r)^6 must not blow up.""" + coincident = np.array([[10.0, 10.0, 10.0]]) + rate = fret_rate_trace(coincident, coincident, 52.0, 4.0, r_min=7.0)[0] + assert np.isfinite(rate) + # Equal to the rate at exactly the floor distance. + floored = fret_rate_trace( + np.array([[0.0, 0.0, 0.0]]), np.array([[7.0, 0.0, 0.0]]), 52.0, 4.0, r_min=7.0 + )[0] + assert rate == pytest.approx(floored) + + def test_an_empty_acceptor_volume_is_an_error(self) -> None: + with pytest.raises(ValueError, match="empty"): + fret_rate_trace(np.array([[0.0, 0.0, 0.0]]), np.empty((0, 3)), 52.0, 4.0) + + def test_large_clouds_are_subsampled_but_still_averaged(self) -> None: + trajectory = np.array([[0.0, 0.0, 0.0]]) + cloud = np.tile(np.array([[45.0, 0.0, 0.0]]), (5000, 1)) + rate = fret_rate_trace(trajectory, cloud, 52.0, 4.0, r_min=1.0, max_acceptor_points=64)[0] + single = fret_rate_trace(trajectory, cloud[:1], 52.0, 4.0, r_min=1.0)[0] + assert rate == pytest.approx(single) + + +def _fret_project(**overrides): + project = template_project(with_fret=True) + project["pdb"] = str(STRUCTURE) + project["attachment"] = {"chain": "E", "residue": 55, "atom": "CB"} + project["fret"]["dyes"][0]["attachment"] = dict(project["attachment"]) + project["fret"]["dyes"][1]["attachment"] = {"chain": "E", "residue": 82, "atom": "CB"} + project.update(n_photons=2000, t_max=200.0, t_step=0.05, n_bins=128, random_seed=11) + project.update(overrides) + return project + + +@pytest.fixture(scope="module") +def simulated_donor(): + model = build_donor_from_project(_fret_project()) + model.update_all(verbose=False) + return model + + +class TestFretFollowsTheTrajectory: + def test_the_rate_varies_along_the_trajectory(self, simulated_donor) -> None: + """The regression: a scalar rate made FRET blind to the diffusion.""" + rates = simulated_donor.calc_fret_rate_trace() + assert rates.shape[0] == simulated_donor.diffusion._traj.shape[0] + assert rates.min() < rates.max() + # Not a rounding wobble: the dye samples a wide range of separations. + assert rates.max() / max(rates.min(), 1e-12) > 1.5 + + def test_the_rate_is_positive_and_finite(self, simulated_donor) -> None: + rates = simulated_donor.calc_fret_rate_trace() + assert np.all(np.isfinite(rates)) + assert np.all(rates > 0.0) + + def test_efficiency_comes_from_the_two_decays(self, simulated_donor) -> None: + efficiency = simulated_donor.fret_efficiency + expected = 1.0 - simulated_donor.quantum_yield_fret / simulated_donor.quantum_yield + assert efficiency == pytest.approx(expected) + assert 0.0 < efficiency < 1.0 + + def test_rda_mean_e_stays_available_as_a_diagnostic(self, simulated_donor) -> None: + distance = simulated_donor.rda_mean_e(n_samples=5000) + # T4L 55 -> 132 with 21.5 A linkers: tens of Angstrom, not metres. + assert 10.0 < distance < 100.0 + + def test_r0_is_read_in_angstrom(self, simulated_donor) -> None: + assert simulated_donor.fret_R0 == pytest.approx(DEFAULT_FORSTER_RADIUS) + assert simulated_donor.fret_R0_angstrom == pytest.approx(DEFAULT_FORSTER_RADIUS) + + +class TestFretFailsLoudly: + def test_enabling_fret_without_an_acceptor_raises(self) -> None: + project = _fret_project() + # Keep fret enabled but drop the acceptor, the shape that used to give a + # donor-only result with no warning anywhere. + project["fret"]["dyes"] = project["fret"]["dyes"][:1] + model = build_donor_from_project(project) + model.update_all(verbose=False) + + with pytest.raises(ValueError, match="acceptor"): + model.calc_fret_rate_trace() + + def test_rates_lazily_run_the_diffusion(self) -> None: + """`DonorDecay.diffusion` simulates on first access, so rates never + silently come back empty for want of a trajectory.""" + model = build_donor_from_project(_fret_project()) + assert model._diffusion is None + + rates = model.calc_fret_rate_trace() + + assert model._diffusion is not None + assert rates.shape[0] == model.diffusion._traj.shape[0] + + +class TestThePairedRateKernel: + """`fret_rate_pair_trace`: both dyes resolved in time.""" + + def test_rate_at_the_forster_radius_is_one_over_tau0(self) -> None: + donor = np.zeros((3, 3)) + acceptor = np.zeros((3, 3)) + acceptor[:, 0] = 50.0 + rates = fps.fret_rate_pair_trace(donor, acceptor, R0=50.0, tau0=4.0, r_min=1.0) + assert rates == pytest.approx(np.full(3, 0.25)) + + def test_it_follows_the_sixth_power(self) -> None: + donor = np.zeros((2, 3)) + acceptor = np.array([[50.0, 0.0, 0.0], [100.0, 0.0, 0.0]]) + rates = fps.fret_rate_pair_trace(donor, acceptor, R0=50.0, tau0=4.0, r_min=1.0) + assert rates[0] / rates[1] == pytest.approx(64.0) + + def test_the_acceptor_moving_changes_the_rate(self) -> None: + """The whole point: a static acceptor and a moving one differ.""" + donor = np.zeros((4, 3)) + still = np.tile([50.0, 0.0, 0.0], (4, 1)) + moving = np.array([[40.0, 0, 0], [50.0, 0, 0], [60.0, 0, 0], [50.0, 0, 0]]) + a = fps.fret_rate_pair_trace(donor, still, R0=50.0, tau0=4.0, r_min=1.0) + b = fps.fret_rate_pair_trace(donor, moving, R0=50.0, tau0=4.0, r_min=1.0) + assert not np.allclose(a, b) + # r^-6 is convex, so excursions raise the mean rate above the static one. + assert b.mean() > a.mean() + + def test_overlapping_dyes_do_not_diverge(self) -> None: + coincident = np.zeros((2, 3)) + rates = fps.fret_rate_pair_trace( + coincident, coincident, R0=50.0, tau0=4.0, r_min=8.0 + ) + assert np.all(np.isfinite(rates)) + assert rates == pytest.approx(np.full(2, (50.0 / 8.0) ** 6 / 4.0)) + + def test_mismatched_lengths_are_an_error(self) -> None: + """Truncating would silently change the sampled time window.""" + with pytest.raises(ValueError, match="same number of"): + fps.fret_rate_pair_trace( + np.zeros((10, 3)), np.zeros((7, 3)), R0=50.0, tau0=4.0 + ) + + def test_an_empty_trajectory_is_an_error(self) -> None: + with pytest.raises(ValueError, match="frames"): + fps.fret_rate_pair_trace( + np.zeros((0, 3)), np.zeros((0, 3)), R0=50.0, tau0=4.0 + ) + + +class TestTheAcceptorDiffusesAndSticks: + """The acceptor is a dye in its own right, not a static cloud. + + Its diffusion coefficient, stickiness radius and interaction table are its + own; they merely *default* to the donor's, so old projects are unchanged. + """ + + def _project(self, **fret_overrides): + from quest.project import template_project + + project = template_project() + project["pdb"] = str(STRUCTURE) + project["attachment"] = {"chain": "E", "residue": 55, "atom": "CB"} + project["t_max"] = 200.0 + project["t_step"] = 0.02 + project["n_photons"] = 50_000 + project["random_seed"] = 5 + project["fret"]["enabled"] = True + project["fret"]["dyes"][1] = { + "name": "A0", + "role": "acceptor", + "attachment": {"chain": "E", "residue": 82, "atom": "CB"}, + "av_parameter": {"linker_length": 18.0, "linker_width": 0.5, "radius1": 4.0}, + "D": 2.5, + } + project["fret"].update(fret_overrides) + return project + + def test_the_acceptor_parameters_are_its_own(self) -> None: + from quest.api import build_donor_from_project + + project = self._project() + project["fret"]["dyes"][1]["slow_radius"] = 12.0 + model = build_donor_from_project(project) + + assert model.acceptor_diffusion_coefficient_value == 2.5 + assert model.diffusion_coefficient != 2.5, "the donor must be unaffected" + assert model.acceptor_slow_radius_value == 12.0 + assert model.slow_radius != 12.0 + + def test_they_default_to_the_donors(self) -> None: + """An old project says nothing about acceptor chemistry; it must still run.""" + from quest.api import build_donor_from_project + + project = self._project() + project["fret"]["dyes"][1].pop("D") + model = build_donor_from_project(project) + + assert model.acceptor_diffusion_coefficient_value == model.diffusion_coefficient + assert model.acceptor_slow_radius_value == model.slow_radius + assert model.acceptor_interactions == model.amino_acid_interactions + + def test_a_stickier_acceptor_is_a_different_dye(self) -> None: + """Per-dye stickiness must actually reach the acceptor's walk.""" + from quest.api import build_donor_from_project + + project = self._project() + project["fret"]["dyes"][1]["amino_acid_interactions"] = { + "TRP": {"slow_factor": 0.001, "kQ": 0.0, "quench_radius": None, + "quench_atoms": ["CB"]} + } + model = build_donor_from_project(project) + + assert model.acceptor_interactions["TRP"]["slow_factor"] == 0.001 + # The donor's own table is untouched by the acceptor's. + assert model.amino_acid_interactions["TRP"]["slow_factor"] != 0.001 + + def test_the_acceptor_walk_stays_inside_its_volume(self) -> None: + from quest.api import build_donor_from_project + + model = build_donor_from_project(self._project()) + trajectory = model.acceptor_diffusion._traj + assert trajectory is not None and trajectory.shape[0] > 100 + + cloud = model.acceptor_av.points + # Every frame must be within a grid step of some accessible point. + low, high = cloud.min(axis=0) - 2.0, cloud.max(axis=0) + 2.0 + assert np.all(trajectory >= low) and np.all(trajectory <= high) + + def test_the_two_walks_are_independent(self) -> None: + """Same seed for both dyes would move them in lockstep.""" + from quest.api import build_donor_from_project + + model = build_donor_from_project(self._project()) + donor = model.diffusion._traj + acceptor = model.acceptor_diffusion._traj + assert donor.shape == acceptor.shape + assert not np.allclose(donor - donor.mean(axis=0), + acceptor - acceptor.mean(axis=0)) + + def test_the_two_walks_share_a_time_base(self) -> None: + """They are paired frame by frame, so they must be pairable.""" + from quest.api import build_donor_from_project + + model = build_donor_from_project(self._project()) + assert model.diffusion.t_step == model.acceptor_diffusion.t_step + assert model.diffusion._traj.shape[0] == model.acceptor_diffusion._traj.shape[0] + + def test_the_acceptor_is_not_quenched(self) -> None: + """QuEst reports the donor's decay; the acceptor's PET is not modelled.""" + from quest.api import build_donor_from_project + + model = build_donor_from_project(self._project()) + assert not model.acceptor_diffusion.quenched.any() + + def test_the_two_regimes_disagree(self) -> None: + """If they agreed, simulating the acceptor would be pointless.""" + from quest.api import simulate_project + + moving = simulate_project( + self._project(acceptor_dynamics="trajectory"), save_outputs=False + ) + averaged = simulate_project( + self._project(acceptor_dynamics="averaged"), save_outputs=False + ) + assert moving.fret_efficiency != pytest.approx( + averaged.fret_efficiency, abs=1e-3 + ) + for result in (moving, averaged): + assert 0.0 < result.fret_efficiency < 1.0 + + def test_trajectory_is_the_default(self) -> None: + from quest.api import build_donor_from_project + + assert build_donor_from_project(self._project()).acceptor_dynamics == "trajectory" + + def test_an_unknown_regime_is_rejected(self) -> None: + from quest.api import build_donor_from_project + + with pytest.raises(ValueError, match="acceptor_dynamics"): + build_donor_from_project(self._project(acceptor_dynamics="teleport")) + + def test_a_slower_acceptor_changes_the_efficiency(self) -> None: + """Its diffusion coefficient must reach the physics, not just the schema.""" + from quest.api import simulate_project + + fast = self._project() + fast["fret"]["dyes"][1]["D"] = 20.0 + slow = self._project() + slow["fret"]["dyes"][1]["D"] = 0.5 + + assert simulate_project(fast, save_outputs=False).fret_efficiency != pytest.approx( + simulate_project(slow, save_outputs=False).fret_efficiency, abs=1e-3 + ) diff --git a/tests/test_fret_units.py b/tests/test_fret_units.py new file mode 100644 index 0000000..0415274 --- /dev/null +++ b/tests/test_fret_units.py @@ -0,0 +1,58 @@ +"""Every length in a QuEst project is in Angstrom — R0 included. + +The existing FRET tests assert only ``0 <= E <= 1``, which is true of *any* +number the model can produce, so they stayed green while the shipped template +carried a Förster radius of 5.5 (a nanometre value). At realistic +donor-acceptor distances that is a transfer rate of order 1e-6: FRET silently +switched off. These cases pin the unit instead of the range. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from quest.core import build_donor_from_project +from quest.project import DEFAULT_FORSTER_RADIUS, template_project + + +def _efficiency(r_da: float, r0: float) -> float: + """The Förster relation the simulation uses, for reference values.""" + return 1.0 / (1.0 + (r_da / r0) ** 6) + + +class TestTemplateForsterRadius: + def test_template_r0_is_a_plausible_forster_radius_in_angstrom(self) -> None: + matrix = template_project(with_fret=True)["fret"]["R0_matrix"] + r0 = matrix[0][1] + assert r0 == DEFAULT_FORSTER_RADIUS + # Real donor-acceptor pairs sit in this band in Angstrom. A nanometre + # value (~5) or a metre-ish one would fall outside it. + assert 20.0 <= r0 <= 80.0, f"R0={r0} is not a Forster radius in Angstrom" + + def test_r0_matrix_is_symmetric_with_an_empty_diagonal(self) -> None: + matrix = template_project(with_fret=True)["fret"]["R0_matrix"] + assert matrix[0][0] is None and matrix[1][1] is None + assert matrix[0][1] == matrix[1][0] + + def test_no_r0_matrix_without_an_acceptor(self) -> None: + assert "R0_matrix" not in template_project(with_fret=False)["fret"] + + def test_the_donor_picks_up_r0_from_the_matrix(self) -> None: + project = template_project(with_fret=True) + project["pdb"] = str(Path(__file__).parent / "148l.pdb") + + donor = build_donor_from_project(project) + assert donor.fret_R0 == DEFAULT_FORSTER_RADIUS + + def test_the_template_radius_gives_measurable_transfer(self) -> None: + """The failure this guards: a too-small R0 makes E vanish, not error.""" + r0 = DEFAULT_FORSTER_RADIUS + # Around R0 the pair is half-transferring; the template must land there + # for a typical labelled protein, not at zero. + assert _efficiency(r0, r0) == pytest.approx(0.5) + assert _efficiency(40.0, r0) > 0.5 + assert _efficiency(80.0, r0) > 1e-2 + # ... whereas a nanometre value is indistinguishable from no acceptor. + assert _efficiency(40.0, 5.5) < 1e-4 diff --git a/tests/test_grid_kernels.py b/tests/test_grid_kernels.py new file mode 100644 index 0000000..b28284a --- /dev/null +++ b/tests/test_grid_kernels.py @@ -0,0 +1,147 @@ +"""Equivalence and behaviour tests for the AV grid kernels. + +``subav``, ``slow_factor_grid`` and ``additive_factor_grid`` only visit the +voxels inside each centre's bounding box. These tests pin them against a +straightforward reference implementation that tests every voxel against every +centre, which is what the kernels replaced. +""" + +from __future__ import annotations + +import numpy as np +import pytest + +from quest.core.av import additive_factor_grid, slow_factor_grid, subav + + +def _reference_masks(ng, dg, radii, centers, origin): + """Boolean mask per centre, using the naive all-voxels-all-centres test.""" + offset = (ng - 1) // 2 + masks = [] + for center, radius in zip(centers, radii): + ix0 = int((center[0] - origin[0]) / dg) + offset + iy0 = int((center[1] - origin[1]) / dg) + offset + iz0 = int((center[2] - origin[2]) / dg) + offset + radius_idx = int(radius / dg) + grid = np.indices((ng, ng, ng)) + d2 = ( + (grid[0] - ix0) ** 2 + (grid[1] - iy0) ** 2 + (grid[2] - iz0) ** 2 + ) + masks.append(d2 < radius_idx * radius_idx) + return masks + + +def _reference_subav(density, ng, dg, radii, centers, origin): + masks = _reference_masks(ng, dg, radii, centers, origin) + inside = np.zeros((ng, ng, ng), dtype=bool) + for mask in masks: + inside |= mask + result = density.copy() + result[~inside] = 0 + return result + + +def _reference_slow_factor_grid(density, ng, dg, radii, centers, origin, factors): + masks = _reference_masks(ng, dg, radii, centers, origin) + grid = np.ones((ng, ng, ng), dtype=np.float64) + for mask, factor in zip(masks, factors): + grid[mask] *= factor + grid[density == 0] = 1.0 + return grid + + +def _reference_additive_grid(density, ng, dg, radii, centers, origin, values): + masks = _reference_masks(ng, dg, radii, centers, origin) + grid = np.zeros((ng, ng, ng), dtype=np.float64) + for mask, value in zip(masks, values): + grid[mask] += value + grid[density == 0] = 0.0 + return grid + + +@pytest.fixture(params=[0.4, 0.5, 1.0], ids=lambda dg: f"dg{dg}") +def scenario(request): + """A filled grid with centres placed at awkward positions.""" + dg = request.param + ng = 31 + rng = np.random.default_rng(20240726) + density = (rng.random((ng, ng, ng)) > 0.25).astype(np.uint8) + origin = np.array([1.25, -3.5, 0.75]) + # Centres inside the grid, on the edge, and fully outside it. + centers = np.array( + [ + origin + np.array([0.0, 0.0, 0.0]), + origin + np.array([2.3, -1.7, 3.1]), + origin + np.array([-4.6, 2.2, -2.8]), + origin + np.array([100.0, 0.0, 0.0]), + origin + np.array([0.0, ng * dg / 2.0, 0.0]), + ] + ) + radii = np.array([3.0, 2.0, 4.5, 5.0, 2.5]) + return density, ng, dg, radii, centers, origin + + +def test_subav_matches_reference(scenario): + density, ng, dg, radii, centers, origin = scenario + assert np.array_equal( + subav(density, ng, dg, radii, centers, origin), + _reference_subav(density, ng, dg, radii, centers, origin), + ) + + +def test_slow_factor_grid_matches_reference(scenario): + density, ng, dg, radii, centers, origin = scenario + factors = np.array([0.1, 0.5, 0.9, 0.2, 0.05]) + assert np.allclose( + slow_factor_grid(density, ng, dg, radii, centers, origin, factors), + _reference_slow_factor_grid(density, ng, dg, radii, centers, origin, factors), + ) + + +def test_additive_factor_grid_matches_reference(scenario): + density, ng, dg, radii, centers, origin = scenario + values = np.array([3.5, 2.0, 0.0, 1.67, 1.0]) + assert np.allclose( + additive_factor_grid(density, ng, dg, radii, centers, origin, values), + _reference_additive_grid(density, ng, dg, radii, centers, origin, values), + ) + + +def test_overlapping_centres_accumulate(): + """Overlapping quenchers add their rates; stickiness multiplies.""" + ng = 21 + dg = 0.5 + density = np.ones((ng, ng, ng), dtype=np.uint8) + origin = np.zeros(3) + centers = np.array([origin, origin]) + radii = np.array([2.0, 2.0]) + + additive = additive_factor_grid(density, ng, dg, radii, centers, origin, np.array([1.5, 2.5])) + assert additive[(ng - 1) // 2, (ng - 1) // 2, (ng - 1) // 2] == pytest.approx(4.0) + + multiplied = slow_factor_grid(density, ng, dg, radii, centers, origin, np.array([0.5, 0.5])) + assert multiplied[(ng - 1) // 2, (ng - 1) // 2, (ng - 1) // 2] == pytest.approx(0.25) + + +def test_zero_value_centres_do_not_contribute(): + ng = 15 + dg = 0.5 + density = np.ones((ng, ng, ng), dtype=np.uint8) + origin = np.zeros(3) + centers = np.array([origin]) + grid = additive_factor_grid(density, ng, dg, np.array([3.0]), centers, origin, np.array([0.0])) + assert np.count_nonzero(grid) == 0 + + +def test_empty_voxels_are_left_untouched(): + ng = 15 + dg = 0.5 + density = np.zeros((ng, ng, ng), dtype=np.uint8) + origin = np.zeros(3) + centers = np.array([origin]) + assert np.count_nonzero( + additive_factor_grid(density, ng, dg, np.array([5.0]), centers, origin, np.array([2.0])) + ) == 0 + assert np.all( + slow_factor_grid(density, ng, dg, np.array([5.0]), centers, origin, np.array([0.1])) == 1.0 + ) diff --git a/tests/test_imp_tricks_bridge.py b/tests/test_imp_tricks_bridge.py new file mode 100644 index 0000000..731be9d --- /dev/null +++ b/tests/test_imp_tricks_bridge.py @@ -0,0 +1,308 @@ +"""Splicing an imp-tricks checkout into the live interpreter. + +General fluorescence machinery lives in imp-tricks under ``IMP.bff`` +(okf/specs/imp-tricks-dedup.md). Reaching it from a checkout is not just a +``sys.path`` entry: where IMP is compiled, ``IMP`` and ``IMP.bff`` are regular +packages that shadow the checkout entirely. +""" + +from __future__ import annotations + +import importlib +from pathlib import Path + +import pytest + +from quest.imp_tricks import enable_imp_tricks, imp_tricks_src + +pytestmark = pytest.mark.skipif( + imp_tricks_src() is None, reason="no imp-tricks checkout found" +) + + +def test_the_checkout_is_found() -> None: + src = imp_tricks_src() + assert src is not None and (src / "IMP" / "bff").is_dir() + + +def test_enabling_reports_the_subpackages() -> None: + enabled = enable_imp_tricks() + assert "IMP.bff" in enabled + assert "IMP.cgmol" in enabled + + +def test_the_general_fluorescence_modules_become_importable() -> None: + enable_imp_tricks() + compute_av = importlib.import_module("IMP.bff.av").compute_av + assert callable(compute_av) + + metrics = importlib.import_module("IMP.bff.distance_metrics") + # At r = R0 transfer and emission are equally likely. + assert metrics.fret_efficiency(52.0, 52.0) == pytest.approx(0.5) + + +def test_a_compiled_imp_bff_is_not_displaced() -> None: + """The checkout must sit *alongside* a compiled IMP.bff, not replace it.""" + imp_bff = importlib.import_module("IMP.bff") + had_compiled_av = hasattr(imp_bff, "AV") + + enable_imp_tricks() + + assert hasattr(importlib.import_module("IMP.bff"), "AV") == had_compiled_av + assert callable(importlib.import_module("IMP.bff.av").compute_av) + + +def test_enabling_twice_changes_nothing() -> None: + first = enable_imp_tricks() + before = list(importlib.import_module("IMP.bff").__path__) + second = enable_imp_tricks() + after = list(importlib.import_module("IMP.bff").__path__) + assert first == second + assert before == after + + +def test_a_missing_checkout_is_not_an_error(tmp_path) -> None: + assert enable_imp_tricks(tmp_path / "nowhere") == [] + + +def test_importing_quest_bridges_the_checkout_automatically() -> None: + """No ceremony: using QuEst is enough to reach imp-tricks from source.""" + imp_av = importlib.import_module("quest.core.imp_av") + assert "IMP.bff" in imp_av.IMP_TRICKS_ENABLED + assert imp_av.imp_tricks_av_available() + + +def test_the_compiled_and_source_avs_are_distinguished() -> None: + """``HAS_IMP_BFF`` is about the compiled decorator, not imp-tricks' module. + + Conflating them is what made QuEst select a broken backend: the flag was + read as "imp-tricks is available" when it means "IMP was built with bff". + """ + imp_av = importlib.import_module("quest.core.imp_av") + compiled = imp_av.HAS_IMP_BFF + from_source = imp_av.imp_tricks_av_available() + assert isinstance(compiled, bool) and isinstance(from_source, bool) + # The checkout is present in this test session, the compiled decorator may + # or may not be — they are independent. + assert from_source is True + + +class TestTheUpstreamAvMatchesQuEsts: + """The precondition for deleting QuEst's AV: upstream must agree exactly. + + `DUP-01` is the largest deletion QuEst has left — `imp_av.py` and the `AV` + class both become `IMP.bff.av.compute.compute_av`. That is only safe while + the two produce the *same volume*, so this pins it. It skips wherever + imp-tricks or LabelLib is missing, which includes the base environment. + """ + + STRUCTURE = Path(__file__).parent / "148l.pdb" + # Re-picked with the move to IMP radii: residue 15 has no accessible + # volume any more, so it cannot compare two backends. + SITE = dict(chain="E", residue=118, atom="CB") + AV_PARAMS = dict(linker_length=21.5, linker_width=0.5, radius1=3.5) + + @pytest.fixture(scope="class") + def clouds(self): + pytest.importorskip("LabelLib", reason="LabelLib is not installed") + from quest.imp_tricks import enable_imp_tricks + + enable_imp_tricks() + compute = pytest.importorskip( + "IMP.bff.av.compute", reason="imp-tricks checkout not reachable" + ) + if not getattr(compute, "_HAS_LABELLIB", False): + pytest.skip("imp-tricks reports no usable LabelLib backend") + + import numpy as np + + from quest.core.av import AV + from quest.core.structure import Structure + + structure = Structure(str(self.STRUCTURE)) + atoms = structure.atoms + xyz = np.ascontiguousarray(atoms["coord"], dtype=np.float64) + vdw = np.ascontiguousarray(atoms["radius"], dtype=np.float64) + + def _text(values): + return np.array( + [v.decode().strip() if isinstance(v, bytes) else str(v).strip() + for v in values] + ) + + selected = np.flatnonzero( + (_text(atoms["chain"]) == self.SITE["chain"]) + & (atoms["res_id"] == self.SITE["residue"]) + & (_text(atoms["atom_name"]) == self.SITE["atom"]) + ) + assert selected.size, "the labeling site is not in the structure" + + upstream = np.asarray( + compute.compute_av( + xyz, vdw, xyz[selected[0]], + linker_length=self.AV_PARAMS["linker_length"], + linker_width=self.AV_PARAMS["linker_width"], + dye_radii=(self.AV_PARAMS["radius1"], 0.0, 0.0), + grid_resolution=0.5, + backend="labellib", + ).points + )[:, :3] + + own = AV( + structure, + residue_seq_number=self.SITE["residue"], + atom_name=self.SITE["atom"], + chain_identifier=self.SITE["chain"], + simulation_grid_resolution=0.5, + save_av=False, + verbose=False, + **self.AV_PARAMS, + ).points + return upstream, own + + def test_the_volumes_are_not_empty(self, clouds) -> None: + """Upstream used to return nothing at all, silently.""" + upstream, own = clouds + assert upstream.shape[0] > 1000 + assert own.shape[0] > 1000 + + def test_the_volumes_are_identical(self, clouds) -> None: + import numpy as np + + upstream, own = clouds + assert upstream.shape == own.shape + a = upstream[np.lexsort(upstream.T)] + b = own[np.lexsort(own.T)] + np.testing.assert_array_equal(a, b) + + +class TestTheImpBackendIsNotReadyToBePrimary: + """Why `AV_BACKENDS` still starts with LabelLib. + + The intended order is IMP.bff first, LabelLib only where IMP.bff is not + built. These pin the two defects that stop it, so the day they are fixed the + tests fail and say so, rather than the ordering staying wrong by inertia. + """ + + def test_the_imp_backend_uses_the_structure_it_is_given(self) -> None: + """Fixed 2026-07-27: it used to re-read the file from disk. + + That discarded every in-memory transformation, so a coarse-grained + project silently got the all-atom volume, and `.cif` failed because the + re-read was `read_pdb` only. It now builds the IMP model from the atom + array, which makes both impossible — and means format support lives in + exactly one place (okf/specs/structure-io.md). + """ + import inspect + + from quest.core import imp_av + + source = inspect.getsource(imp_av.build_imp_accessible_volume) + assert "read_pdb" not in source and "read_mmcif" not in source, ( + "the IMP backend is parsing files again; it must take the atom array" + ) + assert "structure.atoms" in source + + def test_labellib_is_still_first(self) -> None: + from quest.core.av import AV_BACKENDS + + assert AV_BACKENDS[0] == "labellib", ( + "IMP.bff was promoted; make sure the coarse-graining and mmCIF " + "defects above are actually fixed first" + ) + + def test_the_allowed_sphere_floor_is_enforced(self) -> None: + """Below ~2 A IMP's path search starts nowhere and returns nothing.""" + from quest.core.av import MIN_IMP_ALLOWED_SPHERE_RADIUS + + assert MIN_IMP_ALLOWED_SPHERE_RADIUS >= 2.0 + + +class TestTheImpAvBackendRuns: + """Exercise the IMP.bff path itself, which the suite otherwise never enters. + + `AV_BACKENDS` starts with LabelLib, so every other test takes that branch. + `build_imp_accessible_volume` shipped a `Model.get_particles()` call that + does not exist and nothing noticed — a whole backend with no coverage. + """ + + STRUCTURE = Path(__file__).parent / "148l.pdb" + SITE = dict(residue_seq_number=36, atom_name="CB", chain_identifier="E") + PARAMS = dict( + linker_length=21.5, + linker_width=0.5, + radii=(3.5, 0.0, 0.0), + allowed_sphere_radius=2.0, + simulation_grid_resolution=0.5, + ) + + @pytest.fixture(scope="class") + def structure(self): + self._require_compiled_imp_bff() + from quest.core.structure import Structure + + return Structure(str(self.STRUCTURE), make_coarse=False) + + @staticmethod + def _require_compiled_imp_bff(): + """`import IMP.bff` succeeding is not enough. + + In the base environment the *source* `IMP.bff` from the imp-tricks + checkout imports fine — there is no compiled one to shadow it — but the + C++ `IMP.bff.AV` this backend needs is absent. `HAS_IMP_BFF` is the + flag that actually asks that question. + """ + from quest.core.imp_av import HAS_IMP_BFF + + if not HAS_IMP_BFF: + pytest.skip("no compiled IMP.bff (the C++ AV class) in this interpreter") + + def _build(self, structure): + from quest.core.imp_av import build_imp_accessible_volume + + return build_imp_accessible_volume(structure, **self.SITE, **self.PARAMS) + + def test_it_produces_a_volume(self, structure) -> None: + result = self._build(structure) + assert result.points.shape[0] > 10_000 + assert result.points.shape[1] == 3 + + def test_it_agrees_with_labellib_now_that_radii_are_shared(self, structure) -> None: + """Both backends read the same atom array, so they can only differ by + algorithm. They came 22 % apart while QuEst kept its own radius table; + with IMP's radii used for both, the gap is ~10 %.""" + from quest.core.av import AV + + labellib = AV( + structure, + residue_seq_number=self.SITE["residue_seq_number"], + atom_name=self.SITE["atom_name"], + chain_identifier=self.SITE["chain_identifier"], + simulation_grid_resolution=0.5, + save_av=False, + verbose=False, + linker_length=21.5, + linker_width=0.5, + radius1=3.5, + ).points + imp = self._build(structure).points + + ratio = imp.shape[0] / labellib.shape[0] + assert 0.8 < ratio < 1.2, f"backends diverged: IMP/LabelLib = {ratio:.2f}" + centroid_gap = float( + ((imp.mean(axis=0) - labellib.mean(axis=0)) ** 2).sum() ** 0.5 + ) + assert centroid_gap < 2.0, f"backends disagree on position by {centroid_gap:.1f} A" + + def test_it_honours_the_structure_it_is_given(self) -> None: + """The defect this replaced: it re-read the file, so coarse-graining + was silently discarded and coarse came out identical to all-atom.""" + self._require_compiled_imp_bff() + from quest.core.structure import Structure + + all_atom = self._build(Structure(str(self.STRUCTURE), make_coarse=False)) + coarse = self._build(Structure(str(self.STRUCTURE), make_coarse=True)) + assert coarse.points.shape[0] != all_atom.points.shape[0], ( + "coarse-grained and all-atom gave the same volume — the backend is " + "reading the file again instead of the structure" + ) diff --git a/tests/test_mc4r.py b/tests/test_mc4r.py new file mode 100644 index 0000000..3b5d9bf --- /dev/null +++ b/tests/test_mc4r.py @@ -0,0 +1,74 @@ +from __future__ import annotations + +import sys +from pathlib import Path +from typing import Dict, Any + +# Ensure quest is importable +ROOT = Path(__file__).resolve().parents[1] +QUEST_ROOT = ROOT / "quest" +if str(QUEST_ROOT) not in sys.path: + sys.path.insert(0, str(QUEST_ROOT)) + +from quest.api import simulate_project, DecaySimulationResult + +AMINO_ACIDS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AMINO_ACIDS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions + + +def test_mc4r_simulation() -> None: + cif_path = ROOT / "tests" / "data" / "mc4r_dimer.cif" + assert cif_path.exists(), f"Test CIF file not found at {cif_path}" + + project: Dict[str, Any] = { + "pdb": str(cif_path), + "attachment": { + "chain": "A", + # Re-picked with the move to IMP radii: A1 and A2 no longer have an + # accessible volume at this grid resolution. (A1 still does at + # dg = 1.0 — burial is resolution-dependent, since a coarser grid + # cannot resolve the atoms that close the pocket.) + "residue": 3, + "atom": "CB", + }, + "av_parameter": { + "linker_length": 21.5, + "linker_width": 0.5, + "radius1": 3.5, + }, + "dg": 0.5, + "slow_radius": 8.5, + "t_max": 200.0, + "t_step": 0.02, + "n_photons": 1000, + "n_bins": 512, + "tau0": 4.0, + "critical_distance": 5.0, + "amino_acid_interactions": _aa_interactions( + HIS={"slow_factor": 0.05, "kQ": 2.0}, + TRP={"slow_factor": 0.05, "kQ": 2.0}, + TYR={"slow_factor": 0.05, "kQ": 2.0}, + ), + "output_file": "out_test", + "save_avs": False, + "fret": {"enabled": False, "dyes": [{"D": 40.0}], "R0_matrix": []} + } + + result = simulate_project(project) + + assert isinstance(result, DecaySimulationResult) + assert result.time.ndim == 1 + assert result.donor_counts.ndim == 1 + assert result.time.shape == result.donor_counts.shape + assert result.fret_counts is None + assert 0.0 < result.quantum_yield_donor <= 1.0 + assert 0.0 <= result.collisions_fraction <= 1.0 diff --git a/tests/test_simulation_performance.py b/tests/test_simulation_performance.py new file mode 100644 index 0000000..dc52639 --- /dev/null +++ b/tests/test_simulation_performance.py @@ -0,0 +1,194 @@ +"""Tests for the scan-oriented fast path and for seeded reproducibility. + +A residue scan runs the same simulation hundreds of times and only reads the +scalar metrics, so `simulate_project(save_outputs=False)` skips the per-run job +directory. Separately, a project that pins ``random_seed`` must produce the same +numbers every time, including when several sites are simulated on worker +threads. +""" + +from __future__ import annotations + +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path + +import numpy as np +import pytest + +from quest.core import simulate_project +from quest.core.av import density2points +from quest.core.dye_diffusion import default_amino_acid_interactions +from quest.core.photon import simulate_photon_trace_rate + +PDB_PATH = Path(__file__).parent / "148l.pdb" + +# Sites in 148L chain E that carry a CB, have room for the dye, and sit close +# enough to quenchers that the quantum yield actually moves; a site with +# QY == 1.0 would pass a reproducibility check trivially. +# +# Re-picked 2026-07-27 when radii moved to IMP's (CHARMM-style, ~19 % larger +# than the Bondi values QuEst used to carry). Fatter atoms close pockets: 15 +# and 17 have no accessible volume at all now, and only 43 of 151 CB sites on +# this chain remain labelable. QY under *this* project: 18 → 0.75, 96 → 0.09, +# 36 → 0.97. (The quantum yield depends on the project, not just the site: +# 118 quenches under the template but not under this one's chemistry.) +QUENCHED_SITES = (18, 96, 36) + + +def _project(residue: int, *, seed: int | None = 5, **overrides): + donor = {"name": "D0", "D": 7.0} + if seed is not None: + donor["random_seed"] = seed + project = { + "tau0": 4.2, + "n_photons": 4000, + "t_max": 400.0, + "t_step": 0.02, + "dg": 0.5, + "critical_distance": 8.5, + "slow_radius": 8.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": default_amino_acid_interactions(slow_factor=0.1), + "attachment": {"chain": "E", "residue": residue, "atom": "CB"}, + "pdb": str(PDB_PATH), + "n_bins": 64, + "parallel_trajectories": 1, + "fret": {"enabled": False, "dyes": [donor]}, + } + project.update(overrides) + return project + + +class TestSaveOutputs: + def test_no_job_directory_is_written(self, tmp_path: Path) -> None: + simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path, save_outputs=False) + assert not (tmp_path / "jobs").exists() + + def test_job_directory_is_written_by_default(self, tmp_path: Path) -> None: + simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path) + jobs = list((tmp_path / "jobs").iterdir()) + assert len(jobs) == 1 + written = {path.name for path in jobs[0].iterdir()} + assert "result.json" in written + assert "av.mrc" in written + + def test_scalar_metrics_survive_the_fast_path(self, tmp_path: Path) -> None: + """Everything a scan reports must still be there without the artefacts.""" + full = simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path) + fast = simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path, save_outputs=False) + + assert fast.quantum_yield_donor == pytest.approx(full.quantum_yield_donor) + assert fast.collisions_fraction == pytest.approx(full.collisions_fraction) + assert fast.av_volume == pytest.approx(full.av_volume) + assert fast.contact_volume == pytest.approx(full.contact_volume) + assert fast.contact_to_free_ratio == pytest.approx(full.contact_to_free_ratio) + + by_name = {row["residue_name"]: row for row in fast.aa_residence} + assert by_name, "aa_residence drives the scan's 'Quenched by' column" + for row in full.aa_residence: + assert by_name[row["residue_name"]]["mean_quench_rate"] == pytest.approx( + row["mean_quench_rate"] + ) + + def test_viewer_point_clouds_follow_render_data_not_save_outputs( + self, tmp_path: Path + ) -> None: + """Two questions, two flags. + + The thinned clouds exist for a plot or a 3D viewer; the job directory + exists for the filesystem. Gating both on `save_outputs` cost the Qt + form its trajectory and AV plots, because it passes `save_outputs=False` + to keep a GUI run from writing `jobs/` into the working directory. + """ + scan = simulate_project( + _project(QUENCHED_SITES[0]), project_dir=tmp_path, save_outputs=False, render_data=False + ) + assert scan.av_points is None + assert scan.acv_points is None + assert scan.trajectory_points is None + + gui = simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path, save_outputs=False) + assert not (tmp_path / "jobs").exists(), "a GUI run must write nothing" + assert gui.av_points is not None + assert gui.trajectory_distance_to_mean is not None + + full = simulate_project(_project(QUENCHED_SITES[0]), project_dir=tmp_path) + assert full.av_points is not None + assert full.acv_points is not None + + +class TestSeededReproducibility: + @pytest.mark.parametrize("residue", QUENCHED_SITES) + def test_repeated_runs_agree(self, residue: int, tmp_path: Path) -> None: + """Regression: the photon trace used to ignore ``random_seed``.""" + yields = [ + simulate_project( + _project(residue), project_dir=tmp_path, save_outputs=False + ).quantum_yield_donor + for _ in range(3) + ] + assert len(set(yields)) == 1, f"non-reproducible quantum yields: {yields}" + assert 0.0 < yields[0] < 1.0, "pick a site where quenching actually happens" + + def test_worker_threads_agree_with_the_main_thread(self, tmp_path: Path) -> None: + """Numba keeps RNG state per thread, so a seeded run must not drift.""" + + def run(residue: int) -> float: + return simulate_project( + _project(residue), project_dir=tmp_path, save_outputs=False + ).quantum_yield_donor + + sequential = [run(residue) for residue in QUENCHED_SITES] + with ThreadPoolExecutor(max_workers=len(QUENCHED_SITES)) as executor: + threaded = list(executor.map(run, QUENCHED_SITES)) + assert sequential == threaded + + def test_an_unseeded_project_still_varies(self, tmp_path: Path) -> None: + """Compare the decay curves, not the quantum yield. + + At a site the dye rarely reaches a quencher the yield saturates at 1.0, + so four independent runs legitimately report the same scalar and the + test used to fail at random. The photon arrival times differ every run + regardless, which is what "the Monte-Carlo run did not repeat" means. + """ + decays = { + simulate_project( + _project(QUENCHED_SITES[0], seed=None), project_dir=tmp_path, save_outputs=False + ).donor_counts.tobytes() + for _ in range(4) + } + assert len(decays) == 4, "without a seed the Monte-Carlo run should not repeat" + + def test_photon_trace_honours_its_seed(self) -> None: + rates = np.linspace(0.0, 0.4, 512).astype(np.float32) + first = simulate_photon_trace_rate(2000, rates, t_step=0.02, tau0=4.0, random_seed=11) + second = simulate_photon_trace_rate(2000, rates, t_step=0.02, tau0=4.0, random_seed=11) + other = simulate_photon_trace_rate(2000, rates, t_step=0.02, tau0=4.0, random_seed=12) + + assert np.array_equal(first[0], second[0]) + assert np.array_equal(first[1], second[1]) + assert not np.array_equal(first[1], other[1]) + + +class TestDensityToPoints: + def test_matches_a_plain_python_scan_of_the_grid(self) -> None: + """The jitted kernel replaced a Python triple loop; keep them equivalent.""" + rng = np.random.default_rng(3) + nx, ny, nz = 7, 5, 6 + grid = np.asfortranarray(rng.normal(size=(nx, ny, nz))) + + expected = [ + (ix * 0.5 - 1.0, iy * 0.5 + 2.0, iz * 0.5 + 0.25) + for iz in range(nz) + for iy in range(ny) + for ix in range(nx) + if grid[ix, iy, iz] > 0.0 + ] + points = density2points(nx, ny, nz, 0.5, grid, (-1.0, 2.0, 0.25)) + + assert points.shape == (len(expected), 3) + assert np.allclose(points, np.array(expected)) + + def test_an_empty_grid_yields_no_points(self) -> None: + grid = np.zeros((4, 4, 4)) + assert density2points(4, 4, 4, 0.5, grid, (0.0, 0.0, 0.0)).shape == (0, 3) From d4d46d244dd40f2174c9558dc384606ba0ab3a28 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 19:00:13 +0200 Subject: [PATCH 05/86] feat: add the service layer every surface calls through Logic that lived in a surface cannot be reached from the others, and that is how the GUI came to ship different quenching chemistry from the CLI for as long as nobody looked. This adds the layer that makes that structurally impossible. - backend/dispatcher.py registers QuEst's capabilities as named RPC methods behind a single envelope, {ok: true, result} or {ok: false, error}, so callers never sniff for a field to tell success from failure. It is deliberately small: a host application can pass its own dispatcher to register_services() instead, since registration only needs register(name, handler). - backend/services.py registers the methods themselves. manifest.json declares them, along with the state schema, so a host can learn what QuEst offers without importing it. - project.py owns the project-JSON contract - the one document the CLI, the web backend, the GUI and notebooks all exchange. - jobs.py owns the run directory; scan.py the labelling scan; structure_fetch.py fetching a structure by PDB ID; structure_info.py the chain, residue and site inventory a caller needs before it can choose an attachment site. The CLI is rewritten as a thin wrapper over these methods rather than a second implementation, which is most of its diff. --- quest/api.py | 26 ++ quest/backend/__init__.py | 18 + quest/backend/dispatcher.py | 125 +++++++ quest/backend/services.py | 282 ++++++++++++++++ quest/cli.py | 276 +++++++++------ quest/jobs.py | 170 ++++++++++ quest/manifest.json | 465 ++++++++++++++++++++++++++ quest/project.py | 174 ++++++++++ quest/scan.py | 197 +++++++++++ quest/structure_fetch.py | 113 +++++++ quest/structure_info.py | 210 ++++++++++++ tests/test_api.py | 109 +++++- tests/test_cli.py | 111 +++++- tests/test_cli_smoke.py | 25 +- tests/test_jobs_and_structure_info.py | 139 ++++++++ tests/test_pdb_id_support.py | 164 +++++++++ tests/test_scan_reporting.py | 143 ++++++++ tests/test_service_layer.py | 314 +++++++++++++++++ tests/test_use_cases.py | 158 +++++++++ 19 files changed, 3092 insertions(+), 127 deletions(-) create mode 100644 quest/backend/__init__.py create mode 100644 quest/backend/dispatcher.py create mode 100644 quest/backend/services.py create mode 100644 quest/jobs.py create mode 100644 quest/manifest.json create mode 100644 quest/project.py create mode 100644 quest/scan.py create mode 100644 quest/structure_fetch.py create mode 100644 quest/structure_info.py create mode 100644 tests/test_jobs_and_structure_info.py create mode 100644 tests/test_pdb_id_support.py create mode 100644 tests/test_scan_reporting.py create mode 100644 tests/test_service_layer.py create mode 100644 tests/test_use_cases.py diff --git a/quest/api.py b/quest/api.py index 73d4bcb..77b4ef7 100644 --- a/quest/api.py +++ b/quest/api.py @@ -32,6 +32,22 @@ build_donor_from_project, load_project, simulate_project, + top_quenchers, +) +from .project import ( + ProjectValidationError, + template_project, + validate_project, +) +from .structure_fetch import ( + download_pdb_id, + is_pdb_id, + resolve_structure_path, +) +from .core.fps_json import ( + load_fps_json, + normalize_to_fps_positions, + run_fps_scan, ) __all__ = [ @@ -39,4 +55,14 @@ "load_project", "simulate_project", "build_donor_from_project", + "top_quenchers", + "ProjectValidationError", + "template_project", + "validate_project", + "download_pdb_id", + "is_pdb_id", + "resolve_structure_path", + "load_fps_json", + "normalize_to_fps_positions", + "run_fps_scan", ] diff --git a/quest/backend/__init__.py b/quest/backend/__init__.py new file mode 100644 index 0000000..05a91dd --- /dev/null +++ b/quest/backend/__init__.py @@ -0,0 +1,18 @@ +"""QuEst's service layer: named operations behind one call contract. + +See :mod:`quest.backend.services` for the method table and +:mod:`quest.backend.dispatcher` for the envelope and the in-process client. +""" + +from .dispatcher import InProcessClient, RemoteError, ServiceDispatcher +from .services import METHODS, local_client, register_services, result_payload + +__all__ = [ + "InProcessClient", + "RemoteError", + "ServiceDispatcher", + "METHODS", + "local_client", + "register_services", + "result_payload", +] diff --git a/quest/backend/dispatcher.py b/quest/backend/dispatcher.py new file mode 100644 index 0000000..d4ba8a8 --- /dev/null +++ b/quest/backend/dispatcher.py @@ -0,0 +1,125 @@ +"""A minimal RPC dispatcher and in-process client. + +QuEst exposes its capabilities as named methods so that every surface — the +CLI, the web backend, the desktop GUI, and a host application that loads QuEst +as a plugin — calls the *same* operation under the *same* name with the same +result shape. + +This module is deliberately small: it exists so QuEst works standalone. When a +host application provides its own dispatcher, pass that one to +:func:`quest.backend.services.register_services` instead — the registration only +needs a ``register(name, handler)`` method, so the two interoperate without +QuEst depending on the host. + +The envelope every handler returns:: + + {"ok": True, "result": } + {"ok": False, "error": ""} + +Callers distinguish success from failure by ``ok``, never by sniffing for the +presence of a field. +""" + +from __future__ import annotations + +from typing import Any, Callable, Dict, Optional + +__all__ = ["ServiceDispatcher", "InProcessClient", "RemoteError", "ok", "fail"] + +Handler = Callable[[Dict[str, Any]], Dict[str, Any]] + + +class RemoteError(RuntimeError): + """Raised by a client when a call fails.""" + + +def ok(result: Any) -> dict[str, Any]: + """Wrap *result* in a success envelope.""" + + return {"ok": True, "result": result} + + +def fail(error: str) -> dict[str, Any]: + """Wrap *error* in a failure envelope.""" + + return {"ok": False, "error": error} + + +class ServiceDispatcher: + """Maps method names to handlers. + + A handler takes a single params mapping and returns an envelope. Handlers + are not expected to raise: :meth:`dispatch` converts an escaped exception + into a failure envelope so a caller never has to handle both styles. + """ + + def __init__(self) -> None: + self._handlers: dict[str, Handler] = {} + + def register(self, name: str, handler: Handler) -> None: + """Register *handler* under *name*. + + Raises + ------ + ValueError + If *name* is already registered. One operation, one name: a silent + overwrite would make which implementation runs depend on import + order. + """ + + if name in self._handlers: + raise ValueError(f"RPC method already registered: {name}") + self._handlers[name] = handler + + @property + def methods(self) -> list[str]: + """The registered method names, sorted.""" + + return sorted(self._handlers) + + def dispatch( + self, method: str, params: Optional[Dict[str, Any]] = None + ) -> dict[str, Any]: + """Call *method* with *params* and return its envelope.""" + + handler = self._handlers.get(method) + if handler is None: + return fail(f"Unknown method: {method}") + try: + return handler(params or {}) + except Exception as exc: # handlers should not raise; be safe anyway + return fail(f"{type(exc).__name__}: {exc}") + + +class InProcessClient: + """Client that calls a dispatcher directly, with no transport in between. + + Presentation code holds a client, not a dispatcher, so that swapping in a + remote transport later changes nothing at the call sites. + """ + + def __init__(self, dispatcher: ServiceDispatcher) -> None: + self._dispatcher = dispatcher + + def call( + self, method: str, params: Optional[Dict[str, Any]] = None + ) -> dict[str, Any]: + """Execute *method* and return the response envelope.""" + + return self._dispatcher.dispatch(method, params) + + def result( + self, method: str, params: Optional[Dict[str, Any]] = None + ) -> Any: + """Execute *method* and return its result, raising on failure. + + Raises + ------ + RemoteError + If the call returned a failure envelope. + """ + + response = self.call(method, params) + if not response.get("ok"): + raise RemoteError(response.get("error", "unknown error")) + return response.get("result") diff --git a/quest/backend/services.py b/quest/backend/services.py new file mode 100644 index 0000000..3884580 --- /dev/null +++ b/quest/backend/services.py @@ -0,0 +1,282 @@ +"""QuEst's RPC surface: the operations every front end shares. + +Each handler takes plain data, calls the domain, and returns the envelope +described in :mod:`quest.backend.dispatcher`. Nothing here computes anything — +if a handler grows logic, that logic belongs in the domain where the CLI and +notebooks can reach it too. + +Registering with a host application's dispatcher is the whole point of the +split: :func:`register_services` only needs an object with +``register(name, handler)``, so ChiSurf (or any other host) can expose QuEst +without QuEst importing the host. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any, Mapping, Optional + +from .. import jobs, settings +from .dispatcher import InProcessClient, ServiceDispatcher, fail, ok + +__all__ = ["register_services", "local_client", "METHODS", "result_payload"] + +#: Method names in registration order, with a one-line summary each. This is +#: the table a manifest declares and a host advertises. +METHODS: dict[str, str] = { + "quest.template": "Return a minimal valid project, optionally with FRET.", + "quest.validate": "Check a project and report why it is malformed.", + "quest.simulate": "Run one simulation and return the decay and derived metrics.", + "quest.scan": "Simulate a set of labeling sites and return one record each.", + "quest.parameter_catalog": "Return the parameter catalog (labels, units, help), optionally translated.", + "quest.locales": "List the languages QuEst's labels and help text are available in.", + "quest.dyes.list": "Return the dye presets.", + "quest.dyes.save": "Add or replace a dye preset.", + "quest.quenching_defaults": "Return the residue-type PET chemistry defaults.", + "quest.structure.metadata": "Return the chains, residues and atoms of a structure file.", + "quest.jobs.list": "Return job summaries, newest first.", + "quest.jobs.get": "Return a finished run's result.", +} + + +def result_payload(result: Any) -> dict[str, Any]: + """Convert a :class:`~quest.core.DecaySimulationResult` to plain data. + + Arrays become lists and absent channels stay ``None``. This is the boundary + shape: whatever crosses to a browser, a host application or a file goes + through here, so there is one definition of what a simulation result *is*. + """ + + def _list(value: Any) -> Any: + return None if value is None else value.tolist() + + return { + "job_id": result.job_id, + "time_ns": result.time.tolist(), + "donor_counts": result.donor_counts.tolist(), + "fret_counts": _list(result.fret_counts), + "quantum_yield_donor": result.quantum_yield_donor, + "lifetime_donor": getattr(result, "lifetime_donor", 0.0), + "quantum_yield_fret": result.quantum_yield_fret, + "collisions_fraction": result.collisions_fraction, + "fret_efficiency": result.fret_efficiency, + "project": result.project, + "trajectory_distance_to_mean": _list(result.trajectory_distance_to_mean), + "trajectory_time_ns": _list(result.trajectory_time_ns), + "trajectory_autocorr": _list(result.trajectory_autocorr), + "trajectory_autocorr_lag_ns": _list(result.trajectory_autocorr_lag_ns), + "trajectory_points": _list(result.trajectory_points), + "av_points": _list(result.av_points), + "acv_points": _list(result.acv_points), + "av_volume": result.av_volume, + "contact_volume": result.contact_volume, + "contact_to_free_ratio": result.contact_to_free_ratio, + "aa_residence": getattr(result, "aa_residence", []), + } + + +def template_handler(with_fret: bool = True) -> dict[str, Any]: + from ..project import template_project + + return ok({"project": template_project(with_fret=bool(with_fret))}) + + +def validate_handler( + project: Mapping[str, Any], + pdb_path: Optional[str] = None, +) -> dict[str, Any]: + from ..project import ProjectValidationError, validate_project + + try: + validate_project(project, pdb_path=pdb_path) + except ProjectValidationError as exc: + return fail(str(exc)) + return ok({"valid": True, "project": dict(project)}) + + +def simulate_handler( + project: Mapping[str, Any], + pdb_path: Optional[str] = None, + nbins: Optional[int] = None, + tac_range: Any = (0.0, 50.0), + project_dir: Optional[str] = None, + save_outputs: bool = True, +) -> dict[str, Any]: + from .. import api + from ..project import ProjectValidationError, validate_project + + try: + validate_project(project, pdb_path=pdb_path) + except ProjectValidationError as exc: + return fail(str(exc)) + + start, stop = tac_range + try: + result = api.simulate_project( + project, + pdb_path=pdb_path, + nbins=nbins, + tac_range=(float(start), float(stop)), + project_dir=Path(project_dir) if project_dir else None, + save_outputs=bool(save_outputs), + ) + except Exception as exc: + return fail(f"Simulation failed: {exc}") + return ok(result_payload(result)) + + +def scan_handler( + project: Mapping[str, Any], + positions: Mapping[str, Mapping[str, Any]], + pdb_path: Optional[str] = None, + nbins: Optional[int] = None, + tac_range: Any = (0.0, 50.0), + project_dir: Optional[str] = None, +) -> dict[str, Any]: + """Simulate every position and return the records. + + Blocking and sequential: a caller that needs progress or cancellation drives + :func:`quest.scan.scan_positions` itself. Making long-running work uniform + across the surfaces is tracked as ``LAY-07``. + """ + + from ..scan import scan_positions + + start, stop = tac_range + records = list( + scan_positions( + project, + positions, + pdb_path=pdb_path, + nbins=nbins, + tac_range=(float(start), float(stop)), + project_dir=Path(project_dir) if project_dir else None, + ) + ) + return ok({"results": {record["name"]: record for record in records}}) + + +def locales_handler(locale: str | None = None) -> dict[str, Any]: + """Which languages exist, which one was resolved, and its UI strings. + + One call, because a client that has the list still needs the strings, and a + second round trip to get them is a round trip for nothing. + """ + from .. import i18n + + resolved = i18n.resolve_locale(locale) if locale else i18n.DEFAULT_LOCALE + return ok( + { + "available": i18n.available_locales(), + "locale": resolved, + "default": i18n.DEFAULT_LOCALE, + "strings": i18n.ui_strings(resolved), + } + ) + + +def parameter_catalog_handler(locale: str | None = None) -> dict[str, Any]: + """The catalog, translated when a known locale is asked for. + + Callers that pass nothing get English rather than the server's system + language: a shared backend must not answer differently depending on how the + machine it runs on is configured. + """ + from .. import i18n + + try: + return ok(i18n.translate_catalog(locale or i18n.DEFAULT_LOCALE)) + except FileNotFoundError as exc: + return fail(str(exc)) + + +def dyes_list_handler() -> dict[str, Any]: + try: + return ok(settings.dye_repository()) + except FileNotFoundError as exc: + return fail(str(exc)) + + +def dyes_save_handler(dye: Mapping[str, Any]) -> dict[str, Any]: + try: + return ok(settings.save_dye(dye)) + except (ValueError, OSError) as exc: + return fail(str(exc)) + + +def quenching_defaults_handler() -> dict[str, Any]: + return ok(settings.quenching_defaults()) + + +def structure_metadata_handler(pdb_path: str) -> dict[str, Any]: + from ..structure_fetch import resolve_structure_path + from ..structure_info import structure_metadata + + try: + resolved = resolve_structure_path(pdb_path) + except Exception as exc: + return fail(str(exc)) + try: + metadata = structure_metadata(resolved) + except Exception as exc: + return fail(f"Failed to parse structure: {exc}") + if metadata["atom_count"] == 0: + return fail("No ATOM/HETATM records found in the structure.") + return ok(metadata) + + +def jobs_list_handler( + project_dir: Optional[str] = None, + limit: int = jobs.DEFAULT_JOB_LIST_LIMIT, + offset: int = 0, +) -> dict[str, Any]: + return ok(jobs.list_jobs(project_dir, limit=limit, offset=offset)) + + +def jobs_get_handler(job_id: str, project_dir: Optional[str] = None) -> dict[str, Any]: + try: + return ok(jobs.read_job(job_id, project_dir)) + except (ValueError, FileNotFoundError) as exc: + return fail(str(exc)) + + +def register_services(dispatcher: Any) -> None: + """Register QuEst's methods with *dispatcher*. + + Parameters + ---------- + dispatcher : object + Anything exposing ``register(name, handler)`` — QuEst's own + :class:`~quest.backend.dispatcher.ServiceDispatcher`, or a host + application's. + """ + + dispatcher.register("quest.template", lambda p: template_handler(**(p or {}))) + dispatcher.register("quest.validate", lambda p: validate_handler(**(p or {}))) + dispatcher.register("quest.simulate", lambda p: simulate_handler(**(p or {}))) + dispatcher.register("quest.scan", lambda p: scan_handler(**(p or {}))) + dispatcher.register( + "quest.parameter_catalog", + lambda p: parameter_catalog_handler((p or {}).get("locale")), + ) + dispatcher.register( + "quest.locales", lambda p: locales_handler((p or {}).get("locale")) + ) + dispatcher.register("quest.dyes.list", lambda p: dyes_list_handler()) + dispatcher.register("quest.dyes.save", lambda p: dyes_save_handler(**(p or {}))) + dispatcher.register( + "quest.quenching_defaults", lambda p: quenching_defaults_handler() + ) + dispatcher.register( + "quest.structure.metadata", lambda p: structure_metadata_handler(**(p or {})) + ) + dispatcher.register("quest.jobs.list", lambda p: jobs_list_handler(**(p or {}))) + dispatcher.register("quest.jobs.get", lambda p: jobs_get_handler(**(p or {}))) + + +def local_client() -> InProcessClient: + """Return a client wired to a fresh dispatcher with QuEst's methods on it.""" + + dispatcher = ServiceDispatcher() + register_services(dispatcher) + return InProcessClient(dispatcher) diff --git a/quest/cli.py b/quest/cli.py index 7489c2c..eea826f 100644 --- a/quest/cli.py +++ b/quest/cli.py @@ -8,6 +8,9 @@ import click from . import api +from .project import ProjectValidationError, template_project, validate_project +from .scan import simulate_site +from .structure_fetch import resolve_structure_path @click.group(context_settings={"help_option_names": ["-h", "--help"]}) @@ -31,14 +34,35 @@ def _parse_value(raw: str) -> Any: def _set_path(target: MutableMapping[str, Any], path: str, value: Any) -> None: - """Set dotted path inside a mapping, creating nested dicts as needed.""" + """Set dotted path inside a mapping, creating nested dicts or list indices as needed.""" parts = path.split(".") - cursor: MutableMapping[str, Any] = target - for key in parts[:-1]: - if key not in cursor or not isinstance(cursor[key], MutableMapping): - cursor[key] = {} - cursor = cursor[key] - cursor[parts[-1]] = value + cursor: Any = target + for i, key in enumerate(parts[:-1]): + next_key = parts[i + 1] + if next_key.isdigit(): + if key not in cursor or not isinstance(cursor[key], list): + cursor[key] = [] + cursor = cursor[key] + elif isinstance(cursor, list) and key.isdigit(): + idx = int(key) + while len(cursor) <= idx: + cursor.append({}) + if not isinstance(cursor[idx], dict): + cursor[idx] = {} + cursor = cursor[idx] + else: + if key not in cursor or not isinstance(cursor[key], dict): + cursor[key] = {} + cursor = cursor[key] + + last_key = parts[-1] + if isinstance(cursor, list) and last_key.isdigit(): + idx = int(last_key) + while len(cursor) <= idx: + cursor.append(None) + cursor[idx] = value + else: + cursor[last_key] = value def _clone_with_overrides(project: MutableMapping[str, Any], setters: Sequence[tuple[str, Any]]) -> MutableMapping[str, Any]: @@ -139,8 +163,8 @@ def _resolve_output_path( "--pdb", "pdb_path", required=False, - type=click.Path(exists=True, dir_okay=False, path_type=Path), - help="Override PDB path instead of project['pdb'].", + type=str, + help="Override structure path or PDB ID instead of project['pdb'].", ) @click.option( "-o", @@ -184,7 +208,7 @@ def _resolve_output_path( ) def simulate( project_path: Path, - pdb_path: Path | None, + pdb_path: str | None, output_path: Path | None, nbins: int | None, tac_start: float, @@ -214,8 +238,9 @@ def simulate( runs = _build_runs(base_project, setters) results_written = [] - for idx, (project, tags) in enumerate(runs): - _validate_project(project, project_path) + from tqdm import tqdm + for idx, (project, tags) in enumerate(tqdm(runs, desc="Simulating grid", disable=len(runs) <= 1)): + _validate_project(project, project_path, pdb_path=pdb_path) try: result = api.simulate_project( @@ -223,6 +248,7 @@ def simulate( pdb_path=pdb_path, nbins=nbins, tac_range=(tac_start, tac_stop), + project_dir=project_path.parent, ) except Exception as exc: # pragma: no cover - defensive raise click.ClickException(f"Simulation failed: {exc}") @@ -269,7 +295,7 @@ def simulate( def template(output_path: Path | None, with_fret: bool) -> None: """Emit a minimal QuEst project template.""" - project = _template_project(with_fret=with_fret) + project = template_project(with_fret=with_fret) payload = json.dumps(project, indent=2) if output_path: @@ -300,60 +326,148 @@ def validate(project_path: Path) -> None: click.echo(f"{project_path} is valid.") +@cli.command() +@click.option( + "-p", + "--project", + "project_path", + required=True, + type=click.Path(exists=True, dir_okay=False, path_type=Path), + help="Path to a QuEst project JSON file.", +) +@click.option( + "-l", + "--labeling", + "labeling_path", + required=True, + type=click.Path(exists=True, dir_okay=False, path_type=Path), + help="Path to an fps.json file defining labeling sites.", +) +@click.option( + "--pdb", + "pdb_path", + required=False, + type=str, + help="Override structure path or PDB ID instead of project['pdb'].", +) +@click.option( + "-o", + "--output", + "output_path", + required=True, + type=click.Path(dir_okay=False, path_type=Path), + help="Output JSON file to write simulation results to.", +) +@click.option( + "--nbins", + type=int, + default=None, + help="Number of histogram bins.", +) +@click.option( + "--tac-start", + type=float, + default=0.0, + show_default=True, + help="Start of TAC range in ns.", +) +@click.option( + "--tac-stop", + type=float, + default=50.0, + show_default=True, + help="End of TAC range in ns.", +) +def scan( + project_path: Path, + labeling_path: Path, + pdb_path: str | None, + output_path: Path, + nbins: int | None, + tac_start: float, + tac_stop: float, +) -> None: + """Run accessible volume and quenching simulations for multiple sites in an fps.json file.""" + + try: + project = api.load_project(project_path) + except Exception as exc: + raise click.ClickException(f"Failed to load project: {exc}") + + try: + fps_data = api.load_fps_json(labeling_path) + except Exception as exc: + raise click.ClickException(f"Failed to load labeling fps.json: {exc}") + + resolved_pdb: Path | None = None + structure_source = pdb_path or project.get("pdb") + if structure_source is not None: + try: + resolved_pdb = resolve_structure_path(structure_source) + except Exception as exc: + raise click.ClickException(str(exc)) from exc + + # The scan runs with save_outputs=False, so nothing is written here; the + # path only exists because simulate_project takes a project directory. + scan_temp_dir = output_path.parent + + positions = fps_data.get("Positions", {}) + if not positions: + click.echo("No positions found in fps.json. Nothing to scan.") + return + + results = {} + from tqdm import tqdm + progress = tqdm(positions.items(), desc="Scanning labeling sites") + + for name, pos in progress: + progress.set_postfix_str(f"site {name}") + res = simulate_site( + project, + pos, + name=name, + pdb_path=resolved_pdb, + nbins=nbins, + tac_range=(tac_start, tac_stop), + project_dir=scan_temp_dir, + ) + results[name] = res + + try: + output_path.write_text(json.dumps(results, indent=2), encoding="utf8") + click.echo(f"Wrote scan results to {output_path}") + except Exception as exc: + raise click.ClickException(f"Failed to write output file: {exc}") + + @cli.command() def gui() -> None: """Launch the QuEst GUI.""" try: - from .quest_gui import start_gui + from .gui import start_gui except Exception as exc: # pragma: no cover - defensive raise click.ClickException(f"Failed to import GUI: {exc}") start_gui() -def _validate_project(project: Mapping[str, Any], project_path: Path | None = None) -> None: - """Raise ClickException if the project is malformed.""" - - required_top = [ - "tau0", - "kQ", - "n_photons", - "t_max", - "t_step", - "dg", - "slow_fact", - "critical_distance", - "av_parameter", - "quencher", - ] - missing = [key for key in required_top if key not in project] - if missing: - raise click.ClickException(f"Project missing required keys: {', '.join(missing)}") - - pdb = project.get("pdb") - if pdb is None and project_path is None: - raise click.ClickException("Project must define 'pdb' path when no override is provided.") - if pdb is not None: - pdb_path = Path(pdb) - if not pdb_path.exists(): - raise click.ClickException(f"PDB path does not exist: {pdb_path}") - - fret_block = project.get("fret") or {} - dyes: Sequence[Mapping[str, Any]] = fret_block.get("dyes") or [] - if not dyes: - raise click.ClickException("Project must define at least one dye in fret.dyes with a diffusion coefficient 'D'.") - donor_dye = dyes[0] - if donor_dye.get("D") is None: - raise click.ClickException("Donor dye entry must define diffusion coefficient 'D'.") - - # Basic TAC sanity - t_start = project.get("t_start", 0.0) - t_stop = project.get("t_max", None) - if t_stop is None: - raise click.ClickException("Project must define 't_max' (simulation duration).") - if t_stop <= t_start: - raise click.ClickException("Project 't_max' must be greater than 't_start'.") +def _validate_project( + project: Mapping[str, Any], + project_path: Path | None = None, + pdb_path: Path | str | None = None, +) -> None: + """Validate a project, reporting failures the way Click expects. + + The rules live in :mod:`quest.project` so every surface enforces the same + ones; this wrapper only translates the domain error into a + ``ClickException``. + """ + + try: + validate_project(project, project_path=project_path, pdb_path=pdb_path) + except ProjectValidationError as exc: + raise click.ClickException(str(exc)) from exc def _write_csv(path: Path, result: api.DecaySimulationResult) -> None: @@ -396,56 +510,14 @@ def _write_json(path: Path, result: api.DecaySimulationResult) -> None: "collisions_fraction": result.collisions_fraction, "fret_efficiency": result.fret_efficiency, "project": result.project, + "aa_residence": getattr(result, "aa_residence", []), } path.write_text(json.dumps(payload, indent=2), encoding="utf8") -def _template_project(*, with_fret: bool = True) -> MutableMapping[str, Any]: - """Create a minimal valid project dictionary.""" - - project: MutableMapping[str, Any] = { - "tau0": 4.2, - "kQ": 0.0, - "n_photons": 500000, - "t_max": 16000.0, - "t_step": 0.032, - "dg": 0.0, - "slow_fact": 0.1, - "critical_distance": 8.5, - "av_parameter": 1000, - "quencher": "TRY", - "pdb": "structure.pdb", - "n_bins": 4096, - "attachment": {"chain": "A", "residue": 1, "atom": "CB"}, - "save_avs": False, - "slow_radius": 8.5, - "all_quencher_atoms": True, - "output_file": "out", - } - - dyes = [ - { - "name": "donor", - "D": 7.5, - "attachment": {"chain": "A", "residue": 1, "atom": "CB"}, - "av_parameter": 1000, - } - ] - - fret_block: MutableMapping[str, Any] = {"enabled": with_fret, "dyes": dyes} - if with_fret: - fret_block["dyes"].append( - { - "name": "acceptor", - "D": 7.5, - "attachment": {"chain": "A", "residue": 2, "atom": "CB"}, - "av_parameter": 1000, - } - ) - fret_block["R0_matrix"] = [[None, 5.5], [5.5, None]] - - project["fret"] = fret_block - return project +#: Kept as a module-level alias so existing callers keep working; the template +#: itself is domain logic and lives in :mod:`quest.project`. +_template_project = template_project if __name__ == "__main__": diff --git a/quest/jobs.py b/quest/jobs.py new file mode 100644 index 0000000..0909e15 --- /dev/null +++ b/quest/jobs.py @@ -0,0 +1,170 @@ +"""Reading back what a run wrote. + +Every simulation writes a ``jobs//`` directory +(see okf/architecture/job-artefacts.md). Listing those runs, summarising them +for a picker, reading one back and packaging one for download are domain +operations -- a notebook or a host application has the same need as the browser +that first grew them. + +The directory name is a UUID, which is also the validity check: anything else +in ``jobs/`` is not a run and is ignored rather than half-parsed. +""" + +from __future__ import annotations + +import datetime +import json +import uuid +import zipfile +from pathlib import Path +from typing import Any, Optional + +__all__ = [ + "DEFAULT_JOB_LIST_LIMIT", + "MAX_JOB_LIST_LIMIT", + "jobs_directory", + "is_job_id", + "job_summary", + "list_jobs", + "read_job", + "archive_job", +] + +#: Page size for :func:`list_jobs`, and the ceiling a caller can ask for. The +#: picker shows a bounded window; without a cap the response grows without limit +#: as runs accumulate (a development tree here holds several hundred). +DEFAULT_JOB_LIST_LIMIT = 50 +MAX_JOB_LIST_LIMIT = 500 + + +def jobs_directory(project_dir: Optional[Path | str] = None) -> Path: + """Return the ``jobs/`` directory under *project_dir* (default: cwd).""" + + base = Path(project_dir) if project_dir is not None else Path.cwd() + return base / "jobs" + + +def is_job_id(value: Any) -> bool: + """Whether *value* is a job identifier, i.e. a UUID.""" + + try: + uuid.UUID(str(value)) + except (ValueError, AttributeError, TypeError): + return False + return True + + +def job_summary(path: Path) -> dict[str, Any]: + """Summarise one job directory for a run picker. + + Only the fields a picker shows. The project and the full result live in the + directory and are read on demand by :func:`read_job`; embedding them here + made the listing grow without bound. + """ + + date_str = datetime.datetime.fromtimestamp(path.stat().st_mtime).strftime( + "%Y-%m-%d %H:%M:%S" + ) + project_file = path / "project.json" + + if project_file.exists(): + try: + with project_file.open("r", encoding="utf8") as handle: + attachment = json.load(handle).get("attachment") or {} + labeling_site = f"{attachment.get('chain', '')}:{attachment.get('residue', '')}" + except Exception: + labeling_site = "Error loading" + elif (path / "result.json").exists(): + labeling_site = "Unknown" + else: + # A directory with neither is a run that was started and never finished. + labeling_site = "No result yet" + date_str = "" + + return {"job_id": path.name, "labeling_site": labeling_site, "date": date_str} + + +def list_jobs( + project_dir: Optional[Path | str] = None, + limit: int = DEFAULT_JOB_LIST_LIMIT, + offset: int = 0, +) -> dict[str, Any]: + """Return job summaries, newest first, as ``{jobs, total, limit, offset}``. + + Out-of-range paging is clamped rather than rejected: a caller asking for + 10 000 runs gets :data:`MAX_JOB_LIST_LIMIT`, not an error. + """ + + directory = jobs_directory(project_dir) + limit = max(1, min(int(limit), MAX_JOB_LIST_LIMIT)) + offset = max(0, int(offset)) + + if not directory.exists(): + return {"jobs": [], "total": 0, "limit": limit, "offset": offset} + + candidates: list[tuple[float, Path]] = [] + for path in directory.iterdir(): + if not path.is_dir() or not is_job_id(path.name): + continue + try: + candidates.append((path.stat().st_mtime, path)) + except OSError: + continue + + candidates.sort(key=lambda item: item[0], reverse=True) + window = candidates[offset : offset + limit] + return { + "jobs": [job_summary(path) for _mtime, path in window], + "total": len(candidates), + "limit": limit, + "offset": offset, + } + + +def read_job(job_id: str, project_dir: Optional[Path | str] = None) -> dict[str, Any]: + """Return a finished run's ``result.json``. + + Raises + ------ + ValueError + If *job_id* is not a UUID. + FileNotFoundError + If there is no such run, or it has no result yet. + """ + + if not is_job_id(job_id): + raise ValueError(f"Invalid job id (must be a UUID): {job_id!r}") + result_file = jobs_directory(project_dir) / str(job_id) / "result.json" + if not result_file.exists(): + raise FileNotFoundError(f"No result for job {job_id}") + with result_file.open("r", encoding="utf8") as handle: + return json.load(handle) + + +def archive_job(job_id: str, project_dir: Optional[Path | str] = None) -> Path: + """Zip a run's artefacts and return the archive path. + + The archive is written inside the job directory and excludes any previous + archive, so repeated calls do not nest. + + Raises + ------ + ValueError + If *job_id* is not a UUID. + FileNotFoundError + If there is no such run. + """ + + if not is_job_id(job_id): + raise ValueError(f"Invalid job id (must be a UUID): {job_id!r}") + job_dir = jobs_directory(project_dir) / str(job_id) + if not job_dir.is_dir(): + raise FileNotFoundError(f"No such job: {job_id}") + + archive_name = f"quest_simulation_{job_id}.zip" + archive_path = job_dir / archive_name + with zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) as archive: + for file_path in sorted(job_dir.iterdir()): + if file_path.is_file() and file_path.name != archive_name: + archive.write(file_path, file_path.name) + return archive_path diff --git a/quest/manifest.json b/quest/manifest.json new file mode 100644 index 0000000..f6c3e31 --- /dev/null +++ b/quest/manifest.json @@ -0,0 +1,465 @@ +{ + "id": "quest", + "version": "19.8.13", + "display_name": "Structure:Computation:QuEst", + "description": "Structure-based simulation of dynamic PET quenching and FRET for dyes tethered to proteins by flexible linkers.", + "authors": [ + "Thomas-Otavio Peulen" + ], + "categories": [ + "Structure", + "Computation" + ], + "icon": "💧", + "state_namespace": "quest", + "state_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "project": { + "type": "object", + "description": "The QuEst project document (see doc/parameters.md). Every length is in Angstrom, every time in nanoseconds." + } + } + }, + "statefulness": { + "enabled": true, + "window": { + "enabled": true, + "settings_key": null + } + }, + "entrypoints": { + "gui": "quest.gui:TransientDecayGenerator", + "cli": "quest.cli:cli", + "services": "quest.backend.services:register_services" + }, + "rpc_methods": [ + { + "name": "quest.template", + "summary": "Return a minimal valid project, optionally with FRET.", + "params_schema": { + "type": "object", + "properties": { + "with_fret": { + "type": "boolean", + "description": "Add an acceptor dye and a Forster matrix.", + "default": true + } + } + }, + "result_schema": { + "type": "object", + "properties": { + "project": { + "type": "object" + } + }, + "required": [ + "project" + ] + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.validate", + "summary": "Check a project and report why it is malformed.", + "params_schema": { + "type": "object", + "properties": { + "project": { + "type": "object", + "description": "The project document to check." + }, + "pdb_path": { + "type": [ + "string", + "null" + ], + "description": "Structure override; a path or a bare four-character RCSB PDB ID." + } + }, + "required": [ + "project" + ] + }, + "result_schema": { + "type": "object", + "properties": { + "valid": { + "type": "boolean" + }, + "project": { + "type": "object" + } + } + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.simulate", + "summary": "Run one simulation and return the decay and derived metrics.", + "params_schema": { + "type": "object", + "properties": { + "project": { + "type": "object" + }, + "pdb_path": { + "type": [ + "string", + "null" + ] + }, + "nbins": { + "type": [ + "integer", + "null" + ], + "description": "TAC histogram bins." + }, + "tac_range": { + "type": "array", + "description": "Time window of the histogram in nanoseconds, [start, stop].", + "items": { + "type": "number" + } + }, + "project_dir": { + "type": [ + "string", + "null" + ], + "description": "Base directory for the jobs/ output folder." + }, + "save_outputs": { + "type": "boolean", + "description": "Write the job directory and the display point clouds. Turn off for bulk work.", + "default": true + } + }, + "required": [ + "project" + ] + }, + "result_schema": { + "type": "object", + "description": "Decay arrays, quantum yields, lifetime, AV/contact volumes, FRET channel and the per-residue-type quenching breakdown.", + "properties": { + "job_id": { + "type": [ + "string", + "null" + ] + }, + "time_ns": { + "type": "array", + "items": { + "type": "number" + } + }, + "donor_counts": { + "type": "array", + "items": { + "type": "number" + } + }, + "fret_counts": { + "type": [ + "array", + "null" + ] + }, + "quantum_yield_donor": { + "type": "number" + }, + "fret_efficiency": { + "type": [ + "number", + "null" + ] + }, + "aa_residence": { + "type": "array" + } + } + }, + "long_running": true, + "cancelable": false + }, + { + "name": "quest.scan", + "summary": "Simulate a set of labeling sites and return one record each.", + "params_schema": { + "type": "object", + "properties": { + "project": { + "type": "object" + }, + "positions": { + "type": "object", + "description": "fps.json-shaped positions, keyed by site name." + }, + "pdb_path": { + "type": [ + "string", + "null" + ] + }, + "nbins": { + "type": [ + "integer", + "null" + ] + }, + "tac_range": { + "type": "array", + "items": { + "type": "number" + } + }, + "project_dir": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "project", + "positions" + ] + }, + "result_schema": { + "type": "object", + "properties": { + "results": { + "type": "object", + "description": "Per site: lifetime, quantum yield, contact fraction, volumes and the dominant quencher. A site that fails is reported with status='failed' rather than aborting the scan." + } + } + }, + "long_running": true, + "cancelable": false + }, + { + "name": "quest.parameter_catalog", + "summary": "Return the parameter catalog (labels, units, help), optionally translated.", + "params_schema": { + "type": "object", + "properties": { + "locale": { + "type": "string", + "title": "Language", + "description": "Locale code (en, de, fr). Omitted means English — a shared backend must not answer in whatever language its host machine is configured for." + } + } + }, + "result_schema": { + "type": "object" + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.dyes.list", + "summary": "Return the dye presets.", + "params_schema": { + "type": "object", + "properties": {} + }, + "result_schema": { + "type": "object", + "description": "Dye presets keyed by name." + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.dyes.save", + "summary": "Add or replace a dye preset.", + "params_schema": { + "type": "object", + "properties": { + "dye": { + "type": "object", + "description": "Dye entry; its 'name' is the key it is stored under." + } + }, + "required": [ + "dye" + ] + }, + "result_schema": { + "type": "object" + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.quenching_defaults", + "summary": "Return the residue-type PET chemistry defaults.", + "params_schema": { + "type": "object", + "properties": {} + }, + "result_schema": { + "type": "object", + "properties": { + "residues": { + "type": "array", + "items": { + "type": "string" + } + }, + "default_interactions": { + "type": "object" + }, + "default_quench_atoms": { + "type": "object" + }, + "reference_pet_quenching": { + "type": "object" + } + } + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.structure.metadata", + "summary": "Return the chains, residues and atoms of a structure file.", + "params_schema": { + "type": "object", + "properties": { + "pdb_path": { + "type": "string", + "description": "Structure path, or a bare four-character RCSB PDB ID." + } + }, + "required": [ + "pdb_path" + ] + }, + "result_schema": { + "type": "object", + "properties": { + "filename": { + "type": "string" + }, + "path": { + "type": "string" + }, + "atom_count": { + "type": "integer" + }, + "chains": { + "type": "array", + "description": "Per chain: its residues in sequence order, each with sorted atom names." + }, + "pdb_text": { + "type": "string", + "description": "Raw file contents, for a viewer." + } + } + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.jobs.list", + "summary": "Return job summaries, newest first.", + "params_schema": { + "type": "object", + "properties": { + "project_dir": { + "type": [ + "string", + "null" + ], + "description": "Directory holding jobs/ (default: cwd)." + }, + "limit": { + "type": "integer", + "description": "Page size; clamped to the server maximum." + }, + "offset": { + "type": "integer" + } + } + }, + "result_schema": { + "type": "object", + "properties": { + "jobs": { + "type": "array" + }, + "total": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + } + } + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.jobs.get", + "summary": "Return a finished run's result.", + "params_schema": { + "type": "object", + "properties": { + "job_id": { + "type": "string", + "description": "The run's UUID." + }, + "project_dir": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "job_id" + ] + }, + "result_schema": { + "type": "object", + "description": "The run's result.json." + }, + "long_running": false, + "cancelable": false + }, + { + "name": "quest.locales", + "summary": "List the languages QuEst's labels and help text are available in.", + "params_schema": { + "type": "object", + "properties": { + "locale": { + "type": "string", + "title": "Language", + "description": "Locale code (en, de, fr). Omitted means English — a shared backend must not answer in whatever language its host machine is configured for." + } + } + }, + "result_schema": { + "type": "object" + }, + "long_running": false, + "cancelable": false + } + ], + "events": [], + "dependencies": {}, + "menu_hidden": true, + "deprecated": false +} diff --git a/quest/project.py b/quest/project.py new file mode 100644 index 0000000..4c164e8 --- /dev/null +++ b/quest/project.py @@ -0,0 +1,174 @@ +"""The QuEst project document: creation and validation. + +A QuEst *project* is a plain JSON-serialisable mapping describing one +simulation — structure, labeling site, dye, linker geometry, quenching +chemistry and photon settings. It is the contract every surface shares (CLI, +Python API, web UI, Qt GUI), so the code that creates and checks one belongs in +the domain rather than in any single surface. + +This module owns that logic. Surfaces translate :class:`ProjectValidationError` +into whatever their caller expects (a ``ClickException`` in the CLI, an HTTP 400 +in the web backend, an ``{"ok": False}`` envelope over RPC). +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any, Mapping, MutableMapping, Optional, Sequence + +from .structure_fetch import resolve_structure_path + +__all__ = [ + "DEFAULT_FORSTER_RADIUS", + "ProjectValidationError", + "REQUIRED_TOP_LEVEL_KEYS", + "template_project", + "validate_project", +] + +#: Förster radius (Angstrom) written into a template project. **Every length in +#: a QuEst project is in Angstrom**, ``R0_matrix`` included — a value entered in +#: nanometres (~5.5) is ten times too small and makes FRET vanish silently, +#: because the transfer rate goes as ``(R0/r)**6``. +DEFAULT_FORSTER_RADIUS = 52.0 + + +class ProjectValidationError(ValueError): + """Raised when a project mapping is missing or contradicts a requirement.""" + + +#: Keys a project must carry before it can be simulated. +REQUIRED_TOP_LEVEL_KEYS: tuple[str, ...] = ( + "tau0", + "n_photons", + "t_max", + "t_step", + "dg", + "critical_distance", + "av_parameter", + "amino_acid_interactions", +) + + +def validate_project( + project: Mapping[str, Any], + project_path: Optional[Path | str] = None, + pdb_path: Optional[Path | str] = None, +) -> None: + """Check *project* and raise :class:`ProjectValidationError` if malformed. + + Parameters + ---------- + project : mapping + The project document to check. + project_path : path, optional + Where the project came from. Only used to decide whether a missing + structure is fatal: a project loaded from a file may legitimately defer + the structure to a caller-supplied override. + pdb_path : path or str, optional + Structure override taking precedence over ``project['pdb']``. May be a + bare RCSB PDB ID. + + Raises + ------ + ProjectValidationError + If a required key is absent, the structure cannot be resolved, no donor + dye with a diffusion coefficient is defined, or the time range is empty. + """ + + missing = [key for key in REQUIRED_TOP_LEVEL_KEYS if key not in project] + if missing: + raise ProjectValidationError( + f"Project missing required keys: {', '.join(missing)}" + ) + + pdb = pdb_path or project.get("pdb") + if pdb is None and project_path is None: + raise ProjectValidationError( + "Project must define 'pdb' path when no override is provided." + ) + if pdb is not None: + try: + resolve_structure_path(pdb) + except Exception as exc: + raise ProjectValidationError(str(exc)) from exc + + fret_block = project.get("fret") or {} + dyes: Sequence[Mapping[str, Any]] = fret_block.get("dyes") or [] + if not dyes: + raise ProjectValidationError( + "Project must define at least one dye in fret.dyes with a diffusion coefficient 'D'." + ) + if dyes[0].get("D") is None: + raise ProjectValidationError( + "Donor dye entry must define diffusion coefficient 'D'." + ) + + t_start = project.get("t_start", 0.0) + t_stop = project.get("t_max", None) + if t_stop is None: + raise ProjectValidationError("Project must define 't_max' (simulation duration).") + if t_stop <= t_start: + raise ProjectValidationError("Project 't_max' must be greater than 't_start'.") + + +def template_project(*, with_fret: bool = True) -> MutableMapping[str, Any]: + """Return a minimal valid project, ready to be edited. + + Parameters + ---------- + with_fret : bool + Add an acceptor dye and an ``R0_matrix`` so the project simulates FRET + alongside the donor decay. + """ + + from .core.dye_diffusion import default_amino_acid_interactions + + project: MutableMapping[str, Any] = { + "tau0": 4.2, + "n_photons": 500000, + "t_max": 16000.0, + "t_step": 0.032, + "dg": 0.5, + # Residue-type specific stickiness and PET quenching for a xanthene dye. + "amino_acid_interactions": default_amino_acid_interactions(slow_factor=0.1), + # Fallback dye-centre-to-quencher radius for residues that do not + # define their own quench_radius. + "critical_distance": 8.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "pdb": "structure.pdb", + "n_bins": 4096, + "parallel_trajectories": -1, + "attachment": {"chain": "A", "residue": 1, "atom": "CB"}, + "save_avs": False, + "slow_radius": 8.5, + "output_file": "out", + } + + dyes: list[MutableMapping[str, Any]] = [ + { + "name": "donor", + "D": 7.5, + "slow_radius": project["slow_radius"], + "amino_acid_interactions": project["amino_acid_interactions"], + "attachment": {"chain": "A", "residue": 1, "atom": "CB"}, + "av_parameter": dict(project["av_parameter"]), + } + ] + + fret_block: MutableMapping[str, Any] = {"enabled": with_fret, "dyes": dyes} + if with_fret: + dyes.append( + { + "name": "acceptor", + "D": 7.5, + "attachment": {"chain": "A", "residue": 2, "atom": "CB"}, + "av_parameter": dict(project["av_parameter"]), + } + ) + # Förster radii in Angstrom, like every other length in a project. + # 52 A is a typical donor-acceptor pair; calibrate it for the real one. + fret_block["R0_matrix"] = [[None, DEFAULT_FORSTER_RADIUS], [DEFAULT_FORSTER_RADIUS, None]] + + project["fret"] = fret_block + return project diff --git a/quest/scan.py b/quest/scan.py new file mode 100644 index 0000000..9baf790 --- /dev/null +++ b/quest/scan.py @@ -0,0 +1,197 @@ +"""Scanning labeling sites: one site simulated, one record reported. + +A scan asks the same question of many attachment sites — what lifetime, what +quantum yield, what quenches the dye there — so the answer must have one shape +no matter which surface asked. This module owns that: building the per-site +project, running it, and reporting the result (or the failure) as a plain dict. + +The CLI's ``quest scan``, the web UI's streaming ``/api/scan`` and the +``fps.json`` generator :func:`quest.core.fps_json.run_fps_scan` all call +:func:`simulate_site`. Concurrency and progress reporting stay with the caller, +because those are transport concerns; what a site *is* and what a result +*contains* are not. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any, Iterator, Mapping, MutableMapping, Optional, Tuple + +__all__ = [ + "SITE_AV_PARAMETER_KEYS", + "site_project", + "simulate_site", + "scan_positions", +] + +#: Position keys copied from an fps.json entry into the site's AV parameters. +#: ``simulation_grid_resolution`` is the odd one out: it maps onto the +#: project-wide grid spacing ``dg`` rather than into ``av_parameter``. +SITE_AV_PARAMETER_KEYS: tuple[str, ...] = ( + "linker_length", + "linker_width", + "radius1", + "radius2", + "radius3", + "simulation_grid_resolution", + "simulation_type", + "allowed_sphere_radius", +) + + +def site_project( + project: Mapping[str, Any], + position: Mapping[str, Any], +) -> MutableMapping[str, Any]: + """Return a copy of *project* with the attachment set to *position*. + + Parameters + ---------- + project : mapping + The base project shared by every site in the scan. + position : mapping + One fps.json position entry (``chain_identifier``, + ``residue_seq_number``, ``atom_name``, and optional AV overrides). + """ + + site = dict(project) + site["attachment"] = { + "chain": position.get("chain_identifier", ""), + "residue": int(position.get("residue_seq_number", 0)), + "atom": position.get("atom_name", "CB"), + } + + site["av_parameter"] = dict(site.get("av_parameter") or {}) + for key in SITE_AV_PARAMETER_KEYS: + if key not in position: + continue + if key == "simulation_grid_resolution": + site["dg"] = float(position[key]) + else: + site[key] = position[key] + site["av_parameter"][key] = position[key] + + # The donor dye carries its own copy of the attachment and AV parameters + # (see build_donor_from_project), so it has to follow the site. + if site.get("fret", {}).get("enabled"): + dyes = site.get("fret", {}).get("dyes") or [] + if dyes: + donor = dict(dyes[0]) + donor["attachment"] = dict(site["attachment"]) + donor["av_parameter"] = dict(site["av_parameter"]) + fret = dict(site["fret"]) + fret["dyes"] = [donor, *dyes[1:]] + site["fret"] = fret + + return site + + +def _failure(name: str, position: Mapping[str, Any], error: str) -> dict[str, Any]: + return { + "name": name, + "chain": position.get("chain_identifier", ""), + "residue": int(position.get("residue_seq_number", 0)), + "residue_name": position.get("residue_name", ""), + "atom": position.get("atom_name", "CB"), + "status": "failed", + "error": error, + "lifetime": None, + "quantum_yield": None, + "contact_fraction": None, + "av_volume": None, + "contact_volume": None, + "contact_to_free_ratio": None, + "dominant_quencher": None, + "dominant_quencher_fraction": None, + "quenchers": [], + } + + +def simulate_site( + project: Mapping[str, Any], + position: Mapping[str, Any], + *, + name: str, + pdb_path: Optional[Path | str] = None, + nbins: Optional[int] = None, + tac_range: Tuple[float, float] = (0.0, 50.0), + project_dir: Optional[Path | str] = None, +) -> dict[str, Any]: + """Simulate one labeling site and return its record. Never raises. + + A buried residue or an unresolvable structure must not abort a scan of + hundreds of sites, so a failure is reported as data: the same keys with + ``status="failed"``, an ``error`` string, and null metrics. + + The simulation runs with ``save_outputs=False`` — a scan reads scalar + metrics and ``aa_residence`` only, and writing a job directory per site + costs more than the simulation itself. + """ + + from . import api + + try: + site = site_project(project, position) + api.validate_project(site) + result = api.simulate_project( + site, + pdb_path=pdb_path, + nbins=nbins, + tac_range=tac_range, + project_dir=project_dir, + save_outputs=False, + # A scan reads scalar metrics and `aa_residence`; thinning point + # clouds nobody will draw, once per residue, is pure overhead. + render_data=False, + ) + except Exception as exc: + return _failure(name, position, str(exc)) + + quenchers = api.top_quenchers(getattr(result, "aa_residence", None)) + return { + "name": name, + "chain": site["attachment"]["chain"], + "residue": site["attachment"]["residue"], + "residue_name": position.get("residue_name", ""), + "atom": site["attachment"]["atom"], + "status": "success", + "lifetime": getattr(result, "lifetime_donor", 0.0), + "quantum_yield": result.quantum_yield_donor, + "contact_fraction": result.collisions_fraction, + "av_volume": getattr(result, "av_volume", None), + "contact_volume": getattr(result, "contact_volume", None), + "contact_to_free_ratio": getattr(result, "contact_to_free_ratio", None), + "dominant_quencher": quenchers[0]["residue_name"] if quenchers else None, + "dominant_quencher_fraction": ( + quenchers[0]["quench_rate_fraction"] if quenchers else None + ), + "quenchers": quenchers, + } + + +def scan_positions( + project: Mapping[str, Any], + positions: Mapping[str, Mapping[str, Any]], + *, + pdb_path: Optional[Path | str] = None, + nbins: Optional[int] = None, + tac_range: Tuple[float, float] = (0.0, 50.0), + project_dir: Optional[Path | str] = None, +) -> Iterator[dict[str, Any]]: + """Yield one record per entry in *positions*, in order. + + Sequential by design: callers that want concurrency own the pool, because + how many sites run at once depends on the transport (see the web backend's + ``SCAN_WORKERS``, kept small because the AV kernel holds the GIL). + """ + + for name, position in positions.items(): + yield simulate_site( + project, + position, + name=name, + pdb_path=pdb_path, + nbins=nbins, + tac_range=tac_range, + project_dir=project_dir, + ) diff --git a/quest/structure_fetch.py b/quest/structure_fetch.py new file mode 100644 index 0000000..998fac1 --- /dev/null +++ b/quest/structure_fetch.py @@ -0,0 +1,113 @@ +"""Structure source resolution helpers.""" + +from __future__ import annotations + +import os +import re +import tempfile +import urllib.error +import urllib.request +from pathlib import Path + + +PDB_ID_RE = re.compile(r"^[A-Za-z0-9]{4}$") +RCSB_PDB_URL = "https://files.rcsb.org/download/{pdb_id}.pdb" +RCSB_CIF_URL = "https://files.rcsb.org/download/{pdb_id}.cif" + + +def is_pdb_id(value: object) -> bool: + """Return True when *value* looks like a bare RCSB PDB identifier.""" + + if not isinstance(value, str): + return False + return PDB_ID_RE.fullmatch(value.strip()) is not None + + +def default_pdb_cache_dir() -> Path: + """Return the cache directory for downloaded PDB files.""" + + return Path(os.getenv("QUEST_PDB_CACHE_DIR", Path(tempfile.gettempdir()) / "quest-pdb-cache")) + + +def _shared_downloader(): + """ChiSurf's shared RCSB fetch, when the host is reachable. + + Downloading a structure by accession is library work, and ChiSurf carries it + in `chisurf.core.fio.structure.fetch` — the same code its FPS JSON editor + uses. QuEst prefers that copy so there is one cache and one retry policy, + and keeps its own only for running without a host. + """ + try: + from .chisurf_host import enable_chisurf + + if not enable_chisurf(): + return None + from chisurf.core.fio.structure.fetch import download_structure + except Exception: + return None + return download_structure + + +def download_pdb_id(pdb_id: str, cache_dir: Path | str | None = None) -> Path: + """Download *pdb_id* from RCSB and return the cached structure path. + + Delegates to ChiSurf's shared fetch when the host is available; the local + implementation below is the standalone fallback. + """ + + shared = _shared_downloader() + if shared is not None: + target_dir = Path(cache_dir) if cache_dir is not None else default_pdb_cache_dir() + return Path(shared(pdb_id, cache_dir=target_dir)) + + clean_id = pdb_id.strip().upper() + if not is_pdb_id(clean_id): + raise ValueError(f"Invalid PDB ID: {pdb_id!r}") + + target_dir = Path(cache_dir) if cache_dir is not None else default_pdb_cache_dir() + target_dir.mkdir(parents=True, exist_ok=True) + pdb_target = target_dir / f"{clean_id.lower()}.pdb" + cif_target = target_dir / f"{clean_id.lower()}.cif" + for target in (pdb_target, cif_target): + if target.exists() and target.stat().st_size > 0: + return target + + for url_template, target in ((RCSB_PDB_URL, pdb_target), (RCSB_CIF_URL, cif_target)): + url = url_template.format(pdb_id=clean_id) + try: + with urllib.request.urlopen(url, timeout=30) as response: + content = response.read() + except urllib.error.HTTPError as exc: + if exc.code == 404: + continue + raise RuntimeError(f"Failed to download PDB ID {clean_id}: HTTP {exc.code}") from exc + except urllib.error.URLError as exc: + raise RuntimeError(f"Failed to download PDB ID {clean_id}: {exc.reason}") from exc + + if not content: + raise RuntimeError(f"Downloaded PDB ID {clean_id} returned an empty file.") + + target.write_bytes(content) + return target + + raise FileNotFoundError(f"PDB ID not found at RCSB: {clean_id}") + + +def resolve_structure_path(source: Path | str, cache_dir: Path | str | None = None) -> Path: + """Resolve a local structure path or download a bare PDB ID.""" + + if isinstance(source, Path): + path = source.expanduser() + if path.exists(): + return path + source_text = str(source) + else: + source_text = str(source).strip() + path = Path(source_text).expanduser() + if path.exists(): + return path + + if is_pdb_id(source_text): + return download_pdb_id(source_text, cache_dir=cache_dir) + + raise FileNotFoundError(f"Structure path does not exist: {path}") diff --git a/quest/structure_info.py b/quest/structure_info.py new file mode 100644 index 0000000..eb9f824 --- /dev/null +++ b/quest/structure_info.py @@ -0,0 +1,210 @@ +"""What a structure file offers as labeling sites. + +Parsing a structure into chains, residues and atom names is domain work -- the +CLI, a notebook and a host application all have reason to ask -- so it does not +belong to whichever surface happened to need it first (it lived in the web +backend). +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +__all__ = ["structure_metadata"] + + +def structure_metadata(path: Path | str) -> dict[str, Any]: + """Chains, residues and atom names of a structure file. + + Reads PDB and mmCIF. Used to populate labeling-site pickers, so it + reports what a dye could be attached to rather than a full parse: per + chain, the residues in sequence order, each with its sorted atom names. + + Parameters + ---------- + path : path + Structure file. Resolve PDB IDs with + :func:`quest.structure_fetch.resolve_structure_path` first. + + Returns + ------- + dict + ``filename``, ``path``, ``atom_count``, ``chains`` and the raw + ``pdb_text`` (the browser viewer renders it directly). + + Raises + ------ + FileNotFoundError + If the file does not exist. + """ + + path = Path(path) + if not path.exists(): + raise FileNotFoundError(f"No such structure file: {path}") + chains: dict[str, dict[int, dict[str, Any]]] = {} + atom_count = 0 + with path.open("r", encoding="utf8", errors="replace") as handle: + pdb_text = handle.read() + + # Check if CIF format + if 'loop_' in pdb_text and '_atom_site.' in pdb_text: + rows = pdb_text.splitlines() + in_loop = False + loop_headers = [] + + def clean_val(s): + s = s.strip() + if (s.startswith('"') and s.endswith('"')) or (s.startswith("'") and s.endswith("'")): + return s[1:-1] + return s + + i = 0 + while i < len(rows): + line = rows[i].strip() + if not line or line.startswith('#'): + i += 1 + continue + + if line == 'loop_': + in_loop = True + loop_headers = [] + i += 1 + while i < len(rows): + next_line = rows[i].strip() + if next_line.startswith('_atom_site.'): + loop_headers.append(next_line) + i += 1 + elif next_line.startswith('_'): + in_loop = False + break + else: + break + + if in_loop and loop_headers: + header_map = {} + for idx, h in enumerate(loop_headers): + field = h.split('.')[-1].strip() + header_map[field] = idx + + atom_name_col = header_map.get('auth_atom_id') + if atom_name_col is None: + atom_name_col = header_map.get('label_atom_id') + + res_name_col = header_map.get('auth_comp_id') + if res_name_col is None: + res_name_col = header_map.get('label_comp_id') + + chain_col = header_map.get('auth_asym_id') + if chain_col is None: + chain_col = header_map.get('label_asym_id') + + res_id_col = header_map.get('auth_seq_id') + if res_id_col is None: + res_id_col = header_map.get('label_seq_id') + + group_col = header_map.get('group_PDB') + + while i < len(rows): + data_line = rows[i].strip() + if not data_line or data_line.startswith('#'): + i += 1 + continue + if data_line == 'loop_' or data_line.startswith('_') or data_line.startswith('data_'): + break + + parts = [] + current = [] + in_quote = False + quote_char = None + for char in data_line: + if char in ("'", '"'): + if not in_quote: + in_quote = True + quote_char = char + elif quote_char == char: + in_quote = False + quote_char = None + else: + current.append(char) + elif char.isspace(): + if in_quote: + current.append(char) + else: + if current: + parts.append("".join(current)) + current = [] + else: + current.append(char) + if current: + parts.append("".join(current)) + + if len(parts) >= len(loop_headers): + group = clean_val(parts[group_col]) if group_col is not None else 'ATOM' + if group in ('ATOM', 'HETATM'): + atom_count += 1 + atom_name = clean_val(parts[atom_name_col]) if atom_name_col is not None else '' + residue_name = clean_val(parts[res_name_col]) if res_name_col is not None else '' + chain_id = clean_val(parts[chain_col]) if chain_col is not None else 'A' + chain_id = chain_id.strip() or "_" + raw_residue = clean_val(parts[res_id_col]) if res_id_col is not None else '1' + try: + residue_id = int(raw_residue) + except ValueError: + i += 1 + continue + chains.setdefault(chain_id, {}).setdefault( + residue_id, + {"id": residue_id, "name": residue_name, "atoms": []}, + ) + if atom_name and atom_name not in chains[chain_id][residue_id]["atoms"]: + chains[chain_id][residue_id]["atoms"].append(atom_name) + i += 1 + in_loop = False + else: + i += 1 + else: + i += 1 + else: + # Standard PDB parser + for line in pdb_text.splitlines(): + if not line.startswith(("ATOM ", "HETATM")): + continue + atom_count += 1 + atom_name = line[12:16].strip() + residue_name = line[17:20].strip() + chain_id = line[21].strip() or "_" + raw_residue = line[22:26].strip() + try: + residue_id = int(raw_residue) + except ValueError: + continue + chains.setdefault(chain_id, {}).setdefault( + residue_id, + {"id": residue_id, "name": residue_name, "atoms": []}, + ) + if atom_name and atom_name not in chains[chain_id][residue_id]["atoms"]: + chains[chain_id][residue_id]["atoms"].append(atom_name) + + chain_payload = [] + for chain_id, residues in sorted(chains.items()): + chain_payload.append( + { + "id": chain_id, + "residues": [ + { + "id": residue["id"], + "name": residue["name"], + "atoms": sorted(residue["atoms"]), + } + for residue in sorted(residues.values(), key=lambda item: item["id"]) + ], + } + ) + return { + "filename": path.name, + "path": str(path), + "atom_count": atom_count, + "chains": chain_payload, + "pdb_text": pdb_text, + } diff --git a/tests/test_api.py b/tests/test_api.py index 4175a33..5141f8f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -17,18 +17,30 @@ from typing import Dict, Any import json +import numpy as np # Ensure the vendored "quest" package (in modules/quest) is importable # tests are in modules/quest/tests, so parents[3] is the repository root -ROOT = Path(__file__).resolve().parents[3] -QUEST_ROOT = ROOT / "modules" / "quest" +ROOT = Path(__file__).resolve().parents[1] +QUEST_ROOT = ROOT / "quest" if str(QUEST_ROOT) not in sys.path: sys.path.insert(0, str(QUEST_ROOT)) from quest.api import load_project, simulate_project, DecaySimulationResult # type: ignore[import] -PDB_PATH = ROOT / "test" / "data" / "atomic_coordinates" / "pdb_files" / "148l.pdb" +PDB_PATH = Path(__file__).resolve().parent / "148l.pdb" +AAS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AAS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: @@ -44,7 +56,13 @@ def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: project["pdb"] = str(PDB_PATH) project["attachment"] = { "chain": "E", - "residue": 10, + # Re-picked with the move to IMP radii. This project switches every + # quencher off except TYR, so `quenching_grid.max() >= 2.0` really + # asserts "a tyrosine is within critical_distance of the accessible + # volume". The larger atoms shrink that volume, and residue 10 no + # longer has one in reach — of the labelable sites on this chain only + # 36 and 82 do. + "residue": 36, "atom": "CB", } @@ -64,15 +82,11 @@ def _make_minimal_project(with_fret: bool) -> Dict[str, Any]: project["skip_frame"] = 10 project["tau0"] = 4.2 - project["kQ"] = 2.0 - project["slow_fact"] = 0.1 project["critical_distance"] = 6.5 - project["quencher"] = {"TYR": ["CB"]} + project["amino_acid_interactions"] = _aa_interactions(TYR={"kQ": 2.0}) project["output_file"] = "test_out" project["save_avs"] = False - project["all_quencher_atoms"] = True - project["sticky_mode"] = "quencher" # Dyes and per-dye diffusion coefficients dyes = [] @@ -183,3 +197,80 @@ def test_simulate_project_with_fret() -> None: if result.fret_efficiency is not None: assert 0.0 <= result.fret_efficiency <= 1.0 + + +def test_simulate_project_with_custom_amino_acid_kq() -> None: + """Verify that per-AA kQ values drive the additive quenching-rate grid.""" + project = _make_minimal_project(with_fret=False) + project["amino_acid_interactions"] = _aa_interactions( + TYR={"kQ": 3.0}, + MET={"kQ": 1.5}, + ) + result = simulate_project(project) + assert isinstance(result, DecaySimulationResult) + assert 0.0 < result.quantum_yield_donor <= 1.0 + + +def test_simulate_project_job_dir(tmp_path: Path) -> None: + """Verify that running a simulation writes files to a unique folder under project_dir.""" + project = _make_minimal_project(with_fret=False) + result = simulate_project(project, project_dir=tmp_path) + assert isinstance(result, DecaySimulationResult) + assert result.job_id is not None + + jobs_dir = tmp_path / "jobs" + assert jobs_dir.is_dir() + + job_folders = [p for p in jobs_dir.iterdir() if p.is_dir()] + assert len(job_folders) == 1 + job_folder = job_folders[0] + assert job_folder.name == result.job_id + + # Verify uuid format + import uuid + uuid.UUID(job_folder.name) + + out_xyz = job_folder / "out.xyz" + out_slow_xyz = job_folder / "out_slow.xyz" + result_json = job_folder / "result.json" + sampled_density_mrc = job_folder / "sampled_dye_density.mrc" + diffusion_coefficients_mrc = job_folder / "diffusion_coefficients.mrc" + quenching_rates_mrc = job_folder / "quenching_rates.mrc" + aa_residence_csv = job_folder / "aa_residence.csv" + + assert out_xyz.is_file() + assert out_slow_xyz.is_file() + assert result_json.is_file() + assert sampled_density_mrc.is_file() + assert diffusion_coefficients_mrc.is_file() + assert quenching_rates_mrc.is_file() + assert aa_residence_csv.is_file() + assert sampled_density_mrc.stat().st_size > 1024 + with sampled_density_mrc.open("rb") as f: + header = f.read(212) + assert header[208:212] == b"MAP " + with diffusion_coefficients_mrc.open("rb") as f: + header = f.read(1024) + diffusion_grid = np.frombuffer(f.read(), dtype=np.float32) + assert header[208:212] == b"MAP " + assert diffusion_grid.max() <= project["fret"]["dyes"][0]["D"] + assert diffusion_grid.max() > 0.0 + with quenching_rates_mrc.open("rb") as f: + header = f.read(1024) + quenching_grid = np.frombuffer(f.read(), dtype=np.float32) + assert header[208:212] == b"MAP " + assert quenching_grid.max() >= 2.0 + + with result_json.open("r", encoding="utf8") as f: + data = json.load(f) + assert data["job_id"] == result.job_id + assert "time_ns" in data + assert "donor_counts" in data + assert result.trajectory_points is not None + assert result.trajectory_points.ndim == 2 + assert result.trajectory_points.shape[1] == 3 + assert len(result.trajectory_points) <= 2000 + assert data["trajectory_points"] == result.trajectory_points.tolist() + assert isinstance(result.aa_residence, list) + assert data["aa_residence"] == result.aa_residence + assert aa_residence_csv.read_text(encoding="utf-8").startswith("residue_name,center_count") diff --git a/tests/test_cli.py b/tests/test_cli.py index 201db46..6ae216f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,4 +1,5 @@ import json +import os from pathlib import Path import pytest @@ -17,6 +18,7 @@ def __init__(self, time, donor_counts, fret_counts=None): self.collisions_fraction = 0.1 self.fret_efficiency = None self.project = {"dummy": True} + self.aa_residence = [] def test_set_path_nested(): @@ -59,24 +61,29 @@ def test_resolve_output_path_multiple(tmp_path): def test_validate_project_missing_key_raises(): + import click bad = {"tau0": 1.0} # missing many keys - with pytest.raises(SystemExit): - # click exceptions propagate as SystemExit in tests + with pytest.raises(click.ClickException): cli._validate_project(bad) def test_simulate_set_and_grid(monkeypatch, tmp_path): + interactions = { + residue: {"slow_factor": 1.0, "kQ": 0.0} + for residue in [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", + ] + } project = { "tau0": 4.2, - "kQ": 0.0, "n_photons": 10, "t_max": 10.0, "t_step": 0.1, "dg": 0.0, - "slow_fact": 0.1, "critical_distance": 8.5, "av_parameter": 1000, - "quencher": "TRY", + "amino_acid_interactions": interactions, "pdb": str(tmp_path / "dummy.pdb"), "fret": {"dyes": [{"D": 7.5}]}, } @@ -87,12 +94,14 @@ def test_simulate_set_and_grid(monkeypatch, tmp_path): # stub api.load_project and simulate_project monkeypatch.setattr(api, "load_project", lambda path: project) - def fake_sim(project, pdb_path=None, nbins=None, tac_range=None): - return DummyResult(time=[0, 1], donor_counts=[1, 2]) + def fake_sim(project, pdb_path=None, nbins=None, tac_range=None, **kwargs): + import numpy as np + return DummyResult(time=np.array([0.0, 1.0]), donor_counts=np.array([1.0, 2.0])) monkeypatch.setattr(api, "simulate_project", fake_sim) - runner = cli.click.testing.CliRunner() + import click.testing + runner = click.testing.CliRunner() result = runner.invoke( cli.cli, [ @@ -111,3 +120,89 @@ def fake_sim(project, pdb_path=None, nbins=None, tac_range=None): # two runs written outs = list(tmp_path.glob("out_fret.dyes.0.D-*.json")) assert len(outs) == 2 + payload = json.loads(outs[0].read_text(encoding="utf8")) + assert payload["aa_residence"] == [] + + +@pytest.mark.skipif( + os.environ.get("QUEST_RUN_1ANF_REGRESSION") != "1", + reason="1anf CLI residence diagnostic is opt-in because it is slow and may need PDB cache/network.", +) +def test_1anf_cli_aa_sticking_increases_event_residence(tmp_path): + project = cli._template_project(with_fret=False) + project.update( + { + "pdb": "1anf", + "attachment": {"chain": "A", "residue": 72, "atom": "CB"}, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "dg": 0.5, + "slow_radius": 8.5, + "t_max": 2000, + "t_step": 0.02, + "n_photons": 1000, + "n_bins": 128, + "tau0": 4.2, + "critical_distance": 4.0, + "save_avs": False, + "random_seed": 123, + } + ) + project["fret"]["dyes"][0].update( + { + "name": "D0", + "role": "donor", + "D": 7.0, + "attachment": project["attachment"], + "av_parameter": project["av_parameter"], + } + ) + + project_path = tmp_path / "1anf.json" + project_path.write_text(json.dumps(project), encoding="utf8") + + import click.testing + + runner = click.testing.CliRunner() + control = runner.invoke( + cli.cli, + [ + "simulate", + "-p", + str(project_path), + "-o", + str(tmp_path / "control.json"), + "--set", + "amino_acid_interactions.ASP.slow_factor=1.0", + "--set", + "amino_acid_interactions.GLU.slow_factor=1.0", + ], + ) + sticky = runner.invoke( + cli.cli, + [ + "simulate", + "-p", + str(project_path), + "-o", + str(tmp_path / "sticky.json"), + "--set", + "amino_acid_interactions.ASP.slow_factor=0.00001", + "--set", + "amino_acid_interactions.GLU.slow_factor=0.00001", + ], + ) + assert control.exit_code == 0, control.output + assert sticky.exit_code == 0, sticky.output + + def by_residue(path: Path): + payload = json.loads(path.read_text(encoding="utf8")) + return {row["residue_name"]: row for row in payload["aa_residence"]} + + control_rows = by_residue(tmp_path / "control.json") + sticky_rows = by_residue(tmp_path / "sticky.json") + control_acidic_total = sum(control_rows[aa]["attributed_total_time_ns"] for aa in ("ASP", "GLU")) + sticky_acidic_total = sum(sticky_rows[aa]["attributed_total_time_ns"] for aa in ("ASP", "GLU")) + control_acidic_max = max(control_rows[aa]["attributed_max_event_time_ns"] for aa in ("ASP", "GLU")) + sticky_acidic_max = max(sticky_rows[aa]["attributed_max_event_time_ns"] for aa in ("ASP", "GLU")) + assert sticky_acidic_total > control_acidic_total + assert sticky_acidic_max > control_acidic_max diff --git a/tests/test_cli_smoke.py b/tests/test_cli_smoke.py index 94d9b7d..c423426 100644 --- a/tests/test_cli_smoke.py +++ b/tests/test_cli_smoke.py @@ -7,17 +7,30 @@ from click.testing import CliRunner # Ensure vendored quest package (modules/quest) is on sys.path -ROOT = Path(__file__).resolve().parents[3] -QUEST_ROOT = ROOT / "modules" / "quest" +ROOT = Path(__file__).resolve().parents[1] +QUEST_ROOT = ROOT / "quest" if str(QUEST_ROOT) not in sys.path: sys.path.insert(0, str(QUEST_ROOT)) from quest.cli import cli # type: ignore[import] +AMINO_ACIDS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AMINO_ACIDS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions + + def _make_minimal_project() -> dict: project: dict = {} - project["pdb"] = str(ROOT / "test" / "data" / "atomic_coordinates" / "pdb_files" / "148l.pdb") + project["pdb"] = str(Path(__file__).resolve().parent / "148l.pdb") project["attachment"] = {"chain": "E", "residue": 10, "atom": "CB"} project["av_parameter"] = {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5} project["dg"] = 0.5 @@ -28,14 +41,10 @@ def _make_minimal_project() -> dict: project["n_bins"] = 128 project["skip_frame"] = 5 project["tau0"] = 4.2 - project["kQ"] = 2.0 - project["slow_fact"] = 0.1 project["critical_distance"] = 6.5 - project["quencher"] = {"TYR": ["CB"]} + project["amino_acid_interactions"] = _aa_interactions(TYR={"slow_factor": 0.1, "kQ": 2.0}) project["output_file"] = "test_out" project["save_avs"] = False - project["all_quencher_atoms"] = True - project["sticky_mode"] = "quencher" project["fret"] = {"enabled": False, "dyes": [ { "name": "D0", diff --git a/tests/test_jobs_and_structure_info.py b/tests/test_jobs_and_structure_info.py new file mode 100644 index 0000000..629f64c --- /dev/null +++ b/tests/test_jobs_and_structure_info.py @@ -0,0 +1,139 @@ +"""Job artefacts and structure metadata, as domain operations. + +Both used to live inside the web backend, reachable only from a browser. A +notebook, the CLI and a host application have the same need, so they are tested +here against the domain rather than through HTTP. +""" + +from __future__ import annotations + +import json +import uuid +import zipfile +from pathlib import Path + +import pytest + +from quest import jobs +from quest.structure_info import structure_metadata + +STRUCTURE = Path(__file__).parent / "148l.pdb" + + +def _make_job(root: Path, *, chain: str = "E", residue: int = 55, result: bool = True) -> str: + job_id = str(uuid.uuid4()) + job_dir = root / "jobs" / job_id + job_dir.mkdir(parents=True) + (job_dir / "project.json").write_text( + json.dumps({"attachment": {"chain": chain, "residue": residue, "atom": "CB"}}), + encoding="utf8", + ) + if result: + (job_dir / "result.json").write_text(json.dumps({"quantum_yield_donor": 0.5}), encoding="utf8") + (job_dir / "decay.csv").write_text("t,counts\n0,1\n", encoding="utf8") + return job_id + + +class TestStructureMetadata: + def test_reports_chains_residues_and_atoms(self) -> None: + metadata = structure_metadata(STRUCTURE) + assert metadata["atom_count"] == 1525 + chains = {chain["id"]: chain for chain in metadata["chains"]} + assert set(chains) == {"A", "E", "S"} + # T4 lysozyme is the long chain; the ligand and solvent chains are short. + assert len(chains["E"]["residues"]) == 291 + + residue = next(r for r in chains["E"]["residues"] if r["id"] == 55) + assert "CB" in residue["atoms"] + assert residue["atoms"] == sorted(residue["atoms"]) + + def test_residues_come_back_in_sequence_order(self) -> None: + residues = structure_metadata(STRUCTURE)["chains"][1]["residues"] + ids = [residue["id"] for residue in residues] + assert ids == sorted(ids) + + def test_the_raw_text_is_included_for_a_viewer(self) -> None: + metadata = structure_metadata(STRUCTURE) + assert metadata["pdb_text"].startswith("HEADER") or "ATOM" in metadata["pdb_text"] + assert metadata["filename"] == "148l.pdb" + + def test_a_missing_file_is_an_error(self, tmp_path: Path) -> None: + with pytest.raises(FileNotFoundError): + structure_metadata(tmp_path / "nope.pdb") + + +class TestJobListing: + def test_newest_first_with_paging(self, tmp_path: Path) -> None: + import os + import time + + ids = [] + for index in range(4): + job_id = _make_job(tmp_path, residue=50 + index) + # Distinct mtimes, so "newest first" is well defined. + os.utime(tmp_path / "jobs" / job_id, (time.time() + index, time.time() + index)) + ids.append(job_id) + + page = jobs.list_jobs(tmp_path, limit=2) + assert page["total"] == 4 + assert [job["job_id"] for job in page["jobs"]] == ids[::-1][:2] + + second = jobs.list_jobs(tmp_path, limit=2, offset=2) + assert [job["job_id"] for job in second["jobs"]] == ids[::-1][2:] + + def test_paging_is_clamped_not_rejected(self, tmp_path: Path) -> None: + assert jobs.list_jobs(tmp_path, limit=0)["limit"] == 1 + assert jobs.list_jobs(tmp_path, limit=10_000)["limit"] == jobs.MAX_JOB_LIST_LIMIT + assert jobs.list_jobs(tmp_path, offset=-5)["offset"] == 0 + + def test_only_uuid_directories_count_as_runs(self, tmp_path: Path) -> None: + _make_job(tmp_path) + (tmp_path / "jobs" / "not-a-job").mkdir() + (tmp_path / "jobs" / "stray.txt").write_text("x", encoding="utf8") + + assert jobs.list_jobs(tmp_path)["total"] == 1 + + def test_a_missing_jobs_directory_is_empty_not_an_error(self, tmp_path: Path) -> None: + assert jobs.list_jobs(tmp_path) == {"jobs": [], "total": 0, "limit": 50, "offset": 0} + + def test_the_summary_names_the_labeling_site(self, tmp_path: Path) -> None: + _make_job(tmp_path, chain="E", residue=132) + summary = jobs.list_jobs(tmp_path)["jobs"][0] + assert summary["labeling_site"] == "E:132" + assert summary["date"] + # Summaries only — the project and result stay on disk. + assert set(summary) == {"job_id", "labeling_site", "date"} + + def test_an_unfinished_run_says_so(self, tmp_path: Path) -> None: + job_id = str(uuid.uuid4()) + (tmp_path / "jobs" / job_id).mkdir(parents=True) + summary = jobs.list_jobs(tmp_path)["jobs"][0] + assert summary["labeling_site"] == "No result yet" + + +class TestReadingAndArchiving: + def test_reads_the_result(self, tmp_path: Path) -> None: + job_id = _make_job(tmp_path) + assert jobs.read_job(job_id, tmp_path)["quantum_yield_donor"] == 0.5 + + def test_a_non_uuid_is_rejected(self, tmp_path: Path) -> None: + with pytest.raises(ValueError): + jobs.read_job("../etc/passwd", tmp_path) + + def test_a_missing_result_is_not_found(self, tmp_path: Path) -> None: + job_id = _make_job(tmp_path, result=False) + with pytest.raises(FileNotFoundError): + jobs.read_job(job_id, tmp_path) + + def test_archiving_collects_the_artefacts(self, tmp_path: Path) -> None: + job_id = _make_job(tmp_path) + archive = jobs.archive_job(job_id, tmp_path) + + with zipfile.ZipFile(archive) as zipped: + names = set(zipped.namelist()) + assert {"project.json", "result.json", "decay.csv"} <= names + # The archive never contains itself, however many times it is built. + assert archive.name not in names + assert jobs.archive_job(job_id, tmp_path) == archive + with zipfile.ZipFile(archive) as zipped: + assert archive.name not in set(zipped.namelist()) diff --git a/tests/test_pdb_id_support.py b/tests/test_pdb_id_support.py new file mode 100644 index 0000000..20024af --- /dev/null +++ b/tests/test_pdb_id_support.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +import json +import sys +import urllib.error +from pathlib import Path + +import click +import pytest + +# The web backend is an optional extra: `arm64` has IMP and Qt but no FastAPI. +TestClient = pytest.importorskip( + "fastapi.testclient", reason="the web extra is not installed" +).TestClient + +ROOT = Path(__file__).resolve().parents[1] +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +from quest import cli +from quest.structure_fetch import download_pdb_id, is_pdb_id, resolve_structure_path +from webui.backend.app.main import app + +AMINO_ACIDS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AMINO_ACIDS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions + + +class _FakeResponse: + def __init__(self, content: bytes) -> None: + self._content = content + + def __enter__(self) -> "_FakeResponse": + return self + + def __exit__(self, *args: object) -> None: + return None + + def read(self) -> bytes: + return self._content + + +def _minimal_project(pdb_source: str) -> dict: + return { + "pdb": pdb_source, + "tau0": 4.2, + "n_photons": 1000, + "t_max": 200.0, + "t_step": 0.02, + "dg": 0.5, + "critical_distance": 6.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": _aa_interactions(TYR={"slow_factor": 0.1, "kQ": 2.0}), + "fret": {"enabled": False, "dyes": [{"D": 7.0}]}, + } + + +def test_download_pdb_id_caches_rcsb_file(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + calls: list[str] = [] + + def fake_urlopen(url: str, timeout: int) -> _FakeResponse: + calls.append(url) + assert timeout == 30 + return _FakeResponse(b"ATOM 1 N ALA A 1 0.000 0.000 0.000\n") + + # These cover QuEst's *standalone* fetch. When a ChiSurf checkout is + # reachable the real call delegates to the host's shared implementation, + # which this monkeypatched urlopen would never see. + monkeypatch.setattr("quest.structure_fetch._shared_downloader", lambda: None) + monkeypatch.setattr("quest.structure_fetch.urllib.request.urlopen", fake_urlopen) + + path = download_pdb_id("148l", cache_dir=tmp_path) + + assert path == tmp_path / "148l.pdb" + assert path.read_text(encoding="utf8").startswith("ATOM") + assert calls == ["https://files.rcsb.org/download/148L.pdb"] + assert download_pdb_id("148L", cache_dir=tmp_path) == path + assert len(calls) == 1 + + +def test_download_pdb_id_falls_back_to_cif(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + calls: list[str] = [] + + def fake_urlopen(url: str, timeout: int) -> _FakeResponse: + calls.append(url) + if url.endswith(".pdb"): + raise urllib.error.HTTPError(url, 404, "Not Found", hdrs=None, fp=None) + return _FakeResponse(b"data_1ABC\n#\n") + + # These cover QuEst's *standalone* fetch. When a ChiSurf checkout is + # reachable the real call delegates to the host's shared implementation, + # which this monkeypatched urlopen would never see. + monkeypatch.setattr("quest.structure_fetch._shared_downloader", lambda: None) + monkeypatch.setattr("quest.structure_fetch.urllib.request.urlopen", fake_urlopen) + + path = download_pdb_id("1abc", cache_dir=tmp_path) + + assert path == tmp_path / "1abc.cif" + assert path.read_text(encoding="utf8").startswith("data_1ABC") + assert calls == [ + "https://files.rcsb.org/download/1ABC.pdb", + "https://files.rcsb.org/download/1ABC.cif", + ] + + +def test_resolve_structure_path_accepts_files_and_pdb_ids(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + local = tmp_path / "local.pdb" + local.write_text("ATOM\n", encoding="utf8") + monkeypatch.setattr("quest.structure_fetch.download_pdb_id", lambda pdb_id, cache_dir=None: tmp_path / f"{pdb_id.lower()}.pdb") + + assert resolve_structure_path(local) == local + assert resolve_structure_path("1abc") == tmp_path / "1abc.pdb" + assert is_pdb_id("1abc") + assert not is_pdb_id("local.pdb") + + +def test_cli_validation_accepts_pdb_id(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + cached = tmp_path / "148l.pdb" + cached.write_text("ATOM\n", encoding="utf8") + monkeypatch.setattr("quest.cli.resolve_structure_path", lambda source: cached) + + cli._validate_project(_minimal_project("148l")) + + monkeypatch.setattr("quest.cli.resolve_structure_path", lambda source: (_ for _ in ()).throw(FileNotFoundError("missing"))) + with pytest.raises(click.ClickException): + cli._validate_project(_minimal_project("missing.pdb")) + + +def test_backend_metadata_downloads_pdb_id(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + pdb_file = tmp_path / "1abc.pdb" + pdb_file.write_text( + "ATOM 1 CA ALA A 1 0.000 0.000 0.000 1.00 0.00 C\n", + encoding="utf8", + ) + monkeypatch.setattr("webui.backend.app.main.resolve_structure_path", lambda source: pdb_file) + + client = TestClient(app) + response = client.post("/api/structure/metadata", data={"pdb_path": "1abc"}) + + assert response.status_code == 200 + payload = response.json() + assert payload["filename"] == "1abc.pdb" + assert payload["path"] == str(pdb_file) + assert payload["atom_count"] == 1 + + +def test_backend_validate_rewrites_pdb_id_to_cached_path(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + cached = tmp_path / "1abc.pdb" + cached.write_text("ATOM\n", encoding="utf8") + monkeypatch.setattr("webui.backend.app.main.resolve_structure_path", lambda source: cached) + + client = TestClient(app) + response = client.post("/api/validate", data={"project_json": json.dumps(_minimal_project("1abc"))}) + + assert response.status_code == 200 + assert response.json()["project"]["pdb"] == str(cached) diff --git a/tests/test_scan_reporting.py b/tests/test_scan_reporting.py new file mode 100644 index 0000000..d9bf9eb --- /dev/null +++ b/tests/test_scan_reporting.py @@ -0,0 +1,143 @@ +"""Tests for what a scan reports: quencher attribution and failure diagnostics. + +The CLI and the WebUI both scan labelling sites and both summarise each site +with the residue types that quenched it, so they share `top_quenchers`. When a +site cannot be simulated the error has to say which selection was wrong -- +a scan moves the donor but leaves the acceptor alone, so a stale acceptor makes +every site fail for a reason that has nothing to do with the site. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest +from click.testing import CliRunner + +from quest import api, cli +from quest.core.av import AV +from quest.core.dye_diffusion import default_amino_acid_interactions + +PDB_PATH = Path(__file__).parent / "148l.pdb" + + +class TestTopQuenchers: + def test_orders_by_share_and_drops_silent_residues(self) -> None: + rows = [ + {"residue_name": "PRO", "mean_quench_rate": 0.05, "quench_rate_fraction": 0.2}, + {"residue_name": "ALA", "mean_quench_rate": 0.0, "quench_rate_fraction": 0.0}, + {"residue_name": "TYR", "mean_quench_rate": 0.20, "quench_rate_fraction": 0.8}, + ] + top = api.top_quenchers(rows) + assert [row["residue_name"] for row in top] == ["TYR", "PRO"] + assert top[0]["quench_rate_fraction"] == 0.8 + + def test_honours_the_limit(self) -> None: + rows = [ + {"residue_name": name, "mean_quench_rate": rate, "quench_rate_fraction": rate} + for name, rate in (("TRP", 0.4), ("TYR", 0.3), ("MET", 0.2), ("HIS", 0.1)) + ] + assert len(api.top_quenchers(rows, limit=2)) == 2 + assert [row["residue_name"] for row in api.top_quenchers(rows, limit=2)] == ["TRP", "TYR"] + + @pytest.mark.parametrize("value", [None, []]) + def test_tolerates_a_missing_residence_table(self, value) -> None: + assert api.top_quenchers(value) == [] + + +class TestAttachmentErrors: + def test_a_missing_atom_names_the_site(self) -> None: + """Regression: this used to be a bare 'Invalid selection of attachment atom'.""" + with pytest.raises(ValueError, match=r"No attachment atom Z:9999:CB"): + AV( + str(PDB_PATH), + residue_seq_number=9999, + atom_name="CB", + chain_identifier="Z", + linker_length=21.5, + linker_width=0.5, + radius1=3.5, + ) + + def test_a_stale_acceptor_is_reported_as_such(self, tmp_path: Path) -> None: + """Otherwise every scanned site fails for a reason that looks like its own.""" + project = _project() + project["fret"] = { + "enabled": True, + "dyes": [ + {"name": "D0", "D": 7.0, "random_seed": 5}, + { + "name": "A0", + "D": 7.0, + "attachment": {"chain": "Z", "residue": 9999, "atom": "CB"}, + }, + ], + "R0_matrix": [[None, 52.0], [52.0, None]], + } + with pytest.raises(ValueError, match=r"Acceptor dye: No attachment atom Z:9999:CB"): + api.simulate_project(project, project_dir=tmp_path, save_outputs=False) + + +def _project(residue: int = 18): + return { + "tau0": 4.2, + "n_photons": 2000, + "t_max": 200.0, + "t_step": 0.02, + "dg": 0.5, + "critical_distance": 8.5, + "slow_radius": 8.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": default_amino_acid_interactions(slow_factor=0.1), + "attachment": {"chain": "E", "residue": residue, "atom": "CB"}, + "pdb": str(PDB_PATH), + "n_bins": 64, + "parallel_trajectories": 1, + "fret": {"enabled": False, "dyes": [{"name": "D0", "D": 7.0, "random_seed": 5}]}, + } + + +class TestScanCommand: + def test_reports_quenchers_and_writes_no_job_directories(self, tmp_path: Path) -> None: + project_path = tmp_path / "project.json" + project_path.write_text(json.dumps(_project()), encoding="utf8") + + sites = { + "Positions": { + f"E{residue}": { + "chain_identifier": "E", + "residue_seq_number": residue, + "atom_name": "CB", + } + # 17 has no accessible volume since radii moved to IMP's. + for residue in (36, 18) + } + } + sites_path = tmp_path / "fps.json" + sites_path.write_text(json.dumps(sites), encoding="utf8") + output_path = tmp_path / "scan.json" + + result = CliRunner().invoke( + cli.cli, + [ + "scan", + "-p", str(project_path), + "-l", str(sites_path), + "-o", str(output_path), + ], + ) + assert result.exit_code == 0, result.output + + rows = json.loads(output_path.read_text(encoding="utf8")) + assert len(rows) == 2 + for row in rows.values(): + assert row["status"] == "success", row.get("error") + assert "dominant_quencher" in row + assert isinstance(row["quenchers"], list) + for quencher in row["quenchers"]: + assert quencher["mean_quench_rate"] > 0.0 + + # The scan writes one summary row per site; per-run job directories are + # never read and used to cost more than the simulation itself. + assert not (tmp_path / "jobs").exists() diff --git a/tests/test_service_layer.py b/tests/test_service_layer.py new file mode 100644 index 0000000..15b5dc6 --- /dev/null +++ b/tests/test_service_layer.py @@ -0,0 +1,314 @@ +"""Tests for the RPC service layer and the layering rules it exists to enforce. + +The point of the service layer is that every surface calls the same operation +under the same name and gets the same shape back. These tests pin that +contract, and the guardrails below pin the layering that makes it true. +""" + +from __future__ import annotations + +import ast +import json +from pathlib import Path + +import pytest + +from quest.backend import ( + METHODS, + InProcessClient, + RemoteError, + ServiceDispatcher, + local_client, + register_services, +) +from quest.scan import simulate_site, site_project + +REPO_ROOT = Path(__file__).resolve().parents[1] + + +class TestRegistry: + def test_every_documented_method_is_registered(self) -> None: + dispatcher = ServiceDispatcher() + register_services(dispatcher) + assert dispatcher.methods == sorted(METHODS) + + def test_registering_a_name_twice_is_refused(self) -> None: + """One operation, one name: a silent overwrite would depend on import order.""" + dispatcher = ServiceDispatcher() + register_services(dispatcher) + with pytest.raises(ValueError): + register_services(dispatcher) + + def test_unknown_method_fails_without_raising(self) -> None: + response = local_client().call("quest.does_not_exist") + assert response == {"ok": False, "error": "Unknown method: quest.does_not_exist"} + + def test_a_raising_handler_becomes_a_failure_envelope(self) -> None: + dispatcher = ServiceDispatcher() + + def boom(params): + raise KeyError("nope") + + dispatcher.register("quest.boom", boom) + response = dispatcher.dispatch("quest.boom") + assert response["ok"] is False + assert "KeyError" in response["error"] + + def test_result_raises_on_failure(self) -> None: + client = local_client() + with pytest.raises(RemoteError): + client.result("quest.validate", {"project": {"tau0": 1.0}}) + + +class TestMethods: + def test_template_round_trips_through_validate(self) -> None: + client = local_client() + project = client.result("quest.template", {"with_fret": True})["project"] + # The template names a structure that does not exist, so validation is + # asked about everything else by supplying a resolvable override. + project.pop("pdb") + response = client.call("quest.validate", {"project": project}) + assert response["ok"] is False + assert "pdb" in response["error"] + + def test_template_without_fret(self) -> None: + project = local_client().result("quest.template", {"with_fret": False})["project"] + assert project["fret"]["enabled"] is False + assert len(project["fret"]["dyes"]) == 1 + + def test_validate_names_every_missing_key(self) -> None: + response = local_client().call("quest.validate", {"project": {"tau0": 1.0}}) + assert response["ok"] is False + for key in ("n_photons", "t_max", "dg", "amino_acid_interactions"): + assert key in response["error"] + + def test_parameter_catalog_is_the_shipped_one(self) -> None: + catalog = local_client().result("quest.parameter_catalog") + assert catalog["version"] == 1 + assert "pdb" in catalog["parameters"] + + def test_dyes_carry_complete_stickiness(self) -> None: + dyes = local_client().result("quest.dyes.list") + assert "Alexa488" in dyes + for dye in dyes.values(): + assert "slow_radius" in dye + assert "TRP" in dye["amino_acid_interactions"] + + def test_saving_a_nameless_dye_fails(self) -> None: + response = local_client().call("quest.dyes.save", {"dye": {"tau0": 4.0}}) + assert response["ok"] is False + assert "name" in response["error"] + + def test_quenching_defaults_expose_the_pet_chemistry(self) -> None: + defaults = local_client().result("quest.quenching_defaults") + assert len(defaults["residues"]) == 20 + assert set(defaults["reference_pet_quenching"]) == { + "TRP", "TYR", "MET", "HIS", "CYS", "PRO", + } + # The quenching centre of TRP is the indole ring, not CB. + assert "NE1" in defaults["default_quench_atoms"]["TRP"] + + +class TestScanRecordShape: + """Every surface reports a site the same way, success or failure.""" + + POSITION = { + "chain_identifier": "A", + "residue_seq_number": 12, + "atom_name": "CB", + "residue_name": "TRP", + } + + def test_failure_and_success_records_have_the_same_keys(self) -> None: + failed = simulate_site({}, self.POSITION, name="site-1") + assert failed["status"] == "failed" + assert failed["error"] + # A failure carries the full key set with nulls, so a table of results + # never has ragged rows. + expected = { + "name", "chain", "residue", "residue_name", "atom", "status", "error", + "lifetime", "quantum_yield", "contact_fraction", "av_volume", + "contact_volume", "contact_to_free_ratio", "dominant_quencher", + "dominant_quencher_fraction", "quenchers", + } + assert set(failed) == expected + + def test_failure_reports_which_site_failed(self) -> None: + failed = simulate_site({}, self.POSITION, name="site-1") + assert failed["name"] == "site-1" + assert failed["chain"] == "A" + assert failed["residue"] == 12 + assert failed["residue_name"] == "TRP" + + def test_site_project_moves_the_attachment_and_the_donor_dye(self) -> None: + base = { + "av_parameter": {"linker_length": 21.5}, + "fret": {"enabled": True, "dyes": [{"name": "donor", "D": 7.5}, {"name": "acceptor"}]}, + } + site = site_project(base, {**self.POSITION, "linker_length": 30.0}) + + assert site["attachment"] == {"chain": "A", "residue": 12, "atom": "CB"} + assert site["av_parameter"]["linker_length"] == 30.0 + donor = site["fret"]["dyes"][0] + assert donor["attachment"] == site["attachment"] + assert donor["av_parameter"]["linker_length"] == 30.0 + # The acceptor is left alone, and the caller's project is not mutated. + assert site["fret"]["dyes"][1] == {"name": "acceptor"} + assert base["av_parameter"] == {"linker_length": 21.5} + assert "attachment" not in base["fret"]["dyes"][0] + + def test_grid_resolution_maps_onto_dg(self) -> None: + site = site_project({}, {**self.POSITION, "simulation_grid_resolution": 0.4}) + assert site["dg"] == 0.4 + assert "simulation_grid_resolution" not in site["av_parameter"] + + +class TestManifest: + """The manifest is what a host learns QuEst from without importing it.""" + + @staticmethod + def _manifest() -> dict: + return json.loads((REPO_ROOT / "quest" / "manifest.json").read_text(encoding="utf8")) + + def test_identity_and_version_match_the_package(self) -> None: + import re + + manifest = self._manifest() + assert manifest["id"] == "quest" + # tomllib is 3.11+, and this package still supports 3.9. + pyproject = (REPO_ROOT / "pyproject.toml").read_text(encoding="utf8") + version = re.search(r'^version\s*=\s*"([^"]+)"', pyproject, re.MULTILINE) + assert version and manifest["version"] == version.group(1) + + def test_declared_methods_are_exactly_the_registered_ones(self) -> None: + """A manifest that over- or under-declares is a lie a host acts on.""" + declared = {method["name"] for method in self._manifest()["rpc_methods"]} + assert declared == set(METHODS) + + def test_declared_summaries_match_the_registry(self) -> None: + for method in self._manifest()["rpc_methods"]: + assert method["summary"] == METHODS[method["name"]], method["name"] + + def test_every_method_documents_its_shapes(self) -> None: + for method in self._manifest()["rpc_methods"]: + assert method["params_schema"].get("type") == "object", method["name"] + assert method["result_schema"], method["name"] + + def test_the_long_running_methods_are_flagged(self) -> None: + flags = {m["name"]: m["long_running"] for m in self._manifest()["rpc_methods"]} + assert flags["quest.simulate"] is True + assert flags["quest.scan"] is True + assert flags["quest.template"] is False + + def test_entrypoints_resolve(self) -> None: + import importlib + + for kind, target in self._manifest()["entrypoints"].items(): + module_name, _, attribute = target.partition(":") + if kind == "gui": + # Importing the widget needs a Qt binding; check the module path + # is real without importing it. It may be a module or a package. + base = REPO_ROOT / Path(module_name.replace(".", "/")) + assert base.with_suffix(".py").exists() or (base / "__init__.py").exists(), target + continue + module = importlib.import_module(module_name) + assert hasattr(module, attribute), target + + +class TestSurfacesShareTheChemistry: + """The GUI once shipped its own quenching model; it must not again. + + These run without Qt: they check the data the widget is built from, which + is where the divergence lived (a settings file with every quencher on CB + and one global rate). `tests/test_gui_widget.py` checks the widget itself + wherever a Qt binding exists. + """ + + def test_the_gui_has_no_settings_file_of_its_own(self) -> None: + """There is no second place for the GUI's chemistry to live. + + `dye_diffusion.json` used to seed the form, and it pinned a *legacy* + chemistry — every quencher on CB with one global rate — so the desktop + surface simulated something no other surface did. It is gone: the form + starts from `template_project()` like everything else. + """ + assert not (REPO_ROOT / "quest" / "gui" / "dye_diffusion.json").exists() + + from quest.gui.form_model import ProjectFormModel + + project = ProjectFormModel().to_project_dict() + assert project["critical_distance"] == 8.5 + assert "quencher" not in project, "the legacy chemistry block came back" + + def test_the_gui_default_table_matches_the_reference_chemistry(self) -> None: + from quest.core.dye_diffusion import ( + DEFAULT_QUENCHER_ATOMS, + REFERENCE_PET_QUENCHING, + default_quencher_table, + ) + + table = default_quencher_table() + assert set(table) == set(REFERENCE_PET_QUENCHING) + for residue, entry in table.items(): + assert entry["atoms"] == list(DEFAULT_QUENCHER_ATOMS[residue]), residue + assert entry["kQ"] == REFERENCE_PET_QUENCHING[residue]["kQ"], residue + assert table["MET"]["atoms"] == ["SD"] + assert table["TRP"]["kQ"] == 3.5 + + +def _imported_modules(path: Path) -> set[str]: + tree = ast.parse(path.read_text(encoding="utf8")) + modules: set[str] = set() + for node in ast.walk(tree): + if isinstance(node, ast.Import): + modules.update(alias.name for alias in node.names) + elif isinstance(node, ast.ImportFrom) and node.module and node.level == 0: + modules.add(node.module) + return modules + + +class TestLayering: + """Guardrails for the rules in okf/specs/plugin-integration.md.""" + + def test_the_web_backend_does_not_import_the_cli(self) -> None: + """A surface must not reach into another surface's helpers (LAY-01).""" + modules = _imported_modules(REPO_ROOT / "webui" / "backend" / "app" / "main.py") + assert not any(m == "quest.cli" or m.startswith("quest.cli.") for m in modules) + + def test_the_library_does_not_import_the_cli(self) -> None: + # __main__.py is the console entry point; importing the CLI is its job. + for path in (REPO_ROOT / "quest").rglob("*.py"): + if path.name in {"cli.py", "__main__.py"} or "lib/ui" in path.as_posix(): + continue + source = path.read_text(encoding="utf8") + assert "from quest.cli import" not in source, path + assert "from .cli import" not in source, path + + def test_importing_the_domain_does_not_import_qt(self) -> None: + """Structural, not by convention: Qt lives in `quest.gui` and nowhere else. + + Run in a subprocess because this test session may already have imported + a Qt binding for the widget tests. + """ + import subprocess + import sys + + code = ( + "import sys, quest.api, quest.backend, quest.core, quest.core;" + "loaded = [m for m in sys.modules if m.split('.')[0] in " + "('qtpy', 'PyQt5', 'PyQt6', 'PySide2', 'PySide6')];" + "print(','.join(sorted(set(loaded))))" + ) + result = subprocess.run( + [sys.executable, "-c", code], cwd=REPO_ROOT, capture_output=True, text=True + ) + assert result.returncode == 0, result.stderr[-2000:] + assert result.stdout.strip() == "", ( + f"importing the domain pulled in a Qt binding: {result.stdout.strip()}" + ) + + def test_the_service_layer_is_gui_free(self) -> None: + """The backend must import without any Qt binding present.""" + for name in ("dispatcher.py", "services.py", "__init__.py"): + modules = _imported_modules(REPO_ROOT / "quest" / "backend" / name) + assert not any(m.startswith(("qtpy", "PyQt5", "PySide")) for m in modules) diff --git a/tests/test_use_cases.py b/tests/test_use_cases.py new file mode 100644 index 0000000..4506799 --- /dev/null +++ b/tests/test_use_cases.py @@ -0,0 +1,158 @@ +from __future__ import annotations + +import sys +import json +import numpy as np +from pathlib import Path +from click.testing import CliRunner + +# Ensure quest is importable +ROOT = Path(__file__).resolve().parents[1] +if str(ROOT) not in sys.path: + sys.path.insert(0, str(ROOT)) + +from quest.api import simulate_project, DecaySimulationResult +from quest.cli import cli + +PDB_PATH = Path(__file__).resolve().parent / "148l.pdb" + +AMINO_ACIDS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions(**overrides: dict[str, float]) -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AMINO_ACIDS} + for aa, values in overrides.items(): + interactions[aa].update(values) + return interactions + + +def _make_project(with_fret: bool) -> dict: + project = { + "pdb": str(PDB_PATH), + "attachment": {"chain": "E", "residue": 10, "atom": "CB"}, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "dg": 0.5, + "slow_radius": 8.5, + "t_max": 100.0, + "t_step": 0.05, + "n_photons": 5_000, + "n_bins": 256, + "skip_frame": 10, + "tau0": 4.2, + "critical_distance": 6.5, + "amino_acid_interactions": _aa_interactions(TYR={"slow_factor": 0.1, "kQ": 2.0}), + "output_file": "test_out", + "save_avs": False, + } + + dyes = [ + { + "name": "D0", + "role": "donor", + "attachment": project["attachment"], + "av_parameter": project["av_parameter"], + "D": 7.0, + } + ] + + if with_fret: + dyes.append( + { + "name": "A0", + "role": "acceptor", + "attachment": {"chain": "E", "residue": 18, "atom": "CB"}, + "av_parameter": project["av_parameter"], + "D": 7.0, + } + ) + project["fret"] = {"enabled": True, "dyes": dyes, "R0_matrix": [[None, 52.0], [52.0, None]]} + else: + project["fret"] = {"enabled": False, "dyes": dyes, "R0_matrix": []} + + return project + + +def test_use_case_donor_only() -> None: + """Test standard donor-only simulation on 148l.pdb.""" + project = _make_project(with_fret=False) + result = simulate_project(project) + + assert isinstance(result, DecaySimulationResult) + assert result.time.ndim == 1 + assert result.donor_counts.ndim == 1 + assert len(result.time) == project["n_bins"] + assert 0.0 < result.quantum_yield_donor <= 1.0 + assert 0.0 <= result.collisions_fraction <= 1.0 + + +def test_use_case_fret() -> None: + """Test FRET simulation on 148l.pdb.""" + project = _make_project(with_fret=True) + result = simulate_project(project) + + assert isinstance(result, DecaySimulationResult) + assert result.fret_counts is not None + assert len(result.fret_counts) == project["n_bins"] + assert 0.0 <= result.quantum_yield_fret <= 1.0 + assert 0.0 <= result.fret_efficiency <= 1.0 + + +def test_cli_validate_use_case(tmp_path: Path) -> None: + """Test CLI validate command with a valid project file.""" + runner = CliRunner() + project = _make_project(with_fret=False) + project_path = tmp_path / "project.json" + project_path.write_text(json.dumps(project), encoding="utf8") + + result = runner.invoke(cli, ["validate", "-p", str(project_path)]) + assert result.exit_code == 0 + assert "valid" in result.output.lower() + + +def test_cli_simulate_use_case(tmp_path: Path) -> None: + """Test CLI simulate command with output csv/json generation.""" + runner = CliRunner() + project = _make_project(with_fret=False) + project_path = tmp_path / "project.json" + project_path.write_text(json.dumps(project), encoding="utf8") + + out_csv = tmp_path / "out.csv" + result = runner.invoke(cli, ["simulate", "-p", str(project_path), "-o", str(out_csv)]) + assert result.exit_code == 0 + assert out_csv.exists() + + # Check that CSV has headers + lines = out_csv.read_text(encoding="utf8").splitlines() + assert len(lines) > 1 + assert "time" in lines[0] + assert "donor" in lines[0] + + +def test_cli_simulate_grid_sweep_use_case(tmp_path: Path) -> None: + """Test CLI simulate command doing a grid parameter sweep.""" + runner = CliRunner() + project = _make_project(with_fret=False) + project_path = tmp_path / "project.json" + project_path.write_text(json.dumps(project), encoding="utf8") + + out_json = tmp_path / "out.json" + result = runner.invoke(cli, [ + "simulate", + "-p", str(project_path), + # 10 and 15 lost their accessible volume when radii moved to IMP's. + "--grid", "attachment.residue=18,36", + "-o", str(out_json) + ]) + assert result.exit_code == 0 + + # Grid sweeps output multiple files matching format: out_param-val.json + out_files = list(tmp_path.glob("out_attachment.residue-*.json")) + assert len(out_files) == 2 + + # Read one file to verify it's valid JSON result + with out_files[0].open("r", encoding="utf8") as f: + data = json.load(f) + assert "quantum_yield_donor" in data From fde6731c94eff48de852809627a0056651f2f295 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 19:00:36 +0200 Subject: [PATCH 06/86] feat: describe every parameter once, and translate that description Parameter help text was written three times - in the Qt form, in the web UI, and in doc/parameters.md - so the three drifted, and a parameter could mean one thing in a tooltip and another in the docs. quest/settings/parameter_catalog.json is now the single description. Both doc/parameters.md and the Qt form's view spec are generated from it, and the web API serves it, so a parameter is edited in one place and the change reaches every surface at once. Never hand-edit the generated files; regenerate with doc/generate_parameter_docs.py and quest.gui.generate_view_spec. Because the description exists once, translating it is tractable: quest/i18n.py plus locales/{en,de,fr}.json give English, German and French across the docs, the desktop form and the web UI together. The tests assert what makes that safe - a translation is complete, structurally identical to English, and never changes what the software computes. Locale files are cached per process, so a running uvicorn must be restarted after editing one. quest/settings/dye_repository.json replaces the dye presets that were tucked under quest/lib/tools/dye_diffusion/, and the loader fills in the stickiness fields a preset may omit so every entry is complete before it reaches the simulation. --- README.md | 101 +- doc/cli.md | 10 +- doc/generate_parameter_docs.py | 146 ++ doc/index.md | 5 +- doc/logo.png | Bin 0 -> 685331 bytes doc/parameters.de.md | 371 ++++ doc/parameters.fr.md | 371 ++++ doc/parameters.md | 449 ++++- quest/i18n.py | 185 ++ .../tools/dye_diffusion/dye_diffusion.json | 33 - quest/settings/__init__.py | 118 ++ quest/settings/dye_repository.json | 1682 +++++++++++++++++ quest/settings/locales/de.json | 265 +++ quest/settings/locales/en.json | 106 ++ quest/settings/locales/fr.json | 265 +++ quest/settings/parameter_catalog.json | 264 +++ tests/test_i18n.py | 304 +++ 17 files changed, 4530 insertions(+), 145 deletions(-) create mode 100644 doc/generate_parameter_docs.py create mode 100644 doc/logo.png create mode 100644 doc/parameters.de.md create mode 100644 doc/parameters.fr.md create mode 100644 quest/i18n.py delete mode 100644 quest/lib/tools/dye_diffusion/dye_diffusion.json create mode 100644 quest/settings/dye_repository.json create mode 100644 quest/settings/locales/de.json create mode 100644 quest/settings/locales/en.json create mode 100644 quest/settings/locales/fr.json create mode 100644 quest/settings/parameter_catalog.json create mode 100644 tests/test_i18n.py diff --git a/README.md b/README.md index 0ad7b90..02650ac 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,16 @@ [![Build Status](https://travis-ci.org/Fluorescence-Tools/quest.svg?branch=master)](https://travis-ci.org/Fluorescence-Tools/ques) +

+ QuEst Logo +

+ # QuEst - Quenching Estimator ## General description QUEST (QUenching ESTimation) simulates the dynamic quenching of xanthene dyes tethers to proteins by flexible linkers by simulating PET and the -diffusion of dyes. +diffusion of dyes (see [Peulen et al., 2017](https://doi.org/10.1021/acs.jpcb.7b03441)). The dynamic quenching of a fluorescent dye coupled to a protein is simulated in three steps: @@ -27,10 +31,34 @@ to calculate the dye's fluorescence decay. In QUEST the dyes are approximated by a sphere diffusing within their accessible volume (AV) (see [labellib](https://github.com/Fluorescence-Tools/LabelLib)). -PET-quenching of the dye by MET, HIS, TYR and TRP residues is -approximated by a step function where the dye is quenched with a -provided rate contestant if it is closer than a given threshold -distance. +### Amino-acid specific quenching + +PET-quenching is resolved per residue type. Each residue is described by four +quantities, editable per dye in the web UI (*Adv. Settings -> Amino-acid +specific quenching*) or under `amino_acid_interactions` in a project file: + +| Field | Meaning | +| --- | --- | +| `kQ` | Quenching rate (1/ns) applied while the dye is in contact. | +| `quench_radius` | Contact radius (Å), measured from the **dye centre** to the residue's quenching centre. `null` inherits the project-wide `critical_distance`. | +| `quench_atoms` | Atom names whose centroid defines the **quenching centre**. | +| `slow_factor` | Diffusion scaling (0–1) modelling unspecific stickiness near the residue. | + +The quenching centre sits on the residue's redox-active moiety rather than on +CB: the indole ring for TRP, the phenol ring for TYR, the imidazole ring for +HIS, SD for MET and SG for CYS. For tryptophan this moves the quencher ~3.3 Å +away from CB, which matters at contact distances of a few Ångström. + +Quenching rates from residues whose contact spheres overlap **add up**; +stickiness factors **multiply**. Every simulation reports how much each residue +type contributed to the total quenching rate (`quench_rate_fraction` in +`result.json` and `aa_residence.csv`, and the *Quenching by residue type* panel +in the web UI). + +The shipped dye presets start from reference PET parameters for a xanthene dye +(TRP > PRO ≈ TYR > MET > HIS > CYS), scaled to each dye's radius. These are +starting values intended to be calibrated against measured lifetimes, not fixed +constants. The relevant simulation parameters can be adjusted either in a graphical user interface `quest_gui` or QuEst can be controlled @@ -145,6 +173,65 @@ Notes: - Use `--grid key=val1,val2` to sweep multiple values; outputs are tagged per run. - Output format chosen by extension (.csv or .json). +## Webapp and Electron + +QuEst now includes a hostable web surface and a local Electron shell in `webui/`. + +### Hostable web app (FastAPI + Next.js) + +The frontend needs **Node.js 20.9 or newer** (Next.js 16). The repository ships +a [pixi](https://pixi.sh) manifest that provides a pinned Node toolchain in its +own `frontend` environment, so you do not need Node installed system-wide: + +```bash +python -m pip install -e ".[web]" +python -m uvicorn webui.backend.app.main:app --host 127.0.0.1 --port 8000 +# new terminal +pixi run -e frontend dev +``` + +`pixi.toml` and `pixi.lock` are committed, so `pixi install -e frontend` +reproduces the exact toolchain. Available tasks: + +| Task | Does | +| --- | --- | +| `pixi run -e frontend install` | `npm install` in `webui/frontend` | +| `pixi run -e frontend dev` | Next.js dev server on :3000 | +| `pixi run -e frontend build` | Production build (+ standalone assets) | +| `pixi run -e frontend start` | Serve the production build | +| `pixi run -e frontend typecheck` | `tsc --noEmit` | +| `pixi run -e frontend node` | Print the environment's Node version | + +If you prefer your own Node, the plain npm workflow still works — check +`node -v` first, since an older Node fails at startup with a version error: + +```bash +npm --prefix webui/frontend install +npm --prefix webui/frontend run dev +``` + +For production-style frontend: + +```bash +pixi run -e frontend build +pixi run -e frontend start +``` + +Use `QUEST_BACKEND_URL` to point frontend runtime to a hosted backend target. + +### Electron app (local desktop shell) + +```bash +npm --prefix webui/desktop install +npm --prefix webui/desktop run start +``` + +Optional Python override: + +```bash +QUEST_PYTHON=/path/to/python npm --prefix webui/desktop run start +``` + ## Warnings 1. QuEST determines precise values that are not necessary accurate. 2. QuEST was the first software to implement the ACVs. ACVs were later described in more detail (see: [COSB2016](https://doi.org/10.1016/j.sbi.2016.11.012). Differencies in the ACV implementation, may produce slightly different results. @@ -155,13 +242,13 @@ Notes: ## Citation If you have used QuEST in a scientific publication, we would appreciate citations to the following paper: -[![DOI for citing QuEST](https://img.shields.io/badge/https://doi.org/10.1021/acs.jpcb.7b03441-blue.svg)](https://pubs.acs.org/doi/abs/10.1021/acs.jpcb.7b03441) +[![DOI](https://img.shields.io/badge/DOI-10.1021%2Facs.jpcb.7b03441-blue.svg)](https://doi.org/10.1021/acs.jpcb.7b03441) > Peulen, T.O., Opanasyuk, O., and Seidel, C.A., 2017. Combining Graphical and Analytical Methods with Molecular Simulations To Analyze Time-Resolved FRET Measurements of Labeled Macromolecules Accurately. The Journal of Physical Chemistry B 2017, 121, 35, 8211-8241 (Feature Article) For more informations on accessible contact volumes (ACVs) see: -[![DOI for citing LabelLib](https://img.shields.io/badge/DOI-10.1016%2Fj.sbi.2016.11.012-blue.svg)](https://doi.org/10.1016/j.sbi.2016.11.012) +[![DOI](https://img.shields.io/badge/DOI-10.1016%2Fj.sbi.2016.11.012-blue.svg)](https://doi.org/10.1016/j.sbi.2016.11.012) > Dimura, M., Peulen, T.O., Hanke, C.A., Prakash, A., Gohlke, H. and Seidel, C.A., 2016. Quantitative FRET studies and integrative modeling unravel the structure and dynamics of biomolecular systems. Current opinion in structural biology, 40, pp.163-185. diff --git a/doc/cli.md b/doc/cli.md index 5fe64c5..84c472a 100644 --- a/doc/cli.md +++ b/doc/cli.md @@ -5,7 +5,7 @@ The Click-based `quest` command exposes validation, simulation, and template gen ## Common options - `-p, --project PATH`: project JSON file. -- `--pdb PATH`: override PDB path without editing the project file. +- `--pdb PATH_OR_ID`: override structure path or load a bare four-character PDB ID from RCSB without editing the project file. - `--set key=value`: override a project field (dotted paths supported). - `--grid key=v1,v2,...`: sweep multiple values (Cartesian product across grids). - `-o, --output PATH`: output file; extension selects format (`.csv` or `.json`). @@ -27,6 +27,12 @@ Simulate with overrides and CSV output: quest simulate -p project.quest.json --set tau0=3.8 --set attachment.residue=42 -o decay.csv ``` +Simulate directly from an RCSB PDB ID: + +```bash +quest simulate -p project.quest.json --pdb 148l -o decay.csv +``` + Sweep residues and linker lengths (tagged outputs): ```bash @@ -69,6 +75,6 @@ Starts the GUI if the Qt dependencies are installed. ## Troubleshooting -- Provide a valid `pdb` path or pass `--pdb`. +- Provide a valid `pdb` path/PDB ID or pass `--pdb`. - Ensure donor dye has `D`; otherwise validation fails. - For FRET runs, include two dyes and `fret.enabled: true`. diff --git a/doc/generate_parameter_docs.py b/doc/generate_parameter_docs.py new file mode 100644 index 0000000..bf5ccc2 --- /dev/null +++ b/doc/generate_parameter_docs.py @@ -0,0 +1,146 @@ +"""Generate the parameter reference Markdown from the central JSON catalog. + +One page per language: `doc/parameters.md` (English) and +`doc/parameters..md` for every locale in `quest/settings/locales/`. Run + + python doc/generate_parameter_docs.py + +after editing `quest/settings/parameter_catalog.json` or any locale file. Never +hand-edit the output. +""" + +import json +import sys +from collections import defaultdict +from pathlib import Path + +DOCS_DIR = Path(__file__).resolve().parent +REPO_ROOT = DOCS_DIR.parent +CATALOG_PATH = REPO_ROOT / "quest" / "settings" / "parameter_catalog.json" +OUTPUT_PATH = DOCS_DIR / "parameters.md" + +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +from quest.i18n import ( # noqa: E402 + DEFAULT_LOCALE, + available_locales, + translate_catalog, + ui_strings, +) + + +def output_path(locale: str = DEFAULT_LOCALE) -> Path: + """English keeps the unsuffixed filename; every other language is suffixed.""" + if locale == DEFAULT_LOCALE: + return OUTPUT_PATH + return DOCS_DIR / f"parameters.{locale}.md" + + +def generate(locale: str = DEFAULT_LOCALE) -> Path: + catalog = translate_catalog(locale) + parameters = catalog["parameters"] + strings = ui_strings(locale) + output = output_path(locale) + # A comma-joined list, not "a and b": the conjunction would be English in + # every language, and the one thing this file must not do is leak English. + source_files = ["`parameter_catalog.json`"] + if locale != DEFAULT_LOCALE: + source_files.append(f"`quest/settings/locales/{locale}.json`") + sources = ", ".join(source_files) + + grouped = defaultdict(list) + for parameter_id, meta in sorted(parameters.items()): + grouped[meta.get("category", "Other")].append((parameter_id, meta)) + + lines = [ + f"# {strings['doc.title']}", + "", + strings["doc.generated"].format(sources=sources), + "", + f"## {strings['doc.summary']}", + "", + "| {key} | {category} | {type} | {unit} | {description} |".format( + key=strings["doc.col.key"], + category=strings["doc.col.category"], + type=strings["doc.col.type"], + unit=strings["doc.col.unit"], + description=strings["doc.col.description"], + ), + "| --- | --- | --- | --- | --- |", + ] + + for parameter_id, meta in sorted(parameters.items()): + unit = meta.get("unit", "-") + desc = meta.get("description", "") + category = meta.get("category_label", meta.get("category", "")) + lines.append( + f"| `{parameter_id}` | {category} | {meta.get('type', '')} | {unit} | {desc} |" + ) + + lines.append("") + + # Detailed descriptions by category + category_order = ["Structure", "Labeling site", "Accessible volume", "Simulation", "Quenchers", "Advanced", "FRET Acceptor"] + # Add any categories that might not be in the list + for cat in sorted(grouped.keys()): + if cat not in category_order: + category_order.append(cat) + + for category in category_order: + if category not in grouped: + continue + # `category_label` is set by translate_catalog; the English key stays so + # ordering and grouping do not depend on the language. + heading = grouped[category][0][1].get("category_label", category) + lines.extend([f"## {heading}", ""]) + for parameter_id, meta in grouped[category]: + label = meta.get("label", parameter_id) + lines.extend([ + f"### `{parameter_id}`", + "", + f"**{strings['doc.label']}:** {label} ", + f"**{strings['doc.type']}:** `{meta.get('type', 'unspecified')}`", + ]) + if "unit" in meta: + lines.append(f"**{strings['doc.unit']}:** `{meta['unit']}`") + lines.extend([ + "", + meta.get("description", ""), + "" + ]) + + # Append static documentation sections + lines.extend([ + "## CLI override examples", + "", + "- Set donor lifetime and attachment residue:", + " ```bash", + " quest simulate -p project.quest.json --set tau0=3.8 --set attachment.residue=55", + " ```", + "- Sweep linker length and residue:", + " ```bash", + " quest simulate -p project.quest.json \\", + " --grid av_parameter.linker_length=10.0,12.5 \\", + " --grid attachment.residue=25,30,35", + " ```", + "", + "## Validation tips", + "", + "- Ensure donor dye has `D` set; otherwise the API raises a `KeyError`.", + "- Provide a valid `pdb` path (or pass `--pdb`/`pdb_path`).", + "- When enabling FRET, include two dyes and an `R0_matrix` entry for donor→acceptor.", + "" + ]) + + output.write_text("\n".join(lines).rstrip() + "\n") + return output + + +def generate_all() -> list[Path]: + return [generate(code) for code in sorted(available_locales())] + + +if __name__ == "__main__": + for written in generate_all(): + print(f"Generated {written}") diff --git a/doc/index.md b/doc/index.md index c84cd86..1e1baed 100644 --- a/doc/index.md +++ b/doc/index.md @@ -70,7 +70,7 @@ Project files are JSON. Key blocks: - `quencher`: mapping of residue name to atom list and `kQ` per quencher. - `fret` (optional): `enabled`, `dyes` (donor first, acceptor second), `R0_matrix`. - `av_parameter`: `{linker_length, linker_width, radius1}`. -- `pdb`: path to the structure file. +- `pdb`: path to the structure file, or a bare four-character RCSB PDB ID such as `148l`. The CLI accepts dotted overrides (e.g., `--set attachment.residue=42`). @@ -115,7 +115,8 @@ Use this when simulating PET quenching with Brownian dynamics: - Quenchers: list of amino-acid names (3-letter codes) and atoms; atoms in the exclude list are ignored. - `quench_radius`: distance threshold for quenching. - `kQ`: quenching rate constant. - - `slow_fact`: scaling factor for diffusion near sticks; `critical_distance`/`slow_radius` define where it applies. + - `stickiness_mode`: defaults to amino-acid-specific slowing, with ASP/GLU using the configured `amino_acid_slow_facts`. + - `slow_fact`: global scaling factor for diffusion near sticks; `critical_distance`/`slow_radius` define where it applies. 4. **Simulation controls** - Time: `sim_time`, timestep `dt`. - Photons/frames: `n_photons`, `frames`. diff --git a/doc/logo.png b/doc/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8049f4803a1f29fc729693838591c6b4771dfae GIT binary patch literal 685331 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℞;5alqV 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

DNUBCe{FKl*?Hh3lp9>D~ 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≪7uK0yxsr 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

6UWmK=~|XLtrjU|^-`XPmGPU^WRj zaBN7rOO-06T#Lp?N^1mlx3u(j&yB6&O1o#QfRr{v$!i&a;{X9)^1bYxax}WM-^3`9 zCC4s5eYv(CjSI$0isz9s-=90jQzReoJ5<1|1T`A(kU}CmqEy+S41_^pNP$9$tfwN~ z#5zUYCl!>pMH|<$cgj|TVJ51%Ok0RR$Q3Cj+NRM}yS5t@Y)Utx&1@EY>hq6IQl9DL+a;rC4Ppill4?vL(@K zu}c zPLbceCT^R)Vz@hndV6yuVL{j^1H3D%rXK)USfAXE zl#aRU@Y3M|R{~)f6S~mlGIDo0+F_SpzO5^uK0;9~YX>#))y$LX{N_{h?vAm$+}zM| zoBq@LY;`8mRVE>z5CYC(#2>u(2jjQmhQa1bbyzud@RZzfxyQA9RUJ*Bd`E$KMPjGVyyyjRQQndgU?MZ z)(~5*m7o+lhY8tA6)Hh4%-ce%69}C$*`9$VC!E9{_hZCqVrQ_17=6FREOdC`>H%&pW_Yr^ibtoXI5|DV<86=4dJDo9p_52| z==8{8GPP0xofFuhV;}{=bKGgNMOnG6%tSyAG$96*BnlOqqLs3hs<`<%h06VvJyqhqn_|RlHpO&01t+y4GiODr z>`!m-fu$4e0Fn95UI=&JTb})=Uw-%q6o914Oac|Dq50L|@0{^ekd&3IMpl&cg>F2} zHHa1d$)G?sKB{Hv`^=`4$+Oh#lrT=^UY%^z12-ReCw_IfBoU3Qx)l|Ico3_pC`N54NK(WOjs)|5GC*y;I6}W ze&9Ctr(v}@OUIVjEg|GwWNrjo+eJlrZb@gH&$#8>^KfthdBco-lGZAy|FEaQ zmI<5I2+w^l;yU&FWlA{rOn-!puaV2R4x)Am&oV#XRY9zuw{yx_kd;qXO>bJs{&U1w zka>&0lNIu&K7P)PvIQ<-(;GT-4RVvO=1i4^U?8N%uFH<90ksQ+ttaT6WgBP8dDjFy z=wjyjKsleV$=-)mFUk}^#7hG3!odR9CWJ@J9&b1p>oDdCR;=W*tGJ?rJ^ODdGNhi+8s@?kC_3 zKu@x2+YvAUW0n{T0qM2g1RXD>yos06j$~Sac#bjtMfe^%x0KR zCkPOW6@w+1MkitBI~E!ynfnL?Opq`^0CiI!^*H8)(-@ILCws$GENsCz1@K-1x^2W1 zz^v;q52onS#qFSiAE3=!i8ToBoE~{!`DnizE#p0?ZvWFY5UmDZggFH=8XE z4iE6bXRacEZ}u^rAk+)7HV4_8&?-!b`f`h-##>rBzf0~n5ZPr}@~l%_j$e7|v@YBA zDp|J57RB%r@qD~DGgR9+HoJgRz1!^L&oX-yp55$4cesvv`oYZ zpjFbK6asp2M1-Zz`y(xL5eO>=ub60_m=^&k7Ede700l#XkGMW-07THeO%`??C@w(^ zIk#ev2a!klB26~Ro!DNPmX@_Yb%(@PX z=?qt9Q|wO^s4_z=ri@7_5fB3y9R)c*OKzxpo>adBa7aK16LfKlcVoh7l7lUy&hrEb zE6)s2l)l&pFryAL2c!cS9i%>;4v-W{+2t^wW2H}h#6WV-?A;>9O1i*o`=XY?EL9LC z%kHb2;Bif{C<-1KpE-x0$_sgT3#Yo=WtJ&|DgK3SFIwOj%sV~@Ao&$~FC!W`LVC}0 zWJ~RxNrH1PsaShkCsM8*fPj$mIJ$ln(?B>q+hRKDkW$R)p_sITOcKggs*J71FFl~z z^IEZvK&&1~X|=LQ?N+GRq6~6GQdix+PY8kV;tS8>@L;jpY&I?urGBcWS=_-2&$rOv ziE%`PRRremZnrquZgF*{=RX#~kb8GTLRKkCkR6?a5c!(8PMd?YboI*L zJi4;@8QgnpOMdVguh(P7GtZPcT8Wxzz#3EEBmexI%MmfqD0O2+R9O~~FqUO`pHTi~ zK&=jm30)wZtb6?T@0{Q#KLHisocq-id*u(`_FdJFBXo5BAnF?`5&S}ztG{177z1Zx z#g1JWtf>H@Y79y?0XRv(O|>K)13)6oi7^kb{Zl{y9Y=^&0g%;PpjfAJls^=AFj2H@ z50zYYZjAt$P+6)H)Ge^o4Gdt*z@u%%yW5EO65|mFXCU-JtY4FqFeA|fZv^00N4P-& zdo%Gr3PQZ94B|HN1ia7xYDS?==;DBdm zQ{3pJcL=&+KM5c-87@FoTHB#m&^i`nN|YH*%htzcts-^#CA^zhELDz@Vq%;rT~D^a zf`9`Gm`_A`A{OOrLR8Apc9*dAMUeyQd!k5LSajvoq0m^6=#bLYPI(~4k_n3doPc>5 zC}?u!*L0t<74JZzT3@$$(^St&9$Ia70Hrf&c z&~4>tm(9!HFILF5-ZH;}wofSLrRSgjkt>VE=T9EJgZbVRF^P56&XF_Vk(DW@Pz_~= z^6iS%lVWzYplFa63rWt6QpGHRDdaO&3RPtJ9YENu*Vvm*@Zz)2pbG&hCUg^pA0wXK za;#j?g$(ISRkW5J@cLQeAAa+6g|ifKlP1uuQtCbE+}IO?y4tPH=8jjQ3z;OO3V%3e zXLuo7R^VdY*bT~&83BuoSjq+iwx>$+{Y_^QERl@(~ z&wK*^lMmef%(n069brXImNY%A-MVwemN_s`_IC);%1T@$DVXu~cOGIJRiOe@V=ety zaE6=rlCY{*e#$Hn95)+$__^!2cCh#N`Jxzw^ zT!Xg2K{ueD%j|C;x0w~Uoae$>!$p~Z6zw~aQD7PSGL%9RkUD(bG zWka3sMdQ3X%AW%;Ep*Q;sF5LqCXKbxm|1I1X5@`u93iJU_PCc4?lbTt0Be%;9SC~> zt`gyTARKjsn}M)L1WFpoPgj3C*Z%-%I2$Sg) zAxz5qF<}~e93;X40ei8}B$||-I*>(Q2f)Sh!>Z_z1dN!FETmAbin9u_0KMyBf{qx0 zdc4#3IAuoEKZ$BcI7`5N0`_~tl@M`|2-6TSfdNH!7AR!pGGw74bugtX_~ zXh3K(0hRTK$QC-KvP2eI#xPeFwhB-PDaGP41J15~7EZl&?=wqPvOq2==AabfqPWKG zn@4!z_HAvm)-4p5MC(JVyIE|kcXjb;H6wcMo%QDDzW(r32TK+}va6T2CqWL5H$j(l zeoAou5X_z(W%$M7F~;sZZNeg7pH%0^Rd=4Xqo3cR7x2bToM6)tpFM}*C`$5-Aw z#s)wjuQ2+0@!%eto4fA{vtE(TA!dB!#alR>&%VGZuBh<<8rCv5e&-&}oq;zzM!djE zv@0NmZ}Ol{gX+3@Sxp5R^p|;U30{zVck!`vM>NaXLf<7)skOai(&n|x(tqCNF)4^0 zOw2?m#b?Z9C27|v&ngz=OO)T#zaqU%a;_y6gU0~>0W#)Aq4LD#Ozu1CQF3j}2Nzi* zJ-Dri&Wd*bmI?ZF1Jo2)UDn}_O%GmaJDJ@N6NN3g79V2SZ$YTX4^{4 zc;omXzJCAFFMas>;ZLmkcxTEuW|n|xSq2WOGsenGTfF!y4QLzG{5*#f(OAb0iye$k zmDLVmmNW3YU%=0tL@`=W0kJCr?Chu|L}^-D8Vyddg8Wv+i2x$RJm98?a1~`Zsr#B) zugns~Z~-a+tQmL|Bi`Nic)Ra$91~7K=pj6R%D_G`4nx4L033CM8-Xwo#Cl%QEObD0~A)o_I65iQHJYhLA$Us7Z4AyaqSoDMg5{uiE ziZ#(z;f+LF>y-aaY;JKV$A6)G8gMP{djOHpOaP7p;n-+h74=Gp5U?^nR2cXUn)ghV z+{(L8;u$SQ=7i02b^$IfbA6j4B$rvqtMep?=QBHy$0aTTs>pYJ-(!C^#mg@|k6%d% z>-8FwNe8g(=>t(#tV~H8Rj2?&3WfhS0*8Sdgu)iH%DGZpA0RxUP;qr%Chpm0jSqd` zMSRysKl~|x(S@$;_1h&7b&;Z#Ftj_+*S06sc{-mq;EIR>fyn^&IY4PH37g8$VgKZ?Kd@t1yLFQ#8kgqs0jmBFZIMuRS9|D%3bjf)9xtI!~$YMK!V z4Na#L+*Fp^LG1FIS-PM3?V57=&R>ssP%cPJ?4N&#PKy60VTCMEO=>z}>iK zya4xBgOA7ilq$L*6L5o^cQnitFWMwk_3O&k-;`srzRrAc}30oy)gj}FjA?>6yFut1RkrP>%PRlT71G+zHtGH-)>XGI3F!UMjYC}D zpW}GlV@3f$FR;XfiMPD)7`;-SNNlHI)394S;g#=BpyxM6W*E$WoQD~cf+)WNQq|G~ zi5D&nDN_+#(pdmg%BxR-89)RA@ZO`x_~IM)e*7ahuOX)Gyz9CnfbSZLq)U$Z@K;;s zs(Q^2Qx{C2T};^nA>e;H=HAx0MA~xTrsa5ps?$7xj}=%Rsh}12KkyMiMSZn01d5L`hJ~n1Bs3zFPKDZNXT^i1#)<-rn>$?jxQg#+C>~0aHqt zgK!OmTV23&6T%Gw_SF(5V8;krSK}2u7(E&gj8OMJ=xVv^4h!M#`@6yrL=tR+#JMU2 zz&1e#s7oFNh^8gKO~DbcCV6jf%_hb6Sl;< zA44J;E>pz4o^TKdi%Ew)>aYh=mp{sua2>u1#02}&(izNxE;G371JeU~nO_eYjDo<& zFiVu=DFG`05U1C5Rus!rL!O@FR4d{Y4HsrtfdHSx=Q}27-JnzRa4=`{9BX*{Q(R+V zk6~5ci8Sl0EToJ-8{gj`3QgZ9OsBxdUwIh^^BJD3RybHJ5c`PK$@_tV>~}=5Se0^} zWT2E~wmUE&g9+h9>X@34qxdoV1ACK315DW><&`PhE3?^bF$oj=sZV|nKKSBuU+OhN zp`WJ%>tEHmYB3j(I0tC;?s~I$bG5?3-V}*#k;At`*$OifF^I*bH>d@}4ndY~N!nj- zX)bG^43H>4r3XFubGV1yAAH-2j>Sn9sPdu^${r~TRHNZ@bX=rfT@Y(e3_TvL)_8o@ zjTf+&&?)NZq8S_cO1)RtTA%c%L)1q7s6JKqO|({f^ua%NN%c~ zli1_i3)6ck#O^2AjZ3_jf4hP&c!!zQLe}IMTkt3$2 z@0>`jh?ISsoej2XCR_cgd9Tj|shjw#^zAa6H4Jd67HPo*#)JqDHXHnRckkgZf6qt2 zj0LB3ES0F;7tUYtxd_~xPfH`+_OJCSK|S<0dBK#0%nG1+2DXxNL6C@&?qxgZcLky& zu{_aI;zp^ZicC57j*hx_3AT@^Sfw=JzvE2;{8uUAxbJbV@9|!r@UTxf1B2CSGbh3g z0Jl5Bb6vo#5U@|2H#|oI%1%_{c~Ylj-&qd%B{C4AZfh*BN|Z2V?%J3HzfVG4Ygp=R z^v5iFs6_Ht+;4FT zMo)7776aG-c$^a6?jsfG2ff1GGpW0DX1(86~QZ1PU`3aL%U_jz9Fq9JM|Xz0Lv}q|E2ozm-9w{TLamW_Y~|Jp0rxomu!9BKqymT>ny?WnSd!Anrpw zCu|e2O5#=>H$9%4&hY1MAK_0wcN2f+xobcFk)xY`ZQb_(fKG$Q05or9idC_uzd@sL z;Wg-#UFjl1*Wp|5J^Iwysz(R`fs-Dgv0K14OWi1RtHi)T=xDXZM?ZK6FWkKH%L2NC zJ5YC*vhbA6^VP6g@MS>#AH#JScc#l;ZkR7ZN9VrZzWi_&fZxsPfO>e zd-^&}#y8tuB0ohyyUnwHHlx-Q$C9y2TC;PZcQ{7A|OMUfefC5>1vv-XrlMM++`cKvLuqxF>x*6TDfL=BzeXy$xdT?>mgrhGlErI4>%n1Oo>~jHt2rL3{%%G!0SebPyxD_fZHz-kX zAlf)~j<}}^jq;m)h{cX+0w%`0EC(SY0FeX;u8DC!CEV?M z90bB4fZ1dsu3cHJHP8%Q{guB!vYH*ZD25i@53Guo9>`02m@fj&0iF|Z45CE~8xeBUQOi0}Tck9`IJx~@Z@%E_+k^BkxL z!jtR>hm`1O66o$arjNe6S|b6N1VV~M6j}%7ARS50e=|2T)(un=U`H(So$+5koX%|^ z1AOoER}G%_n^OgR0HBU2I~@d7B!c$)|DU&i53(#d@58{~mwC>8RaZZ%`ZY7vm>B@m zgZB&t0-ON_QU*v$6o%qT)~_ngdc|H#*u=bU@1dO+!PRNs5g z$&>kI=9k|)zjR@L-UG=DV;F`F8fMHJMq?QR(pWDCc=Y5L?^-{GC+|Cjw;daN?98bA zoH1M-)HMnvQ_=wB!@_&=ec&)2)s9NKmy2Ts9FK|l+Dq4P&@>>WqXHS|ds{b)p=_~G zSBh5vlvY4v@b(L5abhxjh7F=ItFMno?@iCx9722gJj&TzM6YzvXnY%-%J<2b49~B_ zdI$!;=yh%b=hsY}KgymYk6;ehQ7(e=hL?~|DctXq$?|bIDsP~`?3X;v=4GjpmAAw} zhDeb0z(SJzU0;Dr`@Cc=hnJaFhCj{}lo3&OTmP2x9*`lSGV7*Wl%wG<9yfUS{jh*yHZ7og? zhF^H|<_XX%*T8;*ZhnrU76^chRvS&QXBP1z+6t3Rc#ml$%e&gX|;~#1o6XVX=w(%ms zpGG27C8y3tT`UvJ(Qke3pY)}f##*SB`jo%7JWZ)wPa&?~jj8n^Gi)g+5Mw`I69&c% zOjt1f^l2+tOaY9EXiUHu%wxDuFk|Aq3{eS*IOWkWcz~E0tQ?^r1{TaXuolyKjjM|W zS8Idm!X4mi*eM$WCL9OhGy(Sy6t)HhPLj)Jw=izlj2J`f4FX>8@yG8bIuycR6glC; zh4`s>=w(Qfk%oX;;-eP|4dR@$PsOF+6%q2I?={uL3J^2o5mKlmp_^e(g%sD`Vy-++ zIKd8{Zo5#|k_fseoWNy)8!*^|#exV85e$He89T<{)!HdkO& zg_m&hDf3KcVh;yF_;XpOzM zDk)S9trTVl2N(<|_`yH^Bp%#4|HZnlp>*NfUqNT%oTvMwc%}%LTXS)zUSOn@$8Rqm z1n@o2Cm*Wkcy!_eL77+NjYfe#k?NhkI1S|9*GfBf<&8{!XQrcH?C59X$IURKHWqWs zm|MoeIAtlNp!dYc)6P;U94kw#7X=P3zH zg{ds_`1n{=ic}C>1b($;ChK1=U+=koB&%Nn9jZ9EMk zrBXt{kwS=w@X6n6k9iVQ(w2$*rA!WQ(V>;SV8`>)+=?bw!qvV6foBHbW7xsjxTGrN ze0t-goL3I3#VyDb*6QKTICTI2`IGU!(IxDTyQY@zY&BTHFn$E_K5X{+*U=oJDe-XaOv~$Hk zYWtC~$a!mdWa3w0bs!=%O#{P>hA}bLjz`6CXKOsfL=hGYlv;yfqJR|<)>95{x6#{A z@m_c+hANDA6rTiAvsg_eh+@`+yqz)r<-weYZT3I!lJE4)0)X+spb(XiVyHLV-GUe$QbSX{3y?iv@CLPRKuu|~it%{Wsi zoKwI_Fa~gYuAm5(6%6_C7ls!^ghIt4B!&T_!hV8OCSa_M?;|dW5VB~z#oq~eo-4Bx z-qWF%KIAXbov=Cd1E4Y%*KLD|QW(`1<$y5O$_bNU*;$vm8gPwjc0#4~p_gF5Dnj8x`e1<> zh^7RdGEt?7W*XRLU}}9L6HV?wUzeByGeuM><{ct6E|o$#9Oi4odA%~4y6Tcv@U}sV z(OTQgm@nq{EFjU+A1zp-a2H^6dof0%VXMBBag-rA)rz{?G-m0(1!mNB9i=q}GNm#c zUBH%6&1yVy;r?fT_y<0K%P+lx>R^sRsnHmp!H@hNDdjv{P8ortpB^3;I%_~SC72;l zYR3y?1SC%sIEMZ~g!%=KRXl3I&n+w9*3KS&V#1XxmI%T7sqb$|AmtNSw?D>T?bcwqf|-aTdgt#mLi;@NCLRDg0BHkDt;(GDzy zcMZvM}CTJ%Yld1Z<&Q)={OfRwx|PCC-jVI8kVv z7?e0smhQ7CaDFoU*EfT@u{*3w9GeWm;Hq9UNeC6mM%rjeS(sgy@v;1D zzYE0BP^Ac;hx2XbhZ13~A-GMd!9`C1E8f#UQpItw4rB zYhyhA$o&|VYP+c|%E6%5lg&$DTy{BcsKLQOlZ%~6>UXuuszUuq0Lwi{{enaMN{UdH zB?i)yy+Vdqt^~Q40)I;{pmUJ9WyX9yUs_8Ba$7fOV_3U?;b+S!GZ>U0pE@_`45@-% zk6)CNrJUKX544j98EbKHa1iHiIjL?h_SPkD^`KA~qoOQJ2~Af1P=%_8fv(ba_xJag zD^#4wdT$&o$;B72mRsWxlm|B{MNwcd7<84VBQV1DmBKOFFGZ{e02~|~pfLtaY8DOy zearDNP7exvXKqlGDyH_4RznuwQoOtJskhlve@=)I7WJXs=!aX5W?Cc!IisC=DKPqc zAq9pX-{DN$Sc0lzFP3NU3`eYYYlGi?^*a92+aJQgqS+WtMmvL2DE{|&b-XwMf*=XE zF3T3xtZLz^`ySGCGpNJ-^-jpkUv|6z&?$-^O)4u9g=%>Veq;!xY1bb z8H?IF94p{9X`LzvXB6X{CY&Tf;XM#qx&1?y-Fa39KHC+5hAApm1^E=gK=v1KB$NyL zKdex!0H>(Ayc2$7yhB=q^IyWgy|5q4CF01o=KDWKU!3B^04cA0As*nX{r9lP$>)xg^?nxD}@m$ zEc~IW;V@9Ef`!_LAbPlz1q^8Hy-rh0?h`~)5T*=F8QAf-Fk@gFB8523cq)_V>Jwyv>%cMm`DXa3ZM-}$|-T>0&P^HrQWz7AM-z8Qx-RIEW{ zJuVOcAB_>s)#-mPhWY>5NA`rs0JnC))}MRjlqaxIu)t24GVXaXEOG1hF77{f4*&5_ z{CPZh{`9kV?(6~pjA>wu8^4&ooB}P(rXGG!ohOY^F%h=+W}DZm1FUJcyR$8mzyt*))nK%e}?$GVGo;ryKCu1z?IgC%CJ}fj!C|Kn} zjR#7j^wAy!g+ZZR7<8e0c(6jDH713cPPG2Q@zL<}6GhJsK->A`1IC~41tNE*pi)&a z&>1>Ap*W0#pBHpcJ{R!AJ%o7{_$Gx_FXPGeH5!dD7?iO6QDQh5A`1TdD)e0x` zGt{e4$tTiS#NvHqB}3S-lgEd{F$nE&UjfvSx)xx_iA8`jQ>f;1G=6`fyq4)lfp=#3 zk${v9^}b&OOLzz7P9L~~>OI63SX9E;IX(!90Beu@KoQSlm`{;-g$F zRhJHy`Z9r`Dxckpb`((s5Z-lWYNOp4m!SLVcx!{`=6J5;OC1r|+%Z`|0y?M3r+IVhfCqOs+WD*WE( za+yN4`~|qIcT&jCEFAuSg7^4|aa-}N?OhAjlweKjoK<0iU&jAq0>f5Jw8?B|3``h2 zW5yWH;Q@dvuhfni7>oIu!j&5b98gN74dLFy#Bi2nhf=}2qF^m!VHvlK#r4MErnR_Z zEEd)=@*%k-6ektoyw*6c38$69F{MCW*;AwwVG^hq)_e3+QQp4WkHG%CmZa!exV=*m zPXDe3Kvr%!4-DQbS5_pr2!%XY*`6o3`OUNZQB7%&x;>*~% za~CJp*I=5)3w|NFii%296kO!@p38cJUoiH#VMvK7*n6wucMCYrue+y<0@c9+bz|`# z{JB4aAO67mXg*&+Ywi0RJD%t%A%7O2i>_c*6y`6uMH-=)YXqaNsY)?Nx*2am|4Bhp~IbX3Wk;HG}`OPF}0DkB9-nSz7`FiQ-;a zdG$qPB#DdDdTbQ{en5f0h_e*h=#lfJXA@u;>r$qF<&_)H?d{jz;V1kWnbACb&!vj6 zoj~9R6i8_tEM|De0~{2BQ*SQthl<$M&G4;X4ou9GQeVkGM-<{R&SQI zFc_T4^Sl@b9KmxRM*(u##ci4-WLH1r+z9RP9D7gFSC9TQZJv#~TE=wAOG0 z6H4LL-95Z``|fAod2)@K#%>HWs$?1NzxwwprHpUz3py&SJrzZz!VgbB+NAMH9S~(Y z>!*#)0`rNy<*f&ntW7y&T){J508kXp>T=oF7#K6r1V9CF#lScn&gb4&3Q&ZJ@eR1` z1DxnR(tKI~b7tIX46fG(JJw>iaeD%o356nz7&xT}=SqdGLg7q7Sl0?A0hS1jDYn}sW40esd!i$Kt z1#T}0uR>u&gb5S|L^$SmzguExhy*(U?>GpEm?`kK0?m{=W2zGSr=|*+k|HSPY3zK$ zgDS0k$vpjktBh#KmIeZ|&JItHUUyz`$Zcv)lCo55|61*2TamYe9j?3_O(6)Aqr!t{5lM@6+p-MS;pTtl9 zM<2ad77B|+1Em$3#w1mP+z||Y%5Zl1;ZVeAjK!__0u2KNDJ*0@bM{9Scp|n~7#u7N z77K$#ZO~YTX+rp)Gbm}Lp$i4A2wJ<$omvyLQts0dtWqFlVE}yN=54%sXAcjaJbv-r zC)fFH$B)h4dUE~IA<;H~ij3W;jj76Vj=Y$3xtyPhe^CM#tJZX2ai`6&GnBW(AObT=4H!u>=(Pjps$!{u%DPw z-shk&1jQioe<3==x}|W?k4@n%CrGu51il__6M#bFR#oGx*QfZN)5lTO7KX3^i%L^G z)YdmiadCFq%qW)s5%&^=nDKmwgU67Azz_*!!gaY!+w?_-4N0pMGqRJ}+l#+>W)Ec1f?e^Iw_l< zJFCeje2JO+T1piq4-~_NH5Mu*iURRDG_FhuoIF^kV`}{3+ShSDHO&EhZLREVOiay%g66g9UNHF$L_DWcj#1z|YU+v^d?Up^I%iCPav$|A22my}& z5whq4$ws8`C1K*g-vUYHjDhE&>HsSr2CNidEfxnA{>n%H?Bum;)7k&)AO0$|USKpT zv1p82Od&<4WoK}RvOplblz|0y0dsLY<=Iog!^<4KSa9AIr%V+EEC^SxU&kMR|NHTO z{h7b|$p_A!zPw+}$AeN=^};xhmiCw#6FS*!iXz?gt_Fh3$fuxix30IYR~5p_w4QEh za^0W%>tz+%O1Qh{=0#vE7 zZ!P{{X9t(=+`+lYaPsJ>6Ib4~ejE=TTYF}s)IYsemOB7YHTE&*U8NbEr+Dg_!H%Ea zov{9+jW5s%`NJKVk?@A7gX>vP9_KhCOSN?Q^sZ#U;o#GNgRS+mY#I!)NF^-~E zhNwWNI-xM7Y<#(lnzCxPUJh##J(JYx*Q#D5?@f3qv=s%S-uGNila?IS^7sIVdmp1> z!l}R6)(_E4hg0Na-`DS{d~0Z=EXBQpe%RHe+qteM4PB1^c5Lp#z?6$^Ij}`Xu?^Ob z9*uVuq9Pjr2}t;83!~wFQdKDY?vpJA+iUaVoMH7}a!*S?=-m3fr10|FqJWD*Cpe2E z6XDT~bsR4hZq<$3W5Mu3Ajh;=PUw)WB&rD-Btp6@WU+T`EvZj|W|n#4dEb=5698iZRSX_0V251@;KY^3)B>9d%7B#N=P`|s@q5(rI!Wh7DO*mI5JWy)fUpVDz5CtAUaoDfq z_AmHzY#rnEe2dr#MAom16b=#gP*KbP7^csK{N;PC2#B%7Ac#rirGR1!O1Il z>5L}l?Fq9S;0#&8T)mD?38To&Te~0MZIkbO|Q>nNxlUXX1NB-ka%JdQ6KR(yMn7G*~=) zaFlz(hr+$SH*#q@Frsd?{{K8sID-fsRc<9?Si+N}QKVJ6Bh&=>OYp5ep)G}bH>S7o!SDM%{MVoSFYx%qhkkBZdi0IGn`>jtF>i+PQ^`vszO~6y zTjSAF?>u=74<4I5dAuyYXc<@-vthv#3*ICjN*m@fPv*r5$+%w*aw7=AY`d&0p$ny_ zEg@CDmx_CNf_>;?xG&2`+*tyf#TY>4GT;H*xAtI_LK)yA*=FK18T6g%DWWJrVKFpW@BOLi4*IjE4zlOM5k65Z&F`V2wE=9`9}KW z5~K<;5oHOj3?<}~Y~1@Kjt=Q;BMfJAFZaHN{;k~h(~=99#qDHoAL>rb-|c<2Y%Nie zc=8t_Q5W@lA!P+Pgc$Niv3?eePqxcqt>>PpP=l~-x6*IRfuq`BCg$pG8|%1#Ji@J8dm!z? zD#(hOBC|>2y0rE%an|QtG*2_*UJU|)_#U}L55$6iGt&3C8zd0@I3#`Kn>$1&m1?Pi z(sUl?!Ed04a_0gaFypJQPjP*}divyW{EW4BQxR3s`b~bJ zfi#TmF0vpXQQ%62a<{o?TY9R({mkNkmKClCB;RMl3}UJn7=vg`;EF+;1fKb_6Gf=3 zPm4~#OtIU{?4hg_QDqpLiYR!rCXprwk15)^n6XDE2 z;XbW!zSP*zgn<`E4BQa~A>Ec!o)o~&!cJh24Qh~6fD9#iLxA&G!O3vO&z@Bd(TEwO z*d<&L0tx#UiH)C1&m7qagKqB>N3WFIcjOaJc*QD(BT@__3NlyNs{|GvDgqP~3drz2 z{~pAj0u+Zm8tlDb>Ddq(rwavR-97{YVTTmtU$zmiNW3rCELt=_@D!vFFnRSVMd3BsU*<>;-B<`39BF6< zawa6OXe$Pn1YQsu&HJeUceWCM!C;8JS%r<`$G3m>ul|+I@o+f(yZ@hG#lh`6*f@Ct z##l5>8*Z24E z?Yq0!S{pt0$oernw0`W<=f>loEr6YcvEv$M%Ncv9BBCm-B%8dz!NBTel6*@-YkEk2 z$uEc29^w|xNzNE$Cr@;VC4Wppbi)7m%cDnHyX^Pv4hmguPiMb)b-M3ikWwJ$oe9LA z^R_Z+ke%62DPVpu!+Rcj5ND2!J{4dgMPm?o#l00;3(oQGFd4l^h|eNaq!Jv6;$e0A zww*E0^)v0u4xS!HcP;oAJK|PrUi!L$P@UNJ5Z~wpFRx#|5@61rwFBWe%49)~j0IYr zul^uk%Dy@JN0Apx8M4!z%!8EIojhMHUeJ=wV%<_4>lx#~zJfPTvaU`Vqc))JFbh$o zzbzJ)cr0o2%Cyz3g)ZxHGF}?KezGCTb}FLO+t8oLBa$W^Es=4=A{T?~z8gr+ZuW*F zik}Lo>bl0ePOj6NPOS4EPIq0XgRd(H%%M3(8WI)Z4T=M&%B4^efp;NVF*HvMWLg;M zOO8r8+>)1et`2odbvc^g$B6n=ZvjU@$XJteN4Ue03EOw}@s;bhKl`I^IZl-^Af?mP z#{Rbip$NF>Lk|GU@W?$2HgJiXUct`>Bqy-(d#}QogWFHCTcafj0DMTBufuztCPbJq zXyQFGQ_HmJ@Deix%q*};AG`%8^YtuO>T9Q1Q<8BTx!qGCu&#gygcsPR3ChZ=bHqUpPv~-jo~wrm zWJ+B2el7sS^4zDIz441$KjMDZD9E+wi1;OI$h($2q=C!^x&#&IkxvLS7+`O2A1Bw= zcK**l{g*e-pFK1EfBu8d;>z}GII(^Vqsa)?xYYWQ!VtNzK~R*{Wj4Jii4OR5(65P zDtD+Q1I*)t#yoP+7!VT{HRILk9&SwU!W=krL!lIO;SaS|oV?;*LsB7(Pkav{xVdp8 ze5bh96?sKV!5dV7##$&aN~JI^U0B=grpAq12l&I=cX4Js`ox3B*FSM_GQmT~*FJWl zD1X@)gWB4SU~mWtU*f)9N_#7F#AvUO#Ms-Rp~2|fdM(L3kb|p?yWzY<3O!tLrMb#v(N#)SS5)cVZ+E9f zLHo4$wEwja;w007WQinvQ#i|%^7*IM=PFR$v%G_x{c6$Dj*>-5{$8Ry=0nEIkRZEq zg~|(zy-X-?5>aA}^Q_Y9Z7-Azk;E&lj`R&=wAjT3AYh{eZ$6mZ%dk6*co^D?EVYBy z>TXxH0yF&~!UV#>e1YR@qw%AsPvD=t{3@(zqEP12V22ibU!vmFN*5u=Kq78@w+E%< zM#Ky!T9dN0C%KYMeqHpw5`^SzTvTM@(Lcng3<=L$Y{yy@0Hy~E{Pt@*_{bvw0mV#Vg-X*Qb&Bl3$^5|n>&8(OkyE-fNw?2Gv%t9 zxiCN8Hoz9SkgpwaPTQDVXxAjRQLtgXos9LfUXj zu-=oTJTs1=f6N{>uLP0XA3<<}m^+}?3p9SrHJmi1;6fPFc|YzQ9anSijq+Zf=(Td6 zA%(hI4;spQ;@oVP%qX>n8o0p80N<^ev2SfmIlpfj>@OJVhYO@6OD1v(9&*HF`1Ve%1#R<>kmarY#IeT~@r#UVIXCFPjwZ-umoU`^+;oj93`)Xme;=dKXy-rskDjKt zzvW^6@BiWdjNkm%U&4*+H?X!g#&9@P`iAW1g~fkqV_|i{5~lHX}6Dxl!DUkUPxdQ_CyBdFZ{*5 zlB66xVc9P?2NsORXG$#zD9Zx#hVjDQ9xm_h;ol60cxZj?GjBV7>@$z7AN$Pt(cq`Z zWlr5_m_x+CPMl(Phcjo^dCKYGQohx)#J5Dr{&(avu@_Jp)Wy>2WrGaBT5Pz(o>Be& zi?5@a%~1@>7-aze8CPH!!*B>~$mf-bUF1o;1=R*z6!^fq9>no+`K)EztE?X>>}=IV zXbn|M=ng-`zToAuK`8F=s%6lTi6LCuEm|sJ>Y0dMnXdEe2$vvt;j6^6=*e7iaWH1~ z2#DEF%05Kh`3>qFPd^V{pcNd*!_2~{?cd-ube%T(Izj?o;aTXw*xIm1U=&LQ%a{c# zi1eI*>h#l_cvyxkEGwJp%x|?BU62z+>F}jzz}({==9wX18Uq#sb=V?{JhM~%Dk0i$ zZX*TLSTLb_$JrBDAC%auYK%%JYO-fKaztW#{%$HE@m0Jb^{uoDf}Gjvo*doQuWVYn zm4-6hLp)MDl;6z&5DSf3@W&!9q(p-;vljp6>JAJu3PqJvrmU~xD6(Hx=BUDA>x!u7 zVN7tdprwfs^;Z(YgZjzRDl`mWE9Fz}x}lvB^VEX22$=c32V-`E{gi#GUH3haNWV_T z1fD74v4xtrBpeQ~IWu;e8m}!3u9^n7t;K;)?LJn(Nv&{30q3;BR$1UoSzzqDZoNQ~ zoR|s?Cu~i)?aIZyRH6T&o>LPh04y~A~+>ZBOPv=-2BS#lVTJA zN&qD%;fW~iK_d8&A-@))5=AnjUpP<4S*Qw7RF1UrsnVIFr-~r=I4Q9Q%eUw2KUtI* zD3?W1QH_EC)fiNMlf40BuW2xa%lbD_gf*=&BA>|*oYJ2IGfzWiaP5WU6fP|~^HiqL zC9z-es0!A1ljc{Fh-`7Jkc;}+OV2(k`Bq2KTV7MveovMCt%w&`{+9GH&{obX3529) zyhHM@utu`DX|LdygA((FJ9p(ze*gRFJ&(Tik^kj4e)H0=KKsw{rLTVj)9W`d9+X&{ zj4>DtptMu(W2yiWN@VaR`})~fEb0Yj`+JyG2N+G(@W&o|9Dn-X`yhVe$A9#xw_dpK zS+GSlU!W-54#b!!z#pcap+`mtTI1(=OytuXQ;Scm<*{Yp_FjdZt9RV~t)hT6jrT^m z%AGQ#ph&^Fppw!=J~@R9^K)x1h4V^}lvd(7{C+g?7srW&K42IF0?I<8wv1bgIj&u= z@U@-Wc+>j&#~xjueC+MV*RQX!+@OO?%h0G82;IK95lQWonU0zc+$Z%0;yv*JAxYX^q*Lg|#x z-CpTUi7uSC6Kh=I(1?O&FI+2#VpfHa3Yj5kR%T=i9uonl!-GC2!QoezU&+~PKUy|l z`C5<(Q)IF+IXeJQ$d@|Jd4vy)K=KFoXz7w(eR=xOZa1^0Q0|@Kp!IUk#4j6YqP#E# z9ASAYmgx&nYg<>3G^JVpT(&rB?A9YE*Kz;a7~kAqfZ;Y4XF5k#d0=c|B6C7Vp?n&= z^h3^(fGPhe1~Mv@qOF88X%r$s}qECgei8#>!=V+fhb<~U z-eYp9&`&Fc^P2ELS>SA;am;(247}{Z3XSJR%sx>AoFd~w}Snml_Dr9tUo*kr6y+jk8!c%}y!iUWT;fM%P%na~~`3buL zV)j2TylIap3NGccvy>-Kmr_Y_BDlmAVcCQP6~rmrNE7@SRfP{-1WFJzDNF$zGzI{p zwuHNl!IXg$+TfJcSW{{;0Iq0Yn+OxdH1nOW+*muMY6%vOiLn#*jdjtl#lWKsw}kl~ z*?{2%Y5$o*1T*O;FHZRyNi3p|0OmJH{MRNS-D3~heMw9>v*3q2iHW7M$-*G3@HDf< zM_XRL+}qbLScN_mMS-SiaBJrlPOql27=kV^gUBnN3-+S?) z54`^qk6nD|7XV;U*U(C#EQ;tQmSLVMSSi9@DtV3r15p789kb5Z=;S&MVZc)&!lJR5 z-l@&T@&(K+u$o3B~f;TK$p>l zP%R}jA#I@+V@s5ew}hbu&$4o&P#2!im!9|Jwzu|uT9QD>C25j^oS<%PSv$(4=swF7 zcuI0@i|j4yVz0A8I6|a+8|ux-Z2a2SP?x@TL(tPNF~i9#m+=Q7cFTI`@<2ct=*P0oY?W}VGiqS$;IUyDN}38cZdZ3_`1KcG$9pzTps{A7 zRC0c_rFEUwiJUTrLHTE?Dr zO7DPxV_M_1);L=b9w;@=l^PR8&_UUxfE|Pa?mbCU!oDQK9<|}{*v3I{3^E@eB(Ji^ ziLl2i>?yN=OQ##~+A~Z`VUJW0h!hN2K)J&(3sNXap-_ZUMG*X!4JTx|Fu(vuzL(0a zU-ro=-27;`5JKral>%81+K7}(8sTTwC6J(K8Bf^+fsL|2NraLXP_%#o<2D%c#sCB? zEMt!>rj5Zy-C$jn7!_($GoB|n2bK>PodE=;I2=7N^WB*Fq!g8O90QbWQkm=#W`msO z8#)=VR7M+!Mblw`ZKf&EJtiW;61pttMEiEmB$JghXGfC5q`j=+v+wGIC8v<0;e@o^ zD>1UxeLo(3!cr7fS`tX~R=dWmh4;QF?CtG=_6Zla?*HQ3f8yV#KmWsj0)KetcTDnTw4x{@J&g;T1ub_NQPWtH+?DtEj=*pKMSBxadx?cNON zQ@}$h=S>rxbIvulhqDCXWT8-l@ygylUf$iu@87zEx1C&n=6g;a$D=2XJ$X#)FE+-& zSO$neti~X&bX2}Q_vPfrU&1`PS3ofU?wE`;2OhyqjYQwv{S0zJ6u* z()F9WU{XNzP_^E(u>!9Qxc$4tl$38`e@MGa+QGHK;}`G8@yYo4#u$LPV(UHY(efp{ zn{V)9Au0ia62+z6w|8Eqmr31~-R7Qq_X1Q9Iab%hIlb->-W5%(xSzcpjoIFl9md6< zcja&@45EB3hk>QsD&^bANBk4dQ*$=K@%!q&CHXkKZ$tbkwcIEzX4gN?%ROHC9;!BT zOApfjZS0`*J=+MFbKoOi%U@Z>oqAwdb#*!sUgtxbkc*4G=G3)($PJx-!j-~oQCDY= zjq&c&C-8-DzY1eq+U6*6kf=WjZ~=)ZEhY%&5t^Xx6u0RhXBZ;Tq$LNW@99UhCI)3o z*3lZXI2r-&3=iZxlKAH^kY})kBJ4E=zxB#hnD2cXz<^=iAa{6eMeUFoB+pjXXF=Ik zxqY)MQVCIayI8C~4MJ;4boCJV}&um zGmGFcQ59gO40WM~-JBVN8%=|&#$t!9+poin0TI@e!s$ZctX8;xpm44%u&%X_)^IAZ zCfBk7pgAF@h4bJ1?^6nAiv{6_K(NMb zIM>RbYVS36g=CQ~l*^7+gtZrzqW3ZZL3vkkZ${Xtj@T#fkpkkmR>3%-d|e^rPm$Z> z6v~o6a8+}%fNMCyOkOxuL>LwWlpq(XNI(h39VX2E;jIS@+%be3b%W!IaE!{wOQkPs zqAOs`0Cp+UQ#eov1t4^~O12_p2xiSj*VCvkOuR$0iee=*jod z2fz1waCd(nclT#oS9f-%MbeSu2an zp|$y9fyNkUUARo19>BCVS^_Qkeud9CMQ+41?@A{cfZg6qW3VwA{K7-)W}yY2GSx|KNBJzV`SW&Ma5X1cHTp+puEwG@_qBm)vsABNh!9;ua_ zw*#nmVXEo-&Y!}Wae?ax4Myd_DON3T17Q&;MDbgSqynKBJ-`v~dw~Z%MS^HR_=!!cZhoX$r zR&3??EDPb0WjZ&R^Jh!ux}6P)+W)r%%~aj0y&kgB{xX!8sF-L&5y3Lgh-d=F%)q5b zx6A>DD;F|}s$jlE3QzisJF`W@lUsFzt4)KcHQ2Wnh8Y78CW>%I7r3ubIA0RZmL=A; z3x_c+D({$E$^;aQ?!+MpLt^D})2(xKc*R5{vj~jX61fl{VLFU$_>Jzw;hs-+p%e-z zXc+Hp^7e5LM?ne$FiJ}2qyz{NzbD)Z8OxGDd7aq zfLE-dKo<@WcI|0$N|YkP>2iSJh$99HQn+0=m^aRvz0bfcBHUC4#{dk5`U&m!Qn~fw zgykI{S~v~e@QRi@l7ON-m@u^$_ocTvE1qL)DbsT11|Zrw-U_nvni(l%pJ*O*lm0Dq>F)+mYs5MxWsF%xQ6B}#%& zU(XUH5O<>RYeBH%reT~M4ZrZ-^QUlnq_8`mV?Y3N5Ug|>2}MwaPmQiMbb*x7j|hd1 zA!^Pm1sATY$r)F|K1QX&dZf6HGhAWUR^;3MzB_*sG1mf-^5^lnZdq$x3JtcHxOhcO zt2usS?<&5ra~t1#`V@cg?5R&}9b5ZZX19mT_6oN?62S8~3NZDIb>vD>VHH~kVgYWK zj%%%@A1Coc+_(NHm@j{88}r%#gTi_2LT0}-L;n9r;StvwiE`G_e5)1egBqLnox`IK zY|aWoHD_#TqA9#mC8f(go-dWD*nuM~J{FTJ6~VTg5qOJKeq;}iy7wq++h=^tR(TKE zmDi!Qw?y#_tFm#ClttDmc(@colYrL_PC5jr)Tk7bviJm+`_EJRnWwNrS7rXhT=tU1 z!((dNn&< z>7n>-W}E8GIH;&ANhDcyq+pt6^6t~eKljkdwWqJWejA?B<`smHk1W<$5VSz_T1~r2 z&!85fVSDXU&act~2#oUI+k#8%=+c1=;TvsvC@s%rq=kbt5Z&sU6mHzz$3K7N2HyFO zhhQ2zE=U7(G?fGp1mm6vX$x~CGPdzME1DA?0%v$25-8;tcdPAdgR>j(iU*Aqp|Zfl zrM%|Kf;JU+%5Gm(1z^nJih(f^z)Ec?(9{Cs+VI6YO@kXvgQ>OHvlb0Av{D!m;j~hC zz^6t(TWYKq8k!i!0#*@}bsiwYZf4z8$;J5 zqoeeE#T5mZ&U(zDrR+cXebL>%tqpD+(#g9r>)I#vAWOL>Lwd*Q*2k z`pet+)~(y0{E@BmpM2unY0?1Z){YCMDo-N)9Az^maAC3+moFL4gCK;0yp_yW2>b1=i>51zy3vC%JiJo8@mK%7N?mMK$x z*I{dI$@2($d`__&Hpp>V>7z(1{a2Xh1WJEhj{LUz-Y!e&ew)@M@=c=XYPfUdH3)CM z<~C|}-$pQj=F&}~4oM!(`xNP~c+_iWYk!qs0O zeRz7qawD1J%ZUNDW&bq6Vn{ln1UV2{SX{P-r|*Dx56~950;EVLVqS zb^;7pFHnWh6ffv9eC9u--`zzl*Cn#j2gBAH5IS_+An6A0Fy!Djul zl3gN)B6^3stxu^aJe5SgOiLW0bPfy&e2jbdL<;{H=EPp1@)qlKURB5ln9?stZxwmL z&c8<7J`D+K4I zayXI{Dc8p??ayd~B&T9-G6W9qQKCBiORRgh6Q0|5$+ghCfO}qUG2;MwCO)?IJB2+Q z6g(}lUpd2&cjre1r#Z; zwPI+c^)~?1qEan-lwfxE`YgDKFL!$yX=Z3Y5OmKt;y!3Xb+A}e7e=EW`iXZw#9!Io z!RvSDIJKr>Yj<>kA{D}!{k|y`lTm0Q6w11DsJw#c_BDpk;NZ1VKAWd|*3Rk`)_d%) zO*}3n&Gv;u2|Z{FF*D|;{E#l4E3deeO$Jz46{&5a!wpvnfB z$O_c$Teo5kyW*;xw=naGNyU0Qg%KYzdA-AQrebz%`@V-ay$Hw~TmjQ-Ww9}3plE-GGuBY!^qs{88&-=mIq6_PqvWLO` zDu${@RyssRXmV7Vny}haYpUq zI3!u1_gd1to35mzEDLLF%YPED+J2BwK^ARxbeKBi{0&|Ls$M4B9x8t)bH5=?c+UiO zhzqwSUrbJp_2Rz#9R~l9bs$}a07C;+U0X~>!>xCnIfYT7U~JWw96mAjDFs!exy6#_Kom`oY298Wnn5 zc2*d;`x(h9So`^o4_|>FM>#Jmy3%UEF@rWqXcZJF8_&{MN?`kzyn9)JLClo`RbZYu zVV>Iuy3Ty2xv6685c9NQ-r8&I#htprbz`w(7ze)3BT_h}749oF-ZUt1|DeQ1SzxGA zSXfBVpa37<7BboSPbCvFxR4;{b)jhG4$6au-?xCY5nR6Ovgaj5Lo2rzq9AzB4x>;$ z$pkq?yadIh6Dpdey_bxD(kG(`=R6e(D4=}mb5}tke=24iOY;lz>gt3P&XogPC`&vrC~&?kaH`N4k_!(!uokzB!S%-A z`l7*IYo0QU3)!;INnjN`Rctv(hVbb=GL)2*YPl@Xs|748+*6W!7&ObL@y=njQtLC+ zAVWOD-QaD>ZRv@QC)$+gV8=TZ3bKdPwjTBZo!GEEQz!Pg&9j#DGoGCW0AYQRQ!*g& zpL~7nln1RfiqeJf6@^Aw6ex?r|1MByo&ALnIkgm~K3>kAD&(9g@^}(G7UNC9Evx|6 z&O2ik3;f`P(-;5R6K})jP-B1IU^oQe6VAv57gC~YpUE#C>`OlJi#M)>wV2jvFm~iw z{*)W&n8rSUY;D@;ZvEK}p?`hKj+Apr@M{L4u?%Aw>qUV@WAQ7OU&Y`1=661OwOahG zp;lF6t-~wpgQA!4<)g)Kq;|W-gDlWuS`l*h(=x^k7nWEkg@66+*FJUo)?GhXT|pVL zhVZzv9@A?|EAYZ%eDVZ7`0h7ht<=x64T>+~@`(oajHmXu-Rk@iu0Bc<+Rdxt_Dx6y z?jB|4*cT~_h&9x565LbmnKB~e#2y|I6|0^#pDTqFC-!LA7ux04-4=~Mf^yb|Ia_}o zq9C{Qy_P9;{(E~C`jH^V;kzPO%K+)^4?J)Z4~++?YvVWclAzFes9zN9 zr2xb}JdqRg?@W9)G@QT+#Mh5s5Y!0yat-Lz#~P!+6<42Mn3O`iLRki4=tC~lv|!Ez zJc|FrTO6<5-NQe7`PwH7t(_$-qKCk@B~u#(B?__jN5jp0ZMh$$QeAnR2{NzBQfdzRBaG@-4e_3FoEHF|u)$UxQBzOeDgoFY`;du&`QJj<`sWe4}gM<(RFUSzZ zd!ZfKrpu^DQ329$R_0QsnvAe>lX0gA(_b1x}Y5>sq1oM0vkyFs*CcXd2vX z4EC*knq9bO1slWvQrI82Ha&~0>)Y-!_V}n(Eb)h&S0o9lRfV)BGv{lgT|Xd>ArKTy zcofna_Uqq2%Y@wE>V^32UlgR+*Ae8uAiVico0zH-auVRo45og%lax14^IGx1;dj>c zKEBi9(NeJj5LFp!7Y7i|Ym#(w)n6FTM1(n?*PbgF7&+3aF7PR=DeVVJ&qF;5O=D3u z=JH>B*F%s0mp}MUJTMtxcW%H#1zqaoeez0WG@57^#;5(+ZgIa{UQ1?tA2Ai}sH{PXX;j$iod3!i*#fBy3W zP4Vz_xzDr>MHstm3H8lqWHae|z`IU;8J`aKxU!bV#?m81gn$0~FW_KNLu-IwGBGXe zvs)GoC2zV+$refji~S0ZzIhAp*gE|=H>{k^M=*rm^L0cyJ>Wsk@)Lfff^rOV8Bx-b z_Om0y+PB2o^0r@_3_0KZ)sg&xK-*%Eos1YrYTvT$d|xj6_uZ9ifB{77LTqo9jGyCk z?-gibgwe0t_?)t`B>vj#Mt)z`UXQXSnONT_x-tU7&fUYVW#!U+xna2HBFWN_1`3J6 zg$ktr9XAhC8*YJ3vC914;hhK!(X+=m=qgT{(gd?uY`u5$_~em|6K(@1dE!C1*<7Irw>#0xlHiDJLbBA%A^oIOn2`%w(aI)=-*X2UHj^H<2mm|=ljCM? zGq4jO2U_Fyyum+x>GjwL_V3A*?e}7l6EAhU92a>QZ%<-ccq7|P^Tu%d$HF_Z^l~^O z-u8tQ$}+7`2_U6y4vGkc&@RAvq)1f?G*ism8rTLCs>VEdyQy*A8eB65x2;9ZP7#?X z;B=v}RTOxj)YvGC*@);liif}|5c>c+B9IbRUAc*yh4Mf`aS{pxQBV?+hekek43pz? z1%(3S6(XmoX=-_U5W?n^`0YGouy6@7;1r(%E;KMIXyD`_Vve4vsK`;SV8v%p?oUYt zPM5&M!a8?j)A1}(!pD%~FuPkw{D6mmz41JxAwb(NTH?6_7 zrooP}7Y~>}Y?<8|WUy0Wo+{>@49O@Ayud&fii7++D#6e2)qgwkyIo%6u)R&ukQgG6 zJWXDh2nv)F(vl#YGEQ=`_O{4sei0yzbO7AJwf>*AqGS)_6~a`qo=c+HrrB~em^r01?d^Gs2-@>3SvU|m61S$Y_YBN1UrDB7#@JdOgSnbFy!GX8 zZlkdV1q@&tz-NKYzzFQ#{|Gpc_$@=Rg<^w(0K1su{g2*{Qwbqh(H&<_Ryu^=Og_uUhh;G-Mt9>PW`jUyNSjd+%-Zy)PCB z^$&I={((Xu5tn7i+?nW3rR^U%azrg2l7Xaph@3loR@av|j!hnW`}s}h$~G3N&%)6H zA>h48;^+knNtk5ezCH?=GE1mu$&# zHGr?aKE>7Q;BS;lSH|+#`h#p^1=Ls9ym?5!>=GtPs1>17;2p25>?mOB{%8gObIVWMZknfVGzQm=!5ucJ{re+Q*w701mj$-U z0;kJjI#Tq7uy@VZKa2Z=ydn_@azZ59yqKS4& z0p9%=_Ns-0n^Vmc`>VCWqOM^N7TbU3kuCaLKm0iU?3?eygcx@l16>lzLOBmMIqy`V zyq7AhXB9l*N%#u1EF7y4yxKuDQyoO-4Br?5AKc{}Qx?{H{~2Dv@~>HIVHoaUa_c-( z4KoZgjL)=cEYKLn=6HbLeDym1`)_W4hLzf~gbmvx*k!}XoXvl~b|v3v^QTojDSoQ} zyF;3=eRJ;@zw_FT-zRIJtOZ%yvnJc3v%kmAK;Z_*hdHwaN{#P(+XFZ@DxS5*CbSFk zNy}@nl$YKky@`BYRzL|4(Q5aP_G--mi|_X&43WpyviF->z{)9r*3FmW_bQC5ZKGtDKJutMh zoDt=V!u{kp*lo2ToI4XoW!2zuf6DAEpdc;|bQfm$NBM-`%es_GMq?PPisv6ca~x-f z1s2A-6WzHrab94M5QqB=#85y$><4HOcVdpW!dy}t`uGgU?3~m>ydJ(Cv;V}u$oBfL zmiMJix|jKtNhuUc;o9yV{^=`MKcy9+v3AokHZ3>yO>68%){aHXF?0 z2*F4JC$++TgA!Y1fip#cG0`)`JOu#7e1%+y*wpQVB4|eRPUazPNg6vK8Pl%rPt6qF**lqtZ<9IehpsK+Zi6yRdvNdjf{Q>#zyzvLMU zN+TzQsi(YR%Dr|7f?UF;a9<$M7|c~cw0&IbXU-M_JWvjBZr~D!l*;wLW|wH>raxnB z#`Yr(a8Z#+2FnJroR+9h^5DD;(E@CxnBA&dHbRMJhi7SC1V3&GNz%Y0 zZldq%(4Hu-bwl^Fbir{wy1c9oGy`*QW~aV%w`98 z-d1!GjWBLXLZUmS6kp z=nJ*%bVA$;XL3ddK}PJ-A|w)~7%z(ldE7U?s&|O%5YpexUS{!fU7N&Y`%wHF(R0}& zFfO@rN}hiURAAX`#ru7%Aw22|t_VaY+q25SQ<@AOf!OtiKLZ^PsS1p(k8mFS;soG| zQKZ)QWei+mS&vAYRnTUp%iV#n$%l_k zV8VG7u|pg=cOMASf*C?6;(Xbj7er0@_`7hqj8@X}cXEMcg)q~;mMs98KxV(>Okxpk z>kLTcm<0o+R=8ao{Nop25AcjFTLc<&;;e=teC<~Bv zA$;WPN}+=R9?D=%^^#M15RynXUaQcNdYdohxAza zFoHn9nWyAKFT->f;O9>i#plishqDI;Lu?KTOtkadF@U)>xYIPaX$+=~{qOukXj1ZWEvzQq=>zGR^5(y-(QGw#hqiw;Dl-bY6IDMmNTUj8TVbqAvVx_6o2 zySP@c;)D}o+!)x~t9CXD_4&X2o(Cs?^8;`D%3pZ+KD=pAqG=2&YoH6lpwuxXdh~WF zFTE%)15lus6w{>>(2*%5=W`iN-LL3{f}ekK-;GV7ee9JgV^jE_fe-UDjK*01$7oFQ zURlF{B@kPD_M5K(g0495R0~F+%YSLbFV1Y56#tLXWtfEQEf>n{6xDzFrAw&l21+Sd zn`D$_(oFd4UzZGBD9mRS-v7vhxUg~T<6wqijIDn)(t}P!)Y0k9y8Np#v>aj9(4 zMLFY8BXGNY*YJ|(efRIR(GUewEGTw zAu*=CMNmd0e9P-}yqw~9r4$zPx_bEJvClnn-{z;D+u3(6ZbbmwR*wmsv2Fj1g>^Nm z6aG#ZLki;*#x_7K$1)dD`lr&>m0KSLspV7#zUe-)mT070CSH7q>w$XSbgyUvDrS83 z^&5C;Z}uAxj7L9KTf5bv#EcG-wa-)Wy*-K?;p-EySVn$wVzTD7u{FIOEIm0)SqEd` zZkbSjR%z%%cof!umNq|Oh-HlTt$ljBsGph|gWJ~Nz`A_Cr6Q~;g|k{?tI#-KXdEZ{ zCB-~t&?a-lfr==E{qfW?#xcZC2z}`QUIzmc$D|Y?)i)7fnLy+O&>)Z~2{Zh@g|Mfh zMS~cW(wH-R+Vn6aKIr$fCj1Tu_r`MKFL>lY&hr!m zH1{k|mmbR_C{gJUVDkO-WoN$1Dui#Q`R5q`l!`7L*X69S{ILTt3>3I-FlQ%l*37ug zj2p(_m{y-0X?kt~de*h<=eHwlrBv}@8MKefke-xfYp;8?EX0v~Q0M*DYhrFPJ8H(L z0-Py@a%exN@*SqZkvdQR?8?XOS{lfmPy(Ue|K%d!;R|g8&+P z{;*`8r?mNRWrM*^`p_IlS?A*mGv&DBF8ml+W z7e0exTSk+HlHf7wTVlaW6?r4#nhdXH#RaXZfCIT><- zh0GvfjLa=OR4|Rf6K~(b@$ukUmr0Sv-fLKeR|0NGp4m2B^vMBT0cFW0#;6IJX zMw38a<9Hsv-XvX%+gG{*RfHn_5_R`YVAietkX$K0cDzFo&AHRZ1O}z4JBkc0L2dH| z1Q{l$BayC48ZK&C$wTtO`E8N~IwP6APfH$pqg*RY1FigS(rh8F=;HQG2e)Lhdgkv0 zA&JFbd=e>CYu&Zr?%+mP^|{H-gH0I$Z*NeHi5+^b&OVhEN0n>87tr?4ATTP017o*` zgHiSVH=V(;p+;RBkW$$a&8SUQcS3)T^CXfpP;4&!7Gon-!PLs~1t-^jRw^zUB+p;Z z%z`^}u+qIPzf5-B> zw9jew+o3h`{dV>o2S(n1Azt-1nxE;=U1KD1;SjiiNDH0N?-g_d+L~E>>~?KFIjs$D zHwH7yU<(YPu&xwNYmNJ~#<@b{xT4P~wwK%(*qJ9FE+GZEJv<8J(z28DQaJ%6SWG$X z8}iRWLI*$msj_qt&V ztCXkQJGeqPq1NXg;nhjL(`rMq`k?e107ME*gx%SE2bS^2-*lS(+I!zhKlARlKKBBO+Atg%hcCU#t@;Y%%~#VvkhtC^3?96uw*Uk@5TFhsap*ZA7i+ZTv5x~G}uvbVgMB(|2o=wp{8`;vGjWk3e| zbEiCqU<;)bF1>#1vp25a2DFYIT(>@K(zsfs(A11#GQoS_b{@lmwyk9- zqKXu%xQHW|ISuPW(T*H&FIT8v!G(zipxXm|sBxmDH1w74$diP$0WlSDWKPA$M_Q2F z3h9m6_fuG5!j6`Z%U;FFMZE0$GG*f^R~{K8WW#P3@-izZAuWBLz+_P-M2tyFER%OI zheR_WG%(fD@ld5~W4Wx`?a&(>u~vn0kCU_B^=MS>uYT5;+l%Pl+CExw$%s8duL>5I z)FS*2ko);(0I)p%f%`Wuz5V#);+L-8!C+7(FGd^#nK25{N*`g0T9a%rv`cMz6UQuR zTV3F#N|QngyB@h3}M;f#_VyiAi|x4Iez_Hui!s@{E-h8N_{1H zF5LSqapa9%k?J#o=A5QIc$t_j_2o_e?42PSZ69rX}V1TVT z+b4Hw`|0b88n>DTGvgR^K?(x^Cy8*ME^uF|aYE7OHTaTYY!SHf%&ualO;Uhj-f;)< zVl#M3EC20NyBYv;nW}>6BYLK+0{J5{0gfs8SyE_HH;H-~`+tep;sou+MB}7o#1=;=B77(h4m(RO}2fY$4j*w3EHe*91`y;>%I^P3c#>np8|ev z4C>h&$0idzx^dzIk8Yg62k-2C_V;&opT4}ihgbIRVyCV_uox5t3ROg-PpCJoL*ERA zzLN7UiT>Nj8#pDMNT9`gAq*~hpN!1#7ra!~hY0$2fT*CcQm_on7Y(lN&K#&-m`+<7 zB9jrrBsp~&y1w6XtOI>+k2%A-2m=6y8KqMA=fC%D?CtJ>hNI}UOK%FfPOiJ)ZHQto zdwGLFs=#7a;o`#&;NrQHp9`h5Qk_G|JJ}~W?@#hvwdEvqu6~abI?5BbzLD<_#}`~* zQ=7>++l7~VzlVB74G3Q9@HBmLlrIC%64ax&ua4H_7$7AZ3Y)n4+G2rKQC1Sqk8&MW zl#WuUC5N_z-u#Xq5dm*l!&wV`O|oxih0c*FRMy(ah$7SOd3hOf9!-#ylbqKl>yhcO zJC{<9VIAR0eahjDeiQb?-Ju!Xg|}=^!Lp0|J8lm|dR6NJi`s0z?bOLfA31%3zx3KI zC~LuyOv?`Vw+QJ>t+0S8ff7d5G0?E!Sa4whMEu$%Lb8K763X96qRW#7QdVVLUYvT> z$6OOA-FZkskl{3S!lhTQ<2PTw@%bOU?+ne2+0aT=@!)HUuJgPJW0?}=Fh z;Q^&_U#YQP=+A4m&--pv((y>-4hZ(W7%Rfmf;OFZh$;qGhTQK!)nkfk-`#L-h})d) zep^P|Ba~RUXQ-5uM+TDhD4vtz*ET!i9~q7>8xmVYrG~shMNUC?=TwD#5{NiV2qAk; zvPwLM;y$c^t^~w2?#`b|4Ayz-!$H5^bEbr#7Ob=0Ll!)JgtS*mDa@45%I6ibib869 zH$ndJW~vl0ooM|9B7$aqvLwQdy1`v9=viyAPmJ4^Ff#PX(&*{BrvFYStcu?hR+uOx zJ&d=wgT$S^Cp{M8l_n5DyQ6YJT`Oq^yzHSjf{=hmsTl6X%wX#>I}QuAF;T@Bg?b(U z8q?tQYVo&r7Uq+CjX`BC?lu;?^#c3GqVb+4B4Df()=Q0vF0fu`tZ9W4MRDc6W22v1 z*ZK<)8t|S$~X(wIKx1d7!KX z3|m;^l2KTjlrCn1VG9t!TA;R!*}M@0kqhneeqdZ_3R?T7<2ZNyHt`+LW1_j$ixt-L zI9Tb8MfHz==MS;445fs3nxt1xRve`RPhmJ(rGnv77leAYj~{r)n{e*r+NWb*1^sMa z$vEFtAoK2W?8nhAn`D$_buPi{qZ&^;%LI9U;G37D$pF|RV31>_JR7p1idTf3=9SrC z4eS9k8IO2!Fdjr=ym|{p8WQ+0a3s+S23Z{X@K2>Bp|Q&e?Rofwbt z_A@6?YC==j&{`vvDvZeT z<9j)s$q5LfFMQ)j@Q3=CLEtf%H<|5D#r)XqMf2pXy2i{iXibDQA`A%FR0>;ViQ|fX ziNI5^I~3UKM3W@EGc2$PV61>?(wk_^K*fYHGsX;>B;kkR{4!FAR$>P1htHL^NFjU- z=XGLsp?#K_~~OgUw$BCk+skn>LY=kB}9wrGI~GbRLkg`pj0YOsQwVa281<0gc2sfZOyZ#wh#cNB#$c|-nxKb81-2Xe^Tp09`-{)-+}?luJF^Pk-rdKy zcPm^ysBx!mP#KE@%Q!Fw3l5=M7ECULbfgrd}uEUZPT7+Px-QJ|$5DG^yTd^jIM_zy=q6%}R+?^&l9 zCgjS9y;7X^Pc=Szz*u(a*1ZB|Sb>?a@Zs9ktiePValBm+a-zKX;OFM)g4dZF?C?|uktqvDHz zYYRyDbg%MgG@yqu=px@6;=i41h0(%2ma=S1)}!UJ-ghIX##SP&%)?ky)qQeIFEEIa zGSP@H-pJ_n(HtQC`o|F!QmG`ymc`gg9wBHa#s9E+?gbqqc~i7eSD6fPW_;HA3<7#GSP z448KC$Su6V`koY@6q4rv$dw>zT?k@lWH_7_azqg?B+6QX>o~ugHg_i25F-`a%OEiR zsHh3yGQ^K>?tG#dF`@#`diG#WTb56JV~wIX}TGaFi<#H*GECqv9&Z z|CY9K*u7v?c5(W-0(RIHL!3OkzUGQS+m+?5U1L6e$6D+&V`1HyXKRWu1aO>yGfLxx zrcW1^pEt~#Af7R3695R92_y&~W3OmU6{BMJdu+j*;`fBz8DSG?@F>Wg&t#clm9x$( z%dm<-AukKkJ{9G)6b8VS(y9o|nnH}ePkaGH0}EM)J|zJIA{6lZtl003@}8s+4(R)v zF)ZS2bp_ePD?zdxN5x137?1)}ioy={#>{|}*jP}+e4T!uT2iLG$D$%qQ0(@s`ML1V zFjGLqz{IUFo-$)XL>Ll1cf8Ou(BQ*Fz_f0#@IqW=Ep~}eShJ}c^^2;&M@OJ9Iyrv{ zJ_orqFwi4mXnyqx@At|_`tJ2U^Z&6JNr!2$=?Kr6x!go2zxJOE*+y^sy}X)JkfgF$5scIR`{a5(-iUYlZlP~iM% zfVZ4lfASrt*7?a(C-BY_lTV%<4SsG2+AayG{6Vl`jim93oz42)5eT#KaGmcXPie2S zpda@j0Is_F>XNdGvmR6Hot}DH%q8@d^BZpcvkz?ye9gMqj%T+KKuSRaI}E2>&DjO` zKD;*kp@-K;SlG?+Yx~tNUfSLN*rnUMcy(T3uVKt#pp`Vin zn)6^tVjsTe^}Hwtg#&zzMchMWLz;9G6e{=b!Wh&BIH(y5C>Ue0R_bgFJd^BMzB#OY z3RS`-Dc|MmDhbYxPif-H!lEpO_^ofg{PF$i9;g^V!FuCXpo%?Llq-TLkc+5_2)0^a zvayMGzvbL4&~~L%$B6#jU2R;IijHsehywi^z0$ZkoLv<)6XEQ6)?YsOQ}ZzkhQNE3 z$(O?KYh5;0uAQ9z2jj`A3C$I=)$ND+l9cK$YnLc!6{+WqSj!ZJ%75wtE`QVdx^3w@SbcDs1f9twfQCaXNGb$!*I`2u!ng#&Yn0OFs8X^`r)Ez4;e@UF65G=wmH8lsN zhaJWZl)^|U3>0HP7M2JDA`BE^pcDpLVW73k66h;#D^@BHek7$UD0|M@=h{q3NS3Cbm_#Hg>fm0B92Ki1QRr4T5A1;(wH5k z=;;y)w~WEu)071R} z)*9_AS038@A?;VNL}RZER{&5dh2cPt4;owj;m%$D&1+M9apx|+cJ}}~07gVugT?t# z0b-4Yjo<5%j24!?_aG=IZ2ehfgb}4=IpqJB0vU&p&Q)-SBBjknFB!GbM7Y6Ae2qDqSt`BACJ1fecZSZQ$dg0nFe*49hQWi@^m zN^g8-+0j)B0$zWe4Cnc9-{pOXY@$hdU~2)gW3MZZ!I&_)5ZU>nPIweqjXOBDv1VLb zJ9g_v?>tbJKXu{U=1)C-a{cL-_6|O~T^-=&L51DgU}ru@o${7>%`08#!P7!aKrdOd_HcR)SP{Gq%H-+w= zwVe1PguWo zN$QaqB%RDg{yj$8=;)Q>kfz)#g4VhXu=};euYLVH_{)#K`6I)odG??&K3fy@t&6PZ zhbdG{gtf^8%dR(yzsn2~M1=Wbj)VC@_UzsiDhu{0cWb7t+m=6l%`{J6wGDQS3q2_m zFb3h2BAhSu=g*IaKRqgn%hp=d%#T>2ZSS3`*kvx8FfjJk*a=*C-^A(V3||fmOe}cH zz}PZkTz&Gjy433jiv=3fL?Odcl!=_zib8Z#N;Ayx2`3`%hp`L_U6@lF4_sw|)B~+B z(i$UUG1MB?-z$~EP-~2f0^_o5(LW!0LW0r9eNoD1-wWPe>y;_DYHVZB)C=e+AS4CH zhIvKY@IE6##ojYzgI5ZeIi<~g_j`SuXDTf7ur!G<9u8+(Yk;}(apM(%TsRK%bXXMI z!?K)?iss|P#R9jQ8Z`q@45J7KM3@mhbxaq}j|=^&QYo>2uB%Wj77Nt%{1Dtcux0Xc%Jv11yYzF$T=W3BJBL>rDhcfD2$wg1+w;2W5%~q!dc!aP4$a0*WxV2LI&h zP5ghaPVwf+8h+&dGgto9eJAmrQ^#oxz%uVx(6}IU!kFc}w2h2`ZdhwGg|vNHYjJQe zhqdNN^z6tquSbq>3X(H4j>n^;RTHwn2GnRP_-x}m!_utbpB?_JRcdSEHM?$ucGEr1m$cJHDh9SnE`xEcR#@hIE2lE3o#*P(n6~_2T3YBl` zu*)msF7q=3yw6Q5~>S`OrCWS+6vY z%OT3~5U}B1PkSpA$9r{-SZf{b-0LNjmL4cl_gV%yW=2_-7!HRSjB>b^DcpVIp5IFz zH+f}ADY~$xMVLH4se;b3Ybh=NwysrPvm;%7%={>?wLUv=xeD_eoECpJk!~-_4g>hU zt+ROW#4)@uy$d}qg2l~SzU86`f?iNCq|lKncFlDy6H%c+%6P_Nj-{qW!fFKhR!g~R zch(UmMuxVO1i(bI1#ZDBRY*#Wm%3A*BE5HBC?bV#U)#ZRukSqbqZiIj_V(wMF4Ph$ zRqDf0E=RDBhGWrU(Nljr&U=|htKaP&#&Wq(l=DvI#XH6U^M`hgdHS|#aKIK!1g+fu zjuVQosnn$tTK~dW7nd~=8l|9_D+QW*FX`Ai{G2iKjEN>exgqC0@gimLTyaIfrpNH9 ze^vz$Eo1CL-e?kn8iO3jKn!zoV-)(Xd^y{7Rsw)ZnY94GQrNkaJh}>m5-NJ6N=2xx z8;e3I6htUUqfp8zq}jMqj6n>Z27ecM*0;1jN{KQ$Nf0hEM_6;7Foz6@J{`JHq}*9w zUg?^~eN%8s62LQekEdaY`ucX@&#Ph=k_jTWA8w%Nl2)oxq(F*3P7A_r)1V=MEl?}Q zzO~pj_Gd;~KVLF`F7v7ji(&_RqtWFa=zR;-b&!Ebq0t8J6=QaV+Q>6qQ3~Ncn>;zPyKm}k2%wuLd zw&2P%78T;ecNk z<`)j~Wz+^PY}7D}0gOS~L&XgEBSc^oEE^0pVPkCsWc;UNpAuD&ia*jT@Y`kKbN^PaI7p(!9=RYE<~KIsDx|&fgYLqA`-pq4$OsWL zJ)26{7Dqs2;E3axx5-_AHok4$#7a7yaMKj{k-^0XIrg_YG8 zxo0d+0ROuo-tD%5qbXgzgXlj4*_Q&_QFQ=ziP*92h zw;zftOBfSSS;8jyJyIDs%oTvKa^5Rw!qhTtT37QJpa~HwfW~2uq3mIxlNK&{gj*va zG}Z}Mt{Ehu3x0k`d>8lKe+nRH#Vy63+dCD`f1-FcRz9xz_r&_seyC&|B(HD<)bv(X z(Md-(!@JSb6qO{3d!?c>>>y=?5@ z?`b?K^!C-c`TPIm_3Iz|pI*9#FWEyslyD2F4f| z3LY?uLI^BFvD>Vt6;O~ysR&xToRV&DpELeY;mCAC(VB}x45Q0tjeYq{IL_Kw z{+`5{c;Ky9h7~YXgi4djDp@dZ95l_vy~aF!XI_8o&Z6GjUDTL04G!uCl`*(;P@^^$ z20+a=CVgnEamtVd8n$TIqK1m+FEHbA#pJVgI&;vmVTtjeKxG^39MssI*Jy02w_%_* z#wktKy6#)RvT^&U$eqoExDU%Ij2t{r?D)Pr<4N$%@Ph%s!WhP}vcQ`*j(x(t!(g2Z zaO^dhM6G%_a5gpE`dmIy44+&`DHuitDy!f8+ABDyE!1cP8zN0)9m1L#r%yhX&zJ#S zpq^Fu6Yu^WoLd|Iv~8LU`aaJ9(8e#4ga#ICp&VOq{y^o zh+bJ>h1?c-l4~&DkGr+0U3dk&oiC#8BMw7b{^?az(!-wjeY1hx2_c{}RwV0RK1i!P zg7+0ln9Y;SQYpBdzlu*3QZeg>akKp$N4xI8hYOK6d|U{IB15 z1;*4ai;tWG9o0p=>f-;A&%Yo#u@^8I&iKL$1GfOkb-b&qSTa& z0swzpGvR>!o;D)PnQ_;crv^mN7et>b)$**F(Wnsl$Fh=d{7Rw4M_Yh#$&e!!*f66u7W<1iZp~}#n+CJmxHI0^q5xr{GzJ5=XUHlAR@!@2C@G7~FhrOegHcgn zJUD@C^ErP0YcJw=uiyIcUwZQc{C#IOo*XOn#d*{07^1C$u`MWMhN~;bXNl18N5z}l z^1@MOEmC(*D8$UL>H!aUOBQhW_)x9 z_y$GDhw3q6KB*u^$0A{@JWL$Mz=nH>880jWwFNF5pWxK6_=S40@DVNA*WDiVWnpN` zW@j}nu=VSn2!$%~>h#Xj|Kjd!P76ec&fVV!as3y;6#J4(g^O5uaw^Hv;R z8$D<08Yw0Z%Qf>OT#{t<_Wa+moC+XCsQ96ac5~opi)e}WCM(iYRhXB1(1*S&S?J&D z&>qr>BMi|W$(1}*eLhqYnk=sVmW_RSKZGyz z?Z=UqBNVyUhLnnD@fgMiGw*!x!dX1DaSY$SHpO5#ghlO}3k>+M4u{&?ikIw<^mb5s z5;tU^cbJ#9Ef-@uBU%PUPsMHht@RDC!Xn%%>@9}6AWZM<;&Yc@{q+Cgu{ZxxRnNyx zF(3f80*j;tt1eGvN&XJaeHRv}rOo+nvEOoDV14$1`(vq3W8W7++ncp{{Td=^Z^B*96+ z_o9OwCUQwQN^;?T(o7Z22v9u1@d#?;hF^l2(b&%R75i{R|Bms zX+@vWL{km=_}vDZ3(Ikz+T2>~Tl@4tsY}P0ez~B&^&@_Z%#>j)X*TEn?fi4$6VW?Yt+3ZiWgjp04DwXqj=7mJVFJg6VvSv0sl zJHX4c3NPN>!}i^MT;E?{cTr3fQI#Wr2v;mh0=Lv3j$y)j+F&Y6a~I~^%lOh zJHt~Co`3GoJ#cpV$lCa{v39$*cICeC zy5=K95|fJeEWF1tC{@!=)V|?k~y!6@ceCH;(967^8kaZ$I<=C8r$$5Cg`VJorlxCP&g;V#R#rIv@!a&i^ zK`6tV&W;Ncslha{=2vWFAlphB^-*BAOA3JZyd@_Mo&*yzbg^v9)Jll z&g%A(q)e-Hjh;&>6%n{CUj=;0!W4txK!~!?cdIaFd#F;jj2`s#2ps@PuG`feULBuE zS-m;4B=Npv*c1gPxu}-MhbN*EEUHWtvv>4uHX|=Uai_K1WsRk7573H#VB!8f;q>j0AB>{A=ix%2pA6a+2 zu!}_CI^jQok@|X_gC(Znt_AD#5-Ug z3hDMeMWsu{%x>(xP+SF^P(&dl5ag9D-+BeO5KUs9foS5}pZfZz1k5ziwsQL}W*T^U z&zi?W=09e}fwdR+t$kV(O~-_1Q+QbmpApDP4=0l3H{(@l)k~|P4BhAmNP@1VcDv8R z)>5Si`wc(wnHOJs?!UeC9o(Gl=?b!g3Wq;Tzc*FB}cfhjN)qSJk&pvu0U%NZ=`A5ESd;gi=yKx);=JqXo zZFe8H4{D4{!emf*X72{i@$q0p07wxQE}009uMII@82s|rU&dE%-rD>R-g<$5=p zOpbSJ`;ixS_n!Ic&K-Q^=54%ucOQ2SYFK8JnsBTraBNh%H0GY4IOAkcOyHI5xD!hp z<>g?rk!El_m^UOIVYcZUS6^4k?wIHdd!;NWS)snD9Qm7(#)Y~-2~PhPy;(^01aO%X z+y*Wr^(~w0zIuNSAh`at~&;J}w_D6MfYtMKoC_`P^=bM0ep51BJ!32>Wyx z0&(;DDD;gad}-B^gkK0=N;`|hH($Gn|KIkF>5snY{N(QbyebM^<+GCnT~M~zf^#CC{*gx z*s3`Cai31bmFQL17u%_93)i z$KpA+9w#BEy{?w*8En&gAPTu*{F$6$J8R4%f9IRudF~fq*v5b~&W$Em)HR?0RVdsw z4bU*&vNpjFo;!^nIe#4QJ9FakQWfLH+~D@z=GoD@*&sy|Havq=T9~UK^n$Q)V2nR| zEgB1^#|P!J-+yj{zW>|?Zq)O?@%ioPr~c)Q9ej1?E^f^ZFd7sn%MynD;nf7d!X0F4 zL)Ji`ZW@$iadueXD>rWA(q4scz4?LXe&WIVo;hEZKUO!**a{ldFF59CiU?O%Ad7}7_&QjiM?T}098tB+^OwP{_AVEKl9tKPw|x-xA4l|E*fT> z8kSfelo*#K3guRwjae7j@3lmbmJw7niAOq@+n|sXy2O$Npt8JBbR>%mo*Ow5D@6lu z1PUIgP^YXn)fee&1jfRhbG9}r@SX=w!7z_W5!i%z211rxlJ8mo)WQwf)m$WL4~i(~ z_%Ab~91M4M_vc%`^YvF?2L;L^9ljpkr??G(Ga;3u2J8NFSyCHlt^qE9L4hB7|3w@h z55G`14TzkVJ%n8!?GiGV?24r2%iippKa$T|E1>rU`Kn)^$k*y&iLd&l)V9Rz5%u21 z@8$5e9Rd=*AV+0$9VCL~koMnbOP!o1tnU@EeuG>a016?KX_~_iH%1+&tps2NeEp60 z_129^krB;d`Ce7dDEQXDDiPbV%8+s5x&E0j$(vb_qX_C<%P~TRda&fX&<9_cI z2oqu1tQ@r-c&|~o;l63Y6=ufw-M@jio?62=mRjGl{M}{C zAZMUQia}k%NAqF#a~>)OmJVn39*KL=J*!Y^!qn9G2Y+w{fAUS|D}onFT0J@{rY<9n z+?j>LuT=>smcDc3+5r%uu{@qz`&h;HLp5+w!5u(akUM{AU8&C>Cw#I5wu32>*?D1| zOFan%fe9;MCxuW^#e^|4&)BC^55hc?+cTw@cbI6*PS^|w|5n5t_XYtND?+85r)%Pu zW31B;%Ong>P}tjiz9rM7dqEjTd>I6ahxir>C{@}&Rgg>6QGk5Tqt=QL_y*)*ekA`q zDk@+~%rj1BdeX3ad>QfZLT*sLsw-0aM*eCwZH^1}T-~0A9P7DW7Ojs-yP=!kfaHlaiT@LU= zTbp?Lp-sGR^Vn0i;c8aZm+qRTQc8i9JAhgfZM)6>9O!lhB!QKPDke1sc!zx$tYx0e z8@st6Ta`*r&y>TT`->0X|8qb7(0z~nv+rF0%I9CZjxXQZ!yVgTG90*YF?Q$ck%iko z!hp+609eB~;2LKJ1!j%G-~0MYcxiXM%Bk7<{rsF&WS8 zu;mW>OcXJ{n`I2kjAXF{EO^6Mi*ccM0K)H2@A9v_a220_VWkUZWfpIT}1Q{G2$0CkWCdJ4-49Zb73UaD9 zDuAL)Y>LGgar$HN-2!MDi}zeOiFchl@d?Y=Bu!IpSSUp)3M5T^noaJ^*Ro6Cf~?F7 zujO!nfA##!S6=+ib&xK6_EHPxl-*A@6a92yJOGdl;g}4t0V#`mHp2rCzX|Vs%lX+* ztL?clz5v4zxRPNm%j1(P88Mx3GCDb*_D7{`B?&;X#)#nl7gcb&RPg2-*@E& zck0yL)8CAsM_iAgkEy0M(Q7~OkH zj7O@G;+l+m7XT>2lzobM0xH+P;1S@NXF)FgImJ-FDItXI0TdHUxU;AHy~^Xp1niPa z#AF{Je?Ao^L~ipw1!Y%yzbK_)58Z2Lu+ku`>*ALkoOM-MeyXt+Y%S)@7YOtb1xz)m z?E$bY2PMZ-3SJxZ5e6yfyG7kv&(XV`_DHOvwmCO)A+B@78~@GaSD*XEmtMohXaWmH z%?;3r1)`^RyZ64p1=l88Nxw;H9hM?zv{K0edr!Snwue@}X|Izjhd~1J>^Vn+cksg9yEru{@uszr3vDwN zHM#w8QRyQf1@d`H#0jn>e{hOoNl4b}R}i?vn5BL?6iB;TVv-6t8tMAOu}@Ly60PJ` zeBXE5^>#@wRhS}<&?P0%vP-r8J?Bs1gjT<>X!sGObM;8hAp7$w<;~zVVlhq`aqW>% zB@TrY__`?ZYrp#~RFwg(jnZ)ek*N!)+MNRs&Jhb?krozE8uff1KlIpJaNo(vCyX^= zVjW!*Y&Y?<99AhqbbFFysZ2IVr2n2}g0^fHGAxQlBREo_?;|SGlbq4T9#2+RPL}2D9zK%{v4_uLwhf2Vs6}TC0c~Y6 zUrUZ|$d*>0Lls&&!nJBm=JD?BXW6gT!=CcKj$E)#6$Rp-NMV9u**eJQ41VQnFQGODy43DO@;(8${Ua>A#A#yh(DOC+ zBYQxQ3hK&b#MuYrgEmdg%Jfcg-&jgw-zA(bdlNwHgytK&ckvIt_MNBy_76Vx3436- zDM-bV(0ms}C3fVytRh^i;7L58e+CGSvDa+3=4_sr15Yqxq6o8+)TB@}osfEFjqEQB zEiTL94N6|8%@#j&XQXk}K^exBi8sNRd9T2XfyxqXf@5gZSOZrKut`K?#cmH30h`JT zpFoKHN8AJ8?}0d^{B~tRoe@^$_69LKLB}Pipw9Ftav^^q0YwS7uPmla2Z_)SEs-9?JGDw8o@B3 zVGC7i95f8wF#hD34g9rtKm3(Pj}3lmwzt2zF#HvzHK2bkn(32 zV6bV>mNkGzYgaz}>=1(Ap(r z3VtZd7Ro9xg@Z`lxgvyQriA3QOF0c|m*RTq0GCcP_%rE!Qrwnczt7kRuPpeV{} zZ-2h=FTVO6EQ%2{h4UZ93T5#po{)d$#>M(%APgvXpfQFc{K)$+;^f-!bH*5-Xuv1o zSpj5M36cg#2SM06(7WG0-+a4zC=OG)@J2+HqrB5sM$)|Ai(B7i zB^`O1ffYvUR4fTB?JC+~&cRFBm8C<(!4cZ)dEV~wQiUp5Ffy$=s=@s}qZAAgiuE8~ z3(<1#mFSdo-RD#=!6THU3?4taNid>x8|Vyb5H2FY5sQxV|597wd5cl?Yx8;8$h2eY zjuBgC{J?|f@UF8b@TFI$7>oumf>6bM2mS>|FDPQNV+N8Nwxoo>EwY9al$?RiS(#ur z4j@E3a>wf@$J+Oo#hj%9?2OY=N)-ADj(y>9j~N31dzSIPe&bdA@4x5a$4(DN(?w${ z@>ySGh=4S5+|vfpfXiacdg(jKNbcs7ykAu5OG0OfBewPs={x;K>3ertq_Xx&14d(kIq}5`_QNI7^CMDUlsK8;Qg%BSRuWFdUCaW>5=-gQ(|kVDJ61GC za7QKl!&k4*e*W?mtc`p&Jv307FgFb*#^9q5-H-q5?GHS@uGDmQui7q9Y!rpPV2P$l zxXwe$b8!s$+M)a&i9UqB<^nfuD8dc^EQ}q$^W+-+SMPn>_?N!*^6Vdd=PIf>FfNrl z2sWJl8X^u5c#?zbU~X{#WP}%Q-NFC;tC#R!zUSif`%fOHrZFC89hNEyb8B2<*kU$$ zlDM_@9j8M6tK&b!Ua9KPY(X16e}(gWRs*f^!tMRv`I}$*_LIMLbqDvYl_)@%&l{I0 zMu#LXf=LEgh%pz6Pl3Tu;#dPIvjjOu&S&P0^M%@84Qkb*H0ddI`~ zV{bkG+(6OJ!uZUtNc2vw!M;66U4^MF>?Bz)Nvk;_qaa(!9xah$GmjU7tikOn6TJ#_ zPM*!xfuMT@`J-d(2PIiD*4Z7ayf4e!Npe#6-R>BKb)S2WW54>Qq5VDlTw*-#2Q|!G zMx0Xl>_xd4dny++BSp%IVwp22?^GYJD)L3wZMyS{RHm{)kc3rEdhUK(rP&Km^E-V! zK~CP1y5d6Y5gOa2I|~TB8p&G<=PH4q4QCM4+->VOWnwz7&BnXVoZNih181jS-o6QC z4A@)fVyK+;!@&?4_Rzwn@Ua{vBP8-2070t?PZguGE=4*(fCjF}<)B?QK!7k|m$fNn`}2w#b2vDd z5S}Z>6yOZ5jptMWRRL^jxV=&Zl-o~5QkiObqCCwc0E$u=Ul4wXP!VIM zK;hur891gicL%O^l2WitgI*zI@>8zAgcy=nDaMrGlvBm3BH}4=JX@*~{j0zPQtaU+ z5O@c08L`M8@T(x#G08d2aDV}nKs6@y1*3SAf$`kf$BoD3xiOE-m42)s`#iJo!U%FB zZ8)LMM2O{0L?Ji>V8tQ`Y@5OEs0lDMc&AVrU%5NuPk-|jP&ojRh9L_@gt}hf8{fh8MT1d6fMt;NS<*;U2Nll?*qb*vHz@JajobKz=PzUQ z_@n&2Cyr5VEDU2@C{)YVdESxsZ9!kVL@g`F7XAz`ZVBhPJRZF))?%O)ZdUW3{P}+s z@@af6c#X(~19}_|&XzXc6S`RDsbT?NQ0Ci-FWd*Eb)powv3SeblX%zJ6Q5ys_FoFY z6@8T5CUEOaqqNX+fwwD6hWlZ>ZI}a9;B&wIEzAxY(5UqFdv#NGI*o+GCEt0rao|BP z&;UpkXzB%i{E2tq-0`(vFqZwgamhHG7 zYRt(i-1j^MuLWF>zgHQW{E-!@OPwSxy&9AE&`vyzKWz%?DM@t6_xT9 zC@j9WzIa;ECtt3jlC2&b!3bXD4JSs@9*T}=9<3pA!n=dBbQ&|_EN}Yy$fH@tmBp)v zFklcx&(yM_oj&z}l))TVWmYi6jS>-*S^`u6I+l+&T{VnqVeQ2+isygu&FAr}Uw;8R zRgGdY@`vd$U`5P2%Vn6?6_K2R63`0_x^C_+l6FTa*<_N4Bky}$$fXUWS&;J>7-e7{ zf~mFoB0XNRRw8!*qE>|6n(>eR;1&FD-}CULL8)P^h1*9U7Jjxqs0Y@(msw-L^8Hh* zaIudTwr=<0Vap-{xYWQ4Yaf{tKUsqw2WU*hvl4V^py>IDqGtx6%Td@svce{YD+WRc z85F&pl&x!d@H07_sjTx*0ZuWh02+e;#V&<<>L`ufJYlMV$`CdQGrYgl zYu?t(UjR_))`H58vl9(;NPRoSm;)lbnbn!S=PxguRay~l*Ncz*-@f{7?9DBP!yydV zg%7d8@x>hfr?+7^=EPQU%NXJ(3x&(2g;H~?iFQT8E7j2JC{+Z4GQj({PUG}I{Z!r94QI5;4Zo6Q zMD84vJ!<1`kl~X2m+^B?D8g@JEe7KeUb=ec@Bh~CU4|JHAWdLnLWew_g;ABG>wwF= zR({5mCYXgmdFllI)c0P*`nY_iY3zmu?NDGz0m95f&|!~hLVOE})h%BEZzMx?Pg93p za=ND!G#}nrq<2bVx%O-p0DGhJNBsrWmAL^E?z|Tu>>}V*)Ev?hd)da02DM{e0_>vySzR7$;Td7yk@@Whp8$E+a+*mqUf0+=yG41lCiWL z%WdEt{6T?ol|>?5zJB6$O`Gox#CFHDh;p zu=6@8OuUdX4UJi^&~VsW<)+UcGVIce`x&bgXr{<3O(1AyXfQN6PgS_DoU&2@G*&KL z?@H*q%iibe6H`?wkk53;@xWbj`AE^{ioBV8+CP#{f`+FV2~sESRU7 z`FVG^Y))j_%rFZ9i8q6!EP<1+37#VE1j}&|y*-4#^Q|k-{NBzkPEOXbU<)V)i~*_{ z{@NoC;pw+-QGHNt7^WSid`Mjs${n6})?5p;G=9|kJ*|yI&nX*k@g7G?S`~`63Ansh z*N^kMPwSJNP?ae*yoO$KLik z4~<42Xsm@{8gn=lx)rI>cM%CMNf@DQZo^!9{89P*`buJ%d^!n(qQF1<&duqseEU_D z0}W<^u?+3Aaw)GtrM-yZGmNhsN%t#&O6)e6hf$Jv9T}03aafk~uqMYzN~&&U9YGLI z!_XQdjz47c`5y@;$1R?R*dMn?E3Fe|hSr4l+;`m3GGIsfm*dget#uzfBB9TYjYy$6 zj3|kz6Z~8*Z35UZO0DtvuU!7v%^SO*!2r}W00kW7G)Cz)h%A{Af604ai5aTUSnSU5 z-VeMNZ@aMhIc2$On8#2)tW>qun{TTZrRB1eaP-K2{Z~KtUZvQq`YozW^3u{)`rBNY z^^g5?Pk;K9h{Ic2-gauMRc}=OBJc9gQsKiDlr~L;r!A741bUMC`$us_V^a@^+1zki zJ1v)PZ@o$qh@P5{go0TctrtT4aNk~yyeZCpb-pg+a=yMd;?P{x^-y#ElX`C-dUeW& zmPr<=3aw|0#%w&WcI@Xq@aFqbmITvSkk*hP5VD$_e%&iz`D+yF>;*kB%J#r@#;_NR z_E?JdWtEbGM??l<5O(Cvf-fu*D8;g4L<~>RC-t$_LdshQ!09CzK-pb5-#nb@^J^iv^KjP>BXEMM+{<2ys2{f|%c(6h7G&{R|jcBBR zO$917(WWA7D#C_8rOrA$*w929nrK6TO8Z`X2qR5c*MxO@+8ox&%?{a*y+l`mPq_FS zim*W;ou7qrC;Cymn@Yhi`6GMDt&P7SKZ>X%o5zL*)-|wBZZ8zs8L$mS*eHlj*gCia zDx9OFK^qiK_p>MN5l|}Tb;sKg5k`t^8s~iZgC)XjnEUS8Uk2ktVo4MMB2GS$9-CSs zxE2{C0{TSvEfw_1q1N{lN^NMO4FX0rW36Hwtr$m5qJPA)9whjoTW`zm$U?=Xgu*X7 zs@X2>)C6dy@TKQZ^KU=-JPs@j!CZrgQE-Ln)&>036$kO28;{U*Jb_`o8D{DolcXy5 z91K9dbI@!?-wp_%JBsg)6y>laBJ^}oo*8f7^0vd5(ci!EYU~4W!Bk)^_6i8z`Z}=I zKv7`Cgd_X+;wvwl#m63b^42re^j!rhRK~1U#taz|%qFzNoZHFg&L17MYtboe_uVY^ z`*`}o_P_nD2T$O{Xo|gq9;Q`gT^qkQlpy4py7O(J$w5!}nYjc_w2>urwLi7b${B_G zlvpIl`DASsM;UdQh8ZmJJ@gSlh)){(3=6E}vUBwKrRGb+K5jm=9|YL@^uR;qYTOE5 zWur=VcJMI&nKnN|DLt$WR|-skxoiC^Z#XrqkyxPkd&#dfVElb|Q;BUINI(l7p~3D|C3L!o-x~Jc7^S-%zaB zklED9@pw-x0N_c&;^`@-v}#4NQVm8w4;8& zo36SHFJE28*EhGYv}cIgZ9cI;$_Sm{Xm3Px-zERuuA^7&o8k?!Mm`d zq%6`Vc~UGd=^@m}DrT6ach8yQ@207A?;OuH1C`SF`cu#0uE(D}ar@CDG`cWCQK%R< z4{eXAxdF7*4`WW_a!dPD+DAGAx1Cex%VpF=sK9F#^BUWIL~stqi2>o>9?@~d95zn- z3zaEkvXjEe(Km&DBljVOzG6oiOZTvZTOvlx>kL|DE8nXW@2&y?VK#_imkcs!)d_G( zgp%#3I$&pEMg-nqzemamNElgS9wjFvSsF?LN&{K}Xi)(pO<2@$C;Jh_eN?c^0qrtB zcd>3fFv8v$MSx;nS41P%zr@nLJw)f8XQ z%lN>}*B-5_$qF-VLbadD75c7|r=4&@m@UqqXD~ppTx>pf0}V2&(|N?aQ810pp5MCR zomU;C^V4nql}De#mS*hH1Ttb{zV|xa1-JH~7eZAt4hzT5RwMXvVPKb2tGBCnwS}an;G&e88|Hkj&7}K<(~D;_kH#GbJ#a1Fs*8YwP;>t zxw^$c9C8CnDiIMs$Q1X~aBw=Lt(8>E+9ys+#Qtzwl-+wuPWcP`ktgs4p4ooLj&VsE zr15=Q1SWGV!!H>OuM$K|xO91l>-R3c&v4N4AZ2H~+ho_PheR(3nQW}|5phE^lAQso zjX|&1FCSWe@iX^+eH~K*`u3_}SAWL?p-1GISe_u;E*k#cHE6$kMA*r$>_hAjp*!!Q z0dygLC#@*nNqWV*ot&y*kR&|;|Lsl;^7W6qN*hLY)6nR&%|czoc80c&9B}h%B9E>P z+TCZONQ0U2?N?kv-+lEJ{J@LHpo~E+c-#X4t5s+nC}?{neh@SIO5^-wf?vP?Dg4mUBOp?d*-7V>X}!|! zp6Qe)Rwk!FrpP16F?+O>$C)EUY-;H-04nCS3VhTM)`&6E&H?BvI^GBFk7rIK9dhpS z9D+%ow+MmNKY2U?{2m|iUBfQ#^T`!3(jdSBfFT2m#yT@YgcAbo$$<)3H;h%;Nr*8r z_5?fcWR+6i7$G*(*)iBemS8_-{gIBDOyC8K~4Ba zt@=KKFCWp@V}a-{(u6VdEmh5n%otY8tA=?^ktsE+b=}C3;=j4=$jfzqS^O)Ld64RK z*UZQfe+YVhy#8!V8ws(~IWAEdPoM`(N@_kF@3#L;G5}jxJJZ5H?vC!+` z^mcXl%g=1$^t8sMg9X&4f)+gMl5fu}Tb9$%OfjbWM~wYO_Hv}u>ntzgafZm-?fBPW zH20oj9G6q*Cmaj%PMCMjz>=pCGc}xmU{gGG(gwP6iD68Q*I#uI`!s!QT$!OJDm7_4 zQ>_S8$6^HAGVV6xw3}xS)MA?w+kMKP{QQHro!z_uEG(dgIEh2nP2?B5ey*b&e&`P{ zK64iDyzSMv?$W*QC1xnCpp=B!ELbfuOS687bY?(Cs=oY0;|6TYv0MvmXv4cZ4Z`j& zwDkr5CiXzNEN(YJ*0J>jKPjv5r%Y3P-1_x zJ;NzG0maOAIXhZ3svjCBmoV{%ku+i=SY5+-h_8J@KZDUYN>Y*o!K6?`i{#8@4cnW$ z`7}4|a_t#&Wy*<3j>&G9n<@y!7#f& z0X=y^^9ouh>Q>{Al+lu(zPg!cq&$&hfbw7aO)AI024;bm?Uw-9g`9+y@j;O}V#%-f zj^o40+Ww{Mq6b-7<>iW0MPS|>K;|_xdyAQG<<9c@{pk}O8 z;I*2tM*f62V6z}P(Fg9=es&BT_!tZb1990PHM(_MUv({!yiNg2)LaCVhW+KT1b|2K zCApLM9AAfSsl&);qk#=(3>j>XM33bSH83)aRdNmp1B=?7Y-O1JCBkxV(+J_RVD@{c zN(EZfu#Q!sl)L2D?%DABoe1QYrPv;YtSbE@}G?{1=F;eNDg>FmH;KOvvVz4F{Qvu^`{DW6siyQYZzrl?s`CGvrt9T_$%yZ5c3T(&s&$&eDmFE@wF6U=xFrTc14Cp^%?kwZP2i_tXtf zoZhWxDe3$--jL2#nLp)G^&p9Ei1-|jJv{|)wzBD=|+C^5CMgFtURdO4UGwc%B08fl`< z2r#n)NSqzDv&R(dvt(KV**t|(&pUZz!_d0G>8;7_pZdZ>n2@%xhCPP!4J8`G<2u2+ zcr2)QVs=<5#VaTJ`!tGEQszYT^m{IGnYptbzzORm0td4u~H z`&q3G<9m)A{KZ?Zyae0ZRjgkqh=nHPXnjH@qsdB$$?7UZ8GbY_Jj&yQHsv%I(dUyv zSZRTMDCG)B@cch6n`$YHk3HKM-42EEXtxZt8)TmMb z?cqoK_^&{kEVPICPg|!&oPJ0C?xfN!N%9x_md-X=r;x;DxQP8+e%wB$u-8hF-Lob3 zIF08T4N-F=wVXNCBm8yqNPd$%*I}L%l4An%GCJqW6!+ng}Mrt z?vf&$t7?4DrTg&1*Bn}{rWGpE>t3q`MBD%lqLw?Dk605=rgLNw+b6NfO;!e*nN=8G z{~GXy>h(@crxli2IwaU@pNUISSh-vL#tY~0__=Ki`wBJJ z!NRBQ;r9$7QCB&f>(tDmJ-zM=&W@+iiGm4Et#8Zt-iSh?RfvaXG3;rpzQLnOl*Z5F zgETa(r%&fRJ2tQvP8oOUtpV!VVBg{*Zn|vWF^Mf$)HifJ_fPC=6#r6sSVwg1IPgH~ ze0F5ib&aB@ao7D%-1*oO&w+Xh3bn&VIqndc#C<1HAf-U00n%Y0pcwQpJ->~kuecuH zdGxY7H8G5_5~f;oU4xGam}kjQ!GOFSQoSejPvk+f+z7xOe|Oi_V6n2~Q1VD&z{5WPCArt^54Uld?6fNPudF4R>GltBJ?df#ois9miUU&F1 zXsuCA?VVKYZ?zNxn9wdhgm&5T<&*eEEp%DhV*EDa(8#s5z}A?MlF%rbCC77=LP}PR{9P_yTIKurSJWfO?)()9jx7NSTx!Oqa(kFG>;Vtt ze*42B6tg?j0VT1$cS*5*ry1*h?~*(Gq4bAZ*iUj;#YQ~9!ruFoeymfa8SB=W0t)3n zguWv5;b*BRoZ9CPlu*Ei22R)yg)#v^F*b;K)6;DoqGXw1av~tHy{jrXna$HO$jd!5-hn_03A{`u z?`5$}NRKy<%lZNh;u9{gMI@)(l8HereV#%Z~oagu)RHjCWgHoQ!osf_(;=21Us#&tlTOqvqhm$ zO~?4jH@y-E_Y8iiu4{{zAO>VQ`e*yoX2m3yqxL8u%5W5S;TWIKE_G@`Kq#dXo3=Yb z5_=*L7m@7BKI$rtd)hyUm;0m(@At*T~l?#+^b=U+fyxU{V4M9H;15kk;I=B41k)j!frX8cO*2? zMgbgGV8LjSuPZ%XXA-BbDUZ|^#GW`ub<%nvH+G{qc^~kA!u~Fm+wY`+&4yYee{WRC z9Gb1u!i1rA7x|KKPz*3s;Pn7j$nB*9O4y^<;jV0hCTtXn)_bJTQ-mHVRK)0$LO}|J z*3fSDi@cL(b)LUxDwOM&`vGhZstC*f!o{%e1UlMa#wb$>B~h434CNs5Bg{&9YfeDC zV<+%dw2K4Moee4FyrC|;tZwY9k-BJ*3SiR^9qSXp5FG_`3FZ+K4GpkrmpPKSC^yOu zIl&0}iTtuGh?1nVT1snXD7N<)O)InVvB#goq^hu}{c3fCa=XU={Jed>Jqi%*`pfFAiP6};|(5Kw|YxFf89k!C8;mr@=jRUGKx{>{N= z_{|)h85bd(Sm`2iaH7P=AD-oHhl?+14YMI`usJE4rQ;au6VsXiij8|{7^o}8;gvmD zAlzTE)iGY*BtgnRhHyha^Rg~%hizL5CR-vsHeB}l8V^5rZtLFr9z{J|K#v@K99zRT zqku>POW5|cGRgqi3#!d{g8f%qf*=0QYp~SQ_m3x2JCj35?gk9BK(@YYQ1_45FCh{M z+?EEv-5|d#*gJ9!Icu@kZQBBJe2}DTvDYqfs@q%3Xww-K(#6>tFL#liov_A?5>kF= zPa=5B5NAg<+d^#9E}Mj;{eq3mo+l1wru5siMtBkpRCE;7t{%4{E={ZXW8xux(J zKd!^g%M?>*{@qOD!r8C%1iJ9Mg_xkMDSO!27&FMoI@?Z0#v2RoOock{Ah4XYAI+r6 zUIIy_R=NZ;ZoTZ_;`bfCe01#OCRon07(jRhSsi@iH^m4LZNu_SG;kgUaU*4;W`Hnc zxo;RWbjyJwo{w!g${(GqvOOn(UsCswQrI?(KYs8@tlx6OdkzkYJIB*{Qz;z?XlxJ` z#I=o5&64R|tN@r9JQ?DIsYL~B7+}@TXz+SsG`$E2u?npzlz{x3e{Tlap_-l0gBQ*v zObnv<&F~bR9seE7SX6`!FmEu(f?szJ6uG;k+}y4`InW+l;VIhy$esFU_l4N+_8u!A zi46@EQCX1MD3n5> zs}FtH)YXs~rDC)0c`kLBz#j>pY%@4M_>Mng7{BoVZ-k1kp=Z#Th{@HiciOxo3B>||wFL-8ks?x+R>oJE&BI9uL$ zL3X`n+nRl8oTNhV25F~|kLE~fS)Px}d75;&i2t^$b)&9dhfydIKQAj!mwgc~ge=#+ zYni5w1CLP|gm_|f!mS|p%aAaw4GK{CUDqDM{^cRY<;0Hg)duYL6mZ~IR6I={d&P#> zU}2;(NF036wEPxN178yB&{_t|aw2!4dd;2(ZNNx)pR|QAPKl8eRSUCfPHB@O6bd-G zc^d!v&yU|RSQuF2gro|=c;-Q{DVF1FN^w1U{0M`U=at0Sd8*s<9B%&(5y64j}T zsw5ci7CezI4N1$B`yLyV_|YBq`TG;RQd1Z0n%II)DX3G3&Evj@<#^<0W$fN1yZ?%k z8KM!nyQJKEo2Q#ma)(WX{Zq*@K(mQ> zUxpX} zUw`a5Y*%AwX0WM2Fqo8MyyNnNSlcuFd9Iz~?s?)Muipm%2qWtO9w;S^A&D z&$4bCl4GZh`!xma$w7rctuI@d0>*@h0tzi_QP*zSEbo%T24F?7~G)t6^R9#@AmskLSuMhCPMa zWO_AH3=VX;hsM*y(blC512e+CQ3$+H~A(mD&o?98CcO81;e1D<*fs>PR$xQWg9ZHP zn_h*bh2C*C1|S+raGUq7&b}7fKGkjEc_=?i8`@x}ke2KFv6tDz{uX8qn6tb!evu<62<>X0l#EpoT0-E=ZHx);Y<)qbBdtR2&kBC6L3~aCys> zm)`U3mtS)0XC8bCs;7XuwlrxSQ?kfK2sAZ{lsry|jPKp3b+{$oF->;n;2<)D+#qq7 z{ODq%uHj2OIf_K2bZ*Qm3qfoeSty_Qju|Kljgk%i;QlA@zHh(oeOC9pDm^U=p84yjhseBaQz7&CCOzzvu%R*vRokpeBDuz1v ze_QG-Wu9a__;!n$P0Do&bvzj0l3?#>(vC)kUE&B}Q86EbJD!|DLk1RI9fq(@SD3j9 z?_lq5B1MaKnWQ;ZAYSIHVF9UD?!sSp3_AJChTW{0pS2=)kVdFKi&-jn_=Kxp3Fea6 zggsCRhrK!@ThDx^S}t*Jj^6n!GPvM`t!*STU22l)MGj=7S~?e{(3Gl_{hYw=Qe@gR zOeHG}-Kd(FjP@E=>IFaZl^MD4HNfiRweIyc?>}>n|McVwSSAfrHKG$jt*2d*QZU9~ z$h7hHLkIET*%HrACK&bMjsLJ5Zr%&RB<;ACO*t2+~HvYUj*JEd@ zK2NOg+uq3vKf`OkloKG-hB55vwdc2|haYaX&n%8jBx@+rHg^27RZ<9h zu|a@hjK@=GHhBLVZp7t%d|z$kVO9-m5h~823_0VJyl(-hF^VmxstlHvhPddg%Ub)rjw|&|H%+aFqS10ZlbRlO&VJ1jrydmMnS?lY_?QK ztrK++bcumAsn1AY%zQ#h(@OhKD? z#DBS&rNYdRX6H{B$<=McuFTGKhrsdEaQQj=+NA)~$9Xnwvq)_YV2Gc8i$kj7P5dz{ zFV8SJx*6J`XV0F&zx&FgA6ytLpbiE#&qRb4 zrIftx7@3yI=br9|H;{g$+!m~0?QPY6nH_0u`ru5Z&w}{20>&(X?~3tj z@~xR%z+y`Kng;{+sB&K)KVuW?M<8fmJ)VGPPu#OJMPc@7J(=x7{7(^uhSVs%T3!?Rc=!7QPP@vMyR-GWA)Z`DQupc6K$cCJKvWJC~iYRPKPd^R-`I)KE zUP5ckkhc)L?g%ZAER<+z$n1FrQpi6Oqny6y#7^c$pWUp8t)DGdfuI$Y1<|GkHWl$^ ztG-Tbn(W=#OCKjFL`#(^dTYPCzJc?T5`8x%Q8VNGc!GBvx)fLKU3zy_8`R1jM3L0h z7m?4Vq*S!((z%1>*G@e?aTi-`Q0yzQ{6cALk0+b2*}qJ;tn5QiDbz&JS|zh>9_YrF zwXIaM!O~!WN6&8IPfxvgcxnu^pG`EdGb^I{u@|*ig*J1{$(N9d!B9o9@yxmDT~D4F zp;xGgtBZV+vVM$CBqnA+FqJP$)vRJ;INF_sel$q5o09 zo>Zy44dj%zuFwg-JqZoFB_jn`BY=%?ekCBwFiMeQaaI_T!w& zls7p}Z&Vv8Z=0w5xi2#T;ViJZ8({*100k^b^EN&=zU`t^k+x~{xJhWrZ(s&up1Gct#Y8aPfIjKB6cgm+?=oCW zFN+|&@ga8+E``$oHx;lcPQ-K0l0O-bMnrK*pmU%`@x(tjv*Zr9AfVI?6l^z)_F(^t z&oK?0kf#S~!U?~mFF0v-1}mJcX z0s_n_n+dUr0LJBtPXEDU0yoW`QkfU$S+O^v}N zx`(%4bLBmzs!&^GTsHFA;lg-o`PQUnX2O_YH-jiyTsfE!j+s^pq!kE+9?{D8U$Kfq z{XV9~Kr6Qg$r(<0nwfX34B5$?2?N7^AD?~h1$^WDdAlmxn9x@82=QDW#(@A5*fK^8 z2cu+)$pecM=eP0P)&za6?4Bg@4oNl}8O?+JkZ^XK1LKcQmNqH@M)I$hduAB--7fd@ z`9`~BWSU^d0Lqw=teo(+FtK~iiIU6z@^V}*h7_0x#+`m=FK7m)b&a#5DfSc!@4e+l z{POqT^Z{K}_baDwe3Lh&Rm{LK$G?v5)E*17?&A5nxCcY7>(zd*z=Kb}__Z&7^*FdU zfbtjl`Zf%DApG$dNTyta5{-mV zxR5T5=ar0fK)eACAkwvg1d0?Szd=YW#nbO;@XsWOZ$Zh?^R#p|*6jKVDY|Hoe2{dB zddgCB08HV#7eqk=F-WOlk7#3B^V%D)SfwAh<_dn~?4W4 zg642?AD3WpnjXi~_ux+UOZZx21m;C33>C29W};94FhuARVL*hw3J%q}tP}wyz?-Dp zse#5W`*XZ1eMC=ff+Y!IHYXib4+Lkw-P0h885dbdRIZ;I`k5m^t$vrOVuquXE*cj-3fAikw&)#-wYlKB2fDK3! z&es)w=*mm5ws+zE)np1L1;y#|%m}!fyb7nyL9)zVjvIhw!m6wfhxH|1U(2Y`7PYFx z2FOq;){+3xIab@#YV#HQ_t2~NFY^m8Y=B{)NdYi!nPVit0}=1;R$ODDPD9A2XeB#^)XQvgG76;+* zl-BVdB}|I%H%hR|i>U%wiIHeY3;A8h_Gxew0k<+i9QG5Mz{`itCHw`zaZ?k5b`KyW z+U&4jkDXk2FzNSzDM_XM5UJo07-KN4Dr}D@Pz=2K@&owk*WZZ0{kpZosOohhyQdn| zem_%iijw{vEu^Q{{t<#^0Fb+Sz%fd(fui~-n|iU=TiW=&dmnktg^exfrGDt4`QE#@ zS0@N?pupQRe@&*=3R~yS;irG#yK(iUdv0R}CN)DThHf!Fp^FfK{c=%RMX!95K48F{ zT4RYYBzN*aPKJCZXgDQZ*r;ugti@UB3US^EHOW5v$48jqG zCF}mX#|;gFWkE>U68dAn!ya$ASx}#VF+^G4c!Efo=_rh=v(zW0VJ@yTyKh8NCnW3V_x zUDqNbqc)sIU_e{#LPk>eI9TM zCwWSO<#Dh!zOCyP75GnIdkjDM>T6$o)yneHcDW7GMW~cjoD_95Q{<>$H zi&uaIc;(jyd__XJ53xDY*6dGRVb*~La=##08W&Hm-*@5%Q{p?%mt2fmd!;e4O(n48 zm{)_uWbmO;&oV)4*`6jamkfK1IRF@7g@IKfDglOJ9xCRI98P|nH1hUzdgmo0 zJRC;CNxS)F7GCC4=N(zo2%>{*Tj?QplwmHR-na=Wovo!!QnWHw`j)#+on@gt`T-CEKnh&d=qnn&@zPa%^~^b(Hx>FS+y)eB2Et%es3QXtFct>|?s?_~+;U*= z#w{!Rsjdwec5tN)`q_S!+vuzwWTnaeZ`0MxSm+nS7e~|AJapZizx{1j-*e5L z;TyIm)li8637fvz7Rd~Dn^JZH5th=%k-F%Ng|=WA!=+M1`Qn*!?RP)>0LH37FOhdy zw&Q>Bcq!O<@6a<7m<$vcJgLy%vw(Mg_sg+3=&esC6%1pAh&R3MmGuh1x5Y8=nmS)4 zJaUI64%L_2}@tyJBs>lW_{d0^R!)8Xkd9!$HpW|n{y`VX$)p? z60sQc2Qqq=d_Dr_i4Oo(RqZgNMzct=WKKIm>G3lqps_$ zlgmz>lP{22Mvt*&mt32&0^`kxFTM5qj$D4vf4J{)C`Hx?0RY)U7UB|+L8Q0a8P|+$`n&WID0sw~Pozx&@I)Wn#8`38V!p14=0@3>K{N z5TGtem33Y~@TzSTsjXy@$801UcqFONT4694ARjFZNjtuG#qs4i zDu?zxm&Tw3cx0F{swSwa>4*%kYObM~LF_Khtf~`JB!GTM#M$Xt1cc=_K@I0k7-+HW zIEeLgU}GMYmyVYCELnU{Ip7WAWHPlfM5@KR$;tHc*>opjoupBhZD=ECtx*(3!(s8@ zs*Qxs<(GW8XUsYcY#-IZ z5pg;1px+Z)0N0xw=&X%_sj4tanQQFj)BkK(dA} z9Ged3J6dV>9%S{Wy?Wun9>JExzhq|PC#|URCmd#mwMI2_mylG{} z?;39TANiRvgW55tVn$^wkNc!>$)LbBSM0<0Tzx6t@ro-(*DdvzOkLspXar5Fv?mz) zl?zC4g_q2t&}i>cz^$+|Ef&sx8cE`5U{k??+{Fl$)$H$L91GBh@8gT}RklBaa z7KxHWFjj9&&Yi=XUVkHQzV^@uOjTh#p4h`}YC=6@(7V^~w^qS+b?=Czy76LypXoEk zpq@++uaS`@UR>T?vpU|1D~bXI^+cUSQ6!+!uFB7rK?W7%ZHLD>u8=G+gtI6Hm)o2| zBqUR#o&=!Z>$@yw8$@YuF2-Mwt3xJ}Nv4;ZvYHGy&j{_y^`j0filRs&&&se12zg@> zGR}zeM2towYbe_S3(469|GMa9Ht6>U(1i{o{=Us4ZfG)5j*1|Q*ZA$cZ&}aLXp}fq z7wtTqt#hl_Y;A0EIw$zX~NT9ts_fvMfYizEk-$6AbXj z-+U5Zf8(p3e&wYrN2=NkwN@p;fd?nu#xTlKt|~(_c*W%Yi>trol2>l%owmTtSXfv< zuV19~?f}*js{{5<6%QiG@g)J}Sy`m)2yR)HVRSNPO0N0h(t;d#&Ko>1WB{f%D2fH> zq7dRI!Jii-4of~cQGyW5ZNv#%L_=qlN)Iw>1{8R6QcX)!o6^*EiJC!m4aEjzU`M|V zHcX8TL&~>PNiBD~N!}#{fPsE2O@ustS|I*nuGm1DIjp z2QA&cy?SY!j!{hjR#tnxB(r2T_ay{|1LbuMCK`U`)U!A{o#KGj;My)e99N9nk6ejm zU3`)huerlYN`)wM7f*m~xTwdGFiY|+%4`ZJgA;_Hi5h8TsOky}g9SU-Ao@(+USng{ z7L;1Q<=_E4c>X*l%;=Fq&3@J~RhePAqtk3$69#>SdpFMD^=HrDaoZIKKTb47pJ|O0 zO4e!}VkVJYT@pIniyTuC*^&C%V8u{<7^F5gCly}Yu27JMF}`0*kmX0eYj8M7$XHFx zZn9f>eH1^6Ty2S*V?|;1#ycR!Sp85t=CQG>WY|4tch*1v0 z&ELHH>oAJ!39JS%iiB`+2Gw$bkj1!`V|$>=PrUgi>>Cyz9hGAkQ(LQE1OARWmC2w| z3VlD=5GhCNAfmS^fwpc;OQG+|XExRL_BN)|X^SoqJ(Hd7b-^#oG~giT=`#E*C)c*j z3|$oH^?IT135`ghj_;QSc0^rrg#o)7fc;9Ly#AJcBEon)#&|M;rkLKO(d-~y3xDRt zHev9H8Cq-f2Yo0~4d0+GUHB?=PO{WGYdc%pbY;Q#lZ+OSw#VyE=TzA7ruV@H-7ZZm>3=c z2HIVe7}LqMwRz>;0yvU9R*=qKU{GXzBZS#FSv}7RU!6JnBPU!hjU|q|gKIFGy`@BCy?56I!t?P$Hns6Nfy<UA_u}U8>2z&^y$zPJYM7?zrs%DJg^>GDzn2Mbpie)D&C`9#}O&?Y#lo~hz04GLcoSxPg6z(vQ+Q6u|N6Ytfa%^T( z!w&>TzB1enS1ZeGXQXN-RCNu*cAuFBKyJ^HAr5=Hg8X~%>rZVrQPyg9ju-(jDuO`R ze#EZ+_RctW00VP!&t3t-KoJHC=qq5MD6m}gu&>|4%Hja~20dK4cL6sZ+_Q1jfrZ&U(k;@XL|e%AzKFnpVIDFwilV?@JhaYV zd1xIx7(h`4h7N7!OORUyT6GLFKoy7yN)smM&*7D?ID*^0?b?rO)a8`f?E@r`VlXRl zx0=nHkoKpU_ARgb4vc6sulc^3W?xSAzRuo)>@&As2-H~eBNMySre*K!4po?i4I2Bt zW~A3i9aXH4-#D9Plq{XgaCmDuB8$dWA0GkDa@yK4aVk5C4bZXS4`f(J=-RfeJ>5=t zN~rd2=t?fIi_pb9xj(`)@M4{_ox4mLW;tl`O@<}ivlei;!z`T)EHjQ7%$0UGfno1% zD9079TG{{c?|<3hJ3ez_165T+DGgKS^jd}FfrZZ{G3X>?x^Ldlwc~^|`{0D-`Jnv) zWnV*bCpDa=X#+#l_Px;Dn@6rjU3SrWqJW*Qw7tK$3;}3jcroih`cWA&?6zPQ+VPzH{xY_ z!l5QNkXr&6k-O)r0Il~47$^;5j>o1Gtt&zq@p5i1JLsG7p4@+7hA%fDKA#pI&*K2h z?_~Qvb+P(rXFZ(j%DF|R#bIE;fm>byb6F@|{>8@GPds_{9EPyq%n)HzF@EUqCAezO z@K$@FFh&I4Y$e(8zHJF**S>;Kx8VFYbx^KD6P4o)viNuBV9Uyvr9_<^I`DAHjDv&z zN3LI7`tW1tM~*~t=O5$@h%>pKzifcTUV*P|oWaAFZr$-+mmc_d$-Gh!HWl0~=k82! zsHt@>xEvI!+^XuE?|<$r&W@+Jtf%e%DK^oOA%NY9n1EkR;P&|_K(XDb;f`ZSPR>Ma zkJ;Ye>!SyS3czBohdo+hxzJeX73eF4fl}xz6>uv+(4^czPaN#AGyE1S-(}{$x*?yB3S$-eIq}zo!TVVa4;))Ld3|U2aV# zFu;(AptUNCeqnjz>_?)zg>CARsa>h;pc>+Amz5LyDHLt~`ez@&WHg3eC;(=dcr;D4 z-%0DY)1kP60z*+B7k8vOF#nS)u97BK)ho3D{!Zw~xY{DayK#hGO4w+HgKJc4mmoT;z|uM=#<=!7hUlsAm4>vOY@%5A9otSXtO~>s7JX~g|} zKwGus3~*Znbf%pZ+8i5+^;;4I9`DAS>9@+NYj=9;#;a6i_P# zgBsctxc%xYp_$eJ9+5rH9)WY*>~F0bjc3`4+05%$bdW!cI+t5@Kzo_#2x$Zl?$@GX zY%+k?uI|N`&urq{w8lUy>l9@2lLIhze}_eZlNUz#>e+L+`QZNBdqj8FzzPAIekjKN z>!_YXNPPXQj4PZxJNk`Bo<9qi8VWT`H3hk;D7F{Tg?&_Z2F4xAq!}P>m)BLc;My3} zhGFU&#wbi{Mz2u#&Q~45kG*OQOXKQT59-9eh2F=9THn*tbX<3n`Yj3>0`yOf!DLbn znYrYuLTQ%;ZW_bUVbcmwYN&}yKMP_KW5CJA`E-SVFFPxDu946-=wXecbuzhBTH� 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
@pJd=OOj9$}gzBVNY_pbn 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 z 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 z==

(Tj7#8BM?~R9OHGaJXrktx;8NyzPc- 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 literal 0 HcmV?d00001 diff --git a/doc/parameters.de.md b/doc/parameters.de.md new file mode 100644 index 0000000..8f552cd --- /dev/null +++ b/doc/parameters.de.md @@ -0,0 +1,371 @@ +# QuEst-Parameterreferenz + +Diese Seite wird aus `parameter_catalog.json`, `quest/settings/locales/de.json` erzeugt. Ändern Sie zuerst dort den Hilfetext eines Parameters — Weboberfläche, diese Seite und das Desktop-Formular lesen dieselben Dateien. + +## Übersicht des Katalogs + +| Schlüssel | Kategorie | Typ | Einheit | Beschreibung | +| --- | --- | --- | --- | --- | +| `amino_acid_interactions` | Löschung | table | - | Tabelle der Wechselwirkungen je Resttyp. Jeder Eintrag enthält slow_factor (0–1, wie stark der Rest den diffundierenden Farbstoff verlangsamt), kQ (Löschrate in 1/ns bei Kontakt), quench_radius (Kontaktradius in Ångström vom Farbstoffmittelpunkt; null übernimmt critical_distance) und quench_atoms (Atomnamen, deren Schwerpunkt das Löschzentrum bildet). Standardmäßig löschen nur Reste mit redoxaktiver Seitenkette: TRP, TYR, MET, HIS, CYS und PRO. | +| `amino_acid_interactions.kQ` | Löschung | number | 1/ns | Rate, mit der dieser Resttyp den Farbstoff bei Kontakt löscht. Beiträge von Resten mit überlappenden Kontaktsphären addieren sich. | +| `amino_acid_interactions.quench_atoms` | Löschung | list | - | Atomnamen, deren Schwerpunkt das Löschzentrum dieses Rests bildet. Die Voreinstellungen folgen der redoxaktiven Gruppe, die den photoinduzierten Elektronentransfer vermittelt: der Indolring bei TRP, der Phenolring bei TYR, der Imidazolring bei HIS, SD bei MET und SG bei CYS – nicht CB. | +| `amino_acid_interactions.quench_radius` | Löschung | number | Å | Abstand vom Farbstoffmittelpunkt zum Löschzentrum dieses Rests, innerhalb dessen Löschung stattfindet. Leer lassen, um die projektweite critical_distance zu übernehmen. | +| `amino_acid_interactions.slow_factor` | Löschung | number | - | Faktor zwischen 0 und 1, der den Diffusionskoeffizienten des Farbstoffs in der Nähe dieses Resttyps skaliert und unspezifische Haftung beschreibt. Überlappende Reste multiplizieren ihre Faktoren. | +| `attachment.atom` | Markierungsstelle | text | - | Atomname (z. B. CB, CA), der als Anbindungspunkt des Farbstoffs dient. | +| `attachment.chain` | Markierungsstelle | text | - | Kettenbezeichner der Aminosäure, an die der Farbstoff gebunden ist. | +| `attachment.residue` | Markierungsstelle | integer | - | Sequenznummer der Aminosäure, an die der Farbstoff gebunden ist. | +| `av_parameter.linker_length` | Zugängliches Volumen | number | Å | Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des Farbstoffs. | +| `av_parameter.linker_width` | Zugängliches Volumen | number | Å | Breite des Linkers, der den Farbstoff hält. | +| `av_parameter.radius1` | Zugängliches Volumen | number | Å | Ausschlussradius, der den Farbstoff als Kugel beschreibt (Ein-Kugel-Näherung). | +| `coarse_grained` | Simulation | boolean | - | Reduziert die Struktur vor der Simulation auf das Rückgrat samt CB, wobei CB in den Schwerpunkt der Seitenkette verschoben wird. Seitenkettenatome fehlen dann, sodass das Löschzentrum jedes Rests auf dieses CB-Pseudoatom zurückfällt und das zugängliche Volumen wächst, weil die Seitenketten es nicht mehr versperren. Das ist eine Modellierungsentscheidung, keine Beschleunigung: Der Aufwand von QuEst wird vom AV-Gitter bestimmt, nicht von der Atomzahl. | +| `critical_distance` | Löschung | number | Å | Kontaktradius für Resttypen, die keinen eigenen quench_radius festlegen. Er wird vom Farbstoffmittelpunkt bis zum Löschzentrum des Rests gemessen und muss daher größer sein als der Farbstoffradius zuzüglich des Van-der-Waals-Kontakts (typischerweise 7–9 Å bei einem Farbstoff von 3,5 Å). | +| `dg` | Zugängliches Volumen | number | Å | Gitterauflösung für die Berechnung des zugänglichen Volumens (AV) und des Diffusionsraums. | +| `fret.R0_matrix` | FRET-Akzeptor | number | Å | Förster-Radius R0 des Donor-Akzeptor-Paares, in Ångström wie jede andere Länge im Projekt. Gespeichert wird die Zelle Donor→Akzeptor von fret.R0_matrix; die Transferrate skaliert mit (R0/r)^6, sodass eine Eingabe in Nanometern FRET verschwinden lässt. Typische Xanthen-Paare liegen bei 45–65 Å. | +| `fret.acceptor_dynamics` | FRET-Akzeptor | choice | - | Wie der Akzeptor behandelt wird: „trajectory“ simuliert seine Brownsche Bewegung mit eigenem Diffusionskoeffizienten und eigener Haftung und verwendet den momentanen Donor-Akzeptor-Abstand, „averaged“ mittelt über sein statisches zugängliches Volumen (Grenzfall des schnellen Akzeptors, nur gültig, wenn er dieses Volumen schnell im Vergleich zur Donorlebensdauer durchläuft). Beide unterscheiden sich, weil eine Punktwolke gleichmäßig gewichtet wird, eine Trajektorie hingegen danach, wo sich der Farbstoff tatsächlich aufhält. | +| `fret.dyes.0.D` | Simulation | number | Ų/ns | Diffusionskoeffizient des Donorfarbstoffs in Lösung, ohne Wechselwirkung mit der Proteinoberfläche. | +| `fret.dyes.1.D` | FRET-Akzeptor | number | Ų/ns | Diffusionskoeffizient des FRET-Akzeptorfarbstoffs ohne Wechselwirkung mit der Proteinoberfläche. | +| `fret.dyes.1.amino_acid_interactions` | FRET-Akzeptor | table | - | Tabelle der Wechselwirkungen je Resttyp für den Akzeptor, gleiche Form wie amino_acid_interactions des Donors. Verwendet wird nur slow_factor, denn QuEst berichtet das Abklingen des Donors; die eigene PET-Löschung des Akzeptors würde dessen Helligkeit ändern, nicht die des Donors. Voreinstellung ist die Tabelle des Donors. | +| `fret.dyes.1.attachment.atom` | FRET-Akzeptor | text | - | Atomname, an dem der FRET-Akzeptorfarbstoff gebunden ist. | +| `fret.dyes.1.attachment.chain` | FRET-Akzeptor | text | - | Kettenbezeichner des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist. | +| `fret.dyes.1.attachment.residue` | FRET-Akzeptor | integer | - | Sequenznummer des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist. | +| `fret.dyes.1.av_parameter.linker_length` | FRET-Akzeptor | number | Å | Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des FRET-Akzeptorfarbstoffs. | +| `fret.dyes.1.av_parameter.linker_width` | FRET-Akzeptor | number | Å | Breite des Linkers, der den FRET-Akzeptorfarbstoff hält. | +| `fret.dyes.1.av_parameter.radius1` | FRET-Akzeptor | number | Å | Ausschlussradius, der den FRET-Akzeptorfarbstoff als Kugel beschreibt. | +| `fret.dyes.1.slow_radius` | FRET-Akzeptor | number | Å | Radius um jedes Aminosäurezentrum, innerhalb dessen dieser Rest den Akzeptor verlangsamt. Getrennt vom Donor: Ein Cyanin und ein Rhodamin haften nicht in gleicher Weise an einer Proteinoberfläche. Voreinstellung ist der Wert des Donors. | +| `fret.enabled` | FRET-Akzeptor | boolean | - | Legt fest, ob ein FRET-Akzeptorfarbstoff simuliert wird, um FRET-Effizienz und Abklingkurven zu berechnen. | +| `n_bins` | Simulation | integer | - | Anzahl der Zeitkanäle des ausgegebenen Abklinghistogramms. | +| `n_photons` | Simulation | integer | - | Anzahl der simulierten Anregungsphotonen zur Rekonstruktion des Fluoreszenzabklingens. | +| `output_file` | Erweitert | text | - | Namenspräfix für gespeicherte Simulationsergebnisse, Trajektorien und Abklingkurven. | +| `parallel_trajectories` | Erweitert | integer | - | Anzahl unabhängiger Brownscher Trajektorien, die gleichzeitig gerechnet und vor der Photonensimulation zusammengeführt werden. −1 nutzt alle CPU-Kerne, höchstens jedoch 8. | +| `pdb` | Struktur | file | - | Pfad zur Strukturdatei (PDB/CIF) oder eine vierstellige RCSB-PDB-Kennung; wird für die AV-Berechnung verwendet. | +| `random_seed` | Erweitert | integer | - | Startwert der Monte-Carlo-Simulation. Ist er gesetzt, werden sowohl die Diffusionstrajektorie als auch die Photonenspur initialisiert, sodass wiederholte Läufe desselben Projekts genau dasselbe Abklingen und dieselbe Quantenausbeute liefern. Ohne Startwert läuft die Simulation unabhängig zufällig; die Photonenspur nutzt dann einen schnelleren, mehrfädigen Kern. | +| `save_avs` | Erweitert | boolean | - | Legt fest, ob die berechneten Gitter des zugänglichen Volumens als XYZ-Dateien gespeichert werden. | +| `skip_frame` | Erweitert | integer | - | Unterabtastungsfaktor beim Schreiben von Trajektorienbildern in Koordinatendateien. | +| `slow_radius` | Erweitert | number | Å | Radius um jedes Aminosäurezentrum des gesamten Proteins, innerhalb dessen dieser Resttyp seinen slow_factor zum Gitter der Diffusionskoeffizienten beiträgt. | +| `t_max` | Simulation | number | ns | Gesamtlänge der simulierten Brownschen Trajektorie. | +| `t_step` | Simulation | number | ns | Schrittweite für die Berechnung der Brownschen Trajektorie. | +| `tau0` | Simulation | number | ns | Fluoreszenzlebensdauer des Donorfarbstoffs ohne Löschung. | + +## Struktur + +### `pdb` + +**Bezeichnung:** Strukturdatei +**Typ:** `file` + +Pfad zur Strukturdatei (PDB/CIF) oder eine vierstellige RCSB-PDB-Kennung; wird für die AV-Berechnung verwendet. + +## Markierungsstelle + +### `attachment.atom` + +**Bezeichnung:** Atom der Anbindung +**Typ:** `text` + +Atomname (z. B. CB, CA), der als Anbindungspunkt des Farbstoffs dient. + +### `attachment.chain` + +**Bezeichnung:** Kette der Anbindung +**Typ:** `text` + +Kettenbezeichner der Aminosäure, an die der Farbstoff gebunden ist. + +### `attachment.residue` + +**Bezeichnung:** Rest der Anbindung +**Typ:** `integer` + +Sequenznummer der Aminosäure, an die der Farbstoff gebunden ist. + +## Zugängliches Volumen + +### `av_parameter.linker_length` + +**Bezeichnung:** Linkerlänge +**Typ:** `number` +**Einheit:** `Å` + +Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des Farbstoffs. + +### `av_parameter.linker_width` + +**Bezeichnung:** Linkerbreite +**Typ:** `number` +**Einheit:** `Å` + +Breite des Linkers, der den Farbstoff hält. + +### `av_parameter.radius1` + +**Bezeichnung:** Farbstoffradius +**Typ:** `number` +**Einheit:** `Å` + +Ausschlussradius, der den Farbstoff als Kugel beschreibt (Ein-Kugel-Näherung). + +### `dg` + +**Bezeichnung:** Gitterauflösung +**Typ:** `number` +**Einheit:** `Å` + +Gitterauflösung für die Berechnung des zugänglichen Volumens (AV) und des Diffusionsraums. + +## Simulation + +### `coarse_grained` + +**Bezeichnung:** Grobkörnige Struktur +**Typ:** `boolean` + +Reduziert die Struktur vor der Simulation auf das Rückgrat samt CB, wobei CB in den Schwerpunkt der Seitenkette verschoben wird. Seitenkettenatome fehlen dann, sodass das Löschzentrum jedes Rests auf dieses CB-Pseudoatom zurückfällt und das zugängliche Volumen wächst, weil die Seitenketten es nicht mehr versperren. Das ist eine Modellierungsentscheidung, keine Beschleunigung: Der Aufwand von QuEst wird vom AV-Gitter bestimmt, nicht von der Atomzahl. + +### `fret.dyes.0.D` + +**Bezeichnung:** Diffusionskoeffizient des Donors +**Typ:** `number` +**Einheit:** `Ų/ns` + +Diffusionskoeffizient des Donorfarbstoffs in Lösung, ohne Wechselwirkung mit der Proteinoberfläche. + +### `n_bins` + +**Bezeichnung:** Kanäle des Abklingens +**Typ:** `integer` + +Anzahl der Zeitkanäle des ausgegebenen Abklinghistogramms. + +### `n_photons` + +**Bezeichnung:** Simulierte Photonen +**Typ:** `integer` + +Anzahl der simulierten Anregungsphotonen zur Rekonstruktion des Fluoreszenzabklingens. + +### `t_max` + +**Bezeichnung:** Simulationsdauer +**Typ:** `number` +**Einheit:** `ns` + +Gesamtlänge der simulierten Brownschen Trajektorie. + +### `t_step` + +**Bezeichnung:** Zeitschritt +**Typ:** `number` +**Einheit:** `ns` + +Schrittweite für die Berechnung der Brownschen Trajektorie. + +### `tau0` + +**Bezeichnung:** Ungelöschte Lebensdauer +**Typ:** `number` +**Einheit:** `ns` + +Fluoreszenzlebensdauer des Donorfarbstoffs ohne Löschung. + +## Erweitert + +### `output_file` + +**Bezeichnung:** Präfix der Ausgabedateien +**Typ:** `text` + +Namenspräfix für gespeicherte Simulationsergebnisse, Trajektorien und Abklingkurven. + +### `parallel_trajectories` + +**Bezeichnung:** Parallele Trajektorien +**Typ:** `integer` + +Anzahl unabhängiger Brownscher Trajektorien, die gleichzeitig gerechnet und vor der Photonensimulation zusammengeführt werden. −1 nutzt alle CPU-Kerne, höchstens jedoch 8. + +### `random_seed` + +**Bezeichnung:** Zufallsstartwert +**Typ:** `integer` + +Startwert der Monte-Carlo-Simulation. Ist er gesetzt, werden sowohl die Diffusionstrajektorie als auch die Photonenspur initialisiert, sodass wiederholte Läufe desselben Projekts genau dasselbe Abklingen und dieselbe Quantenausbeute liefern. Ohne Startwert läuft die Simulation unabhängig zufällig; die Photonenspur nutzt dann einen schnelleren, mehrfädigen Kern. + +### `save_avs` + +**Bezeichnung:** AV-Dateien speichern +**Typ:** `boolean` + +Legt fest, ob die berechneten Gitter des zugänglichen Volumens als XYZ-Dateien gespeichert werden. + +### `skip_frame` + +**Bezeichnung:** Übersprungene Trajektorienbilder +**Typ:** `integer` + +Unterabtastungsfaktor beim Schreiben von Trajektorienbildern in Koordinatendateien. + +### `slow_radius` + +**Bezeichnung:** Verlangsamungsradius +**Typ:** `number` +**Einheit:** `Å` + +Radius um jedes Aminosäurezentrum des gesamten Proteins, innerhalb dessen dieser Resttyp seinen slow_factor zum Gitter der Diffusionskoeffizienten beiträgt. + +## FRET-Akzeptor + +### `fret.R0_matrix` + +**Bezeichnung:** Förster-Radius +**Typ:** `number` +**Einheit:** `Å` + +Förster-Radius R0 des Donor-Akzeptor-Paares, in Ångström wie jede andere Länge im Projekt. Gespeichert wird die Zelle Donor→Akzeptor von fret.R0_matrix; die Transferrate skaliert mit (R0/r)^6, sodass eine Eingabe in Nanometern FRET verschwinden lässt. Typische Xanthen-Paare liegen bei 45–65 Å. + +### `fret.acceptor_dynamics` + +**Bezeichnung:** Akzeptordynamik +**Typ:** `choice` + +Wie der Akzeptor behandelt wird: „trajectory“ simuliert seine Brownsche Bewegung mit eigenem Diffusionskoeffizienten und eigener Haftung und verwendet den momentanen Donor-Akzeptor-Abstand, „averaged“ mittelt über sein statisches zugängliches Volumen (Grenzfall des schnellen Akzeptors, nur gültig, wenn er dieses Volumen schnell im Vergleich zur Donorlebensdauer durchläuft). Beide unterscheiden sich, weil eine Punktwolke gleichmäßig gewichtet wird, eine Trajektorie hingegen danach, wo sich der Farbstoff tatsächlich aufhält. + +### `fret.dyes.1.D` + +**Bezeichnung:** Diffusionskoeffizient des Akzeptors +**Typ:** `number` +**Einheit:** `Ų/ns` + +Diffusionskoeffizient des FRET-Akzeptorfarbstoffs ohne Wechselwirkung mit der Proteinoberfläche. + +### `fret.dyes.1.amino_acid_interactions` + +**Bezeichnung:** Wechselwirkungen des Akzeptors +**Typ:** `table` + +Tabelle der Wechselwirkungen je Resttyp für den Akzeptor, gleiche Form wie amino_acid_interactions des Donors. Verwendet wird nur slow_factor, denn QuEst berichtet das Abklingen des Donors; die eigene PET-Löschung des Akzeptors würde dessen Helligkeit ändern, nicht die des Donors. Voreinstellung ist die Tabelle des Donors. + +### `fret.dyes.1.attachment.atom` + +**Bezeichnung:** Atom des Akzeptors +**Typ:** `text` + +Atomname, an dem der FRET-Akzeptorfarbstoff gebunden ist. + +### `fret.dyes.1.attachment.chain` + +**Bezeichnung:** Kette des Akzeptors +**Typ:** `text` + +Kettenbezeichner des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist. + +### `fret.dyes.1.attachment.residue` + +**Bezeichnung:** Rest des Akzeptors +**Typ:** `integer` + +Sequenznummer des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist. + +### `fret.dyes.1.av_parameter.linker_length` + +**Bezeichnung:** Linkerlänge des Akzeptors +**Typ:** `number` +**Einheit:** `Å` + +Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des FRET-Akzeptorfarbstoffs. + +### `fret.dyes.1.av_parameter.linker_width` + +**Bezeichnung:** Linkerbreite des Akzeptors +**Typ:** `number` +**Einheit:** `Å` + +Breite des Linkers, der den FRET-Akzeptorfarbstoff hält. + +### `fret.dyes.1.av_parameter.radius1` + +**Bezeichnung:** Radius des Akzeptorfarbstoffs +**Typ:** `number` +**Einheit:** `Å` + +Ausschlussradius, der den FRET-Akzeptorfarbstoff als Kugel beschreibt. + +### `fret.dyes.1.slow_radius` + +**Bezeichnung:** Verlangsamungsradius des Akzeptors +**Typ:** `number` +**Einheit:** `Å` + +Radius um jedes Aminosäurezentrum, innerhalb dessen dieser Rest den Akzeptor verlangsamt. Getrennt vom Donor: Ein Cyanin und ein Rhodamin haften nicht in gleicher Weise an einer Proteinoberfläche. Voreinstellung ist der Wert des Donors. + +### `fret.enabled` + +**Bezeichnung:** FRET aktiviert +**Typ:** `boolean` + +Legt fest, ob ein FRET-Akzeptorfarbstoff simuliert wird, um FRET-Effizienz und Abklingkurven zu berechnen. + +## Löschung + +### `amino_acid_interactions` + +**Bezeichnung:** Aminosäure-Wechselwirkungen +**Typ:** `table` + +Tabelle der Wechselwirkungen je Resttyp. Jeder Eintrag enthält slow_factor (0–1, wie stark der Rest den diffundierenden Farbstoff verlangsamt), kQ (Löschrate in 1/ns bei Kontakt), quench_radius (Kontaktradius in Ångström vom Farbstoffmittelpunkt; null übernimmt critical_distance) und quench_atoms (Atomnamen, deren Schwerpunkt das Löschzentrum bildet). Standardmäßig löschen nur Reste mit redoxaktiver Seitenkette: TRP, TYR, MET, HIS, CYS und PRO. + +### `amino_acid_interactions.kQ` + +**Bezeichnung:** Löschrate kQ +**Typ:** `number` +**Einheit:** `1/ns` + +Rate, mit der dieser Resttyp den Farbstoff bei Kontakt löscht. Beiträge von Resten mit überlappenden Kontaktsphären addieren sich. + +### `amino_acid_interactions.quench_atoms` + +**Bezeichnung:** Atome des Löschzentrums +**Typ:** `list` + +Atomnamen, deren Schwerpunkt das Löschzentrum dieses Rests bildet. Die Voreinstellungen folgen der redoxaktiven Gruppe, die den photoinduzierten Elektronentransfer vermittelt: der Indolring bei TRP, der Phenolring bei TYR, der Imidazolring bei HIS, SD bei MET und SG bei CYS – nicht CB. + +### `amino_acid_interactions.quench_radius` + +**Bezeichnung:** Kontaktradius +**Typ:** `number` +**Einheit:** `Å` + +Abstand vom Farbstoffmittelpunkt zum Löschzentrum dieses Rests, innerhalb dessen Löschung stattfindet. Leer lassen, um die projektweite critical_distance zu übernehmen. + +### `amino_acid_interactions.slow_factor` + +**Bezeichnung:** Verlangsamungsfaktor +**Typ:** `number` + +Faktor zwischen 0 und 1, der den Diffusionskoeffizienten des Farbstoffs in der Nähe dieses Resttyps skaliert und unspezifische Haftung beschreibt. Überlappende Reste multiplizieren ihre Faktoren. + +### `critical_distance` + +**Bezeichnung:** Voreingestellter Kontaktradius +**Typ:** `number` +**Einheit:** `Å` + +Kontaktradius für Resttypen, die keinen eigenen quench_radius festlegen. Er wird vom Farbstoffmittelpunkt bis zum Löschzentrum des Rests gemessen und muss daher größer sein als der Farbstoffradius zuzüglich des Van-der-Waals-Kontakts (typischerweise 7–9 Å bei einem Farbstoff von 3,5 Å). + +## CLI override examples + +- Set donor lifetime and attachment residue: + ```bash + quest simulate -p project.quest.json --set tau0=3.8 --set attachment.residue=55 + ``` +- Sweep linker length and residue: + ```bash + quest simulate -p project.quest.json \ + --grid av_parameter.linker_length=10.0,12.5 \ + --grid attachment.residue=25,30,35 + ``` + +## Validation tips + +- Ensure donor dye has `D` set; otherwise the API raises a `KeyError`. +- Provide a valid `pdb` path (or pass `--pdb`/`pdb_path`). +- When enabling FRET, include two dyes and an `R0_matrix` entry for donor→acceptor. diff --git a/doc/parameters.fr.md b/doc/parameters.fr.md new file mode 100644 index 0000000..c9cc778 --- /dev/null +++ b/doc/parameters.fr.md @@ -0,0 +1,371 @@ +# Référence des paramètres QuEst + +Cette page est générée à partir de `parameter_catalog.json`, `quest/settings/locales/fr.json`. Modifiez-les d'abord pour changer le texte d'aide d'un paramètre — l'interface web, cette page et le formulaire de bureau lisent les mêmes fichiers. + +## Résumé du catalogue + +| Clé | Catégorie | Type | Unité | Description | +| --- | --- | --- | --- | --- | +| `amino_acid_interactions` | Extinction | table | - | Table d'interaction par type de résidu. Chaque entrée contient slow_factor (0–1, mesure du ralentissement du fluorophore par le résidu), kQ (taux d'extinction en 1/ns appliqué au contact), quench_radius (rayon de contact en ångströms depuis le centre du fluorophore ; null hérite de critical_distance) et quench_atoms (noms des atomes dont le barycentre définit le centre d'extinction). Par défaut, seuls les résidus à chaîne latérale rédox-active éteignent la fluorescence : TRP, TYR, MET, HIS, CYS et PRO. | +| `amino_acid_interactions.kQ` | Extinction | number | 1/ns | Taux auquel ce type de résidu éteint le fluorophore tant que les deux sont en contact. Les contributions des résidus dont les sphères de contact se recouvrent s'additionnent. | +| `amino_acid_interactions.quench_atoms` | Extinction | list | - | Noms des atomes dont le barycentre définit le centre d'extinction de ce résidu. Les valeurs par défaut suivent le groupement rédox-actif qui assure le transfert d'électron photo-induit : le cycle indole pour TRP, le cycle phénol pour TYR, le cycle imidazole pour HIS, SD pour MET et SG pour CYS — et non CB. | +| `amino_acid_interactions.quench_radius` | Extinction | number | Å | Distance entre le centre du fluorophore et le centre d'extinction de ce résidu en deçà de laquelle l'extinction se produit. Laisser vide pour hériter du critical_distance du projet. | +| `amino_acid_interactions.slow_factor` | Extinction | number | - | Facteur compris entre 0 et 1 qui met à l'échelle le coefficient de diffusion du fluorophore au voisinage de ce type de résidu, modélisant une adhérence non spécifique. Les résidus qui se recouvrent multiplient leurs facteurs. | +| `attachment.atom` | Site de marquage | text | - | Nom de l'atome (par ex. CB, CA) servant de point d'attache au fluorophore. | +| `attachment.chain` | Site de marquage | text | - | Identifiant de chaîne du résidu sur lequel le fluorophore est attaché. | +| `attachment.residue` | Site de marquage | integer | - | Numéro de séquence du résidu sur lequel le fluorophore est attaché. | +| `av_parameter.linker_length` | Volume accessible | number | Å | Distance maximale entre le point d'attache et le centre du fluorophore. | +| `av_parameter.linker_width` | Volume accessible | number | Å | Largeur du bras espaceur qui retient le fluorophore. | +| `av_parameter.radius1` | Volume accessible | number | Å | Rayon d'exclusion représentant le fluorophore comme une sphère (approximation à une sphère). | +| `coarse_grained` | Simulation | boolean | - | Réduit la structure au squelette et aux CB avant la simulation, chaque CB étant déplacé au centre de masse de sa chaîne latérale. Les atomes de chaîne latérale sont alors absents : le centre d'extinction de chaque résidu se rabat sur ce pseudo-atome CB, et le volume accessible augmente puisque les chaînes latérales ne l'obstruent plus. C'est un choix de modélisation, non une optimisation : le coût de QuEst tient à la grille du volume accessible, pas au nombre d'atomes. | +| `critical_distance` | Extinction | number | Å | Rayon de contact employé par les types de résidus qui ne définissent pas leur propre quench_radius. Il se mesure du centre du fluorophore au centre d'extinction du résidu et doit donc dépasser le rayon du fluorophore augmenté du contact de van der Waals (typiquement 7 à 9 Å pour un fluorophore de 3,5 Å). | +| `dg` | Volume accessible | number | Å | Résolution de la grille utilisée pour calculer le volume accessible (AV) et l'espace de diffusion. | +| `fret.R0_matrix` | Accepteur FRET | number | Å | Rayon de Förster R0 du couple donneur–accepteur, en ångströms comme toute autre longueur du projet. Il est stocké dans la case donneur→accepteur de fret.R0_matrix ; le taux de transfert varie en (R0/r)^6, si bien qu'une saisie en nanomètres fait disparaître le FRET. Les couples xanthènes usuels se situent entre 45 et 65 Å. | +| `fret.acceptor_dynamics` | Accepteur FRET | choice | - | Traitement de l'accepteur : « trajectory » simule sa marche brownienne avec son propre coefficient de diffusion et sa propre adhérence, et utilise la distance donneur-accepteur instantanée ; « averaged » moyenne sur son volume accessible statique (limite de l'accepteur rapide, valable seulement s'il parcourt ce volume rapidement devant la durée de vie du donneur). Les deux diffèrent parce qu'un nuage est pondéré uniformément alors qu'une trajectoire l'est par les endroits où le fluorophore séjourne. | +| `fret.dyes.0.D` | Simulation | number | Ų/ns | Coefficient de diffusion du donneur en solution, hors interaction avec la surface de la protéine. | +| `fret.dyes.1.D` | Accepteur FRET | number | Ų/ns | Coefficient de diffusion de l'accepteur FRET hors interaction avec la surface de la protéine. | +| `fret.dyes.1.amino_acid_interactions` | Accepteur FRET | table | - | Table d'interaction par type de résidu pour l'accepteur, de même forme que l'amino_acid_interactions du donneur. Seul slow_factor est utilisé, car QuEst rapporte le déclin du donneur : l'extinction PET propre à l'accepteur modifierait sa brillance, pas celle du donneur. Par défaut, la table du donneur. | +| `fret.dyes.1.attachment.atom` | Accepteur FRET | text | - | Nom de l'atome sur lequel l'accepteur FRET est attaché. | +| `fret.dyes.1.attachment.chain` | Accepteur FRET | text | - | Identifiant de chaîne du résidu sur lequel l'accepteur FRET est attaché. | +| `fret.dyes.1.attachment.residue` | Accepteur FRET | integer | - | Numéro de séquence du résidu sur lequel l'accepteur FRET est attaché. | +| `fret.dyes.1.av_parameter.linker_length` | Accepteur FRET | number | Å | Distance maximale entre le point d'attache et le centre de l'accepteur FRET. | +| `fret.dyes.1.av_parameter.linker_width` | Accepteur FRET | number | Å | Largeur du bras espaceur qui retient l'accepteur FRET. | +| `fret.dyes.1.av_parameter.radius1` | Accepteur FRET | number | Å | Rayon d'exclusion représentant l'accepteur FRET comme une sphère. | +| `fret.dyes.1.slow_radius` | Accepteur FRET | number | Å | Rayon autour de chaque centre d'acide aminé à l'intérieur duquel ce résidu ralentit l'accepteur. Distinct de celui du donneur : une cyanine et une rhodamine n'adhèrent pas de la même façon à une surface protéique. Par défaut, la valeur du donneur. | +| `fret.enabled` | Accepteur FRET | boolean | - | Indique si un accepteur FRET est simulé afin de calculer l'efficacité de FRET et les courbes de déclin. | +| `n_bins` | Simulation | integer | - | Nombre de canaux temporels de l'histogramme de déclin produit. | +| `n_photons` | Simulation | integer | - | Nombre de photons d'excitation simulés pour reconstruire l'histogramme de déclin de fluorescence. | +| `output_file` | Avancé | text | - | Préfixe de nom employé pour enregistrer les résultats, les trajectoires et les déclins. | +| `parallel_trajectories` | Avancé | integer | - | Nombre de trajectoires browniennes indépendantes calculées simultanément et réunies avant l'échantillonnage des photons. −1 utilise tous les cœurs du processeur, dans la limite de 8. | +| `pdb` | Structure | file | - | Chemin du fichier de structure (PDB/CIF), ou identifiant RCSB PDB à quatre caractères, utilisé pour le calcul du volume accessible. | +| `random_seed` | Avancé | integer | - | Graine de la simulation Monte-Carlo. Lorsqu'elle est fixée, la trajectoire de diffusion et le tirage des photons sont tous deux initialisés : deux exécutions du même projet reproduisent exactement le même déclin et le même rendement quantique. Sans graine, chaque exécution est indépendante et le tirage des photons emploie un noyau multithread plus rapide. | +| `save_avs` | Avancé | boolean | - | Indique si les grilles de volume accessible calculées sont enregistrées au format XYZ. | +| `skip_frame` | Avancé | integer | - | Facteur de sous-échantillonnage lors de l'écriture des images de trajectoire dans les fichiers de coordonnées. | +| `slow_radius` | Avancé | number | Å | Rayon autour de chaque centre d'acide aminé de la protéine entière à l'intérieur duquel ce type de résidu applique son slow_factor à la grille des coefficients de diffusion. | +| `t_max` | Simulation | number | ns | Durée totale de la trajectoire de dynamique brownienne simulée. | +| `t_step` | Simulation | number | ns | Pas de temps du calcul de la trajectoire de dynamique brownienne. | +| `tau0` | Simulation | number | ns | Durée de vie de fluorescence du donneur en l'absence d'extinction. | + +## Structure + +### `pdb` + +**Libellé:** Fichier de structure +**Type:** `file` + +Chemin du fichier de structure (PDB/CIF), ou identifiant RCSB PDB à quatre caractères, utilisé pour le calcul du volume accessible. + +## Site de marquage + +### `attachment.atom` + +**Libellé:** Atome d'attache +**Type:** `text` + +Nom de l'atome (par ex. CB, CA) servant de point d'attache au fluorophore. + +### `attachment.chain` + +**Libellé:** Chaîne d'attache +**Type:** `text` + +Identifiant de chaîne du résidu sur lequel le fluorophore est attaché. + +### `attachment.residue` + +**Libellé:** Résidu d'attache +**Type:** `integer` + +Numéro de séquence du résidu sur lequel le fluorophore est attaché. + +## Volume accessible + +### `av_parameter.linker_length` + +**Libellé:** Longueur du bras espaceur +**Type:** `number` +**Unité:** `Å` + +Distance maximale entre le point d'attache et le centre du fluorophore. + +### `av_parameter.linker_width` + +**Libellé:** Largeur du bras espaceur +**Type:** `number` +**Unité:** `Å` + +Largeur du bras espaceur qui retient le fluorophore. + +### `av_parameter.radius1` + +**Libellé:** Rayon du fluorophore +**Type:** `number` +**Unité:** `Å` + +Rayon d'exclusion représentant le fluorophore comme une sphère (approximation à une sphère). + +### `dg` + +**Libellé:** Résolution de la grille +**Type:** `number` +**Unité:** `Å` + +Résolution de la grille utilisée pour calculer le volume accessible (AV) et l'espace de diffusion. + +## Simulation + +### `coarse_grained` + +**Libellé:** Structure gros grains +**Type:** `boolean` + +Réduit la structure au squelette et aux CB avant la simulation, chaque CB étant déplacé au centre de masse de sa chaîne latérale. Les atomes de chaîne latérale sont alors absents : le centre d'extinction de chaque résidu se rabat sur ce pseudo-atome CB, et le volume accessible augmente puisque les chaînes latérales ne l'obstruent plus. C'est un choix de modélisation, non une optimisation : le coût de QuEst tient à la grille du volume accessible, pas au nombre d'atomes. + +### `fret.dyes.0.D` + +**Libellé:** Coefficient de diffusion du donneur +**Type:** `number` +**Unité:** `Ų/ns` + +Coefficient de diffusion du donneur en solution, hors interaction avec la surface de la protéine. + +### `n_bins` + +**Libellé:** Canaux du déclin +**Type:** `integer` + +Nombre de canaux temporels de l'histogramme de déclin produit. + +### `n_photons` + +**Libellé:** Photons simulés +**Type:** `integer` + +Nombre de photons d'excitation simulés pour reconstruire l'histogramme de déclin de fluorescence. + +### `t_max` + +**Libellé:** Durée de simulation +**Type:** `number` +**Unité:** `ns` + +Durée totale de la trajectoire de dynamique brownienne simulée. + +### `t_step` + +**Libellé:** Pas de temps +**Type:** `number` +**Unité:** `ns` + +Pas de temps du calcul de la trajectoire de dynamique brownienne. + +### `tau0` + +**Libellé:** Durée de vie non éteinte +**Type:** `number` +**Unité:** `ns` + +Durée de vie de fluorescence du donneur en l'absence d'extinction. + +## Avancé + +### `output_file` + +**Libellé:** Préfixe des fichiers de sortie +**Type:** `text` + +Préfixe de nom employé pour enregistrer les résultats, les trajectoires et les déclins. + +### `parallel_trajectories` + +**Libellé:** Trajectoires parallèles +**Type:** `integer` + +Nombre de trajectoires browniennes indépendantes calculées simultanément et réunies avant l'échantillonnage des photons. −1 utilise tous les cœurs du processeur, dans la limite de 8. + +### `random_seed` + +**Libellé:** Graine aléatoire +**Type:** `integer` + +Graine de la simulation Monte-Carlo. Lorsqu'elle est fixée, la trajectoire de diffusion et le tirage des photons sont tous deux initialisés : deux exécutions du même projet reproduisent exactement le même déclin et le même rendement quantique. Sans graine, chaque exécution est indépendante et le tirage des photons emploie un noyau multithread plus rapide. + +### `save_avs` + +**Libellé:** Enregistrer les fichiers AV +**Type:** `boolean` + +Indique si les grilles de volume accessible calculées sont enregistrées au format XYZ. + +### `skip_frame` + +**Libellé:** Images de trajectoire ignorées +**Type:** `integer` + +Facteur de sous-échantillonnage lors de l'écriture des images de trajectoire dans les fichiers de coordonnées. + +### `slow_radius` + +**Libellé:** Rayon de ralentissement +**Type:** `number` +**Unité:** `Å` + +Rayon autour de chaque centre d'acide aminé de la protéine entière à l'intérieur duquel ce type de résidu applique son slow_factor à la grille des coefficients de diffusion. + +## Accepteur FRET + +### `fret.R0_matrix` + +**Libellé:** Rayon de Förster +**Type:** `number` +**Unité:** `Å` + +Rayon de Förster R0 du couple donneur–accepteur, en ångströms comme toute autre longueur du projet. Il est stocké dans la case donneur→accepteur de fret.R0_matrix ; le taux de transfert varie en (R0/r)^6, si bien qu'une saisie en nanomètres fait disparaître le FRET. Les couples xanthènes usuels se situent entre 45 et 65 Å. + +### `fret.acceptor_dynamics` + +**Libellé:** Dynamique de l'accepteur +**Type:** `choice` + +Traitement de l'accepteur : « trajectory » simule sa marche brownienne avec son propre coefficient de diffusion et sa propre adhérence, et utilise la distance donneur-accepteur instantanée ; « averaged » moyenne sur son volume accessible statique (limite de l'accepteur rapide, valable seulement s'il parcourt ce volume rapidement devant la durée de vie du donneur). Les deux diffèrent parce qu'un nuage est pondéré uniformément alors qu'une trajectoire l'est par les endroits où le fluorophore séjourne. + +### `fret.dyes.1.D` + +**Libellé:** Coefficient de diffusion de l'accepteur +**Type:** `number` +**Unité:** `Ų/ns` + +Coefficient de diffusion de l'accepteur FRET hors interaction avec la surface de la protéine. + +### `fret.dyes.1.amino_acid_interactions` + +**Libellé:** Interactions de l'accepteur +**Type:** `table` + +Table d'interaction par type de résidu pour l'accepteur, de même forme que l'amino_acid_interactions du donneur. Seul slow_factor est utilisé, car QuEst rapporte le déclin du donneur : l'extinction PET propre à l'accepteur modifierait sa brillance, pas celle du donneur. Par défaut, la table du donneur. + +### `fret.dyes.1.attachment.atom` + +**Libellé:** Atome de l'accepteur +**Type:** `text` + +Nom de l'atome sur lequel l'accepteur FRET est attaché. + +### `fret.dyes.1.attachment.chain` + +**Libellé:** Chaîne de l'accepteur +**Type:** `text` + +Identifiant de chaîne du résidu sur lequel l'accepteur FRET est attaché. + +### `fret.dyes.1.attachment.residue` + +**Libellé:** Résidu de l'accepteur +**Type:** `integer` + +Numéro de séquence du résidu sur lequel l'accepteur FRET est attaché. + +### `fret.dyes.1.av_parameter.linker_length` + +**Libellé:** Longueur du bras de l'accepteur +**Type:** `number` +**Unité:** `Å` + +Distance maximale entre le point d'attache et le centre de l'accepteur FRET. + +### `fret.dyes.1.av_parameter.linker_width` + +**Libellé:** Largeur du bras de l'accepteur +**Type:** `number` +**Unité:** `Å` + +Largeur du bras espaceur qui retient l'accepteur FRET. + +### `fret.dyes.1.av_parameter.radius1` + +**Libellé:** Rayon de l'accepteur +**Type:** `number` +**Unité:** `Å` + +Rayon d'exclusion représentant l'accepteur FRET comme une sphère. + +### `fret.dyes.1.slow_radius` + +**Libellé:** Rayon de ralentissement de l'accepteur +**Type:** `number` +**Unité:** `Å` + +Rayon autour de chaque centre d'acide aminé à l'intérieur duquel ce résidu ralentit l'accepteur. Distinct de celui du donneur : une cyanine et une rhodamine n'adhèrent pas de la même façon à une surface protéique. Par défaut, la valeur du donneur. + +### `fret.enabled` + +**Libellé:** FRET activé +**Type:** `boolean` + +Indique si un accepteur FRET est simulé afin de calculer l'efficacité de FRET et les courbes de déclin. + +## Extinction + +### `amino_acid_interactions` + +**Libellé:** Interactions avec les acides aminés +**Type:** `table` + +Table d'interaction par type de résidu. Chaque entrée contient slow_factor (0–1, mesure du ralentissement du fluorophore par le résidu), kQ (taux d'extinction en 1/ns appliqué au contact), quench_radius (rayon de contact en ångströms depuis le centre du fluorophore ; null hérite de critical_distance) et quench_atoms (noms des atomes dont le barycentre définit le centre d'extinction). Par défaut, seuls les résidus à chaîne latérale rédox-active éteignent la fluorescence : TRP, TYR, MET, HIS, CYS et PRO. + +### `amino_acid_interactions.kQ` + +**Libellé:** Taux d'extinction kQ +**Type:** `number` +**Unité:** `1/ns` + +Taux auquel ce type de résidu éteint le fluorophore tant que les deux sont en contact. Les contributions des résidus dont les sphères de contact se recouvrent s'additionnent. + +### `amino_acid_interactions.quench_atoms` + +**Libellé:** Atomes du centre d'extinction +**Type:** `list` + +Noms des atomes dont le barycentre définit le centre d'extinction de ce résidu. Les valeurs par défaut suivent le groupement rédox-actif qui assure le transfert d'électron photo-induit : le cycle indole pour TRP, le cycle phénol pour TYR, le cycle imidazole pour HIS, SD pour MET et SG pour CYS — et non CB. + +### `amino_acid_interactions.quench_radius` + +**Libellé:** Rayon de contact +**Type:** `number` +**Unité:** `Å` + +Distance entre le centre du fluorophore et le centre d'extinction de ce résidu en deçà de laquelle l'extinction se produit. Laisser vide pour hériter du critical_distance du projet. + +### `amino_acid_interactions.slow_factor` + +**Libellé:** Facteur de ralentissement +**Type:** `number` + +Facteur compris entre 0 et 1 qui met à l'échelle le coefficient de diffusion du fluorophore au voisinage de ce type de résidu, modélisant une adhérence non spécifique. Les résidus qui se recouvrent multiplient leurs facteurs. + +### `critical_distance` + +**Libellé:** Rayon de contact par défaut +**Type:** `number` +**Unité:** `Å` + +Rayon de contact employé par les types de résidus qui ne définissent pas leur propre quench_radius. Il se mesure du centre du fluorophore au centre d'extinction du résidu et doit donc dépasser le rayon du fluorophore augmenté du contact de van der Waals (typiquement 7 à 9 Å pour un fluorophore de 3,5 Å). + +## CLI override examples + +- Set donor lifetime and attachment residue: + ```bash + quest simulate -p project.quest.json --set tau0=3.8 --set attachment.residue=55 + ``` +- Sweep linker length and residue: + ```bash + quest simulate -p project.quest.json \ + --grid av_parameter.linker_length=10.0,12.5 \ + --grid attachment.residue=25,30,35 + ``` + +## Validation tips + +- Ensure donor dye has `D` set; otherwise the API raises a `KeyError`. +- Provide a valid `pdb` path (or pass `--pdb`/`pdb_path`). +- When enabling FRET, include two dyes and an `R0_matrix` entry for donor→acceptor. diff --git a/doc/parameters.md b/doc/parameters.md index a51f490..c9e4138 100644 --- a/doc/parameters.md +++ b/doc/parameters.md @@ -1,108 +1,355 @@ # QuEst parameters reference -This page summarizes the project JSON keys and their meaning. The same fields are surfaced in the GUI, CLI overrides (`--set key=value`, `--grid key=...`) and the Python API. - -## Project-level fields - -| Key | Description | -| --- | --- | -| `pdb` | Path to the structure file used for AV calculation. | -| `tau0` | Fluorescence lifetime in the absence of quenching (ns). | -| `kQ` | Default quenching rate constant (1/ns) applied to quencher residues. | -| `n_photons` | Number of simulated photons. | -| `dg` | Grid resolution for dye diffusion. | -| `slow_fact` | Factor by which the dye diffusion slows near the surface. | -| `critical_distance` | Distance threshold for counting collisions/quenching. | -| `slow_radius` | Interaction radius (Å) within which the dye experiences slowed diffusion. | -| `sticky_mode` | `"surface"` to slow near all surface atoms, `"quencher"` to slow only near quencher residues. | -| `save_avs` | Whether to persist accessible volume grids. | -| `output_file` | Base name for saved outputs. | -| `n_bins` | Histogram bin count for decay outputs (CLI/API default: 4096 if omitted). | - -## Attachment block - -```json -"attachment": { - "chain": "A", - "residue": 42, - "atom": "CA" -} -``` - -Defines where the donor dye is tethered. +This page is generated from `parameter_catalog.json`. Update those first when changing parameter help text — the web UI, this page and the desktop form all read them. + +## Catalog summary + +| Key | Category | Type | Unit | Description | +| --- | --- | --- | --- | --- | +| `amino_acid_interactions` | Quenching | table | - | Per-residue-type interaction table. Each entry holds slow_factor (0-1, how much the residue slows the diffusing dye), kQ (quenching rate in 1/ns applied on contact), quench_radius (contact radius in Angstrom from the dye centre; null inherits critical_distance) and quench_atoms (atom names whose centroid defines the quenching centre). Only residues with a redox-active side chain quench by default: TRP, TYR, MET, HIS, CYS and PRO. | +| `amino_acid_interactions.kQ` | Quenching | number | 1/ns | Rate at which this residue type quenches the dye while the two are in contact. Contributions from residues whose contact spheres overlap add up. | +| `amino_acid_interactions.quench_atoms` | Quenching | list | - | Atom names whose centroid defines this residue's quenching centre. The defaults follow the redox-active moiety that mediates photo-induced electron transfer: the indole ring for TRP, the phenol ring for TYR, the imidazole ring for HIS, SD for MET and SG for CYS - not CB. | +| `amino_acid_interactions.quench_radius` | Quenching | number | Å | Distance from the dye centre to this residue's quenching centre within which quenching occurs. Leave empty to inherit the project-wide critical_distance. | +| `amino_acid_interactions.slow_factor` | Quenching | number | - | Factor between 0 and 1 scaling the dye's diffusion coefficient near this residue type, modelling unspecific stickiness. Overlapping residues multiply their factors. | +| `attachment.atom` | Labeling site | text | - | Atom name (e.g., CB, CA) used as the tethering point for the dye. | +| `attachment.chain` | Labeling site | text | - | Chain identifier of the amino acid residue where the dye is tethered. | +| `attachment.residue` | Labeling site | integer | - | Residue sequence number of the amino acid where the dye is tethered. | +| `av_parameter.linker_length` | Accessible volume | number | Å | Maximum distance from attachment point to the center of the dye. | +| `av_parameter.linker_width` | Accessible volume | number | Å | Width of the linker tethering the dye. | +| `av_parameter.radius1` | Accessible volume | number | Å | Exclusion radius representing the dye sphere (single-sphere approximation). | +| `coarse_grained` | Simulation | boolean | - | Reduce the structure to backbone plus CB before simulating, with CB moved to the side-chain centre of mass. Side-chain atoms are then absent, so every residue's quenching centre falls back to that CB pseudo-atom, and the accessible volume grows because side chains no longer block it. This is a modelling choice, not a speed optimisation: QuEst's cost is dominated by the AV grid rather than the atom count. | +| `critical_distance` | Quenching | number | Å | Contact radius used by residue types that do not define their own quench_radius. It is measured from the dye centre to the residue's quenching centre, so it must exceed the dye radius plus van der Waals contact (typically 7-9 A for a 3.5 A dye). | +| `dg` | Accessible volume | number | Å | Grid resolution used to compute the accessible volume (AV) and diffusion search space. | +| `fret.R0_matrix` | FRET Acceptor | number | Å | Förster radius R0 of the donor–acceptor pair, in Ångström like every other length in a project. Stored as the donor→acceptor cell of fret.R0_matrix; the transfer rate scales as (R0/r)^6, so entering nanometres makes FRET vanish. Typical xanthene pairs are 45–65 Å. | +| `fret.acceptor_dynamics` | FRET Acceptor | choice | - | How the acceptor is treated: 'trajectory' simulates its Brownian walk with its own diffusion coefficient and stickiness and uses the instantaneous donor-acceptor distance, 'averaged' averages over its static accessible volume (the fast-acceptor limit, valid only when it explores that volume quickly compared with the donor lifetime). The two disagree because a cloud is weighted uniformly while a trajectory is weighted by where the dye dwells. | +| `fret.dyes.0.D` | Simulation | number | Ų/ns | Diffusion coefficient of the donor dye in solution, when not interacting with the protein surface. | +| `fret.dyes.1.D` | FRET Acceptor | number | Ų/ns | Diffusion coefficient of the FRET acceptor dye when not interacting with the protein surface. | +| `fret.dyes.1.amino_acid_interactions` | FRET Acceptor | table | - | Per-residue-type interaction table for the acceptor, same shape as the donor's amino_acid_interactions. Only slow_factor is used, since QuEst reports the donor's decay and the acceptor's own PET quenching would change how bright the acceptor is, not the donor. Defaults to the donor's table. | +| `fret.dyes.1.attachment.atom` | FRET Acceptor | text | - | Atom name where the FRET acceptor dye is attached. | +| `fret.dyes.1.attachment.chain` | FRET Acceptor | text | - | Chain identifier of the residue where the FRET acceptor dye is attached. | +| `fret.dyes.1.attachment.residue` | FRET Acceptor | integer | - | Residue sequence number where the FRET acceptor dye is attached. | +| `fret.dyes.1.av_parameter.linker_length` | FRET Acceptor | number | Å | Maximum distance from attachment point to the center of the FRET acceptor dye. | +| `fret.dyes.1.av_parameter.linker_width` | FRET Acceptor | number | Å | Width of the linker tethering the FRET acceptor dye. | +| `fret.dyes.1.av_parameter.radius1` | FRET Acceptor | number | Å | Exclusion radius representing the FRET acceptor dye sphere. | +| `fret.dyes.1.slow_radius` | FRET Acceptor | number | Å | Radius around each amino-acid centre within which that residue slows the acceptor. Separate from the donor's: a cyanine and a rhodamine do not adhere to a protein surface in the same way. Defaults to the donor's value. | +| `fret.enabled` | FRET Acceptor | boolean | - | Whether a FRET acceptor dye is simulated to compute FRET efficiency and decay curves. | +| `n_bins` | Simulation | integer | - | Number of time channels/bins used to construct the output decay histogram. | +| `n_photons` | Simulation | integer | - | Number of excitation photons simulated to reconstruct the fluorescence decay histogram. | +| `output_file` | Advanced | text | - | Base filename prefix used when saving simulation outputs, trajectories, and decays. | +| `parallel_trajectories` | Advanced | integer | - | Number of independent Brownian dynamics trajectories run concurrently and combined before photon sampling. Use -1 to use all CPU cores, capped at 8. | +| `pdb` | Structure | file | - | Path to the structure file (PDB/CIF), or a bare four-character RCSB PDB ID used for AV calculation. | +| `random_seed` | Advanced | integer | - | Seed for the Monte-Carlo simulation. When set, both the diffusion trajectory and the photon trace are seeded, so repeated runs of the same project reproduce the same decay and quantum yield exactly. Leave unset for an independent random run; the photon trace then uses a faster multi-threaded kernel. | +| `save_avs` | Advanced | boolean | - | Whether to save the calculated accessible volume grids as XYZ files. | +| `skip_frame` | Advanced | integer | - | Subsampling factor for writing trajectory frames to coordinates files. | +| `slow_radius` | Advanced | number | Å | Radius around each whole-protein amino-acid center where that residue type contributes its slow_factor to the diffusion coefficient grid. | +| `t_max` | Simulation | number | ns | Total length of the simulated Brownian dynamics trajectory. | +| `t_step` | Simulation | number | ns | Time step size for the Brownian dynamics trajectory calculation. | +| `tau0` | Simulation | number | ns | Fluorescence lifetime of the donor dye in the absence of quenching. | + +## Structure + +### `pdb` + +**Label:** Structure file +**Type:** `file` + +Path to the structure file (PDB/CIF), or a bare four-character RCSB PDB ID used for AV calculation. + +## Labeling site + +### `attachment.atom` + +**Label:** Attachment atom +**Type:** `text` + +Atom name (e.g., CB, CA) used as the tethering point for the dye. + +### `attachment.chain` + +**Label:** Attachment chain +**Type:** `text` + +Chain identifier of the amino acid residue where the dye is tethered. + +### `attachment.residue` + +**Label:** Attachment residue +**Type:** `integer` + +Residue sequence number of the amino acid where the dye is tethered. ## Accessible volume -```json -"av_parameter": { - "linker_length": 20.0, - "linker_width": 0.5, - "radius1": 5.0 -} -``` - -- `linker_length`: Maximum distance from attachment point to dye center. -- `linker_width`: Width of the linker. -- `radius1`: Dye radius (single-sphere approximation). - -## Dye block (FRET dyes list) - -Located under `fret.dyes`. The first entry is the donor; the second (optional) is the acceptor. - -| Key | Description | -| --- | --- | -| `D` | Diffusion coefficient of the dye when not interacting with the surface (Ų/ns). **Required for donor.** | -| `attachment` | Same structure as the top-level `attachment` (chain/residue/atom). | -| `av_parameter` | Optional AV parameters for acceptor (when FRET). | - -## Quencher block - -```json -"quencher": { - "TRP": ["CB"], - "TYR": ["CB"], - "HIS": ["CB"] -} -``` - -- Keys are quenching residue names (3-letter codes). -- Values list atom names that act as quenchers. -- `kQ` at the project root sets the rate constant applied when within `critical_distance`. -- `all_quencher_atoms` (bool, default `true`): use all atoms of quencher residues if `true`, otherwise only the listed atoms. - -## FRET block (optional) - -```json -"fret": { - "enabled": true, - "dyes": [... donor, acceptor ...], - "R0_matrix": [[null, 52.0], [52.0, null]] -} -``` - -- `enabled`: turn FRET on/off. -- `dyes`: list of dye entries (donor first). Provide acceptor when FRET is enabled. -- `R0_matrix`: Förster distances (nm); donor→acceptor entry is used (row 0, col 1). - -## Simulation controls - -| Key | Description | -| --- | --- | -| `t_max` | Total simulation time (µs). | -| `t_step` | Time step (ps) for Brownian dynamics. | -| `frames` | Derived: total number of frames (from `t_max` and `t_step`). | -| `n_photons` | Number of photons generated. | -| `show_av` | Show full AV in 3D illustration (GUI). | - -## Results fields (outputs) - -| Field | Meaning | -| --- | --- | -| `QY(F)` | Simulated fluorescence quantum yield of the bright species. | -| `collisions_fraction` | Fraction of frames where dye is within quench radius. | -| `nBins` / `n_bins` | Bin count used for decay histogram. | -| `range` | Time axis range for decay histogram (tac_range in API/CLI). | -| `skip` | GUI-only: subsampling factor for 3D illustration frames. | +### `av_parameter.linker_length` + +**Label:** Linker length +**Type:** `number` +**Unit:** `Å` + +Maximum distance from attachment point to the center of the dye. + +### `av_parameter.linker_width` + +**Label:** Linker width +**Type:** `number` +**Unit:** `Å` + +Width of the linker tethering the dye. + +### `av_parameter.radius1` + +**Label:** Dye radius +**Type:** `number` +**Unit:** `Å` + +Exclusion radius representing the dye sphere (single-sphere approximation). + +### `dg` + +**Label:** Grid resolution +**Type:** `number` +**Unit:** `Å` + +Grid resolution used to compute the accessible volume (AV) and diffusion search space. + +## Simulation + +### `coarse_grained` + +**Label:** Coarse-grained structure +**Type:** `boolean` + +Reduce the structure to backbone plus CB before simulating, with CB moved to the side-chain centre of mass. Side-chain atoms are then absent, so every residue's quenching centre falls back to that CB pseudo-atom, and the accessible volume grows because side chains no longer block it. This is a modelling choice, not a speed optimisation: QuEst's cost is dominated by the AV grid rather than the atom count. + +### `fret.dyes.0.D` + +**Label:** Donor diffusion coefficient +**Type:** `number` +**Unit:** `Ų/ns` + +Diffusion coefficient of the donor dye in solution, when not interacting with the protein surface. + +### `n_bins` + +**Label:** Decay bins +**Type:** `integer` + +Number of time channels/bins used to construct the output decay histogram. + +### `n_photons` + +**Label:** Simulated photons +**Type:** `integer` + +Number of excitation photons simulated to reconstruct the fluorescence decay histogram. + +### `t_max` + +**Label:** Simulation time +**Type:** `number` +**Unit:** `ns` + +Total length of the simulated Brownian dynamics trajectory. + +### `t_step` + +**Label:** Time step +**Type:** `number` +**Unit:** `ns` + +Time step size for the Brownian dynamics trajectory calculation. + +### `tau0` + +**Label:** Unquenched lifetime +**Type:** `number` +**Unit:** `ns` + +Fluorescence lifetime of the donor dye in the absence of quenching. + +## Advanced + +### `output_file` + +**Label:** Output file prefix +**Type:** `text` + +Base filename prefix used when saving simulation outputs, trajectories, and decays. + +### `parallel_trajectories` + +**Label:** Parallel trajectories +**Type:** `integer` + +Number of independent Brownian dynamics trajectories run concurrently and combined before photon sampling. Use -1 to use all CPU cores, capped at 8. + +### `random_seed` + +**Label:** Random seed +**Type:** `integer` + +Seed for the Monte-Carlo simulation. When set, both the diffusion trajectory and the photon trace are seeded, so repeated runs of the same project reproduce the same decay and quantum yield exactly. Leave unset for an independent random run; the photon trace then uses a faster multi-threaded kernel. + +### `save_avs` + +**Label:** Save AV files +**Type:** `boolean` + +Whether to save the calculated accessible volume grids as XYZ files. + +### `skip_frame` + +**Label:** Trajectory skip frames +**Type:** `integer` + +Subsampling factor for writing trajectory frames to coordinates files. + +### `slow_radius` + +**Label:** Slowing radius +**Type:** `number` +**Unit:** `Å` + +Radius around each whole-protein amino-acid center where that residue type contributes its slow_factor to the diffusion coefficient grid. + +## FRET Acceptor + +### `fret.R0_matrix` + +**Label:** Förster radius +**Type:** `number` +**Unit:** `Å` + +Förster radius R0 of the donor–acceptor pair, in Ångström like every other length in a project. Stored as the donor→acceptor cell of fret.R0_matrix; the transfer rate scales as (R0/r)^6, so entering nanometres makes FRET vanish. Typical xanthene pairs are 45–65 Å. + +### `fret.acceptor_dynamics` + +**Label:** Acceptor dynamics +**Type:** `choice` + +How the acceptor is treated: 'trajectory' simulates its Brownian walk with its own diffusion coefficient and stickiness and uses the instantaneous donor-acceptor distance, 'averaged' averages over its static accessible volume (the fast-acceptor limit, valid only when it explores that volume quickly compared with the donor lifetime). The two disagree because a cloud is weighted uniformly while a trajectory is weighted by where the dye dwells. + +### `fret.dyes.1.D` + +**Label:** Acceptor diffusion coefficient +**Type:** `number` +**Unit:** `Ų/ns` + +Diffusion coefficient of the FRET acceptor dye when not interacting with the protein surface. + +### `fret.dyes.1.amino_acid_interactions` + +**Label:** Acceptor interactions +**Type:** `table` + +Per-residue-type interaction table for the acceptor, same shape as the donor's amino_acid_interactions. Only slow_factor is used, since QuEst reports the donor's decay and the acceptor's own PET quenching would change how bright the acceptor is, not the donor. Defaults to the donor's table. + +### `fret.dyes.1.attachment.atom` + +**Label:** Acceptor atom +**Type:** `text` + +Atom name where the FRET acceptor dye is attached. + +### `fret.dyes.1.attachment.chain` + +**Label:** Acceptor chain +**Type:** `text` + +Chain identifier of the residue where the FRET acceptor dye is attached. + +### `fret.dyes.1.attachment.residue` + +**Label:** Acceptor residue +**Type:** `integer` + +Residue sequence number where the FRET acceptor dye is attached. + +### `fret.dyes.1.av_parameter.linker_length` + +**Label:** Acceptor linker length +**Type:** `number` +**Unit:** `Å` + +Maximum distance from attachment point to the center of the FRET acceptor dye. + +### `fret.dyes.1.av_parameter.linker_width` + +**Label:** Acceptor linker width +**Type:** `number` +**Unit:** `Å` + +Width of the linker tethering the FRET acceptor dye. + +### `fret.dyes.1.av_parameter.radius1` + +**Label:** Acceptor dye radius +**Type:** `number` +**Unit:** `Å` + +Exclusion radius representing the FRET acceptor dye sphere. + +### `fret.dyes.1.slow_radius` + +**Label:** Acceptor slowing radius +**Type:** `number` +**Unit:** `Å` + +Radius around each amino-acid centre within which that residue slows the acceptor. Separate from the donor's: a cyanine and a rhodamine do not adhere to a protein surface in the same way. Defaults to the donor's value. + +### `fret.enabled` + +**Label:** FRET enabled +**Type:** `boolean` + +Whether a FRET acceptor dye is simulated to compute FRET efficiency and decay curves. + +## Quenching + +### `amino_acid_interactions` + +**Label:** Amino-acid interactions +**Type:** `table` + +Per-residue-type interaction table. Each entry holds slow_factor (0-1, how much the residue slows the diffusing dye), kQ (quenching rate in 1/ns applied on contact), quench_radius (contact radius in Angstrom from the dye centre; null inherits critical_distance) and quench_atoms (atom names whose centroid defines the quenching centre). Only residues with a redox-active side chain quench by default: TRP, TYR, MET, HIS, CYS and PRO. + +### `amino_acid_interactions.kQ` + +**Label:** Quenching rate kQ +**Type:** `number` +**Unit:** `1/ns` + +Rate at which this residue type quenches the dye while the two are in contact. Contributions from residues whose contact spheres overlap add up. + +### `amino_acid_interactions.quench_atoms` + +**Label:** Quenching centre atoms +**Type:** `list` + +Atom names whose centroid defines this residue's quenching centre. The defaults follow the redox-active moiety that mediates photo-induced electron transfer: the indole ring for TRP, the phenol ring for TYR, the imidazole ring for HIS, SD for MET and SG for CYS - not CB. + +### `amino_acid_interactions.quench_radius` + +**Label:** Contact radius +**Type:** `number` +**Unit:** `Å` + +Distance from the dye centre to this residue's quenching centre within which quenching occurs. Leave empty to inherit the project-wide critical_distance. + +### `amino_acid_interactions.slow_factor` + +**Label:** Slow factor +**Type:** `number` + +Factor between 0 and 1 scaling the dye's diffusion coefficient near this residue type, modelling unspecific stickiness. Overlapping residues multiply their factors. + +### `critical_distance` + +**Label:** Fallback contact radius +**Type:** `number` +**Unit:** `Å` + +Contact radius used by residue types that do not define their own quench_radius. It is measured from the dye centre to the residue's quenching centre, so it must exceed the dye radius plus van der Waals contact (typically 7-9 A for a 3.5 A dye). ## CLI override examples @@ -113,7 +360,7 @@ Located under `fret.dyes`. The first entry is the donor; the second (optional) i - Sweep linker length and residue: ```bash quest simulate -p project.quest.json \ - --grid linker.length=10.0,12.5 \ + --grid av_parameter.linker_length=10.0,12.5 \ --grid attachment.residue=25,30,35 ``` diff --git a/quest/i18n.py b/quest/i18n.py new file mode 100644 index 0000000..7a68529 --- /dev/null +++ b/quest/i18n.py @@ -0,0 +1,185 @@ +"""Translations, from one place, for every surface. + +QuEst describes each parameter exactly once, in +`quest/settings/parameter_catalog.json` — label, unit, description. The docs, +the web UI and the Qt form are all generated from it. Translating *that* is +therefore the whole job: a German label reaches `doc/parameters.md`, the +browser and the desktop form without any of them knowing a translation +happened. + +A locale file (`quest/settings/locales/.json`) carries two things: + +``parameters`` + Per catalog path, a translated ``label`` and ``description``. Anything + absent falls back to the English catalog entry, key by key — a partial + translation is useful and must never be an error. +``ui`` + The strings that are *not* parameters: panel titles, buttons, plot axes, + dialog captions, the help text. Keyed by dotted names; `en.json` defines + the key set and every other locale falls back to it. + +English is not a locale file's job to define. The catalog *is* English, so +`en.json` carries only ``ui`` and the category names. + +Choosing a locale +----------------- +:func:`resolve_locale` prefers an explicit argument, then ``QUEST_LOCALE``, then +the operating system's language, then English. An unknown code is not an error: +it resolves to English, because a user with `LANG=cs_CZ` wants QuEst to start, +not to explain itself. +""" + +from __future__ import annotations + +import json +import os +from functools import lru_cache +from pathlib import Path +from typing import Any, Mapping + +from .settings import parameter_catalog + +__all__ = [ + "DEFAULT_LOCALE", + "LOCALES_DIR", + "SYSTEM_LOCALE_ENV_VARS", + "system_locale", + "available_locales", + "locale_data", + "normalize_locale", + "resolve_locale", + "translate_catalog", + "ui_strings", + "ui", +] + +DEFAULT_LOCALE = "en" +LOCALES_DIR = Path(__file__).resolve().parent / "settings" / "locales" + +#: Environment variable that overrides everything but an explicit argument. +LOCALE_ENV_VAR = "QUEST_LOCALE" + + +def normalize_locale(value: str | None) -> str | None: + """`de_DE.UTF-8` → `de`. Returns None for anything unusable.""" + if not value: + return None + code = str(value).strip().replace("-", "_").split(".")[0].split("_")[0].lower() + return code or None + + +@lru_cache(maxsize=1) +def available_locales() -> dict[str, str]: + """Locale code → its name *in that language*, e.g. `{"de": "Deutsch"}`. + + A language named in English in a language picker ("German") is the one + thing a reader who needs it cannot read. + """ + found: dict[str, str] = {} + for path in sorted(LOCALES_DIR.glob("*.json")): + try: + with path.open("r", encoding="utf8") as handle: + data = json.load(handle) + except (OSError, ValueError): + continue + code = normalize_locale(data.get("locale") or path.stem) + if code: + found[code] = data.get("name") or code + return found + + +#: Where the operating system states its language, most specific first. Read +#: directly rather than through `locale.getdefaultlocale()`, which is deprecated +#: and slated for removal in Python 3.15 — and which only read these anyway. +#: `locale.getlocale()` is not a substitute: it reports the *current* locale, +#: which is `(None, None)` until something calls `setlocale`. +SYSTEM_LOCALE_ENV_VARS = ("LC_ALL", "LC_MESSAGES", "LANG", "LANGUAGE") + + +def system_locale() -> str | None: + """The language the operating system asks for, or None.""" + for name in SYSTEM_LOCALE_ENV_VARS: + value = os.environ.get(name) + if value and value not in ("C", "POSIX"): + # LANGUAGE is a colon-separated preference list. + return value.split(":")[0] + return None + + +def resolve_locale(requested: str | None = None) -> str: + """The locale to use: argument, then `QUEST_LOCALE`, then the OS, then English.""" + candidates = [requested, os.environ.get(LOCALE_ENV_VAR), system_locale()] + + known = available_locales() + for candidate in candidates: + code = normalize_locale(candidate) + if code and code in known: + return code + return DEFAULT_LOCALE + + +@lru_cache(maxsize=8) +def locale_data(code: str) -> dict[str, Any]: + """The raw contents of one locale file; `{}` when there is none.""" + path = LOCALES_DIR / f"{normalize_locale(code) or DEFAULT_LOCALE}.json" + if not path.is_file(): + return {} + with path.open("r", encoding="utf8") as handle: + return json.load(handle) + + +@lru_cache(maxsize=8) +def ui_strings(code: str | None = None) -> dict[str, str]: + """Every non-parameter string, with English filling any gap.""" + resolved = resolve_locale(code) + strings = dict(locale_data(DEFAULT_LOCALE).get("ui", {})) + if resolved != DEFAULT_LOCALE: + strings.update(locale_data(resolved).get("ui", {})) + return strings + + +def ui(key: str, code: str | None = None) -> str: + """One UI string. An unknown key returns the key, which is visible but harmless.""" + return ui_strings(code).get(key, key) + + +@lru_cache(maxsize=8) +def translate_catalog(code: str | None = None) -> dict[str, Any]: + """The parameter catalog with labels, descriptions and categories translated. + + The shape is identical to :func:`quest.settings.parameter_catalog`, so every + consumer — the doc generator, the view-spec generator, the web API — keeps + working with no knowledge of locales. Untranslated keys keep their English + text rather than disappearing. + """ + catalog = json.loads(json.dumps(parameter_catalog())) # deep copy, plain types + resolved = resolve_locale(code) + catalog["locale"] = resolved + if resolved == DEFAULT_LOCALE: + return catalog + + data = locale_data(resolved) + categories: Mapping[str, str] = data.get("categories", {}) + translations: Mapping[str, Mapping[str, str]] = data.get("parameters", {}) + + for path, entry in catalog.get("parameters", {}).items(): + translated = translations.get(path, {}) + for field in ("label", "description"): + if translated.get(field): + entry[field] = translated[field] + category = entry.get("category") + if category in categories: + # The English category is kept so callers that group by it — the + # view-spec generator does — do not need translating themselves. + entry["category_label"] = categories[category] + + for field in ("title", "description"): + if data.get(f"catalog.{field}"): + catalog[field] = data[f"catalog.{field}"] + return catalog + + +def clear_cache() -> None: + """Forget everything read from disk. For tests that write locale files.""" + for cached in (available_locales, locale_data, ui_strings, translate_catalog): + cached.cache_clear() diff --git a/quest/lib/tools/dye_diffusion/dye_diffusion.json b/quest/lib/tools/dye_diffusion/dye_diffusion.json deleted file mode 100644 index cab8246..0000000 --- a/quest/lib/tools/dye_diffusion/dye_diffusion.json +++ /dev/null @@ -1,33 +0,0 @@ -{"D": null, - "all_quencher_atoms": true, - "attachment_atom": null, - "attachment_chain": null, - "attachment_residue": null, - "auto_update": false, - "av_parameter": { - "linker_length": 21.5, - "radius1": 3.5, - "linker_width": 0.5 - }, - "dg": 0.5, - "kQ": 2.0, - "nph": 3000000.0, - "output_file": "out", - "pdb": null, - "quencher": { - "PRO": ["CB"], - "MET": ["CB"], - "TRP": ["CB"], - "TYR": ["CB"] - }, - "save_avs": false, - "slow_fact": 0.10, - "critical_distance": 6.5, - "slow_radius": 8.5, - "sticky_mode": "surface", - "t_max": 2000.0, - "t_step": 0.016, - "tau0": 4.2, - "D": 7.0, - "verbose": false -} \ No newline at end of file diff --git a/quest/settings/__init__.py b/quest/settings/__init__.py index e69de29..5a7baa8 100644 --- a/quest/settings/__init__.py +++ b/quest/settings/__init__.py @@ -0,0 +1,118 @@ +"""Access to the shipped settings data: the parameter catalog and dye library. + +These JSON files are package data, so they are resolved relative to this +module rather than to the current working directory or a guessed repository +root — that is what makes them readable from an installed wheel, a frozen +desktop bundle, or a host application that loaded QuEst as a plugin. +""" + +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any, Mapping, MutableMapping + +__all__ = [ + "SETTINGS_DIR", + "PARAMETER_CATALOG_PATH", + "DYE_REPOSITORY_PATH", + "parameter_catalog", + "dye_repository", + "save_dye", + "quenching_defaults", +] + +SETTINGS_DIR = Path(__file__).resolve().parent +PARAMETER_CATALOG_PATH = SETTINGS_DIR / "parameter_catalog.json" +DYE_REPOSITORY_PATH = SETTINGS_DIR / "dye_repository.json" + + +def _read_json(path: Path) -> dict[str, Any]: + if not path.exists(): + raise FileNotFoundError(f"Missing QuEst settings file: {path}") + with path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def parameter_catalog() -> dict[str, Any]: + """Return the parameter catalog — the single source of parameter help text. + + The same document drives the web UI's labels and tooltips and the generated + ``doc/parameters.md``. + """ + + return _read_json(PARAMETER_CATALOG_PATH) + + +def _with_stickiness_defaults(dye: Mapping[str, Any]) -> dict[str, Any]: + from ..core.dye_diffusion import normalize_amino_acid_interactions + + normalized = dict(dye) + normalized.setdefault("slow_radius", 8.5) + normalized["amino_acid_interactions"] = dict( + normalize_amino_acid_interactions(normalized.get("amino_acid_interactions")) + ) + return normalized + + +def dye_repository(*, with_defaults: bool = True) -> dict[str, Any]: + """Return the dye presets, keyed by dye name. + + Parameters + ---------- + with_defaults : bool + Fill in the stickiness fields (``slow_radius``, + ``amino_acid_interactions``) that a preset may omit, so every entry is + complete before it reaches the simulation. + """ + + dyes = _read_json(DYE_REPOSITORY_PATH) + if not with_defaults: + return dyes + return { + name: _with_stickiness_defaults(dye) if isinstance(dye, dict) else dye + for name, dye in dyes.items() + } + + +def save_dye(dye: Mapping[str, Any]) -> MutableMapping[str, Any]: + """Add or replace one dye in the repository and return the stored entry. + + Raises + ------ + ValueError + If the dye carries no ``name``; the name is its key. + """ + + name = str(dye.get("name") or "").strip() + if not name: + raise ValueError("A dye must define a non-empty 'name'.") + + dyes = _read_json(DYE_REPOSITORY_PATH) if DYE_REPOSITORY_PATH.exists() else {} + entry = _with_stickiness_defaults(dye) + entry["name"] = name + dyes[name] = entry + DYE_REPOSITORY_PATH.write_text( + json.dumps(dyes, indent=2, ensure_ascii=False), encoding="utf-8" + ) + return entry + + +def quenching_defaults() -> dict[str, Any]: + """Return the residue-type chemistry that makes quenching amino-acid specific.""" + + from ..core.dye_diffusion import ( + DEFAULT_QUENCHER_ATOMS, + REFERENCE_PET_QUENCHING, + STANDARD_AMINO_ACID_RESIDUES, + normalize_amino_acid_interactions, + ) + + return { + "residues": list(STANDARD_AMINO_ACID_RESIDUES), + "default_interactions": dict(normalize_amino_acid_interactions()), + "default_quench_atoms": { + residue: list(atoms) for residue, atoms in DEFAULT_QUENCHER_ATOMS.items() + }, + "reference_pet_quenching": dict(REFERENCE_PET_QUENCHING), + } diff --git a/quest/settings/dye_repository.json b/quest/settings/dye_repository.json new file mode 100644 index 0000000..d255850 --- /dev/null +++ b/quest/settings/dye_repository.json @@ -0,0 +1,1682 @@ +{ + "Alexa488": { + "name": "Alexa488", + "tau0": 4.2, + "D": 7, + "av_parameter": { + "linker_length": 21.5, + "linker_width": 0.5, + "radius1": 3.5 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.8, + "quench_radius": 7.0, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 1.0, + "quench_radius": 8.2, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.67, + "quench_radius": 7.0, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 2.0, + "quench_radius": 7.5, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 3.5, + "quench_radius": 8.5, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 2.0, + "quench_radius": 8.5, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "Alexa594": { + "name": "Alexa594", + "tau0": 3.9, + "D": 6, + "av_parameter": { + "linker_length": 22, + "linker_width": 0.5, + "radius1": 4 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.571, + "quench_radius": 7.5, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 0.714, + "quench_radius": 8.7, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.193, + "quench_radius": 7.5, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 1.429, + "quench_radius": 8.0, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 2.5, + "quench_radius": 9.0, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 1.429, + "quench_radius": 9.0, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "Cy3": { + "name": "Cy3", + "tau0": 1.2, + "D": 8, + "av_parameter": { + "linker_length": 18, + "linker_width": 0.5, + "radius1": 3 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.686, + "quench_radius": 6.5, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 0.857, + "quench_radius": 7.7, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.431, + "quench_radius": 6.5, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 1.714, + "quench_radius": 7.0, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 3.0, + "quench_radius": 8.0, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 1.714, + "quench_radius": 8.0, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "Cy5": { + "name": "Cy5", + "tau0": 1, + "D": 8, + "av_parameter": { + "linker_length": 20, + "linker_width": 0.5, + "radius1": 3.2 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.64, + "quench_radius": 6.7, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 0.8, + "quench_radius": 7.9, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.336, + "quench_radius": 6.7, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 1.6, + "quench_radius": 7.2, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 2.8, + "quench_radius": 8.2, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 1.6, + "quench_radius": 8.2, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "Atto488": { + "name": "Atto488", + "tau0": 4.1, + "D": 4, + "av_parameter": { + "linker_length": 20, + "linker_width": 0.5, + "radius1": 4 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.686, + "quench_radius": 7.5, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 0.857, + "quench_radius": 8.7, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.431, + "quench_radius": 7.5, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 1.714, + "quench_radius": 8.0, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 3.0, + "quench_radius": 9.0, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 1.714, + "quench_radius": 9.0, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "Atto647N": { + "name": "Atto647N", + "tau0": 3.5, + "D": 3.9, + "av_parameter": { + "linker_length": 22, + "linker_width": 0.5, + "radius1": 4.5 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 0.914, + "quench_radius": 8.0, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 1.143, + "quench_radius": 9.2, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 1.909, + "quench_radius": 8.0, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 2.286, + "quench_radius": 8.5, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 4.0, + "quench_radius": 9.5, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 2.286, + "quench_radius": 9.5, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "TMR": { + "name": "TMR", + "tau0": 2.3, + "D": 3.5, + "av_parameter": { + "linker_length": 15, + "linker_width": 0.5, + "radius1": 3 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.1, + "kQ": 1.143, + "quench_radius": 6.5, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.1, + "kQ": 1.429, + "quench_radius": 7.7, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.1, + "kQ": 2.386, + "quench_radius": 6.5, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.1, + "kQ": 2.857, + "quench_radius": 7.0, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.1, + "kQ": 5.0, + "quench_radius": 8.0, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.1, + "kQ": 2.857, + "quench_radius": 8.0, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + }, + "AF488": { + "name": "AF488", + "tau0": 4.2, + "D": 7, + "av_parameter": { + "linker_length": 21.5, + "linker_width": 0.5, + "radius1": 3.5 + }, + "slow_radius": 8.5, + "amino_acid_interactions": { + "ALA": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "ARG": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CZ", + "NE", + "NH1", + "NH2" + ] + }, + "ASN": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "ND2" + ] + }, + "ASP": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "OD1", + "OD2" + ] + }, + "CYS": { + "slow_factor": 0.9, + "kQ": 0.8, + "quench_radius": 7.0, + "quench_atoms": [ + "SG" + ] + }, + "GLN": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "NE2" + ] + }, + "GLU": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CD", + "OE1", + "OE2" + ] + }, + "GLY": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CA" + ] + }, + "HIS": { + "slow_factor": 0.9, + "kQ": 1.0, + "quench_radius": 8.2, + "quench_atoms": [ + "CG", + "ND1", + "CD2", + "CE1", + "NE2" + ] + }, + "ILE": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LEU": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + }, + "LYS": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "NZ" + ] + }, + "MET": { + "slow_factor": 0.9, + "kQ": 1.67, + "quench_radius": 7.0, + "quench_atoms": [ + "SD" + ] + }, + "PHE": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ" + ] + }, + "PRO": { + "slow_factor": 0.9, + "kQ": 2.0, + "quench_radius": 7.5, + "quench_atoms": [ + "N", + "CB", + "CG", + "CD" + ] + }, + "SER": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG" + ] + }, + "THR": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "OG1" + ] + }, + "TRP": { + "slow_factor": 0.9, + "kQ": 3.5, + "quench_radius": 8.5, + "quench_atoms": [ + "CD2", + "CE2", + "CE3", + "CZ2", + "CZ3", + "CH2", + "NE1", + "CG", + "CD1" + ] + }, + "TYR": { + "slow_factor": 0.9, + "kQ": 2.0, + "quench_radius": 8.5, + "quench_atoms": [ + "CG", + "CD1", + "CD2", + "CE1", + "CE2", + "CZ", + "OH" + ] + }, + "VAL": { + "slow_factor": 0.9, + "kQ": 0.0, + "quench_radius": null, + "quench_atoms": [ + "CB" + ] + } + } + } +} diff --git a/quest/settings/locales/de.json b/quest/settings/locales/de.json new file mode 100644 index 0000000..fc01101 --- /dev/null +++ b/quest/settings/locales/de.json @@ -0,0 +1,265 @@ +{ + "locale": "de", + "name": "Deutsch", + "catalog.title": "QuEst-Parameterkatalog", + "catalog.description": "Verbindliche Beschreibungen der Parameter, die von der Kommandozeile, den Voreinstellungen und der Weboberfläche verwendet werden.", + "categories": { + "Structure": "Struktur", + "Labeling site": "Markierungsstelle", + "Accessible volume": "Zugängliches Volumen", + "Simulation": "Simulation", + "Quenching": "Löschung", + "FRET Acceptor": "FRET-Akzeptor", + "Advanced": "Erweitert" + }, + "parameters": { + "pdb": { + "label": "Strukturdatei", + "description": "Pfad zur Strukturdatei (PDB/CIF) oder eine vierstellige RCSB-PDB-Kennung; wird für die AV-Berechnung verwendet." + }, + "attachment.chain": { + "label": "Kette der Anbindung", + "description": "Kettenbezeichner der Aminosäure, an die der Farbstoff gebunden ist." + }, + "attachment.residue": { + "label": "Rest der Anbindung", + "description": "Sequenznummer der Aminosäure, an die der Farbstoff gebunden ist." + }, + "attachment.atom": { + "label": "Atom der Anbindung", + "description": "Atomname (z. B. CB, CA), der als Anbindungspunkt des Farbstoffs dient." + }, + "av_parameter.linker_length": { + "label": "Linkerlänge", + "description": "Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des Farbstoffs." + }, + "av_parameter.linker_width": { + "label": "Linkerbreite", + "description": "Breite des Linkers, der den Farbstoff hält." + }, + "av_parameter.radius1": { + "label": "Farbstoffradius", + "description": "Ausschlussradius, der den Farbstoff als Kugel beschreibt (Ein-Kugel-Näherung)." + }, + "dg": { + "label": "Gitterauflösung", + "description": "Gitterauflösung für die Berechnung des zugänglichen Volumens (AV) und des Diffusionsraums." + }, + "tau0": { + "label": "Ungelöschte Lebensdauer", + "description": "Fluoreszenzlebensdauer des Donorfarbstoffs ohne Löschung." + }, + "fret.dyes.0.D": { + "label": "Diffusionskoeffizient des Donors", + "description": "Diffusionskoeffizient des Donorfarbstoffs in Lösung, ohne Wechselwirkung mit der Proteinoberfläche." + }, + "critical_distance": { + "label": "Voreingestellter Kontaktradius", + "description": "Kontaktradius für Resttypen, die keinen eigenen quench_radius festlegen. Er wird vom Farbstoffmittelpunkt bis zum Löschzentrum des Rests gemessen und muss daher größer sein als der Farbstoffradius zuzüglich des Van-der-Waals-Kontakts (typischerweise 7–9 Å bei einem Farbstoff von 3,5 Å)." + }, + "t_max": { + "label": "Simulationsdauer", + "description": "Gesamtlänge der simulierten Brownschen Trajektorie." + }, + "t_step": { + "label": "Zeitschritt", + "description": "Schrittweite für die Berechnung der Brownschen Trajektorie." + }, + "n_photons": { + "label": "Simulierte Photonen", + "description": "Anzahl der simulierten Anregungsphotonen zur Rekonstruktion des Fluoreszenzabklingens." + }, + "n_bins": { + "label": "Kanäle des Abklingens", + "description": "Anzahl der Zeitkanäle des ausgegebenen Abklinghistogramms." + }, + "parallel_trajectories": { + "label": "Parallele Trajektorien", + "description": "Anzahl unabhängiger Brownscher Trajektorien, die gleichzeitig gerechnet und vor der Photonensimulation zusammengeführt werden. −1 nutzt alle CPU-Kerne, höchstens jedoch 8." + }, + "slow_radius": { + "label": "Verlangsamungsradius", + "description": "Radius um jedes Aminosäurezentrum des gesamten Proteins, innerhalb dessen dieser Resttyp seinen slow_factor zum Gitter der Diffusionskoeffizienten beiträgt." + }, + "save_avs": { + "label": "AV-Dateien speichern", + "description": "Legt fest, ob die berechneten Gitter des zugänglichen Volumens als XYZ-Dateien gespeichert werden." + }, + "output_file": { + "label": "Präfix der Ausgabedateien", + "description": "Namenspräfix für gespeicherte Simulationsergebnisse, Trajektorien und Abklingkurven." + }, + "skip_frame": { + "label": "Übersprungene Trajektorienbilder", + "description": "Unterabtastungsfaktor beim Schreiben von Trajektorienbildern in Koordinatendateien." + }, + "fret.enabled": { + "label": "FRET aktiviert", + "description": "Legt fest, ob ein FRET-Akzeptorfarbstoff simuliert wird, um FRET-Effizienz und Abklingkurven zu berechnen." + }, + "fret.R0_matrix": { + "label": "Förster-Radius", + "description": "Förster-Radius R0 des Donor-Akzeptor-Paares, in Ångström wie jede andere Länge im Projekt. Gespeichert wird die Zelle Donor→Akzeptor von fret.R0_matrix; die Transferrate skaliert mit (R0/r)^6, sodass eine Eingabe in Nanometern FRET verschwinden lässt. Typische Xanthen-Paare liegen bei 45–65 Å." + }, + "fret.dyes.1.attachment.chain": { + "label": "Kette des Akzeptors", + "description": "Kettenbezeichner des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist." + }, + "fret.dyes.1.attachment.residue": { + "label": "Rest des Akzeptors", + "description": "Sequenznummer des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist." + }, + "fret.dyes.1.attachment.atom": { + "label": "Atom des Akzeptors", + "description": "Atomname, an dem der FRET-Akzeptorfarbstoff gebunden ist." + }, + "fret.dyes.1.av_parameter.linker_length": { + "label": "Linkerlänge des Akzeptors", + "description": "Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des FRET-Akzeptorfarbstoffs." + }, + "fret.dyes.1.av_parameter.linker_width": { + "label": "Linkerbreite des Akzeptors", + "description": "Breite des Linkers, der den FRET-Akzeptorfarbstoff hält." + }, + "fret.dyes.1.av_parameter.radius1": { + "label": "Radius des Akzeptorfarbstoffs", + "description": "Ausschlussradius, der den FRET-Akzeptorfarbstoff als Kugel beschreibt." + }, + "fret.dyes.1.D": { + "label": "Diffusionskoeffizient des Akzeptors", + "description": "Diffusionskoeffizient des FRET-Akzeptorfarbstoffs ohne Wechselwirkung mit der Proteinoberfläche." + }, + "amino_acid_interactions": { + "label": "Aminosäure-Wechselwirkungen", + "description": "Tabelle der Wechselwirkungen je Resttyp. Jeder Eintrag enthält slow_factor (0–1, wie stark der Rest den diffundierenden Farbstoff verlangsamt), kQ (Löschrate in 1/ns bei Kontakt), quench_radius (Kontaktradius in Ångström vom Farbstoffmittelpunkt; null übernimmt critical_distance) und quench_atoms (Atomnamen, deren Schwerpunkt das Löschzentrum bildet). Standardmäßig löschen nur Reste mit redoxaktiver Seitenkette: TRP, TYR, MET, HIS, CYS und PRO." + }, + "amino_acid_interactions.kQ": { + "label": "Löschrate kQ", + "description": "Rate, mit der dieser Resttyp den Farbstoff bei Kontakt löscht. Beiträge von Resten mit überlappenden Kontaktsphären addieren sich." + }, + "amino_acid_interactions.quench_radius": { + "label": "Kontaktradius", + "description": "Abstand vom Farbstoffmittelpunkt zum Löschzentrum dieses Rests, innerhalb dessen Löschung stattfindet. Leer lassen, um die projektweite critical_distance zu übernehmen." + }, + "amino_acid_interactions.quench_atoms": { + "label": "Atome des Löschzentrums", + "description": "Atomnamen, deren Schwerpunkt das Löschzentrum dieses Rests bildet. Die Voreinstellungen folgen der redoxaktiven Gruppe, die den photoinduzierten Elektronentransfer vermittelt: der Indolring bei TRP, der Phenolring bei TYR, der Imidazolring bei HIS, SD bei MET und SG bei CYS – nicht CB." + }, + "amino_acid_interactions.slow_factor": { + "label": "Verlangsamungsfaktor", + "description": "Faktor zwischen 0 und 1, der den Diffusionskoeffizienten des Farbstoffs in der Nähe dieses Resttyps skaliert und unspezifische Haftung beschreibt. Überlappende Reste multiplizieren ihre Faktoren." + }, + "coarse_grained": { + "label": "Grobkörnige Struktur", + "description": "Reduziert die Struktur vor der Simulation auf das Rückgrat samt CB, wobei CB in den Schwerpunkt der Seitenkette verschoben wird. Seitenkettenatome fehlen dann, sodass das Löschzentrum jedes Rests auf dieses CB-Pseudoatom zurückfällt und das zugängliche Volumen wächst, weil die Seitenketten es nicht mehr versperren. Das ist eine Modellierungsentscheidung, keine Beschleunigung: Der Aufwand von QuEst wird vom AV-Gitter bestimmt, nicht von der Atomzahl." + }, + "random_seed": { + "label": "Zufallsstartwert", + "description": "Startwert der Monte-Carlo-Simulation. Ist er gesetzt, werden sowohl die Diffusionstrajektorie als auch die Photonenspur initialisiert, sodass wiederholte Läufe desselben Projekts genau dasselbe Abklingen und dieselbe Quantenausbeute liefern. Ohne Startwert läuft die Simulation unabhängig zufällig; die Photonenspur nutzt dann einen schnelleren, mehrfädigen Kern." + }, + "fret.acceptor_dynamics": { + "label": "Akzeptordynamik", + "description": "Wie der Akzeptor behandelt wird: „trajectory“ simuliert seine Brownsche Bewegung mit eigenem Diffusionskoeffizienten und eigener Haftung und verwendet den momentanen Donor-Akzeptor-Abstand, „averaged“ mittelt über sein statisches zugängliches Volumen (Grenzfall des schnellen Akzeptors, nur gültig, wenn er dieses Volumen schnell im Vergleich zur Donorlebensdauer durchläuft). Beide unterscheiden sich, weil eine Punktwolke gleichmäßig gewichtet wird, eine Trajektorie hingegen danach, wo sich der Farbstoff tatsächlich aufhält." + }, + "fret.dyes.1.slow_radius": { + "label": "Verlangsamungsradius des Akzeptors", + "description": "Radius um jedes Aminosäurezentrum, innerhalb dessen dieser Rest den Akzeptor verlangsamt. Getrennt vom Donor: Ein Cyanin und ein Rhodamin haften nicht in gleicher Weise an einer Proteinoberfläche. Voreinstellung ist der Wert des Donors." + }, + "fret.dyes.1.amino_acid_interactions": { + "label": "Wechselwirkungen des Akzeptors", + "description": "Tabelle der Wechselwirkungen je Resttyp für den Akzeptor, gleiche Form wie amino_acid_interactions des Donors. Verwendet wird nur slow_factor, denn QuEst berichtet das Abklingen des Donors; die eigene PET-Löschung des Akzeptors würde dessen Helligkeit ändern, nicht die des Donors. Voreinstellung ist die Tabelle des Donors." + } + }, + "ui": { + "app.title": "QuEst", + "app.subtitle": "Löschungsschätzer", + "panel.structure": "Struktur", + "panel.dye": "Farbstoff", + "panel.simulation": "Simulation", + "panel.quenching": "Löschung", + "panel.fret": "FRET", + "panel.advanced": "Erweitert", + "dock.project": "Projekt", + "dock.structure": "Struktur", + "dock.results": "Ergebnisse", + "field.state": "Status", + "field.state.description": "Ergebnis der letzten Simulation.", + "status.idle": "Noch nicht simuliert.", + "status.running": "Simulation läuft…", + "status.failed": "Fehlgeschlagen: {error}", + "status.saved": "{name} gespeichert", + "status.loaded": "{name} geladen", + "table.residue": "Rest", + "table.residue.description": "Dreibuchstabiger Aminosäurecode.", + "plot.decay.title": "Fluoreszenzabklingen", + "plot.decay.x": "Zeit (ns)", + "plot.decay.y": "Ereignisse", + "plot.decay.description": "Abklingen des Donors und, bei aktiviertem FRET, das FRET-gelöschte Abklingen.", + "plot.decay.donor": "Donor", + "plot.decay.fret": "FRET", + "plot.trajectory.title": "Farbstofftrajektorie", + "plot.trajectory.x": "Zeit (ns)", + "plot.trajectory.y": "|r − ⟨r⟩| (Å)", + "plot.trajectory.description": "Abstand des Farbstoffs von seiner mittleren Position – wie weit er tatsächlich wandert.", + "plot.autocorrelation.title": "Autokorrelation der Position", + "plot.autocorrelation.x": "Verzögerung (ns)", + "plot.autocorrelation.y": "AKF", + "plot.autocorrelation.description": "Wie schnell der Farbstoff seine Position vergisst; bestimmt, ob die Löschung diffusions- oder kontaktbegrenzt ist.", + "button.simulate": "▶ Simulieren", + "button.simulate.description": "Das aktuelle Projekt über quest.api rechnen.", + "button.load_project": "📂 Projekt laden…", + "button.load_project.description": "Ein QuEst-Projekt-JSON einlesen, gleich von welcher Oberfläche es stammt.", + "button.save_project": "💾 Projekt speichern…", + "button.save_project.description": "Das Formular als Projekt-JSON schreiben – dieselbe Datei, die Kommandozeile und Weboberfläche lesen.", + "dialog.save_project": "QuEst-Projekt speichern", + "dialog.load_project": "QuEst-Projekt laden", + "dialog.open_structure": "Struktur öffnen", + "filter.project": "QuEst-Projekt (*.json)", + "filter.structures": "Strukturen (*.pdb *.cif *.mmcif)", + "filter.all": "Alle Dateien (*)", + "menu.file": "&Datei", + "menu.help": "&Hilfe", + "menu.load_structure": "Struktur laden…", + "menu.save_project": "Projekt speichern…", + "menu.load_project": "Projekt laden…", + "menu.exit": "Beenden", + "menu.about": "Über / Zitieren…", + "about.title": "Über QuEst", + "about.cite": "Wenn Sie QuEst in einer wissenschaftlichen Veröffentlichung verwenden, zitieren Sie bitte:", + "help.title": "QuEst — Hilfe", + "help.text": "# QuEst — transientes Abklingen eines gebundenen Farbstoffs\n\nSagt das Fluoreszenzabklingen eines über einen flexiblen Linker gebundenen\nFarbstoffs allein aus der Struktur voraus: Der Farbstoff diffundiert in seinem\nzugänglichen Volumen, wird bei Kontakt mit benachbarten Aminosäuren gelöscht\n(PET) und überträgt – bei aktiviertem FRET – Energie auf einen Akzeptor.\n\n## Was einzustellen ist\n1. **Struktur** — eine PDB-/CIF-Datei oder eine vierstellige RCSB-Kennung sowie\n der Rest, an den der Farbstoff gebunden ist.\n2. **Farbstoff** — Linkerlänge, Linkerbreite und Farbstoffradius bestimmen das\n zugängliche Volumen.\n3. **Simulation** — ungelöschte Lebensdauer, Diffusionskoeffizient und\n Simulationsdauer. `t_step` muss die schnellste Bewegung auflösen; die\n Voreinstellungen sind gemessen, nicht geraten.\n4. **Löschung** — Löschraten und Kontaktradien je Rest. Eine geänderte Zeile\n ändert die Chemie nur dieser einen Aminosäure.\n5. **FRET** — aktivieren, den Akzeptor platzieren und R₀ **in Ångström**\n angeben.\n\n## Was herauskommt\nQuantenausbeute und mittlere Lebensdauer, das Abklingen des Donors (und mit\nFRET), die Farbstofftrajektorie und deren Autokorrelation.\n\nAlles in diesem Formular ist **ein** QuEst-*Projekt*. **Projekt speichern**\nschreibt genau das JSON, das die Kommandozeile (`quest simulate project.json`)\nund die Weboberfläche lesen; ein hier begonnener Lauf kann also überall\nfortgesetzt werden.\n", + "autoform.missing": "Das Desktop-Formular von QuEst wird von ChiSurfs AutoForm dargestellt, die nicht importiert werden konnte.\n\nInstallieren Sie ChiSurf oder setzen Sie CHISURF_ROOT auf ein Arbeitsverzeichnis.\n\nKommandozeile (`quest simulate project.json`) und Weboberfläche benötigen sie nicht.", + "web.language": "Sprache", + "web.run": "Simulation starten", + "web.running": "Simulation läuft…", + "web.results": "Ergebnisse", + "web.project": "Projekt", + "web.quantum_yield": "Quantenausbeute", + "web.lifetime": "Mittlere Lebensdauer", + "web.efficiency": "FRET-Effizienz", + "doc.title": "QuEst-Parameterreferenz", + "doc.summary": "Übersicht des Katalogs", + "doc.generated": "Diese Seite wird aus {sources} erzeugt. Ändern Sie zuerst dort den Hilfetext eines Parameters — Weboberfläche, diese Seite und das Desktop-Formular lesen dieselben Dateien.", + "doc.col.key": "Schlüssel", + "doc.col.category": "Kategorie", + "doc.col.type": "Typ", + "doc.col.unit": "Einheit", + "doc.col.description": "Beschreibung", + "doc.label": "Bezeichnung", + "doc.type": "Typ", + "doc.unit": "Einheit", + "table.kQ": "kQ (1/ns)", + "table.radius": "Radius (Å)", + "table.atoms": "Atome", + "table.slow_factor": "Faktor", + "web.tab.labeling": "1 – Markierung", + "web.tab.simulation": "2 – Simulation", + "web.tab.scan": "3 – Abtastung", + "web.tab.advanced": "4 – Erweitert", + "web.card.runs": "Simulationsläufe", + "web.card.settings": "Simulationseinstellungen", + "web.card.scan_settings": "Einstellungen der Abtastung", + "web.card.derived": "Abgeleitete Größen", + "web.tagline": "Struktur hochladen, Markierungsstelle wählen, Löschung bzw. FRET simulieren." + } +} diff --git a/quest/settings/locales/en.json b/quest/settings/locales/en.json new file mode 100644 index 0000000..753857d --- /dev/null +++ b/quest/settings/locales/en.json @@ -0,0 +1,106 @@ +{ + "locale": "en", + "name": "English", + "_comment": "English defines the key set. Parameter labels and descriptions are not repeated here — the catalog itself is English (quest/i18n.py).", + "categories": { + "Structure": "Structure", + "Labeling site": "Labeling site", + "Accessible volume": "Accessible volume", + "Simulation": "Simulation", + "Quenching": "Quenching", + "FRET Acceptor": "FRET acceptor", + "Advanced": "Advanced" + }, + "ui": { + "app.title": "QuEst", + "app.subtitle": "Quenching Estimator", + "panel.structure": "Structure", + "panel.dye": "Dye", + "panel.simulation": "Simulation", + "panel.quenching": "Quenching", + "panel.fret": "FRET", + "panel.advanced": "Advanced", + "dock.project": "Project", + "dock.structure": "Structure", + "dock.results": "Results", + "field.state": "State", + "field.state.description": "Outcome of the last simulation.", + "status.idle": "Not simulated yet.", + "status.running": "Simulating…", + "status.failed": "Failed: {error}", + "status.saved": "Saved {name}", + "status.loaded": "Loaded {name}", + "table.residue": "Residue", + "table.residue.description": "Three-letter amino-acid code.", + "plot.decay.title": "Fluorescence decay", + "plot.decay.x": "Time (ns)", + "plot.decay.y": "Counts", + "plot.decay.description": "Donor decay, and the FRET-quenched decay when FRET is enabled.", + "plot.decay.donor": "Donor", + "plot.decay.fret": "FRET", + "plot.trajectory.title": "Dye trajectory", + "plot.trajectory.x": "Time (ns)", + "plot.trajectory.y": "|r − ⟨r⟩| (Å)", + "plot.trajectory.description": "Distance of the dye from its mean position — how far it actually explores.", + "plot.autocorrelation.title": "Position autocorrelation", + "plot.autocorrelation.x": "Lag (ns)", + "plot.autocorrelation.y": "ACF", + "plot.autocorrelation.description": "How quickly the dye forgets where it was; sets whether quenching is diffusion- or contact-limited.", + "button.simulate": "▶ Simulate", + "button.simulate.description": "Run the current project through quest.api.", + "button.load_project": "📂 Load project…", + "button.load_project.description": "Read a QuEst project JSON written by any surface.", + "button.save_project": "💾 Save project…", + "button.save_project.description": "Write the form as project JSON — the same file the CLI and the web UI read.", + "dialog.save_project": "Save QuEst project", + "dialog.load_project": "Load QuEst project", + "dialog.open_structure": "Open structure", + "filter.project": "QuEst project (*.json)", + "filter.structures": "Structures (*.pdb *.cif *.mmcif)", + "filter.all": "All files (*)", + "menu.file": "&File", + "menu.help": "&Help", + "menu.load_structure": "Load structure…", + "menu.save_project": "Save project…", + "menu.load_project": "Load project…", + "menu.exit": "Exit", + "menu.about": "About / Citation…", + "about.title": "About QuEst", + "about.cite": "If you use QuEst in a scientific publication, please cite:", + "help.title": "QuEst — help", + "help.text": "# QuEst — transient decay of a tethered dye\n\nPredicts the fluorescence decay of a dye on a flexible linker from the\nstructure alone: the dye diffuses inside its accessible volume, is quenched on\ncontact with nearby amino acids (PET), and — with FRET enabled — transfers to\nan acceptor.\n\n## What to set\n1. **Structure** — a PDB/CIF file or a four-character RCSB ID, and the residue\n the dye is attached to.\n2. **Dye** — linker length, width and dye radius define the accessible volume.\n3. **Simulation** — the unquenched lifetime, the diffusion coefficient and how\n long to simulate. `t_step` must resolve the fastest motion; the defaults are\n measured, not guessed.\n4. **Quenching** — per-residue quenching rates and contact radii. Editing a row\n changes the chemistry for that amino acid only.\n5. **FRET** — enable it, place the acceptor, and give R₀ **in Ångström**.\n\n## What comes out\nQuantum yield and mean lifetime, the donor (and FRET) decay, the dye\ntrajectory, and its autocorrelation.\n\nEverything in this form is one QuEst *project*. **Save project** writes exactly\nthe JSON the command line (`quest simulate project.json`) and the web UI read,\nso a run started here can be finished anywhere.\n", + "autoform.missing": "QuEst's desktop form is rendered by ChiSurf's AutoForm, which could not be imported.\n\nInstall ChiSurf, or point CHISURF_ROOT at a checkout.\n\nThe command line (`quest simulate project.json`) and the web UI do not need it.", + "web.language": "Language", + "web.run": "Run simulation", + "web.running": "Simulating…", + "web.results": "Results", + "web.project": "Project", + "web.quantum_yield": "Quantum yield", + "web.lifetime": "Mean lifetime", + "web.efficiency": "FRET efficiency", + "doc.title": "QuEst parameters reference", + "doc.summary": "Catalog summary", + "doc.generated": "This page is generated from {sources}. Update those first when changing parameter help text — the web UI, this page and the desktop form all read them.", + "doc.col.key": "Key", + "doc.col.category": "Category", + "doc.col.type": "Type", + "doc.col.unit": "Unit", + "doc.col.description": "Description", + "doc.label": "Label", + "doc.type": "Type", + "doc.unit": "Unit", + "table.kQ": "kQ (1/ns)", + "table.radius": "Radius (Å)", + "table.atoms": "Atoms", + "table.slow_factor": "Slow factor", + "web.tab.labeling": "1 - Labeling", + "web.tab.simulation": "2 - Simulation", + "web.tab.scan": "3 - Scan", + "web.tab.advanced": "4 - Adv. Settings", + "web.card.runs": "Simulation runs", + "web.card.settings": "Simulation settings", + "web.card.scan_settings": "Scan settings", + "web.card.derived": "Derived quantities", + "web.tagline": "Upload a structure, choose a labeling site, run quenching/FRET simulation." + } +} diff --git a/quest/settings/locales/fr.json b/quest/settings/locales/fr.json new file mode 100644 index 0000000..fc8404d --- /dev/null +++ b/quest/settings/locales/fr.json @@ -0,0 +1,265 @@ +{ + "locale": "fr", + "name": "Français", + "catalog.title": "Catalogue des paramètres QuEst", + "catalog.description": "Descriptions de référence des paramètres utilisés par la ligne de commande, les réglages par défaut et l'interface web.", + "categories": { + "Structure": "Structure", + "Labeling site": "Site de marquage", + "Accessible volume": "Volume accessible", + "Simulation": "Simulation", + "Quenching": "Extinction", + "FRET Acceptor": "Accepteur FRET", + "Advanced": "Avancé" + }, + "parameters": { + "pdb": { + "label": "Fichier de structure", + "description": "Chemin du fichier de structure (PDB/CIF), ou identifiant RCSB PDB à quatre caractères, utilisé pour le calcul du volume accessible." + }, + "attachment.chain": { + "label": "Chaîne d'attache", + "description": "Identifiant de chaîne du résidu sur lequel le fluorophore est attaché." + }, + "attachment.residue": { + "label": "Résidu d'attache", + "description": "Numéro de séquence du résidu sur lequel le fluorophore est attaché." + }, + "attachment.atom": { + "label": "Atome d'attache", + "description": "Nom de l'atome (par ex. CB, CA) servant de point d'attache au fluorophore." + }, + "av_parameter.linker_length": { + "label": "Longueur du bras espaceur", + "description": "Distance maximale entre le point d'attache et le centre du fluorophore." + }, + "av_parameter.linker_width": { + "label": "Largeur du bras espaceur", + "description": "Largeur du bras espaceur qui retient le fluorophore." + }, + "av_parameter.radius1": { + "label": "Rayon du fluorophore", + "description": "Rayon d'exclusion représentant le fluorophore comme une sphère (approximation à une sphère)." + }, + "dg": { + "label": "Résolution de la grille", + "description": "Résolution de la grille utilisée pour calculer le volume accessible (AV) et l'espace de diffusion." + }, + "tau0": { + "label": "Durée de vie non éteinte", + "description": "Durée de vie de fluorescence du donneur en l'absence d'extinction." + }, + "fret.dyes.0.D": { + "label": "Coefficient de diffusion du donneur", + "description": "Coefficient de diffusion du donneur en solution, hors interaction avec la surface de la protéine." + }, + "critical_distance": { + "label": "Rayon de contact par défaut", + "description": "Rayon de contact employé par les types de résidus qui ne définissent pas leur propre quench_radius. Il se mesure du centre du fluorophore au centre d'extinction du résidu et doit donc dépasser le rayon du fluorophore augmenté du contact de van der Waals (typiquement 7 à 9 Å pour un fluorophore de 3,5 Å)." + }, + "t_max": { + "label": "Durée de simulation", + "description": "Durée totale de la trajectoire de dynamique brownienne simulée." + }, + "t_step": { + "label": "Pas de temps", + "description": "Pas de temps du calcul de la trajectoire de dynamique brownienne." + }, + "n_photons": { + "label": "Photons simulés", + "description": "Nombre de photons d'excitation simulés pour reconstruire l'histogramme de déclin de fluorescence." + }, + "n_bins": { + "label": "Canaux du déclin", + "description": "Nombre de canaux temporels de l'histogramme de déclin produit." + }, + "parallel_trajectories": { + "label": "Trajectoires parallèles", + "description": "Nombre de trajectoires browniennes indépendantes calculées simultanément et réunies avant l'échantillonnage des photons. −1 utilise tous les cœurs du processeur, dans la limite de 8." + }, + "slow_radius": { + "label": "Rayon de ralentissement", + "description": "Rayon autour de chaque centre d'acide aminé de la protéine entière à l'intérieur duquel ce type de résidu applique son slow_factor à la grille des coefficients de diffusion." + }, + "save_avs": { + "label": "Enregistrer les fichiers AV", + "description": "Indique si les grilles de volume accessible calculées sont enregistrées au format XYZ." + }, + "output_file": { + "label": "Préfixe des fichiers de sortie", + "description": "Préfixe de nom employé pour enregistrer les résultats, les trajectoires et les déclins." + }, + "skip_frame": { + "label": "Images de trajectoire ignorées", + "description": "Facteur de sous-échantillonnage lors de l'écriture des images de trajectoire dans les fichiers de coordonnées." + }, + "fret.enabled": { + "label": "FRET activé", + "description": "Indique si un accepteur FRET est simulé afin de calculer l'efficacité de FRET et les courbes de déclin." + }, + "fret.R0_matrix": { + "label": "Rayon de Förster", + "description": "Rayon de Förster R0 du couple donneur–accepteur, en ångströms comme toute autre longueur du projet. Il est stocké dans la case donneur→accepteur de fret.R0_matrix ; le taux de transfert varie en (R0/r)^6, si bien qu'une saisie en nanomètres fait disparaître le FRET. Les couples xanthènes usuels se situent entre 45 et 65 Å." + }, + "fret.dyes.1.attachment.chain": { + "label": "Chaîne de l'accepteur", + "description": "Identifiant de chaîne du résidu sur lequel l'accepteur FRET est attaché." + }, + "fret.dyes.1.attachment.residue": { + "label": "Résidu de l'accepteur", + "description": "Numéro de séquence du résidu sur lequel l'accepteur FRET est attaché." + }, + "fret.dyes.1.attachment.atom": { + "label": "Atome de l'accepteur", + "description": "Nom de l'atome sur lequel l'accepteur FRET est attaché." + }, + "fret.dyes.1.av_parameter.linker_length": { + "label": "Longueur du bras de l'accepteur", + "description": "Distance maximale entre le point d'attache et le centre de l'accepteur FRET." + }, + "fret.dyes.1.av_parameter.linker_width": { + "label": "Largeur du bras de l'accepteur", + "description": "Largeur du bras espaceur qui retient l'accepteur FRET." + }, + "fret.dyes.1.av_parameter.radius1": { + "label": "Rayon de l'accepteur", + "description": "Rayon d'exclusion représentant l'accepteur FRET comme une sphère." + }, + "fret.dyes.1.D": { + "label": "Coefficient de diffusion de l'accepteur", + "description": "Coefficient de diffusion de l'accepteur FRET hors interaction avec la surface de la protéine." + }, + "amino_acid_interactions": { + "label": "Interactions avec les acides aminés", + "description": "Table d'interaction par type de résidu. Chaque entrée contient slow_factor (0–1, mesure du ralentissement du fluorophore par le résidu), kQ (taux d'extinction en 1/ns appliqué au contact), quench_radius (rayon de contact en ångströms depuis le centre du fluorophore ; null hérite de critical_distance) et quench_atoms (noms des atomes dont le barycentre définit le centre d'extinction). Par défaut, seuls les résidus à chaîne latérale rédox-active éteignent la fluorescence : TRP, TYR, MET, HIS, CYS et PRO." + }, + "amino_acid_interactions.kQ": { + "label": "Taux d'extinction kQ", + "description": "Taux auquel ce type de résidu éteint le fluorophore tant que les deux sont en contact. Les contributions des résidus dont les sphères de contact se recouvrent s'additionnent." + }, + "amino_acid_interactions.quench_radius": { + "label": "Rayon de contact", + "description": "Distance entre le centre du fluorophore et le centre d'extinction de ce résidu en deçà de laquelle l'extinction se produit. Laisser vide pour hériter du critical_distance du projet." + }, + "amino_acid_interactions.quench_atoms": { + "label": "Atomes du centre d'extinction", + "description": "Noms des atomes dont le barycentre définit le centre d'extinction de ce résidu. Les valeurs par défaut suivent le groupement rédox-actif qui assure le transfert d'électron photo-induit : le cycle indole pour TRP, le cycle phénol pour TYR, le cycle imidazole pour HIS, SD pour MET et SG pour CYS — et non CB." + }, + "amino_acid_interactions.slow_factor": { + "label": "Facteur de ralentissement", + "description": "Facteur compris entre 0 et 1 qui met à l'échelle le coefficient de diffusion du fluorophore au voisinage de ce type de résidu, modélisant une adhérence non spécifique. Les résidus qui se recouvrent multiplient leurs facteurs." + }, + "coarse_grained": { + "label": "Structure gros grains", + "description": "Réduit la structure au squelette et aux CB avant la simulation, chaque CB étant déplacé au centre de masse de sa chaîne latérale. Les atomes de chaîne latérale sont alors absents : le centre d'extinction de chaque résidu se rabat sur ce pseudo-atome CB, et le volume accessible augmente puisque les chaînes latérales ne l'obstruent plus. C'est un choix de modélisation, non une optimisation : le coût de QuEst tient à la grille du volume accessible, pas au nombre d'atomes." + }, + "random_seed": { + "label": "Graine aléatoire", + "description": "Graine de la simulation Monte-Carlo. Lorsqu'elle est fixée, la trajectoire de diffusion et le tirage des photons sont tous deux initialisés : deux exécutions du même projet reproduisent exactement le même déclin et le même rendement quantique. Sans graine, chaque exécution est indépendante et le tirage des photons emploie un noyau multithread plus rapide." + }, + "fret.acceptor_dynamics": { + "label": "Dynamique de l'accepteur", + "description": "Traitement de l'accepteur : « trajectory » simule sa marche brownienne avec son propre coefficient de diffusion et sa propre adhérence, et utilise la distance donneur-accepteur instantanée ; « averaged » moyenne sur son volume accessible statique (limite de l'accepteur rapide, valable seulement s'il parcourt ce volume rapidement devant la durée de vie du donneur). Les deux diffèrent parce qu'un nuage est pondéré uniformément alors qu'une trajectoire l'est par les endroits où le fluorophore séjourne." + }, + "fret.dyes.1.slow_radius": { + "label": "Rayon de ralentissement de l'accepteur", + "description": "Rayon autour de chaque centre d'acide aminé à l'intérieur duquel ce résidu ralentit l'accepteur. Distinct de celui du donneur : une cyanine et une rhodamine n'adhèrent pas de la même façon à une surface protéique. Par défaut, la valeur du donneur." + }, + "fret.dyes.1.amino_acid_interactions": { + "label": "Interactions de l'accepteur", + "description": "Table d'interaction par type de résidu pour l'accepteur, de même forme que l'amino_acid_interactions du donneur. Seul slow_factor est utilisé, car QuEst rapporte le déclin du donneur : l'extinction PET propre à l'accepteur modifierait sa brillance, pas celle du donneur. Par défaut, la table du donneur." + } + }, + "ui": { + "app.title": "QuEst", + "app.subtitle": "Estimateur d'extinction", + "panel.structure": "Structure", + "panel.dye": "Fluorophore", + "panel.simulation": "Simulation", + "panel.quenching": "Extinction", + "panel.fret": "FRET", + "panel.advanced": "Avancé", + "dock.project": "Projet", + "dock.structure": "Structure", + "dock.results": "Résultats", + "field.state": "État", + "field.state.description": "Résultat de la dernière simulation.", + "status.idle": "Pas encore simulé.", + "status.running": "Simulation en cours…", + "status.failed": "Échec : {error}", + "status.saved": "{name} enregistré", + "status.loaded": "{name} chargé", + "table.residue": "Résidu", + "table.residue.description": "Code d'acide aminé à trois lettres.", + "plot.decay.title": "Déclin de fluorescence", + "plot.decay.x": "Temps (ns)", + "plot.decay.y": "Coups", + "plot.decay.description": "Déclin du donneur et, si le FRET est activé, déclin éteint par FRET.", + "plot.decay.donor": "Donneur", + "plot.decay.fret": "FRET", + "plot.trajectory.title": "Trajectoire du fluorophore", + "plot.trajectory.x": "Temps (ns)", + "plot.trajectory.y": "|r − ⟨r⟩| (Å)", + "plot.trajectory.description": "Distance du fluorophore à sa position moyenne — l'étendue qu'il explore réellement.", + "plot.autocorrelation.title": "Autocorrélation de la position", + "plot.autocorrelation.x": "Décalage (ns)", + "plot.autocorrelation.y": "FAC", + "plot.autocorrelation.description": "Vitesse à laquelle le fluorophore oublie sa position ; détermine si l'extinction est limitée par la diffusion ou par le contact.", + "button.simulate": "▶ Simuler", + "button.simulate.description": "Exécuter le projet courant via quest.api.", + "button.load_project": "📂 Charger un projet…", + "button.load_project.description": "Lire un projet QuEst au format JSON, quelle qu'en soit l'origine.", + "button.save_project": "💾 Enregistrer le projet…", + "button.save_project.description": "Écrire le formulaire au format projet JSON — le fichier que lisent la ligne de commande et l'interface web.", + "dialog.save_project": "Enregistrer le projet QuEst", + "dialog.load_project": "Charger un projet QuEst", + "dialog.open_structure": "Ouvrir une structure", + "filter.project": "Projet QuEst (*.json)", + "filter.structures": "Structures (*.pdb *.cif *.mmcif)", + "filter.all": "Tous les fichiers (*)", + "menu.file": "&Fichier", + "menu.help": "&Aide", + "menu.load_structure": "Charger une structure…", + "menu.save_project": "Enregistrer le projet…", + "menu.load_project": "Charger un projet…", + "menu.exit": "Quitter", + "menu.about": "À propos / Citation…", + "about.title": "À propos de QuEst", + "about.cite": "Si vous utilisez QuEst dans une publication scientifique, merci de citer :", + "help.title": "QuEst — aide", + "help.text": "# QuEst — déclin transitoire d'un fluorophore attaché\n\nPrédit le déclin de fluorescence d'un fluorophore porté par un bras flexible à\npartir de la seule structure : le fluorophore diffuse dans son volume\naccessible, s'éteint au contact des acides aminés voisins (PET) et — si le FRET\nest activé — transfère son énergie à un accepteur.\n\n## Ce qu'il faut régler\n1. **Structure** — un fichier PDB/CIF ou un identifiant RCSB à quatre\n caractères, et le résidu portant le fluorophore.\n2. **Fluorophore** — longueur et largeur du bras espaceur et rayon du\n fluorophore définissent le volume accessible.\n3. **Simulation** — durée de vie non éteinte, coefficient de diffusion et durée\n à simuler. `t_step` doit résoudre le mouvement le plus rapide ; les valeurs\n par défaut sont mesurées, non devinées.\n4. **Extinction** — taux d'extinction et rayons de contact par résidu. Modifier\n une ligne ne change la chimie que de cet acide aminé.\n5. **FRET** — l'activer, placer l'accepteur et donner R₀ **en ångströms**.\n\n## Ce qui en sort\nRendement quantique et durée de vie moyenne, déclin du donneur (et du FRET), la\ntrajectoire du fluorophore et son autocorrélation.\n\nTout ce formulaire constitue un unique *projet* QuEst. **Enregistrer le projet**\nécrit exactement le JSON que lisent la ligne de commande\n(`quest simulate project.json`) et l'interface web : un calcul commencé ici peut\nêtre terminé ailleurs.\n", + "autoform.missing": "Le formulaire de bureau de QuEst est rendu par AutoForm de ChiSurf, qui n'a pas pu être importé.\n\nInstallez ChiSurf, ou faites pointer CHISURF_ROOT vers une copie de travail.\n\nLa ligne de commande (`quest simulate project.json`) et l'interface web n'en ont pas besoin.", + "web.language": "Langue", + "web.run": "Lancer la simulation", + "web.running": "Simulation en cours…", + "web.results": "Résultats", + "web.project": "Projet", + "web.quantum_yield": "Rendement quantique", + "web.lifetime": "Durée de vie moyenne", + "web.efficiency": "Efficacité de FRET", + "doc.title": "Référence des paramètres QuEst", + "doc.summary": "Résumé du catalogue", + "doc.generated": "Cette page est générée à partir de {sources}. Modifiez-les d'abord pour changer le texte d'aide d'un paramètre — l'interface web, cette page et le formulaire de bureau lisent les mêmes fichiers.", + "doc.col.key": "Clé", + "doc.col.category": "Catégorie", + "doc.col.type": "Type", + "doc.col.unit": "Unité", + "doc.col.description": "Description", + "doc.label": "Libellé", + "doc.type": "Type", + "doc.unit": "Unité", + "table.kQ": "kQ (1/ns)", + "table.radius": "Rayon (Å)", + "table.atoms": "Atomes", + "table.slow_factor": "Facteur", + "web.tab.labeling": "1 – Marquage", + "web.tab.simulation": "2 – Simulation", + "web.tab.scan": "3 – Balayage", + "web.tab.advanced": "4 – Avancé", + "web.card.runs": "Exécutions", + "web.card.settings": "Paramètres de simulation", + "web.card.scan_settings": "Paramètres du balayage", + "web.card.derived": "Grandeurs dérivées", + "web.tagline": "Chargez une structure, choisissez un site de marquage, lancez la simulation d'extinction/FRET." + } +} diff --git a/quest/settings/parameter_catalog.json b/quest/settings/parameter_catalog.json new file mode 100644 index 0000000..42a46f0 --- /dev/null +++ b/quest/settings/parameter_catalog.json @@ -0,0 +1,264 @@ +{ + "version": 1, + "title": "QuEst parameter catalog", + "description": "Canonical descriptions for parameters exposed by the command line workflows, default settings, and web UI.", + "documentation_path": "/doc/parameters.md", + "parameters": { + "pdb": { + "label": "Structure file", + "category": "Structure", + "type": "file", + "description": "Path to the structure file (PDB/CIF), or a bare four-character RCSB PDB ID used for AV calculation." + }, + "attachment.chain": { + "label": "Attachment chain", + "category": "Labeling site", + "type": "text", + "description": "Chain identifier of the amino acid residue where the dye is tethered." + }, + "attachment.residue": { + "label": "Attachment residue", + "category": "Labeling site", + "type": "integer", + "description": "Residue sequence number of the amino acid where the dye is tethered." + }, + "attachment.atom": { + "label": "Attachment atom", + "category": "Labeling site", + "type": "text", + "description": "Atom name (e.g., CB, CA) used as the tethering point for the dye." + }, + "av_parameter.linker_length": { + "label": "Linker length", + "category": "Accessible volume", + "type": "number", + "unit": "Å", + "description": "Maximum distance from attachment point to the center of the dye." + }, + "av_parameter.linker_width": { + "label": "Linker width", + "category": "Accessible volume", + "type": "number", + "unit": "Å", + "description": "Width of the linker tethering the dye." + }, + "av_parameter.radius1": { + "label": "Dye radius", + "category": "Accessible volume", + "type": "number", + "unit": "Å", + "description": "Exclusion radius representing the dye sphere (single-sphere approximation)." + }, + "dg": { + "label": "Grid resolution", + "category": "Accessible volume", + "type": "number", + "unit": "Å", + "description": "Grid resolution used to compute the accessible volume (AV) and diffusion search space." + }, + "tau0": { + "label": "Unquenched lifetime", + "category": "Simulation", + "type": "number", + "unit": "ns", + "description": "Fluorescence lifetime of the donor dye in the absence of quenching." + }, + "fret.dyes.0.D": { + "label": "Donor diffusion coefficient", + "category": "Simulation", + "type": "number", + "unit": "Ų/ns", + "description": "Diffusion coefficient of the donor dye in solution, when not interacting with the protein surface." + }, + "critical_distance": { + "label": "Fallback contact radius", + "category": "Quenching", + "type": "number", + "unit": "Å", + "description": "Contact radius used by residue types that do not define their own quench_radius. It is measured from the dye centre to the residue's quenching centre, so it must exceed the dye radius plus van der Waals contact (typically 7-9 A for a 3.5 A dye)." + }, + "t_max": { + "label": "Simulation time", + "category": "Simulation", + "type": "number", + "unit": "ns", + "description": "Total length of the simulated Brownian dynamics trajectory." + }, + "t_step": { + "label": "Time step", + "category": "Simulation", + "type": "number", + "unit": "ns", + "description": "Time step size for the Brownian dynamics trajectory calculation." + }, + "n_photons": { + "label": "Simulated photons", + "category": "Simulation", + "type": "integer", + "description": "Number of excitation photons simulated to reconstruct the fluorescence decay histogram." + }, + "n_bins": { + "label": "Decay bins", + "category": "Simulation", + "type": "integer", + "description": "Number of time channels/bins used to construct the output decay histogram." + }, + "parallel_trajectories": { + "label": "Parallel trajectories", + "category": "Advanced", + "type": "integer", + "description": "Number of independent Brownian dynamics trajectories run concurrently and combined before photon sampling. Use -1 to use all CPU cores, capped at 8." + }, + "slow_radius": { + "label": "Slowing radius", + "category": "Advanced", + "type": "number", + "unit": "Å", + "description": "Radius around each whole-protein amino-acid center where that residue type contributes its slow_factor to the diffusion coefficient grid." + }, + "save_avs": { + "label": "Save AV files", + "category": "Advanced", + "type": "boolean", + "description": "Whether to save the calculated accessible volume grids as XYZ files." + }, + "output_file": { + "label": "Output file prefix", + "category": "Advanced", + "type": "text", + "description": "Base filename prefix used when saving simulation outputs, trajectories, and decays." + }, + "skip_frame": { + "label": "Trajectory skip frames", + "category": "Advanced", + "type": "integer", + "description": "Subsampling factor for writing trajectory frames to coordinates files." + }, + "fret.enabled": { + "label": "FRET enabled", + "category": "FRET Acceptor", + "type": "boolean", + "description": "Whether a FRET acceptor dye is simulated to compute FRET efficiency and decay curves." + }, + "fret.R0_matrix": { + "label": "Förster radius", + "category": "FRET Acceptor", + "type": "number", + "unit": "Å", + "description": "Förster radius R0 of the donor–acceptor pair, in Ångström like every other length in a project. Stored as the donor→acceptor cell of fret.R0_matrix; the transfer rate scales as (R0/r)^6, so entering nanometres makes FRET vanish. Typical xanthene pairs are 45–65 Å." + }, + "fret.dyes.1.attachment.chain": { + "label": "Acceptor chain", + "category": "FRET Acceptor", + "type": "text", + "description": "Chain identifier of the residue where the FRET acceptor dye is attached." + }, + "fret.dyes.1.attachment.residue": { + "label": "Acceptor residue", + "category": "FRET Acceptor", + "type": "integer", + "description": "Residue sequence number where the FRET acceptor dye is attached." + }, + "fret.dyes.1.attachment.atom": { + "label": "Acceptor atom", + "category": "FRET Acceptor", + "type": "text", + "description": "Atom name where the FRET acceptor dye is attached." + }, + "fret.dyes.1.av_parameter.linker_length": { + "label": "Acceptor linker length", + "category": "FRET Acceptor", + "type": "number", + "unit": "Å", + "description": "Maximum distance from attachment point to the center of the FRET acceptor dye." + }, + "fret.dyes.1.av_parameter.linker_width": { + "label": "Acceptor linker width", + "category": "FRET Acceptor", + "type": "number", + "unit": "Å", + "description": "Width of the linker tethering the FRET acceptor dye." + }, + "fret.dyes.1.av_parameter.radius1": { + "label": "Acceptor dye radius", + "category": "FRET Acceptor", + "type": "number", + "unit": "Å", + "description": "Exclusion radius representing the FRET acceptor dye sphere." + }, + "fret.dyes.1.D": { + "label": "Acceptor diffusion coefficient", + "category": "FRET Acceptor", + "type": "number", + "unit": "Ų/ns", + "description": "Diffusion coefficient of the FRET acceptor dye when not interacting with the protein surface." + }, + "amino_acid_interactions": { + "label": "Amino-acid interactions", + "category": "Quenching", + "type": "table", + "description": "Per-residue-type interaction table. Each entry holds slow_factor (0-1, how much the residue slows the diffusing dye), kQ (quenching rate in 1/ns applied on contact), quench_radius (contact radius in Angstrom from the dye centre; null inherits critical_distance) and quench_atoms (atom names whose centroid defines the quenching centre). Only residues with a redox-active side chain quench by default: TRP, TYR, MET, HIS, CYS and PRO." + }, + "amino_acid_interactions.kQ": { + "label": "Quenching rate kQ", + "category": "Quenching", + "type": "number", + "unit": "1/ns", + "description": "Rate at which this residue type quenches the dye while the two are in contact. Contributions from residues whose contact spheres overlap add up." + }, + "amino_acid_interactions.quench_radius": { + "label": "Contact radius", + "category": "Quenching", + "type": "number", + "unit": "Å", + "description": "Distance from the dye centre to this residue's quenching centre within which quenching occurs. Leave empty to inherit the project-wide critical_distance." + }, + "amino_acid_interactions.quench_atoms": { + "label": "Quenching centre atoms", + "category": "Quenching", + "type": "list", + "description": "Atom names whose centroid defines this residue's quenching centre. The defaults follow the redox-active moiety that mediates photo-induced electron transfer: the indole ring for TRP, the phenol ring for TYR, the imidazole ring for HIS, SD for MET and SG for CYS - not CB." + }, + "amino_acid_interactions.slow_factor": { + "label": "Slow factor", + "category": "Quenching", + "type": "number", + "description": "Factor between 0 and 1 scaling the dye's diffusion coefficient near this residue type, modelling unspecific stickiness. Overlapping residues multiply their factors." + }, + "coarse_grained": { + "label": "Coarse-grained structure", + "category": "Simulation", + "type": "boolean", + "description": "Reduce the structure to backbone plus CB before simulating, with CB moved to the side-chain centre of mass. Side-chain atoms are then absent, so every residue's quenching centre falls back to that CB pseudo-atom, and the accessible volume grows because side chains no longer block it. This is a modelling choice, not a speed optimisation: QuEst's cost is dominated by the AV grid rather than the atom count." + }, + "random_seed": { + "label": "Random seed", + "category": "Advanced", + "type": "integer", + "description": "Seed for the Monte-Carlo simulation. When set, both the diffusion trajectory and the photon trace are seeded, so repeated runs of the same project reproduce the same decay and quantum yield exactly. Leave unset for an independent random run; the photon trace then uses a faster multi-threaded kernel." + }, + "fret.acceptor_dynamics": { + "label": "Acceptor dynamics", + "category": "FRET Acceptor", + "type": "choice", + "description": "How the acceptor is treated: 'trajectory' simulates its Brownian walk with its own diffusion coefficient and stickiness and uses the instantaneous donor-acceptor distance, 'averaged' averages over its static accessible volume (the fast-acceptor limit, valid only when it explores that volume quickly compared with the donor lifetime). The two disagree because a cloud is weighted uniformly while a trajectory is weighted by where the dye dwells.", + "options": [ + "trajectory", + "averaged" + ] + }, + "fret.dyes.1.slow_radius": { + "label": "Acceptor slowing radius", + "category": "FRET Acceptor", + "type": "number", + "unit": "Å", + "description": "Radius around each amino-acid centre within which that residue slows the acceptor. Separate from the donor's: a cyanine and a rhodamine do not adhere to a protein surface in the same way. Defaults to the donor's value." + }, + "fret.dyes.1.amino_acid_interactions": { + "label": "Acceptor interactions", + "category": "FRET Acceptor", + "type": "table", + "description": "Per-residue-type interaction table for the acceptor, same shape as the donor's amino_acid_interactions. Only slow_factor is used, since QuEst reports the donor's decay and the acceptor's own PET quenching would change how bright the acceptor is, not the donor. Defaults to the donor's table." + } + } +} diff --git a/tests/test_i18n.py b/tests/test_i18n.py new file mode 100644 index 0000000..19736b1 --- /dev/null +++ b/tests/test_i18n.py @@ -0,0 +1,304 @@ +"""Translations are shared by every surface, so they are tested in one place. + +QuEst describes each parameter once, in the catalog; the locale files translate +that one description. The desktop form, `doc/parameters..md` and the web +API are all generated from the result — so what these tests protect is the +property that makes that work: **a translation is complete, structurally +identical to English, and never changes what the software computes.** + +No Qt and no browser: locale files are data. +""" + +from __future__ import annotations + +import json + +import pytest + +from quest import i18n +from quest.settings import parameter_catalog + +CATALOG_PATHS = set(parameter_catalog()["parameters"]) +TRANSLATED = sorted(code for code in i18n.available_locales() if code != i18n.DEFAULT_LOCALE) + + +def test_the_expected_languages_are_there() -> None: + assert {"en", "de", "fr"} <= set(i18n.available_locales()) + + +def test_languages_name_themselves() -> None: + """A picker that says "German" is unreadable to the reader who needs it.""" + names = i18n.available_locales() + assert names["de"] == "Deutsch" + assert names["fr"] == "Français" + assert names["en"] == "English" + + +class TestResolvingALocale: + @pytest.mark.parametrize( + "value,expected", + [ + ("de", "de"), + ("de_DE.UTF-8", "de"), + ("fr-CA", "fr"), + ("DE", "de"), + ("cs_CZ", "en"), + ("", "en"), + (None, None), + ], + ) + def test_it_normalizes_and_falls_back(self, value, expected, monkeypatch) -> None: + monkeypatch.delenv(i18n.LOCALE_ENV_VAR, raising=False) + if expected is None: # None means "whatever the system says" — just valid + assert i18n.resolve_locale(value) in i18n.available_locales() + else: + assert i18n.resolve_locale(value) == expected + + def test_the_environment_variable_is_honoured(self, monkeypatch) -> None: + monkeypatch.setenv(i18n.LOCALE_ENV_VAR, "fr") + assert i18n.resolve_locale() == "fr" + + def test_an_explicit_argument_wins(self, monkeypatch) -> None: + monkeypatch.setenv(i18n.LOCALE_ENV_VAR, "fr") + assert i18n.resolve_locale("de") == "de" + + def test_an_unknown_language_is_not_an_error(self, monkeypatch) -> None: + """`LANG=cs_CZ` should start QuEst, not make it explain itself.""" + monkeypatch.setenv(i18n.LOCALE_ENV_VAR, "cs") + assert i18n.resolve_locale() == "en" + + +class TestEveryTranslationIsComplete: + """A half-translated form is worse than an English one: it looks broken.""" + + @pytest.mark.parametrize("code", TRANSLATED) + def test_all_parameters_are_translated(self, code: str) -> None: + translated = set(i18n.locale_data(code).get("parameters", {})) + missing = CATALOG_PATHS - translated + assert not missing, f"{code}: untranslated parameters {sorted(missing)}" + + @pytest.mark.parametrize("code", TRANSLATED) + def test_no_parameter_is_invented(self, code: str) -> None: + translated = set(i18n.locale_data(code).get("parameters", {})) + extra = translated - CATALOG_PATHS + assert not extra, f"{code}: translations for unknown parameters {sorted(extra)}" + + @pytest.mark.parametrize("code", TRANSLATED) + def test_every_entry_has_both_fields(self, code: str) -> None: + for path, entry in i18n.locale_data(code).get("parameters", {}).items(): + assert entry.get("label"), f"{code}/{path}: no label" + assert entry.get("description"), f"{code}/{path}: no description" + + @pytest.mark.parametrize("code", TRANSLATED) + def test_all_ui_strings_are_translated(self, code: str) -> None: + english = set(i18n.locale_data(i18n.DEFAULT_LOCALE)["ui"]) + translated = set(i18n.locale_data(code).get("ui", {})) + assert not english - translated, f"{code}: missing {sorted(english - translated)}" + assert not translated - english, f"{code}: unknown {sorted(translated - english)}" + + @pytest.mark.parametrize("code", TRANSLATED) + def test_all_categories_are_translated(self, code: str) -> None: + categories = { + entry["category"] for entry in parameter_catalog()["parameters"].values() + } + translated = set(i18n.locale_data(code).get("categories", {})) + assert not categories - translated, sorted(categories - translated) + + @pytest.mark.parametrize("code", TRANSLATED) + def test_placeholders_survive_translation(self, code: str) -> None: + """`{name}` renamed to `{Name}` is a crash at the moment it is shown.""" + import re + + english = i18n.locale_data(i18n.DEFAULT_LOCALE)["ui"] + translated = i18n.locale_data(code)["ui"] + for key, source in english.items(): + expected = set(re.findall(r"\{(\w+)\}", source)) + actual = set(re.findall(r"\{(\w+)\}", translated.get(key, ""))) + assert expected == actual, f"{code}/{key}: {expected} vs {actual}" + + +class TestTranslatingTheCatalog: + def test_english_is_the_catalog_itself(self) -> None: + catalog = i18n.translate_catalog("en") + assert catalog["parameters"] == parameter_catalog()["parameters"] + + def test_a_translation_replaces_the_text(self) -> None: + german = i18n.translate_catalog("de")["parameters"]["tau0"] + assert german["label"] == "Ungelöschte Lebensdauer" + assert "Fluoreszenzlebensdauer" in german["description"] + + def test_the_structure_never_changes(self) -> None: + """Only text is translated. Types, units and keys are the model.""" + english = parameter_catalog()["parameters"] + for code in TRANSLATED: + translated = i18n.translate_catalog(code)["parameters"] + assert set(translated) == set(english) + for path, entry in translated.items(): + assert entry.get("type") == english[path].get("type"), path + assert entry.get("unit") == english[path].get("unit"), path + assert entry.get("category") == english[path].get("category"), path + + def test_it_does_not_mutate_the_shared_catalog(self) -> None: + i18n.translate_catalog("de") + assert parameter_catalog()["parameters"]["tau0"]["label"] == "Unquenched lifetime" + + def test_an_unknown_language_returns_english(self) -> None: + assert i18n.translate_catalog("cs")["parameters"]["tau0"]["label"] == ( + "Unquenched lifetime" + ) + + +class TestUiStrings: + def test_they_fall_back_to_english_key_by_key(self, tmp_path, monkeypatch) -> None: + """A partial translation is useful; it must not be an error.""" + monkeypatch.setattr(i18n, "LOCALES_DIR", tmp_path) + (tmp_path / "en.json").write_text( + json.dumps({"locale": "en", "name": "English", + "ui": {"a": "Alpha", "b": "Beta"}}), + encoding="utf8", + ) + (tmp_path / "xx.json").write_text( + json.dumps({"locale": "xx", "name": "Test", "ui": {"a": "Alfa"}}), + encoding="utf8", + ) + i18n.clear_cache() + try: + strings = i18n.ui_strings("xx") + assert strings["a"] == "Alfa" + assert strings["b"] == "Beta", "an untranslated key must keep its English" + finally: + i18n.clear_cache() + + def test_an_unknown_key_returns_itself(self) -> None: + assert i18n.ui("no.such.key", "de") == "no.such.key" + + def test_a_broken_locale_file_is_skipped(self, tmp_path, monkeypatch) -> None: + monkeypatch.setattr(i18n, "LOCALES_DIR", tmp_path) + (tmp_path / "en.json").write_text('{"locale": "en", "name": "English", "ui": {}}', + encoding="utf8") + (tmp_path / "zz.json").write_text("{ not json", encoding="utf8") + i18n.clear_cache() + try: + assert "zz" not in i18n.available_locales() + finally: + i18n.clear_cache() + + +class TestTheScienceIsNotTranslated: + """Language changes what a user reads, never what QuEst computes.""" + + def test_the_project_is_identical_in_every_language(self) -> None: + from quest.gui.form_model import ProjectFormModel + + projects = [ProjectFormModel(locale=code).to_project_dict() + for code in ("en", "de", "fr")] + assert projects[0] == projects[1] == projects[2] + + def test_units_stay_in_their_symbols(self) -> None: + """Å is Å in every language; a translated unit would be a bug.""" + for code in TRANSLATED: + parameters = i18n.translate_catalog(code)["parameters"] + assert parameters["fret.R0_matrix"]["unit"] == "Å" + assert parameters["tau0"]["unit"] == "ns" + + def test_project_keys_are_never_translated(self) -> None: + """Descriptions name real keys (`critical_distance`); those must survive.""" + german = i18n.translate_catalog("de")["parameters"] + assert "critical_distance" in german["amino_acid_interactions.quench_radius"][ + "description" + ] + assert "slow_factor" in german["amino_acid_interactions"]["description"] + + +class TestTheServiceLayerServesLanguages: + def test_it_lists_them(self) -> None: + from quest.backend.services import local_client + + response = local_client().call("quest.locales", {}) + assert response["ok"] + assert set(response["result"]["available"]) >= {"en", "de", "fr"} + assert response["result"]["strings"]["button.simulate"] + + def test_it_translates_the_catalog(self) -> None: + from quest.backend.services import local_client + + response = local_client().call("quest.parameter_catalog", {"locale": "fr"}) + assert response["ok"] + assert response["result"]["parameters"]["tau0"]["label"] == ( + "Durée de vie non éteinte" + ) + + def test_no_locale_means_english_not_the_servers_language(self, monkeypatch) -> None: + """A shared backend must not answer in whatever the host is set to.""" + from quest.backend.services import local_client + + monkeypatch.setenv(i18n.LOCALE_ENV_VAR, "de") + i18n.clear_cache() + try: + response = local_client().call("quest.parameter_catalog", {}) + assert response["result"]["parameters"]["tau0"]["label"] == ( + "Unquenched lifetime" + ) + finally: + i18n.clear_cache() + + def test_the_manifest_declares_the_locale_parameter(self) -> None: + from pathlib import Path + + manifest = json.loads( + (Path(__file__).resolve().parents[1] / "quest" / "manifest.json").read_text( + encoding="utf8" + ) + ) + methods = {entry["name"]: entry for entry in manifest["rpc_methods"]} + assert "locale" in methods["quest.parameter_catalog"]["params_schema"][ + "properties" + ] + assert "quest.locales" in methods + + +class TestTheSystemLanguage: + """Read from the environment, not `locale.getdefaultlocale()`. + + That function is deprecated and slated for removal in Python 3.15, and + `locale.getlocale()` is not a substitute — it reports the *current* locale, + which is `(None, None)` until something calls `setlocale`. + """ + + def test_it_reads_the_environment(self, monkeypatch) -> None: + for name in i18n.SYSTEM_LOCALE_ENV_VARS: + monkeypatch.delenv(name, raising=False) + monkeypatch.setenv("LANG", "de_DE.UTF-8") + assert i18n.system_locale() == "de_DE.UTF-8" + monkeypatch.delenv(i18n.LOCALE_ENV_VAR, raising=False) + assert i18n.resolve_locale() == "de" + + def test_the_c_locale_means_no_preference(self, monkeypatch) -> None: + """`LANG=C` asks for no localisation at all, not for a language.""" + for name in i18n.SYSTEM_LOCALE_ENV_VARS: + monkeypatch.delenv(name, raising=False) + monkeypatch.setenv("LANG", "C") + assert i18n.system_locale() is None + monkeypatch.delenv(i18n.LOCALE_ENV_VAR, raising=False) + assert i18n.resolve_locale() == "en" + + def test_the_most_specific_variable_wins(self, monkeypatch) -> None: + for name in i18n.SYSTEM_LOCALE_ENV_VARS: + monkeypatch.delenv(name, raising=False) + monkeypatch.setenv("LANG", "de_DE.UTF-8") + monkeypatch.setenv("LC_ALL", "fr_FR.UTF-8") + assert i18n.system_locale() == "fr_FR.UTF-8" + + def test_a_preference_list_takes_its_first_entry(self, monkeypatch) -> None: + for name in i18n.SYSTEM_LOCALE_ENV_VARS: + monkeypatch.delenv(name, raising=False) + monkeypatch.setenv("LANGUAGE", "fr:de:en") + assert i18n.system_locale() == "fr" + + def test_no_deprecated_locale_call_remains(self) -> None: + from pathlib import Path + + source = (Path(i18n.__file__)).read_text(encoding="utf8") + assert "getdefaultlocale" not in source.replace( + "locale.getdefaultlocale()`, which is deprecated", "" + ) From 790dc1d1ea57039cb7a2c743daa4253b976bd4d8 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 19:00:58 +0200 Subject: [PATCH 07/86] gui: generate the Qt form from the catalog instead of carrying .ui files Every .ui file is gone. The desktop form is quest/gui/quest.view.json, generated from the parameter catalog by generate_view_spec.py and rendered by ChiSurf's AutoForm, with de/fr spec variants produced from the same locale files as the docs. Adding a parameter to the catalog therefore adds it to the form; it can no longer be forgotten there. The form is bound to ProjectFormModel, whose state *is* a project dict. That is the point of the rewrite: the GUI edits the same document the CLI loads, so the two cannot drift the way they did when the GUI shipped its own quenching chemistry. chisurf_host.py reaches a ChiSurf checkout to borrow AutoForm. Where ChiSurf is absent QuEst still runs on the in-tree fallback, and nothing outside quest.gui imports it - Qt stays an optional dependency, which is what lets the CLI, the API and the web backend run in environments with no Qt binding at all. This removes the last of quest/lib/: the widget layer, the plot classes, the Qt resource module and the icon .qrc. The window icon survives as a plain .ico file. Note for running the tests: -p no:pytest-qt is required only where there is no Qt binding, because the plugin aborts collection there. In an environment that has one the flag is harmful - it removes the qtbot fixture these tests need. --- quest/chisurf_host.py | 68 + quest/gui/__init__.py | 44 + quest/gui/app.py | 89 + quest/gui/autoform_panel.py | 99 ++ quest/gui/dye_widget.py | 142 ++ quest/gui/form_model.py | 479 +++++ quest/gui/generate_view_spec.py | 371 ++++ quest/{lib/ui => gui}/icons/dye-diffusion.ico | Bin quest/gui/quest.view.de.json | 469 +++++ quest/gui/quest.view.fr.json | 469 +++++ quest/gui/quest.view.json | 469 +++++ quest/lib/fps/avWidget.ui | 151 -- quest/lib/pdb_widget.ui | 82 - quest/lib/plots/MolView.py | 415 ----- quest/lib/plots/__init__.py | 3 - quest/lib/plots/lineplot.py | 195 --- quest/lib/plots/plotbase.py | 34 - quest/lib/plots/ui/__init__.py | 0 quest/lib/plots/ui/linePlotWidget.ui | 123 -- quest/lib/plots/ui/molViewControlWidget.ui | 501 ------ .../lib/tools/dye_diffusion/dye_diffusion2.ui | 929 ---------- quest/lib/ui/__init__.py | 0 quest/lib/ui/av_property.ui | 231 --- quest/lib/ui/dye_diffusion.ui | 848 --------- quest/lib/ui/dye_diffusion3.ui | 885 ---------- quest/lib/ui/icons/__init__.py | 0 quest/lib/ui/rescource.qrc | 5 - quest/lib/ui/rescource_rc.py | 1533 ----------------- quest/lib/widgets.py | 133 -- quest/quest_gui.py | 53 - tests/test_chisurf_autoform.py | 119 ++ tests/test_form_model.py | 252 +++ tests/test_gui_simulation.py | 306 ++++ tests/test_gui_widget.py | 199 +++ tests/test_view_spec.py | 180 ++ 35 files changed, 3755 insertions(+), 6121 deletions(-) create mode 100644 quest/chisurf_host.py create mode 100644 quest/gui/__init__.py create mode 100644 quest/gui/app.py create mode 100644 quest/gui/autoform_panel.py create mode 100644 quest/gui/dye_widget.py create mode 100644 quest/gui/form_model.py create mode 100644 quest/gui/generate_view_spec.py rename quest/{lib/ui => gui}/icons/dye-diffusion.ico (100%) create mode 100644 quest/gui/quest.view.de.json create mode 100644 quest/gui/quest.view.fr.json create mode 100644 quest/gui/quest.view.json delete mode 100644 quest/lib/fps/avWidget.ui delete mode 100644 quest/lib/pdb_widget.ui delete mode 100644 quest/lib/plots/MolView.py delete mode 100644 quest/lib/plots/__init__.py delete mode 100644 quest/lib/plots/lineplot.py delete mode 100644 quest/lib/plots/plotbase.py delete mode 100644 quest/lib/plots/ui/__init__.py delete mode 100644 quest/lib/plots/ui/linePlotWidget.ui delete mode 100644 quest/lib/plots/ui/molViewControlWidget.ui delete mode 100644 quest/lib/tools/dye_diffusion/dye_diffusion2.ui delete mode 100644 quest/lib/ui/__init__.py delete mode 100644 quest/lib/ui/av_property.ui delete mode 100644 quest/lib/ui/dye_diffusion.ui delete mode 100644 quest/lib/ui/dye_diffusion3.ui delete mode 100644 quest/lib/ui/icons/__init__.py delete mode 100644 quest/lib/ui/rescource.qrc delete mode 100644 quest/lib/ui/rescource_rc.py delete mode 100644 quest/lib/widgets.py delete mode 100644 quest/quest_gui.py create mode 100644 tests/test_chisurf_autoform.py create mode 100644 tests/test_form_model.py create mode 100644 tests/test_gui_simulation.py create mode 100644 tests/test_gui_widget.py create mode 100644 tests/test_view_spec.py diff --git a/quest/chisurf_host.py b/quest/chisurf_host.py new file mode 100644 index 0000000..a3bb570 --- /dev/null +++ b/quest/chisurf_host.py @@ -0,0 +1,68 @@ +"""Reach a ChiSurf checkout, so QuEst can borrow the host's UI machinery. + +QuEst is a ChiSurf plugin as well as a standalone application. Where ChiSurf is +importable, its **AutoForm** renders a control panel straight from QuEst's own +`manifest.json` RPC declarations — the same JSON a host reads to learn what +QuEst offers — instead of QuEst hand-building Qt widgets or carrying `.ui` +files. That is the deduplication: one declaration, rendered by the host. + +Where ChiSurf is absent, QuEst still runs: the in-tree form remains the +fallback, and nothing outside :mod:`quest.gui` imports this module. + +Like :mod:`quest.imp_tricks`, this works from a **source checkout** rather than +an install, because that is what is under active development. +""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +__all__ = ["DEFAULT_CHISURF_ROOT", "chisurf_root", "enable_chisurf", "autoform_available"] + +#: Where the checkout is expected when nothing says otherwise. +DEFAULT_CHISURF_ROOT = Path.home() / "dev" / "chisurf" + + +def chisurf_root(path: Path | str | None = None) -> Path | None: + """Return the ChiSurf checkout root, or ``None`` if there is none. + + Resolution order: the *path* argument, ``CHISURF_ROOT``, then + :data:`DEFAULT_CHISURF_ROOT`. + """ + + candidate = path or os.environ.get("CHISURF_ROOT") or DEFAULT_CHISURF_ROOT + resolved = Path(candidate).expanduser() + if (resolved / "chisurf" / "__init__.py").exists(): + return resolved + return None + + +def enable_chisurf(path: Path | str | None = None) -> bool: + """Put a ChiSurf checkout on ``sys.path``. Returns whether one was found. + + Never raises and never overrides an already-imported ChiSurf: a host + application that loaded QuEst as a plugin is already running its own copy, + and replacing it mid-flight would be worse than doing nothing. + """ + + if "chisurf" in sys.modules: + return True + root = chisurf_root(path) + if root is None: + return False + if str(root) not in sys.path: + sys.path.insert(0, str(root)) + return True + + +def autoform_available() -> bool: + """Whether ChiSurf's AutoForm can be imported (after :func:`enable_chisurf`).""" + + enable_chisurf() + try: # pragma: no cover - depends on the checkout + from chisurf.gui.autoform.auto_form import AutoForm # noqa: F401 + except Exception: + return False + return True diff --git a/quest/gui/__init__.py b/quest/gui/__init__.py new file mode 100644 index 0000000..6dd4ce4 --- /dev/null +++ b/quest/gui/__init__.py @@ -0,0 +1,44 @@ +"""QuEst's desktop presentation layer. + +The Qt widgets live here, but the *description* of the form does not: the view +spec (`quest.view.json`) and the model it binds to (:mod:`quest.gui.form_model`) +are plain data and plain Python. Importing them costs nothing and needs no +display, which is why they are importable from this package without a Qt +binding — `from quest.gui.form_model import ProjectFormModel` works in the web +environment, and its tests run there. + +The widgets are resolved lazily on first access, so `import quest.gui` alone +still does not pull in Qt. +""" + +from __future__ import annotations + +__all__ = [ + "TransientDecayGenerator", + "MODEL_ARGUMENT_SOURCES", + "ProjectFormModel", + "start_gui", +] + +#: Attribute → module that defines it. Only the Qt-bearing ones are deferred. +_LAZY = { + "start_gui": ".app", + "TransientDecayGenerator": ".dye_widget", + "MODEL_ARGUMENT_SOURCES": ".dye_widget", +} + + +def __getattr__(name: str): + module_name = _LAZY.get(name) + if module_name is None: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + from importlib import import_module + + return getattr(import_module(module_name, __name__), name) + + +def __dir__(): + return sorted(__all__) + + +from .form_model import ProjectFormModel # noqa: E402 (Qt-free, import eagerly) diff --git a/quest/gui/app.py b/quest/gui/app.py new file mode 100644 index 0000000..fe52def --- /dev/null +++ b/quest/gui/app.py @@ -0,0 +1,89 @@ +"""The standalone desktop application. + +QuEst is normally a ChiSurf plugin; this is the same widget in a window of its +own, for people who do not run ChiSurf. The menu bar is the only thing the +plugin does not provide. +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +from qtpy import QtGui, QtWidgets + +from ..i18n import resolve_locale, ui +from .dye_widget import TransientDecayGenerator + +__all__ = ["ICON_PATH", "CITATION", "QuEstWindow", "start_gui"] + +#: The window icon. All that survived the Qt resource module (`rescource_rc.py`, +#: 98 kB of generated base64) — one file loaded from disk needs no build step. +ICON_PATH = Path(__file__).resolve().parent / "icons" / "dye-diffusion.ico" + +#: The reference itself is not translated — a citation is copied verbatim into a +#: manuscript, so changing it per language would be wrong. +CITATION = ( + "

Combining Graphical and Analytical Methods with Molecular Simulations " + "To Analyze Time-Resolved FRET Measurements of Labeled Macromolecules " + "Accurately.
" + "Peulen, T.O., Opanasyuk, O., and Seidel, C.A.M., 2017.
" + "The Journal of Physical Chemistry B 121 (35), 8211–8241.
" + "DOI:
" + "10.1021/acs.jpcb.7b03441

" +) + + +class QuEstWindow(QtWidgets.QMainWindow): + """A window around :class:`TransientDecayGenerator`.""" + + def __init__(self, parent=None, locale: str | None = None) -> None: + super().__init__(parent) + self.locale = resolve_locale(locale) + self.dg = TransientDecayGenerator(locale=self.locale) + self.setCentralWidget(self.dg) + self.setWindowTitle(self._t("app.title")) + if ICON_PATH.is_file(): + self.setWindowIcon(QtGui.QIcon(str(ICON_PATH))) + self.resize(1400, 900) + self._create_menus() + + def _t(self, key: str) -> str: + return ui(key, self.locale) + + def _create_menus(self) -> None: + file_menu = self.menuBar().addMenu(self._t("menu.file")) + file_menu.addAction(self._t("menu.load_structure")).triggered.connect( + self.dg.onLoadPDB + ) + file_menu.addSeparator() + file_menu.addAction(self._t("menu.save_project")).triggered.connect( + self.dg.onSaveProject + ) + file_menu.addAction(self._t("menu.load_project")).triggered.connect( + self.dg.onLoadProject + ) + file_menu.addSeparator() + file_menu.addAction(self._t("menu.exit")).triggered.connect(self.close) + + help_menu = self.menuBar().addMenu(self._t("menu.help")) + help_menu.addAction(self._t("menu.about")).triggered.connect(self._show_about) + + def _show_about(self) -> None: + body = ( + f"

{self._t('app.title')} — {self._t('app.subtitle')}

" + f"

{self._t('about.cite')}

{CITATION}" + ) + QtWidgets.QMessageBox.about(self, self._t("about.title"), body) + + +def start_gui() -> int: + """Entry point for `quest gui` and the `cs.quest` script.""" + app = QtWidgets.QApplication.instance() or QtWidgets.QApplication(sys.argv) + window = QuEstWindow() + window.show() + return app.exec_() + + +if __name__ == "__main__": # pragma: no cover + sys.exit(start_gui()) diff --git a/quest/gui/autoform_panel.py b/quest/gui/autoform_panel.py new file mode 100644 index 0000000..f68b52b --- /dev/null +++ b/quest/gui/autoform_panel.py @@ -0,0 +1,99 @@ +"""Control panels rendered by the host, from QuEst's manifest. + +The step that removes the `.ui` files: instead of hand-building Qt forms, ask +ChiSurf's AutoForm to render the `rpc_methods` declarations QuEst already ships +in `quest/manifest.json`. One declaration serves the host, the RPC surface and +the UI. + +`build_method_panel("quest.simulate")` returns a bound form whose values come +back as a plain params dict — exactly what +:func:`quest.backend.services.simulate_handler` takes, so the panel and the +service cannot drift apart. + +Nothing here is required: where ChiSurf is absent :func:`autoform_supported` +is false and the in-tree form remains. +""" + +from __future__ import annotations + +import json +from functools import lru_cache +from pathlib import Path +from typing import Any + +__all__ = [ + "MANIFEST_PATH", + "autoform_supported", + "method_declaration", + "declared_methods", + "build_method_panel", +] + +MANIFEST_PATH = Path(__file__).resolve().parents[1] / "manifest.json" + + +@lru_cache(maxsize=1) +def _manifest() -> dict[str, Any]: + with MANIFEST_PATH.open("r", encoding="utf8") as handle: + return json.load(handle) + + +def declared_methods() -> list[str]: + """Names of the RPC methods the manifest declares, in declaration order.""" + return [method["name"] for method in _manifest()["rpc_methods"]] + + +def method_declaration(name: str) -> dict[str, Any]: + """Return one `rpc_methods` entry. + + Raises + ------ + KeyError + If the manifest does not declare *name* — which is a manifest bug, not + a caller bug, so it fails loudly. + """ + for method in _manifest()["rpc_methods"]: + if method["name"] == name: + return method + raise KeyError(f"manifest declares no method named {name!r}") + + +def autoform_supported() -> bool: + """Whether the host's AutoForm can be reached from here.""" + from ..chisurf_host import autoform_available + + return autoform_available() + + +def build_method_panel(name: str, parent=None, **kwargs): + """Render the parameter form for one declared method. + + Parameters + ---------- + name : str + An RPC method name, e.g. ``"quest.simulate"``. + parent : QWidget, optional + **kwargs + Forwarded to AutoForm (``values``, ``on_change``, ``title``). + + Returns + ------- + QWidget + A bound form; read the entered values with ``form.model.params()``. + + Raises + ------ + RuntimeError + If ChiSurf is not reachable. The caller should check + :func:`autoform_supported` and fall back to the in-tree form. + """ + if not autoform_supported(): + raise RuntimeError( + "AutoForm needs a ChiSurf checkout; set CHISURF_ROOT or use the " + "in-tree form." + ) + + from chisurf.gui.autoform.auto_form import AutoForm + + kwargs.setdefault("title", name) + return AutoForm.from_rpc_method(method_declaration(name), parent=parent, **kwargs) diff --git a/quest/gui/dye_widget.py b/quest/gui/dye_widget.py new file mode 100644 index 0000000..3c3a793 --- /dev/null +++ b/quest/gui/dye_widget.py @@ -0,0 +1,142 @@ +"""QuEst's desktop form. + +There is almost nothing here, and that is the point. The form's *layout* is +`quest.view.json`, generated from the parameter catalog; its *state* is a +:class:`~quest.gui.form_model.ProjectFormModel`, which is a QuEst project dict; +its *physics* is `quest.api`, the same service layer the CLI and the web backend +call. This module only does what none of those can: put an AutoForm in a widget, +and connect the three menu actions a host application expects. + +What it replaced +---------------- +A 1,899-line widget that loaded `dye_diffusion2.ui`, kept the state in ~40 Qt +controls, and converted them to a project dict and back by hand. Both directions +were hand-written, which is precisely where the GUI drifted away from the CLI +before — it once shipped an entirely different quenching chemistry. Here there +is no conversion step to drift: the controls are bound to the project itself. + +`TransientDecayGenerator` keeps the name and the three `on*` slots because +ChiSurf's `quenching_estimator` plugin and QuEst's own menu bar call them. +""" + +from __future__ import annotations + +from pathlib import Path + +from qtpy import QtWidgets + +from ..i18n import ui +from .form_model import ProjectFormModel + +__all__ = ["TransientDecayGenerator"] + +# Reach the host the same way everything else in QuEst does, so a plain +# `python -m quest.gui` finds ChiSurf without the caller setting PYTHONPATH. +try: + from ..chisurf_host import enable_chisurf + + enable_chisurf() +except Exception: # pragma: no cover - never fatal; QuEst runs standalone + pass + + +class TransientDecayGenerator(QtWidgets.QWidget): + """The QuEst form: an AutoForm over a project. + + Parameters + ---------- + parent : QWidget, optional + project : dict, optional + Initial project. Defaults to :func:`quest.project.template_project`. + locale : str, optional + Language of the form. Defaults to :func:`quest.i18n.resolve_locale`. + + Attributes + ---------- + model : ProjectFormModel + The state. `model.project` is a QuEst project dict at all times. + form : QWidget or None + The rendered AutoForm; None when ChiSurf is unavailable. + """ + + def __init__( + self, parent=None, project: dict | None = None, locale: str | None = None + ) -> None: + super().__init__(parent) + self.model = ProjectFormModel(project, locale=locale) + self.form = None + + layout = QtWidgets.QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + + try: + from chisurf.gui.autoform.auto_form import AutoForm + + self.form = AutoForm(self.model) + layout.addWidget(self.form) + except Exception as error: # pragma: no cover - needs a host-less Qt env + # QuEst's Qt surface is rendered by the host's AutoForm; there is no + # second, in-tree renderer to fall back to, and saying so beats an + # empty window. + hint = ui("autoform.missing", self.model.locale) + label = QtWidgets.QLabel(f"{hint}\n\n({error})") + label.setWordWrap(True) + label.setAlignment(QtWidgets.Qt.AlignmentFlag.AlignCenter) + layout.addWidget(label) + + def _t(self, key: str) -> str: + return ui(key, self.model.locale) + + # -- the project, in and out ------------------------------------------- + + def to_project_dict(self) -> dict: + """The current project — the same JSON the CLI and web UI consume.""" + return self.model.to_project_dict() + + def load_project_dict(self, project: dict) -> None: + """Replace the state, then redraw the controls to match.""" + self.model.load_project_dict(project) + self.refresh() + + def refresh(self) -> None: + """Re-read the model into the controls, the plots and the 3D view.""" + if self.form is None: + return + self.form.sync_fields() + self.form.refresh_plots() + + # -- menu actions ------------------------------------------------------ + # + # A host's menu bar connects to these; the form's own toolbar calls the + # model methods directly. Both end in the same place. + + def onLoadPDB(self) -> str | None: + """Pick a structure. Also the only way to fill the 3D view.""" + path, _ = QtWidgets.QFileDialog.getOpenFileName( + self, + self._t("dialog.open_structure"), + "", + f"{self._t('filter.structures')};;{self._t('filter.all')}", + ) + if not path: + return None + self.model.pdb = path + self.model.status = self._t("status.loaded").format(name=Path(path).name) + self.refresh() + return path + + def onSaveProject(self): + result = self.model.save_project_dialog() + self.refresh() + return result + + def onLoadProject(self): + result = self.model.load_project_dialog() + self.refresh() + return result + + def update_all(self): + """Simulate, then show the result. The toolbar's ▶ button in method form.""" + result = self.model.run_simulation() + self.refresh() + return result diff --git a/quest/gui/form_model.py b/quest/gui/form_model.py new file mode 100644 index 0000000..6d27759 --- /dev/null +++ b/quest/gui/form_model.py @@ -0,0 +1,479 @@ +"""The form's state is the project, and nothing else. + +QuEst already has one description of every input: `quest/settings/parameter_catalog.json` +names each field by its **path in the project dict** (`av_parameter.linker_length`, +`fret.dyes.1.attachment.chain`) and carries its label, type and help text. The +docs are generated from it and the web UI reads it. This module makes the Qt +form read it too, by exposing a project dict as a flat set of attributes that +ChiSurf's AutoForm can bind to. + +That removes the thing the `.ui` files existed to do — and it removes a whole +class of bug with them. The old widget kept its state in ~40 Qt controls and +converted to a project dict on the way out (`to_project_dict`) and back on the +way in (`load_project_dict`); the two directions were written by hand, and the +conversion is exactly where the GUI drifted away from the CLI before. Here there +is no conversion: :attr:`ProjectFormModel.project` *is* the state, so what the +GUI saves is byte-for-byte a project the CLI and the web UI accept. + +Field names +----------- +Attribute names are the catalog paths, shortened where the path is long enough +to hurt (`av_parameter.` → `av_`, `fret.dyes.0.` → `donor_`, `fret.dyes.1.` → +`acceptor_`). :data:`FIELD_PATHS` is that map, and +`tests/test_form_model.py` fails if the catalog grows a parameter the map does +not cover — so a new input cannot appear in the docs and quietly miss the form. + +Nothing here imports Qt. The model is testable, and usable, without a display. +""" + +from __future__ import annotations + +import copy +import json +from collections import OrderedDict +from pathlib import Path +from typing import Any, Iterable + +from ..project import ( + DEFAULT_FORSTER_RADIUS, + ProjectValidationError, + template_project, + validate_project, +) +from ..i18n import resolve_locale, translate_catalog, ui + +__all__ = [ + "FIELD_PATHS", + "NON_SCALAR_PARAMETERS", + "QUENCHER_COLUMNS", + "ProjectFormModel", +] + +#: Attribute name → path in the project dict. Every scalar the catalog +#: documents appears here; the order is the order the catalog lists them, which +#: is also the order the form shows them. +FIELD_PATHS: "OrderedDict[str, str]" = OrderedDict( + ( + ("pdb", "pdb"), + ("attachment_chain", "attachment.chain"), + ("attachment_residue", "attachment.residue"), + ("attachment_atom", "attachment.atom"), + ("av_linker_length", "av_parameter.linker_length"), + ("av_linker_width", "av_parameter.linker_width"), + ("av_radius1", "av_parameter.radius1"), + ("dg", "dg"), + ("tau0", "tau0"), + ("donor_D", "fret.dyes.0.D"), + ("critical_distance", "critical_distance"), + ("t_max", "t_max"), + ("t_step", "t_step"), + ("n_photons", "n_photons"), + ("n_bins", "n_bins"), + ("parallel_trajectories", "parallel_trajectories"), + ("slow_radius", "slow_radius"), + ("save_avs", "save_avs"), + ("output_file", "output_file"), + ("skip_frame", "skip_frame"), + ("coarse_grained", "coarse_grained"), + ("random_seed", "random_seed"), + ("fret_enabled", "fret.enabled"), + ("acceptor_chain", "fret.dyes.1.attachment.chain"), + ("acceptor_residue", "fret.dyes.1.attachment.residue"), + ("acceptor_atom", "fret.dyes.1.attachment.atom"), + ("acceptor_linker_length", "fret.dyes.1.av_parameter.linker_length"), + ("acceptor_linker_width", "fret.dyes.1.av_parameter.linker_width"), + ("acceptor_radius1", "fret.dyes.1.av_parameter.radius1"), + ("acceptor_D", "fret.dyes.1.D"), + ("acceptor_slow_radius", "fret.dyes.1.slow_radius"), + ("acceptor_dynamics", "fret.acceptor_dynamics"), + ) +) + +#: Catalog entries that are *not* a scalar field, and where they live instead. +#: Listed so the sync test can tell "deliberately not a spin box" from "someone +#: added a parameter and forgot the form". +NON_SCALAR_PARAMETERS = { + "fret.R0_matrix": "the fret_R0 property — a 2-dye matrix is one number", + "amino_acid_interactions": "the quencher table", + "amino_acid_interactions.kQ": "quencher table column", + "amino_acid_interactions.quench_radius": "quencher table column", + "amino_acid_interactions.quench_atoms": "quencher table column", + "amino_acid_interactions.slow_factor": "quencher table column", + # The acceptor's own chemistry. Only `slow_factor` is read (QuEst reports + # the donor's decay), and it defaults to the donor's table, so it is not + # worth a second 20-row grid in the form until someone needs to edit it. + "fret.dyes.1.amino_acid_interactions": "defaults to the donor's table", +} + +#: Columns of the quencher table, in display order. `key` is also the key in the +#: per-residue `amino_acid_interactions` entry, except `residue` (the map key). +QUENCHER_COLUMNS = ("residue", "kQ", "quench_radius", "quench_atoms", "slow_factor") + + +def _get_path(mapping: Any, path: str) -> Any: + """Read a dotted path; integer-looking parts index into sequences.""" + node = mapping + for part in path.split("."): + if node is None: + return None + if isinstance(node, (list, tuple)): + index = int(part) + node = node[index] if -len(node) <= index < len(node) else None + else: + node = node.get(part) + return node + + +def _set_path(mapping: Any, path: str, value: Any) -> None: + """Write a dotted path, creating the intermediate dicts it needs. + + A missing *list* element is an error rather than something to create: the + dye list has a fixed meaning (0 = donor, 1 = acceptor) and silently growing + it would produce a project that validates but simulates something else. + """ + parts = path.split(".") + node = mapping + for part in parts[:-1]: + if isinstance(node, (list, tuple)): + node = node[int(part)] + else: + if part not in node or not isinstance(node[part], (dict, list)): + node[part] = OrderedDict() + node = node[part] + last = parts[-1] + if isinstance(node, (list, tuple)): + node[int(last)] = value + else: + node[last] = value + + +class ProjectFormModel: + """A project dict presented as flat attributes, for AutoForm to bind to. + + Parameters + ---------- + project : dict, optional + The project to edit. Copied, never aliased — editing a form must not + mutate a caller's dict behind its back. Defaults to + :func:`quest.project.template_project`. + locale : str, optional + Language for labels, help and status text. Defaults to + :func:`quest.i18n.resolve_locale` — `QUEST_LOCALE`, else the operating + system's language, else English. Only presentation changes; the project + the form produces is identical in every language. + + Examples + -------- + >>> model = ProjectFormModel() + >>> model.tau0 = 3.5 + >>> model.project["tau0"] + 3.5 + """ + + def __init__(self, project: dict | None = None, locale: str | None = None) -> None: + # Bypass __setattr__: the field machinery needs _project to exist first. + object.__setattr__(self, "_project", copy.deepcopy(project or template_project())) + object.__setattr__(self, "_listeners", []) + object.__setattr__(self, "locale", resolve_locale(locale)) + #: The last :class:`~quest.core.DecaySimulationResult`, or None. + self.results = None + #: One line of human-readable state, shown read-only in the form. + self.status = self._t("status.idle") + + # -- AutoForm plumbing -------------------------------------------------- + + def _t(self, key: str) -> str: + """One UI string in this model's language.""" + return ui(key, self.locale) + + def view_spec(self): + """The generated view spec for this model's language.""" + from chisurf.core.dataspec import load_view_spec + + from .generate_view_spec import view_spec_path + + path = view_spec_path(self.locale) + if not path.is_file(): + # A locale whose spec was never generated still gets a form, in + # English, rather than a traceback. + path = view_spec_path() + return load_view_spec(path) + + def set_changed_callback(self, callback) -> None: + """AutoForm's hook: it wants to know when the model changed.""" + self.add_listener(callback) + + # -- the flat attribute surface --------------------------------------- + + def __getattr__(self, name: str) -> Any: + # Only reached for attributes not found normally, so real methods and + # properties keep working. + path = FIELD_PATHS.get(name) + if path is None: + raise AttributeError(name) + return _get_path(self._project, path) + + def __setattr__(self, name: str, value: Any) -> None: + path = FIELD_PATHS.get(name) + if path is None: + object.__setattr__(self, name, value) + return + _set_path(self._project, path, value) + self._notify() + + def __dir__(self) -> Iterable[str]: + return sorted(set(super().__dir__()) | set(FIELD_PATHS)) + + # -- the project ------------------------------------------------------ + + @property + def project(self) -> dict: + """The live project dict. Editing it edits the form.""" + return self._project + + def to_project_dict(self) -> dict: + """A copy of the project, safe to hand to the service layer.""" + return copy.deepcopy(self._project) + + def load_project_dict(self, project: dict) -> None: + """Replace the whole state with *project*.""" + object.__setattr__(self, "_project", copy.deepcopy(project)) + self._notify() + + def validate(self) -> list[str]: + """Problems with the current project; empty when it is simulatable.""" + try: + validate_project(self._project) + except ProjectValidationError as error: + return [str(error)] + return [] + + # -- FRET: one number, stored as a matrix ----------------------------- + + @property + def fret_R0(self) -> float: + """Förster radius in **Ångström** (`fret.R0_matrix[0][1]`). + + The project stores a full donor/acceptor matrix because there may one + day be more than two dyes. With two there is a single off-diagonal + number, and showing a 2×2 grid of which half is `null` helps nobody. + """ + value = _get_path(self._project, "fret.R0_matrix.0.1") + return DEFAULT_FORSTER_RADIUS if value is None else float(value) + + @fret_R0.setter + def fret_R0(self, value: float) -> None: + r0 = float(value) + _set_path(self._project, "fret.R0_matrix", [[None, r0], [r0, None]]) + self._notify() + + # -- the quencher table ------------------------------------------------ + + def quencher_rows(self) -> list[dict]: + """One row per amino acid, for the table section. + + Only residues that actually quench are worth a row by default, but the + table shows all of them: which residues are *not* quenchers is part of + the model, and hiding them makes a zero look like an omission. + """ + interactions = self._project.get("amino_acid_interactions") or {} + rows = [] + for residue in sorted(interactions): + entry = interactions[residue] or {} + atoms = entry.get("quench_atoms") or [] + rows.append( + { + "residue": residue, + "kQ": entry.get("kQ", 0.0), + "quench_radius": entry.get("quench_radius"), + "quench_atoms": ", ".join(atoms), + "slow_factor": entry.get("slow_factor", 0.1), + } + ) + return rows + + def update_quencher_cell(self, row_index: int, column_key: str, value: Any) -> None: + """Write one edited cell back into `amino_acid_interactions`. + + Bad input is dropped rather than raising: the user is mid-typing, and a + traceback out of a cell editor is not a useful way to say "not a number". + """ + rows = self.quencher_rows() + if not 0 <= row_index < len(rows): + return + residue = rows[row_index]["residue"] + entry = self._project.setdefault("amino_acid_interactions", {}).setdefault( + residue, {} + ) + text = "" if value is None else str(value).strip() + if column_key == "quench_atoms": + entry["quench_atoms"] = [a.strip() for a in text.split(",") if a.strip()] + elif column_key == "quench_radius": + # Blank means "use the global critical distance", which is null in + # the schema — not zero, which would switch quenching off. + entry["quench_radius"] = None if not text else float(text) + elif column_key in ("kQ", "slow_factor"): + try: + entry[column_key] = float(text) + except ValueError: + return + else: + return + self._notify() + + # -- structure preview ------------------------------------------------- + + def preview_models(self) -> list[str]: + """Paths for the 3D viewer: the structure, when there is a readable one.""" + pdb = self._project.get("pdb") + if pdb and Path(str(pdb)).is_file(): + return [str(pdb)] + return [] + + # -- persistence: the saved file is a project --------------------------- + + def save_project(self, path: str | Path) -> Path: + """Write the state as project JSON — the CLI's and web UI's format.""" + destination = Path(path) + destination.write_text( + json.dumps(self._project, indent=2, default=str), encoding="utf8" + ) + return destination + + def load_project(self, path: str | Path) -> None: + """Read a project written by any surface.""" + with Path(path).open("r", encoding="utf8") as handle: + self.load_project_dict(json.load(handle)) + + # The two dialog actions are what the toolbar buttons call. Qt is imported + # inside them, not at module scope: only a click can reach this code, and + # the rest of the model must stay importable where there is no display. + + def save_project_dialog(self) -> Path | None: + from qtpy import QtWidgets + + path, _ = QtWidgets.QFileDialog.getSaveFileName( + None, + self._t("dialog.save_project"), + "project.json", + self._t("filter.project"), + ) + if not path: + return None + saved = self.save_project(path) + self.status = self._t("status.saved").format(name=saved.name) + self._notify() + return saved + + def load_project_dialog(self) -> Path | None: + from qtpy import QtWidgets + + path, _ = QtWidgets.QFileDialog.getOpenFileName( + None, + self._t("dialog.load_project"), + "", + f"{self._t('filter.project')};;{self._t('filter.all')}", + ) + if not path: + return None + self.load_project(path) + self.status = self._t("status.loaded").format(name=Path(path).name) + self._notify() + return Path(path) + + # -- running, and what came out ---------------------------------------- + + def run_simulation(self) -> Any: + """Simulate the current project through the service layer. + + The view-model calls `quest.api`, exactly as the CLI and the web + backend do — the form contributes no physics of its own. That is the + rule the GUI broke before, when it shipped its own quenching chemistry. + + Runs synchronously, so a long simulation blocks the form (`LAY-07`). + `save_outputs=False` keeps a GUI run from littering `jobs/` in whatever + directory the app happened to start in. + """ + from ..api import simulate_project + + self.status = self._t("status.running") + self._notify() + try: + self.results = simulate_project(self._project, save_outputs=False) + except Exception as error: + self.results = None + self.status = self._t("status.failed").format(error=error) + self._notify() + raise + self.status = self._describe(self.results) + self._notify() + return self.results + + @staticmethod + def _describe(result: Any) -> str: + parts = [ + f"QY = {result.quantum_yield_donor:.3f}", + f"⟨τ⟩ = {result.lifetime_donor:.2f} ns", + ] + if result.fret_efficiency is not None: + parts.append(f"E = {result.fret_efficiency:.3f}") + return " ".join(parts) + + def decay_series(self) -> list[dict]: + """Donor (and FRET) decay histograms, for the decay plot.""" + result = getattr(self, "results", None) + if result is None: + return [] + series = [ + {"x": result.time, "y": result.donor_counts, "name": self._t("plot.decay.donor")} + ] + if result.fret_counts is not None: + series.append( + {"x": result.time, "y": result.fret_counts, "name": self._t("plot.decay.fret")} + ) + return series + + def trajectory_series(self) -> list[dict]: + """Dye distance from the mean position over the trajectory.""" + result = getattr(self, "results", None) + if result is None or result.trajectory_time_ns is None: + return [] + return [ + { + "x": result.trajectory_time_ns, + "y": result.trajectory_distance_to_mean, + "name": "|r − ⟨r⟩|", + } + ] + + def autocorrelation_series(self) -> list[dict]: + """Autocorrelation of the dye position — how fast the dye forgets.""" + result = getattr(self, "results", None) + if result is None or result.trajectory_autocorr is None: + return [] + return [ + { + "x": result.trajectory_autocorr_lag_ns, + "y": result.trajectory_autocorr, + "name": "ACF", + } + ] + + # -- change notification ------------------------------------------------ + + def add_listener(self, callback) -> None: + """Call *callback* after any field changes (the form uses this to redraw).""" + self._listeners.append(callback) + + def _notify(self) -> None: + for callback in list(self._listeners): + try: + callback() + except Exception: # pragma: no cover - a bad listener must not + pass # take the form down mid-edit + + # -- help text, from the one place it is written ------------------------ + + def catalog_entry(self, path: str) -> dict: + """The catalog entry for a project path, in this model's language.""" + return dict(translate_catalog(self.locale).get("parameters", {}).get(path, {})) diff --git a/quest/gui/generate_view_spec.py b/quest/gui/generate_view_spec.py new file mode 100644 index 0000000..fe33d03 --- /dev/null +++ b/quest/gui/generate_view_spec.py @@ -0,0 +1,371 @@ +"""Generate `quest/gui/quest.view.json` from the parameter catalog. + +Same arrangement as `doc/generate_parameter_docs.py`: the catalog is written by +hand, everything derived from it is generated, and the generated file is +committed so it can be read and diffed. Never hand-edit `quest.view.json` — +edit `quest/settings/parameter_catalog.json` and run:: + + python -m quest.gui.generate_view_spec + +`tests/test_view_spec.py` regenerates in memory and fails if any committed file +differs, so they cannot drift. + +One spec is written per language: `quest.view.json` (English) plus +`quest.view..json` for every locale in `quest/settings/locales/`. The +parameter text comes from the translated catalog and the rest from +`quest.i18n.ui_strings`, so a translation reaches the desktop form, the docs and +the web UI from one place. + +What is generated: one panel per catalog *category*, one field per parameter, +with the catalog's label, type, unit and description. What is authored here: +the arrangement — which categories share a dock, where the structure viewer and +the plots go, and the toolbar. Those are judgements about a form, not facts +about a parameter, so they do not belong in the catalog. +""" + +from __future__ import annotations + +import json +from pathlib import Path +from typing import Any + +from ..i18n import DEFAULT_LOCALE, available_locales, translate_catalog, ui_strings +from .form_model import FIELD_PATHS + +__all__ = [ + "VIEW_SPEC_PATH", + "build_view_spec", + "view_spec_path", + "write_view_spec", + "write_all_view_specs", +] + +VIEW_SPEC_PATH = Path(__file__).resolve().parent / "quest.view.json" + + +def view_spec_path(locale: str = DEFAULT_LOCALE) -> Path: + """Where the spec for *locale* lives. English keeps the unsuffixed name.""" + if locale == DEFAULT_LOCALE: + return VIEW_SPEC_PATH + return VIEW_SPEC_PATH.with_name(f"quest.view.{locale}.json") + +#: Catalog path → attribute on :class:`~quest.gui.form_model.ProjectFormModel`. +_ATTR_BY_PATH = {path: attr for attr, path in FIELD_PATHS.items()} +_ATTR_BY_PATH["fret.R0_matrix"] = "fret_R0" + +#: Catalog ``type`` → AutoForm value ``kind``. +_KINDS = {"number": "float", "integer": "int", "text": "str", "file": "file"} + +#: Sensible editor bounds per catalog path. A spin box needs *some* range; the +#: physics does not always imply one, so where it does not this is a +#: usability choice, not a constraint the simulation enforces. +_RANGES: dict[str, tuple[float, float]] = { + "av_parameter.linker_length": (0.0, 200.0), + "av_parameter.linker_width": (0.0, 50.0), + "av_parameter.radius1": (0.0, 50.0), + "dg": (0.1, 5.0), + "tau0": (0.0, 1000.0), + "fret.dyes.0.D": (0.0, 1000.0), + "fret.dyes.1.D": (0.0, 1000.0), + "critical_distance": (0.0, 50.0), + "slow_radius": (0.0, 50.0), + "t_max": (0.0, 1e9), + "t_step": (1e-6, 1000.0), + "n_photons": (1, 2147483647), + "n_bins": (1, 65535), + "skip_frame": (1, 1000000), + "parallel_trajectories": (-1, 1024), + "random_seed": (0, 2147483647), + "attachment.residue": (-100000, 100000), + "fret.dyes.1.attachment.residue": (-100000, 100000), + "fret.R0_matrix": (0.0, 500.0), + "fret.dyes.1.av_parameter.linker_length": (0.0, 200.0), + "fret.dyes.1.av_parameter.linker_width": (0.0, 50.0), + "fret.dyes.1.av_parameter.radius1": (0.0, 50.0), +} + +#: Decimals for float editors that need more than the default 3. +_DECIMALS = {"t_step": 6, "dg": 3} + +#: Which catalog categories go in which panel of the left dock, in what order, +#: and under which translatable title. The first element is a stable key used in +#: the code; the visible title comes from `ui_strings`. +_PANELS: tuple[tuple[str, str, tuple[str, ...]], ...] = ( + ("structure", "panel.structure", ("Structure", "Labeling site")), + ("dye", "panel.dye", ("Accessible volume",)), + ("simulation", "panel.simulation", ("Simulation",)), + ("quenching", "panel.quenching", ("Quenching",)), + ("fret", "panel.fret", ("FRET Acceptor",)), + ("advanced", "panel.advanced", ("Advanced",)), +) + +#: Categories are laid out by :data:`_PANELS`; a parameter whose category is not +#: listed there would silently vanish from the form, so generation fails instead. +_LAID_OUT = {category for _, _, categories in _PANELS for category in categories} + +#: Not rendered as a field of their own: the quencher table owns the donor's +#: chemistry, and the acceptor's defaults to it (see NON_SCALAR_PARAMETERS in +#: `form_model.py`, which documents where each one actually lives). +_TABLE_PATHS = { + "fret.dyes.1.amino_acid_interactions", + "amino_acid_interactions", + "amino_acid_interactions.kQ", + "amino_acid_interactions.quench_radius", + "amino_acid_interactions.quench_atoms", + "amino_acid_interactions.slow_factor", +} + +def _field(path: str, entry: dict) -> dict[str, Any]: + """One value/toggle section for a catalog parameter.""" + attr = _ATTR_BY_PATH[path] + kind = entry.get("type", "text") + description = entry.get("description", "") + unit = entry.get("unit") + label = entry.get("label", path) + if unit: + label = f"{label} ({unit})" + + if kind == "boolean": + return {"type": "toggle", "attr": attr, "label": label, "description": description} + + if kind == "choice": + # A parameter with a fixed set of values gets a combo, not a text box + # someone can misspell. The values are the model's, so they are not + # translated — only the label and the help are. + return { + "type": "choice", + "attr": attr, + "label": label, + "description": description, + "options": list(entry.get("options", ())), + } + + section: dict[str, Any] = { + "type": "value", + "attr": attr, + "kind": _KINDS.get(kind, "str"), + "label": label, + "description": description, + } + bounds = _RANGES.get(path) + if bounds is not None: + section["minimum"], section["maximum"] = bounds + if path in _DECIMALS: + section["decimals"] = _DECIMALS[path] + return section + + + + +def _quencher_table(parameters: dict, strings: dict) -> dict[str, Any]: + """The per-residue chemistry table. Column help comes from the catalog.""" + + def column(key: str, label: str, width: int, path: str | None = None, + description: str = "") -> dict[str, Any]: + return { + "key": key, + "label": label, + "width": width, + "description": ( + parameters[path]["description"] if path else description + ), + } + + return { + "type": "table", + "source": "quencher_rows", + "editable": True, + "update_call": "update_quencher_cell", + "expand": True, + "height": 220, + "columns": [ + column( + "residue", + strings["table.residue"], + 80, + description=strings["table.residue.description"], + ), + # Table headers get their own short strings rather than the + # catalog's form labels. A column header has a column's worth of + # room, and "Löschrate kQ (1/ns)" does not fit in it — the full + # wording stays as the tooltip, which is where it is readable. + # The units are the model's, not the language's: kQ is 1/ns and the + # radius is Å in every locale. + column("kQ", strings["table.kQ"], 100, "amino_acid_interactions.kQ"), + column("quench_radius", strings["table.radius"], 100, + "amino_acid_interactions.quench_radius"), + column("quench_atoms", strings["table.atoms"], 200, + "amino_acid_interactions.quench_atoms"), + column("slow_factor", strings["table.slow_factor"], 90, + "amino_acid_interactions.slow_factor"), + ], + } + + +def _parameter_panels(parameters: dict, strings: dict) -> list[dict]: + unknown = { + entry.get("category") + for path, entry in parameters.items() + if path not in _TABLE_PATHS and entry.get("category") not in _LAID_OUT + } + if unknown: + raise ValueError( + f"parameter categories with no panel: {sorted(unknown)} — add them to " + "_PANELS, or they would not appear in the form at all" + ) + + panels = [] + for key, title_key, categories in _PANELS: + sections: list[dict] = [ + _field(path, entry) + for path, entry in parameters.items() + if path not in _TABLE_PATHS and entry.get("category") in categories + ] + if key == "quenching": + sections.append(_quencher_table(parameters, strings)) + + panels.append( + { + "type": "panel", + "title": strings[title_key], + # One column throughout: the parameter dock is narrow by default + # and QuEst's labels are long ("Donor diffusion coefficient + # (Ų/ns)"), so two columns clip the field the user is typing in. + # Translations are longer still — German more so than English. + "n_col": 1, + # Advanced starts folded — it is the panel nobody needs on the + # first run, and it is long enough to push FRET off the screen. + "collapsed": key == "advanced", + "sections": sections, + } + ) + return panels + + +def _plot(source: str, prefix: str, strings: dict, **extra: Any) -> dict[str, Any]: + section = { + "type": "plot", + "source": source, + "title": strings[f"{prefix}.title"], + "x_label": strings[f"{prefix}.x"], + "y_label": strings[f"{prefix}.y"], + "description": strings[f"{prefix}.description"], + } + section.update(extra) + return section + + +def build_view_spec(locale: str = DEFAULT_LOCALE) -> dict[str, Any]: + """The whole form in one language, as a view spec AutoForm can render.""" + catalog = translate_catalog(locale) + parameters = catalog["parameters"] + strings = ui_strings(locale) + + return { + "_comment": ( + "GENERATED by quest/gui/generate_view_spec.py from " + "quest/settings/parameter_catalog.json and " + "quest/settings/locales/ — do not hand-edit. Bound to " + "quest.gui.form_model.ProjectFormModel, whose state is a QuEst " + "project dict, so what this form saves is what the CLI runs." + ), + "locale": catalog.get("locale", locale), + "sections": [ + { + "type": "custom", + "key": "help", + "options": { + "title": strings["help.title"], + "text": strings["help.text"], + }, + }, + { + "type": "dock_area", + "split": "horizontal", + "height": 620, + # Remember how the user arranged the docks. A form whose layout + # resets on every launch gets rearranged on every launch. + "persist": "quest", + "sections": [ + { + "type": "panel", + "title": strings["dock.project"], + "sections": _parameter_panels(parameters, strings), + }, + { + "type": "panel", + "title": strings["dock.structure"], + "sections": [ + { + "type": "custom", + "key": "chimol", + "target": "preview_models", + "title": strings["dock.structure"], + "height": 320, + } + ], + }, + { + "type": "panel", + "title": strings["dock.results"], + "sections": [ + { + "type": "value", + "attr": "status", + "kind": "str", + "label": strings["field.state"], + "read_only": True, + "description": strings["field.state.description"], + }, + _plot("decay_series", "plot.decay", strings, + log_y=True, height=240), + _plot("trajectory_series", "plot.trajectory", strings, + height=200), + _plot("autocorrelation_series", "plot.autocorrelation", + strings, log_x=True, height=200), + ], + }, + ], + }, + { + "type": "button_row", + "buttons": [ + { + "label": strings["button.simulate"], + "action": "run_simulation", + "description": strings["button.simulate.description"], + }, + { + "label": strings["button.load_project"], + "action": "load_project_dialog", + "description": strings["button.load_project.description"], + }, + { + "label": strings["button.save_project"], + "action": "save_project_dialog", + "description": strings["button.save_project.description"], + }, + ], + }, + ], + } + + +def write_view_spec(path: Path | str | None = None, locale: str = DEFAULT_LOCALE) -> Path: + """Write one language's spec. Defaults to that locale's canonical path.""" + destination = Path(path) if path is not None else view_spec_path(locale) + destination.write_text( + json.dumps(build_view_spec(locale), indent=2, ensure_ascii=False) + "\n", + encoding="utf8", + ) + return destination + + +def write_all_view_specs() -> list[Path]: + """Regenerate every language. This is what the `__main__` entry point runs.""" + return [write_view_spec(locale=code) for code in sorted(available_locales())] + + +if __name__ == "__main__": # pragma: no cover - a one-line entry point + for written in write_all_view_specs(): + print(f"wrote {written}") diff --git a/quest/lib/ui/icons/dye-diffusion.ico b/quest/gui/icons/dye-diffusion.ico similarity index 100% rename from quest/lib/ui/icons/dye-diffusion.ico rename to quest/gui/icons/dye-diffusion.ico diff --git a/quest/gui/quest.view.de.json b/quest/gui/quest.view.de.json new file mode 100644 index 0000000..c3443e0 --- /dev/null +++ b/quest/gui/quest.view.de.json @@ -0,0 +1,469 @@ +{ + "_comment": "GENERATED by quest/gui/generate_view_spec.py from quest/settings/parameter_catalog.json and quest/settings/locales/ — do not hand-edit. Bound to quest.gui.form_model.ProjectFormModel, whose state is a QuEst project dict, so what this form saves is what the CLI runs.", + "locale": "de", + "sections": [ + { + "type": "custom", + "key": "help", + "options": { + "title": "QuEst — Hilfe", + "text": "# QuEst — transientes Abklingen eines gebundenen Farbstoffs\n\nSagt das Fluoreszenzabklingen eines über einen flexiblen Linker gebundenen\nFarbstoffs allein aus der Struktur voraus: Der Farbstoff diffundiert in seinem\nzugänglichen Volumen, wird bei Kontakt mit benachbarten Aminosäuren gelöscht\n(PET) und überträgt – bei aktiviertem FRET – Energie auf einen Akzeptor.\n\n## Was einzustellen ist\n1. **Struktur** — eine PDB-/CIF-Datei oder eine vierstellige RCSB-Kennung sowie\n der Rest, an den der Farbstoff gebunden ist.\n2. **Farbstoff** — Linkerlänge, Linkerbreite und Farbstoffradius bestimmen das\n zugängliche Volumen.\n3. **Simulation** — ungelöschte Lebensdauer, Diffusionskoeffizient und\n Simulationsdauer. `t_step` muss die schnellste Bewegung auflösen; die\n Voreinstellungen sind gemessen, nicht geraten.\n4. **Löschung** — Löschraten und Kontaktradien je Rest. Eine geänderte Zeile\n ändert die Chemie nur dieser einen Aminosäure.\n5. **FRET** — aktivieren, den Akzeptor platzieren und R₀ **in Ångström**\n angeben.\n\n## Was herauskommt\nQuantenausbeute und mittlere Lebensdauer, das Abklingen des Donors (und mit\nFRET), die Farbstofftrajektorie und deren Autokorrelation.\n\nAlles in diesem Formular ist **ein** QuEst-*Projekt*. **Projekt speichern**\nschreibt genau das JSON, das die Kommandozeile (`quest simulate project.json`)\nund die Weboberfläche lesen; ein hier begonnener Lauf kann also überall\nfortgesetzt werden.\n" + } + }, + { + "type": "dock_area", + "split": "horizontal", + "height": 620, + "persist": "quest", + "sections": [ + { + "type": "panel", + "title": "Projekt", + "sections": [ + { + "type": "panel", + "title": "Struktur", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "pdb", + "kind": "file", + "label": "Strukturdatei", + "description": "Pfad zur Strukturdatei (PDB/CIF) oder eine vierstellige RCSB-PDB-Kennung; wird für die AV-Berechnung verwendet." + }, + { + "type": "value", + "attr": "attachment_chain", + "kind": "str", + "label": "Kette der Anbindung", + "description": "Kettenbezeichner der Aminosäure, an die der Farbstoff gebunden ist." + }, + { + "type": "value", + "attr": "attachment_residue", + "kind": "int", + "label": "Rest der Anbindung", + "description": "Sequenznummer der Aminosäure, an die der Farbstoff gebunden ist.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "attachment_atom", + "kind": "str", + "label": "Atom der Anbindung", + "description": "Atomname (z. B. CB, CA), der als Anbindungspunkt des Farbstoffs dient." + } + ] + }, + { + "type": "panel", + "title": "Farbstoff", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "av_linker_length", + "kind": "float", + "label": "Linkerlänge (Å)", + "description": "Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des Farbstoffs.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "av_linker_width", + "kind": "float", + "label": "Linkerbreite (Å)", + "description": "Breite des Linkers, der den Farbstoff hält.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "av_radius1", + "kind": "float", + "label": "Farbstoffradius (Å)", + "description": "Ausschlussradius, der den Farbstoff als Kugel beschreibt (Ein-Kugel-Näherung).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "dg", + "kind": "float", + "label": "Gitterauflösung (Å)", + "description": "Gitterauflösung für die Berechnung des zugänglichen Volumens (AV) und des Diffusionsraums.", + "minimum": 0.1, + "maximum": 5.0, + "decimals": 3 + } + ] + }, + { + "type": "panel", + "title": "Simulation", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "tau0", + "kind": "float", + "label": "Ungelöschte Lebensdauer (ns)", + "description": "Fluoreszenzlebensdauer des Donorfarbstoffs ohne Löschung.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "donor_D", + "kind": "float", + "label": "Diffusionskoeffizient des Donors (Ų/ns)", + "description": "Diffusionskoeffizient des Donorfarbstoffs in Lösung, ohne Wechselwirkung mit der Proteinoberfläche.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "t_max", + "kind": "float", + "label": "Simulationsdauer (ns)", + "description": "Gesamtlänge der simulierten Brownschen Trajektorie.", + "minimum": 0.0, + "maximum": 1000000000.0 + }, + { + "type": "value", + "attr": "t_step", + "kind": "float", + "label": "Zeitschritt (ns)", + "description": "Schrittweite für die Berechnung der Brownschen Trajektorie.", + "minimum": 1e-06, + "maximum": 1000.0, + "decimals": 6 + }, + { + "type": "value", + "attr": "n_photons", + "kind": "int", + "label": "Simulierte Photonen", + "description": "Anzahl der simulierten Anregungsphotonen zur Rekonstruktion des Fluoreszenzabklingens.", + "minimum": 1, + "maximum": 2147483647 + }, + { + "type": "value", + "attr": "n_bins", + "kind": "int", + "label": "Kanäle des Abklingens", + "description": "Anzahl der Zeitkanäle des ausgegebenen Abklinghistogramms.", + "minimum": 1, + "maximum": 65535 + }, + { + "type": "toggle", + "attr": "coarse_grained", + "label": "Grobkörnige Struktur", + "description": "Reduziert die Struktur vor der Simulation auf das Rückgrat samt CB, wobei CB in den Schwerpunkt der Seitenkette verschoben wird. Seitenkettenatome fehlen dann, sodass das Löschzentrum jedes Rests auf dieses CB-Pseudoatom zurückfällt und das zugängliche Volumen wächst, weil die Seitenketten es nicht mehr versperren. Das ist eine Modellierungsentscheidung, keine Beschleunigung: Der Aufwand von QuEst wird vom AV-Gitter bestimmt, nicht von der Atomzahl." + } + ] + }, + { + "type": "panel", + "title": "Löschung", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "critical_distance", + "kind": "float", + "label": "Voreingestellter Kontaktradius (Å)", + "description": "Kontaktradius für Resttypen, die keinen eigenen quench_radius festlegen. Er wird vom Farbstoffmittelpunkt bis zum Löschzentrum des Rests gemessen und muss daher größer sein als der Farbstoffradius zuzüglich des Van-der-Waals-Kontakts (typischerweise 7–9 Å bei einem Farbstoff von 3,5 Å).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "table", + "source": "quencher_rows", + "editable": true, + "update_call": "update_quencher_cell", + "expand": true, + "height": 220, + "columns": [ + { + "key": "residue", + "label": "Rest", + "width": 80, + "description": "Dreibuchstabiger Aminosäurecode." + }, + { + "key": "kQ", + "label": "kQ (1/ns)", + "width": 100, + "description": "Rate, mit der dieser Resttyp den Farbstoff bei Kontakt löscht. Beiträge von Resten mit überlappenden Kontaktsphären addieren sich." + }, + { + "key": "quench_radius", + "label": "Radius (Å)", + "width": 100, + "description": "Abstand vom Farbstoffmittelpunkt zum Löschzentrum dieses Rests, innerhalb dessen Löschung stattfindet. Leer lassen, um die projektweite critical_distance zu übernehmen." + }, + { + "key": "quench_atoms", + "label": "Atome", + "width": 200, + "description": "Atomnamen, deren Schwerpunkt das Löschzentrum dieses Rests bildet. Die Voreinstellungen folgen der redoxaktiven Gruppe, die den photoinduzierten Elektronentransfer vermittelt: der Indolring bei TRP, der Phenolring bei TYR, der Imidazolring bei HIS, SD bei MET und SG bei CYS – nicht CB." + }, + { + "key": "slow_factor", + "label": "Faktor", + "width": 90, + "description": "Faktor zwischen 0 und 1, der den Diffusionskoeffizienten des Farbstoffs in der Nähe dieses Resttyps skaliert und unspezifische Haftung beschreibt. Überlappende Reste multiplizieren ihre Faktoren." + } + ] + } + ] + }, + { + "type": "panel", + "title": "FRET", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "toggle", + "attr": "fret_enabled", + "label": "FRET aktiviert", + "description": "Legt fest, ob ein FRET-Akzeptorfarbstoff simuliert wird, um FRET-Effizienz und Abklingkurven zu berechnen." + }, + { + "type": "value", + "attr": "fret_R0", + "kind": "float", + "label": "Förster-Radius (Å)", + "description": "Förster-Radius R0 des Donor-Akzeptor-Paares, in Ångström wie jede andere Länge im Projekt. Gespeichert wird die Zelle Donor→Akzeptor von fret.R0_matrix; die Transferrate skaliert mit (R0/r)^6, sodass eine Eingabe in Nanometern FRET verschwinden lässt. Typische Xanthen-Paare liegen bei 45–65 Å.", + "minimum": 0.0, + "maximum": 500.0 + }, + { + "type": "value", + "attr": "acceptor_chain", + "kind": "str", + "label": "Kette des Akzeptors", + "description": "Kettenbezeichner des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist." + }, + { + "type": "value", + "attr": "acceptor_residue", + "kind": "int", + "label": "Rest des Akzeptors", + "description": "Sequenznummer des Rests, an den der FRET-Akzeptorfarbstoff gebunden ist.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "acceptor_atom", + "kind": "str", + "label": "Atom des Akzeptors", + "description": "Atomname, an dem der FRET-Akzeptorfarbstoff gebunden ist." + }, + { + "type": "value", + "attr": "acceptor_linker_length", + "kind": "float", + "label": "Linkerlänge des Akzeptors (Å)", + "description": "Maximaler Abstand vom Anbindungspunkt zum Mittelpunkt des FRET-Akzeptorfarbstoffs.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "acceptor_linker_width", + "kind": "float", + "label": "Linkerbreite des Akzeptors (Å)", + "description": "Breite des Linkers, der den FRET-Akzeptorfarbstoff hält.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_radius1", + "kind": "float", + "label": "Radius des Akzeptorfarbstoffs (Å)", + "description": "Ausschlussradius, der den FRET-Akzeptorfarbstoff als Kugel beschreibt.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_D", + "kind": "float", + "label": "Diffusionskoeffizient des Akzeptors (Ų/ns)", + "description": "Diffusionskoeffizient des FRET-Akzeptorfarbstoffs ohne Wechselwirkung mit der Proteinoberfläche.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "choice", + "attr": "acceptor_dynamics", + "label": "Akzeptordynamik", + "description": "Wie der Akzeptor behandelt wird: „trajectory“ simuliert seine Brownsche Bewegung mit eigenem Diffusionskoeffizienten und eigener Haftung und verwendet den momentanen Donor-Akzeptor-Abstand, „averaged“ mittelt über sein statisches zugängliches Volumen (Grenzfall des schnellen Akzeptors, nur gültig, wenn er dieses Volumen schnell im Vergleich zur Donorlebensdauer durchläuft). Beide unterscheiden sich, weil eine Punktwolke gleichmäßig gewichtet wird, eine Trajektorie hingegen danach, wo sich der Farbstoff tatsächlich aufhält.", + "options": [ + "trajectory", + "averaged" + ] + }, + { + "type": "value", + "attr": "acceptor_slow_radius", + "kind": "float", + "label": "Verlangsamungsradius des Akzeptors (Å)", + "description": "Radius um jedes Aminosäurezentrum, innerhalb dessen dieser Rest den Akzeptor verlangsamt. Getrennt vom Donor: Ein Cyanin und ein Rhodamin haften nicht in gleicher Weise an einer Proteinoberfläche. Voreinstellung ist der Wert des Donors." + } + ] + }, + { + "type": "panel", + "title": "Erweitert", + "n_col": 1, + "collapsed": true, + "sections": [ + { + "type": "value", + "attr": "parallel_trajectories", + "kind": "int", + "label": "Parallele Trajektorien", + "description": "Anzahl unabhängiger Brownscher Trajektorien, die gleichzeitig gerechnet und vor der Photonensimulation zusammengeführt werden. −1 nutzt alle CPU-Kerne, höchstens jedoch 8.", + "minimum": -1, + "maximum": 1024 + }, + { + "type": "value", + "attr": "slow_radius", + "kind": "float", + "label": "Verlangsamungsradius (Å)", + "description": "Radius um jedes Aminosäurezentrum des gesamten Proteins, innerhalb dessen dieser Resttyp seinen slow_factor zum Gitter der Diffusionskoeffizienten beiträgt.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "toggle", + "attr": "save_avs", + "label": "AV-Dateien speichern", + "description": "Legt fest, ob die berechneten Gitter des zugänglichen Volumens als XYZ-Dateien gespeichert werden." + }, + { + "type": "value", + "attr": "output_file", + "kind": "str", + "label": "Präfix der Ausgabedateien", + "description": "Namenspräfix für gespeicherte Simulationsergebnisse, Trajektorien und Abklingkurven." + }, + { + "type": "value", + "attr": "skip_frame", + "kind": "int", + "label": "Übersprungene Trajektorienbilder", + "description": "Unterabtastungsfaktor beim Schreiben von Trajektorienbildern in Koordinatendateien.", + "minimum": 1, + "maximum": 1000000 + }, + { + "type": "value", + "attr": "random_seed", + "kind": "int", + "label": "Zufallsstartwert", + "description": "Startwert der Monte-Carlo-Simulation. Ist er gesetzt, werden sowohl die Diffusionstrajektorie als auch die Photonenspur initialisiert, sodass wiederholte Läufe desselben Projekts genau dasselbe Abklingen und dieselbe Quantenausbeute liefern. Ohne Startwert läuft die Simulation unabhängig zufällig; die Photonenspur nutzt dann einen schnelleren, mehrfädigen Kern.", + "minimum": 0, + "maximum": 2147483647 + } + ] + } + ] + }, + { + "type": "panel", + "title": "Struktur", + "sections": [ + { + "type": "custom", + "key": "chimol", + "target": "preview_models", + "title": "Struktur", + "height": 320 + } + ] + }, + { + "type": "panel", + "title": "Ergebnisse", + "sections": [ + { + "type": "value", + "attr": "status", + "kind": "str", + "label": "Status", + "read_only": true, + "description": "Ergebnis der letzten Simulation." + }, + { + "type": "plot", + "source": "decay_series", + "title": "Fluoreszenzabklingen", + "x_label": "Zeit (ns)", + "y_label": "Ereignisse", + "description": "Abklingen des Donors und, bei aktiviertem FRET, das FRET-gelöschte Abklingen.", + "log_y": true, + "height": 240 + }, + { + "type": "plot", + "source": "trajectory_series", + "title": "Farbstofftrajektorie", + "x_label": "Zeit (ns)", + "y_label": "|r − ⟨r⟩| (Å)", + "description": "Abstand des Farbstoffs von seiner mittleren Position – wie weit er tatsächlich wandert.", + "height": 200 + }, + { + "type": "plot", + "source": "autocorrelation_series", + "title": "Autokorrelation der Position", + "x_label": "Verzögerung (ns)", + "y_label": "AKF", + "description": "Wie schnell der Farbstoff seine Position vergisst; bestimmt, ob die Löschung diffusions- oder kontaktbegrenzt ist.", + "log_x": true, + "height": 200 + } + ] + } + ] + }, + { + "type": "button_row", + "buttons": [ + { + "label": "▶ Simulieren", + "action": "run_simulation", + "description": "Das aktuelle Projekt über quest.api rechnen." + }, + { + "label": "📂 Projekt laden…", + "action": "load_project_dialog", + "description": "Ein QuEst-Projekt-JSON einlesen, gleich von welcher Oberfläche es stammt." + }, + { + "label": "💾 Projekt speichern…", + "action": "save_project_dialog", + "description": "Das Formular als Projekt-JSON schreiben – dieselbe Datei, die Kommandozeile und Weboberfläche lesen." + } + ] + } + ] +} diff --git a/quest/gui/quest.view.fr.json b/quest/gui/quest.view.fr.json new file mode 100644 index 0000000..8ced623 --- /dev/null +++ b/quest/gui/quest.view.fr.json @@ -0,0 +1,469 @@ +{ + "_comment": "GENERATED by quest/gui/generate_view_spec.py from quest/settings/parameter_catalog.json and quest/settings/locales/ — do not hand-edit. Bound to quest.gui.form_model.ProjectFormModel, whose state is a QuEst project dict, so what this form saves is what the CLI runs.", + "locale": "fr", + "sections": [ + { + "type": "custom", + "key": "help", + "options": { + "title": "QuEst — aide", + "text": "# QuEst — déclin transitoire d'un fluorophore attaché\n\nPrédit le déclin de fluorescence d'un fluorophore porté par un bras flexible à\npartir de la seule structure : le fluorophore diffuse dans son volume\naccessible, s'éteint au contact des acides aminés voisins (PET) et — si le FRET\nest activé — transfère son énergie à un accepteur.\n\n## Ce qu'il faut régler\n1. **Structure** — un fichier PDB/CIF ou un identifiant RCSB à quatre\n caractères, et le résidu portant le fluorophore.\n2. **Fluorophore** — longueur et largeur du bras espaceur et rayon du\n fluorophore définissent le volume accessible.\n3. **Simulation** — durée de vie non éteinte, coefficient de diffusion et durée\n à simuler. `t_step` doit résoudre le mouvement le plus rapide ; les valeurs\n par défaut sont mesurées, non devinées.\n4. **Extinction** — taux d'extinction et rayons de contact par résidu. Modifier\n une ligne ne change la chimie que de cet acide aminé.\n5. **FRET** — l'activer, placer l'accepteur et donner R₀ **en ångströms**.\n\n## Ce qui en sort\nRendement quantique et durée de vie moyenne, déclin du donneur (et du FRET), la\ntrajectoire du fluorophore et son autocorrélation.\n\nTout ce formulaire constitue un unique *projet* QuEst. **Enregistrer le projet**\nécrit exactement le JSON que lisent la ligne de commande\n(`quest simulate project.json`) et l'interface web : un calcul commencé ici peut\nêtre terminé ailleurs.\n" + } + }, + { + "type": "dock_area", + "split": "horizontal", + "height": 620, + "persist": "quest", + "sections": [ + { + "type": "panel", + "title": "Projet", + "sections": [ + { + "type": "panel", + "title": "Structure", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "pdb", + "kind": "file", + "label": "Fichier de structure", + "description": "Chemin du fichier de structure (PDB/CIF), ou identifiant RCSB PDB à quatre caractères, utilisé pour le calcul du volume accessible." + }, + { + "type": "value", + "attr": "attachment_chain", + "kind": "str", + "label": "Chaîne d'attache", + "description": "Identifiant de chaîne du résidu sur lequel le fluorophore est attaché." + }, + { + "type": "value", + "attr": "attachment_residue", + "kind": "int", + "label": "Résidu d'attache", + "description": "Numéro de séquence du résidu sur lequel le fluorophore est attaché.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "attachment_atom", + "kind": "str", + "label": "Atome d'attache", + "description": "Nom de l'atome (par ex. CB, CA) servant de point d'attache au fluorophore." + } + ] + }, + { + "type": "panel", + "title": "Fluorophore", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "av_linker_length", + "kind": "float", + "label": "Longueur du bras espaceur (Å)", + "description": "Distance maximale entre le point d'attache et le centre du fluorophore.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "av_linker_width", + "kind": "float", + "label": "Largeur du bras espaceur (Å)", + "description": "Largeur du bras espaceur qui retient le fluorophore.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "av_radius1", + "kind": "float", + "label": "Rayon du fluorophore (Å)", + "description": "Rayon d'exclusion représentant le fluorophore comme une sphère (approximation à une sphère).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "dg", + "kind": "float", + "label": "Résolution de la grille (Å)", + "description": "Résolution de la grille utilisée pour calculer le volume accessible (AV) et l'espace de diffusion.", + "minimum": 0.1, + "maximum": 5.0, + "decimals": 3 + } + ] + }, + { + "type": "panel", + "title": "Simulation", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "tau0", + "kind": "float", + "label": "Durée de vie non éteinte (ns)", + "description": "Durée de vie de fluorescence du donneur en l'absence d'extinction.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "donor_D", + "kind": "float", + "label": "Coefficient de diffusion du donneur (Ų/ns)", + "description": "Coefficient de diffusion du donneur en solution, hors interaction avec la surface de la protéine.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "t_max", + "kind": "float", + "label": "Durée de simulation (ns)", + "description": "Durée totale de la trajectoire de dynamique brownienne simulée.", + "minimum": 0.0, + "maximum": 1000000000.0 + }, + { + "type": "value", + "attr": "t_step", + "kind": "float", + "label": "Pas de temps (ns)", + "description": "Pas de temps du calcul de la trajectoire de dynamique brownienne.", + "minimum": 1e-06, + "maximum": 1000.0, + "decimals": 6 + }, + { + "type": "value", + "attr": "n_photons", + "kind": "int", + "label": "Photons simulés", + "description": "Nombre de photons d'excitation simulés pour reconstruire l'histogramme de déclin de fluorescence.", + "minimum": 1, + "maximum": 2147483647 + }, + { + "type": "value", + "attr": "n_bins", + "kind": "int", + "label": "Canaux du déclin", + "description": "Nombre de canaux temporels de l'histogramme de déclin produit.", + "minimum": 1, + "maximum": 65535 + }, + { + "type": "toggle", + "attr": "coarse_grained", + "label": "Structure gros grains", + "description": "Réduit la structure au squelette et aux CB avant la simulation, chaque CB étant déplacé au centre de masse de sa chaîne latérale. Les atomes de chaîne latérale sont alors absents : le centre d'extinction de chaque résidu se rabat sur ce pseudo-atome CB, et le volume accessible augmente puisque les chaînes latérales ne l'obstruent plus. C'est un choix de modélisation, non une optimisation : le coût de QuEst tient à la grille du volume accessible, pas au nombre d'atomes." + } + ] + }, + { + "type": "panel", + "title": "Extinction", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "critical_distance", + "kind": "float", + "label": "Rayon de contact par défaut (Å)", + "description": "Rayon de contact employé par les types de résidus qui ne définissent pas leur propre quench_radius. Il se mesure du centre du fluorophore au centre d'extinction du résidu et doit donc dépasser le rayon du fluorophore augmenté du contact de van der Waals (typiquement 7 à 9 Å pour un fluorophore de 3,5 Å).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "table", + "source": "quencher_rows", + "editable": true, + "update_call": "update_quencher_cell", + "expand": true, + "height": 220, + "columns": [ + { + "key": "residue", + "label": "Résidu", + "width": 80, + "description": "Code d'acide aminé à trois lettres." + }, + { + "key": "kQ", + "label": "kQ (1/ns)", + "width": 100, + "description": "Taux auquel ce type de résidu éteint le fluorophore tant que les deux sont en contact. Les contributions des résidus dont les sphères de contact se recouvrent s'additionnent." + }, + { + "key": "quench_radius", + "label": "Rayon (Å)", + "width": 100, + "description": "Distance entre le centre du fluorophore et le centre d'extinction de ce résidu en deçà de laquelle l'extinction se produit. Laisser vide pour hériter du critical_distance du projet." + }, + { + "key": "quench_atoms", + "label": "Atomes", + "width": 200, + "description": "Noms des atomes dont le barycentre définit le centre d'extinction de ce résidu. Les valeurs par défaut suivent le groupement rédox-actif qui assure le transfert d'électron photo-induit : le cycle indole pour TRP, le cycle phénol pour TYR, le cycle imidazole pour HIS, SD pour MET et SG pour CYS — et non CB." + }, + { + "key": "slow_factor", + "label": "Facteur", + "width": 90, + "description": "Facteur compris entre 0 et 1 qui met à l'échelle le coefficient de diffusion du fluorophore au voisinage de ce type de résidu, modélisant une adhérence non spécifique. Les résidus qui se recouvrent multiplient leurs facteurs." + } + ] + } + ] + }, + { + "type": "panel", + "title": "FRET", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "toggle", + "attr": "fret_enabled", + "label": "FRET activé", + "description": "Indique si un accepteur FRET est simulé afin de calculer l'efficacité de FRET et les courbes de déclin." + }, + { + "type": "value", + "attr": "fret_R0", + "kind": "float", + "label": "Rayon de Förster (Å)", + "description": "Rayon de Förster R0 du couple donneur–accepteur, en ångströms comme toute autre longueur du projet. Il est stocké dans la case donneur→accepteur de fret.R0_matrix ; le taux de transfert varie en (R0/r)^6, si bien qu'une saisie en nanomètres fait disparaître le FRET. Les couples xanthènes usuels se situent entre 45 et 65 Å.", + "minimum": 0.0, + "maximum": 500.0 + }, + { + "type": "value", + "attr": "acceptor_chain", + "kind": "str", + "label": "Chaîne de l'accepteur", + "description": "Identifiant de chaîne du résidu sur lequel l'accepteur FRET est attaché." + }, + { + "type": "value", + "attr": "acceptor_residue", + "kind": "int", + "label": "Résidu de l'accepteur", + "description": "Numéro de séquence du résidu sur lequel l'accepteur FRET est attaché.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "acceptor_atom", + "kind": "str", + "label": "Atome de l'accepteur", + "description": "Nom de l'atome sur lequel l'accepteur FRET est attaché." + }, + { + "type": "value", + "attr": "acceptor_linker_length", + "kind": "float", + "label": "Longueur du bras de l'accepteur (Å)", + "description": "Distance maximale entre le point d'attache et le centre de l'accepteur FRET.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "acceptor_linker_width", + "kind": "float", + "label": "Largeur du bras de l'accepteur (Å)", + "description": "Largeur du bras espaceur qui retient l'accepteur FRET.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_radius1", + "kind": "float", + "label": "Rayon de l'accepteur (Å)", + "description": "Rayon d'exclusion représentant l'accepteur FRET comme une sphère.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_D", + "kind": "float", + "label": "Coefficient de diffusion de l'accepteur (Ų/ns)", + "description": "Coefficient de diffusion de l'accepteur FRET hors interaction avec la surface de la protéine.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "choice", + "attr": "acceptor_dynamics", + "label": "Dynamique de l'accepteur", + "description": "Traitement de l'accepteur : « trajectory » simule sa marche brownienne avec son propre coefficient de diffusion et sa propre adhérence, et utilise la distance donneur-accepteur instantanée ; « averaged » moyenne sur son volume accessible statique (limite de l'accepteur rapide, valable seulement s'il parcourt ce volume rapidement devant la durée de vie du donneur). Les deux diffèrent parce qu'un nuage est pondéré uniformément alors qu'une trajectoire l'est par les endroits où le fluorophore séjourne.", + "options": [ + "trajectory", + "averaged" + ] + }, + { + "type": "value", + "attr": "acceptor_slow_radius", + "kind": "float", + "label": "Rayon de ralentissement de l'accepteur (Å)", + "description": "Rayon autour de chaque centre d'acide aminé à l'intérieur duquel ce résidu ralentit l'accepteur. Distinct de celui du donneur : une cyanine et une rhodamine n'adhèrent pas de la même façon à une surface protéique. Par défaut, la valeur du donneur." + } + ] + }, + { + "type": "panel", + "title": "Avancé", + "n_col": 1, + "collapsed": true, + "sections": [ + { + "type": "value", + "attr": "parallel_trajectories", + "kind": "int", + "label": "Trajectoires parallèles", + "description": "Nombre de trajectoires browniennes indépendantes calculées simultanément et réunies avant l'échantillonnage des photons. −1 utilise tous les cœurs du processeur, dans la limite de 8.", + "minimum": -1, + "maximum": 1024 + }, + { + "type": "value", + "attr": "slow_radius", + "kind": "float", + "label": "Rayon de ralentissement (Å)", + "description": "Rayon autour de chaque centre d'acide aminé de la protéine entière à l'intérieur duquel ce type de résidu applique son slow_factor à la grille des coefficients de diffusion.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "toggle", + "attr": "save_avs", + "label": "Enregistrer les fichiers AV", + "description": "Indique si les grilles de volume accessible calculées sont enregistrées au format XYZ." + }, + { + "type": "value", + "attr": "output_file", + "kind": "str", + "label": "Préfixe des fichiers de sortie", + "description": "Préfixe de nom employé pour enregistrer les résultats, les trajectoires et les déclins." + }, + { + "type": "value", + "attr": "skip_frame", + "kind": "int", + "label": "Images de trajectoire ignorées", + "description": "Facteur de sous-échantillonnage lors de l'écriture des images de trajectoire dans les fichiers de coordonnées.", + "minimum": 1, + "maximum": 1000000 + }, + { + "type": "value", + "attr": "random_seed", + "kind": "int", + "label": "Graine aléatoire", + "description": "Graine de la simulation Monte-Carlo. Lorsqu'elle est fixée, la trajectoire de diffusion et le tirage des photons sont tous deux initialisés : deux exécutions du même projet reproduisent exactement le même déclin et le même rendement quantique. Sans graine, chaque exécution est indépendante et le tirage des photons emploie un noyau multithread plus rapide.", + "minimum": 0, + "maximum": 2147483647 + } + ] + } + ] + }, + { + "type": "panel", + "title": "Structure", + "sections": [ + { + "type": "custom", + "key": "chimol", + "target": "preview_models", + "title": "Structure", + "height": 320 + } + ] + }, + { + "type": "panel", + "title": "Résultats", + "sections": [ + { + "type": "value", + "attr": "status", + "kind": "str", + "label": "État", + "read_only": true, + "description": "Résultat de la dernière simulation." + }, + { + "type": "plot", + "source": "decay_series", + "title": "Déclin de fluorescence", + "x_label": "Temps (ns)", + "y_label": "Coups", + "description": "Déclin du donneur et, si le FRET est activé, déclin éteint par FRET.", + "log_y": true, + "height": 240 + }, + { + "type": "plot", + "source": "trajectory_series", + "title": "Trajectoire du fluorophore", + "x_label": "Temps (ns)", + "y_label": "|r − ⟨r⟩| (Å)", + "description": "Distance du fluorophore à sa position moyenne — l'étendue qu'il explore réellement.", + "height": 200 + }, + { + "type": "plot", + "source": "autocorrelation_series", + "title": "Autocorrélation de la position", + "x_label": "Décalage (ns)", + "y_label": "FAC", + "description": "Vitesse à laquelle le fluorophore oublie sa position ; détermine si l'extinction est limitée par la diffusion ou par le contact.", + "log_x": true, + "height": 200 + } + ] + } + ] + }, + { + "type": "button_row", + "buttons": [ + { + "label": "▶ Simuler", + "action": "run_simulation", + "description": "Exécuter le projet courant via quest.api." + }, + { + "label": "📂 Charger un projet…", + "action": "load_project_dialog", + "description": "Lire un projet QuEst au format JSON, quelle qu'en soit l'origine." + }, + { + "label": "💾 Enregistrer le projet…", + "action": "save_project_dialog", + "description": "Écrire le formulaire au format projet JSON — le fichier que lisent la ligne de commande et l'interface web." + } + ] + } + ] +} diff --git a/quest/gui/quest.view.json b/quest/gui/quest.view.json new file mode 100644 index 0000000..59d3897 --- /dev/null +++ b/quest/gui/quest.view.json @@ -0,0 +1,469 @@ +{ + "_comment": "GENERATED by quest/gui/generate_view_spec.py from quest/settings/parameter_catalog.json and quest/settings/locales/ — do not hand-edit. Bound to quest.gui.form_model.ProjectFormModel, whose state is a QuEst project dict, so what this form saves is what the CLI runs.", + "locale": "en", + "sections": [ + { + "type": "custom", + "key": "help", + "options": { + "title": "QuEst — help", + "text": "# QuEst — transient decay of a tethered dye\n\nPredicts the fluorescence decay of a dye on a flexible linker from the\nstructure alone: the dye diffuses inside its accessible volume, is quenched on\ncontact with nearby amino acids (PET), and — with FRET enabled — transfers to\nan acceptor.\n\n## What to set\n1. **Structure** — a PDB/CIF file or a four-character RCSB ID, and the residue\n the dye is attached to.\n2. **Dye** — linker length, width and dye radius define the accessible volume.\n3. **Simulation** — the unquenched lifetime, the diffusion coefficient and how\n long to simulate. `t_step` must resolve the fastest motion; the defaults are\n measured, not guessed.\n4. **Quenching** — per-residue quenching rates and contact radii. Editing a row\n changes the chemistry for that amino acid only.\n5. **FRET** — enable it, place the acceptor, and give R₀ **in Ångström**.\n\n## What comes out\nQuantum yield and mean lifetime, the donor (and FRET) decay, the dye\ntrajectory, and its autocorrelation.\n\nEverything in this form is one QuEst *project*. **Save project** writes exactly\nthe JSON the command line (`quest simulate project.json`) and the web UI read,\nso a run started here can be finished anywhere.\n" + } + }, + { + "type": "dock_area", + "split": "horizontal", + "height": 620, + "persist": "quest", + "sections": [ + { + "type": "panel", + "title": "Project", + "sections": [ + { + "type": "panel", + "title": "Structure", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "pdb", + "kind": "file", + "label": "Structure file", + "description": "Path to the structure file (PDB/CIF), or a bare four-character RCSB PDB ID used for AV calculation." + }, + { + "type": "value", + "attr": "attachment_chain", + "kind": "str", + "label": "Attachment chain", + "description": "Chain identifier of the amino acid residue where the dye is tethered." + }, + { + "type": "value", + "attr": "attachment_residue", + "kind": "int", + "label": "Attachment residue", + "description": "Residue sequence number of the amino acid where the dye is tethered.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "attachment_atom", + "kind": "str", + "label": "Attachment atom", + "description": "Atom name (e.g., CB, CA) used as the tethering point for the dye." + } + ] + }, + { + "type": "panel", + "title": "Dye", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "av_linker_length", + "kind": "float", + "label": "Linker length (Å)", + "description": "Maximum distance from attachment point to the center of the dye.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "av_linker_width", + "kind": "float", + "label": "Linker width (Å)", + "description": "Width of the linker tethering the dye.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "av_radius1", + "kind": "float", + "label": "Dye radius (Å)", + "description": "Exclusion radius representing the dye sphere (single-sphere approximation).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "dg", + "kind": "float", + "label": "Grid resolution (Å)", + "description": "Grid resolution used to compute the accessible volume (AV) and diffusion search space.", + "minimum": 0.1, + "maximum": 5.0, + "decimals": 3 + } + ] + }, + { + "type": "panel", + "title": "Simulation", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "tau0", + "kind": "float", + "label": "Unquenched lifetime (ns)", + "description": "Fluorescence lifetime of the donor dye in the absence of quenching.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "donor_D", + "kind": "float", + "label": "Donor diffusion coefficient (Ų/ns)", + "description": "Diffusion coefficient of the donor dye in solution, when not interacting with the protein surface.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "value", + "attr": "t_max", + "kind": "float", + "label": "Simulation time (ns)", + "description": "Total length of the simulated Brownian dynamics trajectory.", + "minimum": 0.0, + "maximum": 1000000000.0 + }, + { + "type": "value", + "attr": "t_step", + "kind": "float", + "label": "Time step (ns)", + "description": "Time step size for the Brownian dynamics trajectory calculation.", + "minimum": 1e-06, + "maximum": 1000.0, + "decimals": 6 + }, + { + "type": "value", + "attr": "n_photons", + "kind": "int", + "label": "Simulated photons", + "description": "Number of excitation photons simulated to reconstruct the fluorescence decay histogram.", + "minimum": 1, + "maximum": 2147483647 + }, + { + "type": "value", + "attr": "n_bins", + "kind": "int", + "label": "Decay bins", + "description": "Number of time channels/bins used to construct the output decay histogram.", + "minimum": 1, + "maximum": 65535 + }, + { + "type": "toggle", + "attr": "coarse_grained", + "label": "Coarse-grained structure", + "description": "Reduce the structure to backbone plus CB before simulating, with CB moved to the side-chain centre of mass. Side-chain atoms are then absent, so every residue's quenching centre falls back to that CB pseudo-atom, and the accessible volume grows because side chains no longer block it. This is a modelling choice, not a speed optimisation: QuEst's cost is dominated by the AV grid rather than the atom count." + } + ] + }, + { + "type": "panel", + "title": "Quenching", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "value", + "attr": "critical_distance", + "kind": "float", + "label": "Fallback contact radius (Å)", + "description": "Contact radius used by residue types that do not define their own quench_radius. It is measured from the dye centre to the residue's quenching centre, so it must exceed the dye radius plus van der Waals contact (typically 7-9 A for a 3.5 A dye).", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "table", + "source": "quencher_rows", + "editable": true, + "update_call": "update_quencher_cell", + "expand": true, + "height": 220, + "columns": [ + { + "key": "residue", + "label": "Residue", + "width": 80, + "description": "Three-letter amino-acid code." + }, + { + "key": "kQ", + "label": "kQ (1/ns)", + "width": 100, + "description": "Rate at which this residue type quenches the dye while the two are in contact. Contributions from residues whose contact spheres overlap add up." + }, + { + "key": "quench_radius", + "label": "Radius (Å)", + "width": 100, + "description": "Distance from the dye centre to this residue's quenching centre within which quenching occurs. Leave empty to inherit the project-wide critical_distance." + }, + { + "key": "quench_atoms", + "label": "Atoms", + "width": 200, + "description": "Atom names whose centroid defines this residue's quenching centre. The defaults follow the redox-active moiety that mediates photo-induced electron transfer: the indole ring for TRP, the phenol ring for TYR, the imidazole ring for HIS, SD for MET and SG for CYS - not CB." + }, + { + "key": "slow_factor", + "label": "Slow factor", + "width": 90, + "description": "Factor between 0 and 1 scaling the dye's diffusion coefficient near this residue type, modelling unspecific stickiness. Overlapping residues multiply their factors." + } + ] + } + ] + }, + { + "type": "panel", + "title": "FRET", + "n_col": 1, + "collapsed": false, + "sections": [ + { + "type": "toggle", + "attr": "fret_enabled", + "label": "FRET enabled", + "description": "Whether a FRET acceptor dye is simulated to compute FRET efficiency and decay curves." + }, + { + "type": "value", + "attr": "fret_R0", + "kind": "float", + "label": "Förster radius (Å)", + "description": "Förster radius R0 of the donor–acceptor pair, in Ångström like every other length in a project. Stored as the donor→acceptor cell of fret.R0_matrix; the transfer rate scales as (R0/r)^6, so entering nanometres makes FRET vanish. Typical xanthene pairs are 45–65 Å.", + "minimum": 0.0, + "maximum": 500.0 + }, + { + "type": "value", + "attr": "acceptor_chain", + "kind": "str", + "label": "Acceptor chain", + "description": "Chain identifier of the residue where the FRET acceptor dye is attached." + }, + { + "type": "value", + "attr": "acceptor_residue", + "kind": "int", + "label": "Acceptor residue", + "description": "Residue sequence number where the FRET acceptor dye is attached.", + "minimum": -100000, + "maximum": 100000 + }, + { + "type": "value", + "attr": "acceptor_atom", + "kind": "str", + "label": "Acceptor atom", + "description": "Atom name where the FRET acceptor dye is attached." + }, + { + "type": "value", + "attr": "acceptor_linker_length", + "kind": "float", + "label": "Acceptor linker length (Å)", + "description": "Maximum distance from attachment point to the center of the FRET acceptor dye.", + "minimum": 0.0, + "maximum": 200.0 + }, + { + "type": "value", + "attr": "acceptor_linker_width", + "kind": "float", + "label": "Acceptor linker width (Å)", + "description": "Width of the linker tethering the FRET acceptor dye.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_radius1", + "kind": "float", + "label": "Acceptor dye radius (Å)", + "description": "Exclusion radius representing the FRET acceptor dye sphere.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "value", + "attr": "acceptor_D", + "kind": "float", + "label": "Acceptor diffusion coefficient (Ų/ns)", + "description": "Diffusion coefficient of the FRET acceptor dye when not interacting with the protein surface.", + "minimum": 0.0, + "maximum": 1000.0 + }, + { + "type": "choice", + "attr": "acceptor_dynamics", + "label": "Acceptor dynamics", + "description": "How the acceptor is treated: 'trajectory' simulates its Brownian walk with its own diffusion coefficient and stickiness and uses the instantaneous donor-acceptor distance, 'averaged' averages over its static accessible volume (the fast-acceptor limit, valid only when it explores that volume quickly compared with the donor lifetime). The two disagree because a cloud is weighted uniformly while a trajectory is weighted by where the dye dwells.", + "options": [ + "trajectory", + "averaged" + ] + }, + { + "type": "value", + "attr": "acceptor_slow_radius", + "kind": "float", + "label": "Acceptor slowing radius (Å)", + "description": "Radius around each amino-acid centre within which that residue slows the acceptor. Separate from the donor's: a cyanine and a rhodamine do not adhere to a protein surface in the same way. Defaults to the donor's value." + } + ] + }, + { + "type": "panel", + "title": "Advanced", + "n_col": 1, + "collapsed": true, + "sections": [ + { + "type": "value", + "attr": "parallel_trajectories", + "kind": "int", + "label": "Parallel trajectories", + "description": "Number of independent Brownian dynamics trajectories run concurrently and combined before photon sampling. Use -1 to use all CPU cores, capped at 8.", + "minimum": -1, + "maximum": 1024 + }, + { + "type": "value", + "attr": "slow_radius", + "kind": "float", + "label": "Slowing radius (Å)", + "description": "Radius around each whole-protein amino-acid center where that residue type contributes its slow_factor to the diffusion coefficient grid.", + "minimum": 0.0, + "maximum": 50.0 + }, + { + "type": "toggle", + "attr": "save_avs", + "label": "Save AV files", + "description": "Whether to save the calculated accessible volume grids as XYZ files." + }, + { + "type": "value", + "attr": "output_file", + "kind": "str", + "label": "Output file prefix", + "description": "Base filename prefix used when saving simulation outputs, trajectories, and decays." + }, + { + "type": "value", + "attr": "skip_frame", + "kind": "int", + "label": "Trajectory skip frames", + "description": "Subsampling factor for writing trajectory frames to coordinates files.", + "minimum": 1, + "maximum": 1000000 + }, + { + "type": "value", + "attr": "random_seed", + "kind": "int", + "label": "Random seed", + "description": "Seed for the Monte-Carlo simulation. When set, both the diffusion trajectory and the photon trace are seeded, so repeated runs of the same project reproduce the same decay and quantum yield exactly. Leave unset for an independent random run; the photon trace then uses a faster multi-threaded kernel.", + "minimum": 0, + "maximum": 2147483647 + } + ] + } + ] + }, + { + "type": "panel", + "title": "Structure", + "sections": [ + { + "type": "custom", + "key": "chimol", + "target": "preview_models", + "title": "Structure", + "height": 320 + } + ] + }, + { + "type": "panel", + "title": "Results", + "sections": [ + { + "type": "value", + "attr": "status", + "kind": "str", + "label": "State", + "read_only": true, + "description": "Outcome of the last simulation." + }, + { + "type": "plot", + "source": "decay_series", + "title": "Fluorescence decay", + "x_label": "Time (ns)", + "y_label": "Counts", + "description": "Donor decay, and the FRET-quenched decay when FRET is enabled.", + "log_y": true, + "height": 240 + }, + { + "type": "plot", + "source": "trajectory_series", + "title": "Dye trajectory", + "x_label": "Time (ns)", + "y_label": "|r − ⟨r⟩| (Å)", + "description": "Distance of the dye from its mean position — how far it actually explores.", + "height": 200 + }, + { + "type": "plot", + "source": "autocorrelation_series", + "title": "Position autocorrelation", + "x_label": "Lag (ns)", + "y_label": "ACF", + "description": "How quickly the dye forgets where it was; sets whether quenching is diffusion- or contact-limited.", + "log_x": true, + "height": 200 + } + ] + } + ] + }, + { + "type": "button_row", + "buttons": [ + { + "label": "▶ Simulate", + "action": "run_simulation", + "description": "Run the current project through quest.api." + }, + { + "label": "📂 Load project…", + "action": "load_project_dialog", + "description": "Read a QuEst project JSON written by any surface." + }, + { + "label": "💾 Save project…", + "action": "save_project_dialog", + "description": "Write the form as project JSON — the same file the CLI and the web UI read." + } + ] + } + ] +} diff --git a/quest/lib/fps/avWidget.ui b/quest/lib/fps/avWidget.ui deleted file mode 100644 index cdbd820..0000000 --- a/quest/lib/fps/avWidget.ui +++ /dev/null @@ -1,151 +0,0 @@ - - - Form - - - - 0 - 0 - 190 - 82 - - - - DyeSim - - - - 0 - - - 0 - - - - - Av-properties - - - - 0 - - - 0 - - - - - nSamples - - - - - - - MinAV - - - - - - - 999999 - - - 1000 - - - - - - - 0 - - - 999999 - - - 50 - - - 150 - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Labling - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - - - ... - - - - - - - - - - OpenLabeling - - - - - - - toolButton - clicked() - actionOpenLabeling - trigger() - - - 176 - 70 - - - -1 - -1 - - - - - diff --git a/quest/lib/pdb_widget.ui b/quest/lib/pdb_widget.ui deleted file mode 100644 index b4be3a6..0000000 --- a/quest/lib/pdb_widget.ui +++ /dev/null @@ -1,82 +0,0 @@ - - - Form - - - - 0 - 0 - 138 - 60 - - - - - 0 - 0 - - - - - 16777215 - 80 - - - - Form - - - - 0 - - - 0 - - - - - - 0 - 0 - - - - Chain - - - - - - - - 0 - 0 - - - - - - - - Atom - - - - - - - Residue - - - - - - - - - - - - - - diff --git a/quest/lib/plots/MolView.py b/quest/lib/plots/MolView.py deleted file mode 100644 index c728dc3..0000000 --- a/quest/lib/plots/MolView.py +++ /dev/null @@ -1,415 +0,0 @@ -__author__ = 'thomas' -import os -import sys - -from qtpy import QtGui, QtCore, QtWidgets, uic -from qtpy.QtWidgets import QOpenGLWidget -from qtpy.QtCore import Qt -from OpenGL.GL import * - -from lib.plots.plotbase import Plot - -try: - import pymol2 - _HAVE_PYMOL2 = True -except Exception: - pymol2 = None - _HAVE_PYMOL2 = False - - -_PYMOL_MISSING_HINT = ( - "PyMOL is not available in this ChiSurf environment, so the QuEst 3D viewer " - "is disabled.\n\n" - "Install ChiSurf (which bundles PyMOL) via the ChiSurf Package Manager " - "(Help → Updates and Packages → Package Manager) or run\n" - " conda install chisurf -c conda-forge -c tpeulen\n" - "to enable this panel." -) - - -class _PymolCmdStub: - - def __getattr__(self, _name): - def _noop(*_, **__): - return None - - return _noop - - def count_states(self, *_, **__): - return 0 - - def do(self, *_, **__): - return None - - -class _PymolStub: - - def __init__(self): - self.cmd = _PymolCmdStub() - - def start(self): - return None - - def idle(self): - return False - - def draw(self): - return None - - def reshape(self, *_, **__): - return None - - def drag(self, *_, **__): - return None - - def button(self, *_, **__): - return None - - def reinitialize(self): - return None - - -class EmittingStream(QtCore.QObject): - - textWritten = QtCore.Signal(str) - - def write(self, text): - self.textWritten.emit(str(text)) - - -class MolQtWidget(QOpenGLWidget): - """ - http://www.mail-archive.com/pymol-users@lists.sourceforge.net/msg09609.html - maybe later use this...: http://www.plosone.org/article/info:doi/10.1371/journal.pone.0021931 - """ - _buttonMap = {Qt.LeftButton:0, - Qt.MidButton:1, - Qt.RightButton:2} - - def __init__(self, parent, enableUi=True, File="", play=False, sequence=False): - self.play = play - self.nFrames = 0 - QOpenGLWidget.__init__(self, parent=parent) - self.setMinimumSize(200, 150) - self._enableUi = enableUi - - if not _HAVE_PYMOL2: - self.pymol = _PymolStub() - self.cmd = self.pymol.cmd - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(16, 16, 16, 16) - layout.setSpacing(12) - label = QtWidgets.QLabel(_PYMOL_MISSING_HINT, self) - label.setWordWrap(True) - label.setAlignment(QtCore.Qt.AlignCenter) - layout.addStretch(1) - layout.addWidget(label) - layout.addStretch(1) - return - - self.pymol = pymol2.PyMOL() - self.pymol.start() - self.cmd = self.pymol.cmd - self._pymolProcess() - - if not self._enableUi: - self.pymol.cmd.set("internal_gui", 0) - self.pymol.cmd.set("internal_feedback", 1) - self.pymol.cmd.button("double_left", "None", "None") - self.pymol.cmd.button("single_right", "None", "None") - - self.pymol.cmd.set("internal_gui_mode", "0") - self.pymol.cmd.set("internal_feedback", "0") - if sequence: - self.pymol.cmd.set("seq_view", "1") - if File is not "": - self.nFrames += 1 - self.pymol.cmd.load(File, 'p', self.nFrames) - - self.pymol.reshape(self.width(),self.height()) - self._timer = QtCore.QTimer() - self._timer.setSingleShot(True) - self._timer.timeout.connect(self._pymolProcess) - self.resizeGL(self.width(),self.height()) - #globalSettings.settingsChanged.connect(self._updateGlobalSettings) - self._updateGlobalSettings() - - def openFile(self, File, frame=None, mode=None, verbose=True, object_name=None): - if self.play is True: - self.pymol.cmd.mplay() - - if frame is None: - self.nFrames += 1 - frame = self.nFrames - - object_name = object_name if object_name is not None else os.path.basename(File) - if verbose: - print("Pymol opening file: %s" % File) - print("Object name: %s" % object_name) - self.pymol.cmd.load(File, object_name, frame) - if self.nFrames == 1: - if mode is not None: - if mode == 'coarse': - self.pymolWidget.pymol.cmd.hide('all') - self.pymolWidget.pymol.cmd.do('show ribbon') - self.pymolWidget.pymol.cmd.do('show spheres, name cb') - else: - self.pymol.cmd.hide('all') - self.pymol.cmd.show(mode) - - self.pymol.cmd.orient() - #self.pymol.cmd.iterate_state() - - def __del__(self): - pass - - def _updateGlobalSettings(self): - #for k,v in globalSettings.settings.iteritems(): - # self.pymol.cmd.set(k, v) - #self.update() - return - - def redoSizing(self): - self.resizeGL(self.width(), self.height()) - - def paintGL(self): - glViewport(0, 0, self.width(), self.height()) - bottom = self.mapToGlobal(QtCore.QPoint(0,self.height())).y() - #self.pymol.cmd.set("_stencil_parity", bottom & 0x1) - self._doIdle() - self.pymol.draw() - - def mouseMoveEvent(self, ev): - self.pymol.drag(ev.x(), self.height()-ev.y(),0) - self._pymolProcess() - - def mousePressEvent(self, ev): - if not self._enableUi: - self.pymol.cmd.button("double_left","None","None") - self.pymol.cmd.button("single_right","None","None") - self.pymol.button(self._buttonMap[ev.button()], 0, ev.x(), - self.height() - ev.y(),0) - self._pymolProcess() - - def mouseReleaseEvent(self, ev): - self.pymol.button(self._buttonMap[ev.button()], 1, ev.x(), - self.height()-ev.y(),0) - self._pymolProcess() - self._timer.start(0) - - def resizeGL(self, w, h): - self.pymol.reshape(w,h, True) - self._pymolProcess() - - def initializeGL(self): - pass - - def _pymolProcess(self): - self._doIdle() - self.update() - - def _doIdle(self): - if self.pymol.idle(): - self._timer.start(0) - - def strPDB(self, str): - self.cmd.read_pdbstr(str) - - def reset(self): - self.nFrames = 0 - self.pymol.cmd.reinitialize() - - -class ControlWidget(QtWidgets.QWidget): - - history = ['spectrum count, rainbow_rev, all, byres=1', - 'intra_fit all'] - - def __init__(self, parent=None): - QtWidgets.QWidget.__init__(self) - uic.loadUi('experiments/plots/ui/molViewControlWidget.ui', self) - self.parent = parent - - - self.connect(self.pushButton_4, QtCore.SIGNAL("clicked()"), self.onReset) - self.connect(self.pushButton_6, QtCore.SIGNAL("clicked()"), self.onIntrafit) - self.connect(self.pushButton_5, QtCore.SIGNAL("clicked()"), self.onExeCommand) - - self.connect(self.actionNext_frame, QtCore.SIGNAL('triggered()'), self.onNextFrame) - self.connect(self.actionPrevious_frame, QtCore.SIGNAL('triggered()'), self.onPreviousFrame) - self.connect(self.actionPause, QtCore.SIGNAL('triggered()'), self.onStopPymol) - self.connect(self.actionPlay, QtCore.SIGNAL('triggered()'), self.onPlayPymol) - self.connect(self.actionTo_last_frame, QtCore.SIGNAL('triggered()'), self.onLastState) - self.connect(self.actionTo_first_frame, QtCore.SIGNAL('triggered()'), self.onFirstState) - - - self.connect(self.lineEdit, QtCore.SIGNAL("returnPressed ()"), self.onExeCommand) - self.connect(self.radioButton, QtCore.SIGNAL("clicked()"), self.onUpdateSpectrum) - self.connect(self.radioButton_2, QtCore.SIGNAL("clicked()"), self.onUpdateSpectrum) - self.connect(self.actionCurrentStateChanged, QtCore.SIGNAL('triggered()'), self.onCurrentStateChanged) - - def onPreviousFrame(self): - s = self.current_state - s -= 1 - s = self.n_states if s < 1 else s - self.current_state = (s % self.n_states) + 1 - - def onNextFrame(self): - self.current_state = ((self.current_state + 1) % self.n_states) + 1 - - def onCurrentStateChanged(self): - self.parent.pymolWidget.pymol.cmd.do("set state, %i" % self.current_state) - - @property - def current_state(self): - return int(self.spinBox.value()) - - @current_state.setter - def current_state(self, v): - self.spinBox.setValue(v) - self.parent.pymolWidget.pymol.cmd.do("set state, %i" % v) - self.onCurrentStateChanged() - - @property - def n_states(self): - return int(self.spinBox_2.value()) - - @n_states.setter - def n_states(self, v): - self.spinBox_2.setValue(v) - self.horizontalSlider.setMaximum(v) - self.spinBox.setMaximum(v) - - @property - def spectrum_type(self): - if self.radioButton.isChecked(): - return 'movemap' - elif self.radioButton_2.isChecked(): - return 'index' - - @property - def pymol(self): - return self.parent.pymolWidget.pymol - - def onIntrafit(self): - self.pymol.cmd.do("intra_fit all") - - @property - def first_frame(self): - return int(self.spinBox_3.value()) - - @property - def last_frame(self): - return int(self.spinBox_2.value()) - - @property - def step(self): - return int(self.spinBox.value()) - - def onLastState(self): - self.parent.pymolWidget.pymol.cmd.do("set state, %i" % self.n_states) - self.current_state = self.n_states - - def onFirstState(self): - self.parent.pymolWidget.pymol.cmd.do("set state, %i" % 1) - self.current_state = 1 - - def onExeCommand(self): - print("onExeCommand") - sys.stdout = EmittingStream(textWritten=self.normalOutputWritten) - c = str(self.lineEdit.text()) - print("%s" % c) - self.parent.pymolWidget.pymol.cmd.do(c) - self.lineEdit.clear() - sys.stdout = sys.__stdout__ - - def normalOutputWritten(self, text): - """Append text to the QTextEdit.""" - # Maybe QTextEdit.append() works as well, but this is how I do it: - cursor = self.plainTextEdit.textCursor() - cursor.movePosition(QtGui.QTextCursor.End) - cursor.insertText(text) - self.plainTextEdit.setTextCursor(cursor) - self.plainTextEdit.ensureCursorVisible() - - def onUpdateSpectrum(self): - if self.spectrum_type == 'movemap': - self.parent.pymolWidget.pymol.cmd.do("spectrum b") - elif self.spectrum_type == 'index': - self.parent.pymolWidget.pymol.cmd.do('spectrum count, rainbow_rev, all, byres=1') - - def onStopPymol(self): - print("onStopPymol") - self.parent.pymolWidget.pymol.cmd.mstop() - - def onPlayPymol(self): - print("onPlayPymol") - self.parent.pymolWidget.pymol.cmd.mplay() - - def onReset(self): - self.plainTextEdit.clear() - self.parent.reset() - - -class MolView(Plot): - - name = "MolView" - - def __init__(self, fit=None, enableUi=False, mode='cartoon', sequence=True): - Plot.__init__(self) - self.fit = fit - self.mode = mode - self.pltControl = ControlWidget(self) - self.layout = QtGui.QVBoxLayout(self) - - self.pymolWidget = MolQtWidget(self, play=False, sequence=sequence, enableUi=enableUi) - self.layout.addWidget(self.pymolWidget) - self.open_structure(fit.data) - - def open_file(self, filename, bfact=None): - self.pymolWidget.openFile(filename, mode=self.mode) - self.set_bfactor(bfact) - - def set_bfactor(self, bfact=None): - if bfact is not None: - self.pymolWidget.pymol.bfact = list(bfact) - self.pymolWidget.pymol.cmd.alter("all and n. CA", "b=bfact.pop(0)") - self.pymolWidget.pymol.cmd.do("orient") - - def append_structure(self, structure): - self.pymolWidget.pymol.cmd.read_pdbstr(str(structure), 'p') - self.pltControl.n_states = self.pymolWidget.pymol.cmd.count_states(selection="(all)") - - def open_structure(self, structure, bfact=None, mode=None): - mode = mode if mode is not None else self.mode - self.pymolWidget.pymol.cmd.read_pdbstr(str(structure), 'p') - self.set_bfactor(bfact) - - if mode is not None: - if mode == 'coarse': - self.pymolWidget.pymol.cmd.hide('all') - self.pymolWidget.pymol.cmd.do('show ribbon') - self.pymolWidget.pymol.cmd.do('show spheres, name cb') - else: - self.pymol.cmd.hide('all') - self.pymol.cmd.show(mode) - - def replace_structure(self, structure, bfact, stateNbr=0): - print("MolView:replace_structure") - self.open_structure(structure, stateNbr, mode=self.mode) - self.set_bfactor(bfact) - - def setState(self, nbr): - print("set state: % s" % nbr) - self.pymolWidget.pymol.cmd.set("state", nbr) - - def reset(self): - self.pymolWidget.reset() - - def colorStates(self, rgbColors): - print("colorStates") # TODO - for i, r in enumerate(rgbColors): - color = "[%s, %s, %s]" % (r[0] / 255., r[1] / 255., r[2] / 255.) - self.pymolWidget.pymol.cmd.set_color("tmpcolor", color) - self.pymolWidget.pymol.cmd.set("cartoon_color", "tmpcolor", "p", (i + 1)) - diff --git a/quest/lib/plots/__init__.py b/quest/lib/plots/__init__.py deleted file mode 100644 index 437fe92..0000000 --- a/quest/lib/plots/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .lineplot import * -from .MolView import * -from .plotbase import * diff --git a/quest/lib/plots/lineplot.py b/quest/lib/plots/lineplot.py deleted file mode 100644 index ad68f56..0000000 --- a/quest/lib/plots/lineplot.py +++ /dev/null @@ -1,195 +0,0 @@ -from qtpy import QtGui, QtCore, QtWidgets, uic -import numpy as np -import pyqtgraph as pg - -from lib.plots.plotbase import Plot -from lib.math import autocorr - - -class _PGPlotAdapter: - def __init__(self, title=None, xlabel=None, ylabel=None): - self.widget = pg.PlotWidget(title=title) - if xlabel: - self.widget.setLabel('bottom', xlabel) - if ylabel: - self.widget.setLabel('left', ylabel) - self._plot_item = self.widget.getPlotItem() - - def add_item(self, item): - self._plot_item.addItem(item) - - def create_curve(self, pen=None, name=None): - return self._plot_item.plot([], [], pen=pen, name=name) - - def set_scales(self, x_scale, y_scale): - self.widget.setLogMode(x_scale == 'log', y_scale == 'log') - - def do_autoscale(self): - self._plot_item.enableAutoRange(True, True) - self._plot_item.autoRange() - - -class linePlotWidget(QtWidgets.QWidget): - def __init__(self, parent=None, d_scalex='lin', d_scaley='log', r_scalex='lin', r_scaley='lin'): - QtWidgets.QWidget.__init__(self) - uic.loadUi('experiments/plots/ui/linePlotWidget.ui', self) - self.parent = parent - - self.connect(self.checkBox, QtCore.SIGNAL("stateChanged (int)"), self.SetLog) - self.connect(self.checkBox_2, QtCore.SIGNAL("stateChanged (int)"), self.SetLog) - self.connect(self.checkBox_3, QtCore.SIGNAL("stateChanged (int)"), self.SetLog) - self.connect(self.checkBox_4, QtCore.SIGNAL("stateChanged (int)"), self.SetLog) - - self.data_logy = d_scaley - self.data_logx = d_scalex - self.res_logx = r_scalex - self.res_logy = r_scaley - - @property - def data_logy(self): - return 'log' if self.checkBox.isChecked() else 'lin' - - @data_logy.setter - def data_logy(self, v): - if v == 'lin': - self.checkBox.setCheckState(0) - else: - self.checkBox.setCheckState(2) - - @property - def data_logx(self): - return 'log' if self.checkBox_2.isChecked() else 'lin' - - @data_logx.setter - def data_logx(self, v): - if v == 'lin': - self.checkBox_2.setCheckState(0) - else: - self.checkBox_2.setCheckState(2) - - @property - def res_logx(self): - return 'log' if self.checkBox_3.isChecked() else 'lin' - - @res_logx.setter - def res_logx(self, v): - if v == 'lin': - self.checkBox_3.setCheckState(0) - else: - self.checkBox_3.setCheckState(2) - - @property - def res_logy(self): - return 'log' if self.checkBox_4.isChecked() else 'lin' - - @res_logy.setter - def res_logy(self, v): - if v == 'lin': - self.checkBox_4.setCheckState(0) - else: - self.checkBox_4.setCheckState(2) - - def SetLog(self): - print("SetLog") - self.parent.residualPlot.set_scales(self.res_logx, self.res_logy) - self.parent.autoCorrPlot.set_scales(self.res_logx, self.res_logy) - self.parent.dataPlot.set_scales(self.data_logx, self.data_logy) - - -class LinePlot(Plot): - - name = "Fit" - - def __init__(self, fit, d_scalex='lin', d_scaley='lin', r_scalex='lin', r_scaley='lin'): - Plot.__init__(self) - self.layout = QtGui.QVBoxLayout(self) - self.fit = fit - - bottom = QtGui.QFrame(self) - bottom.setFrameShape(QtGui.QFrame.StyledPanel) - botl = QtGui.QVBoxLayout(bottom) - - top = QtGui.QFrame(self) - top.setMaximumHeight(140) - top.setFrameShape(QtGui.QFrame.StyledPanel) - topl = QtGui.QVBoxLayout(top) - - splitter1 = QtGui.QSplitter(QtCore.Qt.Vertical) - splitter1.addWidget(top) - splitter1.addWidget(bottom) - self.layout.addWidget(splitter1) - - # Data-Fit plot - fd = _PGPlotAdapter() - pen_data = pg.mkPen(color='b', width=1) - pen_irf = pg.mkPen(color='r', width=1) - pen_model = pg.mkPen(color='g', width=4) - self.data_curve = fd.create_curve(pen=pen_data, name="data") - self.irf_curve = fd.create_curve(pen=pen_irf, name="irf") - self.model_curve = fd.create_curve(pen=pen_model, name="model") - self.dataPlot = fd - botl.addWidget(fd.widget) - - splitter1 = QtGui.QSplitter(QtCore.Qt.Horizontal) - topl.addWidget(splitter1) - - # Residual plot - win = _PGPlotAdapter() - self.residual_curve = win.create_curve(pen=pg.mkPen(color='r', width=2)) - self.chi2_label = pg.TextItem("") - self.chi2_label.setAnchor((1, 0)) - self.chi2_label.setPos(0, 0) - win.add_item(self.chi2_label) - title = pg.TextItem("w.res.") - title.setPos(0, 0) - win.add_item(title) - self.residualPlot = win - splitter1.addWidget(win.widget) - - win = _PGPlotAdapter() - self.autocorr_curve = win.create_curve(pen=pg.mkPen(color='r', width=2)) - title = pg.TextItem("auto.cor.") - title.setPos(0, 0) - win.add_item(title) - self.autoCorrPlot = win - splitter1.addWidget(win.widget) - - self.pltControl = linePlotWidget(self, d_scalex, d_scaley, r_scalex, r_scaley) - - def updateAll(self): - print("TCSPCPlot:update") - fit = self.fit - self.chi2_label.setText("χ²=%.4f" % fit.chi2r) - if fit is not None: - - data_x, data_y = fit.data.x, fit.data.y - idx = np.where(data_y > 0.0)[0] if self.pltControl.data_logy else list(range(len(data_x))) - self.data_curve.setData(data_x[idx], data_y[idx]) - - try: - irf = fit.model.convolve.irf - irf_y = irf.y - idx = np.where(irf_y > 0.0)[0] if self.pltControl.data_logy else list(range(len(data_x))) - self.irf_curve.setData(irf.x[idx], irf_y[idx]) - except AttributeError: - print("No instrument response to plot.") - try: - model_x, model_y = fit[:] - idx = np.where(model_y > 0.0)[0] if self.pltControl.data_logy else list(range(len(data_x))) - if len(idx) > 0: - self.model_curve.setData(model_x[idx], model_y[idx]) - except ValueError: - print("No model/no fitted model to plot") - try: - wres_y = fit.weighted_residuals - self.residual_curve.setData(model_x, wres_y) - if len(wres_y) > 0: - ac = autocorr(wres_y) - self.autocorr_curve.setData(model_x[1::], ac[1:]) - - except (TypeError, AttributeError): - pass - self.residualPlot.do_autoscale() - self.dataPlot.do_autoscale() - self.autoCorrPlot.do_autoscale() - print("END:TCSPCPlot:update") diff --git a/quest/lib/plots/plotbase.py b/quest/lib/plots/plotbase.py deleted file mode 100644 index 8cac7d1..0000000 --- a/quest/lib/plots/plotbase.py +++ /dev/null @@ -1,34 +0,0 @@ -from qtpy import QtGui, QtCore, QtWidgets, uic - -from lib import Genealogy - - -class Plot(QtWidgets.QWidget, Genealogy): - def __init__(self, parent=None): - Genealogy.__init__(self) - QtWidgets.QWidget.__init__(self, parent) - parent = parent - self.widgets = [] - - def hide(self): - fit = self.fit - self.hide() - try: - self.pltControl.hide() - except AttributeError: - print("No plot-control widget to hide.") - - def updateWidget(self): - for w in self.widgets: - w.update() - - def updateAll(self): - pass - - def close(self): - QtWidgets.QWidget.close(self) - try: - self.pltControl.close() - except AttributeError: - print(self) - print("No plot-control widget to close.") diff --git a/quest/lib/plots/ui/__init__.py b/quest/lib/plots/ui/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/quest/lib/plots/ui/linePlotWidget.ui b/quest/lib/plots/ui/linePlotWidget.ui deleted file mode 100644 index ad4b201..0000000 --- a/quest/lib/plots/ui/linePlotWidget.ui +++ /dev/null @@ -1,123 +0,0 @@ - - - Form - - - - 0 - 0 - 286 - 379 - - - - Form - - - - 0 - - - 0 - - - - - - - - 0 - 0 - - - - wres - - - false - - - - 0 - - - 0 - - - - - logY - - - - - - - logX - - - - - - - - - - - 0 - 0 - - - - data - - - - 0 - - - 0 - - - - - logX - - - false - - - - - - - logY - - - false - - - - - - - - - - - - Qt::Vertical - - - - 20 - 321 - - - - - - - - - diff --git a/quest/lib/plots/ui/molViewControlWidget.ui b/quest/lib/plots/ui/molViewControlWidget.ui deleted file mode 100644 index 42c1254..0000000 --- a/quest/lib/plots/ui/molViewControlWidget.ui +++ /dev/null @@ -1,501 +0,0 @@ - - - Form - - - - 0 - 0 - 449 - 531 - - - - Form - - - - 0 - - - - - MolView - - - - 0 - - - 0 - - - - - - - Color the residues according to their probability to be altered during the MC. - - - movemap - - - true - - - - - - - Color the residues by residue number - - - index - - - - - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Current frame - - - 1 - - - 1 - - - 1 - - - - - - - false - - - - 0 - 0 - - - - Number of frames - - - 99999 - - - 1 - - - - - - - - - Start/Stop - - - - - - - 0 - - - - - first frame - - - |< - - - - - - - Previous frame - - - < - - - - - - - Pause - - - || - - - - - - - Play - - - |> - - - - - - - Next frame - - - > - - - - - - - Last frame - - - >| - - - - - - - - 0 - 0 - - - - - 45 - 16777215 - - - - Clear MolWidget (delete all frames) - - - clear - - - - - - - - - Spectrum - - - - - - - 0 - - - - - CMD - - - - - - - - - - - 50 - 16777215 - - - - Execute a command - - - exe - - - - - - - - - Qt::ScrollBarAlwaysOn - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Align all frames - - - align - - - - - - - 1 - - - 1 - - - Qt::Horizontal - - - - - - - - - - currentStateChanged - - - - - To first frame - - - - - To last frame - - - - - Play - - - - - Pause - - - - - Next frame - - - - - Previous frame - - - - - - - horizontalSlider - valueChanged(int) - actionCurrentStateChanged - trigger() - - - 64 - 48 - - - -1 - -1 - - - - - horizontalSlider - valueChanged(int) - spinBox - setValue(int) - - - 64 - 48 - - - 241 - 25 - - - - - toolButton_3 - clicked() - actionTo_first_frame - trigger() - - - 25 - 26 - - - -1 - -1 - - - - - toolButton_4 - clicked() - actionTo_last_frame - trigger() - - - 121 - 26 - - - -1 - -1 - - - - - toolButton_5 - clicked() - actionPlay - trigger() - - - 100 - 26 - - - -1 - -1 - - - - - toolButton_6 - clicked() - actionPause - trigger() - - - 58 - 26 - - - -1 - -1 - - - - - toolButton - clicked() - actionNext_frame - trigger() - - - 104 - 26 - - - -1 - -1 - - - - - toolButton_2 - clicked() - actionPrevious_frame - trigger() - - - 37 - 26 - - - -1 - -1 - - - - - spinBox - valueChanged(int) - actionCurrentStateChanged - trigger() - - - 308 - 25 - - - -1 - -1 - - - - - spinBox - valueChanged(int) - horizontalSlider - setValue(int) - - - 308 - 25 - - - 93 - 48 - - - - - diff --git a/quest/lib/tools/dye_diffusion/dye_diffusion2.ui b/quest/lib/tools/dye_diffusion/dye_diffusion2.ui deleted file mode 100644 index 9a4a01d..0000000 --- a/quest/lib/tools/dye_diffusion/dye_diffusion2.ui +++ /dev/null @@ -1,929 +0,0 @@ - - - Form - - - - 0 - 0 - 943 - 546 - - - - Dye-quenching - - - - :/icons/icons/dye-diffusion.ico:/icons/icons/dye-diffusion.ico - - - - - - Qt::Horizontal - - - - - 0 - 0 - - - - - 400 - 16777215 - - - - - 0 - - - 0 - - - - - 0 - - - - - Settings - - - - - - - false - - - - - - - false - - - ... - - - - - - - - - 0 - - - - - - 0 - 0 - - - - PDB - - - - - - - true - - - - - - - ... - - - - - - - - - Sticky - - - true - - - - 0 - - - 0 - - - - - Rs[A] - - - - - - - - 0 - 0 - - - - All points within the AV within a radius of R next to the selection are slowed down - - - 100.000000000000000 - - - 9.000000000000000 - - - - - - - slow factor - - - - - - - The diffusion coefficient outside the sicky volume is reduced by this factor - - - 3 - - - 1.000000000000000 - - - 0.050000000000000 - - - 0.050000000000000 - - - - - - - The "surface" of the AV is defined by selecting AV-points within a sphere of radius Rs around the Cbeta atoms - - - Surface - - - true - - - - - - - true - - - Quencher - - - false - - - - - - - Qt::Vertical - - - - - - - - - - Label - - - - 0 - - - 0 - - - - - Length - - - - - - - Width - - - - - - - The width of the dye linker in Angström - - - 0.100000000000000 - - - 10.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - Resolution of the AV (grid-parameter) in Angström - - - 1.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - dg - - - - - - - 0 - - - - - - - Radius of the dye in Angström - - - 0.100000000000000 - - - 0.250000000000000 - - - 5.000000000000000 - - - - - - - - 0 - 0 - - - - The length of the dye linker in Angström - - - 1.000000000000000 - - - 20.000000000000000 - - - - - - - Radius - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Dye - - - - 0 - - - 0 - - - - - D [A2/ns] - - - - - - - - 0 - 0 - - - - tau0 - - - - - - - - 0 - 0 - - - - Lifetime of the dye in absence of quenching - - - 0.010000000000000 - - - 0.100000000000000 - - - 4.000000000000000 - - - - - - - - 0 - 0 - - - - Diffusion coefficent of the dye in the non-sticky part of the accessible volume - - - 1 - - - 101.000000000000000 - - - 7.000000000000000 - - - - - - - - - - Quencher - - - - 0 - - - 0 - - - - - If the dye is quenched if it is in a part of the AV within a radius of the Quenching atoms - - - 0.250000000000000 - - - 6.500000000000000 - - - - - - - Quench radius [A] - - - - - - - Quenching probability. If zero no quenching if 1 instantaneous quenching. Values inbetween radiation boundary condition (see Lakowicz) - - - 1 - - - 0.000000000000000 - - - 10000.000000000000000 - - - 0.010000000000000 - - - 100.000000000000000 - - - - - - - - 0 - 0 - - - - TRP TYR HIS PRO PHE - - - - - - - - 0 - 0 - - - - kQ[1/ns] - - - - - - - false - - - Exclude atoms - - - true - - - false - - - - 0 - - - 0 - - - - - CA, C, HA, N - - - - - - - - - - - - - Simulation - - - - 0 - - - 0 - - - - - dt [ps] - - - - - - - - 0 - 0 - - - - 0 - - - 16.000000000000000 - - - - - - - - 0 - 0 - - - - 200.000000000000000 - - - 2.500000000000000 - - - - - - - sim time [µs] - - - - - - - nPhotons [Million] - - - - - - - - 0 - 0 - - - - 0.250000000000000 - - - 3.000000000000000 - - - - - - - frames - - - - - - - false - - - - 0 - 0 - - - - 99999999 - - - 156250 - - - - - - - - 0 - 0 - - - - update - - - - - - - show AV - - - - - - - - - - Results - - - - 0 - - - 0 - - - - - Skip every x'th frame in the trajectory (save space for saving) - - - 99999 - - - 50 - - - - - - - skip - - - - - - - collided [%] - - - - - - - save hist - - - - - - - - 0 - 0 - - - - 8192 - - - 4096 - - - - - - - save AV - - - - - - - - - 1 - - - 0.100000000000000 - - - - - - - 1 - - - 50.000000000000000 - - - - - - - - - true - - - 1.000000000000000 - - - - - - - nBins - - - - - - - range - - - - - - - QY(F) - - - - - - - true - - - 2 - - - - - - - 0 - - - - - Prefix - - - - - - - out - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 0 - - - - Trajectory - - - - - - - - - - Decay - - - - - - - - - - 3D-Illustration - - - - - - - - - - - - - - Load settings - - - - - Load PDB - - - - - - - - - toolButton_2 - clicked() - actionLoad_PDB - trigger() - - - 479 - 46 - - - -1 - -1 - - - - - toolButton - clicked() - actionLoad_settings - trigger() - - - 479 - 21 - - - -1 - -1 - - - - - diff --git a/quest/lib/ui/__init__.py b/quest/lib/ui/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/quest/lib/ui/av_property.ui b/quest/lib/ui/av_property.ui deleted file mode 100644 index 9bb8b11..0000000 --- a/quest/lib/ui/av_property.ui +++ /dev/null @@ -1,231 +0,0 @@ - - - Form - - - - 0 - 0 - 223 - 100 - - - - Form - - - - 0 - - - 0 - - - - - Linker-length - - - - - - - 1 - - - 999.000000000000000 - - - 20.000000000000000 - - - - - - - 1 - - - 0.100000000000000 - - - 1.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - Linker-width - - - - - - - 1 - - - 0.100000000000000 - - - 4.500000000000000 - - - - - - - 1 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - Resolution - - - - - - - Initial Sphere - - - - - - - 1 - - - 5.000000000000000 - - - - - - - Radius 1 - - - - - - - Radius 2 - - - - - - - 1 - - - 0.100000000000000 - - - - - - - 1 - - - 0.100000000000000 - - - - - - - Radius 3 - - - - - - - Initial Sphere - - - true - - - false - - - - 0 - - - 0 - - - - - - 0 - 0 - - - - min - - - - - - - 1 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - max - - - - - - - 1 - - - 0.100000000000000 - - - 1.000000000000000 - - - - - - - - - - - diff --git a/quest/lib/ui/dye_diffusion.ui b/quest/lib/ui/dye_diffusion.ui deleted file mode 100644 index 3f310da..0000000 --- a/quest/lib/ui/dye_diffusion.ui +++ /dev/null @@ -1,848 +0,0 @@ - - - Form - - - - 0 - 0 - 853 - 478 - - - - Dye-quenching - - - - - - Qt::Horizontal - - - - - 0 - 0 - - - - - 380 - 16777215 - - - - - 0 - - - 0 - - - - - Simulation - - - - 0 - - - 0 - - - - - dt [ps] - - - - - - - - 0 - 0 - - - - 2.000000000000000 - - - - - - - false - - - IRF - - - - - - - - 0 - 0 - - - - 200.000000000000000 - - - 5.000000000000000 - - - - - - - sim time [µs] - - - - - - - false - - - load - - - - - - - false - - - true - - - - - - - nPhotons [Million] - - - - - - - - 0 - 0 - - - - 0.250000000000000 - - - 6.000000000000000 - - - - - - - frames - - - - - - - false - - - - 0 - 0 - - - - 99999999 - - - - - - - - 0 - 0 - - - - update - - - - - - - - - - Results - - - - 0 - - - 0 - - - - - range - - - - - - - QY(F) - - - - - - - nBins - - - - - - - save hist - - - - - - - save AV - - - - - - - - 0 - 0 - - - - 8192 - - - 4096 - - - - - - - collided [%] - - - - - - - true - - - 1.000000000000000 - - - - - - - true - - - 1 - - - - - - - - - 1 - - - 0.100000000000000 - - - - - - - 1 - - - 50.000000000000000 - - - - - - - - - - - - Sticky - - - - 0 - - - 0 - - - - - C-beta - - - false - - - - - - - true - - - Quencher - - - true - - - - - - - R[A] - - - - - - - All points within the AV within a radius of R next to the selection are slowed down - - - 100.000000000000000 - - - 12.000000000000000 - - - - - - - slow factor - - - - - - - The diffusion coefficient outside the sicky volume is reduced by this factor - - - 3 - - - 1.000000000000000 - - - 0.050000000000000 - - - 0.010000000000000 - - - - - - - - - - Quencher - - - - 0 - - - 0 - - - - - CG CB - - - - - - - - 0 - 0 - - - - TRP - - - - - - - Quenching probability. If zero no quenching if 1 instantaneous quenching. Values inbetween radiation boundary condition (see Lakowicz) - - - 4 - - - 0.000000000000000 - - - 100.000000000000000 - - - 0.000100000000000 - - - 0.500000000000000 - - - - - - - - 0 - 0 - - - - p quench [%] - - - - - - - If the dye is quenched if it is in a part of the AV within a radius of the Quenching atoms - - - 0.250000000000000 - - - 9.000000000000000 - - - - - - - - 0 - 0 - - - - HIS - - - - - - - - 0 - 0 - - - - TYR - - - - - - - CG CB - - - - - - - CZ CB - - - - - - - Quench radius [A] - - - - - - - Qt::Horizontal - - - - - - - - - - Label - - - - 0 - - - 0 - - - - - Radius - - - - - - - 0.100000000000000 - - - 0.250000000000000 - - - 5.000000000000000 - - - - - - - Width - - - - - - - - 0 - 0 - - - - 1.000000000000000 - - - 20.000000000000000 - - - - - - - Length - - - - - - - 0.100000000000000 - - - 10.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - dg - - - - - - - 1.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - - - - Atom - - - - - - - Residue - - - - - - - - - - - 0 - 0 - - - - - - - - Chain - - - - - - - - - - 0 - - - - - - 0 - 0 - - - - PDB - - - - - - - true - - - - - - - - 0 - 0 - - - - load - - - - - - - - - 0 - - - - - Output Prefix - - - - - - - out - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Dye - - - - 0 - - - 0 - - - - - D [A/ns2] - - - - - - - - 0 - 0 - - - - tau0 - - - - - - - - 0 - 0 - - - - Lifetime of the dye in absence of quenching - - - 0.010000000000000 - - - 0.100000000000000 - - - 4.000000000000000 - - - - - - - - 0 - 0 - - - - Diffusion coefficent of the dye in the non-sticky part of the accessible volume - - - 100.989999999999995 - - - 40.000000000000000 - - - - - - - - - - - 0 - - - - Decay - - - - - - - - - - 3D-Illustration - - - - - - - - - - - - - - - diff --git a/quest/lib/ui/dye_diffusion3.ui b/quest/lib/ui/dye_diffusion3.ui deleted file mode 100644 index cca947a..0000000 --- a/quest/lib/ui/dye_diffusion3.ui +++ /dev/null @@ -1,885 +0,0 @@ - - - Form - - - - 0 - 0 - 853 - 509 - - - - Dye-quenching - - - - - - Qt::Horizontal - - - - - 0 - 0 - - - - - 380 - 16777215 - - - - - 0 - - - 0 - - - - - Simulation - - - - 0 - - - 0 - - - - - frames - - - - - - - dt [ps] - - - - - - - - 0 - 0 - - - - 2.000000000000000 - - - - - - - - 0 - 0 - - - - 0.250000000000000 - - - 6.000000000000000 - - - - - - - - 0 - 0 - - - - 200.000000000000000 - - - 5.000000000000000 - - - - - - - false - - - - 0 - 0 - - - - 99999999 - - - - - - - nPhotons [Million] - - - - - - - sim time [µs] - - - - - - - - 0 - 0 - - - - update - - - - - - - false - - - load - - - - - - - false - - - true - - - - - - - false - - - IRF - - - - - - - - - - Results - - - - 0 - - - 0 - - - - - range - - - - - - - QY(F) - - - - - - - nBins - - - - - - - save hist - - - - - - - save AV - - - - - - - - 0 - 0 - - - - 8192 - - - 4096 - - - - - - - collided [%] - - - - - - - true - - - 1.000000000000000 - - - - - - - true - - - 1 - - - - - - - - - 1 - - - 0.100000000000000 - - - - - - - 1 - - - 50.000000000000000 - - - - - - - - - - - - Sticky - - - - 0 - - - 0 - - - - - The "surface" of the AV is defined by selecting AV-points within a sphere of radius Rs around the Cbeta atoms - - - Surface - - - false - - - - - - - Rs[A] - - - - - - - All points within the AV within a radius of R next to the selection are slowed down - - - 100.000000000000000 - - - 12.000000000000000 - - - - - - - slow factor - - - - - - - The diffusion coefficient outside the sicky volume is reduced by this factor - - - 3 - - - 1.000000000000000 - - - 0.050000000000000 - - - 0.010000000000000 - - - - - - - true - - - Quencher - - - true - - - - - - - Pocket - - - - - - - - - - Label - - - - 0 - - - 0 - - - - - Radius - - - - - - - Radius of the dye in Angström - - - 0.100000000000000 - - - 0.250000000000000 - - - 5.000000000000000 - - - - - - - Width - - - - - - - - 0 - 0 - - - - The length of the dye linker in Angström - - - 1.000000000000000 - - - 20.000000000000000 - - - - - - - Length - - - - - - - The width of the dye linker in Angström - - - 0.100000000000000 - - - 10.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - dg - - - - - - - Resolution of the AV (grid-parameter) in Angström - - - 1.000000000000000 - - - 0.100000000000000 - - - 0.500000000000000 - - - - - - - - - - Atom - - - - - - - Residue - - - - - - - - - - - 0 - 0 - - - - - - - - Chain - - - - - - - - - - 0 - - - - - - 0 - 0 - - - - PDB - - - - - - - true - - - - - - - - 0 - 0 - - - - load - - - - - - - - - 0 - - - - - Output Prefix - - - - - - - out - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Dye - - - - 0 - - - 0 - - - - - D [A/ns2] - - - - - - - - 0 - 0 - - - - tau0 - - - - - - - - 0 - 0 - - - - Lifetime of the dye in absence of quenching - - - 0.010000000000000 - - - 0.100000000000000 - - - 4.000000000000000 - - - - - - - - 0 - 0 - - - - Diffusion coefficent of the dye in the non-sticky part of the accessible volume - - - 100.989999999999995 - - - 7.000000000000000 - - - - - - - - - - Quencher - - - - 0 - - - 0 - - - - - kQD - - - - - - - 0.250000000000000 - - - 1.500000000000000 - - - - - - - 0.250000000000000 - - - 3.500000000000000 - - - - - - - CG CB - - - - - - - CG CB - - - - - - - 0.250000000000000 - - - 3.500000000000000 - - - - - - - CZ CB - - - - - - - If the dye is quenched if it is in a part of the AV within a radius of the Quenching atoms - - - 0.250000000000000 - - - 11.000000000000000 - - - - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - TYR - - - - - - - - - - - 0 - 0 - - - - HIS - - - - - - - - 0 - 0 - - - - TRP - - - - - - - Rq - - - - - - - - - - Residue name - - - - - - - - - - - 0 - - - - Decay - - - - - - - - - - 3D-Illustration - - - - - - - - - - - - - - - diff --git a/quest/lib/ui/icons/__init__.py b/quest/lib/ui/icons/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/quest/lib/ui/rescource.qrc b/quest/lib/ui/rescource.qrc deleted file mode 100644 index 6ef4597..0000000 --- a/quest/lib/ui/rescource.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - icons/dye-diffusion.ico - - diff --git a/quest/lib/ui/rescource_rc.py b/quest/lib/ui/rescource_rc.py deleted file mode 100644 index 1ff9bbb..0000000 --- a/quest/lib/ui/rescource_rc.py +++ /dev/null @@ -1,1533 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.9.6) -# -# WARNING! All changes made in this file will be lost! - -from qtpy import QtCore - -qt_resource_data = b"\ -\x00\x00\x5c\x06\ -\x00\ -\x00\x01\x00\x08\x00\x20\x20\x10\x00\x01\x00\x04\x00\xe8\x02\x00\ -\x00\x86\x00\x00\x00\x10\x10\x10\x00\x01\x00\x04\x00\x28\x01\x00\ -\x00\x6e\x03\x00\x00\x30\x30\x00\x00\x01\x00\x08\x00\xa8\x0e\x00\ -\x00\x96\x04\x00\x00\x20\x20\x00\x00\x01\x00\x08\x00\xa8\x08\x00\ -\x00\x3e\x13\x00\x00\x10\x10\x00\x00\x01\x00\x08\x00\x68\x05\x00\ -\x00\xe6\x1b\x00\x00\x30\x30\x00\x00\x01\x00\x20\x00\xa8\x25\x00\ -\x00\x4e\x21\x00\x00\x20\x20\x00\x00\x01\x00\x20\x00\xa8\x10\x00\ -\x00\xf6\x46\x00\x00\x10\x10\x00\x00\x01\x00\x20\x00\x68\x04\x00\ -\x00\x9e\x57\x00\x00\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\ -\x00\x01\x00\x04\x00\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x0c\x0d\x0d\ -\x00\x32\x44\x3f\x00\x71\x6e\x69\x00\x84\x7b\x77\x00\x1f\xd0\x28\ -\x00\x9a\x84\x75\x00\x58\xa6\xcb\x00\xa5\xa9\xa6\x00\xdb\xb4\x98\ -\x00\x95\xcb\xb7\x00\x9d\xd6\xc8\x00\xf9\xf9\xf9\x00\x00\x00\x00\ -\x00\xff\x00\xff\x00\xff\xff\x00\x00\xff\xff\xff\x00\x23\x23\x33\ -\x33\x33\x33\x33\x23\x23\x23\x23\x33\x32\x32\x22\x22\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x82\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x73\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x75\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x87\xb7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x7b\xb7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x7b\xb7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x87\x8b\xf7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x88\x57\x57\xbf\xb7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x83\x99\x97\xbb\xb7\x58\x88\x88\ -\x88\x88\x88\x88\x88\x88\x88\x88\x87\x7a\xa7\xbf\xb7\x58\x88\x88\ -\x88\x88\x88\x77\x57\x78\x88\x88\x88\x59\xa9\x8f\xf7\x58\x88\x88\ -\x88\x87\x73\x79\xaa\x77\x77\x87\x77\xaa\xaa\x7f\xb7\x58\x88\x88\ -\x88\x51\x03\xaa\x6a\xaa\x97\x9a\xaa\xaa\xaa\x7b\xf7\x58\x88\x88\ -\x87\x20\x02\xa6\x6a\xaa\xaa\xaa\xaa\xaa\xaa\x7b\xb7\x58\x87\x58\ -\x83\x0c\xc2\x66\x66\xaa\xaa\xaa\xaa\xaa\xaa\x7b\xf7\x57\x77\x12\ -\x31\x00\x06\x66\x6a\xaa\xaa\xaa\xaa\xaa\xaa\x7b\xb7\x7f\x79\x20\ -\x0c\xc0\x26\x66\x66\x6a\xaa\xaa\xaa\xaa\xa9\x7f\xb7\x7b\xa9\xa7\ -\x21\x17\xa6\x66\x6a\xaa\xaa\xaa\xaa\xaa\xa7\xbf\xb7\x7f\xa7\xaa\ -\xaa\xaa\xaa\xa6\xaa\xaa\xa9\x9a\xaa\xaa\xa7\xbf\xf7\x7b\xa7\xaa\ -\xaa\xaa\xaa\xa6\x6a\xa9\x44\x44\x9a\xaa\x7a\xff\xb7\x7f\xb7\xaa\ -\xaa\xaa\xa6\x66\xaa\xa9\x44\x44\x99\xaa\x7b\xff\xf7\x7f\xb7\xaa\ -\xaa\xaa\x66\x66\x66\x64\x44\x44\x9a\xa7\xaf\xff\xb7\x7f\xfa\x7a\ -\xaa\xaa\xa6\x66\xa6\xa6\x44\x44\x9a\x97\xff\xff\xf7\x7f\xbb\x79\ -\xaa\xaa\xa6\xaa\xaa\xaa\xa4\x99\xa9\x7b\xff\xff\xb7\x7f\xff\xb7\ -\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x77\xbf\xff\xff\xf7\x7f\xff\xba\ -\x79\xaa\xaa\xaa\xaa\xaa\xaa\x97\xab\xff\xff\xff\xb7\x7f\xff\xff\ -\xb7\x99\xaa\xaa\xaa\xaa\x97\x7a\xff\xff\xff\xff\xf7\x7f\xff\xff\ -\xfb\xa7\x77\x9a\x97\x77\x7b\xbf\xff\xff\xff\xff\xb7\x7f\xff\xff\ -\xff\xff\xba\x8a\x8a\xbb\xbf\xff\xff\xff\xff\xff\xf7\x7f\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf7\x57\x77\x77\ -\x77\x77\x77\x77\x77\x77\x77\x77\x77\x77\x77\x77\x75\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\ -\x00\x10\x00\x00\x00\x20\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\ -\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\ -\x00\x00\x00\x00\x00\x26\x25\x23\x00\x33\x46\x42\x00\x69\x6e\x68\ -\x00\x24\xd0\x30\x00\xa0\x89\x7a\x00\x3f\x6b\x81\x00\x6a\xa5\x9a\ -\x00\x63\xad\xd6\x00\xad\xa6\x98\x00\xd8\xb2\x98\x00\x99\xcc\xb6\ -\x00\x9f\xd2\xc7\x00\xe3\xe4\xe4\x00\x00\x00\x00\x00\xff\xff\x00\ -\x00\xff\xff\xff\x00\x88\x89\x89\x89\x88\x88\x98\x84\x99\x99\x99\ -\x99\x99\x99\x99\x98\x99\x99\x99\x99\x99\x99\x99\x8c\x89\x99\x99\ -\x99\x99\x99\x99\xcc\x99\x99\x99\x99\x99\x98\x88\xcc\x99\x99\x99\ -\x98\x89\x99\xaa\xcc\x89\x99\x42\xab\xa8\xaa\xba\xbc\x89\x94\x01\ -\x77\xbb\xbb\xbb\xcc\xb8\x21\xd5\x77\xbb\xbb\xba\xcc\xca\x86\x6b\ -\x77\xba\xab\xba\xcc\xcb\xbb\xbb\x7a\xa3\x3a\xbb\xfc\xcc\xab\xb7\ -\x77\x63\x3a\xac\xfc\xcf\xbb\xbb\xbb\xaa\xaa\xcf\xfc\xcf\xcb\xab\ -\xbb\xba\xbc\xff\xfc\xcf\xfc\xcb\xaa\xbc\xcf\xff\xfc\xbc\xcc\xcc\ -\xcc\xcc\xcc\xcc\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x28\x00\x00\x00\x30\x00\x00\x00\x60\x00\x00\ -\x00\x01\x00\x08\x00\x00\x00\x00\x00\x80\x0a\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x04\x05\x04\x00\x07\x09\x09\x00\x0a\x0e\x0d\x00\x0c\x11\x0f\ -\x00\x0e\x14\x13\x00\x10\x12\x12\x00\x12\x19\x17\x00\x1f\x1e\x1f\ -\x00\x19\x22\x20\x00\x1c\x26\x23\x00\x22\x21\x21\x00\x2e\x2d\x2e\ -\x00\x25\x33\x2f\x00\x2c\x3c\x37\x00\x3a\x3c\x3c\x00\x40\x3f\x3f\ -\x00\x30\x41\x3c\x00\x36\x49\x43\x00\x3a\x4f\x49\x00\x4b\x4a\x4b\ -\x00\x4e\x4b\x4a\x00\x4e\x4d\x4e\x00\x52\x4e\x4c\x00\x54\x51\x50\ -\x00\x57\x54\x53\x00\x56\x54\x54\x00\x58\x56\x55\x00\x5a\x58\x57\ -\x00\x5a\x5a\x5a\x00\x5c\x5b\x5b\x00\x5b\x5e\x5e\x00\x5e\x5e\x5e\ -\x00\x66\x5b\x53\x00\x6d\x5e\x55\x00\x6e\x60\x55\x00\x5b\x7b\x72\ -\x00\x62\x61\x60\x00\x64\x62\x62\x00\x69\x66\x67\x00\x6e\x6e\x6e\ -\x00\x73\x6f\x6f\x00\x72\x72\x72\x00\x74\x74\x74\x00\x78\x73\x73\ -\x00\x7c\x76\x76\x00\x79\x79\x79\x00\x00\xcf\x00\x00\x04\xcd\x0a\ -\x00\x08\xcf\x0b\x00\x0e\xd0\x12\x00\x12\xd0\x16\x00\x16\xd0\x1c\ -\x00\x17\xcb\x29\x00\x1d\xd1\x24\x00\x24\xd1\x2d\x00\x26\xd1\x31\ -\x00\x2d\xd2\x3a\x00\x31\xd2\x3e\x00\x08\xaa\x5e\x00\x42\xd3\x54\ -\x00\x46\xd3\x59\x00\x55\xd4\x6b\x00\x5b\xd5\x72\x00\x5f\xd5\x78\ -\x00\x60\xd5\x78\x00\x89\x81\x7e\x00\xa1\x8b\x7d\x00\x1a\x79\xe7\ -\x00\x1d\x7b\xe7\x00\x1f\x7c\xe6\x00\x14\x74\xe8\x00\x21\x7d\xe5\ -\x00\x7a\x88\x84\x00\x67\x91\x8c\x00\x76\xa1\x95\x00\x78\xa2\x97\ -\x00\x7c\xa9\x9c\x00\x43\xab\xad\x00\x6c\xd6\x88\x00\x78\xd6\x99\ -\x00\x3c\x91\xdf\x00\x26\x81\xe4\x00\x2a\x84\xe3\x00\x2f\x88\xe2\ -\x00\x34\x8b\xe1\x00\x38\x8e\xe0\x00\x3b\x91\xe0\x00\x44\x97\xde\ -\x00\x46\x98\xdd\x00\x49\x9a\xdc\x00\x4a\xa6\xc3\x00\x54\xa2\xda\ -\x00\x58\xa5\xd9\x00\x5e\xaa\xd8\x00\x73\xb7\xcd\x00\x62\xad\xd6\ -\x00\x66\xaf\xd6\x00\x66\xb0\xd6\x00\x6c\xb4\xd4\x00\x70\xb6\xd3\ -\x00\x75\xba\xd2\x00\x7e\xc1\xd0\x00\x8a\x83\x81\x00\x8f\x88\x86\ -\x00\x86\x86\x88\x00\x87\x89\x89\x00\x8f\x8e\x8b\x00\x88\x8c\x8d\ -\x00\x8f\x8f\x8c\x00\x9a\x8d\x87\x00\x96\x8d\x89\x00\x91\x8f\x8c\ -\x00\x97\x8f\x8c\x00\x9b\x8e\x88\x00\x8f\x90\x8d\x00\x9e\x91\x8a\ -\x00\x9b\x91\x8c\x00\x9f\x92\x8c\x00\x8b\x93\x90\x00\x8d\x92\x92\ -\x00\x8c\x94\x92\x00\x8b\x96\x94\x00\x8c\x95\x94\x00\x8b\x99\x96\ -\x00\x8c\x99\x96\x00\x8b\x9d\x99\x00\x8c\x9d\x99\x00\x91\x94\x95\ -\x00\x94\x96\x97\x00\x98\x93\x93\x00\x9a\x96\x95\x00\x97\x98\x99\ -\x00\x9a\x9a\x9b\x00\xa4\x90\x84\x00\xa8\x93\x85\x00\xaa\x94\x85\ -\x00\xad\x95\x86\x00\xa0\x90\x89\x00\xa3\x94\x8b\x00\xa5\x94\x8b\ -\x00\xa6\x95\x8c\x00\xa9\x97\x8c\x00\xae\x9a\x8d\x00\xb1\x97\x87\ -\x00\xb2\x98\x87\x00\xb2\x98\x88\x00\xb5\x9a\x88\x00\xb0\x9b\x8d\ -\x00\xb2\x9c\x8e\x00\xb4\x9d\x8e\x00\xb9\x9c\x89\x00\xbd\x9f\x8a\ -\x00\x8d\xa1\x9d\x00\x8f\xa5\x9f\x00\xbe\xa0\x8a\x00\xb9\xa0\x90\ -\x00\xbd\xa2\x90\x00\x9f\x9f\xa0\x00\x8e\xa5\xa0\x00\x90\xa8\xa2\ -\x00\x90\xaa\xa4\x00\x91\xac\xa5\x00\x82\xb2\xa5\x00\x88\xb9\xab\ -\x00\x92\xb1\xa9\x00\x93\xb4\xab\x00\x93\xb5\xac\x00\x94\xb5\xac\ -\x00\x95\xb9\xaf\x00\x95\xba\xb0\x00\x96\xbc\xb2\x00\x97\xbf\xb4\ -\x00\xa2\xa0\xa2\x00\xa4\xa3\xa4\x00\xa7\xa5\xa6\x00\xa8\xa6\xa7\ -\x00\xa8\xa6\xa8\x00\xaa\xa8\xa9\x00\xac\xaa\xac\x00\xae\xad\xaf\ -\x00\xb8\xb7\xb8\x00\xbb\xba\xbb\x00\xbc\xbb\xbc\x00\xbe\xbd\xbe\ -\x00\xc1\xa1\x8b\x00\xc4\xa3\x8c\x00\xc1\xa5\x92\x00\xca\xaa\x94\ -\x00\xcc\xab\x95\x00\xcd\xac\x95\x00\xd1\xae\x95\x00\xd5\xb0\x97\ -\x00\xdb\xb3\x97\x00\xd7\xb1\x98\x00\xd9\xb2\x98\x00\xdb\xb4\x98\ -\x00\xdc\xb4\x99\x00\x81\xd7\xa2\x00\x86\xd7\xa8\x00\x89\xd7\xad\ -\x00\x8a\xd8\xae\x00\x8d\xc1\xb3\x00\x8c\xc5\xbf\x00\x93\xc3\xb6\ -\x00\x97\xc0\xb5\x00\x91\xc5\xb7\x00\x98\xc1\xb6\x00\x99\xc5\xb9\ -\x00\x95\xcb\xbc\x00\x9a\xc8\xbb\x00\x9a\xca\xbd\x00\x9b\xcc\xbe\ -\x00\x8d\xd8\xb2\x00\x90\xd8\xb6\x00\x93\xd8\xba\x00\x89\xc9\xce\ -\x00\x8c\xcb\xcd\x00\x8e\xcd\xcc\x00\x9b\xcd\xc0\x00\x9c\xce\xc0\ -\x00\x91\xcf\xcc\x00\x9b\xd3\xc3\x00\x9c\xd1\xc2\x00\x99\xd2\xc6\ -\x00\x9d\xd2\xc4\x00\x9e\xd5\xc6\x00\x9c\xd9\xc5\x00\x95\xd1\xcb\ -\x00\x99\xd4\xca\x00\x9d\xd7\xc9\x00\x9e\xd8\xc8\x00\x80\xc3\xd0\ -\x00\xa0\xd9\xc9\x00\xc2\xc1\xc2\x00\xca\xc9\xca\x00\xcc\xcb\xcc\ -\x00\xcd\xcc\xcd\x00\xd0\xcf\xd0\x00\xd1\xd1\xd1\x00\xd4\xd3\xd4\ -\x00\xd6\xd5\xd6\x00\xda\xd9\xda\x00\xde\xdd\xde\x00\xe2\xe1\xe2\ -\x00\xe5\xe4\xe5\x00\xea\xea\xea\x00\xec\xeb\xec\x00\xed\xed\xed\ -\x00\xf0\xef\xf0\x00\xf1\xf0\xf1\x00\xf6\xf6\xf6\x00\xf8\xf7\xf8\ -\x00\xf9\xf9\xf9\x00\xfe\xfe\xfe\x00\xff\xff\xff\x00\x26\x17\x17\ -\x17\x17\x17\x17\x19\x18\x19\x21\x1c\x1c\x1e\x1e\x1e\x1f\x1e\x1f\ -\x1e\x1f\x1d\x1f\x1d\x1f\x1d\x1f\x1d\x1f\x1e\x1f\x1d\x1e\x25\x1f\ -\x1e\x1d\x1c\x1b\x19\x19\x17\x18\x17\x17\x17\x15\x2a\x21\xba\xbc\ -\xbc\xbc\xbe\xba\xbe\xba\xbc\xba\xba\xba\xba\xb9\x9b\x9b\x97\x97\ -\x97\x93\x91\x93\x91\x93\x91\x93\x91\x93\x93\x97\x97\x98\x98\x9b\ -\x9b\xba\xba\xba\xba\xba\xba\xbc\xba\xba\xba\x43\x1d\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\x86\x1d\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xbe\x67\x20\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc0\x76\xb2\x28\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\x94\xb0\xf4\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xbb\x83\xf5\xf8\x2a\x23\xc4\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc2\x75\xed\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\x96\xb0\xfc\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc3\x75\xf0\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xbd\x82\xf8\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc0\x8d\xb0\xfb\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\ -\xbe\x9d\x9c\x96\x95\x76\xb0\xf8\xff\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\x8e\ -\x6d\x7d\x99\x99\x9a\x6c\xec\xff\xff\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc0\x6f\ -\x7c\xd2\xe7\xe7\xe7\xa2\xae\xfc\xff\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xbe\ -\x8d\x79\xcf\xe9\xe9\xd4\x78\xf3\xff\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc5\xc2\xbe\xbb\xbb\xc2\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\ -\xc3\x8f\x7d\xe2\xe9\xe2\x99\xb7\xff\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\xbf\x9c\ -\x8d\x71\x6d\x7b\x77\x75\xbb\xc3\xc5\xc5\xc5\xc5\xc5\xc5\xc3\xbf\ -\x9c\x6f\xa0\xe2\xe9\xe9\xa8\xae\xfc\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xbc\x96\x76\x68\x6a\ -\x7e\xaa\xd4\xe2\xdc\xa6\x78\x76\xbb\xc0\xc0\xbd\xbb\x94\x74\x70\ -\x7d\xa9\xe1\xe9\xe9\xe9\xd0\x81\xf8\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc4\x94\x2d\x1a\x1f\xa0\xd0\ -\xe6\xe9\xe9\xe9\xe9\xe9\xdb\xa5\x79\x71\x6f\x73\x7a\x9a\xa8\xd2\ -\xe2\xe9\xe9\xe9\xe9\xe9\xdc\x7b\xf5\xff\xff\xf8\x2b\x23\xc5\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\x9d\x29\x08\x01\x0a\xca\xe9\ -\xe9\xe5\xe8\xdd\xe9\xe9\xe9\xe7\xdf\xcd\xcf\xd4\xe2\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe1\x7b\xf2\xff\xff\xf8\x2a\x23\xc1\xc5\ -\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xc5\xbe\x42\x0c\x00\x00\x04\x4d\xe9\ -\xe6\x60\x45\x56\xe4\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe1\x7a\xf1\xff\xff\xf8\x2b\x23\xc1\xc5\ -\xc5\xc5\xc5\xc3\xc5\xc5\xc5\xc2\x76\x14\x01\x00\x00\x02\x4c\xe9\ -\x66\x48\x44\x56\xe4\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe1\x7a\xf1\xff\xff\xf8\x2a\x22\xbf\xbd\ -\xbb\x96\x8d\x6e\x94\xc2\xc4\x96\x27\x06\x00\x00\x00\x05\xa3\xe5\ -\x57\x53\x48\xe8\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xdf\x7b\xf3\xff\xff\xf8\x2b\x19\x71\x83\ -\x83\x69\x49\x0f\x26\x72\x8e\x2c\x0b\x00\x00\x00\x00\x0e\xcb\x65\ -\x53\x5e\x52\x62\xe5\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xd4\x80\xf5\xff\xff\xf8\x2a\x28\xf3\xf9\ -\xf0\x7b\xcc\x12\x06\x10\x16\x0b\x00\x00\x00\x00\x04\x4a\x59\x52\ -\x5d\xe5\x5a\x47\x58\xd8\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xcf\x84\xfa\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xef\x7d\xe2\xa4\x11\x01\x01\x00\x00\x00\x00\x07\x24\x65\x47\x47\ -\x65\x64\x46\x45\x54\x65\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xa5\xb2\xfd\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xee\x7d\xe2\xe9\xce\x24\x0d\x07\x05\x09\x13\x4c\xe0\x5c\x54\x5a\ -\x5e\x46\x46\x62\xe5\xe6\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe7\x7f\xea\xfe\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xef\x7a\xe2\xe9\xe9\xe7\xd1\xa4\xa3\xca\xde\xe9\xe6\xdd\xe5\xe6\ -\x5e\x56\xd8\xe5\xe9\xe9\xe9\xe9\xe9\xe9\xe3\xe7\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xd4\x78\xf4\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xf2\x7a\xe1\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\x64\x53\xd8\xe9\xe9\xe9\xe9\xe9\xe3\xe3\x3f\x4f\xe9\xe3\xe7\xe9\ -\xe9\xe9\xe9\xe9\xe7\xa5\xad\xfc\xff\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xf5\x80\xd4\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe4\x56\x5d\xe9\xe9\xe9\xe9\xc6\x3c\x41\x34\x38\x41\x3c\xd5\xe9\ -\xe9\xe9\xe9\xe9\xdf\x7a\xec\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xfa\x85\xcd\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe6\xd9\ -\x5e\x52\x5d\xe9\xe9\xe9\xe9\xc7\x34\x30\x2f\x2f\x30\x37\xd7\xe9\ -\xe9\xe9\xe9\xe9\xa6\x9e\xfa\xff\xff\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xfe\xb4\xa1\xe7\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe5\x60\x53\ -\x56\x62\xe4\xe9\xe9\xe9\xd5\x3e\x33\x2f\x2f\x2f\x2f\x36\x41\xd7\ -\xe9\xe9\xe9\xdb\x79\xed\xfe\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xee\x7a\xe1\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe6\x5c\x54\x63\ -\xda\x64\x5c\x62\x65\x65\x4e\x3b\x30\x2f\x2f\x2f\x2f\x31\x38\xc7\ -\xe9\xe9\xe2\x9a\xb3\xfb\xff\xff\xff\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xff\xf9\x85\xaa\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xda\x53\x65\xe8\ -\x57\x53\x59\x56\x54\x54\x57\x5b\x35\x2f\x2f\x2f\x2f\x39\xd5\xe7\ -\xe9\xe9\xa8\x81\xf5\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xfe\xb8\x7d\xe1\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xdd\x53\x56\x53\ -\x5a\xd9\xe6\xe5\xe4\xe4\xe6\x50\x34\x38\x31\x32\x37\x36\xc9\xe9\ -\xe7\xac\x80\xef\xff\xff\xff\xff\xff\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xff\xff\xf9\x85\xa5\xe7\xe9\xe9\xe9\xe9\xe9\xe9\xe6\x60\x5d\x65\ -\xe5\xe9\xe9\xe9\xe9\xe9\xe9\xd7\xc6\xd6\x3a\x3d\xd6\xc6\xe3\xe9\ -\xcf\x79\xea\xfd\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xfe\xf0\x78\xcf\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe7\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xc8\xd6\xe9\xe9\xe7\xcf\ -\x78\xb8\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2b\x2e\xfe\xff\ -\xff\xff\xff\xfd\xb8\x7b\xd0\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe2\xa8\x78\ -\xea\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xfc\xb5\x7b\xcf\xe7\xe9\xe9\xe9\xe9\xe9\xe9\xe9\ -\xe9\xe9\xe7\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xdb\x9f\x81\xef\ -\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xfc\xb8\x78\xa5\xe1\xe9\xe9\xe9\xe9\xe9\xe7\ -\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe9\xe1\xa8\x79\xb1\xf4\xfe\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xfd\xef\x85\x7d\xab\xe1\xe7\xe7\xe9\xe9\ -\xe9\xe7\xe9\xe7\xe9\xe9\xe9\xe7\xd4\xa6\x7a\x85\xec\xfb\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xfe\xf8\xb8\x84\x7a\xa2\xcd\xdb\xe1\ -\xe2\xe7\xe2\xe2\xdf\xd0\xa8\x99\x78\x9e\xeb\xf9\xfe\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xf8\xed\xb3\x84\x80\x7a\ -\x7d\x7f\x7d\x7c\x78\x81\xad\xb6\xf3\xfb\xfe\xfe\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xf9\xf4\xf1\ -\xed\xeb\xec\xf0\xf3\xf7\xfc\xfe\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x2a\x2e\xfd\xfe\ -\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\ -\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\ -\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xf6\x2a\x20\x2e\x2e\ -\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\ -\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\ -\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2e\x2b\x28\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x00\x00\x00\ -\x00\x00\x00\x2e\x2e\x00\x00\x00\x00\x00\x00\x2e\x2e\x28\x00\x00\ -\x00\x20\x00\x00\x00\x40\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\ -\x00\x80\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x09\x09\x00\x0d\x11\x10\ -\x00\x12\x12\x12\x00\x11\x17\x15\x00\x19\x19\x19\x00\x1a\x1e\x1d\ -\x00\x1d\x1e\x1e\x00\x2e\x2d\x2d\x00\x32\x44\x3f\x00\x40\x45\x44\ -\x00\x4c\x49\x49\x00\x42\x5b\x54\x00\x63\x5d\x5c\x00\x58\x78\x6f\ -\x00\x54\x76\x73\x00\x5c\x7d\x74\x00\x7a\x6e\x67\x00\x76\x6e\x6a\ -\x00\x7b\x6f\x68\x00\x77\x71\x6f\x00\x7b\x70\x68\x00\x7c\x70\x69\ -\x00\x78\x72\x6e\x00\x7c\x72\x6d\x00\x7c\x74\x6f\x00\x76\x73\x72\ -\x00\x7d\x74\x70\x00\x79\x77\x77\x00\x85\x7a\x75\x00\x87\x7c\x76\ -\x00\x81\x7d\x7b\x00\x00\xcf\x00\x00\x07\xcb\x14\x00\x0e\xd0\x12\ -\x00\x11\xd0\x16\x00\x19\xd1\x20\x00\x22\xd0\x2c\x00\x2a\xd2\x35\ -\x00\x3f\xd3\x4f\x00\x42\xd3\x53\x00\x5c\xd4\x75\x00\x61\xd5\x7a\ -\x00\x97\x82\x74\x00\x9a\x84\x75\x00\x24\xa6\x8e\x00\x72\x94\x8b\ -\x00\x75\x9f\x94\x00\x75\xa0\x94\x00\x6a\x9e\xa6\x00\x6b\xd6\x87\ -\x00\x6d\xd5\x8c\x00\x77\xd6\x96\x00\x7e\xd7\x9f\x00\x71\xc8\xae\ -\x00\x39\x8d\xdc\x00\x3d\x92\xdf\x00\x25\x81\xe4\x00\x2e\x87\xe3\ -\x00\x29\x83\xe4\x00\x30\x88\xe2\x00\x34\x8c\xe1\x00\x3a\x90\xe0\ -\x00\x43\x96\xde\x00\x45\x97\xdd\x00\x46\x98\xdd\x00\x4f\x9f\xdb\ -\x00\x4b\x9c\xdc\x00\x4d\x9d\xdc\x00\x54\xa5\xd3\x00\x55\xa3\xda\ -\x00\x59\xa6\xd9\x00\x5b\xa8\xd8\x00\x5f\xaa\xd8\x00\x62\xac\xd7\ -\x00\x65\xae\xd6\x00\x6d\xb5\xd4\x00\x71\xb7\xd3\x00\x73\xb8\xd3\ -\x00\x76\xbb\xd2\x00\x77\xbc\xd2\x00\x79\xbd\xd1\x00\x7d\xc0\xd1\ -\x00\x8c\x8c\x8c\x00\x98\x89\x80\x00\x91\x8e\x89\x00\x80\x91\x8d\ -\x00\x8f\x93\x90\x00\x9b\x98\x91\x00\x9c\x9b\x93\x00\x9a\x9d\x95\ -\x00\x99\x99\x99\x00\xa2\x98\x8f\x00\xae\x9c\x8f\x00\xb2\x9a\x8b\ -\x00\xb0\x99\x8c\x00\xa1\x9b\x92\x00\xa7\x9c\x91\x00\xa8\x9c\x91\ -\x00\xac\x9d\x90\x00\xa2\x9f\x9f\x00\xb3\x9f\x93\x00\xb4\x9f\x91\ -\x00\x8f\xa0\x9b\x00\x96\xa0\x99\x00\xb9\xa0\x8f\x00\xb6\xa0\x91\ -\x00\xba\xa2\x92\x00\xbe\xa4\x92\x00\x99\xa6\xa3\x00\x99\xa6\xa4\ -\x00\x9c\xa7\xa5\x00\x94\xaa\xa2\x00\x95\xaa\xa5\x00\x98\xa8\xa4\ -\x00\x9e\xa8\xa6\x00\x94\xae\xa8\x00\x94\xb1\xa9\x00\x95\xb6\xad\ -\x00\x96\xb9\xaf\x00\x96\xba\xb0\x00\x96\xbc\xb2\x00\x97\xbf\xb4\ -\x00\xa0\xa0\xa0\x00\xad\xa4\xa0\x00\xaf\xa7\xa4\x00\xad\xa8\xa7\ -\x00\xa2\xaa\xa9\x00\xa4\xaa\xa9\x00\xa7\xac\xac\x00\xab\xab\xab\ -\x00\xaa\xae\xae\x00\xae\xae\xae\x00\xb5\xaf\xae\x00\xab\xb0\xb0\ -\x00\xad\xb1\xb1\x00\xb3\xb6\xb6\x00\xb8\xb3\xb2\x00\xb7\xb9\xb9\ -\x00\xb8\xba\xba\x00\xbe\xbb\xbb\x00\xba\xbb\xbc\x00\xbc\xbd\xbe\ -\x00\xc1\xa5\x92\x00\xc5\xa7\x93\x00\xc7\xa8\x93\x00\xce\xac\x95\ -\x00\xd2\xae\x96\x00\xd5\xb0\x96\x00\xd8\xb2\x97\x00\xd7\xb2\x98\ -\x00\xd9\xb2\x98\x00\xdb\xb4\x98\x00\xdc\xb4\x99\x00\x85\xd7\xa7\ -\x00\x87\xd7\xab\x00\x8a\xd8\xae\x00\x97\xc0\xb5\x00\x98\xc1\xb6\ -\x00\x98\xc3\xb8\x00\x99\xc5\xb9\x00\x9a\xc8\xbb\x00\x9a\xca\xbd\ -\x00\x9b\xcd\xbf\x00\x8f\xd8\xb4\x00\x90\xd8\xb5\x00\x82\xc4\xcf\ -\x00\x85\xc6\xcf\x00\x8a\xc7\xc8\x00\x88\xc8\xce\x00\x8c\xcb\xcd\ -\x00\x9b\xce\xc0\x00\x9c\xce\xc1\x00\x90\xce\xcc\x00\x9c\xd0\xc2\ -\x00\x9a\xd7\xc2\x00\x9b\xd4\xc4\x00\x9e\xd6\xc6\x00\x98\xd8\xc0\ -\x00\x9b\xd9\xc4\x00\x9c\xd8\xc6\x00\x93\xd0\xcc\x00\x9a\xd5\xca\ -\x00\x9e\xd7\xc8\x00\x9e\xd8\xc8\x00\x82\xc3\xd0\x00\xbf\xc0\xc1\ -\x00\xc1\xc1\xc2\x00\xc3\xc3\xc4\x00\xc9\xc9\xca\x00\xcb\xcb\xcc\ -\x00\xcd\xcd\xcd\x00\xd0\xd0\xd0\x00\xd5\xd5\xd5\x00\xd9\xd8\xd9\ -\x00\xde\xde\xde\x00\xe0\xdf\xe0\x00\xe2\xe1\xe2\x00\xe9\xe9\xe9\ -\x00\xed\xec\xed\x00\xf2\xf1\xf2\x00\xf6\xf6\xf6\x00\xf8\xf7\xf8\ -\x00\xf9\xf9\xf9\x00\xfc\xfb\xfc\x00\xfe\xfe\xfe\x00\xff\xd1\xf0\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x2c\x00\x2f\x00\x4b\x00\x50\ -\x00\x69\x00\x70\x00\x87\x00\x90\x00\xa5\x00\xb0\x00\xc4\x00\xcf\ -\x00\xe1\x00\xf0\x00\xf0\x11\xff\x00\xf2\x31\xff\x00\xf4\x51\xff\ -\x00\xf6\x71\xff\x00\xf7\x91\xff\x00\xf9\xb1\xff\x00\xfb\xd1\xff\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x1b\x00\x2f\x00\x2d\x00\x50\ -\x00\x3f\x00\x70\x00\x52\x00\x90\x00\x63\x00\xb0\x00\x76\x00\xcf\ -\x00\x88\x00\xf0\x00\x99\x11\xff\x00\xa6\x31\xff\x00\xb4\x51\xff\ -\x00\xc2\x71\xff\x00\xcf\x91\xff\x00\xdc\xb1\xff\x00\xeb\xd1\xff\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x08\x00\x2f\x00\x0e\x00\x50\ -\x00\x15\x00\x70\x00\x1b\x00\x90\x00\x21\x00\xb0\x00\x26\x00\xcf\ -\x00\x2c\x00\xf0\x00\x3e\x11\xff\x00\x58\x31\xff\x00\x71\x51\xff\ -\x00\x8c\x71\xff\x00\xa6\x91\xff\x00\xbf\xb1\xff\x00\xda\xd1\xff\ -\x00\xff\xff\xff\x00\x19\x16\x16\x18\x16\x19\x19\x1b\x1b\x1b\x19\ -\x19\x19\x19\x17\x17\x1a\x17\x17\x19\x1b\x1b\x19\x1b\x19\x18\x18\ -\x16\x15\x15\x11\x1a\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x99\x98\x99\x99\ -\x99\x98\x98\x92\x14\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x98\x66\x1c\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x90\x89\x5b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x93\x7c\xc7\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x65\xc1\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x94\x7d\xca\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x98\ -\x6b\x8c\xcd\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x97\x6c\x63\x62\x5c\ -\x7e\xc8\xcf\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x91\x57\x79\xa2\x7a\ -\x81\xca\xcf\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x99\x99\x99\x99\x97\x99\x99\x99\x99\x99\x99\x98\x6b\x68\xac\xb7\ -\x71\xc4\xcf\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\ -\x94\x8f\x5d\x60\x59\x65\x94\x99\x99\x99\x99\x96\x91\x59\xa1\xb8\ -\x7a\xbc\xcf\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x98\x6b\x54\ -\x55\x67\x7a\xae\xae\x78\x5a\x6a\x90\x6c\x63\x5a\x73\xac\xb8\xb8\ -\xa2\x87\xcc\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x99\x5e\x0b\x07\ -\x2e\xb7\xb6\xa9\xb6\xb8\xb7\x9e\x76\x9e\xac\xb7\xb8\xb8\xb8\xb8\ -\xb1\x81\xca\xcd\x7b\x2c\x99\x99\x99\x99\x99\x99\x91\x0d\x01\x00\ -\x10\xb8\x4b\x39\x52\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\xae\x7f\xc9\xcf\x7b\x2b\x92\x91\x69\x5e\x92\x94\x1e\x05\x00\x00\ -\x10\xa7\x3a\x3d\xb5\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\xb1\x80\xcb\xcd\x7b\x1f\x85\x64\x56\x0a\x12\x1e\x08\x00\x00\x04\ -\x31\x44\x48\x3e\x50\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\xa2\x86\xcc\xcd\x7b\x82\xcc\x8e\x7a\x10\x06\x03\x00\x00\x04\x0f\ -\x3e\x3a\x50\x3b\x3a\xa7\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\x9e\xba\xcd\xcd\x7b\x84\xcf\x8d\xa0\xb7\x30\x0c\x0a\x0c\x30\xaa\ -\x47\x4b\x38\x44\xad\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\x74\xc2\xcf\xcd\x7b\x84\xcf\xbb\x9d\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\xb8\xb5\x3f\xad\xb8\xb8\xb8\xb3\x35\x9a\xb3\xb8\xb8\xb8\xb8\xb1\ -\x73\xc8\xcf\xcd\x7b\x87\xcf\xc0\x77\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\xb8\xb6\x42\x4c\xb8\xb8\x9b\x27\x25\x26\x28\xa5\xb8\xb8\xb8\x78\ -\xbb\xcd\xcf\xcd\x7b\x84\xcf\xc5\x71\xb8\xb8\xb8\xb8\xb8\xb8\xb8\ -\x52\x44\x44\xa9\xb8\xb8\x33\x23\x20\x20\x24\x34\xb8\xb8\xae\x6f\ -\xc7\xcf\xcf\xcd\x7b\x84\xcf\xc9\x81\xae\xb8\xb8\xb8\xb8\xb8\xb9\ -\x41\x4e\x49\x44\x47\x45\x2d\x21\x20\x20\x23\x29\xb4\xb7\x74\xbf\ -\xcf\xcf\xcf\xcd\x7b\x84\xcf\xcd\xbe\x75\xb8\xb8\xb8\xb8\xb8\x4f\ -\x38\x43\x4a\xa7\x52\x52\x36\x25\x23\x23\x26\xa4\xb8\x78\x88\xcb\ -\xcf\xcf\xcf\xcd\x7b\x84\xcf\xcf\xc9\x80\xa1\xb8\xb8\xb8\xb8\xb5\ -\x4d\xa9\xb8\xb8\xb8\xb8\xb2\x9c\x2a\x32\x9c\xb3\x79\x83\xc8\xcf\ -\xcf\xcf\xcf\xcf\x7b\x84\xcf\xcf\xcf\xc4\x6e\xab\xb8\xb8\xb8\xb8\ -\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb1\x76\x86\xc7\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x87\xcf\xcf\xcf\xcd\xc2\x6d\xa1\xb8\xb8\xb8\ -\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xb8\xa3\x71\x8d\xc8\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x84\xcf\xcf\xcf\xcf\xcd\xc4\x80\x76\xab\xb7\ -\xb8\xb8\xb8\xb8\xb8\xb8\xb7\xa2\x75\x80\xc1\xcb\xcf\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x84\xcf\xcf\xcf\xcf\xcf\xcf\xc8\xbd\x80\x71\ -\x77\x9e\xa0\x9f\x7a\x75\x72\x86\xc0\xc9\xcf\xcf\xcf\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x84\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xc9\xc5\ -\xbf\x8e\x8b\x8d\xbc\xc1\xc6\xcb\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x87\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\xcf\ -\xcf\xcf\xcf\xcd\x7b\x53\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\ -\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\x84\ -\x84\x84\x84\x84\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x28\x00\x00\x00\x10\x00\x00\x00\x20\x00\x00\ -\x00\x01\x00\x08\x00\x00\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x0e\x12\x11\ -\x00\x2c\x28\x27\x00\x38\x35\x33\x00\x33\x46\x42\x00\x5d\x66\x60\ -\x00\x75\x77\x70\x00\x1a\xcd\x28\x00\x21\xd1\x2a\x00\x29\xd1\x35\ -\x00\x2d\xd2\x39\x00\xa0\x89\x7a\x00\x3f\x6b\x81\x00\x6b\x91\x87\ -\x00\x78\xa4\x98\x00\x5b\xba\xb0\x00\x4f\x9f\xda\x00\x5f\xaa\xd7\ -\x00\x51\xa0\xdb\x00\x61\xac\xd7\x00\x66\xb0\xd6\x00\x6a\xb0\xd0\ -\x00\x6d\xb4\xd4\x00\x78\xbc\xd2\x00\xa2\x96\x8e\x00\xae\x9c\x8f\ -\x00\xb4\x98\x86\x00\xb1\x9c\x8e\x00\xb5\x9d\x8d\x00\xbc\xa2\x90\ -\x00\xbe\xa6\x94\x00\xbe\xac\x99\x00\x9f\xa9\xa5\x00\x9d\xb8\xad\ -\x00\x8c\xbf\xb1\x00\x96\xbd\xb5\x00\x9f\xbf\xb2\x00\xae\xa6\xa1\ -\x00\xa4\xae\xa2\x00\xaa\xaf\xa1\x00\xa7\xb2\xa5\x00\xab\xb2\xab\ -\x00\xa0\xbe\xb1\x00\xc4\xa6\x91\x00\xc2\xa8\x95\x00\xc7\xac\x96\ -\x00\xc8\xa8\x92\x00\xc9\xaa\x94\x00\xcc\xae\x97\x00\xcd\xad\x98\ -\x00\xd5\xb0\x97\x00\xd3\xb0\x98\x00\xd9\xb3\x98\x00\xdb\xb4\x98\ -\x00\xdc\xb4\x99\x00\xc9\xb8\xad\x00\xc0\xbc\xba\x00\x85\xd3\xa6\ -\x00\x84\xd6\xa7\x00\x81\xd4\xab\x00\x8a\xd8\xae\x00\x9f\xc7\xbd\ -\x00\x9d\xca\xbe\x00\x9d\xcc\xbf\x00\x90\xd8\xb6\x00\xa1\xc4\xb7\ -\x00\xa6\xc3\xbc\x00\xa2\xc5\xbc\x00\xae\xc4\xbf\x00\x84\xc2\xc8\ -\x00\x85\xc6\xcf\x00\x8c\xcb\xcd\x00\x91\xc6\xc2\x00\x9d\xce\xc1\ -\x00\x92\xcf\xcc\x00\x9d\xd0\xc2\x00\x9e\xd2\xc4\x00\x9b\xd7\xc7\ -\x00\x9e\xd5\xc6\x00\x9b\xd8\xc4\x00\x9e\xd9\xc7\x00\x95\xd1\xcb\ -\x00\x93\xd0\xcc\x00\x9e\xd8\xc8\x00\xb1\xc5\xc0\x00\xb4\xc6\xc1\ -\x00\xb9\xc8\xc4\x00\xbc\xca\xc6\x00\xc7\xc7\xc7\x00\xca\xca\xca\ -\x00\xce\xce\xce\x00\xce\xd5\xd4\x00\xdc\xd7\xd4\x00\xd2\xd9\xd7\ -\x00\xd7\xdb\xda\x00\xd7\xdc\xdb\x00\xd8\xd8\xd8\x00\xd9\xdd\xdc\ -\x00\xdd\xdd\xdd\x00\xde\xe1\xe0\x00\xe4\xe6\xe6\x00\xea\xeb\xeb\ -\x00\xed\xed\xed\x00\xf2\xf1\xf1\x00\xf6\xf7\xf7\x00\xfe\xfe\xfe\ -\x00\x8a\xff\x31\x00\x9c\xff\x51\x00\xae\xff\x71\x00\xc0\xff\x91\ -\x00\xd2\xff\xb1\x00\xe4\xff\xd1\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x26\x2f\x00\x00\x40\x50\x00\x00\x5a\x70\x00\x00\x74\x90\x00\ -\x00\x8e\xb0\x00\x00\xa9\xcf\x00\x00\xc2\xf0\x00\x00\xd1\xff\x11\ -\x00\xd8\xff\x31\x00\xde\xff\x51\x00\xe3\xff\x71\x00\xe9\xff\x91\ -\x00\xef\xff\xb1\x00\xf6\xff\xd1\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2f\x26\x00\x00\x50\x41\x00\x00\x70\x5b\x00\x00\x90\x74\x00\ -\x00\xb0\x8e\x00\x00\xcf\xa9\x00\x00\xf0\xc3\x00\x00\xff\xd2\x11\ -\x00\xff\xd8\x31\x00\xff\xdd\x51\x00\xff\xe4\x71\x00\xff\xea\x91\ -\x00\xff\xf0\xb1\x00\xff\xf6\xd1\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2f\x14\x00\x00\x50\x22\x00\x00\x70\x30\x00\x00\x90\x3e\x00\ -\x00\xb0\x4d\x00\x00\xcf\x5b\x00\x00\xf0\x69\x00\x00\xff\x79\x11\ -\x00\xff\x8a\x31\x00\xff\x9d\x51\x00\xff\xaf\x71\x00\xff\xc1\x91\ -\x00\xff\xd2\xb1\x00\xff\xe5\xd1\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2f\x03\x00\x00\x50\x04\x00\x00\x70\x06\x00\x00\x90\x09\x00\ -\x00\xb0\x0a\x00\x00\xcf\x0c\x00\x00\xf0\x0e\x00\x00\xff\x20\x12\ -\x00\xff\x3e\x31\x00\xff\x5c\x51\x00\xff\x7a\x71\x00\xff\x97\x91\ -\x00\xff\xb6\xb1\x00\xff\xd4\xd1\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2f\x00\x0e\x00\x50\x00\x17\x00\x70\x00\x21\x00\x90\x00\x2b\ -\x00\xb0\x00\x36\x00\xcf\x00\x40\x00\xf0\x00\x49\x00\xff\x11\x5a\ -\x00\xff\x31\x70\x00\xff\x51\x86\x00\xff\x71\x9c\x00\xff\x91\xb2\ -\x00\xff\xb1\xc8\x00\xff\xd1\xdf\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2f\x00\x20\x00\x50\x00\x36\x00\x70\x00\x4c\x00\x90\x00\x62\ -\x00\xb0\x00\x78\x00\xcf\x00\x8e\x00\xf0\x00\xa4\x00\xff\x11\xb3\ -\x00\xff\x31\xbe\x00\xff\x51\xc7\x00\xff\x71\xd1\x00\xff\x91\xdc\ -\x00\xff\xb1\xe5\x00\xff\xd1\xf0\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x2c\x00\x2f\x00\x4b\x00\x50\x00\x69\x00\x70\x00\x87\x00\x90\ -\x00\xa5\x00\xb0\x00\xc4\x00\xcf\x00\xe1\x00\xf0\x00\xf0\x11\xff\ -\x00\xf2\x31\xff\x00\xf4\x51\xff\x00\xf6\x71\xff\x00\xf7\x91\xff\ -\x00\xf9\xb1\xff\x00\xfb\xd1\xff\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x1b\x00\x2f\x00\x2d\x00\x50\x00\x3f\x00\x70\x00\x52\x00\x90\ -\x00\x63\x00\xb0\x00\x76\x00\xcf\x00\x88\x00\xf0\x00\x99\x11\xff\ -\x00\xa6\x31\xff\x00\xb4\x51\xff\x00\xc2\x71\xff\x00\xcf\x91\xff\ -\x00\xdc\xb1\xff\x00\xeb\xd1\xff\x00\xff\xff\xff\x00\x00\x00\x00\ -\x00\x08\x00\x2f\x00\x0e\x00\x50\x00\x15\x00\x70\x00\x1b\x00\x90\ -\x00\x21\x00\xb0\x00\x26\x00\xcf\x00\x2c\x00\xf0\x00\x3e\x11\xff\ -\x00\x58\x31\xff\x00\x71\x51\xff\x00\x8c\x71\xff\x00\xa6\x91\xff\ -\x00\xbf\xb1\xff\x00\xda\xd1\xff\x00\xff\xff\xff\x00\x1a\x1b\x1c\ -\x1c\x1c\x1c\x1c\x1b\x1a\x1b\x1b\x1c\x1b\x1b\x1b\x17\x2a\x35\x35\ -\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x31\x24\x2d\x35\x35\ -\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x34\x36\x59\x2a\x35\x35\ -\x35\x35\x35\x35\x35\x35\x35\x35\x35\x34\x30\x5b\x5f\x2d\x35\x35\ -\x35\x35\x35\x35\x35\x35\x35\x35\x2b\x25\x28\x66\x5f\x2a\x35\x35\ -\x35\x35\x31\x2c\x1e\x30\x35\x35\x2b\x20\x3c\x63\x5f\x2a\x35\x35\ -\x35\x0a\x05\x22\x47\x23\x26\x27\x29\x4a\x48\x5c\x5f\x1c\x2e\x2d\ -\x19\x01\x03\x14\x12\x52\x52\x52\x52\x52\x4b\x5a\x5f\x37\x1f\x04\ -\x02\x00\x0b\x0f\x11\x50\x4f\x52\x52\x52\x3e\x60\x5f\x5f\x43\x21\ -\x0c\x0d\x44\x13\x16\x4c\x3f\x3f\x4f\x52\x42\x65\x5f\x61\x56\x4d\ -\x52\x52\x51\x13\x45\x3a\x08\x09\x3b\x4b\x56\x68\x5f\x61\x60\x3e\ -\x52\x52\x13\x10\x15\x0e\x06\x07\x39\x41\x64\x6f\x5f\x61\x67\x54\ -\x4b\x52\x46\x51\x52\x4e\x39\x38\x40\x62\x68\x6f\x5f\x61\x6f\x66\ -\x54\x3d\x4d\x52\x4f\x4d\x3d\x53\x63\x68\x6f\x6f\x5f\x61\x6f\x6f\ -\x67\x5d\x55\x43\x43\x56\x60\x67\x6f\x6f\x6f\x6f\x5f\x58\x61\x61\ -\x61\x61\x61\x5f\x5f\x61\x61\x61\x61\x61\x61\x61\x57\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\ -\x00\x30\x00\x00\x00\x60\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\ -\x00\x80\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x34\x32\x31\xc4\x3a\x35\x33\xdf\x3a\x35\x33\ -\xdf\x3a\x35\x33\xdf\x3a\x35\x33\xdf\x3a\x35\x33\xdf\x3a\x36\x34\ -\xdf\x3c\x39\x38\xdf\x3c\x39\x38\xdf\x3e\x3b\x3a\xdf\x40\x3c\x3c\ -\xdf\x41\x3e\x3d\xdf\x43\x41\x40\xdf\x44\x42\x42\xdf\x45\x44\x44\ -\xdf\x45\x44\x44\xdf\x45\x44\x44\xdf\x45\x44\x44\xdf\x44\x44\x44\ -\xdf\x44\x44\x44\xdf\x44\x44\x44\xdf\x44\x43\x44\xdf\x44\x43\x44\ -\xdf\x44\x43\x44\xdf\x44\x43\x44\xdf\x44\x43\x44\xdf\x44\x43\x44\ -\xdf\x44\x43\x44\xdf\x44\x43\x44\xdf\x44\x44\x44\xdf\x44\x44\x44\ -\xdf\x44\x44\x44\xdf\x45\x44\x44\xdf\x45\x44\x44\xdf\x45\x44\x44\ -\xdf\x45\x44\x44\xdf\x43\x41\x41\xdf\x42\x40\x3e\xdf\x40\x3c\x3b\ -\xdf\x3d\x3b\x39\xdf\x3c\x39\x38\xdf\x3b\x36\x35\xdf\x3a\x35\x33\ -\xdf\x3a\x35\x33\xdf\x3a\x35\x33\xdf\x3a\x35\x33\xdf\x35\x32\x31\ -\xdf\x26\x28\x26\xa5\x51\x45\x3c\xe0\xc2\xa1\x8b\xff\xc4\xa3\x8c\ -\xff\xc4\xa3\x8c\xff\xc4\xa3\x8c\xff\xc4\xa3\x8c\xff\xc3\xa2\x8b\ -\xff\xc0\xa1\x8b\xff\xc0\xa1\x8b\xff\xbe\x9f\x8a\xff\xbd\x9f\x8a\ -\xff\xbb\x9e\x8a\xff\xba\x9d\x8a\xff\xb8\x9c\x89\xff\xb6\x9b\x89\ -\xff\xb4\x99\x88\xff\xb2\x98\x87\xff\xaf\x96\x87\xff\xad\x95\x87\ -\xff\xad\x95\x86\xff\xaa\x94\x85\xff\xa8\x93\x85\xff\xa8\x93\x85\ -\xff\xa8\x93\x85\xff\xa8\x93\x85\xff\xa8\x93\x85\xff\xa8\x93\x85\ -\xff\xa8\x93\x85\xff\xa8\x93\x85\xff\xaa\x94\x86\xff\xad\x96\x87\ -\xff\xae\x96\x87\xff\xb1\x97\x87\xff\xb2\x98\x88\xff\xb5\x9a\x88\ -\xff\xb6\x9b\x89\xff\xb9\x9c\x8a\xff\xba\x9d\x8a\xff\xbd\x9f\x8a\ -\xff\xbe\xa0\x8a\xff\xc0\xa1\x8b\xff\xc2\xa2\x8b\xff\xc4\xa3\x8c\ -\xff\xc4\xa3\x8c\xff\xc4\xa3\x8c\xff\xc4\xa3\x8c\xff\xa1\x8b\x7d\ -\xff\x21\x20\x20\xbd\x5b\x4c\x40\xe0\xdb\xb3\x98\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb4\x99\xff\xa4\x90\x84\ -\xff\x23\x21\x23\xbd\x5b\x4b\x3f\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xcb\xaa\x95\xff\x8a\x83\x81\ -\xff\x27\x25\x27\xbd\x5b\x4b\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xd5\xb0\x97\xff\x9f\x92\x8c\xff\xaa\xa8\xa9\ -\xff\x3e\x3e\x3e\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xda\xb3\x98\xff\xae\x9a\x8e\xff\xa7\xa5\xa6\xff\xe1\xe1\xe1\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xc1\xa5\x92\xff\x9a\x96\x95\xff\xe4\xe4\xe4\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x4b\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd3\xaf\x96\ -\xff\x9b\x91\x8d\xff\xcc\xcb\xcc\xff\xfe\xfe\xfe\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb5\x99\xff\xb5\x9d\x8f\ -\xff\xa8\xa6\xa7\xff\xf7\xf7\xf7\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd6\xb1\x97\xff\x9b\x91\x8c\ -\xff\xd3\xd3\xd3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xca\xaa\x94\xff\x98\x93\x93\ -\xff\xec\xec\xec\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x4b\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xd5\xb0\x97\xff\xa6\x95\x8c\xff\xa8\xa7\xa7\ -\xff\xf5\xf5\xf5\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xda\xb3\x98\ -\xff\xcd\xab\x95\xff\xbe\xa3\x91\xff\xb6\x9f\x8f\xff\xb3\x9d\x8f\ -\xff\xb1\x9c\x8e\xff\x9e\x91\x8a\xff\xa7\xa5\xa6\xff\xed\xed\xed\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd7\xb2\x98\xff\xa9\x97\x8c\ -\xff\x8f\x8e\x8b\xff\x8c\x98\x95\xff\x8d\xa0\x9c\xff\x8e\xa2\x9e\ -\xff\x8e\xa2\x9e\xff\x88\x8c\x8d\xff\xcc\xcb\xcc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x4b\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd4\xb0\x97\xff\x97\x8d\x88\ -\xff\x8b\x99\x96\xff\x9a\xc7\xbb\xff\x9e\xd7\xc7\xff\x9f\xd8\xc8\ -\xff\x9e\xd7\xc7\xff\x91\xad\xa6\xff\xa4\xa3\xa4\xff\xf7\xf7\xf7\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb5\x99\xff\xcc\xab\x95\ -\xff\xa3\x94\x8b\xff\x8c\x94\x91\xff\x97\xc1\xb6\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9b\xca\xbd\xff\x8e\x93\x93\xff\xdf\xde\xdf\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdb\xb4\x99\xff\xd7\xb1\x98\xff\xce\xac\x95\xff\xc3\xa6\x93\ -\xff\xc2\xa6\x93\xff\xd6\xb1\x97\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xd8\xb2\x98\xff\xae\x9a\x8e\xff\x8c\x99\x96\xff\x9e\xd4\xc5\ -\xff\x9f\xd9\xc9\xff\x9f\xd6\xc7\xff\x8e\xa0\x9c\xff\xbc\xbb\xbc\ -\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xda\xb3\x98\xff\xd1\xae\x96\xff\xb9\xa0\x91\ -\xff\xa4\x94\x8b\xff\x97\x8e\x89\xff\x8f\x8f\x8c\xff\x8c\x95\x92\ -\xff\x8b\x93\x90\xff\x9c\x91\x8a\xff\xc0\xa4\x92\xff\xd8\xb2\x98\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd9\xb3\x98\xff\xd0\xad\x96\ -\xff\xb9\xa0\x90\xff\x96\x8e\x89\xff\x90\xa8\xa2\xff\x9e\xd6\xc7\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x94\xb6\xad\xff\xa2\xa1\xa3\ -\xff\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xda\xb3\x98\xff\xca\xaa\x94\ -\xff\xb3\x9d\x8f\xff\x9f\x91\x8a\xff\x8f\x88\x86\xff\x87\x89\x89\ -\xff\x8b\x9d\x99\xff\x95\xb9\xaf\xff\x9b\xca\xbd\xff\x9d\xd2\xc4\ -\xff\x9c\xcf\xc0\xff\x93\xb2\xa9\xff\x8d\x93\x90\xff\x9f\x92\x8b\ -\xff\xc0\xa5\x92\xff\xd5\xb0\x97\xff\xd5\xb0\x97\xff\xcd\xab\x95\ -\xff\xc1\xa4\x92\xff\xb0\x9b\x8e\xff\x9e\x92\x8a\xff\x91\x8f\x8c\ -\xff\x8d\x9a\x96\xff\x94\xb6\xad\xff\x9d\xd3\xc4\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x99\xc5\xb9\xff\x94\x96\x97\ -\xff\xed\xed\xed\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xda\xb3\x98\xff\xaf\x9a\x8d\xff\x7c\x76\x76\ -\xff\x56\x54\x55\xff\x5b\x5e\x5e\xff\x8e\xa6\xa0\xff\x99\xc5\xb9\ -\xff\x9e\xd5\xc6\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\xff\x9b\xcd\xc0\xff\x92\xb0\xa8\ -\xff\x8c\x94\x91\xff\x95\x8e\x8a\xff\x95\x8e\x8a\xff\x8f\x90\x8d\ -\xff\x8c\x96\x94\xff\x8e\xa3\x9f\xff\x94\xb6\xad\xff\x9a\xc8\xbb\ -\xff\x9e\xd4\xc5\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9c\xcd\xc0\xff\x8e\x94\x93\ -\xff\xe3\xe2\xe3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdc\xb5\x99\xff\xbc\xa2\x90\xff\x73\x6f\x6f\xff\x1f\x1e\x1f\ -\xff\x04\x04\x04\xff\x1c\x26\x23\xff\x8e\xc1\xb3\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9b\xd6\xca\xff\x7f\xc2\xd0\xff\x8f\xce\xcc\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\ -\xff\x9c\xcf\xc1\xff\x97\xbf\xb5\xff\x98\xc2\xb7\xff\x9b\xcc\xbf\ -\xff\x9e\xd3\xc5\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd2\xc3\xff\x8c\x95\x94\ -\xff\xda\xd9\xda\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x4b\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xcd\xac\x95\xff\x89\x81\x7e\xff\x2e\x2d\x2e\xff\x01\x01\x01\ -\xff\x00\x00\x00\xff\x0a\x0e\x0d\xff\x7c\xa9\x9c\xff\xa0\xd9\xc9\ -\xff\x9d\xd7\xca\xff\x63\xad\xd6\xff\x1b\x7a\xe7\xff\x39\x8f\xe0\ -\xff\x95\xd1\xcb\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd3\xc4\xff\x8c\x96\x94\ -\xff\xd6\xd6\xd6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x5b\x49\x3e\xe0\xdb\xb3\x97\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb4\x99\xff\xd9\xb3\x98\ -\xff\xdc\xb4\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd7\xb2\x98\ -\xff\xa0\x90\x89\xff\x4b\x4a\x4b\xff\x05\x05\x05\xff\x00\x00\x00\ -\xff\x00\x00\x00\xff\x07\x09\x09\xff\x76\xa1\x95\xff\x9f\xd9\xc9\ -\xff\x7e\xc1\xd0\xff\x21\x7e\xe5\xff\x1a\x78\xe7\xff\x36\x8d\xe0\ -\xff\x95\xd1\xcb\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd3\xc4\xff\x8c\x95\x94\ -\xff\xd7\xd6\xd7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x58\x48\x3e\xe0\xd2\xae\x95\xff\xcb\xab\x94\ -\xff\xc1\xa5\x92\xff\xb4\x9d\x8f\xff\xa6\x95\x8b\xff\x9a\x8d\x87\ -\xff\xb0\x9b\x8d\xff\xd6\xb1\x97\xff\xdb\xb4\x98\xff\xb4\x9d\x8e\ -\xff\x69\x66\x67\xff\x11\x10\x11\xff\x00\x00\x00\xff\x00\x00\x00\ -\xff\x00\x00\x00\xff\x0e\x13\x12\xff\x81\xb0\xa3\xff\x98\xd4\xcb\ -\xff\x3f\x93\xdf\xff\x27\x82\xe4\xff\x22\x7e\xe5\xff\x80\xc3\xd0\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd0\xc2\xff\x8d\x94\x93\ -\xff\xdc\xdc\xdc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x3f\x3b\x3a\xe0\x97\x8f\x8c\xff\x9b\x96\x95\ -\xff\x99\x96\x97\xff\x86\x86\x88\xff\x7a\x88\x84\xff\x3a\x3c\x3c\ -\xff\x64\x62\x62\xff\x9b\x8e\x88\xff\xaa\x97\x8c\xff\x78\x73\x73\ -\xff\x23\x22\x22\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\ -\xff\x00\x00\x00\xff\x2c\x3c\x37\xff\x8c\xc5\xbf\xff\x72\xb8\xd4\ -\xff\x2a\x84\xe3\xff\x5e\xaa\xd8\xff\x23\x7f\xe5\xff\x66\xaf\xd6\ -\xff\x9a\xd5\xca\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9b\xcc\xbe\xff\x8f\x94\x94\ -\xff\xe6\xe5\xe6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x59\x58\x59\xe0\xdf\xdf\xdf\xff\xef\xef\xef\ -\xff\xd4\xd3\xd4\xff\x8c\x94\x93\xff\x93\xc3\xb6\xff\x36\x49\x43\ -\xff\x10\x11\x11\xff\x40\x3f\x3f\xff\x4e\x4d\x4e\xff\x21\x20\x21\ -\xff\x01\x01\x01\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x00\x00\ -\xff\x0c\x11\x0f\xff\x67\x91\x8c\xff\x47\x98\xdc\xff\x25\x80\xe5\ -\xff\x58\xa5\xd9\xff\x98\xd4\xcb\xff\x49\x9a\xdc\xff\x16\x76\xe8\ -\xff\x44\x97\xde\xff\x89\xc9\xce\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x98\xc2\xb6\xff\x97\x98\x99\ -\xff\xf0\xf0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xd2\xd2\xd2\xff\x8c\x98\x96\xff\x9e\xd4\xc5\xff\x88\xb9\xab\ -\xff\x30\x41\x3c\xff\x05\x06\x05\xff\x02\x02\x02\xff\x00\x00\x00\ -\xff\x00\x00\x00\xff\x00\x00\x00\xff\x00\x01\x00\xff\x10\x15\x14\ -\xff\x5d\x7e\x75\xff\x73\xb7\xcd\xff\x14\x74\xe8\xff\x14\x74\xe9\ -\xff\x77\xbc\xd2\xff\x70\xb6\xd3\xff\x20\x7d\xe6\xff\x1d\x7b\xe7\ -\xff\x2d\x86\xe3\xff\x74\xba\xd3\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x93\xb2\xaa\xff\xa8\xa6\xa8\ -\xff\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xd0\xcf\xd0\xff\x8c\x98\x96\xff\x9e\xd5\xc6\xff\x9f\xd9\xc9\ -\xff\x91\xc5\xb7\xff\x59\x79\x70\xff\x25\x33\x2f\xff\x12\x19\x17\ -\xff\x0f\x15\x14\xff\x19\x22\x20\xff\x3a\x4f\x49\xff\x78\xa2\x97\ -\xff\x99\xd2\xc6\xff\x52\xa1\xdb\xff\x30\x88\xe2\xff\x4a\x9b\xdd\ -\xff\x5e\xaa\xd8\xff\x21\x7d\xe6\xff\x1f\x7c\xe6\xff\x66\xb0\xd6\ -\xff\x97\xd3\xcb\xff\x9d\xd7\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9e\xd6\xc7\xff\x8d\x9e\x9a\xff\xc2\xc1\xc2\ -\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xd2\xd1\xd2\xff\x8b\x97\x95\xff\x9e\xd4\xc5\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9e\xd8\xc8\xff\x95\xcb\xbc\xff\x88\xb9\xab\ -\xff\x84\xb4\xa7\xff\x8d\xc1\xb3\xff\x9b\xd3\xc3\xff\x9f\xd9\xc9\ -\xff\x9d\xd8\xc9\xff\x91\xcf\xcc\xff\x97\xd3\xcb\xff\x9d\xd8\xc9\ -\xff\x5f\xaa\xd8\xff\x38\x8e\xe0\xff\x89\xc8\xce\xff\x99\xd4\xca\ -\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd9\xc6\xff\x9e\xd9\xc7\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9a\xcb\xbe\xff\x8e\x93\x93\xff\xe1\xe0\xe1\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xda\xda\xda\xff\x8c\x95\x93\xff\x9d\xd1\xc3\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x6f\xb6\xd4\xff\x29\x84\xe4\xff\x89\xc9\xce\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9e\xd9\xc8\ -\xff\x9d\xd9\xc6\xff\x9d\xd9\xc6\xff\x5b\xd5\x72\xff\x6c\xd6\x88\ -\xff\x9f\xd9\xc8\xff\x9c\xd9\xc5\xff\x9e\xd9\xc8\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd8\xc9\xff\x92\xb1\xa9\xff\xa3\xa1\xa3\xff\xf7\xf6\xf7\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xe6\xe5\xe6\xff\x90\x94\x94\xff\x9b\xcb\xbe\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x97\xd3\xcb\xff\x38\x8e\xe1\xff\x59\xa6\xd9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x80\xd7\xa2\ -\xff\x41\xd3\x53\xff\x60\xd5\x79\xff\x17\xd0\x1d\xff\x26\xd1\x30\ -\xff\x5f\xd5\x78\xff\x43\xd3\x55\xff\x8d\xd8\xb2\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9c\xd0\xc2\xff\x8c\x96\x95\xff\xcc\xcc\xcc\xff\xff\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xf3\xf2\xf3\xff\x99\x9a\x9b\xff\x97\xbf\xb5\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9e\xd8\xc9\xff\x8c\xcb\xcd\ -\xff\x5e\xaa\xd8\xff\x26\x81\xe5\xff\x56\xa4\xd9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x86\xd7\xa8\ -\xff\x15\xd0\x1b\xff\x04\xcf\x05\xff\x01\xcf\x01\xff\x02\xcf\x02\ -\xff\x03\xcf\x04\xff\x25\xd1\x2e\xff\x92\xd8\xb8\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd8\xc9\ -\xff\x93\xb3\xab\xff\x9d\x9d\x9e\xff\xf2\xf1\xf2\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xfc\xfc\xfc\xff\xae\xad\xaf\xff\x90\xaa\xa4\xff\x9f\xd8\xc8\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x98\xd4\xcb\xff\x62\xad\xd7\xff\x2c\x85\xe3\ -\xff\x36\x8d\xe1\xff\x69\xb1\xd5\xff\x94\xd1\xcb\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\x8d\xd8\xb2\xff\x55\xd4\x6b\ -\xff\x12\xd0\x16\xff\x00\xcf\x00\xff\x00\xcf\x00\xff\x00\xcf\x00\ -\xff\x00\xcf\x00\xff\x1c\xd1\x23\xff\x60\xd5\x78\xff\x95\xd8\xbc\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9b\xcc\xbe\ -\xff\x8c\x94\x93\xff\xcd\xcd\xcd\xff\xfe\xfe\xfe\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xd0\xd0\xd0\xff\x8c\x96\x95\xff\x9d\xd1\xc3\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9b\xd6\xca\xff\x54\xa3\xda\xff\x2d\x86\xe2\xff\x6e\xb5\xd4\ -\xff\x8d\xcc\xcd\xff\x71\xb7\xd4\xff\x52\xa1\xdb\xff\x63\xae\xd7\ -\xff\x77\xbc\xd2\xff\x75\xba\xd3\xff\x43\xab\xad\xff\x08\xaa\x5e\ -\xff\x02\xcc\x0b\xff\x00\xcf\x00\xff\x00\xcf\x00\xff\x00\xcf\x00\ -\xff\x00\xcf\x00\xff\x07\xcf\x09\xff\x27\xd1\x32\xff\x86\xd7\xa9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9e\xd5\xc6\xff\x8f\xa5\x9f\ -\xff\xaa\xa9\xaa\xff\xf6\xf6\xf6\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xef\xef\xef\xff\x98\x99\x9a\xff\x95\xba\xb0\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x8f\xcd\xcd\xff\x2a\x84\xe3\xff\x73\xb9\xd3\xff\x81\xc3\xd0\ -\xff\x3b\x91\xe0\xff\x2a\x84\xe4\xff\x45\x98\xde\xff\x39\x8f\xe0\ -\xff\x2e\x87\xe3\xff\x2f\x88\xe2\xff\x3a\x90\xdf\xff\x4a\xa6\xc3\ -\xff\x17\xcb\x29\xff\x00\xcf\x00\xff\x00\xcf\x00\xff\x00\xcf\x00\ -\xff\x00\xcf\x00\xff\x2d\xd2\x3a\xff\x8d\xd8\xb2\xff\x9e\xd9\xc8\ -\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\xff\x93\xb5\xac\xff\x95\x96\x97\ -\xff\xe4\xe4\xe4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfd\xfd\xfd\xff\xc0\xc0\xc1\xff\x8c\x99\x96\ -\xff\x9d\xd2\xc3\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x91\xcf\xcc\xff\x29\x83\xe4\xff\x37\x8d\xe1\xff\x29\x83\xe4\ -\xff\x4a\x9b\xdd\xff\x8a\xca\xce\xff\x9d\xd7\xca\xff\x9a\xd5\xca\ -\xff\x94\xd1\xcb\xff\x95\xd2\xcb\xff\x9b\xd6\xca\xff\x78\xd6\x99\ -\xff\x17\xd0\x1c\xff\x25\xd1\x2e\xff\x08\xcf\x0b\xff\x0e\xd0\x12\ -\xff\x23\xd1\x2c\xff\x1e\xd1\x26\xff\x8a\xd8\xae\xff\xa0\xd9\xc9\ -\xff\x9f\xd8\xc9\xff\x97\xbf\xb4\xff\x8e\x93\x93\xff\xd1\xd0\xd1\ -\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\xee\xef\xff\x9b\x9b\x9c\ -\xff\x92\xb1\xa9\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9b\xd6\xca\xff\x61\xac\xd7\xff\x57\xa5\xd9\xff\x77\xbc\xd2\ -\xff\x99\xd4\xca\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x94\xd8\xbb\ -\xff\x82\xd7\xa3\xff\x90\xd8\xb5\xff\x31\xd2\x3e\xff\x46\xd3\x59\ -\xff\x91\xd8\xb7\xff\x81\xd7\xa2\xff\x99\xd9\xc1\xff\x9f\xd8\xc8\ -\xff\x98\xc2\xb7\xff\x8d\x94\x93\xff\xc4\xc3\xc4\xff\xfb\xfb\xfb\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\xd3\xd3\xd3\ -\xff\x8e\x92\x92\xff\x98\xc1\xb6\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9e\xd8\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x89\xd7\xad\xff\x8f\xd8\xb5\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\xff\x97\xbf\xb5\ -\xff\x8d\x93\x93\xff\xbe\xbe\xbe\xff\xf9\xf9\xf9\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfb\xfa\ -\xff\xbf\xbe\xbf\xff\x8c\x95\x94\xff\x99\xc6\xba\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\xa0\xd9\xc9\xff\xa0\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9e\xd5\xc6\xff\x94\xb5\xac\xff\x8e\x92\x92\ -\xff\xc3\xc1\xc3\xff\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xf7\xf7\xf7\xff\xb8\xb7\xb8\xff\x8c\x95\x94\xff\x98\xc2\xb6\ -\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd8\xc9\ -\xff\x9b\xcc\xbf\xff\x8e\xa5\xa0\xff\x95\x96\x97\xff\xd0\xd0\xd0\ -\xff\xfb\xfb\xfb\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xf7\xf7\xf7\xff\xbe\xbd\xbe\xff\x8d\x92\x92\ -\xff\x92\xb2\xa9\xff\x9d\xd2\xc3\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9c\xd1\xc3\xff\x94\xb5\xac\ -\xff\x8c\x94\x93\xff\xa8\xa7\xa8\xff\xe3\xe3\xe3\xff\xfe\xfe\xfe\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\xff\xd2\xd2\xd2\ -\xff\x9a\x9a\x9b\xff\x8c\x9a\x97\xff\x96\xbc\xb2\xff\x9d\xd2\xc3\ -\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9e\xd7\xc7\ -\xff\x9b\xcc\xbf\xff\x93\xb4\xab\xff\x8b\x97\x95\xff\x9b\x9b\x9c\ -\xff\xcb\xca\xcb\xff\xf5\xf5\xf5\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\ -\xff\xee\xed\xee\xff\xbf\xbe\xbf\xff\x97\x98\x99\xff\x8c\x96\x94\ -\xff\x91\xac\xa5\xff\x97\xc0\xb5\xff\x9b\xcc\xbf\xff\x9d\xd3\xc4\ -\xff\x9e\xd5\xc6\xff\x9e\xd6\xc7\xff\x9e\xd6\xc6\xff\x9d\xd4\xc5\ -\xff\x9c\xcf\xc1\xff\x99\xc6\xba\xff\x94\xb6\xad\xff\x8e\xa1\x9c\ -\xff\x8d\x93\x93\xff\x9f\x9f\xa0\xff\xc9\xc8\xc9\xff\xf0\xef\xf0\ -\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfd\xfd\xfd\xff\xee\xee\xee\xff\xcd\xcc\xcd\ -\xff\xac\xaa\xac\xff\x97\x98\x99\xff\x8e\x93\x93\xff\x8b\x96\x94\ -\xff\x8c\x99\x97\xff\x8c\x9c\x99\xff\x8c\x9a\x97\xff\x8b\x97\x95\ -\xff\x8d\x94\x93\xff\x93\x95\x96\xff\xa1\xa0\xa2\xff\xbb\xba\xbb\ -\xff\xdd\xdc\xdd\xff\xf5\xf5\xf5\xff\xfe\xfe\xfe\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xfb\xfb\xfb\xff\xf0\xf0\xf0\xff\xe3\xe3\xe3\xff\xd6\xd5\xd6\ -\xff\xce\xcd\xce\xff\xcb\xca\xcb\xff\xcc\xcb\xcc\xff\xd3\xd3\xd3\ -\xff\xdf\xdf\xdf\xff\xec\xeb\xec\xff\xf8\xf7\xf8\xff\xfe\xfe\xfe\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x68\x68\x68\xe0\xfc\xfc\xfc\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\xed\xed\ -\xff\x43\x43\x43\xbd\x67\x67\x67\xe0\xf9\xf9\xf9\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\ -\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xfc\xfc\xfc\xff\xea\xea\xea\ -\xff\x42\x42\x42\xbd\x31\x31\x31\xc5\x67\x67\x67\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\ -\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x68\x68\x68\xe0\x61\x61\x61\ -\xe0\x23\x23\x23\xa6\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x00\x00\x00\x00\x00\x00\x95\x08\x00\x00\x00\ -\x00\x00\x00\x95\x08\x28\x00\x00\x00\x20\x00\x00\x00\x40\x00\x00\ -\x00\x01\x00\x20\x00\x00\x00\x00\x00\x80\x10\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x47\x41\ -\xc4\x69\x5b\x52\xdf\x69\x5b\x52\xdf\x69\x5b\x52\xdf\x69\x5c\x53\ -\xdf\x6a\x5d\x54\xdf\x6a\x5d\x56\xdf\x6a\x5e\x58\xdf\x6b\x60\x5a\ -\xdf\x6b\x61\x5b\xdf\x6a\x61\x5b\xdf\x69\x60\x5b\xdf\x66\x60\x5b\ -\xdf\x65\x5e\x5b\xdf\x65\x5e\x5a\xdf\x65\x5d\x5a\xdf\x65\x5e\x5a\ -\xdf\x65\x5d\x5a\xdf\x65\x5e\x5a\xdf\x65\x5e\x5b\xdf\x66\x60\x5b\ -\xdf\x69\x60\x5b\xdf\x6a\x61\x5b\xdf\x6b\x61\x5c\xdf\x6b\x60\x5a\ -\xdf\x6a\x5e\x58\xdf\x6a\x5d\x55\xdf\x6a\x5c\x54\xdf\x69\x5b\x53\ -\xdf\x69\x5b\x52\xdf\x66\x5a\x52\xdf\x39\x35\x34\xb0\x8d\x75\x64\ -\xe0\xda\xb3\x98\xff\xda\xb3\x98\xff\xda\xb3\x98\xff\xd9\xb3\x98\ -\xff\xd9\xb2\x98\xff\xd8\xb2\x97\xff\xd8\xb2\x97\xff\xd7\xb1\x97\ -\xff\xd6\xb1\x97\xff\xd5\xb0\x97\xff\xd4\xb0\x96\xff\xd3\xaf\x96\ -\xff\xd2\xaf\x96\xff\xd2\xae\x96\xff\xd2\xae\x96\xff\xd2\xae\x96\ -\xff\xd2\xae\x96\xff\xd2\xae\x96\xff\xd2\xae\x96\xff\xd3\xaf\x96\ -\xff\xd4\xb0\x96\xff\xd5\xb0\x97\xff\xd6\xb1\x97\xff\xd7\xb1\x97\ -\xff\xd8\xb2\x97\xff\xd9\xb2\x98\xff\xd9\xb3\x98\xff\xda\xb3\x98\ -\xff\xda\xb3\x98\xff\xce\xac\x94\xff\x53\x4c\x49\xc9\x8e\x75\x64\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdb\xb4\x98\xff\xb4\x9f\x92\xff\x56\x53\x53\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xc2\xa6\x93\xff\xb8\xb3\xb2\xff\x7e\x7e\x7e\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd1\xae\x96\ -\xff\xad\xa4\xa0\xff\xed\xec\xed\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb4\x99\xff\xb3\x9f\x93\ -\xff\xd7\xd6\xd6\xff\xfd\xfd\xfd\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd3\xaf\x97\xff\xaf\xa7\xa4\ -\xff\xf7\xf7\xf7\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdc\xb4\x99\xff\xda\xb3\x98\xff\xbb\xa2\x92\xff\xbe\xbb\xbb\ -\xff\xfd\xfd\xfd\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xd8\xb2\x98\xff\xbe\xa4\x92\xff\xac\x9d\x90\ -\xff\xa7\x9c\x91\xff\xa2\x98\x8f\xff\xad\xa8\xa7\xff\xf2\xf2\xf2\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xc4\xa7\x93\xff\x8f\x93\x90\xff\x96\xbb\xb1\ -\xff\x9a\xc9\xbc\xff\x97\xbf\xb4\xff\xa7\xac\xac\xff\xf7\xf7\xf7\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xda\xb3\x98\xff\xd7\xb2\x98\xff\xdc\xb4\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xd9\xb3\x98\xff\xba\xa2\x92\xff\x96\xa0\x99\ -\xff\x9c\xce\xc1\xff\x9f\xd7\xc7\xff\x95\xaa\xa5\xff\xe0\xdf\xe0\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdb\xb4\x98\xff\xd3\xaf\x96\xff\xc0\xa4\x92\ -\xff\xae\x9c\x8f\xff\xa1\x9b\x92\xff\x9c\x9b\x93\xff\xb5\x9f\x91\ -\xff\xd3\xaf\x97\xff\xdc\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdc\xb4\x99\xff\xd6\xb1\x97\xff\xc5\xa7\x93\xff\x9b\x98\x91\ -\xff\x9a\xc8\xbb\xff\x9f\xd9\xc9\xff\x96\xbc\xb2\xff\xc2\xc2\xc3\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd9\xb3\x98\ -\xff\xbb\xa0\x8f\xff\x98\x89\x80\xff\x91\x8e\x89\xff\x8f\xa0\x9b\ -\xff\x96\xbc\xb2\xff\x9b\xcd\xbf\xff\x9c\xcf\xc1\xff\x95\xb6\xad\ -\xff\x9a\x9d\x95\xff\xb5\xa0\x91\xff\xc2\xa6\x93\xff\xb7\xa0\x91\ -\xff\xa8\x9c\x91\xff\x9b\x9d\x95\xff\x94\xaa\xa2\xff\x99\xc5\xb9\ -\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9a\xca\xbd\xff\xad\xb1\xb1\ -\xff\xfc\xfc\xfc\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb4\x99\xff\xb2\x9a\x8b\ -\xff\x4c\x49\x49\xff\x1d\x1e\x1e\xff\x72\x94\x8b\xff\x9f\xd6\xc6\ -\xff\x9b\xd6\xca\xff\x88\xc8\xce\xff\x9b\xd6\xca\xff\x9f\xd9\xc9\ -\xff\x9d\xd0\xc2\xff\x96\xb9\xaf\xff\x94\xb0\xa8\xff\x96\xbb\xb1\ -\xff\x9a\xc8\xbb\xff\x9d\xd2\xc3\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9c\xd0\xc2\xff\xa4\xab\xaa\ -\xff\xf8\xf8\xf8\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x8e\x74\x63\ -\xe0\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xc7\xa8\x93\xff\x63\x5d\x5c\ -\xff\x09\x09\x09\xff\x01\x01\x01\xff\x58\x78\x6f\xff\x9e\xd8\xc9\ -\xff\x64\xae\xd6\xff\x25\x81\xe4\xff\x7b\xbf\xd1\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd1\xc3\xff\xa1\xaa\xa8\ -\xff\xf6\xf6\xf6\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x89\x71\x61\ -\xe0\xcf\xad\x96\xff\xc6\xa7\x93\xff\xb8\xa0\x8f\xff\xb0\x99\x8c\ -\xff\xcf\xad\x95\xff\xd2\xaf\x96\xff\x87\x7c\x76\xff\x19\x19\x19\ -\xff\x00\x00\x00\xff\x01\x02\x02\xff\x5c\x7d\x74\xff\x86\xc6\xcf\ -\xff\x2e\x87\xe3\xff\x34\x8c\xe1\xff\x90\xce\xcc\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9c\xd0\xc2\xff\xa3\xab\xaa\ -\xff\xf8\xf7\xf8\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x70\x6c\x69\ -\xe0\xb5\xaf\xae\xff\xa2\x9f\x9f\xff\x80\x91\x8d\xff\x40\x45\x44\ -\xff\x76\x6e\x6a\xff\x85\x7a\x75\xff\x2e\x2d\x2d\xff\x01\x01\x01\ -\xff\x00\x00\x00\xff\x11\x17\x15\xff\x6a\x9e\xa6\xff\x4d\x9d\xdc\ -\xff\x5b\xa8\xd8\xff\x3a\x90\xe0\xff\x76\xbb\xd2\xff\x9b\xd6\xca\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9b\xcb\xbe\xff\xab\xb0\xb0\ -\xff\xfb\xfb\xfb\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa0\xa0\xa0\ -\xe0\xfc\xfb\xfc\xff\xbc\xbd\xbe\xff\x95\xbd\xb3\xff\x5c\x7d\x74\ -\xff\x1a\x1e\x1d\xff\x12\x12\x12\xff\x02\x02\x02\xff\x00\x00\x00\ -\xff\x0d\x11\x10\xff\x54\x76\x73\xff\x39\x8d\xdc\xff\x30\x88\xe2\ -\xff\x77\xbc\xd2\xff\x29\x83\xe4\xff\x30\x89\xe2\xff\x84\xc5\xcf\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x97\xbf\xb5\xff\xbe\xbf\xbf\ -\xff\xfe\xfe\xfe\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xfe\xfe\xfe\xff\xba\xbb\xbc\xff\x98\xc3\xb8\xff\x9b\xd4\xc4\ -\xff\x75\xa0\x94\xff\x42\x5b\x54\xff\x32\x44\x3f\xff\x43\x5b\x54\ -\xff\x75\x9f\x94\xff\x8a\xc7\xc8\xff\x55\xa3\xda\xff\x66\xaf\xd6\ -\xff\x3c\x91\xdf\xff\x4b\x9c\xdc\xff\x8d\xcb\xcd\xff\x9c\xd7\xca\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\xff\x95\xaf\xa8\xff\xd9\xd8\xd9\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xbf\xc0\xc1\xff\x97\xc0\xb5\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9e\xd7\xc7\xff\x9b\xd4\xc4\xff\x9e\xd7\xc7\ -\xff\x9f\xd9\xc9\xff\x9f\xd8\xc9\xff\x9e\xd8\xc9\xff\x93\xd0\xcc\ -\xff\x43\x96\xde\xff\x8c\xcb\xcd\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9e\xd9\xc7\xff\x9b\xd9\xc4\xff\x7e\xd7\x9f\xff\x85\xd7\xa7\ -\xff\x9b\xd9\xc4\xff\x9e\xd9\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9c\xd1\xc2\xff\x9e\xa8\xa6\xff\xf1\xf1\xf1\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xce\xce\xce\xff\x95\xb6\xad\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x98\xd4\xcb\ -\xff\x4f\x9f\xdb\xff\x6d\xb5\xd4\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x87\xd7\xab\xff\x3f\xd3\x4f\xff\x23\xd1\x2c\xff\x2a\xd2\x35\ -\xff\x42\xd3\x53\xff\x90\xd8\xb5\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x96\xb9\xb0\xff\xc1\xc1\xc2\xff\xfe\xfe\xfe\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xe3\xe2\xe3\xff\x96\xaa\xa5\xff\x9f\xd7\xc8\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9e\xd8\xc9\xff\x7d\xc0\xd1\xff\x4b\x9c\xdc\ -\xff\x4f\x9f\xdb\xff\x88\xc8\xce\xff\x9f\xd9\xc9\xff\x9c\xd8\xc5\ -\xff\x6d\xd5\x8c\xff\x11\xd0\x16\xff\x00\xcf\x00\xff\x00\xcf\x00\ -\xff\x19\xd1\x20\xff\x77\xd6\x96\xff\x9e\xd9\xc7\xff\x9f\xd9\xc9\ -\xff\x9c\xcf\xc1\xff\x9c\xa7\xa5\xff\xec\xec\xec\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xf6\xf6\xf6\xff\xa4\xab\xaa\xff\x9b\xcd\xbf\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x82\xc3\xd0\xff\x45\x97\xdd\xff\x73\xb8\xd3\ -\xff\x5f\xaa\xd8\xff\x4d\x9d\xdc\xff\x59\xa6\xd9\xff\x54\xa5\xd3\ -\xff\x24\xa6\x8e\xff\x07\xcb\x14\xff\x00\xcf\x00\xff\x00\xcf\x00\ -\xff\x0f\xd0\x13\xff\x5c\xd4\x75\xff\x9c\xd9\xc5\xff\x9f\xd6\xc7\ -\xff\x94\xae\xa8\xff\xcb\xcb\xcc\xff\xfe\xfe\xfe\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xfe\xfe\xfe\xff\xca\xca\xcb\xff\x94\xb2\xaa\ -\xff\x9f\xd8\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x71\xb7\xd3\xff\x3f\x93\xdf\xff\x46\x98\xdd\ -\xff\x62\xac\xd7\xff\x82\xc4\xcf\xff\x78\xbd\xd2\xff\x79\xbd\xd1\ -\xff\x71\xc8\xae\xff\x22\xd0\x2d\xff\x0e\xd0\x12\xff\x12\xd0\x16\ -\xff\x2a\xd2\x35\xff\x8f\xd8\xb4\xff\x9f\xd8\xc8\xff\x96\xb9\xb0\ -\xff\xb3\xb6\xb6\xff\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xf3\xf3\xf3\xff\xa4\xaa\xa9\ -\xff\x9a\xc7\xba\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x91\xce\xcc\xff\x6e\xb5\xd4\xff\x86\xc7\xcf\ -\xff\x9e\xd8\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x98\xd8\xc0\xff\x8a\xd8\xae\xff\x61\xd5\x7a\xff\x6b\xd6\x87\ -\xff\x8a\xd8\xae\xff\x9a\xd7\xc2\xff\x97\xbc\xb2\xff\xa9\xae\xae\ -\xff\xf1\xf0\xf1\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdf\xde\xdf\ -\xff\x99\xa6\xa4\xff\x9b\xcd\xbf\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9c\xd9\xc6\xff\x9d\xd9\xc6\ -\xff\x9e\xd5\xc6\xff\x95\xb6\xad\xff\xab\xaf\xaf\xff\xee\xee\xee\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\ -\xff\xd6\xd6\xd6\xff\x99\xa6\xa3\xff\x99\xc7\xbb\xff\x9f\xd8\xc8\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd8\xc8\xff\x9b\xcb\xbe\ -\xff\x95\xaa\xa5\xff\xb9\xbb\xbb\xff\xf2\xf2\xf2\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xfd\xfd\xfd\xff\xde\xde\xde\xff\xa4\xaa\xa9\xff\x95\xb3\xab\ -\xff\x9b\xce\xc0\xff\x9f\xd7\xc8\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9e\xd6\xc6\xff\x9a\xc9\xbd\xff\x94\xb0\xa9\xff\xa3\xaa\xa9\ -\xff\xd5\xd5\xd5\xff\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf2\xf2\xf2\xff\xc9\xc9\xca\ -\xff\xa3\xaa\xa9\xff\x95\xaa\xa5\xff\x95\xb7\xae\xff\x98\xc1\xb6\ -\xff\x99\xc5\xb9\xff\x98\xc4\xb8\xff\x97\xbd\xb3\xff\x94\xb2\xaa\ -\xff\x98\xa8\xa4\xff\xaa\xae\xae\xff\xd0\xd0\xd0\xff\xf3\xf3\xf3\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\ -\xff\xf5\xf5\xf5\xff\xe1\xe1\xe1\xff\xcc\xcc\xcc\xff\xbc\xbd\xbe\ -\xff\xb7\xb9\xb9\xff\xb8\xba\xba\xff\xc3\xc3\xc4\xff\xd5\xd4\xd5\ -\xff\xe9\xe9\xe9\xff\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\xa5\xa5\xa5\ -\xe0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xfe\xfe\xfe\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfe\xfe\xfe\xff\x87\x87\x87\xc9\x6c\x6c\x6c\ -\xc5\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\xe0\xa5\xa5\xa5\ -\xe0\xa5\xa5\xa5\xe0\xa3\xa3\xa3\xe0\x5a\x5a\x5a\xb1\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\ -\x00\x10\x00\x00\x00\x20\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\ -\x00\x40\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x95\x7e\x6d\xc2\xad\x8f\x7c\xde\xac\x90\x7d\ -\xde\xac\x90\x7e\xde\xac\x91\x7f\xde\xa9\x90\x7f\xde\xa7\x8f\x7f\ -\xde\xa5\x8e\x7e\xde\xa5\x8e\x7e\xde\xa6\x8e\x7e\xde\xa8\x8f\x7f\ -\xde\xab\x90\x7f\xde\xac\x90\x7e\xde\xac\x90\x7d\xde\xac\x8f\x7c\ -\xde\x80\x6f\x64\xb9\xbc\x9a\x83\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xd3\xb0\x98\ -\xff\x9e\x95\x8f\xd4\xbc\x9a\x82\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdb\xb4\x98\xff\xc9\xb8\xad\ -\xff\xc5\xc5\xc5\xd4\xbc\x9a\x82\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdc\xb4\x99\xff\xd9\xb3\x98\xff\xcd\xad\x98\xff\xdc\xd7\xd4\ -\xff\xd1\xd1\xd1\xd4\xbc\x9a\x82\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdd\xb5\x99\xff\xdc\xb5\x99\ -\xff\xbe\xa6\x94\xff\xa4\xae\xa2\xff\xab\xb2\xab\xff\xf2\xf1\xf1\ -\xff\xd1\xd1\xd1\xd4\xbc\x9a\x82\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xdd\xb5\x99\xff\xdc\xb4\x99\xff\xd5\xb0\x97\xff\xc7\xac\x96\ -\xff\xbe\xac\x99\xff\xcc\xae\x97\xff\xdb\xb4\x98\xff\xd9\xb3\x98\ -\xff\xc2\xa8\x95\xff\x9d\xb8\xad\xff\x9f\xc7\xbd\xff\xe4\xe6\xe6\ -\xff\xd1\xd1\xd1\xd4\xbc\x9a\x82\xdf\xdd\xb5\x99\xff\xdd\xb5\x99\ -\xff\xda\xb3\x98\xff\xa0\x89\x7a\xff\x75\x77\x70\xff\x96\xbd\xb5\ -\xff\x91\xc6\xc2\xff\x9f\xbf\xb2\xff\xaa\xaf\xa1\xff\xa7\xb2\xa5\ -\xff\xa0\xbe\xb1\xff\x9d\xd1\xc2\xff\x9d\xce\xc1\xff\xd2\xd9\xd7\ -\xff\xd1\xd1\xd1\xd4\xb3\x95\x81\xdf\xc9\xaa\x94\xff\xc8\xa8\x92\ -\xff\xb4\x98\x86\xff\x2c\x28\x27\xff\x33\x46\x42\xff\x6a\xb0\xd0\ -\xff\x61\xac\xd7\xff\x9e\xd8\xc9\xff\x9f\xd7\xc7\xff\x9f\xd8\xc8\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xd0\xc2\xff\xce\xd5\xd4\ -\xff\xd1\xd1\xd1\xd4\xb8\xb3\xb1\xdf\x9f\xa9\xa5\xff\x5d\x66\x60\ -\xff\x38\x35\x33\xff\x0e\x12\x11\xff\x3f\x6b\x81\xff\x4f\x9f\xda\ -\xff\x51\xa0\xdb\xff\x95\xd1\xcb\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x9d\xcc\xbf\xff\xd8\xdd\xdc\ -\xff\xd1\xd1\xd1\xd4\xd4\xd4\xd4\xdf\xaf\xc4\xbf\xff\x8c\xbf\xb1\ -\xff\x6b\x91\x87\xff\x78\xa4\x98\xff\x84\xc2\xc8\xff\x62\xad\xd7\ -\xff\x78\xbc\xd2\xff\x9b\xd7\xc7\xff\x90\xd8\xb6\xff\x91\xd8\xb7\ -\xff\x9e\xd9\xc7\xff\x9f\xd9\xc9\xff\xa2\xc5\xbc\xff\xec\xec\xec\ -\xff\xd1\xd1\xd1\xd4\xd8\xd8\xd8\xdf\xba\xc9\xc5\xff\x9e\xd5\xc6\ -\xff\x9f\xd9\xc9\xff\x9f\xd9\xc9\xff\x92\xcf\xcc\xff\x67\xb0\xd6\ -\xff\x85\xc6\xcf\xff\x81\xd4\xab\xff\x29\xd1\x35\xff\x2d\xd2\x39\ -\xff\x8a\xd8\xae\xff\x9e\xd3\xc4\xff\xbc\xca\xc6\xff\xfc\xfc\xfc\ -\xff\xd1\xd1\xd1\xd4\xda\xda\xda\xdf\xd7\xdc\xdb\xff\x9d\xcb\xbe\ -\xff\x9f\xd9\xc9\xff\x9e\xd8\xc9\xff\x66\xb0\xd6\xff\x5f\xaa\xd7\ -\xff\x6d\xb4\xd4\xff\x5b\xba\xb0\xff\x1a\xcd\x28\xff\x21\xd1\x2a\ -\xff\x85\xd5\xa7\xff\xa6\xc3\xbc\xff\xea\xeb\xeb\xff\xff\xff\xff\ -\xff\xd1\xd1\xd1\xd4\xda\xda\xda\xdf\xf7\xf7\xf7\xff\xb4\xc6\xc1\ -\xff\x9e\xd2\xc4\xff\x9f\xd9\xc9\xff\x8c\xcb\xcd\xff\x93\xd0\xcc\ -\xff\x9e\xd8\xc9\xff\x9b\xd8\xc4\xff\x84\xd7\xa7\xff\x85\xd3\xa6\ -\xff\xa1\xc4\xb7\xff\xde\xe1\xe0\xff\xfe\xfe\xfe\xff\xff\xff\xff\ -\xff\xd1\xd1\xd1\xd4\xda\xda\xda\xdf\xff\xff\xff\xff\xee\xef\xef\ -\xff\xb3\xc6\xc1\xff\x9d\xcb\xbe\xff\x9e\xd5\xc6\xff\x9f\xd8\xc8\ -\xff\x9f\xd8\xc8\xff\x9e\xd4\xc5\xff\x9e\xca\xbe\xff\xb0\xc5\xc0\ -\xff\xe4\xe6\xe6\xff\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xd1\xd1\xd1\xd4\xda\xda\xda\xdf\xff\xff\xff\xff\xff\xff\xff\ -\xff\xf6\xf7\xf7\xff\xd7\xdb\xda\xff\xb9\xc8\xc4\xff\xae\xc5\xbf\ -\xff\xaf\xc5\xbf\xff\xbd\xca\xc7\xff\xda\xde\xdd\xff\xf7\xf7\xf7\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xd1\xd1\xd1\xd4\xba\xba\xba\xc3\xd9\xd9\xd9\xdf\xd9\xd9\xd9\ -\xdf\xd9\xd9\xd9\xdf\xd9\xd9\xd9\xdf\xd8\xd8\xd8\xdf\xd3\xd3\xd3\ -\xdf\xd4\xd4\xd4\xdf\xd8\xd8\xd8\xdf\xd9\xd9\xd9\xdf\xd9\xd9\xd9\ -\xdf\xd9\xd9\xd9\xdf\xd9\xd9\xd9\xdf\xd9\xd9\xd9\xdf\xd9\xd9\xd9\ -\xdf\xb3\xb3\xb3\xb9\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\ -\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\ -\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\ -\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\x00\x00\x00\x26\ -\x00\x00\x00\x26\x00\ -" - -qt_resource_name = b"\ -\x00\x05\ -\x00\x6f\xa6\x53\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x11\ -\x0c\x37\x16\x5f\ -\x00\x64\ -\x00\x79\x00\x65\x00\x2d\x00\x64\x00\x69\x00\x66\x00\x66\x00\x75\x00\x73\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x69\x00\x63\x00\x6f\ -\ -" - -qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x45\xcb\x06\x39\x90\ -" - -qt_version = QtCore.qVersion().split('.') -if qt_version < ['5', '8', '0']: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() diff --git a/quest/lib/widgets.py b/quest/lib/widgets.py deleted file mode 100644 index a8fc562..0000000 --- a/quest/lib/widgets.py +++ /dev/null @@ -1,133 +0,0 @@ -import os -import pickle -import random -from qtpy import QtGui, QtCore, QtWidgets, uic -from lib.structure import Structure -import numpy as np -import lib - - -def clearLayout(layout): - if layout != None: - while layout.count(): - child = layout.takeAt(0) - if child.widget() is not None: - child.widget().deleteLater() - elif child.layout() is not None: - clearLayout(child.layout()) - - -class PDBSelector(QtWidgets.QWidget): - - def __init__(self, show_labels=True, update=None): - QtWidgets.QWidget.__init__(self) - uic.loadUi( - os.path.join( - os.path.dirname( - __file__ - ), - 'pdb_widget.ui' - ), - self - ) - self._pdb = None - self._setup_editable_combos() - self.comboBox.currentIndexChanged.connect(self.onChainChanged) - self.comboBox_2.currentIndexChanged.connect(self.onResidueChanged) - if not show_labels: - self.label.hide() - self.label_2.hide() - self.label_3.hide() - - @property - def atoms(self): - return self._pdb - - @atoms.setter - def atoms(self, v): - self._pdb = v - self.update_chain() - - @property - def chain_id(self): - return str(self.comboBox.currentText()) - - @chain_id.setter - def chain_id(self, v): - pass - - @property - def residue_name(self): - try: - return str(self.atoms[self.atom_number]['res_name']) - except ValueError: - return 0 - - @property - def residue_id(self): - try: - return int(self.comboBox_2.currentText()) - except ValueError: - return 0 - - @residue_id.setter - def residue_id(self, v): - pass - - @property - def atom_name(self): - return str(self.comboBox_3.currentText()) - - @atom_name.setter - def atom_name(self, v): - pass - - @property - def atom_number(self): - pdb = self.atoms - residue_key = self.residue_id - atom_name = self.atom_name - chain = self.chain_id - w = np.where((pdb['res_id'] == residue_key) & (pdb['atom_name'] == atom_name) & - (pdb['chain'] == chain)) - return w[0][0] - - def onChainChanged(self): - print("PDBSelector:onChainChanged") - self.comboBox_2.clear() - pdb = self._pdb - chain = str(self.comboBox.currentText()) - atom_ids = np.where(pdb['chain'] == chain)[0] - residue_ids = list(set(self.atoms['res_id'][atom_ids])) - residue_ids_str = [str(x) for x in residue_ids] - self.comboBox_2.addItems(residue_ids_str) - - def onResidueChanged(self): - self.comboBox_3.clear() - pdb = self.atoms - chain = self.chain_id - residue = self.residue_id - print("onResidueChanged: %s" % residue) - atom_ids = np.where((pdb['res_id'] == residue) & (pdb['chain'] == chain))[0] - atom_names = [atom['atom_name'] for atom in pdb[atom_ids]] - self.comboBox_3.addItems(atom_names) - - def update_chain(self): - self.comboBox.clear() - chain_ids = list(set(self.atoms['chain'][:])) - chain_ids = [str(c) for c in chain_ids] - self.comboBox.addItems(chain_ids) - - def _setup_editable_combos(self): - for cb in (self.comboBox, self.comboBox_2, self.comboBox_3): - cb.setEditable(True) - cb.setInsertPolicy(QtWidgets.QComboBox.NoInsert) - completer = QtWidgets.QCompleter(cb.model(), cb) - completer.setCompletionMode(QtWidgets.QCompleter.PopupCompletion) - completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) - try: - completer.setFilterMode(QtCore.Qt.MatchContains) - except AttributeError: - pass - cb.setCompleter(completer) - diff --git a/quest/quest_gui.py b/quest/quest_gui.py deleted file mode 100644 index 744fe92..0000000 --- a/quest/quest_gui.py +++ /dev/null @@ -1,53 +0,0 @@ -import tempfile - -from qtpy import QtGui, QtWidgets -import lib -import lib.ui.rescource_rc -import sys -sys.tracebacklimit = 500 - -# After updating of icon run: -# pyrcc4 -o rescource_rc.py rescource.qrc -# encoding=utf8 - -def start_gui(): - - class Main(QtWidgets.QMainWindow): - """ Main window - The program is structured in a tree - self.rootNode -> n * Experiment -> setup -> datasets -> Fit -> Model - """ - - def __init__(self): - QtWidgets.QMainWindow.__init__(self) - dg = lib.tools.TransientDecayGenerator(tempfile.gettempdir()) - self.dg = dg - self.setCentralWidget(dg) - self._create_menus() - - def _create_menus(self): - mbar = self.menuBar() - file_menu = mbar.addMenu("&File") - - load_pdb_action = file_menu.addAction("Load PDB…") - load_pdb_action.triggered.connect(self.dg.onLoadPDB) - - file_menu.addSeparator() - save_project_action = file_menu.addAction("Save project…") - save_project_action.triggered.connect(self.dg.onSaveProject) - load_project_action = file_menu.addAction("Load project…") - load_project_action.triggered.connect(self.dg.onLoadProject) - - file_menu.addSeparator() - exit_action = file_menu.addAction("Exit") - exit_action.triggered.connect(self.close) - - - app = QtWidgets.QApplication(sys.argv) - win = Main() - win.show() - sys.exit(app.exec_()) - - -if __name__ == "__main__": - start_gui() diff --git a/tests/test_chisurf_autoform.py b/tests/test_chisurf_autoform.py new file mode 100644 index 0000000..65c38ca --- /dev/null +++ b/tests/test_chisurf_autoform.py @@ -0,0 +1,119 @@ +"""QuEst's forms are rendered by the host, from QuEst's own manifest. + +The dependency arrow for *presentation* points at ChiSurf: `AutoForm` renders a +control panel straight from an `rpc_methods` entry in `quest/manifest.json` — +the same declaration a host reads to learn what QuEst offers. That removes the +second description of every parameter (okf/specs/assessment.md, LAY-06). + +Runs in-process. That is safe only because `tests/conftest.py` imports ChiSurf +**before** anything touches IMP: both wrap C++ through SWIG, which keeps one +global type table, and loading IMP first aborted the process once the +numba-parallel kernels ran. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from quest.chisurf_host import autoform_available, chisurf_root + +pytestmark = pytest.mark.skipif( + not autoform_available(), + reason="needs a ChiSurf checkout (CHISURF_ROOT) and a Qt binding", +) + +REPO_ROOT = Path(__file__).resolve().parents[1] +MANIFEST = json.loads((REPO_ROOT / "quest" / "manifest.json").read_text(encoding="utf8")) +METHODS = {method["name"]: method for method in MANIFEST["rpc_methods"]} + + +@pytest.fixture(scope="module") +def app(): + from qtpy import QtWidgets + + yield QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) + + +def test_the_checkout_is_configured() -> None: + assert chisurf_root() is not None + + +@pytest.mark.parametrize("method_name", sorted(METHODS)) +def test_every_declared_method_renders(app, method_name: str) -> None: + """If a method cannot be rendered, its declaration is what is at fault.""" + from chisurf.gui.autoform.auto_form import AutoForm + + form = AutoForm.from_rpc_method(METHODS[method_name], title=method_name) + form.resize(520, 360) + try: + assert not form.grab().isNull() + finally: + form.close() + + +def test_the_form_exposes_the_declared_parameters(app) -> None: + from chisurf.gui.autoform.auto_form import AutoForm + + form = AutoForm.from_rpc_method(METHODS["quest.simulate"]) + try: + declared = set(METHODS["quest.simulate"]["params_schema"]["properties"]) + params = set(form.model.params()) + assert params <= declared, params - declared + # The required parameter must be reachable, not just the optional ones. + assert "project" in params + finally: + form.close() + + +def test_rendering_needs_no_quest_side_ui_code(app) -> None: + """The point: the manifest is the whole UI description for these forms.""" + from qtpy import QtWidgets + + from chisurf.gui.autoform.auto_form import AutoForm + + form = AutoForm.from_rpc_method(METHODS["quest.structure.metadata"]) + try: + assert isinstance(form, QtWidgets.QWidget) + finally: + form.close() + + +class TestQuestPanelHelper: + """`quest.gui.autoform_panel` is the seam the `.ui` files get replaced through.""" + + def test_it_lists_what_the_manifest_declares(self) -> None: + from quest.gui.autoform_panel import declared_methods + + assert set(declared_methods()) == set(METHODS) + + def test_an_undeclared_method_fails_loudly(self) -> None: + from quest.gui.autoform_panel import method_declaration + + with pytest.raises(KeyError): + method_declaration("quest.nope") + + def test_it_builds_a_bound_panel(self, app) -> None: + from quest.gui.autoform_panel import autoform_supported, build_method_panel + + assert autoform_supported() + panel = build_method_panel("quest.simulate") + try: + # The values come back shaped like the RPC params, so the panel and + # `simulate_handler` cannot drift apart. + assert "project" in panel.model.params() + assert not panel.grab().isNull() + finally: + panel.close() + + def test_every_declared_method_has_a_panel(self, app) -> None: + from quest.gui.autoform_panel import build_method_panel, declared_methods + + for name in declared_methods(): + panel = build_method_panel(name) + try: + assert panel is not None + finally: + panel.close() diff --git a/tests/test_form_model.py b/tests/test_form_model.py new file mode 100644 index 0000000..cf1aedc --- /dev/null +++ b/tests/test_form_model.py @@ -0,0 +1,252 @@ +"""One JSON state behind every surface. + +`ProjectFormModel` is what the Qt form binds to, and its state is a QuEst +*project* — the same document the CLI runs, the web backend posts and +`quest.api` validates. These tests run **without Qt**, which is the first thing +worth proving: the state of the desktop form is not trapped inside a widget. + +What they pin: + +- the field map covers exactly what the parameter catalog documents, so a new + parameter cannot reach the docs and the web UI while missing from the form; +- editing a field edits the project, with no conversion step in between (the + hand-written `to_project_dict`/`load_project_dict` pair is where the GUI + drifted away from the CLI before); +- what the form saves is what the other surfaces accept. +""" + +from __future__ import annotations + +import json + +import pytest + +from quest.gui.form_model import ( + FIELD_PATHS, + NON_SCALAR_PARAMETERS, + ProjectFormModel, +) +from quest.project import DEFAULT_FORSTER_RADIUS, template_project +from quest.settings import parameter_catalog + + +def test_the_model_needs_no_qt() -> None: + """The desktop form's state must not be trapped inside a widget. + + Checked in a subprocess: this suite runs in environments that have Qt and + other modules import it, so `sys.modules` in *this* process proves nothing. + """ + import subprocess + import sys + import textwrap + + probe = textwrap.dedent( + """ + import sys + from quest.gui.form_model import ProjectFormModel + model = ProjectFormModel() + model.tau0 = 1.0 + assert model.project["tau0"] == 1.0 + leaked = [n for n in sys.modules if n.split(".")[0] in + ("PyQt5", "PyQt6", "PySide2", "PySide6", "qtpy")] + assert not leaked, leaked + print("clean") + """ + ) + result = subprocess.run( + [sys.executable, "-c", probe], capture_output=True, text=True, timeout=180 + ) + assert result.returncode == 0, result.stderr[-2000:] + assert "clean" in result.stdout + + +class TestTheFieldMapMatchesTheCatalog: + """The catalog is the single description; the form must cover all of it.""" + + def test_every_documented_parameter_has_a_home(self) -> None: + documented = set(parameter_catalog()["parameters"]) + covered = set(FIELD_PATHS.values()) | set(NON_SCALAR_PARAMETERS) + missing = documented - covered + assert not missing, ( + f"documented but not in the form: {sorted(missing)} — add it to " + "FIELD_PATHS, or to NON_SCALAR_PARAMETERS if a table owns it" + ) + + def test_the_form_invents_nothing(self) -> None: + documented = set(parameter_catalog()["parameters"]) + invented = (set(FIELD_PATHS.values()) | set(NON_SCALAR_PARAMETERS)) - documented + assert not invented, ( + f"in the form but undocumented: {sorted(invented)} — a control with " + "no catalog entry has no help text and no docs" + ) + + def test_field_names_are_identifiers(self) -> None: + for attr in FIELD_PATHS: + assert attr.isidentifier(), attr + + def test_every_field_reads_back(self) -> None: + model = ProjectFormModel() + for attr in FIELD_PATHS: + getattr(model, attr) # must not raise + + +class TestEditingTheFormEditsTheProject: + def test_a_scalar(self) -> None: + model = ProjectFormModel() + model.tau0 = 3.25 + assert model.project["tau0"] == 3.25 + + def test_a_nested_path(self) -> None: + model = ProjectFormModel() + model.av_linker_length = 25.0 + assert model.project["av_parameter"]["linker_length"] == 25.0 + + def test_a_path_through_the_dye_list(self) -> None: + model = ProjectFormModel() + model.acceptor_chain = "B" + model.acceptor_D = 4.0 + acceptor = model.project["fret"]["dyes"][1] + assert acceptor["attachment"]["chain"] == "B" + assert acceptor["D"] == 4.0 + # Donor untouched: the two dyes are separate rows of the same list. + assert model.project["fret"]["dyes"][0]["attachment"]["chain"] == "A" + + def test_an_unknown_attribute_is_an_ordinary_one(self) -> None: + model = ProjectFormModel() + model.scratch = 7 + assert model.scratch == 7 + assert "scratch" not in model.project + + def test_the_caller_dict_is_not_aliased(self) -> None: + project = template_project() + model = ProjectFormModel(project) + model.tau0 = 99.0 + assert project["tau0"] != 99.0 + + +class TestTheForsterRadius: + def test_it_defaults_to_angstrom(self) -> None: + assert ProjectFormModel().fret_R0 == pytest.approx(DEFAULT_FORSTER_RADIUS) + + def test_setting_it_keeps_the_matrix_symmetric(self) -> None: + model = ProjectFormModel() + model.fret_R0 = 47.5 + assert model.project["fret"]["R0_matrix"] == [[None, 47.5], [47.5, None]] + + def test_a_missing_matrix_reads_as_the_default(self) -> None: + model = ProjectFormModel() + model.project["fret"]["R0_matrix"] = [[None, None], [None, None]] + assert model.fret_R0 == pytest.approx(DEFAULT_FORSTER_RADIUS) + + +class TestTheQuencherTable: + def test_it_lists_every_amino_acid(self) -> None: + model = ProjectFormModel() + rows = model.quencher_rows() + residues = {row["residue"] for row in rows} + assert set(model.project["amino_acid_interactions"]) == residues + assert len(rows) > 15 + + def test_atoms_render_as_text_and_parse_back(self) -> None: + model = ProjectFormModel() + rows = model.quencher_rows() + trp = next(i for i, row in enumerate(rows) if row["residue"] == "TRP") + assert ", " in rows[trp]["quench_atoms"] + + model.update_quencher_cell(trp, "quench_atoms", " NE1 , CZ2 ,") + assert model.project["amino_acid_interactions"]["TRP"]["quench_atoms"] == [ + "NE1", + "CZ2", + ] + + def test_an_out_of_range_row_is_ignored(self) -> None: + model = ProjectFormModel() + model.update_quencher_cell(9999, "kQ", "1.0") # must not raise + + def test_an_unknown_column_is_ignored(self) -> None: + model = ProjectFormModel() + before = json.dumps(model.project, sort_keys=True, default=str) + model.update_quencher_cell(0, "not_a_column", "1.0") + assert json.dumps(model.project, sort_keys=True, default=str) == before + + +class TestSurfacesShareTheState: + """The objective: one JSON, whichever surface wrote it.""" + + def test_the_saved_file_validates_as_a_project(self, tmp_path) -> None: + from quest.api import load_project, validate_project + + model = ProjectFormModel() + model.pdb = str(tmp_path / "structure.pdb") + (tmp_path / "structure.pdb").write_text("ATOM\n", encoding="utf8") + + path = model.save_project(tmp_path / "project.json") + validate_project(load_project(path)) + + def test_it_round_trips_through_a_file(self, tmp_path) -> None: + model = ProjectFormModel() + model.tau0 = 1.75 + model.acceptor_atom = "SG" + model.fret_R0 = 61.0 + path = model.save_project(tmp_path / "project.json") + + restored = ProjectFormModel() + restored.load_project(path) + assert restored.to_project_dict() == model.to_project_dict() + assert restored.tau0 == 1.75 + assert restored.fret_R0 == 61.0 + + def test_a_cli_written_project_loads_into_the_form(self, tmp_path) -> None: + """The other direction: what the CLI writes, the form must open.""" + project = template_project() + project["tau0"] = 5.5 + project["fret"]["enabled"] = False + path = tmp_path / "cli.json" + path.write_text(json.dumps(project), encoding="utf8") + + model = ProjectFormModel() + model.load_project(path) + assert model.tau0 == 5.5 + assert model.fret_enabled is False + + def test_the_web_backend_accepts_what_the_form_saves(self, tmp_path) -> None: + """End to end across surfaces, through the service layer's own methods.""" + pytest.importorskip("fastapi", reason="the web extra is not installed") + + from quest.backend.services import local_client + + structure = tmp_path / "structure.pdb" + structure.write_text("ATOM\n", encoding="utf8") + + model = ProjectFormModel() + model.pdb = str(structure) + model.tau0 = 2.25 + + client = local_client() + response = client.call("quest.validate", {"project": model.project}) + assert response["ok"] is True, response + + +class TestStatusAndResults: + def test_it_starts_with_no_results(self) -> None: + model = ProjectFormModel() + assert model.results is None + assert model.decay_series() == [] + assert model.trajectory_series() == [] + assert model.autocorrelation_series() == [] + assert "Not simulated" in model.status + + def test_listeners_fire_on_edit(self) -> None: + model = ProjectFormModel() + seen = [] + model.add_listener(lambda: seen.append(1)) + model.tau0 = 2.0 + model.fret_R0 = 50.0 + model.update_quencher_cell(0, "kQ", "0.5") + assert len(seen) == 3 + + def test_a_broken_listener_does_not_break_editing(self) -> None: + model = ProjectFormModel() + model.add_listener(lambda: 1 / 0) + model.tau0 = 2.0 # must not raise + assert model.tau0 == 2.0 diff --git a/tests/test_gui_simulation.py b/tests/test_gui_simulation.py new file mode 100644 index 0000000..2d33005 --- /dev/null +++ b/tests/test_gui_simulation.py @@ -0,0 +1,306 @@ +"""The Qt form must run a simulation and show the result. + +Characterisation tests for the form's ▶ button. They exist because the desktop +surface is the one that drifted: it used to hold its state in Qt controls and +convert it to a project by hand, and the conversion is where it diverged from +the CLI. Now the form's state *is* the project and the run goes through +`quest.api`, so what these check is that the whole path — controls to service +layer to plots — still carries the numbers. + +Qt and ChiSurf only; run in the canonical environment: + + QT_QPA_PLATFORM=offscreen \\ + /Users/tpeulen/mambaforge/envs/arm64/bin/python -m pytest tests/test_gui_simulation.py +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import numpy as np +import pytest + +pytest.importorskip("qtpy", reason="no Qt binding in this environment") +QtWidgets = pytest.importorskip("qtpy.QtWidgets", reason="no Qt binding") + +from quest.chisurf_host import autoform_available # noqa: E402 + +pytestmark = pytest.mark.skipif( + not autoform_available(), + reason="the Qt form is rendered by ChiSurf's AutoForm (set CHISURF_ROOT)", +) + +STRUCTURE = Path(__file__).parent / "148l.pdb" + + +@pytest.fixture(scope="module") +def app(): + yield QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) + + +#: A labeling site on 148l where the dye actually meets a quencher. Picked to +#: match `tests/test_simulation_performance.py::QUENCHED_SITES`: a site with no +#: quencher in reach returns QY = 1.0, and a decay test that passes on an +#: unquenched site is not testing quenching. Re-picked when radii moved to +#: IMP's — 15 and 90 have no accessible volume with the larger atoms. +QUENCHED_SITE = {"chain": "E", "residue": 118, "atom": "CB"} + + +def _configure(widget, *, t_max: float = 400.0, seed: int = 5) -> None: + """A small but non-degenerate run: enough frames to meet a quencher.""" + model = widget.model + model.pdb = str(STRUCTURE) + model.attachment_chain = QUENCHED_SITE["chain"] + model.attachment_residue = QUENCHED_SITE["residue"] + model.attachment_atom = QUENCHED_SITE["atom"] + model.t_max = t_max + model.t_step = 0.02 + model.n_photons = 100_000 + model.random_seed = seed + model.fret_enabled = False + + +@pytest.fixture(scope="module") +def simulated(app): + """A form driven through one small, seeded simulation.""" + from quest.gui import TransientDecayGenerator + + widget = TransientDecayGenerator() + _configure(widget) + assert widget.model.validate() == [], "the form built an invalid project" + widget.update_all() + yield widget + widget.close() + + +class TestTheFormRunsASimulation: + def test_it_produces_a_decay(self, simulated) -> None: + result = simulated.model.results + assert result is not None + assert np.asarray(result.donor_counts).sum() > 0 + assert len(result.time) == len(result.donor_counts) + + def test_the_quantum_yield_shows_quenching(self, simulated) -> None: + """Strictly below 1: the site was chosen so quenching happens.""" + quantum_yield = simulated.model.results.quantum_yield_donor + assert 0.0 < quantum_yield < 1.0, ( + f"QY = {quantum_yield}: no quenching at all, so this run proves " + "nothing about the quenching path" + ) + + def test_the_dye_visits_the_protein_surface(self, simulated) -> None: + assert 0.0 <= simulated.model.results.collisions_fraction <= 1.0 + + def test_a_trajectory_exists_and_moves(self, simulated) -> None: + distances = np.asarray(simulated.model.results.trajectory_distance_to_mean) + assert distances.shape[0] > 100 + assert distances.min() < distances.max() + + def test_the_accessible_volume_is_populated(self, simulated) -> None: + assert np.asarray(simulated.model.results.av_points).shape[0] > 100 + + def test_the_result_reaches_the_form(self, simulated) -> None: + """The point of a GUI: the numbers are shown, not merely computed.""" + status = simulated.model.status + assert "QY" in status and "τ" in status + assert f"{simulated.model.results.quantum_yield_donor:.3f}" in status + + def test_the_plots_are_filled(self, simulated) -> None: + decay = simulated.model.decay_series() + assert decay and len(decay[0]["y"]) > 0 + + trajectory = simulated.model.trajectory_series() + assert trajectory and len(trajectory[0]["y"]) > 100 + + autocorrelation = simulated.model.autocorrelation_series() + assert autocorrelation and len(autocorrelation[0]["y"]) > 0 + + def test_it_repaints_after_the_run(self, simulated) -> None: + simulated.resize(1400, 900) + assert not simulated.grab().isNull() + + +class TestWhatWasSimulatedIsWhatTheFormShows: + def test_the_project_is_the_ui_state(self, simulated) -> None: + project = simulated.to_project_dict() + assert project["t_max"] == pytest.approx(400.0) + assert project["t_step"] == pytest.approx(0.02) + assert project["n_photons"] == 100_000 + assert project["attachment"]["residue"] == QUENCHED_SITE["residue"] + + def test_the_result_carries_the_project_it_ran(self, simulated) -> None: + """`results.project` is the resolved project — not a different one.""" + ran = simulated.model.results.project + assert ran["attachment"]["residue"] == QUENCHED_SITE["residue"] + assert ran["t_max"] == pytest.approx(400.0) + + def test_a_gui_run_leaves_no_artefacts(self, simulated, tmp_path) -> None: + """`save_outputs=False`: the GUI must not litter `jobs/` where it started.""" + assert simulated.model.results.job_id is None or not ( + Path.cwd() / "jobs" / str(simulated.model.results.job_id) + ).exists() + + +class TestTheSavedFileIsAProject: + """One JSON for every surface — the GUI writes what the CLI reads.""" + + def test_it_saves_and_reloads(self, simulated, tmp_path) -> None: + path = simulated.model.save_project(tmp_path / "project.json") + written = json.loads(path.read_text(encoding="utf8")) + assert written["attachment"]["residue"] == QUENCHED_SITE["residue"] + + from quest.gui import TransientDecayGenerator + + other = TransientDecayGenerator() + try: + other.model.load_project(path) + assert other.to_project_dict() == simulated.to_project_dict() + finally: + other.close() + + def test_the_service_layer_accepts_it(self, simulated, tmp_path) -> None: + """The real check: what the form saved must validate as a project.""" + from quest.api import load_project, validate_project + + path = simulated.model.save_project(tmp_path / "project.json") + validate_project(load_project(path)) + + +class TestSeededRunsAreReproducible: + def test_two_runs_with_the_same_seed_agree(self, app) -> None: + from quest.gui import TransientDecayGenerator + + def run(): + widget = TransientDecayGenerator() + _configure(widget, t_max=200.0, seed=17) + widget.update_all() + result = widget.model.results + outcome = ( + result.quantum_yield_donor, + np.asarray(result.donor_counts).copy(), + ) + widget.close() + return outcome + + first_qy, first_decay = run() + second_qy, second_decay = run() + assert first_qy == pytest.approx(second_qy) + np.testing.assert_array_equal(first_decay, second_decay) + + +#: A donor/acceptor pair on 148l far enough apart that transfer is partial — +#: not ~0 (which would pass a "0 <= E <= 1" assertion while proving nothing) and +#: not ~1 (which would hide an R0 read in the wrong unit). +FRET_ACCEPTOR = {"chain": "E", "residue": 96, "atom": "CB"} + + +@pytest.fixture(scope="module") +def fret_simulated(app): + """The form driven through a FRET run, acceptor and all.""" + from quest.gui import TransientDecayGenerator + + widget = TransientDecayGenerator() + _configure(widget) + model = widget.model + model.acceptor_chain = FRET_ACCEPTOR["chain"] + model.acceptor_residue = FRET_ACCEPTOR["residue"] + model.acceptor_atom = FRET_ACCEPTOR["atom"] + model.fret_enabled = True + assert model.validate() == [], "the FRET form built an invalid project" + widget.update_all() + yield widget + widget.close() + + +class TestTheFormRunsFret: + """The desktop surface must reach FRET, not just the donor channel. + + The rebuilt form binds FRET through the same project keys as every other + surface, but "it should work" is what was said about the GUI's quenching + chemistry too. These run it. + """ + + def test_it_produces_both_decays(self, fret_simulated) -> None: + result = fret_simulated.model.results + assert result.fret_counts is not None, "no FRET channel was simulated" + assert np.asarray(result.fret_counts).sum() > 0 + assert len(result.fret_counts) == len(result.donor_counts) + + def test_the_efficiency_is_partial(self, fret_simulated) -> None: + """Strictly between 0 and 1: the site pair was chosen for that.""" + efficiency = fret_simulated.model.results.fret_efficiency + assert efficiency is not None + assert 0.05 < efficiency < 0.98, ( + f"E = {efficiency}: this pair should transfer partially, so this " + "value means the geometry or R0 is not reaching the simulation" + ) + + def test_the_acceptor_quenches_the_donor(self, fret_simulated) -> None: + """E is 1 − QY_DA/QY_D, so the FRET channel must be the darker one.""" + result = fret_simulated.model.results + assert result.quantum_yield_fret < result.quantum_yield_donor + derived = 1.0 - result.quantum_yield_fret / result.quantum_yield_donor + assert derived == pytest.approx(result.fret_efficiency, abs=1e-6) + + def test_r0_reaches_the_simulation_in_angstrom(self, app) -> None: + """A larger Förster radius must transfer more. Nanometres would not.""" + from quest.gui import TransientDecayGenerator + + def efficiency_at(r0: float) -> float: + widget = TransientDecayGenerator() + _configure(widget, t_max=200.0) + widget.model.acceptor_chain = FRET_ACCEPTOR["chain"] + widget.model.acceptor_residue = FRET_ACCEPTOR["residue"] + widget.model.acceptor_atom = FRET_ACCEPTOR["atom"] + widget.model.fret_enabled = True + widget.model.fret_R0 = r0 + widget.update_all() + value = widget.model.results.fret_efficiency + widget.close() + return value + + assert efficiency_at(65.0) > efficiency_at(40.0) + + def test_the_form_shows_the_efficiency(self, fret_simulated) -> None: + """A number computed but not displayed is not a result.""" + status = fret_simulated.model.status + assert "E =" in status + assert f"{fret_simulated.model.results.fret_efficiency:.3f}" in status + + def test_both_curves_reach_the_decay_plot(self, fret_simulated) -> None: + names = [series["name"] for series in fret_simulated.model.decay_series()] + assert len(names) == 2, names + assert all(len(series["y"]) > 0 for series in fret_simulated.model.decay_series()) + + def test_turning_fret_off_removes_the_channel(self, app) -> None: + """The toggle must actually gate it; a stale acceptor must not linger.""" + from quest.gui import TransientDecayGenerator + + widget = TransientDecayGenerator() + try: + _configure(widget, t_max=200.0) + widget.model.acceptor_chain = FRET_ACCEPTOR["chain"] + widget.model.acceptor_residue = FRET_ACCEPTOR["residue"] + widget.model.acceptor_atom = FRET_ACCEPTOR["atom"] + widget.model.fret_enabled = False + widget.update_all() + assert widget.model.results.fret_efficiency is None + assert len(widget.model.decay_series()) == 1 + finally: + widget.close() + + def test_a_fret_project_round_trips(self, fret_simulated, tmp_path) -> None: + """The acceptor and R0 must survive save/load like everything else.""" + from quest.api import load_project, validate_project + + path = fret_simulated.model.save_project(tmp_path / "fret.json") + restored = load_project(path) + validate_project(restored) + assert restored["fret"]["enabled"] is True + assert restored["fret"]["dyes"][1]["attachment"]["residue"] == ( + FRET_ACCEPTOR["residue"] + ) + assert restored["fret"]["R0_matrix"][0][1] == pytest.approx( + fret_simulated.model.fret_R0 + ) diff --git a/tests/test_gui_widget.py b/tests/test_gui_widget.py new file mode 100644 index 0000000..ba8c601 --- /dev/null +++ b/tests/test_gui_widget.py @@ -0,0 +1,199 @@ +"""The Qt form: rendered from the parameter catalog, bound to a project. + +These run only where a Qt binding *and* ChiSurf exist — QuEst's desktop surface +is rendered by the host's AutoForm, so there is nothing to test without it. The +default development interpreter has neither, so they skip there: + + QT_QPA_PLATFORM=offscreen \\ + /Users/tpeulen/mambaforge/envs/arm64/bin/python -m pytest tests/test_gui_widget.py + +Construction alone proves little, so these assert the things that have actually +gone wrong: the widget simulating different chemistry from every other surface, +a Förster radius silently in the wrong unit, and a parameter existing in the +model but reachable nowhere in the UI. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +pytest.importorskip("qtpy", reason="no Qt binding in this environment") +QtWidgets = pytest.importorskip("qtpy.QtWidgets", reason="no Qt binding") + +from quest.chisurf_host import autoform_available # noqa: E402 +from quest.core.dye_diffusion import ( # noqa: E402 + DEFAULT_QUENCHER_ATOMS, + REFERENCE_PET_QUENCHING, +) +from quest.gui.form_model import FIELD_PATHS # noqa: E402 +from quest.project import DEFAULT_FORSTER_RADIUS, template_project # noqa: E402 + +pytestmark = pytest.mark.skipif( + not autoform_available(), + reason="the Qt form is rendered by ChiSurf's AutoForm (set CHISURF_ROOT)", +) + + +@pytest.fixture(scope="module") +def app(): + yield QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) + + +@pytest.fixture +def widget(app): + from quest.gui import TransientDecayGenerator + + generator = TransientDecayGenerator() + yield generator + generator.close() + + +class TestTheFormIsGenerated: + """LAY-06: the layout is data, not a hand-built widget tree.""" + + def test_it_renders(self, widget) -> None: + assert widget.form is not None, "AutoForm did not build the form" + widget.resize(1400, 900) + pixmap = widget.grab() + assert not pixmap.isNull() + assert pixmap.width() > 800 and pixmap.height() > 500 + + def test_no_ui_files_remain(self) -> None: + """The whole point of the migration; a new `.ui` is a regression.""" + gui = Path(__file__).resolve().parents[1] / "quest" / "gui" + assert not list(gui.rglob("*.ui")), "a .ui file came back" + + def test_the_widget_is_not_the_model(self) -> None: + """LAY-02: presentation holds a domain object, it does not *be* one.""" + from quest.core.dye_diffusion import DonorDecay + from quest.gui import TransientDecayGenerator + + assert DonorDecay not in TransientDecayGenerator.__mro__ + + def test_the_model_is_headless(self, widget) -> None: + """What the split buys: the state runs with no widget attached.""" + assert not isinstance(widget.model, QtWidgets.QWidget) + + +class TestTheStateIsTheProject: + """No conversion step means no place for the GUI to drift from the CLI.""" + + def test_every_declared_field_is_readable(self, widget) -> None: + for attr in FIELD_PATHS: + assert hasattr(widget.model, attr), f"{attr} is declared but unreadable" + + def test_editing_a_field_edits_the_project(self, widget) -> None: + widget.model.tau0 = 3.14 + assert widget.to_project_dict()["tau0"] == 3.14 + + widget.model.acceptor_residue = 42 + acceptor = widget.to_project_dict()["fret"]["dyes"][1] + assert acceptor["attachment"]["residue"] == 42 + + def test_loading_a_project_redraws_the_form(self, widget) -> None: + project = template_project() + project["tau0"] = 2.5 + project["n_photons"] = 1234 + widget.load_project_dict(project) + + assert widget.model.tau0 == 2.5 + assert widget.model.n_photons == 1234 + # The controls must show it, not merely the dict hold it. + assert not widget.grab().isNull() + + def test_a_loaded_project_is_not_aliased(self, widget) -> None: + project = template_project() + widget.load_project_dict(project) + widget.model.tau0 = 9.9 + assert project["tau0"] != 9.9, "editing the form mutated the caller's dict" + + +class TestQuenchingChemistry: + """The GUI must simulate what the CLI, API and web UI simulate.""" + + def test_quenchers_sit_on_the_redox_active_moiety(self, widget) -> None: + interactions = widget.to_project_dict()["amino_acid_interactions"] + for residue in REFERENCE_PET_QUENCHING: + assert interactions[residue]["quench_atoms"] == list( + DEFAULT_QUENCHER_ATOMS[residue] + ), residue + # The specific regression: MET's quencher is the thioether sulfur and + # TRP's is the indole ring — not CB, as the old settings file said. + assert interactions["MET"]["quench_atoms"] == ["SD"] + assert "NE1" in interactions["TRP"]["quench_atoms"] + + def test_each_residue_carries_its_own_rate(self, widget) -> None: + interactions = widget.to_project_dict()["amino_acid_interactions"] + rates = {r: interactions[r]["kQ"] for r in REFERENCE_PET_QUENCHING} + assert rates == { + residue: reference["kQ"] + for residue, reference in REFERENCE_PET_QUENCHING.items() + } + # Not one global rate for everything, which is what 2.0 everywhere was. + assert len(set(rates.values())) > 1 + + def test_contact_radius_matches_the_project_default(self, widget) -> None: + assert widget.model.critical_distance == pytest.approx(8.5) + + def test_the_table_edits_the_chemistry(self, widget) -> None: + rows = widget.model.quencher_rows() + trp = next(i for i, row in enumerate(rows) if row["residue"] == "TRP") + + widget.model.update_quencher_cell(trp, "kQ", "9.5") + interactions = widget.to_project_dict()["amino_acid_interactions"] + assert interactions["TRP"]["kQ"] == 9.5 + + widget.model.update_quencher_cell(trp, "quench_atoms", "NE1, CZ2") + assert widget.to_project_dict()["amino_acid_interactions"]["TRP"][ + "quench_atoms" + ] == ["NE1", "CZ2"] + + # A blank radius means "fall back to critical_distance" — null, not + # zero, which would switch quenching off entirely. + widget.model.update_quencher_cell(trp, "quench_radius", "") + assert ( + widget.to_project_dict()["amino_acid_interactions"]["TRP"]["quench_radius"] + is None + ) + + # Garbage is dropped rather than raised out of a cell editor mid-typing. + widget.model.update_quencher_cell(trp, "kQ", "not a number") + assert widget.to_project_dict()["amino_acid_interactions"]["TRP"]["kQ"] == 9.5 + + +class TestForsterRadius: + def test_it_is_angstrom(self, widget) -> None: + """A nanometre R0 makes FRET vanish silently; it happened once.""" + assert widget.model.fret_R0 == pytest.approx(DEFAULT_FORSTER_RADIUS) + assert widget.model.fret_R0 > 10, "an R0 that small is nm, not Å" + + def test_it_round_trips_as_a_symmetric_matrix(self, widget) -> None: + widget.model.fret_R0 = 58.0 + matrix = widget.to_project_dict()["fret"]["R0_matrix"] + assert matrix == [[None, 58.0], [58.0, None]] + + def test_the_control_accepts_the_angstrom_range(self) -> None: + """The spin box must not clamp R0 into a nanometre-sized range.""" + from quest.gui.generate_view_spec import build_view_spec + + def find(sections): + for section in sections: + if section.get("attr") == "fret_R0": + return section + found = find(section.get("sections", [])) + if found: + return found + return None + + field = find(build_view_spec()["sections"]) + assert field is not None, "R0 has no control" + assert field["minimum"] <= 20.0 and field["maximum"] >= 80.0 + + +class TestHostIntegration: + def test_the_menu_actions_exist(self, widget) -> None: + """ChiSurf's quenching_estimator plugin connects its File menu to these.""" + for slot in ("onLoadPDB", "onSaveProject", "onLoadProject", "update_all"): + assert callable(getattr(widget, slot)) diff --git a/tests/test_view_spec.py b/tests/test_view_spec.py new file mode 100644 index 0000000..052653e --- /dev/null +++ b/tests/test_view_spec.py @@ -0,0 +1,180 @@ +"""`quest.view.json` is generated, and must stay that way. + +The form's layout is derived from `quest/settings/parameter_catalog.json` by +`quest/gui/generate_view_spec.py`, exactly as `doc/parameters.md` is. The +generated file is committed so it can be read and diffed — which only helps if +it actually matches the generator, so this regenerates it in memory and +compares. + +Runs without Qt: a view spec is data. +""" + +from __future__ import annotations + +import json + +import pytest + +from quest.i18n import DEFAULT_LOCALE, available_locales, ui_strings +from quest.gui.form_model import FIELD_PATHS +from quest.gui.generate_view_spec import ( + VIEW_SPEC_PATH, + build_view_spec, + view_spec_path, + write_view_spec, +) + +LOCALES = sorted(available_locales()) + + +@pytest.fixture(scope="module") +def spec() -> dict: + return build_view_spec() + + +def _walk(sections): + for section in sections: + yield section + yield from _walk(section.get("sections", [])) + + +@pytest.mark.parametrize("locale", LOCALES) +def test_the_committed_file_is_up_to_date(locale: str) -> None: + path = view_spec_path(locale) + assert path.is_file(), f"no view spec for {locale}" + committed = json.loads(path.read_text(encoding="utf8")) + assert committed == build_view_spec(locale), ( + f"{path.name} is stale — run `python -m quest.gui.generate_view_spec` " + "(and never hand-edit it; edit the catalog or the locale file)" + ) + + +def test_regenerating_is_idempotent(tmp_path) -> None: + first = write_view_spec(tmp_path / "a.json").read_text(encoding="utf8") + second = write_view_spec(tmp_path / "b.json").read_text(encoding="utf8") + assert first == second + + +class TestEveryLanguageGetsTheSameForm: + """Translation changes the words. It must not change the form.""" + + @pytest.mark.parametrize("locale", LOCALES) + def test_the_bound_fields_are_identical(self, locale: str) -> None: + english = {s["attr"] for s in _walk(build_view_spec()["sections"]) if s.get("attr")} + other = { + s["attr"] for s in _walk(build_view_spec(locale)["sections"]) if s.get("attr") + } + assert english == other + + @pytest.mark.parametrize("locale", LOCALES) + def test_the_section_types_are_identical(self, locale: str) -> None: + def shape(spec): + return [s.get("type") for s in _walk(spec["sections"])] + + assert shape(build_view_spec(locale)) == shape(build_view_spec()) + + @pytest.mark.parametrize("locale", LOCALES) + def test_numeric_bounds_are_identical(self, locale: str) -> None: + """A German spin box must not accept a different range.""" + def bounds(spec): + return { + s["attr"]: (s.get("minimum"), s.get("maximum")) + for s in _walk(spec["sections"]) + if s.get("attr") + } + + assert bounds(build_view_spec(locale)) == bounds(build_view_spec()) + + @pytest.mark.parametrize("locale", [c for c in LOCALES if c != DEFAULT_LOCALE]) + def test_the_visible_text_actually_changed(self, locale: str) -> None: + """Otherwise the whole thing silently renders in English.""" + spec = build_view_spec(locale) + labels = [s.get("label") for s in _walk(spec["sections"]) if s.get("label")] + english = [s.get("label") for s in _walk(build_view_spec()["sections"]) if s.get("label")] + differing = sum(1 for a, b in zip(labels, english) if a != b) + assert differing > len(labels) // 2, f"{locale} looks untranslated" + + @pytest.mark.parametrize("locale", LOCALES) + def test_it_records_which_language_it_is(self, locale: str) -> None: + assert build_view_spec(locale)["locale"] == locale + + @pytest.mark.parametrize("locale", LOCALES) + def test_the_help_text_is_the_locale_s(self, locale: str) -> None: + spec = build_view_spec(locale) + help_section = next(s for s in _walk(spec["sections"]) if s.get("key") == "help") + assert help_section["options"]["text"] == ui_strings(locale)["help.text"] + + +def test_it_says_it_is_generated() -> None: + committed = json.loads(VIEW_SPEC_PATH.read_text(encoding="utf8")) + assert "GENERATED" in committed["_comment"] + + +class TestEveryControlIsBound: + def test_each_field_binds_to_a_real_model_attribute(self, spec) -> None: + from quest.gui.form_model import ProjectFormModel + + model = ProjectFormModel() + for section in _walk(spec["sections"]): + attr = section.get("attr") + if attr: + assert hasattr(model, attr), f"{attr} is bound but does not exist" + + def test_each_scalar_field_appears_exactly_once(self, spec) -> None: + """Two controls for one value disagree the moment one is edited.""" + bound = [s["attr"] for s in _walk(spec["sections"]) if s.get("attr")] + duplicates = {a for a in bound if bound.count(a) > 1} + assert not duplicates, duplicates + + def test_every_declared_field_is_on_the_form(self, spec) -> None: + bound = {s["attr"] for s in _walk(spec["sections"]) if s.get("attr")} + # `status` and `fret_R0` are bound too, hence the subset direction. + missing = set(FIELD_PATHS) - bound + assert not missing, f"declared but not shown anywhere: {sorted(missing)}" + + def test_actions_and_sources_resolve(self, spec) -> None: + from quest.gui.form_model import ProjectFormModel + + model = ProjectFormModel() + for section in _walk(spec["sections"]): + for key in ("source", "update_call"): + name = section.get(key) + if name: + assert callable(getattr(model, name, None)), name + for button in section.get("buttons", ()): + assert callable(getattr(model, button["action"], None)), button + + +class TestItIsUsable: + def test_every_field_has_help_text(self, spec) -> None: + """The catalog's description is the tooltip; a blank one is a gap.""" + for section in _walk(spec["sections"]): + if section.get("attr"): + assert section.get("description"), section["attr"] + + def test_units_are_in_the_labels(self, spec) -> None: + labels = { + s["attr"]: s.get("label", "") + for s in _walk(spec["sections"]) + if s.get("attr") + } + # The Förster radius is the one that has actually been wrong; a label + # without its unit is how 5.5 nm got read as 5.5 Å. + assert "Å" in labels["fret_R0"] + assert "ns" in labels["tau0"] + + def test_the_toolbar_can_run_save_and_load(self, spec) -> None: + actions = { + button["action"] + for section in _walk(spec["sections"]) + for button in section.get("buttons", ()) + } + assert {"run_simulation", "save_project_dialog", "load_project_dialog"} <= actions + + def test_the_results_panel_plots_what_a_run_produces(self, spec) -> None: + sources = {s["source"] for s in _walk(spec["sections"]) if s.get("type") == "plot"} + assert sources == { + "decay_series", + "trajectory_series", + "autocorrelation_series", + } From f34e9a2c6390af4304bc4300774994e8f554b155 Mon Sep 17 00:00:00 2001 From: Thomas-Otavio Peulen Date: Mon, 27 Jul 2026 19:01:20 +0200 Subject: [PATCH 08/86] webui: add the FastAPI backend, Next.js frontend and desktop shell A browser surface over the same service layer as the CLI and the GUI: FastAPI in webui/backend calls the registered methods and serves the parameter catalog, so labels, tooltips and translations come from the catalog rather than being written a second time in TypeScript. The frontend covers simulation, labelling, scanning and an advanced view, with an NGL structure viewer. NGL is vendored under public/vendor rather than pulled from a CDN so the desktop bundle works offline. webui/desktop wraps the two in Electron and prepares a Python environment for them. Two things that cost time and are easy to hit again: uvicorn does not reload, so it must be restarted before a browser run - and since locale files are cached per process, editing one has no effect until it is. The frontend needs Node >= 20; Next refuses to start on 18. The browser suite is marked and deselected by default. Chromium's renderer dies once a single pytest process has also imported IMP, numba and FastAPI and executed the notebooks; the suite passes on its own and fails at the end of a combined run, so it gets its own process. Deselecting says that out loud, where silently skipping would not. --- tests/test_webui_e2e.py | 445 ++++ webui/__init__.py | 2 + webui/backend/__init__.py | 2 + webui/backend/app/__init__.py | 2 + webui/backend/app/main.py | 389 +++ webui/backend/requirements.txt | 6 + webui/backend/tests/test_backend_api.py | 369 +++ webui/desktop/.gitignore | 4 + webui/desktop/package.json | 52 + webui/desktop/scripts/prepare-python-env.mjs | 3 + webui/desktop/src/main.cjs | 273 ++ webui/frontend/.gitignore | 5 + webui/frontend/next-env.d.ts | 6 + webui/frontend/next.config.ts | 22 + webui/frontend/package-lock.json | 1039 ++++++++ webui/frontend/package.json | 26 + webui/frontend/postbuild.mjs | 23 + webui/frontend/public/favicon.ico | Bin 0 -> 3180 bytes webui/frontend/public/logo.png | Bin 0 -> 685331 bytes webui/frontend/public/vendor/ngl.js | 88 + webui/frontend/src/app/advanced/page.tsx | 145 ++ webui/frontend/src/app/favicon.ico | Bin 0 -> 3180 bytes webui/frontend/src/app/globals.css | 2294 +++++++++++++++++ webui/frontend/src/app/icon.png | Bin 0 -> 197753 bytes webui/frontend/src/app/labeling/page.tsx | 26 + webui/frontend/src/app/layout.tsx | 26 + webui/frontend/src/app/page.tsx | 6 + webui/frontend/src/app/scan/page.tsx | 389 +++ webui/frontend/src/app/simulation/page.tsx | 75 + webui/frontend/src/components/AppLayout.tsx | 993 +++++++ webui/frontend/src/components/Field.tsx | 76 + webui/frontend/src/components/HelpBadge.tsx | 78 + webui/frontend/src/components/Plots.tsx | 388 +++ .../frontend/src/components/ProteinViewer.tsx | 790 ++++++ .../src/components/QuenchingEditor.tsx | 303 +++ webui/frontend/src/context/AppContext.tsx | 1100 ++++++++ webui/frontend/src/types/index.ts | 175 ++ webui/frontend/tsconfig.json | 36 + 38 files changed, 9656 insertions(+) create mode 100644 tests/test_webui_e2e.py create mode 100644 webui/__init__.py create mode 100644 webui/backend/__init__.py create mode 100644 webui/backend/app/__init__.py create mode 100644 webui/backend/app/main.py create mode 100644 webui/backend/requirements.txt create mode 100644 webui/backend/tests/test_backend_api.py create mode 100644 webui/desktop/.gitignore create mode 100644 webui/desktop/package.json create mode 100644 webui/desktop/scripts/prepare-python-env.mjs create mode 100644 webui/desktop/src/main.cjs create mode 100644 webui/frontend/.gitignore create mode 100644 webui/frontend/next-env.d.ts create mode 100644 webui/frontend/next.config.ts create mode 100644 webui/frontend/package-lock.json create mode 100644 webui/frontend/package.json create mode 100644 webui/frontend/postbuild.mjs create mode 100644 webui/frontend/public/favicon.ico create mode 100644 webui/frontend/public/logo.png create mode 100644 webui/frontend/public/vendor/ngl.js create mode 100644 webui/frontend/src/app/advanced/page.tsx create mode 100644 webui/frontend/src/app/favicon.ico create mode 100644 webui/frontend/src/app/globals.css create mode 100644 webui/frontend/src/app/icon.png create mode 100644 webui/frontend/src/app/labeling/page.tsx create mode 100644 webui/frontend/src/app/layout.tsx create mode 100644 webui/frontend/src/app/page.tsx create mode 100644 webui/frontend/src/app/scan/page.tsx create mode 100644 webui/frontend/src/app/simulation/page.tsx create mode 100644 webui/frontend/src/components/AppLayout.tsx create mode 100644 webui/frontend/src/components/Field.tsx create mode 100644 webui/frontend/src/components/HelpBadge.tsx create mode 100644 webui/frontend/src/components/Plots.tsx create mode 100644 webui/frontend/src/components/ProteinViewer.tsx create mode 100644 webui/frontend/src/components/QuenchingEditor.tsx create mode 100644 webui/frontend/src/context/AppContext.tsx create mode 100644 webui/frontend/src/types/index.ts create mode 100644 webui/frontend/tsconfig.json diff --git a/tests/test_webui_e2e.py b/tests/test_webui_e2e.py new file mode 100644 index 0000000..11c28a5 --- /dev/null +++ b/tests/test_webui_e2e.py @@ -0,0 +1,445 @@ +"""End-to-end tests that drive the QuEst web UI in a headless browser. + +These tests are skipped unless both servers are reachable: + + python -m uvicorn webui.backend.app.main:app --port 8000 + pixi run -e frontend dev + +Point them elsewhere with QUEST_E2E_BASE_URL / QUEST_E2E_API_URL. +""" + +from __future__ import annotations + +import json +import os +from pathlib import Path + +import pytest + +pytest.importorskip("playwright.sync_api", reason="playwright is not installed") + +from playwright.sync_api import Page, expect, sync_playwright # noqa: E402 + +BASE_URL = os.getenv("QUEST_E2E_BASE_URL", "http://127.0.0.1:3000").rstrip("/") +API_URL = os.getenv("QUEST_E2E_API_URL", "http://127.0.0.1:8000").rstrip("/") +PDB_PATH = Path(__file__).parent / "148l.pdb" + + +def _server_is_up(url: str) -> bool: + import urllib.error + import urllib.request + + try: + with urllib.request.urlopen(url, timeout=3) as response: + return response.status < 500 + except (urllib.error.URLError, OSError): + return False + + +pytestmark = [ + # Deselected by default; run with `pixi run test-e2e` or `-m browser`. + pytest.mark.browser, + pytest.mark.skipif( + not (_server_is_up(f"{API_URL}/health") and _server_is_up(BASE_URL)), + reason="QuEst web UI is not running (start the backend and frontend first)", + ), +] + + +@pytest.fixture(scope="module") +def browser(): + with sync_playwright() as playwright: + # `--disable-dev-shm-usage`: Chromium keeps renderer shared memory in + # /dev/shm, which is small and is already under pressure by the time the + # rest of the suite has run — the page then dies with a bare + # "Page crashed". Reproducible: this file passes alone and fails after + # `test_pdb_id_support.py`, which spins up a FastAPI TestClient first. + # The flag moves that allocation to a normal temp file. + instance = playwright.chromium.launch( + args=["--disable-dev-shm-usage", "--no-sandbox"] + ) + yield instance + instance.close() + + +@pytest.fixture +def page(browser): + context = browser.new_context(viewport={"width": 1440, "height": 900}) + page = context.new_page() + errors: list[str] = [] + + def _record_console(message) -> None: + if message.type != "console" and message.type == "error": + location = message.location or {} + where = f"{location.get('url', '?')}:{location.get('lineNumber', '?')}" + errors.append(f"{message.text} [{where}]") + + page.on("pageerror", lambda exc: errors.append(f"{exc} [pageerror] {(getattr(exc, 'stack', '') or '')[:900]}")) + page.on("console", _record_console) + page.errors = errors # type: ignore[attr-defined] + yield page + context.close() + + +def _load(page: Page, path: str) -> Page: + page.goto(f"{BASE_URL}{path}", wait_until="networkidle") + return page + + +def _upload_structure(page: Page) -> None: + page.set_input_files('input[type="file"]', str(PDB_PATH)) + # Scope to the header: the scan sidebar renders a second `.status` element. + expect(page.locator(".topbar .status")).to_contain_text("atoms", timeout=60_000) + + +def _ignorable(message: str) -> bool: + lowered = message.lower() + return any( + token in lowered + for token in ("favicon", "webgl", "download the react devtools", "hydration") + ) + + +class TestPagesLoad: + @pytest.mark.parametrize("path", ["/labeling", "/simulation", "/scan", "/advanced"]) + def test_page_renders_without_console_errors(self, page: Page, path: str) -> None: + _load(page, path) + expect(page.locator("header.topbar h1")).to_have_text("Quenching Estimator") + real_errors = [message for message in page.errors if not _ignorable(message)] + assert not real_errors, f"console errors on {path}: {real_errors}" + + def test_root_redirects_to_labeling(self, page: Page) -> None: + _load(page, "/") + expect(page.locator(".tab-btn.active")).to_contain_text("Labeling") + + def test_no_horizontal_overflow(self, page: Page) -> None: + _load(page, "/advanced") + overflow = page.evaluate( + "() => document.documentElement.scrollWidth - document.documentElement.clientWidth" + ) + assert overflow <= 1, f"page scrolls horizontally by {overflow}px" + + +class TestQuenchingEditor: + def test_shows_pet_active_residues_with_chemistry(self, page: Page) -> None: + _load(page, "/advanced") + table = page.locator(".quench-table") + expect(table).to_be_visible() + + # The PET-active filter is on by default and must list the quenchers. + for residue in ("TRP", "TYR", "MET", "HIS", "CYS"): + expect(table.locator("tbody th", has_text=residue)).to_have_count(1) + + trp_row = table.locator("tbody tr", has=page.locator("th", has_text="TRP")).first + expect(trp_row).to_contain_text("indole ring") + + def test_all_20_residues_available(self, page: Page) -> None: + _load(page, "/advanced") + page.get_by_role("button", name="All 20").click() + expect(page.locator(".quench-table tbody tr")).to_have_count(20) + + def test_editing_kq_updates_the_project(self, page: Page) -> None: + _load(page, "/advanced") + trp_row = page.locator(".quench-table tbody tr").filter(has_text="Tryptophan").first + kq_input = trp_row.get_by_label("TRP quenching rate") + kq_input.fill("7.25") + kq_input.blur() + expect(page.locator(".quench-summary-list")).to_contain_text("7.25") + + def test_quench_atoms_are_editable_and_restorable(self, page: Page) -> None: + _load(page, "/advanced") + trp_row = page.locator(".quench-table tbody tr").filter(has_text="Tryptophan").first + trp_row.locator(".atom-summary").click() + + editor = page.locator(".quench-atom-editor input") + expect(editor).to_have_value("CD2 CE2 CE3 CZ2 CZ3 CH2 NE1 CG CD1") + + editor.fill("CB") + editor.blur() + expect(page.locator(".pill-warn")).to_have_count(1) + + page.get_by_role("button", name="Restore default atoms").click() + expect(page.locator(".pill-warn")).to_have_count(0) + + def test_clear_and_reset_quenching(self, page: Page) -> None: + _load(page, "/advanced") + page.get_by_role("button", name="Clear quenching").click() + expect(page.locator(".quench-summary-list li")).to_have_count(0) + + page.get_by_role("button", name="Reset to reference").click() + expect(page.locator(".quench-summary-list li")).to_have_count(6) + expect(page.locator(".quench-editor-stats")).to_contain_text("6 quenching residue types") + + +class TestSimulationWorkflow: + def test_upload_simulate_and_read_results(self, page: Page) -> None: + _load(page, "/labeling") + _upload_structure(page) + + # The largest chain must be selected by default, not the 2-residue + # ligand chain that happens to sort first in this file. + chain_select = page.locator("label.field").filter(has_text="Chain").locator("select") + expect(chain_select).to_have_value("E") + + # Pick a site next to the aromatic cluster so quenching is measurable. + residue_select = page.locator("label.field").filter(has_text="Residue").locator("select") + residue_select.select_option(value="155", timeout=15_000) + + page.get_by_role("button", name="Run Sim").click() + expect(page.locator(".topbar .status.ok")).to_contain_text("Simulation complete", timeout=300_000) + + page.get_by_role("link", name="2 - Simulation").click() + + # The decay must be drawn with real axes. + expect(page.locator("svg.chart").first).to_be_visible() + expect(page.locator("text=time [ns]").first).to_be_visible() + + # Derived quantities are populated. + metrics = page.locator(".metrics") + expect(metrics).to_contain_text("Donor QY") + assert metrics.inner_text().count("-\n") < 7 + + # Quenching is attributed to residue types. + breakdown = page.locator(".quench-breakdown") + expect(breakdown).to_be_visible() + expect(breakdown.locator(".quench-bar-row").first).to_contain_text("%") + + shares = [ + float(value.strip().rstrip("%")) + for value in breakdown.locator(".quench-bar-value").all_inner_texts() + ] + assert shares, "expected at least one quenching residue type" + assert abs(sum(shares) - 100.0) < 1.0, f"quench shares should sum to 100%, got {shares}" + + # The per-residue table carries the same chemistry, and only residues + # with a redox-active side chain contribute. + table = page.locator(".scan-results-table") + expect(table.locator("thead")).to_contain_text("Quench share") + quenching_rows = table.locator("tbody tr.is-quenching") + assert quenching_rows.count() == len(shares) + for residue in ("ALA", "LEU", "VAL"): + row = table.locator("tbody tr", has=page.locator("th", has_text=residue)).first + assert "is-quenching" not in (row.get_attribute("class") or "") + + real_errors = [message for message in page.errors if not _ignorable(message)] + assert not real_errors, f"console errors during simulation: {real_errors}" + + +class TestScanWorkflow: + """The scan is where labeling sites get chosen, so it must name the quencher.""" + + def _scan_a_few_sites(self, page: Page, indices=(10, 100, 150)) -> None: + _load(page, "/scan") + _upload_structure(page) + + page.locator("label.check-field input").first.uncheck() + expect(page.locator(".scan-residue-item").first).to_be_visible() + page.get_by_role("button", name="Select None").click() + + checkboxes = page.locator(".scan-residue-item input") + for index in indices: + checkboxes.nth(index).check() + + page.get_by_role("button", name="Calculate Scan").click() + expect(page.locator(".control-panel .status.ok")).to_contain_text( + "Successfully scanned", timeout=600_000 + ) + + def test_scan_reports_the_dominant_quencher(self, page: Page) -> None: + self._scan_a_few_sites(page) + + table = page.locator(".scan-results-table") + expect(table.locator("thead")).to_contain_text("Quenched by") + + rows = table.locator("tbody tr") + assert rows.count() == 3 + + # At least one site must be quenched, and by a PET-active residue. + quencher_codes = page.locator(".quencher-cell .residue-code").all_inner_texts() + assert quencher_codes, "no site reported a quenching residue type" + for code in quencher_codes: + assert code in {"TRP", "TYR", "MET", "HIS", "CYS", "PRO"}, code + + real_errors = [message for message in page.errors if not _ignorable(message)] + assert not real_errors, f"console errors during scan: {real_errors}" + + def test_quencher_column_filters(self, page: Page) -> None: + self._scan_a_few_sites(page) + + rows = page.locator(".scan-results-table tbody tr") + before = rows.count() + page.locator(".column-filter-input").last.fill("ZZZ") + expect(rows).to_have_count(0) + + page.locator(".column-filter-input").last.fill("") + expect(rows).to_have_count(before) + + +class TestFretPanel: + """FRET has to be reachable from the browser, R0 included. + + Before this panel existed the web UI could plot a FRET curve but could not + switch FRET on or set a Förster radius, so a browser project always fell + back to the 52 A code default. + """ + + def _enable_fret(self, page: Page) -> None: + _load(page, "/labeling") + _upload_structure(page) + page.get_by_label("Simulate FRET acceptor").check() + + def test_fret_is_off_until_asked_for(self, page: Page) -> None: + _load(page, "/labeling") + checkbox = page.get_by_label("Simulate FRET acceptor") + expect(checkbox).not_to_be_checked() + # The acceptor controls stay hidden while it is off. + expect(page.locator("label.field").filter(has_text="Acceptor chain")).to_have_count(0) + + def test_enabling_fret_reveals_the_acceptor_site_and_r0(self, page: Page) -> None: + self._enable_fret(page) + + for label in ("Acceptor chain", "Acceptor residue", "Acceptor atom"): + expect(page.locator("label.field").filter(has_text=label)).to_have_count(1) + + r0_field = page.locator("label.field").filter(has_text="R0").locator("input") + expect(r0_field).to_have_value("52") + + def test_the_acceptor_is_seeded_on_the_loaded_structure(self, page: Page) -> None: + """Enabling FRET must produce a project that validates, not residue 1 of nothing.""" + self._enable_fret(page) + + chain = page.locator("label.field").filter(has_text="Acceptor chain").locator("select") + expect(chain).to_have_value("E") + residue = page.locator("label.field").filter(has_text="Acceptor residue").locator("select") + assert residue.input_value() not in ("", "0") + atom = page.locator("label.field").filter(has_text="Acceptor atom").locator("select") + assert atom.input_value() != "" + + def test_the_acceptor_is_not_seeded_on_a_water(self, page: Page) -> None: + """148L ends in HOH residues; a dye cannot be tethered to one.""" + self._enable_fret(page) + + residue = page.locator("label.field").filter(has_text="Acceptor residue").locator("select") + label = residue.locator(f'option[value="{residue.input_value()}"]').inner_text() + assert "HOH" not in label, f"acceptor seeded on a water: {label}" + + atom = page.locator("label.field").filter(has_text="Acceptor atom").locator("select") + assert atom.input_value() == "CB", atom.input_value() + + def test_r0_reaches_the_project_in_angstrom(self, page: Page) -> None: + self._enable_fret(page) + + r0_field = page.locator("label.field").filter(has_text="R0").locator("input") + r0_field.fill("61") + r0_field.blur() + + # The JSON-mode input is a styled switch: the real checkbox is hidden, + # so drive it through its label like a user does. + page.locator(".toggle-switch .switch").click() + project = json.loads(page.locator(".json-panel textarea").input_value()) + + assert project["fret"]["enabled"] is True + # Symmetric matrix, donor->acceptor cell carries R0, diagonal empty. + assert project["fret"]["R0_matrix"] == [[None, 61.0], [61.0, None]] + assert len(project["fret"]["dyes"]) == 2 + + real_errors = [message for message in page.errors if not _ignorable(message)] + assert not real_errors, f"console errors enabling FRET: {real_errors}" + + +class TestFretSimulation: + """The point of the panel: a FRET run the browser can actually produce.""" + + def test_fret_run_yields_a_second_decay_and_an_efficiency(self, page: Page) -> None: + _load(page, "/labeling") + _upload_structure(page) + + residue_select = page.locator("label.field").filter(has_text="Residue").locator("select") + residue_select.select_option(value="55", timeout=15_000) + page.get_by_label("Simulate FRET acceptor").check() + + page.get_by_role("button", name="Run Sim").click() + expect(page.locator(".topbar .status.ok")).to_contain_text( + "Simulation complete", timeout=600_000 + ) + + page.get_by_role("link", name="2 - Simulation").click() + + # A FRET decay is drawn alongside the donor one... + expect(page.locator("path.fret-line")).to_have_count(1) + # ...and the efficiency is a real number, not a dash. A Forster radius + # in the wrong unit would leave transfer at zero here. + metrics = page.locator(".metrics") + expect(metrics).to_contain_text("FRET Eff.") + efficiency = page.evaluate( + """() => { + const cells = [...document.querySelectorAll('.metrics *')].map(e => e.textContent || ''); + const index = cells.findIndex(text => text.trim() === 'FRET Eff.'); + return index >= 0 ? cells[index + 1] : null; + }""" + ) + assert efficiency not in (None, "-"), f"no FRET efficiency reported: {efficiency!r}" + assert 0.0 < float(efficiency) <= 1.0, efficiency + + real_errors = [message for message in page.errors if not _ignorable(message)] + assert not real_errors, f"console errors during FRET simulation: {real_errors}" + + +class TestRunPicker: + def test_job_list_is_capped(self, page: Page) -> None: + """The picker shows a bounded window, not every run ever made.""" + _load(page, "/labeling") + options = page.locator(".control-panel select").first.locator("option") + # One placeholder plus at most the server-side page size. + assert options.count() <= 51, f"run picker listed {options.count()} entries" + + def test_job_list_response_is_a_summary(self, page: Page) -> None: + _load(page, "/labeling") + payload = page.evaluate( + "async () => (await fetch('/api/jobs')).json()", + ) + assert isinstance(payload, dict) + assert "jobs" in payload and "total" in payload + assert len(payload["jobs"]) <= payload["limit"] + if payload["jobs"]: + # Summaries only: no embedded project blobs. + assert set(payload["jobs"][0]) == {"job_id", "labeling_site", "date"} + + +class TestLanguageSwitching: + """The browser reads the same translations as the desktop form and the docs.""" + + def test_the_selector_offers_every_language(self, page) -> None: + _load(page, "/simulation") + options = page.get_by_test_id("locale-select").inner_text().split("\n") + assert {"English", "Deutsch", "Français"} <= set(o.strip() for o in options), options + + def test_switching_translates_the_parameter_labels(self, page) -> None: + """The labels come from the catalog, so this proves the shared path.""" + _load(page, "/simulation") + page.get_by_test_id("locale-select").select_option("de") + page.wait_for_timeout(1500) + body = page.inner_text("body") + assert "Ungelöschte Lebensdauer" in body, "tau0 did not translate" + assert "Simulationsdauer" in body, "t_max did not translate" + + page.get_by_test_id("locale-select").select_option("fr") + page.wait_for_timeout(1500) + body = page.inner_text("body") + assert "Durée de vie non éteinte" in body + assert "Langue" in body + + def test_english_keeps_its_hand_written_labels(self, page) -> None: + """They are terser than the catalog's prose and chosen for this layout.""" + _load(page, "/simulation") + page.get_by_test_id("locale-select").select_option("en") + page.wait_for_timeout(1200) + assert "tau0 [ns]" in page.inner_text("body") + + def test_the_language_survives_a_reload(self, page) -> None: + _load(page, "/simulation") + page.get_by_test_id("locale-select").select_option("de") + page.wait_for_timeout(1200) + page.reload(wait_until="networkidle") + page.wait_for_timeout(1200) + assert page.get_by_test_id("locale-select").input_value() == "de" diff --git a/webui/__init__.py b/webui/__init__.py new file mode 100644 index 0000000..dd08173 --- /dev/null +++ b/webui/__init__.py @@ -0,0 +1,2 @@ +"""Web surfaces for QuEst.""" + diff --git a/webui/backend/__init__.py b/webui/backend/__init__.py new file mode 100644 index 0000000..8237464 --- /dev/null +++ b/webui/backend/__init__.py @@ -0,0 +1,2 @@ +"""Backend package for QuEst web UI.""" + diff --git a/webui/backend/app/__init__.py b/webui/backend/app/__init__.py new file mode 100644 index 0000000..f20a887 --- /dev/null +++ b/webui/backend/app/__init__.py @@ -0,0 +1,2 @@ +"""QuEst web backend package.""" + diff --git a/webui/backend/app/main.py b/webui/backend/app/main.py new file mode 100644 index 0000000..c92f51c --- /dev/null +++ b/webui/backend/app/main.py @@ -0,0 +1,389 @@ +from __future__ import annotations + +import sys + +class SafeStream: + def __init__(self, original_stream): + self.original_stream = original_stream + + def write(self, data): + if not self.original_stream: + return 0 + try: + return self.original_stream.write(data) + except OSError as e: + if e.errno == 5: # EIO + return len(data) + raise + + def flush(self): + if not self.original_stream: + return + try: + self.original_stream.flush() + except OSError as e: + if e.errno == 5: + return + raise + + def isatty(self): + if not self.original_stream: + return False + try: + return self.original_stream.isatty() + except Exception: + return False + + def __getattr__(self, name): + if not self.original_stream: + raise AttributeError(name) + return getattr(self.original_stream, name) + +sys.stdout = SafeStream(sys.stdout) +sys.stderr = SafeStream(sys.stderr) + +import datetime +import json +import os +import tempfile +import uuid +import zipfile +from collections import deque +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path +from typing import Any + +import asyncio +from fastapi import FastAPI, File, Form, HTTPException, UploadFile, Request +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse, StreamingResponse + +from quest import api +from quest.core import top_quenchers +from quest.scan import simulate_site +from quest import i18n as quest_i18n +from quest import settings as quest_settings +from quest.backend import result_payload +from quest.backend.services import locales_handler, structure_metadata_handler +from quest import jobs as quest_jobs +from quest.structure_fetch import resolve_structure_path + + +def _data_dir() -> Path: + target = Path(os.getenv("QUEST_WEBUI_DATA_DIR", Path(tempfile.gettempdir()) / "quest-webui")) + target.mkdir(parents=True, exist_ok=True) + return target + + +# Sites simulated concurrently by /api/scan. Kept low on purpose: LabelLib's +# accessible-volume kernel holds the GIL, so extra workers add contention +# rather than throughput. The real reason to use a pool at all is that it keeps +# the simulation off the event loop, so the server stays responsive (and +# client disconnects are still noticed) while a long scan runs. +SCAN_WORKERS = max(1, min(4, (os.cpu_count() or 1) - 1)) + +DATA_DIR = _data_dir() +UPLOAD_DIR = DATA_DIR / "uploads" +UPLOAD_DIR.mkdir(parents=True, exist_ok=True) + +# Job directories live under the repository root; the settings files are +# package data and are resolved by `quest.settings` itself. +REPO_ROOT = Path(__file__).resolve().parents[3] + +app = FastAPI(title="QuEst Web API") + +allowed_origins = os.getenv( + "QUEST_WEBUI_CORS_ORIGINS", + "http://127.0.0.1:3000,http://localhost:3000,http://127.0.0.1:3001,http://localhost:3001", +) +app.add_middleware( + CORSMiddleware, + allow_origins=[origin.strip() for origin in allowed_origins.split(",") if origin.strip()], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +def _parse_project_json(project_json: str) -> dict[str, Any]: + try: + parsed = json.loads(project_json) + except json.JSONDecodeError as exc: + raise HTTPException(status_code=400, detail=f"Invalid JSON: {exc}") from exc + if not isinstance(parsed, dict): + raise HTTPException(status_code=400, detail="Project JSON must be an object.") + return parsed + + +async def _store_upload(file: UploadFile) -> Path: + filename = Path(file.filename or "uploaded_file").name + target = UPLOAD_DIR / f"{uuid.uuid4()}_{filename}" + content = await file.read() + target.write_bytes(content) + return target + + +def _resolve_pdb_path(project: dict[str, Any], pdb_path: str | None, uploaded: Path | None) -> Path | None: + if uploaded is not None: + return uploaded + if pdb_path: + try: + return resolve_structure_path(pdb_path) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + configured = project.get("pdb") + if configured: + try: + return resolve_structure_path(configured) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + return None + + +@app.get("/health") +def health() -> dict[str, str]: + return {"status": "ok", "app": "quest", "version": "19.8.13"} + + +@app.get("/api/parameter-catalog") +def get_parameter_catalog(locale: str | None = None) -> dict[str, Any]: + """Parameter labels and help, in the requested language. + + The translations live in `quest/settings/locales/`, beside the catalog they + translate — so the browser, the desktop form and `doc/parameters.md` all say + the same thing in the same language. + """ + try: + return quest_i18n.translate_catalog(locale or quest_i18n.DEFAULT_LOCALE) + except FileNotFoundError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + + +@app.get("/api/i18n") +def get_i18n(locale: str | None = None) -> dict[str, Any]: + """The available languages, and the UI strings for the requested one.""" + response = locales_handler(locale) + if not response.get("ok"): + raise HTTPException(status_code=500, detail=response.get("error")) + return response["result"] + + +@app.get("/api/dyes") +def get_dyes() -> dict[str, Any]: + try: + return quest_settings.dye_repository() + except FileNotFoundError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + + +@app.get("/api/quenching-defaults") +def get_quenching_defaults() -> dict[str, Any]: + """Residue-type chemistry used to make quenching amino-acid specific.""" + return quest_settings.quenching_defaults() + + +@app.get("/api/template") +def template(with_fret: bool = True) -> dict[str, Any]: + return {"project": api.template_project(with_fret=with_fret)} + + +@app.post("/api/validate") +async def validate( + project_json: str = Form(...), + pdb_path: str | None = Form(default=None), + pdb_file: UploadFile | None = File(default=None), +) -> dict[str, Any]: + project = _parse_project_json(project_json) + uploaded = await _store_upload(pdb_file) if pdb_file is not None else None + resolved_pdb = _resolve_pdb_path(project, pdb_path, uploaded) + if resolved_pdb is not None: + project["pdb"] = str(resolved_pdb) + try: + api.validate_project(project) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + return {"valid": True, "project": project} + + +@app.post("/api/structure/metadata") +async def structure_metadata_route( + pdb_path: str | None = Form(default=None), + pdb_file: UploadFile | None = File(default=None), +) -> dict[str, Any]: + uploaded = await _store_upload(pdb_file) if pdb_file is not None else None + resolved_pdb = _resolve_pdb_path({}, pdb_path, uploaded) + if resolved_pdb is None: + raise HTTPException(status_code=400, detail="Provide a PDB file upload or local pdb_path.") + if resolved_pdb.suffix.lower() not in {".pdb", ".ent", ".txt", ".cif", ""}: + raise HTTPException(status_code=400, detail=f"Unsupported structure file type: {resolved_pdb.suffix}") + response = structure_metadata_handler(str(resolved_pdb)) + if not response["ok"]: + raise HTTPException(status_code=400, detail=response["error"]) + + metadata = response["result"] + if pdb_file is not None and pdb_file.filename: + # Uploads are stored as "_" so two users cannot collide. + # That is a storage detail: the UI should show what was uploaded, not + # the bookkeeping around it. + metadata["filename"] = Path(pdb_file.filename).name + return metadata + + +@app.post("/api/simulate") +async def simulate( + project_json: str = Form(...), + pdb_path: str | None = Form(default=None), + pdb_file: UploadFile | None = File(default=None), + nbins: int | None = Form(default=None), + tac_start: float = Form(default=0.0), + tac_stop: float = Form(default=50.0), +) -> dict[str, Any]: + project = _parse_project_json(project_json) + uploaded = await _store_upload(pdb_file) if pdb_file is not None else None + resolved_pdb = _resolve_pdb_path(project, pdb_path, uploaded) + if resolved_pdb is not None: + project["pdb"] = str(resolved_pdb) + try: + api.validate_project(project) + except Exception as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + + try: + result = api.simulate_project( + project, + pdb_path=resolved_pdb, + nbins=nbins, + tac_range=(tac_start, tac_stop), + project_dir=REPO_ROOT, + ) + except Exception as exc: + raise HTTPException(status_code=500, detail=f"Simulation failed: {exc}") from exc + + # One definition of what a simulation result looks like on the wire, shared + # with the RPC surface (quest.simulate). + return result_payload(result) + + +@app.post("/api/scan") +async def scan( + request: Request, + project_json: str = Form(...), + pdb_path: str | None = Form(default=None), + pdb_file: UploadFile | None = File(default=None), + nbins: int | None = Form(default=None), + tac_start: float = Form(default=0.0), + tac_stop: float = Form(default=50.0), + sites_json: str = Form(...), +) -> StreamingResponse: + project = _parse_project_json(project_json) + uploaded = await _store_upload(pdb_file) if pdb_file is not None else None + resolved_pdb = _resolve_pdb_path(project, pdb_path, uploaded) + if resolved_pdb is not None: + project["pdb"] = str(resolved_pdb) + + try: + sites_parsed = json.loads(sites_json) + fps_data = api.normalize_to_fps_positions(sites_parsed, project) + except Exception as exc: + raise HTTPException(status_code=400, detail=f"Invalid sites JSON: {exc}") from exc + + scan_temp_dir = Path(tempfile.gettempdir()) + positions = fps_data.get("Positions", {}) + total_positions = len(positions) + + def simulate_one(name: str, pos: dict[str, Any]) -> dict[str, Any]: + """Simulate one labelling site. Runs in a worker thread; never raises.""" + return simulate_site( + project, + pos, + name=name, + pdb_path=resolved_pdb, + nbins=nbins, + tac_range=(tac_start, tac_stop), + project_dir=scan_temp_dir, + ) + + async def generate_scan(): + loop = asyncio.get_running_loop() + items = list(positions.items()) + executor = ThreadPoolExecutor( + max_workers=SCAN_WORKERS, thread_name_prefix="quest-scan" + ) + # Keep at most SCAN_WORKERS sites in flight and pop them in submission + # order, so the stream still reports sites in the order the client + # listed them while the pool stays saturated. + inflight: deque = deque() + submitted = 0 + try: + while submitted < len(items) and len(inflight) < SCAN_WORKERS: + inflight.append(loop.run_in_executor(executor, simulate_one, *items[submitted])) + submitted += 1 + + for idx in range(len(items)): + if await request.is_disconnected(): + break + res = await inflight.popleft() + if submitted < len(items): + inflight.append( + loop.run_in_executor(executor, simulate_one, *items[submitted]) + ) + submitted += 1 + yield json.dumps( + {"current": idx + 1, "total": total_positions, "result": res} + ) + "\n" + finally: + for future in inflight: + future.cancel() + executor.shutdown(wait=False) + + return StreamingResponse(generate_scan(), media_type="application/x-ndjson") + + +@app.get("/api/jobs") +async def list_jobs( + limit: int = quest_jobs.DEFAULT_JOB_LIST_LIMIT, offset: int = 0 +) -> dict[str, Any]: + """Return the most recent job summaries, newest first.""" + return quest_jobs.list_jobs(REPO_ROOT, limit=limit, offset=offset) + + +@app.get("/api/jobs/{job_id}") +async def get_job(job_id: str) -> dict[str, Any]: + try: + return quest_jobs.read_job(job_id, REPO_ROOT) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + except FileNotFoundError as exc: + raise HTTPException(status_code=404, detail="Job not found") from exc + except Exception as exc: + raise HTTPException(status_code=500, detail=f"Failed to read job result: {exc}") from exc + + +@app.post("/api/dyes") +async def save_dye(dye: dict[str, Any]): + """Add or replace a dye preset and return the library.""" + try: + quest_settings.save_dye(dye) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + except OSError as exc: + raise HTTPException(status_code=500, detail=f"Failed to save dye catalogue: {exc}") from exc + return quest_settings.dye_repository() + + +@app.get("/api/jobs/{job_id}/download") +async def download_job_zip(job_id: str): + try: + zip_path = quest_jobs.archive_job(job_id, REPO_ROOT) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + except FileNotFoundError as exc: + raise HTTPException(status_code=404, detail="Job not found") from exc + except Exception as exc: + raise HTTPException(status_code=500, detail=f"Failed to create ZIP archive: {exc}") from exc + + return FileResponse( + path=zip_path, + media_type="application/zip", + filename=zip_path.name, + ) diff --git a/webui/backend/requirements.txt b/webui/backend/requirements.txt new file mode 100644 index 0000000..70e9df7 --- /dev/null +++ b/webui/backend/requirements.txt @@ -0,0 +1,6 @@ +fastapi>=0.115 +uvicorn>=0.30 +python-multipart>=0.0.9 +httpx>=0.27 +pytest>=8.0 + diff --git a/webui/backend/tests/test_backend_api.py b/webui/backend/tests/test_backend_api.py new file mode 100644 index 0000000..7f32659 --- /dev/null +++ b/webui/backend/tests/test_backend_api.py @@ -0,0 +1,369 @@ +from __future__ import annotations + +import json +import os +import uuid +import zipfile +from io import BytesIO +from pathlib import Path + +import numpy as np +from fastapi.testclient import TestClient + +from webui.backend.app import main as backend_main +from webui.backend.app.main import app +from quest import jobs as quest_jobs +from quest.core import DecaySimulationResult + +AAS = [ + "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", +] + + +def _aa_interactions() -> dict[str, dict[str, float]]: + interactions = {aa: {"slow_factor": 1.0, "kQ": 0.0} for aa in AAS} + interactions["TYR"]["kQ"] = 2.0 + return interactions + + +def _minimal_project(tmp_path: Path) -> dict: + pdb = tmp_path / "mock.pdb" + pdb.write_text("ATOM\n", encoding="utf8") + return { + "pdb": str(pdb), + "tau0": 4.2, + "n_photons": 1000, + "t_max": 200.0, + "t_step": 0.02, + "dg": 0.5, + "critical_distance": 6.5, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + "amino_acid_interactions": _aa_interactions(), + "slow_radius": 8.5, + "fret": { + "enabled": False, + "dyes": [ + { + "name": "D0", + "D": 7.0, + "attachment": {"chain": "E", "residue": 10, "atom": "CB"}, + "av_parameter": {"linker_length": 21.5, "linker_width": 0.5, "radius1": 3.5}, + } + ], + }, + "attachment": {"chain": "E", "residue": 10, "atom": "CB"}, + } + + +def test_health() -> None: + client = TestClient(app) + response = client.get("/health") + assert response.status_code == 200 + assert response.json()["status"] == "ok" + + +def test_template() -> None: + client = TestClient(app) + response = client.get("/api/template?with_fret=false") + assert response.status_code == 200 + payload = response.json()["project"] + assert payload["fret"]["enabled"] is False + + +def test_validate_success(tmp_path: Path) -> None: + client = TestClient(app) + project = _minimal_project(tmp_path) + response = client.post("/api/validate", data={"project_json": json.dumps(project)}) + assert response.status_code == 200 + assert response.json()["valid"] is True + + +def test_validate_bad_json() -> None: + client = TestClient(app) + response = client.post("/api/validate", data={"project_json": "not-json"}) + assert response.status_code == 400 + + +def test_simulate_uses_adapter(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + project = _minimal_project(tmp_path) + + def fake_simulate(*args, **kwargs): + return DecaySimulationResult( + time=np.array([0.0, 1.0]), + donor_counts=np.array([10.0, 5.0]), + fret_counts=None, + quantum_yield_donor=0.5, + quantum_yield_fret=None, + collisions_fraction=0.1, + fret_efficiency=None, + project=args[0], + aa_residence=[ + { + "residue_name": "ASP", + "center_count": 1, + "effective_slow_factor": 0.001, + "frames_near": 2, + "fraction_near": 1.0, + "total_time_ns": 0.04, + "event_count": 1, + "mean_event_time_ns": 0.04, + "max_event_time_ns": 0.04, + "mean_min_distance_angstrom": 1.2, + } + ], + ) + + monkeypatch.setattr("webui.backend.app.main.api.simulate_project", fake_simulate) + + response = client.post( + "/api/simulate", + data={"project_json": json.dumps(project), "tac_start": "0.0", "tac_stop": "2.0"}, + ) + assert response.status_code == 200 + body = response.json() + assert body["time_ns"] == [0.0, 1.0] + assert body["donor_counts"] == [10.0, 5.0] + assert body["quantum_yield_donor"] == 0.5 + assert body["aa_residence"][0]["residue_name"] == "ASP" + + +def test_get_dyes() -> None: + client = TestClient(app) + response = client.get("/api/dyes") + assert response.status_code == 200 + dyes = response.json() + assert "Alexa488" in dyes + assert dyes["Alexa488"]["tau0"] == 4.2 + assert dyes["Alexa488"]["slow_radius"] == 8.5 + interactions = dyes["Alexa488"]["amino_acid_interactions"] + # Residues without a redox-active side chain do not quench and inherit the + # project-wide contact radius. + assert interactions["ALA"] == { + "slow_factor": 0.1, + "kQ": 0.0, + "quench_radius": None, + "quench_atoms": ["CB"], + } + # Quenching is amino-acid specific: rate, contact radius and the atoms that + # define the quenching centre all come from the residue's chemistry. + assert interactions["TRP"]["slow_factor"] == 0.1 + assert interactions["TRP"]["kQ"] == 3.5 + assert interactions["TRP"]["quench_radius"] == 8.5 + assert "NE1" in interactions["TRP"]["quench_atoms"] + assert "CB" not in interactions["TRP"]["quench_atoms"] + assert interactions["MET"]["quench_atoms"] == ["SD"] + assert interactions["HIS"]["kQ"] > 0.0 + + +def test_scan_uses_adapter(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + project = _minimal_project(tmp_path) + + sites = [ + {"chain": "E", "residue": 10, "residue_name": "ASP", "atom": "CB"} + ] + + def fake_simulate(*args, **kwargs): + proj = args[0] + assert proj["attachment"]["chain"] == "E" + assert proj["attachment"]["residue"] == 10 + assert proj["attachment"]["atom"] == "CB" + + result = DecaySimulationResult( + time=np.array([0.0, 1.0]), + donor_counts=np.array([10.0, 5.0]), + fret_counts=None, + quantum_yield_donor=0.5, + quantum_yield_fret=None, + collisions_fraction=0.1, + fret_efficiency=None, + project=proj, + ) + result.lifetime_donor = 4.0 + return result + + monkeypatch.setattr("webui.backend.app.main.api.simulate_project", fake_simulate) + + response = client.post( + "/api/scan", + data={ + "project_json": json.dumps(project), + "sites_json": json.dumps(sites), + "tac_start": "0.0", + "tac_stop": "2.0" + }, + ) + assert response.status_code == 200 + + results = [] + for line in response.iter_lines(): + if line.strip(): + chunk = json.loads(line) + assert "current" in chunk + assert "total" in chunk + results.append(chunk["result"]) + + assert len(results) == 1 + res = results[0] + assert res["chain"] == "E" + assert res["residue"] == 10 + assert res["status"] == "success" + assert res["lifetime"] == 4.0 + assert res["quantum_yield"] == 0.5 + assert res["contact_fraction"] == 0.1 + + +def test_download_zip_includes_mrc_outputs(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + monkeypatch.setattr(backend_main, "REPO_ROOT", tmp_path) + job_id = str(uuid.uuid4()) + job_dir = tmp_path / "jobs" / job_id + job_dir.mkdir(parents=True) + (job_dir / "result.json").write_text("{}", encoding="utf8") + (job_dir / "sampled_dye_density.mrc").write_bytes(b"mrc-data") + (job_dir / "diffusion_coefficients.mrc").write_bytes(b"mrc-data") + (job_dir / "quenching_rates.mrc").write_bytes(b"mrc-data") + + response = client.get(f"/api/jobs/{job_id}/download") + + assert response.status_code == 200 + assert response.headers["content-type"] == "application/zip" + with zipfile.ZipFile(BytesIO(response.content)) as archive: + assert "result.json" in archive.namelist() + assert "sampled_dye_density.mrc" in archive.namelist() + assert "diffusion_coefficients.mrc" in archive.namelist() + assert "quenching_rates.mrc" in archive.namelist() + + +def test_list_jobs_uses_project_sidecar(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + monkeypatch.setattr(backend_main, "REPO_ROOT", tmp_path) + job_id = str(uuid.uuid4()) + job_dir = tmp_path / "jobs" / job_id + job_dir.mkdir(parents=True) + (job_dir / "project.json").write_text( + json.dumps({"attachment": {"chain": "A", "residue": 42}}), + encoding="utf8", + ) + (job_dir / "result.json").write_text("{not valid json", encoding="utf8") + + response = client.get("/api/jobs") + + assert response.status_code == 200 + payload = response.json() + assert payload["total"] == 1 + assert payload["jobs"][0]["job_id"] == job_id + assert payload["jobs"][0]["labeling_site"] == "A:42" + # The list is a summary: the full project stays behind /api/jobs/{id}. + assert "project" not in payload["jobs"][0] + + +def test_list_jobs_does_not_parse_result_without_sidecar(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + monkeypatch.setattr(backend_main, "REPO_ROOT", tmp_path) + job_id = str(uuid.uuid4()) + job_dir = tmp_path / "jobs" / job_id + job_dir.mkdir(parents=True) + (job_dir / "result.json").write_text("{not valid json", encoding="utf8") + + response = client.get("/api/jobs") + + assert response.status_code == 200 + payload = response.json() + assert payload["jobs"][0]["job_id"] == job_id + assert payload["jobs"][0]["labeling_site"] == "Unknown" + + +def test_list_jobs_is_paginated_newest_first(monkeypatch, tmp_path: Path) -> None: + """The picker must not grow without bound as runs accumulate.""" + client = TestClient(app) + monkeypatch.setattr(backend_main, "REPO_ROOT", tmp_path) + + job_ids = [] + for index in range(5): + job_id = str(uuid.uuid4()) + job_dir = tmp_path / "jobs" / job_id + job_dir.mkdir(parents=True) + (job_dir / "project.json").write_text( + json.dumps({"attachment": {"chain": "A", "residue": index}}), encoding="utf8" + ) + os.utime(job_dir, (1_700_000_000 + index, 1_700_000_000 + index)) + job_ids.append(job_id) + + payload = client.get("/api/jobs", params={"limit": 2}).json() + assert payload["total"] == 5 + assert payload["limit"] == 2 + assert [job["job_id"] for job in payload["jobs"]] == job_ids[::-1][:2] + + second_page = client.get("/api/jobs", params={"limit": 2, "offset": 2}).json() + assert [job["job_id"] for job in second_page["jobs"]] == job_ids[::-1][2:4] + + # Out-of-range limits are clamped rather than rejected. + assert client.get("/api/jobs", params={"limit": 0}).json()["limit"] == 1 + assert ( + client.get("/api/jobs", params={"limit": 10_000}).json()["limit"] + == quest_jobs.MAX_JOB_LIST_LIMIT + ) + + +def test_list_jobs_ignores_non_uuid_directories(monkeypatch, tmp_path: Path) -> None: + client = TestClient(app) + monkeypatch.setattr(backend_main, "REPO_ROOT", tmp_path) + (tmp_path / "jobs" / "not-a-job").mkdir(parents=True) + (tmp_path / "jobs" / "stray.txt").write_text("x", encoding="utf8") + + payload = client.get("/api/jobs").json() + assert payload["jobs"] == [] + assert payload["total"] == 0 + + +class TestTopQuenchers: + """The scan surfaces which residue types quench each candidate site. + + ``top_quenchers`` is domain code (``quest.core``); the backend re-exports it + by importing it. These cases pin the ranking the scan table depends on. + """ + + def test_orders_by_share_and_drops_non_quenchers(self) -> None: + rows = [ + {"residue_name": "ALA", "mean_quench_rate": 0.0, "quench_rate_fraction": 0.0}, + {"residue_name": "TYR", "mean_quench_rate": 0.4, "quench_rate_fraction": 0.25}, + {"residue_name": "TRP", "mean_quench_rate": 1.2, "quench_rate_fraction": 0.75}, + ] + top = backend_main.top_quenchers(rows) + assert [item["residue_name"] for item in top] == ["TRP", "TYR"] + assert top[0]["quench_rate_fraction"] == 0.75 + + def test_limit_is_respected(self) -> None: + rows = [ + {"residue_name": name, "mean_quench_rate": rate, "quench_rate_fraction": rate} + for name, rate in (("TRP", 0.5), ("TYR", 0.3), ("MET", 0.1), ("HIS", 0.05)) + ] + assert len(backend_main.top_quenchers(rows, limit=2)) == 2 + + def test_handles_missing_data(self) -> None: + assert backend_main.top_quenchers(None) == [] + assert backend_main.top_quenchers([]) == [] + + +def test_uploaded_structure_reports_its_own_name() -> None: + """The UI shows what the user uploaded, not how the server stored it. + + Uploads are saved as "_" so two users cannot collide; that + prefix used to reach the topbar, the structure card and the viewer footer. + """ + client = TestClient(app) + pdb = (Path(__file__).resolve().parents[3] / "tests" / "148l.pdb").read_bytes() + + response = client.post( + "/api/structure/metadata", + files={"pdb_file": ("148l.pdb", BytesIO(pdb), "chemical/x-pdb")}, + ) + + assert response.status_code == 200 + payload = response.json() + assert payload["filename"] == "148l.pdb" + assert "_" not in payload["filename"].split(".")[0][:9] + assert payload["atom_count"] == 1525 diff --git a/webui/desktop/.gitignore b/webui/desktop/.gitignore new file mode 100644 index 0000000..d50d697 --- /dev/null +++ b/webui/desktop/.gitignore @@ -0,0 +1,4 @@ +dist/ +node_modules/ +python-env/ + diff --git a/webui/desktop/package.json b/webui/desktop/package.json new file mode 100644 index 0000000..efaf14b --- /dev/null +++ b/webui/desktop/package.json @@ -0,0 +1,52 @@ +{ + "name": "@quest/desktop", + "version": "0.1.0", + "private": true, + "description": "Electron desktop shell for QuEst web UI.", + "main": "src/main.cjs", + "scripts": { + "start": "electron .", + "build:frontend": "npm --prefix ../frontend run build", + "pack": "npm run build:frontend && electron-builder --dir --publish never", + "dist": "npm run build:frontend && electron-builder --publish never", + "prepare:python": "node scripts/prepare-python-env.mjs" + }, + "dependencies": { + "electron-is-dev": "^3.0.1" + }, + "devDependencies": { + "electron": "^39.2.7", + "electron-builder": "^26.0.12" + }, + "build": { + "appId": "org.fluorescence-tools.quest.desktop", + "productName": "quest-web", + "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", + "asar": true, + "directories": { + "output": "dist" + }, + "files": [ + "src/**/*", + "package.json" + ], + "extraResources": [ + { + "from": "../frontend/.next/standalone", + "to": "frontend/standalone" + }, + { + "from": "../backend/app", + "to": "python/webui/backend/app" + }, + { + "from": "../../quest", + "to": "python/quest" + }, + { + "from": "python-env", + "to": "python-env" + } + ] + } +} diff --git a/webui/desktop/scripts/prepare-python-env.mjs b/webui/desktop/scripts/prepare-python-env.mjs new file mode 100644 index 0000000..be06a4e --- /dev/null +++ b/webui/desktop/scripts/prepare-python-env.mjs @@ -0,0 +1,3 @@ +console.log("Prepare a bundled Python env under webui/desktop/python-env for packaging."); +console.log("No-op by default. Use QUEST_PYTHON for local development if no bundled env is present."); + diff --git a/webui/desktop/src/main.cjs b/webui/desktop/src/main.cjs new file mode 100644 index 0000000..11f2f15 --- /dev/null +++ b/webui/desktop/src/main.cjs @@ -0,0 +1,273 @@ +const { app, BrowserWindow, dialog } = require("electron"); +const { spawn, spawnSync } = require("node:child_process"); +const fs = require("node:fs"); +const http = require("node:http"); +const net = require("node:net"); +const os = require("node:os"); +const path = require("node:path"); + +const children = new Set(); +let mainWindow = null; +let frontendPortCache = null; + +function repoRoot() { + return path.resolve(__dirname, "..", "..", ".."); +} + +function resourceRoot() { + return app.isPackaged ? process.resourcesPath : repoRoot(); +} + +function packagedPath(...parts) { + return path.join(resourceRoot(), ...parts); +} + +function sourcePath(...parts) { + return path.join(repoRoot(), ...parts); +} + +function getFrontendServerPath() { + return app.isPackaged + ? packagedPath("frontend", "standalone", "server.js") + : sourcePath("webui", "frontend", ".next", "standalone", "server.js"); +} + +function getBackendCwd() { + return app.isPackaged ? packagedPath("python") : repoRoot(); +} + +function getBundledPythonExecutable() { + const platformDir = process.platform === "darwin" ? `macos-${process.arch}` : `${process.platform}-${process.arch}`; + const envRoot = app.isPackaged + ? packagedPath("python-env", platformDir) + : sourcePath("webui", "desktop", "python-env", platformDir); + const candidate = + process.platform === "win32" ? path.join(envRoot, "python.exe") : path.join(envRoot, "bin", "python"); + return fs.existsSync(candidate) ? candidate : null; +} + +function freePort() { + return new Promise((resolve, reject) => { + const server = net.createServer(); + server.unref(); + server.on("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + const port = typeof address === "object" && address ? address.port : 0; + server.close(() => resolve(port)); + }); + }); +} + +function waitForHttp(url, timeoutMs = 45000) { + const startedAt = Date.now(); + return new Promise((resolve, reject) => { + const attempt = () => { + const request = http.get(url, (response) => { + response.resume(); + if (response.statusCode && response.statusCode < 500) { + resolve(); + return; + } + retry(); + }); + request.on("error", retry); + request.setTimeout(1500, () => { + request.destroy(); + retry(); + }); + }; + const retry = () => { + if (Date.now() - startedAt > timeoutMs) { + reject(new Error(`Timed out waiting for ${url}`)); + return; + } + setTimeout(attempt, 350); + }; + attempt(); + }); +} + +function pipeChildLogs(child, name) { + child.stdout?.on("data", (chunk) => process.stdout.write(`[${name}] ${chunk}`)); + child.stderr?.on("data", (chunk) => process.stderr.write(`[${name}] ${chunk}`)); + child.on("exit", () => children.delete(child)); +} + +function spawnTracked(name, command, args, options) { + const child = spawn(command, args, { + stdio: ["ignore", "pipe", "pipe"], + windowsHide: true, + ...options, + }); + children.add(child); + pipeChildLogs(child, name); + return child; +} + +function pythonImports(command, prefixArgs, moduleName) { + const check = spawnSync(command, [...prefixArgs, "-c", `import ${moduleName}`], { + stdio: "ignore", + windowsHide: true, + }); + return check.status === 0; +} + +function absolutePythonCandidates() { + const candidates = []; + const home = os.homedir(); + for (const prefix of [ + process.env.CONDA_PREFIX, + path.join(home, "mambaforge", "envs", "quest"), + path.join(home, "mambaforge"), + path.join(home, "miniforge3", "envs", "quest"), + path.join(home, "miniforge3"), + path.join(home, "miniconda3", "envs", "quest"), + path.join(home, "miniconda3"), + ]) { + if (prefix) { + candidates.push(path.join(prefix, "bin", "python")); + } + } + candidates.push("/opt/homebrew/bin/python3", "/usr/local/bin/python3", "/usr/bin/python3"); + return [...new Set(candidates)].filter((candidate) => fs.existsSync(candidate)); +} + +function pythonFromLoginShell() { + const check = spawnSync( + "/bin/zsh", + ["-lic", "python - <<'PY'\nimport sys, uvicorn, fastapi\nprint(sys.executable)\nPY"], + { encoding: "utf8", windowsHide: true }, + ); + if (check.status !== 0) return null; + const executable = check.stdout.trim().split(/\r?\n/).at(-1); + return executable && fs.existsSync(executable) ? executable : null; +} + +function pythonCommand() { + const bundledPython = getBundledPythonExecutable(); + if (bundledPython) { + if (!pythonImports(bundledPython, [], "uvicorn")) { + throw new Error(`Bundled Python exists at ${bundledPython}, but it cannot import uvicorn.`); + } + return { command: bundledPython, args: ["-m", "uvicorn"] }; + } + if (process.env.QUEST_PYTHON) { + if (!pythonImports(process.env.QUEST_PYTHON, [], "uvicorn")) { + throw new Error(`QUEST_PYTHON is set to ${process.env.QUEST_PYTHON}, but it cannot import uvicorn.`); + } + return { command: process.env.QUEST_PYTHON, args: ["-m", "uvicorn"] }; + } + const candidates = + process.platform === "win32" + ? [ + { command: "py", prefix: ["-3"] }, + { command: "python", prefix: [] }, + { command: "python3", prefix: [] }, + ] + : [ + ...absolutePythonCandidates().map((command) => ({ command, prefix: [] })), + { command: "python", prefix: [] }, + { command: "python3", prefix: [] }, + ]; + for (const candidate of candidates) { + if (pythonImports(candidate.command, candidate.prefix, "uvicorn")) { + return { command: candidate.command, args: [...candidate.prefix, "-m", "uvicorn"] }; + } + } + const shellPython = process.platform === "win32" ? null : pythonFromLoginShell(); + if (shellPython && pythonImports(shellPython, [], "uvicorn")) { + return { command: shellPython, args: ["-m", "uvicorn"] }; + } + throw new Error("Could not find Python with uvicorn/fastapi installed. Set QUEST_PYTHON."); +} + +function startBackend(port) { + const python = pythonCommand(); + const cwd = getBackendCwd(); + const env = { + ...process.env, + QUEST_WEBUI_DATA_DIR: process.env.QUEST_WEBUI_DATA_DIR || path.join(app.getPath("userData"), "data"), + PYTHONPATH: [cwd, process.env.PYTHONPATH].filter(Boolean).join(path.delimiter), + PYTHONNOUSERSITE: "1", + MPLBACKEND: "Agg", + }; + fs.mkdirSync(env.QUEST_WEBUI_DATA_DIR, { recursive: true }); + const args = [...python.args, "webui.backend.app.main:app", "--host", "127.0.0.1", "--port", String(port)]; + return spawnTracked("fastapi", python.command, args, { cwd, env }); +} + +function startFrontend(port, backendPort) { + const serverPath = getFrontendServerPath(); + if (!fs.existsSync(serverPath)) { + throw new Error(`Frontend server missing at ${serverPath}. Run npm run build:frontend first.`); + } + const env = { + ...process.env, + HOSTNAME: "127.0.0.1", + PORT: String(port), + QUEST_BACKEND_URL: `http://127.0.0.1:${backendPort}`, + }; + if (!app.isPackaged) { + return spawnTracked("next", "node", [serverPath], { cwd: path.dirname(serverPath), env }); + } + return spawnTracked("next", process.execPath, [serverPath], { + cwd: path.dirname(serverPath), + env: { ...env, ELECTRON_RUN_AS_NODE: "1" }, + }); +} + +function createWindow(frontendPort) { + mainWindow = new BrowserWindow({ + width: 1440, + height: 960, + minWidth: 1100, + minHeight: 720, + show: false, + title: "Quenching Estimator", + webPreferences: { contextIsolation: true, nodeIntegration: false, sandbox: true }, + }); + mainWindow.once("ready-to-show", () => mainWindow?.show()); + mainWindow.loadURL(`http://127.0.0.1:${frontendPort}`); + mainWindow.on("closed", () => { + mainWindow = null; + }); +} + +function showStartupError(error) { + const detail = error instanceof Error ? error.stack || error.message : String(error); + dialog.showErrorBox("quest failed to start", detail); +} + +function stopChildren() { + for (const child of children) { + if (!child.killed) child.kill(); + } +} + +async function boot() { + await app.whenReady(); + try { + const [backendPort, frontendPort] = await Promise.all([freePort(), freePort()]); + startBackend(backendPort); + await waitForHttp(`http://127.0.0.1:${backendPort}/health`); + startFrontend(frontendPort, backendPort); + await waitForHttp(`http://127.0.0.1:${frontendPort}`); + frontendPortCache = frontendPort; + createWindow(frontendPort); + } catch (error) { + showStartupError(error); + } +} + +app.on("window-all-closed", () => app.quit()); +app.on("activate", () => { + if (BrowserWindow.getAllWindows().length === 0 && frontendPortCache) createWindow(frontendPortCache); +}); +app.on("before-quit", stopChildren); +process.on("exit", stopChildren); +process.on("SIGTERM", () => app.quit()); +process.on("SIGINT", () => app.quit()); + +boot(); + diff --git a/webui/frontend/.gitignore b/webui/frontend/.gitignore new file mode 100644 index 0000000..8a4d274 --- /dev/null +++ b/webui/frontend/.gitignore @@ -0,0 +1,5 @@ +.next/ +node_modules/ +out/ +*.tsbuildinfo + diff --git a/webui/frontend/next-env.d.ts b/webui/frontend/next-env.d.ts new file mode 100644 index 0000000..c4b7818 --- /dev/null +++ b/webui/frontend/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +import "./.next/dev/types/routes.d.ts"; + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/webui/frontend/next.config.ts b/webui/frontend/next.config.ts new file mode 100644 index 0000000..1d6d41b --- /dev/null +++ b/webui/frontend/next.config.ts @@ -0,0 +1,22 @@ +import type { NextConfig } from "next"; + +const backendTarget = (process.env.QUEST_BACKEND_URL || "http://127.0.0.1:8000").replace(/\/$/, ""); + +const nextConfig: NextConfig = { + output: "standalone", + allowedDevOrigins: ["127.0.0.1", "localhost"], + async rewrites() { + return [ + { + source: "/api/:path*", + destination: `${backendTarget}/api/:path*`, + }, + { + source: "/health", + destination: `${backendTarget}/health`, + }, + ]; + }, +}; + +export default nextConfig; diff --git a/webui/frontend/package-lock.json b/webui/frontend/package-lock.json new file mode 100644 index 0000000..4e69f86 --- /dev/null +++ b/webui/frontend/package-lock.json @@ -0,0 +1,1039 @@ +{ + "name": "@quest/frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@quest/frontend", + "version": "0.1.0", + "dependencies": { + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "typescript": "^5.8.0" + }, + "engines": { + "node": ">=20.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.31", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.31.tgz", + "integrity": "sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/webui/frontend/package.json b/webui/frontend/package.json new file mode 100644 index 0000000..0917d92 --- /dev/null +++ b/webui/frontend/package.json @@ -0,0 +1,26 @@ +{ + "name": "@quest/frontend", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=20.9.0" + }, + "scripts": { + "dev": "next dev -p 3000", + "build": "next build", + "postbuild": "node postbuild.mjs", + "start": "node .next/standalone/server.js", + "lint": "next lint" + }, + "dependencies": { + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@types/node": "^20.17.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "typescript": "^5.8.0" + } +} diff --git a/webui/frontend/postbuild.mjs b/webui/frontend/postbuild.mjs new file mode 100644 index 0000000..6956dd6 --- /dev/null +++ b/webui/frontend/postbuild.mjs @@ -0,0 +1,23 @@ +import fs from "node:fs"; +import path from "node:path"; + +const nextDir = path.resolve(".next"); +const standaloneRoot = path.join(nextDir, "standalone"); + +function copyRecursive(src, dest) { + if (!fs.existsSync(src)) return; + const stat = fs.statSync(src); + if (stat.isDirectory()) { + fs.mkdirSync(dest, { recursive: true }); + for (const child of fs.readdirSync(src)) { + copyRecursive(path.join(src, child), path.join(dest, child)); + } + return; + } + fs.mkdirSync(path.dirname(dest), { recursive: true }); + fs.copyFileSync(src, dest); +} + +copyRecursive(path.join(nextDir, "static"), path.join(standaloneRoot, ".next", "static")); +copyRecursive(path.resolve("public"), path.join(standaloneRoot, "public")); +console.log("Next standalone assets copied."); diff --git a/webui/frontend/public/favicon.ico b/webui/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..59d6bf8d8b8b8b423da4d5d53504da6f04d29c37 GIT binary patch literal 3180 zcmZ`*c{r49`+mm0ym?iG-eL@uC1yxt8{3eG$yOl|#>iwD%V3awDY8?Pnvk(&-^rGx zH*0pXrm>baW8c0}{d(WycYNRT9QS=)&vl;XwcPhV4*-CuFBl9Q?ZB-+0N@k=0HM0q zuO4GL%|dmLX=!4ghkA0Knz=qDl`z1=KJ`n${>3AVT$-0MJ7$Ku7gJ)ODJ=0Dv|b z1kh6LQExyp&2JQ(O#6?2M9c}XT%*$3us4kGMksALG|pb!!U|`J5hvI?9uWWpL5}L$ zWAGMWg1w!CiyT1#@`E8q^^d|(2>1sDZ>sU6eSQpi2n}#Q{^XH7fZm{8L46IF%B-&jufR~uwSD8kNj7q@&8o* z3;Cr)K##`#*Z4or_D7U@xQZ+Y=Lq<7@x^(g;p~g{q+lYlIhm2`i?h(x z0tkbel?1mj2QoxWxv0}B*0^^2X*s1P>m&`sN))lz%X+3}d2DxSzs76Xefclo;3Hk# z8}Bk~+zq`OQX-bzhQk~)Bk?i-EptTbhIWUOrTf(pVIu?8+BdcFqZrU=#W&^2K^cjO z! zO6o!WU%l&31$FqJ9*Y(P(f7uk2J&TMcFfY#7+Q04hALk8?0h$FJPvukl4+r>Ib=n& zkK<8x1v;dpxzcSnrTcHJ-)Uu?pmFSvJUh6-zQX2jBPc)zZpCv2eAIEA-CG|ETbxtWUEA6K0yxUjag|4j$$jd0O}Kc zeYe(NYHzYS{gI*8DtMidv%S*WBg2vq2{Jrp2vbeMKHhactrd~5C@ZFwb zqvK&ViFDbdt=(1Bt^tOG=Gv(D#&8q(4K(1LKoMZdOp!)q!g|&{9NY-teosC7aa4gRyJBQ<-Cxx3S z6CbtC03D^J9*oEoq}v|hc15|nI$etrdX;#5EZpOH!=%0veSt6S1}nY&A3#doiOdj24<#Y$+{qKHGK8JH&3W%Y={_-S62CN zt|oha59gXttRw_~zaRSkSFP=;fnF*@_8`Q3#O&~*uh)35c|4f{&KL61$i zdxxYQ?vnE(=vDb0zgx9ePCbSe_1yX1VH#hnOCZV5J3lXIjMmKrX`*AqR9Kh(LBghijOtDR^^3jqx!>gf~(aY%` zz7h%NIQRN$`NJ0W{e67jgZ0iD)N7Byw9!Zs$nxc%K$k;jQz}Ig%x_T6LLe1iu(tL& z@HQTXe@gKy%x2kmD6k~`7D*qy`7n$k1sf;J!MhiIprWF0?g~|}aUJ||CH9+Tdg*q1 z2r3=gQP{i~Pg2fTgmZ^;nJ1Cfc*hT$P-uZ!&l>8 zxqQ5=e^@eJCSAU@!pROTuljV*WrB@Eq{!>B>(mgl+d>m_TPL*Yt6g1beBJP6Uglhl zIA^74dYc#R^({%Fq91L$ZM-@tkF@7i^k|!=16JHxRim}j%uwH8uuq7Q+~C<6OrUI~ zVgXnnqE2$*wSYp*YnnNQV-dB+Z=Ywcgq4!zZ~uu}v|T2C6%&{BKSB5t9ea{T%Ejbn zp=N<8zr+BHyJQIZI5lEh88GuV?=)HM$|`@!W>2~2uPAmRQj3f; zS#o&2A(OA_1rf?&OP$ip=biakL%|BU2F=XsOTW` zJG8XCUe0P1G<{RxoqHJ9!&z2We3|2Kr=e6yPhVJ*AYq8p?xTs?YMTO>PHSz?!a`br@$#~0-uS`1 z9q*uqmewJ`NAo3Lp+>%ygdAef6nuPlHBYFrtXLkdK zn|D)c<_Z?iA{>;ZNIs2b65q2D(pk;IniS0S(64E<;l?4vsNLE~56%y1@4axwwaaDW1+;_9Acmts{cStJY}VyXL>zUXd@}HlP6}; zZs@Re0C7I00W0Ej9<$OA<2C(2WEICf(T%G{pMWt8?X`9QPSKtHKzGT(cp zxms5c9%7CdEy?=g_aR=ePqF6$y_7-m>5q7ERN@rK>>5Xk(UT#c^3*=jF#Mfc(T#6J z7O$F_6iJf|!Y6p@Kcl#kSRZn@ksI=(4JK84;E{edv^2-u6gCUS{~9o;6L)h BnK=Le literal 0 HcmV?d00001 diff --git a/webui/frontend/public/logo.png b/webui/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8049f4803a1f29fc729693838591c6b4771dfae GIT binary patch literal 685331 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℞;5alqV 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
fxd*iCqgkyl}W6RC?m6}Z9 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

DNUBCe{FKl*?Hh3lp9>D~ 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≪7uK0yxsr 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

6UWmK=~|XLtrjU|^-`XPmGPU^WRj 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� z&wlC;zwjXHL4iU6CU|zKj>$S%)|vf3HApMeTU)s5`ZfH}>u)?!C^H1)`22bWSO)^iBL*vO@?U30yMXgGIIweMb5uzQYV!O7&XWuVI~p`C;l~4#ds0? z#}SnsN)^o6t#kFQa>$rlAQ8thTqJ?Uqaw<72*Ix__x#dIVLIN%%Pu|efj3{j_P#GY zcN%t6u5xRUP0*>Kqxqv-ZN@pV@Q*zhNgsHsT0r28#+wD?*`=L17r@b^`+Ku|TDiL* z5k)EYLH9dY5QN8~YttLx{^RTT!>3;y{qT_$noNz|SHwIdWsTfS8Ry2A);aDGi0{KD>~^mrb%2^b z+9+xhF-ebq<@Padf(XYhlqc>zwShsQL0}lAFfss#jT2IBCu6ltk{sAetCbU^^Gd;Up*Ci*s_NmOU#x4Q4Ofc2hQS|V!&r1fAVXr53=A1q1b9TSzimw= zAL6wQL>LjHBtog+_B2*Nq3yLMN--439=aiAg1HQ%?Gz7Wk`DB2iD(Ngb|u4cZT*k| zXiXp}6otkeci;E+&F8m(#Q_XgK?5fFdi%;we%b57vzd zF$|-$Cx22)-)-l?ZZO)c3Q{fiS8mz06z zn0BO!Jq!jlS5I`={vF#Xf3*V>yKOax*@JSsg4QZJ5jk0e2%K4#l}F2kDP|^pmRRk!!o;gAMm}=y zT%C@QT@G@W7U30L3(O62%1+>ec5s~u@Y5B&Lg73NKJvNyF@;*OINGisw@pG&%Fk{{ z8Z!>H(I)6=c^WL*Jckl=Iw+j-GU0@1;;^KnD<5A*J|omZOH5!>`F{hyy^PHWVboog z<@pXT@HK1**Ud~&?pQOA)u!ZtE99(pEZG~9lW*wR>D@;s@8&}p)IK^!Rj z&g&8m=!oRn`@$6A)9WwdTs6f&699!u+qIc*z4|gNYxPk-il53{vv2Lz7PM4S{Eo)W z>jqg)th<1q!cNUBstZ(zkyN`kSD`kHeTDwy(LGBT5Mb|>i*StKH^p=4bM}CBpa27P zg?+s~o;W|k!xy$-lo}FY6qZG}!4nB&tvH8{(6AN+xaEA-0eR*^i5JUlEEGUp)v%Y| z)>c;B1-Q;2qBex>?HXs!PjKqRZ9Mbr7M?qG0cSQxC`VJ6X$>-LWupKJ#aQTToVqZ^ zKl$v#`1^nQ;QKy*>Ku=m))urn&dh+KMK=?)s)$Bfs}e***H?#*pQTbX(n^gAr8cxy zqe82Vo>nJ%T5tGIU+eXrR^d}9wc$USRH>ALQVL2d=t85fb?KK1s?aVH0J}C3gIa+n zEZZ!V09BFL(sJ75_$ zAT|KkcF&xtz)YyhDHbok1n;=@6&NZ$UKx}i9mtBfQsOt+e`f2&gg6qmP_QD|b1!*E zk~cZ8T3!Vk7C#Z&r1*wq7E-~^4;_*3Tb(B~@bE0{L-=y7b{rAqPF&&Tby36)2-gfPkqX%Ai zINtAJVxI_Q8K0q7db2piu{=*mLW_N$-nqbtP&NfOvJ-~3@^aIKGF_dU;G5G<-KHX0 zjGZP+5Cq`$&J{HN@{tqxt;e3-c+YiL(DtN)R?6o+f0VRP(1u!Z=i%izB(o7rv1S8HAC;4YA9C62oKn6z&0_VkG4x1fnJk!Rt zyi9n$lb(}uKuv)a0542R2RTlGUvpWoel#`Y7SIL_XiM=I7)N++`(?iQC z^wgLkDODykOOPaFK3}E701ONiQE8a*=;jvAloPBjF2D~|*;DpxJ(Xf`1(cORIi8>_ zE7TPLvNKRxYkM$=0!X_{aQz)qickX>F7&Xc(D?k5FXEAn3;5aBUVY+6t~vP8gM;4t z3j!tvLsm2b(yI`ZT_zf5nZ!&~3(w28=ki^|6_NA#A@)8_&>ay#2|d|#igvU5V5fb7 zHjeB6WEZd0HHHjEK`3>h@QKeq^ojKoo4~@*%1tnU{!(4v@V<9*cpetc8-{X+=ub_ zdSv_-yWh6dFQ?b%%gIBbyQCfy1b0)KwRo`o)O;)GY1|SvYrSRzH+F>%0kG*h3{Xdw zZO>v?7NX?W0q5R%ZUj4Ud^@cj&%f0n_RQGO0_jAb)(ZJ#YS1ed%D2A!2(H>U#Aq~z zE>x(V-`EOpYaJ5B&@lN;@Z*iAjh$;CYWy1;lwuLH0A$xM&OV(X8mBxP0^l!%^hevm zF#5!}U@H9bAAJQEs_N!KtI{n4lQ(REIps)BMpUi zC41ipj`)03F243hm%6$I4d&0q>d4>6-9aDAgyhN#AjKA1GNJSij-8>R4Xy0#lm^kT>Wb~7eW~QjkeWSa z3~P>n_D`QbediMwN@zu>;Do3Ke(=gmarK~o7yzKu5TqOs+hMe^QM@RBmhl%3a#s!7 zQ;Re?!#K7*VK(g&T$4=i)cW=N_T00tU!bgNd;E9MA=Z6T?Ebooas9_1le}CMICl0N zp1Lr4uT})_R4~N9`QVyx45Uu8`+KpX6qTFXllMGvW(x*DPr=Thfk8E(VUGeIZ&x_8 zxs8oeTR6X2!b}*2viF;*LL<2oOSA)t-^>gcgUgrtsB43NcJDEK;ENBx@5?V<;L`97 zeXYu&qT_aOj8+s;sR*0?AR1*qrK?ui{o#_prAj_16~WDRhdr5z%(pGGlR7`?UoL*z zp3L^(G+)EX-^t)c>0<^A8`QNK0*nje`j&rx=U2de4HZ;%CcI$ysmNd)!(Tf)MO=Y+ z0?ie8GD3g3kH7h*S7NDO9IuTj?ZF;?mO6@7S7@94O}@{-rLFuU;Y`g83@PZ8ur6$xGU?;Fz>+o%>4&4SpmuZobeMm$PT>dCt~{l=oks9|3WIyHWhyA=H2+1r*Be zOf^gHf{Zi)65EVj_efv1Uc20V3YS;f&KQs|3IaUGr2!okkyHzV!j1Ro?_6ETsbU#A zji4|(b4{hP73k!@ou*KcHB#t>!oeYg(tsK4W zs>^`M1Z>Y7wh_dUuzm@MtP?o)BP%b`_*1G!SR@Sb;|6fcBmaWK@Az>5z@6X}bPK2L z;N$p0VwPzKiF8VZ9_yZh6_JkpGQh|SMH;7`TE{=X_Z#;WTKUUFEjS2S#=0?kU1$qU zObti*icV4*7}C@UW^@741T3cDD~w!bwzElDmS=8+JLrt>v-!8I*tGbl2f86*LX0Fj z%7fG&iOks_Uan-Em|>8Y(t*!X5tW*--hg#8 zPM{W@B%XzLSs4v}Aj)@FkfXM?=%`gg9fBT@{ETuN(cW$iTZ1-2hd~nn2`SIVHLv~d zlc!K*7@}sN3e|CK3V_J#e-aLr-AKlc(_yKl1?o%>z##d-UA) zi(|stLcb^rU=wW0tR~4{-(Q3umwjY^6&S?7_x$j-DT)KUZj{T%i71r~DWh#O5?*FR znejJebawTYUw7&IU@E(;-Z{&uecOGI;5^Z3kzuwBvAio{R?Os4OU+vzP)m#s-9oLJV#h++ zDdIM#M9$PT92QYf=cEV%>dfjQWDCyLChDyzt786JDU+*93PJvP*I3bM?AT2ZndKcFT zTSJ~zPFqX;cT@rt<2cpRQczxe^L+s7h5@$@oro}+Og5K$3&(GN)wQ@}{~k=rF%)Tc z8=}k0fx$dyFRCqEjWJq;h2k`MfF^Dmv(Y+yQqdP1|5A_hHiX#FdHwvnN4W($L+|kDhZH8P3 zH6qama(9KX;ry{y4M;BoWSUPj5XluI!Q_;j~XC zHO`zK;oRvGTrspR5Dq2)g+8M^q2w;^CF@MtDJ8dGNhy#f`%wjI5XNkbmqo72ffzgS7O~ zMLL{Lta5vs=hdwvJuVZH%k$K^Np0&SM8XtAL&PzUnR=b_dPutG307uzZo(!$4fkNS zgmi`~!2{Cc&1z3+5M{4^r?EzX@2Hc%&^1pI5juP&e0lPeIqb!tG}e zn$D?3gwgYtjTH@W7_EjJ9gpt_gz0#D_~s**-Fo}AhftRj0bCLJ;f!n01MtR5@Y92+ zq|THnkhBUm4u_5qr{9I^5@vP;LE#U#^iT01q@iRos?lK?$q}(uvL59B05Z zG|q07_=P|D%54S)HS?<7M4hdvZ|g*@vJ(q!ZruhTq;LUALt2A$Brx;>D>g0X^VJB* zvN?So<&^-Xle{?SC*MXQ5BnK1u*d+8?pYiiC=@2OT~?RwJ&nu7{c2&m#?O@ohzBZGB(> zH4C|XJ`^bG-zXBkVk~mcP2u57mlD4ehz|8KupHk&K-JF41zD0>? z0$D~TNb-gMk{hl(YUWfWzw^WODK;Q?4li_vwpl+GMj`;QyiR%N5KfjN!f1QDJTMsC zd;6=d#euy`7>}p+Ms?#ikP48+z9L@lQ9umxRKZy177mBL(biEZagY+_;Sshl_QV2& z3nwSZlmL=zyV%#>In+V!q*9jk_32{%Ec0Rj2AJvspZUr${J|qn@`6_DY^rr4lwo8! zIBXK^Ak9BxR8UI3ogw=dBQwkUBr1 zx`NNlu*;$Rz7rFHkCSXBf?-0%7*1;pD~_KjV^|rWVz$frELB4Sp<*6hxxD!Pm4$&l zR@^r&M|yo1C8W-jc71$7Yn0O(kDlK`#f+X?jumwrMNr}S81#<)PUP(utpdQg$pq)8 z(_q`SCl$_~9-*2tNNcy$-R+T5-Z>&Mg+>Tq*3C-AzAZnN2D=x^S_0)1>$EoLDZ+t; zKF(}c_;+7_0zd!x2X6hH$Dcj%#Mbtg#>}@Ag)Rvw4fC)DR?-U-yomVI6(g{ggHCOu z<;^8Y9r_?9a9u5SI4OBimRqw4Y1)@PgstpVSRc-LEe)o&k$x^N?!>}h0 z+D|$<#S8Ykib zMqGV`Hq6KY(>32o3*OG3_FIjdf?>{TBYp)y5Z4Clx-rQLM}p#X9vdi&8KO2rHuVbE^$@iOt8Nrt zVWnnXtqiYKwOI`x!)q1unlU_N!!T^`Q6j>qGG=vI7au>+>qC*9SC9i?5)gUP<6bHi zW&!((aD4L&PL8%eWfihD8hI~Ifd&hc7L+mopfbRu0@x^wCk9(vcCVDug{4R-FzhGj zdOyNMj;93p&1HUs*w0AG!6-S$V3QaqV?Yc{nJ}&y8jO`eA1{;>eB`T-;^#j9z^%Xa z_%ruBdcGWOGry(iDQLnb1KzP3dO7t)wH&9@8dAr4-jM6M_`3s&(WrjqA&wc$Q|K*pz2`)6Kn%ZT1Y^)skkH9pEbH`C~pyd#g()f9Olnf;p)8hU7U^n}iaZP)>4 z`Y*|A$|OS6r+xRK!2bDCyY#!50OpuBc>c4DvgD~lU_J@CXTd17jQ~YG>hkI`c-`!7 z6QWK4D6@U!J9?|Z3gDX2QLSYW%MRc1dk;N@dQwAa zjoNJrwRDSvi+zU>fGiS1@UvF-t{NveA&#q}W1P=(znvqUC<8>1O~gEO$oQ0)#q|bh9uZr$b$}LflhMhP z&P2aTy%UjCo|}`?T-n?73K$iNPB3`2P}oqQQabydX6EKNb;@>@RI~(2XqGc1ZSCKf z4bO5g-cOP-uQX=zog`qQZkjoMhD2O~G(P>@#<9Dfc^-QQ z0~o{5ieXHR6|M31YpyuqCPYgHhTb@$#WpnA(BymTsP-&d)fUlx&6hg+`h{7j*bht1 zSR*17nvVKY&Xh)JKqm@KB?z1D?0A3~wLws~DTtyW0jSvwds^ej(gFsX8Wju*Z%c(u z^|mpNHj^vH{vH+z&s^BTGh5}`uUZ<~Rq38?#fg5+`NxPiC3===W$!cs494XclSu_t z^qkGIBhe~2M%GvmxkDxbaH9l-$-^k%?g+GFhYV0~&B6$A)If|WfVwj1E5^ZLfm5R~ z{`Gy2;`bjvi66ZB^1I%=b}7~t`fuOc>wQ|WDJxeYIoKzq!RIRn$-O+b#cvB$wi2n>H<4HCR2=N>G5e$N$w zm2=b!!ry!Q8*y-X;e*w*9D-Fmem)1m4x{XL97Oi*yiW&gkwDHlj`Rk?EK~l>=i>8- zW-%(rri#qy@_lknN1#EQ%d%A!XGAAk2Dmd?i<1$dlb0hP$B;=uNM?PKk~*+mBQ6qN zrSm||qw+)j8l-gFoTN|XL8^8_8neyJG#>!q4u>kIpz~eR5;cI4FveaOn#irah?&9V zBR%FcO+&g;44AqD_Sv^$WOMeAv7jxlVOxz`Eq#nnYEyw=OoiKy9=_uTZ@BWk|K+|% zvAntuW+K`_d9Z8My;tSrmAGHN1tj0Y1)!Xj8@~CMF@g16+~MlfvH?>X2ML-R^@b3d z4i?CS0mutFy)%%#OJcD#(y9iwb%B5Rr}yKXue|o@8}=<6DMuq{T{w+Q@SHbXKzG{7d{MUd=eugYE|s|mx()a5qlepY&|GQ3((`RKSd?$eHApnXpznlaSD8$BW$$>(l0TF%;0qR@hFO-TuBW6VVKZ%9oYq-6SOZ z;uYfCoP+9Pwpa%xj@8Y7NgNLzrHPnR{KA8{kE2s&n}WJo}%(=fAUNq4GFG{*85 zbz@RF;>`1d;jRz2~^_=bWym`_ISl0+-y-Qsbajz&s>OE zq!)Aq4Q%8VuV8@!oSKlc7)@F&o+xf;R$wucqz( zu2!6nCPtY`<#0Bfkf1QI$ae!4Uv*&j2e;ptq$Fpd^5=~PAz`kJ*dj|?9rxga; z?U8~7sQ&ISKPyGf!Ga>ULYLfcBu-Q^OXX&_{AqT`hjZZy(5^p(j>9O0dz5+Kc4_~uXsQU@Pv}Q12$j-UU_osM%_*ucclcxSv zYOlOJ1(O_fK&l@o6~`>(AgTEnfIHC;&~BexRWtt4fA}26+ZA|e0L@d^cTFHH*h#-K zA>>V>EW0O;NJBxP81(QD{`#A7$)1IeRFiFZFI18rzl*2LVFpK5rAy_7y)+#xq0noE zK4`PQ5M#!UYX!FQ850UUW2yRch`N>MIb$!Yki>%`xXw5Ck6`(Hcx7~2(rP8u4Nwr7|fPT zR|g3wNwh6900T01Z;2*aqn;i?VPl(t3lqNm)M)(Chn_!!V`nbl(bFZ?%Noy@H8v&& z+r~fx7?6V2_J9b#+6@Y*${G)zei4(J0Y&I5U}d2=ytZfX;iLN(@v;L;xO)F0uGllg z%AmM&WjOrg>R|Z3$IgwwD&9Fo;Xk-#*X}!|O98=*o+dnXeuSqllpnZqIQ)49d-<)k z6T+T``g6o0mNTUSjo2`*+`D+s;pO42-<+O-DHZ^-x|2x5p7KUe&S`>jO90_b6}j#u zXpfIWJVH2JMtt}CsG^*Nvpy}7ic6V@FkyfzKr6=TQV$gqKK0mh`0Ud!;?0LIx$hlU zUxpj@E*)Jg^l>jg40}QzBQ7(9;Ej~2Fi_(ShUg>dvdI?N%W`A?%-h8@a_euI0|WM$ zc!L#avsq|`-~Wq8`HS~H1R4&2dIDAotp^0<{mHeBr^C+>7DW%+=SuwGn_q|T|Bf5q z3uE^olM?l442Ft+>B?&Gqr=JR>gUN|FH(${fb#j(YqRW>kd9cH?$2bPE5sr088#ru zu_&g|OtJM_R+jHTgZS$m>W0$H9%R^E#+wC`XWBWM{hmk;>b1n%VaAwcJZgR63+kp( z0GHV_RD$S`F3C3q5B^!c{xRl*?$(?|utx;*0!mNSj8Xk&{?YKy6F1L4Jj>$cIpyzD z@Ee!mrCFySH|F6-ObJ_+x#iHF#Sgvn=IcKAsYjp1bTUQJD^ME~I|PF9gLkDQmTj$d zQgpKcLpreztZRBW&p3dt9CH%T(tBO1_Pr>9mX;0}szAb-NJN%k+)G6U+pO_RfAV#F z_tC4rbZ9Vmt(lCWiH7jYjY8Xbi!M3aq*ro1@g0&;?l$hu7j^@@fyf7Gt||W|z*0g} z;Ni|?O2@lx!hWqms&Ed5 za|4`tV*&~X)|u^Th-PANrX1thb6fc0Q!k)Gjh@z69rkf_b@}bDzWe~5A8%uktnO8i z7x~J%i7|VM+Q=|4PzBCR#yEcV9KQ3C1L!G*S~^i#h~o}XsVc(8c2%!jzklfsw;W#O zKYr*1Tb3>W<+9D`b65b9 zEmRG_)C{c&tBV6L1Aq9`^Z4xg2Htkn<;Q;Hy30=-SsL8fBPzj+ig}HI5jmM`=<<|P z4cXdp+0t%hTvR6MBAG{J3=a)63@eN)v+~RT@pEOvJff1Fh&k^pH=c%$|>OY1}`I zfC=0SXSgyvlvCSm|Ev|=*G`8@Hl%F8(AMrp7(*f?f`Arao06IW5z8Sle;`}RaUk{; zx5Osf%#rRbh$T|G2EDDajv|^VXLge&xjiVevuq~LHZ6xR4@!t2DP39=jQ+5v`IupY z@4x=acfacuM?P`KSB{~-vJ7L4i>;hdF|pJ{^JY|J4hNEQg?Qy7O5FI8%>qY&3b9lx z-Ic&eLiw*0digcwV8&sNO0oG?)Xy5!c(Pw&ODOM5jgne|x;h{tX4vCXxbUN{6@Y;Dz0;b(TvO!;!Y` z`K|^=vO`=benw<3f-N<$LChP82NVoOixKiO6=Fu0ccLYT_U?6sU&7g#MW0o5O8+)J zJE4smGRoa_hG!9kcdiPM^oVl2u4V>m#+p(zdaj(@@ylO5h6guJV_(q+*EL8J*f7+j z#y|M>>v83<|MOd;G0?*z+}@gDLmCVXfMASUey3~uEMOIK$5lHn zGuz*$h6b=)DC=Y}p<;sz+uQj3liT>yW2bP<<;%G7&?0(Z0LnTkq0J@ARH>>V3#2t! zoBG(tbv(X^gh`qwLUTRiXYIFIm`TVK4ni*r!+kF zSW4t8XTSoOl?C|UX=@7;4S=DEN&?D$q4DqjKt!oOts zCLF&Djmep_c*k469p8J?m4{JRFmlu`KU~YJ8!?cz)2v+{+72in$vmNh;{ZuZMmrSd zB_@v>nlD@F(~2*Uid#pN>{<4zgq|k9KS-N1l}@3Liy)8TRp??tKKGeq{aF;^NTW0V9;M@9aB?R3n0zCCFMi zav*Q$U50sfGNt_|SCpLzW|X;8c{IEK?b7M6N!*gf0Kljza?yb;6|kX!6AIW+WKa3a zhdFZbcUVps=ZmP@?kbhkE!L3&JoK}D$uYD@X-FKO7AHR)1x-3yCt=Ji)IVpljs$O` z$d&157eE998XCe1X&Robs`veiZ#@3?yH1?M0jxvSMGR2knxVp>zQz)OdTKDP7*o5{$|-CDX#y3nfYh6*j1PesajJOX4Anolf=WCq+RpWBlfm8r3R*vGa3{y$%P z0`LE`uYcn1^$jlT`sRUFn_zacsxEKJnA#b-1|c(YTV6{E&6np1(-LEaK1wJwVbIq& zJ2CJ1$nV~ZdZBNZ`6;&))Ad!~X9aQ!na9PVZXT2ftTosu43-w~{@Y)V+m*4uX zS6+qj_SD`;uSf`~$is_-7y(OwnD1B?#l@*oj>~*voEDYh6g~-MOg=A&kyxK?QbrpM zl)Q`SZTbH4HP2rU@TBO+=Me~if_Vr4p@71KfPeHS_hWNvey->hmK1MjD63ba)rH&! zgF&%Ad1&j+a>OnJv7EgN-(97{lA5IBr*t>ypb&&qO{qy zIy_aMT~J>_D<%pf)^I%ou1IYK^tCQ&axQi8J^8+-Dy;@#BB=0RGk2PvXV#6o>Zqap__o zJ%*i$sVe|ANU_7I6nJm{DlloV0@!&3Lr*I*#eMgExs6j9=rbb;?sKyg; zJ;iiVq1>)PAa`jmx%sf@pm?JZ^-Qldr!H)PUH>wYSF&FO6E$)9W37*Q>9>&6h7@YkM2Leqqa2+J3yCDgv|uY0;L-JA+=X{q9wE)UtRMAzvb? z`QU1p*^!#B;eCJ&+^P=3)DT7!gSs*}&@b@hnG*l=-QU3f`!654Z+*1=8%%)4e84ZL zB^EkK@G?Ju1Kv^1WT%m@$Vl1<1pVR zh=#FFZ?A{#trG9J?c4B%mtA?ZuBxF)SQ2f9Z?B-MlbS>YI1m1BKTILo5x>&mTQS&` zP?zgJ3N>tPqdccw+r}=PE3*>jT-uG`OzoyTks&ke!4%2hU5uDul7Qu!^mdXUvzzmt zt~9woU%9=?Xl)iL=d64NBCY6ialBFVx4Z)I%aMgOmVmm+K&Oets8mAFJYmL2Xd;V= zflNVy?y{D!MM^Af-1N!PZ<@axA7# zrtTxv$*+bzY@>#Oc%hy!%z5XHLIXcqNBspne&Q7V*`Iym!;1?8XXKsn$+%#Xra&&K zZ5Z*(J7i{8C>nb5FFRy0zKRMZpB;{QrAjB{DM(JbUruF%T~X$oxeXvog4dTid()kM zw#jXb-r5uXHWZ;$giZ3tLC;d+IYX$cOPKwN?9DNs+r^%QI>7*nA(H7a9J8H1VugF3Vch@sq}Ig?2ZHttw#_#??x z(EF6hFG&GlyZ36$z|&h>I5(c$tQ8567U zH>uMU9jU~&xZj2iYQw|2W&nh<+tauF%TIhBYFI!~B`l3sI!-$@94Qq(Yo2C5uS!UaA zT{cVV%$Z`+PHKzIZevcs^Zt9&Jj_`h0BRNymi0FhATlFlAZeOi;WoT0WxbU~*(M}$ zR)gpkkw~5R_?J`p@n$%y0-`nNvH%L6UKDCHqoCk^_0y!p}xogBZ#7V{gr-4+D(Cfnw>{GNWd!7{+Q{*ZA%u z2UmaOl~+AVD!w`6}lNhTJgdlTl5u|FTg&~cf5%4sMa@lZK#|(7{ zYA)mz>4DEA)9ikf)d3={L5jhP1N_$KzmCs5b&8jUgCPg+H-RH5T0zV+Ekrs~96=FM zxtkk7=0)W})GZ%H#^|z;tEb@?w}E#N0lN>iyr!h@jt!lYP{jHeN>LNOG79P z8;|1Ws$<*!shocK*MB$6Fkn=Sm6~~|U}u&t7<2QVK6CoS-~Y@vj{W2xeiQ%o=`$D( zG!6_GpwP#pw$7Jbmgs}Ng60ZH!&*_pndc-_@U|IQn(MK#?<4Fg@c zzN5W&-$z+QCJ;IY`$M}2y?d$mXgHLZvNv$Z~9|H*UmGHl#9LoXhz*8x=`4?)+a+G7y zKf-K*33{8IV`xkbCc?k|^w;h>_2e_4LPHs2`QZl;JyFtzI%mr6L-)tuD_1pxq9BYf zoWqa3>3bAkQ+{0@cfj{mdEZaFj~f-9iezu-=Ona zoZGDARMb6<1f;7wnnkvelpIQtZ0yT&N~hBy6l+ReqHtS+l`jX-U0e=tnodM~O6g#7 zR@r&rO+Ko+Q`pftoHH~w{mJjH!?kBGI=A!syDu3d5V$O~+L#(1F7^AHx4+^VeDc93 z@#47>{b3(w>KF1mjpx3n&FCGpw9QkxStxS{0^M;lIc>3-1SsOz;!QK3{tP^7mA5wC z5|Fa{Bjq+u@%rPNQyP7y)^KYA6f<5_!2j|`U&UQN{rxvDX?<^PYJl9fXp)8<2s3Uh ziMPbCxW*G z=O-05D@2450Yf4?TjjU&S>HOgQ)=Nw#r&&|=9~9f@_q-sa`DTI1p)p8bANC ztML;@uB6e{7A%lwk-N$&H9y~yS-hM_Ah+59Fu;nkGbO_dlls=Lo;q{ae|X?2{K4a= zF$Uw3ObpDDhoZyKog@ThJiv|Pf;77BA~A|hFW8F&k%ci zeJmG*WvZ~ZS75oPv8O1osI5c9%$OKPIju38)Hpw$;>>u07e*6oOr{u37^fyvOs5PJ zyMq(oeA9W9SV}Ef1!{t5p1VInt6+nvZ;TJ-m`op*UJ}UWG6C> z6_K<&QOv`doUkX#SYZddJ!HoDD3xJQWw1{XwxRG(zVHanv)cIkHyvIqz@>4U?cf%jrEgUB&t(d+Ztfv(Mgt&p&NP{1A$Qj?wilkP} zAFa{bqXv1U^x3Qo!XqI;p67GQNCdx*gv>Cuhc-pTjpw!{c>~OgU>?COHA*OMRYqdg zMk-xN8pkiKefcF0#_Y6gS&qWB>yoIK+eYgoeBqYAz9ozp^@g$SYFwO}vBqHZiPn_^ zK$F@Gzp`<9^pC!J49CxxxN^7$)9DnX2o)*RL>N>xe(uJr@srnIxmu34Q25@&k#1HU zdk8Kj2uIKWEAH>2)(R7Yo1Zu{y7PCw_5^tn-1>BD_8d5x&uph?CYryn#zFd$?+Zt3cLaW zSZqXLdqU+9%!|y7X?(g?M{g2=FZMXKc zzUO22J`J_JgkFyT(okfe$Otx?I8zla`gM+$KZF8=aEc)X43{`s(P7EuJxaX9z3hND zvmG2@gWymxGfZudu=o0DTr)Ij^tHyXeC}Z^_w?vzUVbGpCN5Ks7L+;ZXR=)Y#7l=| zYiA)kOpRB;21%zXu{KVJ{EPp5&uynqJO?Z_(^adB)np38?wXcd|GH<)(rNS}>4$SNd&ADQI(yofmG7{hor83{2womqLjYu* zsb{2Xi~TLqZ6U*Ejx$N#6;8M96qgcm%s($c;NG~;%D<90A*c4G@gvEP+ij>APe&x3 zlK1gdifOuOrTOlm`c{W_cFl_%^YAT2^xuNqzQvs*2~ts6&=_YG?V5Q%I#3&iCWXKL z>KpOtyj{Iq;Z>cgSxsgLD)9ND9J&Ef)n_0PVEH(hrH|KJU4v{h~g z;}XsEE~O_weqXRUa$@H@nJy|cMs4%=oj-OFeETQTFf)Gq`&UqBAdX}+mvc>_?IL*a zl018Olz|FSj_m?6;w22W@w@ftrVDnjq&7X?|5YWqrdj} zI#i)?>EaS5(+W!YlhFvvHSiB!em#Edx`T`5Xk?u!;TZbCgm0ZQ6|^S&U2_7tPBdQE^5Fqrqdc)kz3m5`Q(-cyWUC4=3B8_DpngT^$J|I zcNsTbwuY{LRNc@#tuRg}z2uR_q(f>1PVfDioi4==Xe`I5)!Sa{Qh{ zd-r^3yPmEjN^-_Pnq!TfxHZ(G{@zndzD2B zQ?1SHzGXV0E9`hc!hANWt-V7I90U<^srrA{aFHt@Y+BoXZ3kcE1AKC&z_;R%ka>({wO&rN%mfiTMiwhpLy+3{=c2L7hKzsKxR3f6`ddNLr5AD zdZXu**wk>Hl)%F~UkWZ=s%Dw<1$om*gW3cq=INv}7MrjorpsIrVM>gD_^H3ZYu|s_ zFC5VNL({5;9gU~hHeJgLl3Aa~d3j()KEoSn;2qoE7tx60jcpQ7v}1Q}Gs|i(ztuCf zPaII`o~&&;BJ(R=QC`TVnO1>HfKM=C6@Fl#ql~uaJGx&pN8NTx3*^n;vVhj{Px4pl zi+OlUU^WQr*24@}%tXo|yHR>FZ1-FkUZJ8cjV?-0qgGV*h}LVvII}&y{d3Q3-1#fV zp2i~=M!00pBDe;|hC#}1_^+poRju$3Zn_#jc=f@>@_bopcmI%qKX5==uWrtZZiles z+}D~BnaXgBoB#$585j~!)}W)$jHmbfqdz~6-~P+TutYU3ANBxdn7R)8fkYv$ofViF ziWEQwm0@sQqesB?%ggwlt1rj*U3)2Bcj?~4ePA81lLD1t=RBwY{uO`<1XBY{##Na^ zeK_=CuQP2PY#253a60CV$+Rwqq>u0GEdVt23%Tw7CL{R~wI5R)dLl&O8TK^RM&+c2XbUH;NrUP(t*mia@UJBCx^38=48kll>t z9VKr!!ryS7JODDDT0xKhzyW#(;F8L+<6Lw&0Cr0>qki)8&dlH%U^aF#$HajEhC8@~ zfGL1N0p)mtfBYxk#0@`s)0eL3sW(g}6$(GIY1y55} zr%LgqxuPw0v7vM2yA~{DpLFIoKPjRYwcs3Cem2cEciC+*G6_qZ=AzlKJF#1!=9vTu zn9IICDTtByPhx}|NL);xxM**EbB4@k6-J-z-h;>^pNG%XKg*WW1t-cI4`F$w`I#|FCadI)tQ@Tk(ixl1X4hN5 ziDzHHFa6P9eDGs`{kuOjoo<1R0V#zrswWhPT%sTWM-<0YBK-RMwq{Rf{$|yxUDlUu{xn_Iy*me)vfJU_aXYZ|}ZK(-K<=MeHV%urBn#GC;_2~w-p*7K0qpY+!@ zF4*1<;jQRvxz04k>`LcIM<^z9;Dy`c`O;G!$>oV%OSRkkMRIL}`_3RJVt3#GgNSc1 z#3h(P;F1(jvB7A{x18FZ+;Pt{n@9i4)6e0)%`@1uuz*X4LyT+7d!;Hnb2F~-+P%y8 zz^ks>c-6r@M@JX7%bwEF7?1>?@e#8@PIv;EA@oO5FEOhIpaxbLyr_vbwrg|iU%YVs zuK)E558;7lU%aoRW736md$@v9CDGZwYRi(6y-xAo_7*`B3OUDhjpxT-2>@Q{cAtxFh# z8tpp4>p|jpx0W#st_*5Lc+YFDqHnu$g@5U;2l2)A4b%$+ts28V!ilsNEgs;4upB!p zIS7pGM&3qvP3#Ykh=->{ISG!FcdDFiwaZR(N7#6Cb(f$y@)$TW$c2 zM*#5f0aC~=s*VJ(H+N!Q{gB-BE0>D;54nM#2&^8mLlpUb)wnHi3cXzJGZYh&14B8HD z*ln11!XjV~VS_HVy}U7$h^Ncu+5=UZ<+Pxc#?xkznU>1ru^5#lJZ#MYjRexof@c@r zY-Ym3!UFvIdO1qomRA(;SeczF&4R&1z;rsrXf#Sm+7X{cCn6c~Y%$c$vIz^rAr=+} zsd1kJ4R?9+`KW6irqe05wnk!d%yxbQlrUV@3V7Md-Wz}Hrfc|fk3S1z3`kR$tqPSB zjW2x^%A@$Yw$8$c4w5pbSq1irrK_%?$F)d_cbZ~e{!5Sm50V>Ti=9DfEDUUZb(l7c zZmL#rIg{~%%tiqo!r-*qG*h_#~6=C2q(-$F?90W zA_Nq;))~@u=V=F6SXjVdFi5kL<&ZD0yALhA()4#tJRu$qb_>uTNU5(!f5n?ubw*duFs!3 zjW3@*hiA(%7JC}|mj zuC9(24=lE}MvXRV9gX&gPk>DiRNR3Bn@aKKMy-C~Hy=Lv!C(2y$8mPNjRS)|OjWx} zY#oot(&crBAwZFVQ3`Abs0a_Na5N zQCl!E0%IsiH+5YO`#mf!Ew+Qi?5}qvoYS{SWXph3>ubwP=)bsu$}qI+`ym}8IXol* z(j0XigD~j#@ZX+%4vO^K-}AB~|8`$BegDL8S!lZqQn@qDJ=l-+@v|~fGZ|P}?H2`# zLZdP@UU_hte)Gq^m3Qliu!hM@J`R8q# zUH0ew55I&jb)b^JE{<{W4LkcPohi1A9oN7gf8!*6{N)Gv4Tn}~TusZKE`q*G2R<%d z*RZH0Gh?(hf{_lDYeTJ6xn1Gr|NS@r47@!B7JK0xyapg|-XdcYlOAvy1tw};V7naQ ze|`5mam}U6KdgzN)Pi$(Mcc7(L|UnqxzcC(DRu@YTOG zwMlJb*WeVSsqO%ZdFCDO>$=8xJV9O8VJE>()^Aphu{$>N@YtuuGo#<{V{vg9iSy|ij`_|GRV+k&iKCDJ?96<~gyPqn zdI795YkR4r^pqSe zjnZ<`f~V2}8uJ7R$jRCjvpccq>PUrN_C}y}UB485QO&S71G$unCg+$SEGh2a4E27R#7*mC_`p$1P4bZzj8{rm6_Uw#eVc;zb946v!8bk7lD zWZPuGQ?M}%Hl)ve^eE%8Q7steum?sJ3Mb3zOaJuVhi?6Yho8mb0&t)J#&u;KO68n6 z!3L`@tSe%eFr6~`T;O$=t>SOJ>JYx?`h)MjWTAg&J)W+OM&otTdQ%nF!L<}I6i_PA zIxP9gAP2L(@2E)H)4y(ZHimqZu5Gw>@(;b4|fw`euP(nm*+H$h?Vl1w zy6EFSeCEFUzV@}ppcV&Uo}xAitdzS%l@nd=CPdS=WQPct!2~F+F}|>c?|9u&{Eaui z@;0p~IGet1p5F}{-3T1zWCwPnvvskc#6GxqU0F5Tph=F6M@_mqY#yiow7gIG(n=Ra zyO<9)&gE#d$?>~goqZJLw0EmIK|DB3mK@4D0Psg-M(D|*PMpN2Kze|k?3Txb1PrJGXEx5@@BaQ5 z5C7iZc+(m&HrOx>aZ;`=dp`N2j_>wCYD^Mtg?BTSCFFLEtr6aB2#(oH=&B_7`;xo- zPQ5VQbp78Y%ss@{A?Ldssf+GWdpZ`SNNmoGpHYc^0Iu)X8R%Bn~u>LIE-cQ&*hb>Y}5=&;D*B3(KpTq3a5-UfGYIdF?g$fg7(lygcY_Y;RA> zt@GQULa&ojU|?vN#Zlwowln9%2q5VxZP7=*K4Hg=RrK&9LczZj(f1Ad_YDgDnrc#o zBlkFXV3D7pY>9xKun>T{ViX`eKN{n|KKd+f+P`$-=KYJSqwRXLC}16_#y%OuyybUT zJ;=3z(e{ZVDh)HvPo_7&YGu#jzrX!8NB`T2jr%_K)hF=HQyZvZm+LAr(4?W5z|N*w zJ*}c=g7^#64adsQ{KaL0Fb2eoNd z>@}Y_v}f^shB0&(iN6FZ-yITX(%XXCV9@X3nT_*5`;q_jC4dd6t}N}Og`H&hfu_J5 zmfyXAF`yhj+&;hm69yadI58I(H!mxSX3Al@s*39%_;$@wXOjYuPM&GLx+%D%X_lqO&Z-p9Lh zqH-kUOl&$%dB+s;ogMkd;U5a1L!k!ud-&{MK7xOB^r{p8^S50?liCc8;nI*@I<;GW zrAucA0M;pwf==XO#0_J^;LHf^F1%y~<(g=xQOQ|rmE%K%JQ@T04s0>(sGo8Gi|p)F z89~HL5BX9Qa=(4cH1+}JqpEEcxX2)U0WgtW;>B@f-qAW#8YQv9)R?uhGPjn-yyf{( z`GH5ykMQTG&f)QLf|H{OHYO8Xm`tIWF@V89F;Od!bm&dc;{5CWCFGFqj$~9`39DjgAZLYSop-r zt!+E&B4Tl%55aM=v~kGW#<5pLpkgc+8c&`*hd+Aa6xLpK__lpL^~nlw_eOcLJT)d9 zfB_gWcoz9!Pc8%iE)@ZNQpalMRZ~@?+mEc$_a55+mfwHm&{KHw%y~=zKm$D( zkel5CDd$!Z$SqX$C)Y}~;e7!hUdMni`;<9T!hy2RReT3_vz#G*j0f+C)dtEK^pwH# z=eO{{b7$Ul)zPJQk886=pv|`aJ@?p4Ymh4qeB%L78a-v!Pz=`pRs^N~s*qe7 za&{#SQFcOcOwmr6IAaUGf3$`+ls_wo;?jFKsTn7E9|jwCQCL^#uJ?TQe>Q4Lo@Q8Y zR*ts(_)89U%tAQL(r2ZZvyO?b=*H=Yxb!G z76EpNY9x+J1~fw5KWzE4=dc<<9B^ebA^F z$yPcgpoCm;m!*eY_52#KS(~sJ@q8f|SBExZDP!DU!gyF`N9J3cZVww2nNPo;Oi(6r@RuUvc>GK`6c(<*gZ|3J@EowzOwv@ z+pk_-rK#Dp>%TJF=0x8fu9G*TBhpnkUO0i0208Pjw+|0IS_%s6F-=cJ5WaMq4ExuaH5({m*b5gfK42z zbw{dmWk4_}3}al?IR4yus2dfG;Wa3`)U(;Xe(7pM!?(yl+D`fGY{?dmnm= zf9(&xf?|0H#bPB2!a0hG=8eJ5>k*6DVJ1KspaNDdza0PDPrUKIenH14(;6TeDxy-W zrp)gubOF|mz)4N4KF_yy_|+@kL?kB<`|l*2?Tmh@uPp|cVKaT&Jc?Xb;44oM1!xN^b1lk(cc8(sUa!>?p!n?l;w?J?vB+ywt! zBere_m;tYvb@fRo{PnFJ^T`C$_d^m@7I`HOm82ux3zbnQu}sJ_7R<;SusuY8*}yeu zZT=aZ&g<%=p@Q_~)o{kG0aZCk5_3s7(_WW(>Ps15X!|bcWO#r8UBqt{lXu81*SGoe&i4|>v|C+9f%Rjb)^JkwpW9Fytel( zip(p+{Jl`?(a1N-6OhM8Laa~P6kc^Rq+>@6XhkT`kMPsK{aO6+&%E{L4)psUb)&*V zb|=V*!3&}On|&&5u8t4d+aiA`6_=}v1zoa&6stH#nCZ~8#ET@)SOYDbN>3K$4`f_t zgmRim#tBNkNhbqw2~223gr!v~S2!VmVdxrqBjX)4^1DJ?+i>>R z@AClQPJ$yC1zebzw>)xo>#on8d>)^F?lc}aeGXe}FaTlLE3i;#EGWOnLctKZqq*H~ z5vl=Vum)8pWn1gjU;D<1WB;!|e+-o|SRNEG6~mqy=Xl9}NQeN%AO+OM zpq^BC)xiV!zuxjPyzQEUG~FKI?D-3JkE#~(=LajqXlvSN@ykrCnK@2ry=1gh-?^o2 zL&I1Fuzuyz01H}SViqIp zH&iv11PZ#%)6uMYi=r0|7kUe!EQmIlG2EV3YXgnDfAnQX=!b7yTl?%&&z<<4ht~1P z*)2?K+dfL!LpK21&%Lembx3EOxMfBP!GSVKTy!{72)`lo49f(KJDh@18OHh17;ZU! zX{#*3pku|HdRDe|tN4%#N8tB*dN?+!{N+!48P)kQXx|WAmjG$_-r;%Hz&?gu3AVEK zY!G*{rS4&}RpNjAYq#UbfyLX1*gCYJvTe`jJo8nFtzd5hTizk^UyfDf!*TX;z8)a* zJ;Vto4A1I}S!jV@Qj}vC<19fl3tOLg$`<;t&FlmRlCo5}R!!U4j(2c_hOnwa)Pp3x zh{a|TADQj;q<2(Nwo&8k1UTMgcp;xbiq2iL?hT!@i_peT-^k7W+SF|=Oa7WDCL|BC z5|wi-+XK&xmKn;T)$q`)7+E)M13T;uHg#SLWfeH5f`ddt<_4c}-;K8{-L zm3I;`GbdxL08b}V40^qdAA0pQ$3FG&iKAb9Y#mF>eNhPJ`^ZQnAik>?(6p0TlluM^d$#!i~ zb^@@5hm5##rKOal!~pO(ME1^MGMgvJ?o`}%!;S;RQBNlHqNSPJ1|1ymZByWWW;*H| z8)~;V3IO_qO;QS@s=ncCr_UYx^#`BE-KU;MIjJxpV5kT~O>P;G!L$Y{w-8Th217v; zL&1RAz|;(KGX)3w16;kliZ@v#VhtMQOyQZ!z-g{wW3I&P_*e)umivGFpx%# z{4bi_1!VUQdP-^p%Xh7LW!s?qm9IT{?B9I#Nhqbz@7cXwMB)Nc-$w~BWWXSps>VK2 zc+YFE$KSd2=xzIY`tH$%5o)# zCjz>5HDC<;1rA@b>~sf44b*>;p<81U7#J$5%idsEe&SE>_3sWA(z0y922%>1c41xeL}vVEdPYKc|t|DBo4BS!NTkw>h#iu|Pf|AUzj~oiy2tHAl$f z1~3@jTLYoA!uhRo^QKFdZ~Lj&zx>3P*PllK?yM2z`hy=N4?Vb% z`Q%HgqB5bBy+T>G;bjSa?Ym~@jzGp2=Hny@MO;dhrhJ_&$qeKxkTIa)0H6H){doPA zD<^*DJ6=u}(9#e->aMpk+Bq zl2KPXc!j|csmIy4lE7s_gqjEsojJ!Jd+;gT_1udX*9Oa4V`-q=GQ1k5X0WzE)bH~L zGwRA-SPKS*q_BTs0axx_z{?IS;l}-oxNc<+u3g@9+Y;%!D`srh)e0GG5@Ay*wc>le zC#^9fD0Mla&XP+13@a>l$plY(cvb8m_`|v!tZY(d)T89&1$z-G{FkPo^ zC62t;hY~oDlNY6aE49-=I&p)$)TQA@LwO1e9f7`fbw>L=HLkrweKiifj(CU|BS>N9)JHd{8G@4Lq z&;}8en&1vk;_|yLU!gZ1TE(O1N00o@gU=lO;)xeaC>c$v3_=?XNXfC;wde|A7xj7qn z)Ix`cd6YhkP{|G<$ZNHQEV#joc0FAMf^)H9e@kQ` z#)L+{D59!n#;$(2`nT`ghx@AuU}xiqVU7>i8r*Q0abj`&Ir6hl@>q0tenvVw z6*$G7IKy6rEn9}zzGZ}7klB$tp?3a~`mWG{2b>WiGs8z{pvn<`_a8rY?Hymc8?wS)JU8XY%Ff+|Ewk)~7J^vuQ|!oW6yla@zVvkEo8Ths1j)dE$p8~&XYAtzLBFT(|Kjb6_x7A z8(x=nM~95|H^2(>Jb8AyPv%HKdYrcK7=m(CPX1%6a(E9S`8{)uZSy_08>t7BB_&dduqtCz^4Ab{fGa1^3w37taTODdxMc}N4pFGoCnns25M4SLgYjxSubSG=gwRu zC1xG?j?N!uKtq!Uk{sA@Pc|^b4%B$I%KjhP$X!&MH55`0dHvuOPdq#2(?msVY}Jy4 z0m#e56p30?CMEA>9Co92Z1}+%1%QSWzPx&b|K}HO!HtI=!j54NTZcaq$Ik00eP*|ZM#_Ln8Rx^D3o`>+vy=%X-Z}-aUXEVJ^5gl}uQ7T+G9qIxQxmhYJ z&pPnN$%XqP>lm%HAXEUMVY5H)tSy7xzwm@d;fK#V`ECDj(_NQ;;Pwabz}gxBGjPb7 z{T*b|Nnl2FC`AKGj!Z}PyJ=f%UEFV&_8}&Wh69YYEn_t5Vf)e$nt7xM2fdYauqDy4 z^9~V6oed{t?B2o51`c|~*`K}nu6O+5KYk8s`;ut`u~&#)zY~WOIavr@jH1JrGzeT1 zimfBO;bqT256!jaz!4fTP_?aWT$jx_NxA(z8-@HtQidLKdSxN&Vjcg?+f@H|q@5d> z19VRFaRNti`}o(k<&B0MmwI-X(tHFzJgH~Z_Vg+^(z$#Za)WC_*$+;-D<-`OfKR5vw zX`C(@vn06E)5HE;+En7wuHxHXM9MA0YqvRCnM*D>P@Ck{3w%U`9U zP6#on(#~S}nmW*_!nZ}{X3ScmOWk$daBmu=bxrA(PeXi;;ySW4v_1TxUz9ka^;7=l zTL*4<>z8gr%^J(YC5#&ebAvuH8UVU(u!R|q-MJG_+j9b*ecJIjV`+5R0Jt8^m1e9E zP;sNHDVxh%l`<#txpq*60yI~OPyxK^c$%{YQa9&xMHrikWhh$KC-U-twOg8EIz!Pb zNB54KOMmHOw_JVQE%#!1xsRqMP+|5uk|q@P6h4L-lxT?1Os9Cx*{9;ompu0B6NbIl zPMR8u6j;G5f0IX`3wkJN#Z*VO?6hzg78tY@<)!v2d7nD2Ff%)6Z`+C;{XXtnpP*kV zG_F6ToyX~BtERNgj9AoBH&_|;(C`4WTH|XERrvHhhps$p=Z@F+6%J^a0}8;f2a&{f zDA-v+>w}Fhn!GR)uRF>kA*OjHF%84;_dX z8^8`*cGrvKHvy@0uwfAWHN`}sh1$i%lMo1f)OUPJ>geoUOkddkFt5ENZ>9cD(@4A+ z71Ao#JE;k~yk+o}a?i;>7g|5OqYyva0-3hT0S7M{Q6_C17zX-cxl4t`T>a-p!*U^Y za#FC|qFNZ&Tw`)5Z*I9FKUXj%;3^VkLI-Cz5p4Y&>sSf^S)s5Xdh=PQK!RF^XC6(R zuhZdP_g4Z&0>ZS0Mxkhz*3D8+WB(64?ol^9?c5VFULQmC4EPXd&?1OjEC;4332y2* zN-~dVKiU_csst83QEHQ3*fHrbOW?Jvj%u5aPE(WcTQh?p;?>6!S02vTh6)=ZQ6flM)>YGBh2RZBt4me3U z72t^j%gvHN@zKqwP}p<(L|^wy*MH;c4}Rk=31%E6PGy$J5ZH#7R(LFR;_k$EG6)fR{BQKhtRHLzrnEP3s1GN4*Pw=KNFXnipJf z`Tz5zvvJ1GEokZn6J4W04Xta`jX7M!$+Nwa7tCz#B{K(CnwhNzW{;uRN9FGJVi^CU z0imY|C+^&e;h=|JLD;iA!tPP;N@7FvW}!(|mnIm20cedCW{tAnU%lpEzRn-{=$D|j z4na+AlO(oAnsC45OWDRQL1gY&RMenQ8a%0R`lC<8>%RY~*Dg_gv(n9|i2B3B1zg=B zl@*84vmdWT%FLFIfM%ur!C6 z1pQ%p*Hywsi}hAW8f>N4^EMxv(_WEn7xI{0S+YDe(+5iXWO67)y2QZcA2nP` zoz=o}R>v8R3{>^`rv}HD@1l8UL*^2ks_cx%28^3~;vkDgkoDvc!FO8{ziDGLVP>X8 zo(Of#O)p1$0BtM~z8piB1T`X~s6L7m9vV-seeCXSH~iS+&$;vCx809s(m<7B?YoQ2 zfV=rOH;L$aZ|Kvm&D>m8Xun7n{VPkexECz$L*x~N%P}?*k@%b69I~e*sy8#@v`R@^ zOKyFg;zxdMysJOV#`R*b1#f!yr*OgXJHB}7zEhXDF`KpB__(r`z=%-{)}k`}tV(1F zW3ue~miQ+#M!CIq^TNC(7}OCbO}|k&u>y4ItlYW&(ryT380Ft?RAz2@V!FJhrH6Qa zU86c7l{spY>~t)<-Vqx@A6;bTci|D)eNzB5qt`3(P=kGM{qikWzx8W(Vr6N7Mguj^ zz=fHa7}PbMxUv(ky6|jVxU!YZhJB5h5zDF|suZDOvy^9vfOW$UjBK%$r;TLYJd;{H z4gK6AA=6=8BL&_Hro{Xgm5-V<^iI|qs;6+zl&|=2|MKPiAH3y$EDd{T>ISMH3-lEf z*#kEKsG`7ZGQpYKw&6D}xe!l1c`Mbr8EMdpQnU`x5r&LuRsa-`hUn$a)lz^O~i_&gp&W0%)8V0)roo(Ml9!4zzxZZvtHqp{{EgD+bhCpJKNPA01E{hnOEM8M& zh0Lu|i@Fd*9~SyK4T^l^&6X~~>wKjzKOt>+Hh=UoekVseWjc26=Favwfejz;L`Ntg zj4GumBB}8PZG(_8$p4-p&>EBAI+_L@U{%}<2F8=g`imZY%Kle<*V&j(8mK}+`8&Ey zN@LGD7bS&Xf`T{H$4vMpOF~@XRL;2_xHzi-j`<5TFRG2&w=` zF<$exAHgk$jy}*U6dKm3HLo;`QND&9l(a@T<8Sk7(mGKK0xUg@8Ks5e&Y6WK6G8Ae z0i3NQiRE;^tdaLRE}fytRW>gq-u`aQK$_4=>* zvzrfG_h&bK8#@LCbX}v-Q!pCn*#z4)<2C0!8oz(Z<7xlSEi`KyOf|1)hFQvIm-8v2 zN)c5Gv`!!>n0tm4P}#`}b0U166C2dGBV@n=I8-s7Ve}@=_6bH&7P!AD-|-9o^0liz zaLacv>I2-=AYFrX4d@0+H)hGRZjAAtRCxC3r{J$&_SEa1amqH*jfR4$JCRzlgMlMQ z6C=#1`}T<(!Uay2+CcvDAYkMEDfgW@nlv+N<`n>V%*s~mS{h>9G;j{M>26^Z+?l>~ zCW)-xH@cqyRY0@3!qo;0u#rdbv|NH#&-uP1&J_@Jw2WV=Ing}%kwRNHzn0wXO%|`is zSK$bC^KnLq;Er6`wcN+8f7jGiKB zD7@v}pS$LcZ{CgBa2bsT8t09qvlhM~2xf%Ae2B>0DWwQp6yS1*Nmb(qp7$hN_LP15 zF`KQLDQG7U|NmhbQ~Bhtsf4e}+;rWBb(6R(=VUpXl_}(5%z{aqmA54eV5{^|VwZAu zF<;W0vaI3~xn?tQOICfHK$L&tpCpb<$2$>thrp`Ax~7Rfdz-+rUasvdZQd*9=x6wFAk*{2@go6sBEF=ZEe&pzkb&sFQS+A! zZ$T(}C5{}faQRGtsNBKrVBzTtwY6EY#IZ}Sokt+u};eW>faHFtUN90%> z7fVp+%a&LYUno2XO&le6??PL)MwRE#><4s`$nssAAS~mJ= z`Q^$i6peIQR`0(3zN`P_%iqRQSwc4rv~JL_#&kBu8T}r9`{KvrRp*{eZUcfFS!Bk@ z^$Bvo6wax_Dgl)uv;RZNQ$)I~0y^5?_0eQFBgHbYK^4iJELh;@V0qaqMi12Z&0oC! zOPBrgEq7s5mf%{0bOUbO+N}m)4Q6xNSzV3sWBbp=A78eA>EwR#oVsbCRLENq4l2Sy zvX`+2W9{0aT|dc|w7q5BoC?eHC}NLfs{P8XPcAU*p$mkiT5FuUYwJaOmY2-2;|{2J zJ?4lqmd`C)^jO04nn21%RSI>}pa)>bwjsD+ zcDwAf0&%4j0IhdT)+VDpOQScu?&5QnuD(Ae4|oV|NF(LWMzIM0vfwr8%*%}2vr%b`Jv z@VT#ko3H-+8-Q)wP}lDG`>+qZ#eTo^KRCc<1dz;r!=gYl(^%QF3%~O6OKun{zEQIV zDP^4HO#szYFVC|N?E&{}ju5>J&bbZybI6}iEJad|E6PteFl*yF3FH{#&!q2?$C5JD zv4t$pY?-l4_!J2-WG}szkGf~8HnQGffQ#aqv8i|XA(-x;O4_A6{eRvsV$#UtMKzfNhcPbGFK+?)b;7L5&OvuV@pijw>8AT{miM8?U#;2dMoBq>N z9s^=!?)Os)4yKz+Yy$(l?;^_)N-JSQc;PxX!>gRg*^_Dgmkx#0!Jo7n`=VpBEsOPa zX(oLL|z)j_q_T7#2idVc|coBFn z<0XIFZ`w_p##KZZ^n1HL_rTivTW`D-TrdY!+X4@9L`MaNpi%;A_b)&;x z4n-&wttvtl{8=~iV-8{P&smf`mz@?!Z_sFMH7VBH`(hHwI? z(CH^Sid&#HR>9;l={%`5+2AiCEIvpPI9CuI)XW$`ee!WTwqjTom^I<_Q`gs`UgDP} zNiYn3aibb0okHph$8%!GO$8=(fXbq38b(!3 zs&kIt@zOV4x}Vd;5R7T@ zRhsAwekOuHVKX~pLy6Sf@9kw>-g}NWLnwD;8&yP5DD{U zsvK6HrMz7rmu&las0vez^G?6sBZATUhrhRdjB43v>r|C zW~4YFCI4>V5)&a zk!)^zfiK_>r4VhTo#2vD{A>prxzQMu3WusGzW%@w9A*6!ML@&6!m!JkIr&5cCKYi& zcQekENE;7ydKbjhfr`qF=z|F3@f6Lp#`iw%QFP5qF1+Tsd$(YEXdMj$nt}t>u)XZp zE&H>wsbLPOP+**}t%v2lf^Ia3>?yj;ICI+&+sopehIP`0J7RMUX>?quV~7(wQ|4a< zGn4i^fA{e_Kl!O|K#h8!*%*p7i2W7K(I+lhl;a#|ML>T5Ua#<+XFe9MeE$CZsAnUl z0;KGR)LebO(SGoGp>t`Q;Gq*oH~TL}1M+#o;ta@kh`ua9Sa z`c&RYrzlcO-EGnBxyY-7bIP@i__;{hPz#&^1d5UYBO&ZfW7wm+_qTJ(L0ivLI z$)BIShy^@e8q>XL(kl+(4R5@RkAosiksovDK<*<9Qat_ISwQQTTNm#y8+1lfblO-# zLjweGv-$oJ_S?v6#v=!QNscRIfe=qVkO!Xbl)`9)*Ns$ro+_xahxO^~z}{`kuYdK$ zkHd*8%b1O4P-S8BG`lD$FkY}H7Sh--+Q=-H?)eTV*~?yWh=jhZHY3@~n2+X?<}QkL za@(TUfjE2D6;niq6a$xS_HsZA#JuJ6x{uK`HHz(9@rUpK9RB{R-(;l zEk&6-QYv*&jz4pZF6Qym3RkXGq9u&>cc};(IC$N69=Q6W_aDLTE!&`L4Ga`2J;N!( z9(83Jw>V$WR1K$1{*F@VnplRD9pr$5W#lFc_rN zNSaFz&=5dUN~`&AnXPOm$BZ2HK)?OQM0w|%QW z23`4vcC=A6*&g-@vAwg&>S_&pR5t;dv84pQdhiHtTwT8bMFGXUO3bTfNle%))n0{> z*kev@MhCwa2;O%B#ckk%QfQb^t*zs%u>>K}Z{zMs2jFL-?n-N5b>vx~OaeGp8R zW)N!}w_IY^^3cqJ+ARJGF_sAO%B0!*=9oXMZZb3L*RwwPeJ(XSMK09 zz5O~2c5DIHW2=)*BN1zJN~O1L9P3)k8@DIY&d`EpHC9gEf!})N3)Z&}dp9zpGP6>! zOJm(9hMN)}=9Z@B+Ek{K*hK!7;5Oct%~7nvDt>xwQc znc0z0<|6UDdzjMA zjP8*pL3Ia+@`iC9`O?77Ekz_~cQKI}#WZ_`YT<)YU{a_iV?6il6X?pPJ{I+4io${X z=vM9a-v9 z-YaTwaI7!+Rr~p2gAN$OMxfS)gOA(24Lf@Z)4I0x zZI`8CoFz9)V?OpE1g-7B4*_frMd%j_tK%^~bjN+TYh3@|epwhW? z(X3HxjqUv&&N+VD4UV3Is9Idr2+4DpMH)EU9z=xuADX=GRe$gSU^)e32H54}tZia1 zuhQxg!l)p;^I4FFLXA=ZMP1=*{#A!qHjyyU&mG-;&%g5&o+;xNvYn3`Ut%25r-o>o_hB1OO zn&^8mu+yTVwU2glRCEu*2*F=CxAyB+-hz+bq4N4DX~3>Q)mAxvG=0&g2%S5CVLQsk z9Em>zLMg)l*my{Fu@WQY?&xmEjAq*q;xVUP>DUxSG}^di zY7Z&nqNt+4tkxsagqJ^g-xV)A|1_)}UPsxp7ygn8_i{yGi-nMh*)}(t;b?Jof&CZz z*Ut|MBOuJOlP5;F>xzR+1g3}t;2=w6<%%I@$y~;qI76-+7I}4rkjAsarO_^L1{9+P zpows#n&6dx^AUWfn!c?plq+Hs^Cxa+N0ysGlVek^%{c>-qIRD*YSURgia)M|M5c1G z*aetk)fp-qf!M^E@@)a9oDo=`f;F0NsM50Ljee&FZKKihZjOdGQSCEEmXY*fr*qis z+fW2dz_)zjt_NQ7<<&K88TBw@b81;1jLS|t1()wTjn-$gl~Pfq$jzM)WN|_NNvbnO z-0KZaXifM)B0VT>gQPwZ5rx?vGpiv-HXM0QU#x2NJ6C=9>+kr7uib^^(E!W}Q0Am( zjRHy$fEv0aOvdXt_rw*v;}w_SyLK<{ZFFNd@|!`VaF1IxE(#R=F?2EG@yD-Re#Xu%n6ZxV1l#uTZNN?~21mmG2HS%g zO!GB0u&q$|#sd%GLkAwXYzA8C5y3^`w2fP=%sX6dn z>0-?Q*_oYWz7xT|g;`aSa_@OAK5(+5Mn|XmCBOQYAA9pnU%C|-^}zK6nj5=?P=mMu z8CTHHQkjn{Lf-$#0BKNSZR0pyI6ks6RsQ>r_r-`oe8GrxQF+=H@7}?&5K(C!~#!p=~SWoB;&D z9h>eOEdi<#)8<#gL*VS1sO}J&RvO`?J>>Svyhy*roDtk)>|=EC1_>Yo7W4)loP zV_1?u$lQIWRtidpPcPJ+#|Rc8$bnYhI}-kgsu)TFz;6q_8!?^{`G5D{?qLbU};IDt=Sy!LF+~3tS4GN}% z1*1|HShky1)RZ7jt;7|`ZLyK# z(DgpeJq*I?R@`*810_f}%KZ^Ak)5+s|1Kstk$u5;cluoy8L^Edv^u;9ZP#Zr73r3R zyzJ*~Ft@&&nvhi3=|I&6j@9O7M$4XZWO~x9b^?q(chtH)NWSBN{IPeRBc{ z2Djq+;rGRzmbUjFltG$HP`dDnEFMkD(BpGmaKuoS)gk~JGw2vPX{;_0W=&FWr$KzcUU~6jFq_pV$;@O$*xl(kuh6=eZ^lYZDnJJ~o#L>a$iDLjS8&=+ zZ2t-cmnc?=P2wV5+hycbrWfC2&BAlCea_09%iI5_qmdjYK%;>gjd1;!zJ;H^_A}R3 znlC5|W$#_2K&x*r(PorVE9G$mVcL{p*}T~0XG|9;GwPTD5VUJU_W!tlMjWBk#ob(; zb0bgkdpwfd4zaXvz`d;Bm+Br{GY+z@i1*xnbp4HAJaiPJK>4~Hrg&RyAoC+^%q zb)!)#br7JD1X8}6WX*sz4oSacptVmS0^LY~+njnvJ{S4Ar>R-QRWN}5xBl%W{)b!c z!e~n$n#gSFw6kW)jZpV`n69tmIgfr6-ueR{YE9g(`4peTsM8dH^>bI?9874~-aTThy7Fx3nn*^CbGZk(Z9n=_9b0TWwE& zByLP4NsZR)X0)|OpZrfxd-Rpxvu_vHs~XhnK@&j(7?cVpuWZ4fU!c|uZJjL5?CuxD z-mOENfAaP#>$(90BaLnopOTyF1NJjwHXl;Ou5TSY`iY-^>-(UJ#yIB8XyEPu^9I@H zC}&Ut_zd=g!GJ1JPpA0#AAT+_IBgf{dOBi@S0tUSG3^Y$bNiukfd!52cfzJ;_!4~= zvg)1&ebm;-jQMgV>1z!Zx_z#x2^K&@u3+k{!v;=fCV?r+mq~4*vNZYGNXWRE_#2iN zqqrQkscrDKSv=gZp0@E?wkGKy#zzs9h%(xKLn4P8R9^ZDZY7gfT29Eq+bF+W-pP5b zi4eK$lIeFjqm`>zr0iNwPNq`i3{f&hpKuez6reHXt7nRQ*LMk zDg7Ci$G91z*3_!|F9TNN@;LID!c(INh+=_=(|Z_T%25i_T30}E;H6JF_sW;cvfNzypfo1w^SgtAihcgx%cse8dgGX?0HNgM`-7sdl!H!blX(#UR1ei-| zQ7I=A1jN%MiC%TU%P(6A&rN?#gs#OKXY^x(K>itt2NrCw`x_iH?d*i*)0DCDJD%_4i$L+4f%X7OgeRCB?jI38_MLojzy- z9PdQsYZ^K65zx2!neoV<1|BeFAXl_El|HBK50-*Eo!9Z;k& zWo?!ZN0-+M9i`=6OtAZ?7_6Nmq5ZRI!x;1wZasJee|^)PxP5*0i9uPS(Hdlz*9Cjf z4YInHM0NITC!Zo-Zo2|ei0kxBYGc8`cs#=?JBC;P>@&{6_CA@@`@kp_aPrDBwk`M3 z)EZ#rR5~=7*d7!dG`;gTP&wCBt7(Ia@$D? zo0Kk3VuBQ-?=Gk;qdR%S;a`Err9kIXh)PIfAQ;msbdEC>fvt}3h$^0j%%o6uv=wTJR`!eIDvYs@(G}R~z!>N~LPn z;}?Sg-u$7@;`cuOjXP^gueO`WyP<^FJV_zB>g4Al+B7D;reo+do6|8mZ~`+6`t#+Q zpNrIFb0HLa40XtOR=zr^LX{(gErU+2^x1l9tQ3ky57qk8uReGbHESp^plj51jgtm_ zTzulL>j0oo?$oXTA_56curpH4)+}@EFtDqypfjd;Ua-bKQ=T;PZnWQlde#~<=9S<5 z)U5~q=(D$?HyQ#U6wVv**nu%ngnB&2D<1zC{N4+muxnJ}eNCfB1cCxq-KDRZP-*AP zp&Q(IgPx^1skQfxM6K8eb?Yt_XZ<@2{ALCs<^^W>I@svf^$UX5Wf;%w?z*O_8?%HvL%WARbLtzb1g?x-;i_Sb{_%!e-tnGy ze*)!>CD3dJg~q0#q_e_*iPeoXZ00Hy)ifCG9N;ZKc`0@bi$9*t8Z_(<4Knw+S&q%4 z`jHPFuZO|e776Z{?oJ_*S}aPK{B4IY;Ihftq&eYXV9D8&T&@%)38Q_T z^>MX|e-aEp?;2_D7}1f-PBv^qp?M9j(#^pMsLT}E+GuQ_Z8W9Wisz^1=XY5DE;IVr zrZ}ZD9yRd-nBc(BKV1X5*fatas3((^r|vn9UjMZ7Fr7|JB4tM#Nkn(m0z?NOAIXC< zABTm~3VFz7L}9s{H-nNnArBG9!nY_+tI{$L|6MS|S1jg`KfJ;dEXxl}mK%X3$?gsp zb|b${4N^V)*1K=O+rRj2F8h7s1G5%wo+Ddu!p|Hh{ndf97HU@$bBp20Al)HB&k|15p$|e$`&K(pvtJ(9*7#_%7Nq{@b1z zk-nD<8oXK%?K(86Uw7+6>nLCbHX7C_ni^-0`Z#@Q^qj`t6isl~bt0A#*Z!j4q(-=9 zlv9O~)>U-iu8}`OMl5rTU^6@|_Ar+k7`^o~w;sIuGq+;U@0mjc%yIGNsB*bY^i&!|Hk`|uvAF?zcY6s`E<%Z0FmP6&Z zBr4m%n$XciVLnax?iyVwl>j2CINNSXN2%Sk_E_Z1qzECJ%;4yP5Sx7^Kx(aQG+PJC?W3|w0qaJiZZu|fV>Y}I;~#Fm3x9djU0at6QyG5?o^p0fQ@!_0=VZlLQL1<^{S)s0`d`#~%(^>D)W zA?n%84s^j^L|&kQo2@(lxMh6rWA?msI+@r@b=wCgIC|y<60+e$rBDh-$MvPZ^7fCt zF1j4LcBhC|ico>$ z{;+6Wx^=(Mgst|=15;P8Xi%iXBKkhvGH|ecrmb?NlPC2=D7o!yi7dNqb6SCz$PMDh zcuXiPS-Q8i@$>LqVy;l5Ts^jvZBZ}eS@*%c~AM<-L9H0rhJ`GDnO0h zUttYRP+BB(o0WWaE02@H9hil&Sdj=PqXIr{knZed!7i>L!;NADIq)WkVfRK6{L$@V zG$`a{-nRi13z}Fyj;*&hXa+EuJq6l=6=Rr>>Iy&i7ypb8-*y)dh9eVKYrn@K8xm(R zs}L8EsczY2@n6WWb3`X3>nu2cn^+GlGM<$;AMJFTP%lv~ojy)?ijH?dxyQ3pfxe)| zILS-$k>Ll0tii7tsG8c3O1oo?M?Is)Yo-e{W8|{wG~v>aF6w}$^hLS5k;FMV&ZQz> zpk{h?hLc6hpAGf;{JOeQIylja7|aq!`Y>0Jv$f?LWT%GwAPF0@X7R2uvl|&p`_VKpe}EwsdF)acu|mX25uiZ7WOopFeRK zmP>y7WLm?WmPwKPxA{4@kI&Kl`FuiN9+F2Y(dmjTjLR0kxe(7ZMHwZ2aXgT*v7Xy} zFo^Y$2ptwBiPT*I-l(0Ukn%2{&UJ~6mQzYQ`R^Sz#4$O-(vS$H%Eb+!$GwYzRM#gE ziTEAZUP_miPtmumbLvJlLqfq9UujAfrs67u{F;=4|Sa{AP*~Ss70(A z(j9G*&?(!){1q3TiZl*bXz++gjmFg&7oWUB|M^)LKvM&%YjYx?ZUAV%K{v47^27qa zpe)@IGN-tGVWu{=t)d#UOB*7G*_QYuK$j;od^sU+Ip`3BDR*k1=c?>imS3^*ca9iG z@fAebgi9prCahA@h>CG*|uk~ z`5*03oNQm}ltBt<76@r9ue9g%!!GBmGp=~oNe6{x6LV?rTFTKK9a2{cqW$w2F-V6i z(VMU$M+&SIKmkT3bM_p>+e@G+;0e)%w!^{;``5{?13ff>JXuYoK+FS~uoe9NnNtjCx$*xM3e} zd)YJb+_O*d!;(rBD3q$g{Zg@w$Spex4TlUakoD`3w^sX!?{M;+wr`t%TASm6TT6|c zzD(OEQ<2D$idiYIZ^>LV%Ua_(dyc0k?B0%QHbt$qr>S9rX0jLH8g1s=4*;}vu2>wU zZZG}S_TuEGW|XWkEExarl{@hJpZex?t4uE`2fd0}kHF;jb|GpTxl}oa$XM2}#go9B zB$?LG4g0-$PA(fOd$YPm(JOF&&6ocEr@qBkfAKC91)%JC@ovR~JH?2V#=6!hRD+j2 z_GDam;`Y7kN2;n&%IcMr_KqcunUAv`iU3lCfBF2aH~;59{s77?1JpGGY;}Rl6Xfk0 zd7G$R!@yh!UW4=utQpkIKnxVqqxkRt@dY@4?+%(x$HsrKDLy%q(V_x>z>-BsB7bi!E zeWP|qd+ zlpp0bWTowv`77cxSO9nf@YueT@*uNFB_=p*feFmA?}tL&^DJK+iN4@A&GNa6=UCP$ zXQC3!VrB~rW&#=wQVOewDqQ{-|BSzT_4nL);mOA>HIqpNQgBOUNU5OQI_l6W+R2Yl zVlK>Pvq%Plo|Fu5m1_fqMTu~IUXj9JFj$cCM<&#D9puP6Qh=Af4Q)!Oe=BODlUzLq zgMsIBnx2yQQ5@L*APQ;#G|VeSzjw>haEelusJRAHX%41fjcIK+sIxxEOla85_yosU z)Kkn;KLo+*{SZ^BW)e@|FL1 z<9D!J5_DtsqG$`gp&FD$30_~vg(vO8n=X6e&1Y^KozpZmpv(Ox%c#DiLFfjhVQjJBt}n!%q2+CI`C0HcEN{+sW@L)G}|pMKJrSD&$M z>8kOxssII5lmO8P(3P*91`KS6y>dv}U006)R8#z5svSV2)*7lPFi?egZkP9g%s>?i zpcwX7zIe z37ec<6fX#bvh2n2Ho&W$A+eolTKBur4eD|2=_3wpmNLqt5EAewoh`Iw8*R#7hsrX` zvh+EUpR5vCxg#uIf7zbq?_@Fwbp$f%BxC<0VuW67(IGL1iD&$cj>2Sl4>L%oZ8Dj( zbSWK+Q@{f3nFryIeI6VtbT|tMfs0mHI#dq7tglt(LO?iv3Wb?wKvt2vipVNt0AEfS z^m;w?dcB9;NI8ef10>&20Bgqjc#Nj5&7LvQs1Xeryc!{PZvPDbi1L`x@Aokr49pC5 zTF#uX8J@5zFl#iHd*v;!y7;j-eD+)SUi8s#-iNK*ho~o0pe!w&p)I6(b%xq0ZmC^8 zu*rZpAK%tZrZVy&jDS1!$FeAr;K<_>Mc6O0TxSN|)1VYHBi!C8%KBTaxLzI{G;wFQ zD?+0+&@XY%gGcb<|9w5)_nH^3KlZpSr0Y7I*rtqAWt@Ud_QS+^&{|_W9t%Uc8Ku05 z{v>qD(r}1gSw5n0bY9R}V=|c-?RFsnmjcw82h}m=o6iry_WkDqe1rq4@xFA1j+^VOj z@L(jUX!uxN$;<{VEgHf-9)(sT1J*21rH8qN2 zfbn{T=be2L-uQyYU$Lu)cTTDbtQ54}&*JMW6lO}k)W-?Iv5jHImgQxrq7c;odpT5w zgVTD3>2w$Apb0lL=;Wph~n;&N@h_#Z84^#4_MJiRVUTBe4)lBAo%sO^0{) zkfhOF)DG|h2=SI9-5WT-i#o^*b381FMw7b1xySFk_!pl41pf5@{%6dpDX6c^DNYCu zhlB&(d64x>s=FaTX}xBIlPB8UyVcz(`!(wY*_wohG4WAE!kkgL7VRAU^?;QDZtN0+ zx`yhPxc}}4@FUlJ0Plb83qQPPdGMU3X~L;(E*It;`Evq!CmiUI$xM9N?^2l8Dj_FJ zmN*T!jOY;x-oe>ej=PqcWCu#R@{(#HH!2?WPdR!jh|QGS^~|U|0y9QhYd|Rs3U%X- zes7oe}p|8{d&EYcFP?yjnB>lb`nE?kGFGufOy^)OMnF~-2U8S=9 zwkYtxT6O6!T>F_TK62|lSSkxNjYh#{X00d);2H%Du)e;I?|sZ({Ertre*cJ?o5vHb zs3-syyACMs_w(c|-@fF5ozvw}l{S#vcKdC@2suZ=`~a!gSbO@+YxvkC;`n_@Q(ne~NEt!;N%TqH9E(w&gwmW5@eA%ABRxQC$|(uMQW*_B_@T zk-Tq09&+Wn_9R=6_Oa<1;vb2y=pv=4WJl6Tb44hBY&eD!&uS7;^X|f z+M*T+8v}vP^{4&=fVm=|YMKV$bIxA+l}j$bxSBu_ft5U0NGwl@Mm$*j7sz6XUR>ES zHjDOjm%F)o$&p;LYtW^0oz^KaKP_iRULKbfBm2;k91h0dz$elEu^f0%kZ~%#_NyE8 zMm^m6t-JA}KmWibcdpI8Q5Hp@TY!vXk@St%vAcMi&o>_emH!@kElcJA1`r4e8VYxp;k`nF+Tjdasg%9Tg>?V+hj6c3`qBOH8IS zY%S>EkDRyX;8|Oi@X*+d;=10dIljQtO#E26(oVP9yQyp<tDZd@UFG>eWPJ{c8@SJN0;m1nArmrf+}v?gZ#jx0OHOD03!_^u~MV5 z*TdHjuCM*_2fuXfUw+}+7%GJxGtkr^GJAr}p+WXmV{X7`FqzHpl+#YcuRQb7Zyaj< zPNmFAl4j)pE&XGHWhHEW@<1RDCkLzEC1t*@U(r$Ej6_sY35OMk@h?sAVTz$JL)6}nxkjK zOk=(cH+pm|VG$d&sEy3zF8=MxJ53Q}IjmAhvdm=o@KA1wXCEeFp35qS2h$!?C4=TLa;1!eQvG~vfUz_Buif{aH;h(>zdkQXOKT_#h;C1j z2BL$$Gz({6yI2<=N)eo%xgj98$N_Wfpkv)<=i@x>!Ju$dX3HvxvIsoWD2IJ~mz+4b=vq9(%Jcrapa)1q61UDDlir;hn#f=C` ze9Hi8tx;=}pj40bwe3Uha2E%zS<0X^rfKaKXcw!v4M<*GuB>>y4T0MZaa)uzxSqV|KO9~y!p-})$0Z&ojoe~DW#KLmsHAfKowRFlotSbC0fhjv{!Tx8ZZ^$qZ2&&Sx?3D<27S#>wCLv5qYm)ij^juynWm z{E;4DmAuUE{Q_c}@JN)O3<|UzDh^#efMAg*GwRjaALP;rdJWVJM!}5&wpT%ij5u>T zKu7#DVem$T&K^~ zYhLGY;|oPu;OKa|a^hfc?aw^_$vEeX6EQhlLG|1|s!*aYH!+5ZU|7F{gGBFv0BXQlZlJfPo-mVOA=ut0gcKeK?P_Iy|aCJOI1NUh_(=c@JRL&w~hm_Jwcq ztFHYF?yhPK2Lp4*6e+MW0J1C+heQ_7Mqr>a}O+8S6DDesQU6doEWp^#-Jk}I+qh00M%K>?VojYls& zXV225k2(pnnVFeVt``jwpqvm}rbn-Ge{*nHQo^xRaSt5TgX|DZndjIJXg+Z`)kMes1+bKf}na zH}Q8nkm$1av7HXXd|jDcK_qpxq}$`Yc@9(NPRbMq&nYjkNY1EoM2FGq8}Zu5jK2#N zA&39vCzsEhmz^O&V&Pi?l%ko~jO^RX7_xEam)Q;*@vZgV=}Sj5#qSs#+jdt6Nt;(S zZ7?aZSF(pn8h{p=0%(MS{Tf<9Od7ANvXOJgaiIZ>%UnAcX*+IAb5{op6h_O*HXRmQ z``NBo6>4;-T3>zQ$vf#c zE_({U?CsZqW*V#jsx{=0eXNv%07mN9(j)<@kHOuo?`cfx9#>Y>S@Z*`;(dz{ye!Eq z$mLHI@(}sUQJB=}h{*`x34p&ID?}HmseslsiY-g{mrs2iKRN8b<1b$J^oy2?;*)Oq zRJ4oA&k)R)lfbfA^5icDdncBy41^4vLLv|Fqyv(jcApb+^g8mw>_|HnTO*w1cPnmA zH-s4orv==s0G>c$zhj_*W6%cICEBwWQ9lPklbt>mjHTS+C>?R$i{T$1CL`tLk< z=a!dz=B@{^b9rb^D^rBe-+eFs`CGehzUZM9bxaJ|Oq0wdlr?OrCOV2ciy z*q&@)VFO%zMSucUHMlB^5{G89ORu{AE7x9o)16R7AH7n+oTX8kwPJMx)hkgQUc;kS zw&M4H@M(D5@jLgsOH`q#V$CM5;v>j-2>3f;$x7u&rQ${cWVbf)otZ##q!e)GYXoVI=N zk|&+K6&IYa6=$q0UAEHiy|1Te55OY;(7*u@SIpX6J)z8A!a~s=uo`KogR`ct?ysg7 zeEZ1S4YwaXi0i+35TE_dDpWz(F&vny2sDEffniThWew8C2~z}A>lL;Qm+*7XJ`XQC z_vHOxeUJ%IZYCc{H6c%v3Gp(U%!g}?(NXCnQbEv z+5E@Y3uTR&lYIgy4Qc>lyKE5}4VR!&;hO*Fhw!MC!9`j(D6H-_*fPwj1vA>#ZLu7? z9u^C!*U%ESwQKQIeX~WpY=HYukZaNmbWdVwxfy+6|@G&^mrb!H3lu- z$?`cE;1=!FV!M0Q|Rqm@t%)=39ll) z;ZI)rjLWu{<@;)_?Ri{e0RiU(CmYyxIA_^>Itd4@J&2qs$$U=!y00Bdt}CSc_2_So zYsg8mP3WB#5R6{h&gmd3#h__kAR=gOohahg#gIOWd8|q8Hav{-O?1j=@Y3%)?Ku9_ zo%aLv3`*DN6~G-;jsN|{Z{oX7*nauee)$%zHK;6ndwP(N1@xQ@6a)g|kw|9*Lplfg z?8-iK$B;68x~CLKQT6!;4)K4!?#uYnU579lj_gbYn`Od<*@M$lC1!^o#0$?q6aW1M z-*x5oe(xGER}6wuMde!}b#f@|SDC|BAuHT^mfJ|ZkqAeQ5p_$ev==RBR{nNu=77Tj zn>)Z(t8(x^(kmT;O*6WJl%c=q6&O#Z*t#^j{xwfH{i;LN)ZrC>Hy>m3^-8?MIn@5AU8nRY z5nlV93lubg!W7JmTJ^z4j^G#n(@XHe3r`^C+ME#UW{`mc(P|eVE8Q5!wzlo_Dt>C^ zbWS=!cKY0ZZw+#EWVb-bz^F_=nxi*zv&vrd?EncJYRC{uvXKH2#;kJYdX~j)_{PBt z2F#K6ZAyUD;&)^N$T9NHl4NzFx=HYB|Fl-q%&$zF9>i$P4X&rpyX1HyQ=AL2Ys
kImgTiRT@_NKjxY9Wu11u|;j|56v3=e$U=}BjU-r}ZVj`1k+%j{ozCZ(wQH7Sz)QM%}u#@Qz<; z=e0B@BdV!-ayUKKh#ZafQBGXsSDQ&%AJ-vdh-PXHGwfhiFeVY9?7oJV-t6Y?qmY?P zWf!#z`P05M8Rtqrw2n)jvJY?jv1eVetKa+MMu$;vvUWB%-5rXL+qtT$w(*pPHN%s< zT$8Z%ZJBbv2ZMpQYs0ZX%vMr(=2>amI?C6*<2arBuB@qVbmNarZyiS~`bZcRv!ngK zdrPoEZ60u}u{4`&3jTcFy(XjYI*4D8i8)vA55Iv9$NeG71w{^l5akE6kCQp zjO!YcT7#xj{K$Ey;n$yf9#!iV6e&%UaT#fpv)*7SH2&(Xl-;g8;}4tkhr1N_{@xbD)}SP{lHO)`XSo0-Fcl+cylk^_uz2!y#M7!7MoYhbJijW(Cv z4$A^d1z}si!1i8=T}yq`VBB?hjKfupNyAvLXCOAq+6q@vS)d>VRVb*^E~Hh4E)YW% z1xPoTt*v9%mH}S=q<#3_b5GjW18!k0+6f5GuC@K((6*Y*oj23z6e^KTDFZ}+A|4Hf zqv}JS`zF8mzrG8^HFVhrYYrDIg8|m29P7x+_VhDUY-ZR>9z*d2nicBx3eSAj6Y;KJ z|FMgPia$v}xW~}-qlm6VPOUD_;giW^g4$l^A%j~rknX#b`a6AY6MA_Ge=JY6hEfWn z(P&|C957qZUk>-=W=2~15t*amlY1JY{8Rjyv+cHut~y4&lizFZtFP^`>BG#i={AqZ z3F#(1(B}p?ET~|w4}1v5m}sI-O!Ro3)-x+}Fm0LbpXW(8&6I(O2{g)-5Ya&M0J2-~5oam6Sh$ z5_1VdN8-5LR-V2N?2{TGl{19V{9G0ww&{p}1~H=$Wdp?!&(Wp~3~!ymIepvGbAI^j zJ$%*2zlzbI02)S55yq;(-+%oMoW6CyKe>M&tsPy5(hL-;%@N^PNn9*Jh#z1gyY$8Z zN0{T%afWuj5m9AA;)j(eD-3In-bR3NQ+2R8@sX?bv}g zJ@;|Ac<*t$z`aIYpKkx~Z{NGuFn8?|@LO7EnYe zi?9@Xq%8Zy(SyWhP>R@)Tqr^TvrnqgjLG^G+lM{8=)$w`gBP4~^(k9NubpXL(X5SQ zBuH-8F4Mm`-8*E2Ryl`=fui55K7Y%-eEI);5A>u0Mk8?3K(n&_$tgD9$s&G0uLH zNT2jOA1^WrDXDR6r>|O(*z2^16N2dwz&h0-u~`!<0Gu5Xc7_=7h;Uk<%qvZw36ZP> zJG5c71$$irg>kKh?8}QV;>b3gtyvPX;qLkEb zs?hE%W^F0oNNo@q7u=c_?GUPLpr{S4%v)}G-JJ)0lAO)>3=wIR0f~_z>LA-0cn+Xz z9%f>s5PyRN_WeRjF`dpu0_f(2BqE9bQZnZS%?9irU8@f4KVkdD|K$ZwLOJX~uTN1Z zg3`4eNlS_rG`nYkCUF=F`?rX`$^1CHYjLCZm%i;om))~A`OQMPjnD$?q(C`p1KVE{f${w~ogJ}; zJv^3i;^n%2^gCCzc_A`Bn^7RxgwW@UjdV}$#hjuxyHq;N=;YF+)+!ilx2&yZ9*yf} zMG@iIryc*!i%;2sgAc8nLll|@!&0Fl!XJL_R{WnY-O9^bwm=nR_E`~uL8G8!WvP^u zNzupA;gACZBh6TGM=xtTQ(7oG_?7z~T7T{PKfiwYwV%eP?tTcpvV>xoQ{e1@0tFG! z%urYBc*%KZ;N3s^^fy1_wBtyjSv7}PnE7o5*H?qg1yO4&ZlOY2^6lF>NtW%4!uj!S z)&ZbdDqopzW`<&Mc?mPlj%L?qIYMtOtCA?yI8OY^E0>^V2v}PmH>|qx6x6^0DK+!PD zxc7B;8fc)+--Rc15IO&?$;U$46bX8kFI0D4PJ20 zUcBY|o`9cy>RGgB+vv5Hu8Lr0#;Dc4^A!%uy0fjjHYX;su2;%}FSzT__;s)Ro%iCw zZ{G_wD8cm<4LdfN{Z;TA`5oX6ZDj;R`OA5U6u3}mXaFLGx4!O&aMlT1FEslO-LdQN zGi|aSo6%xK0V$-mHqv0yo~Bqs4vvWL&hpNur`@M={VG)tL3@N=K<$QIASB>}+K+vE zNeB?lD7K(YmgZb&;k1;r41C#44THmJXO}~_48=H|YVm@%A);a~8;L9OV>$^|Y0(q( zaFP(-c~4$-wW@rcwfk}QozH#!b8_d`{m%)}hA^2KA!^)onl25kC4Z7k?yf|O4%dXf z@qzS2KxXz!{^Yb`D^CQ^S1$coL<)1AKV9-ifzT)&*xn|enMvweCX$xPY?l}f1~wn3 zAae?)yF!s*c%UVClF;U+{N+-hvMf*x`grqoH}ZdZ*T=DCc>v7~8W7knJBmgTgop%> zU&@V>366Ow>hHgFDYa1hY;&?NhC@4XD!ZxKz}&$kx&JJ5hg4qKD=SYSg|_pv1WvIL zg-a&6fhtPq^$L&OcM9J56VJcyw5`MEG+KKD;lLQnvL%s3(5z8aVDI z(uB(&dn$hB3FqwXgAY{GDS%=`;0oG02p-{vdIm>IwTz%!@>llz0Mv?Rje=-Z5petA z^$)-O#&2Enu5TQ`!6RdgdZhtz%xD0x1%FTq<7$Evmxs9O8Ry~$9(@XxiU6(AfXp%1 z%$2evInJ!FuLmP7L0L=Jg_$+il@|dNvc0s{SXx^0%Wq5{3BWHYt|bq-Wr$r%Qe3F( z+AsN&OQ{l#n4{dskb07nccE;X%H9n|fC1c)r}}Cv4F~w*JrD8k-EcF$_TW)04NEjN zLpOF$kG$wi&_<+uj|5r%nL=zlwir9~K}(Qv*zB@D7BWg~4l#$Xoz0t+2WtlOStq0k zCyF^CAONZ?Kt+M3p5o-K%Xr#ZC*yk_eIg!n{5B(lmcmAd)gwyE4TPyVlW-~8_Pd>Vt}cY*5(SoP4T9?afjLx1o!q@i%UC7AOV z-Tp_j&kIK%!Y{q{2l1;vb`j}WWBV{g`M4#2q45GH%VC;SUZ>Xnw=hdOOCa^5&@b_G z2)UDK0g!RLl`4`Ye{rAc#CI_SXxlkSds1JCvyc*&T0+iofh~KMt51rNL})GfTQCIu8n-V&%1^9&OdS=5!(mK}#DPib4MWnto(|C` z-I6~_WHYB%!-|cdGqOSSr)W(JGcpS{HxW8&9Y(fu#B@B|T$^q_EYw0FEJO~)BII3p z3czF@IUZjJ3>u8hCWU;%_?xVME=@FI4Zw{i5)o$88ko*TKXLJ6F8hh6or|LntwHq) zm<`Q3q)9td)F~2mF8Pv)4iW~gRX^XuGLSW-30=pPO|3ZX2i?pR%_-tj_}J0cSkdLo zm`iR);56GMHfE+ujfVL0&G+I(fAUY495`CNwNT2-pT|3*ERS1Y`=-6f2;4yvj`4TdTdGy%P`hiR|GpMT{J{Okulcjry3N4~ISG(t~trJEU= zx`EaWST}Z0Ok*!rwIkrxfd{FP0mYUMZT52%1)(fywN$kF_4^;Z<2U~G%lyOd`q(9Z z`k8OwXf?*LG@y{18MLmUSfe1uY`hM=zK-wRcM9J5Lr+_O$+>%|RD?!r)V7|bqN-Hx z=<=NZ(k*jAVNmw%hJ9B$lgaaccl+eZN*y5Qtj&qDnZU_+O>TzUI7;pm+_m*F9(UYU zdi~QMeeem#@4(txjmGkixiR-s1t;In6li~Rx!^Vf?k*{RJz7vw!GY4o8HxcbC7;$G zmm!=FPT0*J>p%N%YU^}!1_`A$PZqEUwQdO#I;7l7`gf=iAnNP1&akSgP0~wbKNv3 zPG3aELVN^Uy7~gA_GVFfG9d=yK^9wPJeSg4r_zB_WX%>+GO<;T^GxJr!3uALRr53e zQj}!%q~?x$ZW|rV4H-u_6RCwYI;-sn-mtC;=@s!@a!F%LqS-29+n#37G|WQlp$h$il6re^6mcS%LCiQ6fEo243xe@E!ZI@waXEgLDI*P9>&`uA|RZb$;*Ts zZ62`N{-BvrD#FoeeZe1o?(1Lt-OqmmJGX7K{Y;@?b8y3~X6#Ue7oTwwzW=qQrDsV_a)oaQrU3`l3hUg=d|xcT^S!01d5y#xhDN zGRpzsmavAsC{?w-p_z+#=JbNM`0^w}^0FFckbskT^6RE;eZA~5di@^mS)2aO+iyH@<@;~G z2eqD|U)Z$T?5A@jgl`J06rfbB8yS98h64G0P7HS-1^i(yvfkl94N)Jf2jwibU-9AY zs?x@>DM(>$JjMw-w%});bpc**&hh&Oif$oh%(RAPbH`gjR4F?v+tojPdv*+(m>H_E z&|M60y#nZ6)F0jQXYczQ|I%;27i!B8?)Z5&9mRZdj-xY1Za|3aVJY^EcLG3@3j6n; ziR<6=@{5*x>XUWdps{+SR5`#*Q5{@|4SS$O%w#spuTaSyppec$MK(R*rF|;*HpW=Q z=sABVg`)Opk~whIsU|4usM1;4q-Igy&e-1;E=dA|%_)D`r6`%H#$$1)WM1x6v6PJPt=nXpI!eIlz6gOA zIp!Ry?9!U(fwQ=qbf`oakH<)PY7bnJwGn_aAs+CN{nR6+bvD5`R09kK{SaUD`P_2M zjU1|s9~F~k6>4+>jz!wc3~HK{t;?f*pSk~`>wfaDu3P%@caCDX+(R>Ktif=)hef@U zzwBK~TV`7I7_3HWMgk0P80NI$ocg+?9D%0%vPF65fiq3AjBsT^PQuCSWR9Ll65ZNq zlab+`2BAQ&s<7we-FW*?J`dk@(k`lXgS0d^vMQHyj-5l5QCb<*ZPNwbL>x&#U6(^u zmZf*hLpe6R15ho+mF511@;c9=%{PB&qW3*)p%CbPoR$nVdtpTcPtP~1QJaq+6-+LS$y?fgi zj~kY++}ba1Q~(t59wLmCQUFthqBsD}BM@+CJlS*mk?GB!y?Yfm-g_8dx&JWkJiLx+ z-Jq{v_Sdim%M)XZ0@bX>w3^|}-CObUC!LEQIA_l_#}9h1EbJ0L_$76wzG2T)aIT#$ zuf&qSPBokvILLtzh&Fh{94gTvI-UMVkHqofC4VXsN;l}?2S1d81QlI|KKvBK**|9Q zn-0aK{nqh=8NGfVM_Ik%UvInbn!o+xw{g?K!x;25dN3D_n?_M^cRCppTKH2+qoq7L z5JA@IF(=q*yG@9Fzcywf1Fk$cA_S+?Wo|AVW-yc@Os6%b(;1$6&K~^icb|vzc5fjw zfX8sl6Xg;gvVF9xd(PE4);5kOQ;#^b)&SQl{r+(Ey`R37FaPy-qS4M7Vaqdn`IU5< zq@IXI)d_xfip*ui#jM70C-1-wzx%4|_HOSzXI6)$ene9D%aA)gCnMs3FSXwnl1}m-Cx2Z>`;li%yp;$jFW8*&OjTkrF}&L6esgRuVitGk52!t4poR5+iAcq zhnr6Gj&XouqQ>HtJCFm29IEV6Y>W4Z3JgahZ|ecqpGdMUrd#OrhwD)JA`+*+W$V*{ zE8B*xfvY4~{M$qibILhdDJYD6wsP&B>w^Pu2^r!m1;T|C`XYr>5Gu&Nfzw7W%M$&b zIX1oJJBe@EQHv}eoGi4BnXF^WNp*;U953O)W9$H#FYI2(4%%u%(-HgqKKgy(P>DSK zUJP3v^H*$ocZ8;c>+qf=I3h)d+0@-w5atZQghK#wQbv2BPy`;RZc3m(09Nrz>YW^;AS2JcY0 z5RdNLaVMUy#9Rg9k@0T1$sU_7JG<`-N#7F+HV0}`+8hvWn)b2j(VnY7ZRp#Hg^ug`pUZbWi0+UY=YJeplejX1@HLk?O*(Z8^494P*@rcEMNto zHEL#X!>A_>3I=uz`#5<^AE)nJ#%bF}*gY(W0JMgma+J_gPxA)-Q<^H}Nsnv!x7_?Fl ztrp4+62!VGl^r)j6|p;GOvBN@c_*VaLnI7qx@0rwP#Jv`WL<(#Iqx0o{tzbzTHVNL zdThFDU#Yt#@DHFt?75_LRlfupL5~4I!))!8xst)d8)3!?WcQ4iJgHyejw91Ay!$J6 z?*G8ozk}6k9mBptp$gOuS?8dz>&xsciq{Xe1P!>JLv|T6o2f2@9-Qf5`aPJ_JOJk$u^%<{ocDD!C;BNwGbGCJnOI?& zCV1cP{WP9>_AaU>vk^0+R~A)SgnOsJ+`9KDyF@v)|3YqEm`+7DIp^E6-fNw3P`JYzK zC~%|Gp-OB)I)H7Qu@JFkFEdVqj29d#k7(kujnVUiO>y5KuNTr4QGU>#B!A%R*rJWw zm@8DVt;^b2Bp!g5Kqq%>y0kSO*U9`GR`$7al;=VYReN-cS`FHjN&BJv8h#juN_S=` zg`*XuF@rpHEEFjXiRLgvC9=q5Doj+Ozs=uvs%)LD#QBbxfQ6`PLO4T5lm!T*-KIF? zVP~lNgHT5gz~^+#^m(+bD*=sZeY+hh0IcmcS)eEtM$1e1KVQ6+fBgSkj}iK)dkVU- z^<}`FViYzJ#>!FV9xW5}Vvv&+$@6Z(l>-2+Lnd-smIYwS<>#I!PPx-7GE13D07@cX zVYQ`RYTW~2%hTLI0cgez%2MM^Kk{t6>f-bED#Af#j1*Btu*Xot83y;p$J9P}_K6?is7 z)3}ZP20WYXQ)UlL0|12rDP{P?uqV42BWMl@D?l)(o^h?wG!1lPPVrP=G_xA(lM1ux z43FBe4L^AP8F=A&r`~Y<^6(7p3vD2aAY_kLa6%=bELteEf zz(W8`=g2T~>rjf&Xz&9Y5@@z$DN~1Ba4k;&W@3g)E>AK2KhlnALGTWLIuhwYiU0`q zwbo|OkatjQUQ$oxmYtF+(3Ir`U%U6AFTUgRx8h%KdjRX)V0q9-p?ZKOumZx&i#=V= zcs=NLxD&dD?Zq^$Fy>~k}-X8f=c<@hk(_;WAC&%fyL)HE7(qrt$aEL2q% zi*1oNsyzm&U8{P4yh9~OcMOajB;Q}+y2duK9p>Ic)s<)tUhNtvPUB>k{Ka0|{65}V z_C}p`J+>LDRwk`{J+6wy*7tXJD1{O$1>`C)U*%TcFfrV6y>tmRYHk= zlUP4vGdua7vCsZc3j18jXGj*yehyd4J2s_lNogtPHqs*yZCF;Cb8zLvNLEy`gEn#2`NBdjEI8uUmjm!KC|uVldm6Q7{NgqLj9U(_ z-}&p8KJoJ9QoXZo^e#oTPK3%_l!WSr+TiTxqRGW?3OB2V~uqxoNdGvXz1* ztss}o#xJ@O#+`bhcAejG^Pxk=Hv*Fz=9%cscFytdM4Izi%2&h)r}F_|GRKZjCpTVj z+!i|PIp;s+Kiu=+4e$N(-T36458&{0f~8)Gf$9N7s5y+FyAgS?x$r&GiCTwe%n5q4 z|B$JuxzA9E|>IM&u#~{sk{K-4#fsP6%+s?!wq(^Ily8L zuE_BdmpvIj^Su|+tTqGVg_)JAR99tk&F}Rbx1!ArnfeEO(t%+%VJ0@! zFBXMw4=0JlXKuv^rxD=s#KY>}xw1DCGP*3E#T*9?F&qslC*Ttoa~^p)QSi%`vkB&8 zHZP>3BI)a6%+~3?b_VUT%GQ%i$?fS(5p@BNfAL@&$|>PonX>cxB5mVFQG=3DFzc05 zFPcTH&XCs2E)(#}6E|`f8D>;1a+pY1e?b9T(RBS%g4m4r-6pjS4#+MgVCS^C;)AP_ zH~5PHU6);JI@D}tpEV7ZnquWOPv5`)&Vxt4`1{v=1xvekU^bb7bDc0ZGJs%uyvpaU zv=riGf_xrgX4GEtHO;k4*8K!HIfW5Z$t;zun7MQ`Q6vok=LdpAI_cQB3pN{#0vb)f zhqu1_qd0Wr=rwP7=`*l>P`-UO<2^+|l?M_wPewdL6%oaOj?fBD4r2j{)-x|CIDS`` z$g0aRYqb)mt%=3uwe>?hX*EcgK@GRTbMiL>PILXq$4*drPFJ^RY4bI-hWXYopsOi% zDSFGR_MiQhr=NDhH~!(K@9g{FZTH|i>uczvz^GK{TknP~o!Xw{rn^G zIe4R))HqsAFq_pFkizL(m+`d69FI%RIv(e)EM2iwmY?hubhFkx(v1cYjTErzO)uGx zlfuXeTFi#TO(uXG!H#U^^U2L5Z7N7Ph3~9$EkN2Y=GsfCcbL7M2?8RS#gR;q@*xT?Eg;Lg}GNyHnwQ7a|fM=Y(8<$>i zDlXi!^YX2wdZ*H}in#!YMgWaKVK6CTIR{26P>b@vDrfvchu&h?t?2C>fhRMNa!w}skC$LKqu_C&Sk7tX!R(7Hpw=s#|F}K)?Vq~z3Pp_C z&NdcG`4cjI4LPT~+FH7Wj+jCnTig&aJ*}Qm@JM>G^^|4OXG3JG?4RtY3bkRA zU+vLt&t-6WmJ$|43xOPn^SI9SO_G@$)4*KUVPU!D%U&4@GJ=*&@}=}Uwch)7u~mz3 zcdPzUYQ$CNHVtVTioR}h2>H8K$Y6x9;%G4ipWChzXrde`nLOIICht(iD0Z%$Yc0Rb4F@@NR2lW{OL);;yc7w)EGlhner&o#Zi?g5YX=D-ENax0+1agi!6}I z+n*KL*+)gciF3=xOblIyi21KJGdM)#!8MEj{89)6u$6w_OlUb%)-&-o&>1cQrga0t z4Ewf@&UyWl&K~{XqfdIr$L_fAvX9?>2sb@=1oy31(2CG62z}L{ED985i5`_ussS@l z&t{lu#*7)0+MLEWV8$uSBV2guF6=*UEB5W)jW;6|ZCyF?< zD;WkDE>PfE-NQxt2UL4NB*Y3D3bd$o6&Qz*EV#u0) zr{FL+yxiic1QbEWobv&|9*hBS-C#s`=XV{yh4!Dgea{2mHM#0bcOAas6SqHz&wb|* z?p+^)NTVb|2}WscLnCCi@t2?`gDcjSD5aoO0fL#wnocH|HjGjgIAO~Ok3aKxJnPI8 zaKR}%F51$gPd2qShai=uz0->-&l`aODH=L=JaCRg2kTqU&9VQQ&HZ7-4f-Wvtjn{1 z^KU+S^WT5yD;VxrMpI7#rL5nWI5mk4i5w9S2xg$n3=5awagALkY{S*B|G{f_FPDF8 z&UaA=d+%gk8Tz@qdXXsjL9=*&i~DrVF-Z8B!2jsUu^_`Ny&GoMGRP0Bs3>QbwRfVr zDM;bnBRd%(GfuwG%Ra}NPM)^TNRFaQhpa7j3_C(+@@YBvi-u!w$98q%%1erlwUp@C z^v)B5QamF{OxGXIGfMeARA!Sk5+LK{z>biFqr;OMY*>qAVaFA8Ed{8U_@q0#c@)}sv%{Lob$ELd)W@IuL8pmEK+oI5f0JlNe4A83V zp%lI^`&@%?k;@|jwc)^o&~#3QVotEoIj*Sm0D^2CU7WNJiu8VoY?22vV>}&0>tO7{ zojwf|VTF{c>arMB4PAEk(dw-?-FIl|s}CH-9S^PJ$jmI+J5txEW*UkJ1u1MD6xiM? zuxr%AiOYSQx_yX~mxeffW$V?a?b>lwzbID=3*eeYqtOgav_kftEC;CCo0a2!nYA~G z>0@TBudheX!i5d4Cpm2q>+0;jD(_T;vKBg&qD5z*PyR)wDp9%&$f=V(R8qbPWHEkl zI4F~^_XEUU<5-jOuzx?W>-eTqZV8KzAQr5ivuP-viJy={@&?!#gbm=sDy*wXLe zjNMCk>4v3hAIjyW%f`>tQqZzHsHxif4u4^=yA`b z1Uu&TP$g`eJEA$xug%D|zut1Fgz-u9%Z1p>XWt1OSWN5K?+;oIRafX*y4g}F znNIKGX*MH-P1D%XzfeasS9|?F-uJa{^AG*$KS5K8x&ZW49={$R zHsa`TJAGKt(E?yr7$QuQb&4FxPUwO{YB^LH=iBAuHAzRu@Xm;+jh8vAfCc=EQnv6I z%OA3y9Cvo>X(@X_BtwA}80J#*CgNH-d)?5(Pz1Z!=;t`k2YyW~IQg(Vgj zO1=vH%rQrpf%WyZ3^PTWh;m(~zHL0Z5Joz(A8Y}Wd9Ss`Xf$dco8DoIa)S+N*l3So z%b}8K?LU6p%d<+@TaqX73Z4i(MHXbX94Z)Hm$MJv!4SI4J_)5eKm{`fZJctf6s1~1 zQ5>i>V{KZW{m`Vo;^2|$@;g?K?)uiD3ilkI;DICSI5L@HJkyxj>&q0(tkj^Vu-xxq zWvP!7w~ui0wmu%UZ5d~swC(a;qu$$lggpekr)h9t+UNuFGIQ1%MNx>u4B9#=X`zny z&IZLXgSri}s)*1q99gPR)|vXy(~6$;)WM zR#(bqXJeQ-dniRZyOYhA05{4Y^^(n?U1t&8!CSs+84S#6A4rP!IL@Cs9GB~Ywz8TY zN+I!Iwr*+b*k{ooor@)Ps?E+gR8thufP=3NyzF}?IDQ-I-O|4PSHN4QPY*{Un@;4( zQU>!F)yrb!tcw&Jcp>SWPG`}f6iL!Z?{yC%AP!VwE8Cl~w9Q&v&u6jkd|M1({RM0|HNeC$w#WdUxpodTbq*7()Y74OXSEoJ%5|8aWV?T{h+A5QxU05-q`&mmxigv_c6bBj+tA zpw%UUO!QNCa>MjjbstgIxwVk2T={;17C`_sBUA0nKus~J(+R&kD6)$^qEZgy$cJL0>c#L#l z%zx~iJT5;4Kq(q2d!nCG3W{h1rB;=qk!`yXGec{xG;?L|e}!g7(`fVtgHf+2s?@L= z;cFYMbY{QJ1N&C=nuxY->zc?4u%nFdAztJIhJn#ou~XQ;!t(1(Ac~~ z75W#;s+nrFcp2$L+b>dp=j!WdZ0rbpG-@9qPwRv^eaRN;3&R`Cq2-moLMtq1E38au zG^3)RT{Y;yq`|I9qxa2bde5}c`|5`GG{7E9Lscj`*emGfzM>m@WpQv=7B>${KrvNd zpkY*Om(^Br*Eu>xQD8I}3Om)+pJabaW5oK*0W&u<#f(u;Q3cD#x4r*HzT(aA zhAPdenYv*!_vGmcd&kVc0Rz@~g0>eDg8^t1x<)|_G!Yu=K~HA*m7jSLe)*-(Tv}T@ zS`|bndj*!4w;%|LCAWp0M9AY`n?(#Rz5NsK(^Gx}Se4K^2FTLlrhs3vI(^*bP&wK< z9jZjfy5*e`NVn=N!gyk5s02=s#hWgf>Oc5d&)9~yZHRpCWYsxTS^beVmaj`}i{z6u zeL91_u|owXOfW6zz6v?BX4qknPMIUKzc0Pm7ic>r61P$GNC-#^7vy?xaHtFkiET=; zoof$jmlOLC9@Qn$xV?wUP3sAoT(y%bQ~NhL1IO7o0K)PmL30+Hx-whL7M+$TlQ<%~ zm8S!Z?vYzg;iEWx)+HJ8&ZCZFrLwbI&bTMi6WT5<&`p`PX^K@)!4j|@2w1GAvB<}xR^qTjS7~Uk-oa+r*`MBuL z0wtwJ`jzCHB(DyG8)$3;3%NYZ>dZ>REHiD4W~xX7q`9(yuF@he2L=H)XR$F?DG%dW zrdSfB@rv|Dj5@lSGB)o1p{ZCjw7~8l2W}b5mYBiGNS8Lv(6PYidRLtM3WvElMZY5M zMT*XWorL2~?~0M&NZZLTel{;H2|?v>kkqzg9Nb!WSd)thn61N_xq_xj1FO&s#m#{c z0xUfr(l+}p{mpm)Nh=@nfdR5N|4FGma6oC;KmFYcgev$l=14cf$$_2>gmOuKs zvvYmSGcy~85nD!+BK+?U-^Bmvci&^#pzI8;;e)n3O6?{Rz8R3FL8#3LIB96rL$fx; zt1o{pe&NMW+f}U{soZP_+a-jp969Ak!kk1eN~b#FjOa^US%p&NijLH|%FJUV+0N@; zNizo81pRSl`5(cgbru(2u$HdWXxg?Nxha3Ei{6EEKZ zT19wXxNQe#_?oT3MUAi~x zgtN1kvYb}Jc2V|$@$6m1JU{NShMW=1cKYa>Q(>7%yy2s`aaykyAjZXw zu~=K-JJ94>rA4rKNN6`oCd``w%Ni0XFbg-EAUI36m2>w2?9wAsz+~EhC$p8GdgcZ6 ztN-CiIC5x=vNXn~(AsZXY}dCXzV>N`@Ra$M(6&@CqRPvTC@T@g&zJ8^h*&t6r8i4! zD|d?ihJhvSVtEWY#S9^{0#pG;fuh&LtQ_Di@BR#a=#M{e&25K{eqwpcpwhaw1~{zY zccZ+qfCfdHZJy|7J3;{Fn+zO(nJcaf6cE4`MIX1R+lxVeVoG(VNmoOOOjh|L5e_1fm8ui6z1M3uhoL|GT>0K0fkz_FCAoeLK{aP50;3; zrK#crC+Z18*_`r8X1+xiWvAn8U+>D2@}+Ig*=dK(E@fJzY*)99DNA%+mtOW!&5|Adel8>29BD-4%Xc%Vioo>+R22E{dK%0h9Yx|z5YFMo{Am_xG z69LVqGJo06uuD)I^@5g7h)5QiMIq)$h`ZS0%=d| zynN$OJiI+0(}icd3-&s|RxCmoU6@qbJkJ_KZ%&sP9xk9Cvr$snPI1}h z?1!sG=bJ8^+!18y3&2}2dHM#)uOJ?{+Z`KdH)s9|1MMyu46PPp(ru( zQk@C|trR;?h6(r~UtQ(*a&u-U7`UwHr|t zb@KIhb(Wq6Q_GNsc*odDM7xCLF99qq5=biC(5UTrNc&KihLPX937HS7#k&q?;uuUm zj9h5pw0UB@Gv$}glCln!a-;t-Kw!JC!?%HSrtIH2z^jWhz7-kXZ41j11EBS?@1Fbo zY#)&dGw<=n<#LYaLWYII7oN9)i_EXKi^N6)Zq0C_!fA;<_@K62szr$=gMKS1so5seaAoFh4h8#PC{Q35^bSMW> zNkLaLJn`c5@kc-VqN}N%-B>r;*h!b47Ba{&MMO!70DJRlMWJIpJL zyI$moLMJ~Xuq5ylHsEQ}?g{MNbReR5{xIJ3mqgyEj1Bk~rjF-BnDpITv5b^NO28ay zkAYzeJDNF#Ge07Ld_A23L82^udb6e@e7Z{Vz$xo)1acPX1KD7yr=%8s^qQ?LH=}7p z!1{E0%Ql6BzjEotSN_=3AB)5HA3-@B0${T#*;5(_GaGeXU5~{;q@B%sX-Q2f`bOeW z#E%4!nKtPt**ZBg-`0$?#EYWM$&oH+ks`1dzDFvBk|^vJDKaonIB@Sn`0+paXT0gd zpJ&w@jE1ThxsABNNXJA*zXWq~2ezcVXw8};p2Y~2m1(jiBj0ZMnAwm8Yx5$-+BRpT za+{{}lqLYVO^$sgXU)R*`JsKfQcF&Sj!LuhPJ;YTf-;7mfe4$G{Q^@1IN6Tk+tK{4 zk9Hrn6JikGnf;8Iq%GC+1U>k&X^CXLMUEkw@U<^X9s&ma%!Xf&xe%&;wnS=`{^9!pb#_?`cd)nnp6L8^DGA|RioS!i}8dWO$H5+-e6 zYU|{TI?E(hXQq9$-PUkzlj&GiWmcN8>iA;hQdi7ow(YMzbR+-#8~+aVY=*L@{Opw< zl#=$!w}Dw}U{1kR0Nfx41NO4*MkzEC#+i>f4S)X2KYDO`k6$~j>yZ&nXZurji3ce^ zlKN$JZ_-X-@G=uf#LEEe_`T>8NLbC7e+!MzYrb}#_biVMDf`-qR@~mVk3ew0N^_?^V^hGfz$;fCViG;{&&8yq9lWh`zc*9a zfH~%{GU$s<@-dfF8cM)aARdM8&O+)ur>r`s`G71SlX;{%)Ia0+cW2-Lk|VEpLnAn^ zk{$0T2%?;hjet^$IK@6Iw=O%7wE^FSL6R$+T{O3Jg0Y}%bVW*WV~6rEKgp8TeKb2! zOnWrj0SlA>tX0*)U8AM9{Ob2T{h}jl^-JFUh1;<8xNWGbF+im?I537r(6#Bl?iI2; zuA<9`cXLwO2-${!JaSn^IyQPqen}IvXm8n>60Pi9Cvr;3plqYuU`~xJ3gAei@mue> z0iVC^p7l4s^qFrwX=(7r!$;RDRVWWWT~%_Xb>2XOyo)Itx0O`3i3HLveOKBpEh2*D zQP@;VZL#OTN>gTg#5?MR4k(E};p*x3qK0Nk=%b{*E$XFWiK$4`99++mY>V`vFx*5W zPORdV(Klc_o;}hYWt%#))==OT23B>9o<`nSoBu~*!*9jF$mZhj1tOqg(29TV_h*S2 zV+NYK2Hc61O0vcQRSAB`*R3rXw!bFzmJUzTGy#xqU_;vCpX(3Z{U+>LX7P!g4qu3D z+>JE8usP8qcIqHA7_?z%^P;7my7*=7MNyccGIPqHeXd;9g7c|JS#z3#S^H1RVHU)Y zxuiPXvy}B45)kGwjn$Rj#*&+DGPA+GqQHAU_7(oAH~lSY-JmyAXle$d4^7JC<4bMwAZ)*rg+iii zW`-gKEoKaIYtDmC5RDXhkn?GEHrRJ?yHqQiHffASIzSs3Chv&+-5#w%I!I^nuc>nZ z2370T7-wujm)Vdm)27CG`a&sc1v zkGg{Zj#2wN@X-dST_vzc+RDoQj@ln_ZJfS~9dFKIoecFZ!&s^16}{7|%oqV|oF+r$5?P0e8KX#s z%`LzqC(lHv-14X4a9{v9k=5s7CO}(Rvol)Wl_J25{u_W!HZyWq)bcd!?K741vg%J= zbL@+`8@F#zy?N2K0~476M!+rIGW{!*7wkkd6X5&M{E+KQE~`Lm(9DZl$RPERh7vkP zRKd%TB7$z*eM`E<3r8P7(21^Wf$3<#E(W{g?W%E(O`XMz)EwR8X1ttE5By;?MyAm# zO1$gCU*MnopYK97nPD(0pr@l8^f1hVM+Pa4dJHV>+KRvZudl>K z=bo}_eQgb8SwP9FK7gRdc>d{<>HAb}W&I_+X_U}UYzz`~xJK~(iUg`{mq%`}G*^b@ zQz!lizdCj5X03+kACa4xml7{(6?KHrR>7zQo$UI()ti>J?R)SZ=@8j) zVMK!2vREYJ2+M=QLh|-~jsB;LJ#P=tNKO2^*ltOLFtFjDP`2zO zPQiO#W%f2%`46KpPWdHJA!C^$xrwkwDAC1i%Sa|KuUzK0P;~NFLXFXTX`dvkD1lyG zL+cvNc#4&kZTRgUeg=N%iI1k)v_@SwD9RF4sF6}s6-4>FqGaBw(X+Hnrc-mJKt?%9 znk9(wjg=_6oD!7}-Q6C8eji0q=ic_g<3BPTJ4ub2Qao~+t$ULSzuw04*SX!DKpbWWE@A> zSq%%~>PclCDvz~{82Tc^@3t6vb{`q8cIM+pe5H7-19h5q95=kiPc{DXM#fpwHy2AGW} z04cC@2qMSHWD_rI@!d&cQ#b?Tx}2Q4Zb^q%cCiB`M=?U>;_oaRZP~G1E~&9dM_PSp z)NT){Y=U7F5jn^wM;Uo*DC!!7x_17+u#bBlTE`WC{7?AYx9{WM_`av@U0UiNSewkw zE*S^SCBRf|PP~KBaP5bda?bQ57L^j@B7Pb@iCWn4Tv-5<$=@3^2YNhWj`tzu<_hJg zmmI-z4v3qL;80*^|C0H8x*7BL7FZ^*QLu39 zN(waE=whE&lAr_p`Dl)taGAoeLqtGbO3Lzl2+%&GdDJMTAVh|b7~TX7MoLBeo=2ynr?d4k z?J6Cy*oorUraKe7plr&zOB*YLTfL$D07u@L%F=s`!SA8U1`5pg3MmTaRQ$BLmC$f5 z-Tx1M6eNN+9dLf3hIYFyKW#{Iam;>`u#HE_#8DbQnt4oN^9+*97?cHr&ft^KumR4e z92qMx%?x4`aY~39Yghcn9ioAEyJ;T zrgU$>NEj4bFS(W(NKWmvMs*GkLSCT`o&6+=8~Y3)(Q;PW zKITTs8XNXgPq5{)k#83A!vLJ|GqS1d?1R%`Er&=NF~{d*&3kB%d^^RzWeT#hB7(dG zC`7?wXbZf;z8ZKM+jXF*Ed_gmCq{t$!a#JMC?LQ$5ZLeXkrkzCz0 zcxXI%_N{jxy6%>{58~j_3ilqaaNz#Kxckr=4j!3cJegrKZBT2C=}coXtPC%* zT{#U{>u~slaGbs1`=j0nxX0?dqA+zQGtc4f3{jRticPXo5qhPi9V`rJAvi1K2biShF=Cu9qi)OHv4q6|VMI;7E#|JNTuQ)={jJ?L2t zkhzk=l;!M`Q@Z3Yloftdh)WEn0t7%a;keNRfAXt8iSOBe3QcDX00mW88m-N911AxG zm7$$dwsomh!Iaz#Xy9v_tZNbaVqp=m8jGuIFNf#Ep14d_0aql(m(y6ew8joFoPK=x zeQ#dK%?K009{REv7Hqc<(r(-?*W%fYN9#m6n{Y~7#MuKr=>Q zU6mj_E(pCIWp`6*YA8cN;}~k1?J_IUHx5oV)Rl}%+?lQU{CB zkEBtXlvb?vUV0c$SlZju{`f9B=Uu3L)BfTY!ldKE48$-dGz3T9rNhPY%j> z{-r$1d`(vJx4)y^52M*R0-9Q5dDOe0rt-$${;N;$oB#SF;DRt1^wG>T8dZAvli7RC zE_8NOclVymQe@49p`PKlfAQt`z9*hS(`k)b>rq*#s&IQ&y?A&=MtV|GAoX#l1JvSS zA|LYxfYQMErF`DjWRr-zJ7hP)#Y93@9d9#vr;dvMC*(DkmW@IxSCI~m0bz>4<~gs9 zw%9(n_UytrDQN;PirH7=M5W@tF;;EC4LNhzDmxIE&S<&#>867SP-n_ZX$e1a4a#sB zUY6^=w>aJ*-kXtyoKB^qM~_B?k`M?^8g^b`zC%;OP?2Ud8nvcTrJYDJi+{K9gvcY1 zAHA;Y2GglnvuR(DkDDkE$$HM@8559@VbTtVLzHFN&8se{vA{M)>Y23iCz*BWlj#KR z=JagFK5q`d9I1fM2@HS0fKm#>;c!#a;ZaA-jf62!Gmi*n6MA8d#(TbU8~^B^{}Tv3 z)WpE7Hflf~GNMS-BkoL;j82)K@o8vC_`&v_cb`do&k=6p#H`3QT(VTry^#)3 zPWybDa3aEFGQn&%YmGol8yVLj!CMV|{?2`HRk_NADQIb1^7cgl`_rpDTqquKW@$DYRaTQfTb zkZw?b(F0>p78neA7>))we)l$J*JbwHBlXh;ob2RAhWy1Po*4#3i z&Y;;YXDdo5MPBb1faC^%VkGAKjs;<5zmI;e*LD_cn&iApAsdmTEF7Aq0RX5%Tu?F3 zvC8y?cu(=1KxQ^{Hk)BOoyDNo6x=R~JXKOr1^w-baP@EVmzm+NfiUtJ>#Ed&Ad$YV zYb^DPJx3c}zv|CFeDKfT^-0vd5(N>+4g_c>e`#-C3;D{}?^cFEKv9^lTmaK4e(|S& z0Kfj?^NDnWx@I)Yqq0y{X-`{qONmonF*B;F@^-9izop}qw`7UEX)QlXP-@;P6&TPnt!PjV)Jejq!MlrfK}@C$=&DuU4C8bF{^_g;qK{%#7i1h+ePP zj=Mlzqq^n5e`a>7X&Q{j<7j}RHRBD$+gMT?WdBY1mnYBch3ohGbFgXvHXA!r;$5a( z=MYy_m6Vsaaq%Jxd5DDh?R$M{8%3^CRv+oDMqc+(jH1i#1d=>UtZ+)QfffhpA)l;N zv`k35tkBp5v__%b6lz?kRC?5U2hmwgyT$YcMIMAej-qsu>H&hFH8aB28t9KR=?>Cq zXg`Y6lA}mO+NjBFySn`vi;Y}GW^aB>B9w&6$;3>X3m?Dlv1ia9z5Eh>#hvH$?uUIN=M2uG;EUwrUJeCn3FuKWETeKsyS?L?{@?Ln&PIt*2q zrB^u~gi&f?R4L4f(+1+=>PK!ZB+I(AIpW~IT!Rk?z~D#lx^-Ffz1u!-5Mt^a&)a$^ zZY>G!S|Cz_X^PWECEIrmo8>YJW_eRtlvt~A>Dz9&<=W5O`W@VO+kLqEfrEHx^&zZH zCa7nP&C(cmQpz89ZSKo~S$apxuB}uSSh5FU?B+17fXK^T!R|geN4s0&p7t~nMoaLA zNfvOFR2v)G&kC9FC)#8f(oA4;`I=4e z*t&K2#nVpOf%8v44o^7a1YCIf@mHRG(yq4*Me@OgZVgr>VnMS6 z$JiYp0ROx-f)A%)77)JFVd;#A7A;-*ndXUhs0zCk`cyUuag8+V9NBFp_Qo@-V3r|jfJ%VP8LKp2!>eBL0=(fx=U=2}H8h)ppL$eOatWWo4SAsI*{}d;^f59` z6{Y6v)9y^Y!p%p?F6$QH$=iYSolh^9JF?&VnGVROx-&~|M(^hbdfAuj(@>lyEAyL} z<>;a>{tW=;@SMOhQDbjF=jCbg09ZI>^AqGuatl&t-{l1%uOBj{Jz)N@LAR?(P|Ve zOBA%8C05xK*damb66qwNkuEf*0V26{A@?S^&Dm$~z1AG>kJ*he=Un@on_#{7$2XIE z_TFpFHRqUPj^;OJx6}-mH)fQN5T&TUn3~JcXYyq6ejF`TqgaSexS-9`F*HLZmnZ@C zB@4yUChvgar{GV>zgn%ZSS-|I5P@%Qpya3`iE;{F6m4_K7=v**Ic?XOC*4mn(bJdRS}RdpG{u^*8Vj{@&YgVBZYOu6Hw4L|_xv<(m}jLo8pbXuq&4l2DIV661v% zuclf z6XmezacE_ zUK(_Dr~FN))3t$9?Yg#Q1C#`uE(Uc#gynLH#bW99K15LO>k2lMVy~vX+!Eg&Z z2{zge0~RwyE|_Y-)Oed?QvLo3cu?ZeX9S=m1FVWa5fX$LP?7it@hKscjLgLdeAK)c z$f>S$tz!>({poIQ76R@C#moR(z%p6@8{-l79oUEaUU(Q^`@jqEl!u;=$KL?Lpr#m!Yw8b;!7U_@oY$a--C#X zgQCi1Td6oTgPtDHc`H64*nW4)-%6bFDQn8~j78DHMnqn4&vkJ)*MjZ^xCWkm* z_+@4l$W>>kTxCUp1?DRJaggWGsX}+NIs=X?AJ@2u)U&&J@lZ})E-M_jr`e5sz)oCG z{>lAGfmxDAIYT8^R7h8D^YCCjNP0ufc%CEHlz zcPfmE=RzYKMv_F9N!lPaLj~k!zuMM>f3k8FmQ6lG+Z-C6p$fIRawsxt5SSpfQ9!hU zs3P!MlL{S-hGK8e0~G@i9;`QGeI9l!bT(@*waZ6Y2t?JRucu|V`wRglf_EWkDU_Mr zUlYIiO1Qor`rf3y86`E^GzT;K9%u~ky4xoV?Xgn@4&vz5mq4Bj{Rn063xvV zW;9rwnpo*~;hK>vNzD(`t{2@(fLQu0=y6Z3A*U#Vq3bJ_+K3q&Wjyo3BTd55%2s52 zV*s#j^tUwz7#nR2XOF zy%V$)o%)UiBtypIX3}9)>zhMuZ*)Yyh$h?tL&JN zHAd{@Vvj(Mr+PhqS!;m`e#N<$dq)1Z4b*G4s7n*`uJ^kzT$^|^^MQF?t?d@Idl-j z7Ix)krd%QJ1i>hCvQkAvkbNI`8GnSAZNR7R#`pa5r{h;&{IsWSjOe4w&Z2G1aW`JD zH;&i#mTIIuY_%eg%)za^FUwprD7AYEGEVu`>_?FDD)g$_<#c^z_yGiu?%fDMFQUb`|QRJ03CIxD4nX9^ox_Nkz` zlFzA|Mr-wqwUn=98CasbR#-wwJ}Z?PRs>WmI|D%;f^{wdhm45hbt0XqMs)S3eqi|V zG;S+rmDW9+Pv@z@5b=lurAdMlZStf-5<%4-jEv-4F&id<1ft{E^ZurgH*YUWBcy1F zx+a%%Q0dF=u@N1hbaPCT|8*@k_wRFis%(e2 zm%{&x3htPVxEw@PC}5j%g5om?v*%fwU!uJ40)UJ4W z801hO76=-iwT04kA#2G5vZi0L!QW#G+XH~X)Buag1aJA^r}2p|-ucL%f9}`u3%=$u z>iZr$t8V7^R?SHi#DG5sOR`ljDOhXYeSX(OPdSHXv3D4h*uIBD!qz%L7H(4-htQbZ z(;>+)iGL7}fRfCKg^p27Rr_N%iORzB8IGtmRqDRHy0hxH-hI=TaQx04Y#kT@i#aUy z*x?4u#=UpRS`Y(05nQjiXDJ*#O9YTx&c-1qh`9oNocxEUBrJ~rvshukg&9x|A=@m3^U?Ww4kr2)||hq*OnQ0Z1%Q0LCT&YnRh8YL7&CC|2ZD$5Fr`T4RBnS(> zOWYOyISEk!PrDCh#>Rv`1!BK2#I=H&RH;0ozwlVaNHfxeVklY2d7&?&jNCe^Yu*lo zd!-o(@4RxsoHXg7wcK?x3(ODf+dT4)kKKCP5B>U^anp@Q(H__UxPxU2=Ek1_>X&DN ze7}(B14m3TBo_?;gV~@zaW}r_`A^5M|Ijx+d)Cmk^Focwd1k9(;pZb8WHjdq-f+zD-yGb!Qs9@{2$ zE*76Zn+5E;fIU@{Wl#E5&Ws3NMjI*WC*kKSzG}E)F3JHi`;cz>zoGNes+9T?+$`0U zwi?uUj{A>bpQEgWzA5yttVhBfwc2NGAertB1;y1FszI|ZmAR-c6Xy6xrD25t<`v~7 zm(C&i*R-r^m=#%dK02>134>hA>lrPDvM6g0x+om9|EWt82BzS!5XiLwRxm0;Xkc>)q}~v7{E@)_{^8?#*hB)Tk&`Qa2vnk+n@Nd zb2cWwc51#nVhn9JhK?r(5P0O5dXbnH4f+_tQ)z^A(n)->2P#_2WaeSHuCAjOPNRxP zb}=-8U-<#p;bFI2LdZtIl_dMf+cnXR5gdq)93rJ+4gdh-)*L_o?EOINp0ptJy>-Wy zlL6TJllTB;>j4>g8X56ua3a6-k0KSxj5(QOq+lflQ3D-I@lV~>Im1k&AqT&%L7An^tvkc4z zn+VaM1SaMVzbT_a@iMEcO2Kdw$O}JLluj<3Rs*k;7Zd)LHKu?k{0K!b`c)4@eE7iT z#_Z4Ed*e+%^vb`+?O!^McK-wn2KT*R+RB+-51`JSG)W#SxR2m0gPgg(wA~1H`!0OX zcRwA!{?c!H{=Tt!({kC*h|G+N_xovFP{&+#@T7v4!gz|l5x$|qwMcjLF>AmMNB$%v zlfZ874=KAAY>a421~lr@tNw`6rS4Pgk9_DQma~W1w=mc%M}VS84bc{!jgu6T$^n0+ zDy@~~eusgoY?LClIpJ1SP%Mr(?Mtn-U)s))Cod`P!A9!yD092o>(nw1gUi(!L9MnR zadZ*KKkA97?s1TP2p6Pb>Y=V!w?d_+uH_!8d?v^Js8*H)RX;nFrqd}589^lU;JFY2 ziVc>EDU>a=K`>a+N&d~uVGmXQj*p?h4oO_2yox-kg(4c(d#J?zB8F;jjP|R-BY;=9 zk{z?HNTzhkpS+zgffx(V`ZEe#MvE3rsQUr<)=m{0+UU7%^Jfj%h9yE4$q;k5!g722 z$Ye4BO(#cx=UpG=AOBz1U~}IlR;Klv=*J%WX?`)-En`X*c;lu_1L7sl9GEgB>5dkQ zG;751Z-tMd+DN5vzM?=x0Zg7oTCemO?R(G^QJa)OA-l2_g7ZmMa%auarTTKiJ6;H@ zRflF}aoPRP!N2*oC*XOHdLY@}V%c?D4bkyXdfOPR77O&fn^lyuCjnV?Pm{~&e}o3h zn}IGrW^4@lz8~B}HRL?=fU2-Zs?K^ji{%pCaw+T$qry&6r}!cJT+ra`kkGXNK-keW znM^7tCnlX`0BjjeWAM4VwtxSn|NU(*`0HyvgaZdB;BgaA{^Py_dJFD*7~A^_46JFu zrUj^R;L^0Q57`Tr>xMAe=U=EA+7m#fl=EWn#oIqAsD$hbAWp&FX+Jr(g9qxa-6m?R4z=k^v63O4uwGe{@h1PO)S#_x?yWw_k-Vf#xUh-QV>b{Q66u z{_K5Y^QKkjUKku-d`vZ5AnZXlz!}o^_FN50$w%cdgTx}LzY^CV-R+vPe zXZ*^1kn~T=IZDdNl^srpO9SGnnFGnUjKX()XDC_gPx%u#E(S$en{%9?`+&8oNZT** zCS`l5@_sDz4^lY``m4)@bESscLp2(W)HQ~dhiXzXQ42N1)534}eUF{_9C`4RTtY3V z^0-D0666?6_;*=GA*+&o5K}Q4%&F2Nc9&axf*uv!wA&skpb%UMZgSA!^6z#!AE1UC zIbGIPTGpOl_gAY*h^mm4S#-O_@DuQ2bt#7D<1VUEXY03x) zO{_I-t@NYhQPyX=UsFZ3s)9iq-dLDutjz@OY3YCfug3MttZ8s$)ps|ISMBVjPkA(r zMh*YyAO9^jrVaYZ6uh(`YM@4`gvnRIrN-UJBuv_9Ud9FS#qsV5y6UegEGSE2-OG%o9m8eO{(hPx(9@4 z?UqGKfbs?2*2HB_x(nkE3Th)kqAW|+>A_-s<1D-bWOTj7eGhGX-*0};Q|ABatc{oa z!Mkt3_Fbod`Dp+>2*7CEq8&9bZR4A2z-q~?@i5qUdeUr~lo;>Q;<7Ljx|o2Jc1i{A zVai|ImKqEEVoU;$y_Vtgt7~l592jQs?y)OZT-ZEBQx5buW8k!R~^K__3y*beh1_sLD zA2NfuBz(A&SuV0h*5`GrcFSJR^(PQm@2Ti*q`M8ESu{>=ferSo0I0j@d|IgIo?Wdv zY|ciPE-c;r?|%PU{(V1N=eWMs`idf9 zo5f!-Y+TZtmm+O+47zh$D|u3xTi~o7G2pygqFs1Vm?;_X1UV(oivUk{hp7c^Ic`g& zl!b*!i5ef3uOLe2u@hD0CM#I*G*MEGhlAWXxKJk10ctx;h9?ufnbgRjhxGYCZl8<<{;C@T^g@`TZ1(Hd>6ghySw1Wj7+O0W=a^?i?> zMS2faEyZ?Z1?LVzj;c8@tM3QeCXz=A?cp!-)IA)I5)`7z~L*-BTi`V_1 z+*z$FN77Q$p+HMG=8%7fj+zlGJh}W*!h-}ndVptZn}3%2l6&v_hPbk##P zT7&uN`Rd51HAnm94*ITlFKG2BLI#1m*+r=;1)su)=;M5bN-ZrEg91hv^56(<_#Nub z?3On2DXo@EEaePUrVsi=ql$y{p0_$M6K!L9fc$&mhL)|kIEI})0zl-BKtDcTKJSxX zI{vzk-tr~f@`XF_=`SC{&9~iwTaVp^os*}5Atm6@bSUOP1B4iu&3=g^VJbcUJ9)Rz<>LFL2ePHwYRd2CauC|({L1X+( zZ}3wdgy(IKx?Lox-=XPV_Dwh;HOwdqYZXtV%^QmW5JUd|5`+X_wOTDv948<2mZZ95 zJyP{Y*%!t3FhgbIfJ2z+v%SUUzUl1qcbvH5r+@ozuKTmMejLljVAL4D=|6$XP!2Q|A2J1w3_?dwg zX_p3%Fc=7^nDr@tfnRy=$XP2A*OJvpb}L7g(iFNGs!qIzD#KQxOwp(mU*x=w4+(aZ z)HAb~q4Ks52rPXmx*(wL={kZ+B4m*(h4C9NU|ztsH!ux zF=h~UE6`uV;f3;~a(qCAqGRNArkwVS4+kNWU?kR7H#BO=pK2GYx@BE*6j1?UIjk*f z6hfW{RC4r08jUh=B!pox62cS*qlm;Pv!-o2nZmSgR0`=yh#!hYGN9614eQ26x&9DP z?f7HUg_jLa<*US88xn72AI4>tS-X?6xX;OCf~E-@)>VZ%b+u({Av_w2iC7 zP&!<~8_xW&7)kxTDt%^hQMwDDTh7nvlSD*Gm3i6GxrG9*5lx>e|JVs1tol(P!|B8DLg!xmj{v0MSLjDzTL&VA0pvmSpbUi8#QT=$6koqH7+IJL7p!oaLGbku<6 zWa5eIscz&p+tWt*J(t3<>5cJ$F$>$F@k{9+6|T~DD*h$GZX{o&j!hTEB>(0Ng7Qnj zAA1^@!d^t}H>7G18H6Q&AVNd#&=q3{v&~Js|5LZ}%YO53@PQA14*hHjW85GS#L?73 z3Dc?pA27!tOVAj6t|Q)+wK_e=bHC+Dc=f;f##f#-!cQz#{Z`x1@fb)&x>Hb<2S+vk zC{qfkJO?A*Nqv@<{HM;10oR(kgyo6X&pe+vw zH_9SN&6q%wq1uuMR4S+($^K{f;ilQ=c%CY4y1En_lG0af0$l;FZS zjm09ohpOCT;K~soEGw&2%p|;mVntK=PM8`$7y+d3IiRX^VsKK+!&$yW67tQ0nV?7uD8}=u~@(~?(hji1hPFwO*`Y!X#U3^{xtuqKYAy2 zECI6-`t5~lObn_#$O|$TyId+*F78^!qHG1_4l?80n_?U)o=wOiXTCSmtS+W!#LKEu zAVcbTg<7PU$Q@R^U$uuKhfZ#P7^fU8AEXF&$X|1Z!5J)ihA}M;AK1hTp7b#M^fMm$ z{H=}A>rdQ$0+xYM+X{A&tZ;22`9+eHIjS=WsER5pvVSH4m7AfGGM$smT10B~`RnWK zYM?6*s9fAGoDMVKXQ-In_`CG81gBG`Ay_6Xy8hDbRd?ll*=gjAt{@s6p2OcGWvO8}^Ra9xMVm^`2A8`#U1nG~mPK{mgwO z<`!Tf_>^?P1$9;Ugc4aLdNh6FnPB58bjBb`0DurkIsoAJ+9YG^W~`PA*sjBb8Rs58 zh_8F}{qf>wJPKd`u=^4NIJL97lt37@=4fLumvtwwq3I=Gf8KBjtz-+2SS{55aI z=Wn|cG@H1duzdp0nldeYMDYdpj!sGhhW&)(mPFgrr}6F2c>@0Hk3RF|XHA-4T6XHCvysR6Y7cg^O^=i36K%7GUNbd#*fBz*y8*K27gpo+Fw3^MCk{Xk&4mhX=% zXW$YB+L_PYOOGiN3=#ObPfm?0j&d$%lxl6Q22`;bA^_bjpo;lryL03L5l}7S-bQgZ ziC*PdnX2+r>33`0%h1ES@A8#jj(wVMwenSaWq&3DvNpa#Y8qgh?& zmi(0g6=Hys15H_m|B?Z0O=HnUzX?7!3Zfx!qn4F6oy}7cbr~eG#jJaUicH3tm|jxEGzN?WFqesG?*7kaseQJ-AnwdqM51? z$;-ZM)pzo)oB{Ru6>`zeQjWSvP?=7Q%fNwXb52vLf*mCsW~)*y`JA-04nzb?28$jz zU>T2jzyXUo^mgmSeCIe3p=}$4;7l=gAgMbfcq5nCdgt6UO?(Np45)&g zQ6t-xa`mP1T1{4$KA=pZO>}<1r5)(-@qbFE4F? zqo!$Q1~?u>$Vl)L>Zjx@WP|04eS=JB4VKIaBo9HkkjQtY)L8nHv)vN!`Z|1y|`>xiosd zy^S=hmHDb7ph^stct>!}2V`~Mzgs|6096(lNN3P1jzk$gn_T@<3#cNU4AEN^S}IsW zX>>+c-}nAdidN$2-Hlcrl-eAwea=2PRl?TTa$&jtrGF0i8!58}q{^vMV zl_v>^xCDxZzytZLe6epK-+BK>yrJn)jiDS}YdbRd66!3~0;*VU#``seIBzi&P^pm( zDL~Ab0%}7YN8v;nVT5}&-GB)rJgPELL}`g*o*asVrGL5c2u^KqhKjdrAh}9 z&wYJzhN^a|nA%8OQ~SyY+t8?#Ox7|MiybsZ9^2f^7z|_kc}p}iHyz~{|G``F zl{*(0ZBDV8&(r&fxX(Q@^6(n9~B&$L$I zq8J2)6Uw|C2f0@55zm!=h^uY%#bxiV6Gq9nBi4Co!JWm{#u(r5s3UmUvmW#MN8b1R z=kJ`JV`sTUI~sXMsgYPUh|z?J##%*R2&g8LNg;Q&r6_rCts4xG)#eY@0xE_5>W|e& z|AaHmu4L&w{O0AW9uU5}&3PyFI_pZM&{ z-}JFt@zxuT;@Dl=m`qwUEx~pjY}bMPaz7BmSZU`%KT{D?iu#fNxb;^UyomU(NmswXk&cs ze6e&hz{b62N@Ame*W%jH(xN=+fGX&8W+nr_Dj-W8xR4Lz5GnhyYd|H6-;Hh^tO%K+ zGT+X8#|Koho&nn|f||S>6(D4Fg%WJvV=|p$ECZ^_0G#p-YS2aFp8|}ltS;bk0aZCe zRrMF1Y&D}&Nh#P&&&Ynv11fnKR-CaGcB?+9DCx}lQ(C;ifGX4TJb)G7qMgd@Y~q9F zgbJvleJBu9;p=6a!n?GFCIyNCk&`D+iUw7LV7Gv(h%^V3h=J*J0^?s0nL}GB&?oMQ z4qXSvi-uwSp%iJHT{uMfaDjMIXQ=)cw1nk1P19rwo|P?ss*VcR$~LauL$%mRRusvh z=2c5#0&vhVRVCsV%wZlrlwz+AV7H*E9#FX%Dz$GbjK(p8tc4+9G@asYw;bgke(l@w znJ=Bh?9dp??FAZUFsI$D$}C1@@<1;(Hq;~X3a+TV3+hg~wr*4-Hv%qyo{5Ung>o7T zLniH5z(5s33)-~((~Ze#EV?KJRN|3fjLGd!GR&Cwj8WI&qH_-6`=0txy!1(zU$nJv z^XTc5r?Fy-QPT_?+9A3J?pbT&4Asz);_J%WEuhM0i9(VARbrnuD7ksrO<#smusO8> zjyzwnZ?$Ig0K{X^J&_IoCI&LseBD_ zR4}5Ht!$4RF?P!#fpqGZ1^jZ!G&=0;Oy5~_7HB%)-2GEL>WYi-;%7Y;-~2U~5s|^E zo#hp+q1zf`<^W)TIf&3S?mbhE<(jAU87e_?6$^xB3h=AhGnj&}>Q<}ja#$zJ>VZnJ z<#q)57l1$PlV__{KPLlBr<2*6KKR+~U--Ru;uAN05i}j6ZCdx50EQSm>r>zm2ckSa zfIOvA(&uE7sRc$O^tM5}I)xwq-lyWQsA3JmM#M|*BhUjv*Y((0E{bE*b*b{%M8}Xh9P(WO(vQa@ zj9RheFFFB;fJ)%ra)blnwLTJuB)MZ{`-Wzy((IlrqqM1!%m6}^y#R7Xgy6rJp^{=- zS)y75RH)m-8s4Q-r%tMhg2L5~iIj{gqPp-qR8}#F)5)ZK9~6XB0n*4y3=T>IP|n(D z@D;wUJCs89z>p%xHWwos;a(ENy#!RMEqk=AYe6{;obo3|R@sl-%K^$_GjC0}CFwFE zH-zbUS}fgM=K#1OFS7n2I>K}DPzv!b5a}S80kRfEjLBp?`@4UfC{^a1 zXqZv+x+LzU0)%pb5k`7R-c$Fp#s|YzX)r^aKBVq>J3~ymN)#M=!PAH&l1{D*s9aOa0f0d{1go-(Q7-XZ zeTGW#+yBYsre^1K9YB6i&boj~jab)gxw<6v)9F+^q$2_;Uk(vgojua^9VU%AIv%;v z`4c1Fc5N#mm4u*y$Dj=VQTU`nKcM{dz~oEiF#&#I3gpx=Z&50 zldG@q7~Qf1I>y=iHt@K|JP1GhZCByxkGN>V+J3&XSRH8$9W$nxxxG66JyxM(Mba}= zT0UfOTlm_{Y)QFI-!lLNC$pV=4^<(X0b07YIu?swkLF10zlLxG*wt3o_4CdB`{s)k zPplOCG$6+OHX_lmH`#SriYUcW(6hY6@p+@pLlFSQRzn4MZxc4Rx zsHBVzlu^S2<)FBJfI#SMU$!v@$!-s(W2N^284dCTN14{~csv@ZLn$;_01JwOeH>>SDb@F5eq@V;4A_$3( zd&f!`?$E+GFk`l{F(AmI?$kQp3{g%+DODLFF9GQK9*dnt1Ogg3gsE%-6#?YRJOaki*p zEYCEcswJ7vE!|wi{Zq1W9H0~fY*zp?Hl~v!AHDsqH~#GZy5^B@{?I>SwzY|Vr}HPS z8vlL}@(d|wMr+%YhPtbCP86>yeaT8u;4L_Ah-*QevPu+dgYa^ABr|q-z8b}<4?OLe z04d2=*;D=To*dDMZJ=1cA-7?Cv0S0I24`vF0s9{gT^#4 zVOdGVSz779E2QmZhHBkFN-b5FrLeXQi`Bxt*f#_S5z!2FqBPvQ(~>)kGYY6`-d@t- zX^=J`1(W^&G@@D8^|QY3<_4Jiun42ZY>^?HST1qn7mi>3hU@;}%GY1_3EcGg)#yVbdbXyl=x3rB*ilJ;4lZ4nY;&E9{WVy6{796g<}g7TaME`htS9yT%^ChrC1pv31~q2!`GMs^yA-uEBX*2l1q;ulf?{d{) zvFeYE+vaG~1fC+=xiI=2mKNnJ2Gq)i96WKNDcPK)3whtE0XHJ7x|KTtGd~u3uSv3y zIr7eprW3lp0~k1PU>`p7`8&S(U%%$9SHJ0+Phz_sHDP6N0&0=h{vU^6jzxa} zR*MV#s0DMVg^1Om$|D({+`rn&e=2sFqlq@+W8s zIimEDEGI8Gr!&~q64&i1po(Q6+2&YOZIeXB&PJ>sWOdCRD#pMeDxqVFR>X4Ur^?}$ z{7EO`nIbmN#{L&098?5Uq0xE!Ql+!mEIy~?o05>E6VxgIytFE7Q*DZ|2&jsd1AGa zAJQZH4C;l2%J}J&Zo3&O>Fx+_eu9~?TJ>mPaqhu=cM(ln;3^SiuKvi*aAy49hZ-rPEmfIwGZ2Djdvsccu2_Q;77|;ts zl|vNb#_X2hhJ9ixNwMUVKa`sCYncQzNLKpk?{{5?zUyKIY%Q33z%oXSIRZo5r#r?? zUpjuxAHDnIk9_UleiV0oY(@Jh)&w0x4FH!R&H(KnLbAl#`7*)t`~L=b4zW6=>B z5H2|PAfEfw%keYce&x$9IBWCQ=8M$~0NTba0|fkRm0xydeSL!gm6CgCJ1B6645Fgc z=I0l~@oTkOVYOTdohyNqs$eJuU+jY+W?|Oz1*?*hge=%;uirdGu%?wmD5H8P}5+w)4_~e{NhWWiy!)y$6VQRf4ylM zx6IFD2=}kFInH+t_)X!nIsVc7416lyL*Pz* z9}K9x4Xlmp$vSH@RFVhDt!1{Lu!{oA)b3+=hAI^)ZA7l)Wm2=L!D(qC{kDc3wd7Ct z4^$aBa+Cf$<`MWtvNzmccPNESg3SVG_@4?xIZWZqAFJ|IK$T;r!VZ)(iV=5vWk~Ow zRE^KIUk;{sQRh|RHsgz(pU0;3MkHZSH*__Nkr>IAbB>M#Wk?fNN5Kigk7|T za!{c=H4>LyS{G2&QY|2f?Fk*JpAZ8iy989}373C}skOWVnbt4)+hdA?S_dU*6fd>0 z`W~t*4LORk`0{!JK@L%bevH9*mN(3RhTzeykGI&IO=q{BT)g%d{^C8)`{Q?h0*4Mw zG4I`eDmHBbCN=(MfGPeI{E$2oP&DKW4HWq)DU$$P`6Kc|bbems^U)@aLsG!QvWB43 z5>U%VRmuwOVRcXFop*$(d?4<>0Sbfa$`VG@7iGZcVX;_QOaWYSpR@2Up7>zA5xw`Gsp*2CbOSK+dO!Q+>7Kw<4l^F1X&Z2ymTFQ#$xw+pa;XVC z2aMn2Mz#aP!nB0N=_U4W9l&q=`1A1GuY1sCreED`O|vzfOy-7Y-k9~icrc)ndMd6d zMu;@u-WIk+H$x4I30tjNTN_xd1lmsYJV+h2S^sL=yBh|HgEovfpgxqWwV2Nxjx&_# zO?(m9McI$g(B!vl9Gw8glxp0k|uyyfjc6h+x@bGA;wEp}n7b!p)g(CeoZX z4Fpv6Zm(7+jAJr*^$wcN+_CABs0t>D1nPzhmCd7M{WGRB4yZzTqCL^M*d3;R}1GsY=cRDnfd}A<}4hUVoIm$d90{*=Nci zbTJ1h0Vq@eya9+9wqq<;Jr0b3OD{SbFM8@D@PfxblxCALPM$i2zOxvQ8aKn^`Dw$8 zI5Tj!*F!04zcuT)kmEWC2S9{n9#DA(O6TamAdFT9a1mrE3}VWGrdpl(4Ari)z4DZ_ zNXB|z)O2{Yasiba&1U}|Uke*~#m@d&#$-fSn8x7qr&f=@_QN;6`Za&^VSL~pzKF^G z8E8BLcRj#vrpm^{Dx@xQ>}v}2aG0G8x~B)|vaeA-^Ip!!M&yXMyO)4X0;@T{N|2^B zMA9ywi|V!>Ocud-*b^%ZiD?}F`i`;cfCHlu9&`B-{Oor<5l_GTBC?iYt=luzF>Mj? zal=5;ozL;M(E|tqo>~wh|bIJI8zKL1eIV;uOw1au~n+li!JF ze$4}@JALwsm8Fl4XETf@V|N$`?QUD-XOX0zV0}%NF`v(MGeq{9VyL2|%nRP+GnB~{ zre#zr;EH}}0F32L+hqVqCTlI`J3Icx%yNc`lx>ZzQb4C}yLStyCXUM|G5 zhOtEMs;V&2j9NgY>yo`1uGH~JprZ_^w3RBbXB6=8ZU=w5OZ5K<-qSiQp8 zY~~II7_uKik!y}z>j?`iS7%0eSz26*5rAE$WW}=#KNI18NXHnQs$3Qr=p`cejwUff zMR62R2p7tB7Q7IKJ^67hctt=(`q{!^dA=n+O7J51I*R(1E~R52hvomB1SX zBoe=hwaCh$czMtvO5SS!5<0Bqa}cvggF)qn0$0G22>CQWcnomP;Rt|BDo2W ziwdPo34$r+4-PxkC15b(aRi272v~GIy3XRPaf`=ab|GH;4UfP-d(1TavRn% zMx(}!Q1>=!l?hc7!S;I#sFLjIhHIH*(XNa^S-J9EJ4(mJ;EOc+Sph(lBTY@eixTvmCO!x=d>TG}!3?+cPdaIK}ro;}Q7T zfBu9k56ni_@2pnnd)_i+U<{7S!xD;C<^Du=bgChp%>$KfBK)}@t2)X%hM;1*xrI#v)xXn$0w7i()U`*2SB6*q-(y- z!k?i8Vq=?hvdzpc-mJY>O^P4X(sbiID^?LjhF+bfvFOmLU1_+&dM)SBB9B zXQ&8qiM0%NWZ)I;P>{*syW|X2W^?N^R4LUaJ|u5TTuBMPR&6?CJQ-uumI0Nt1xY8k zDm$ej4^JNXQ~uVee&&pd3WPC@57b>w*hBTdCvi4IRX^#=eaShXm137_)Rgtq2ODmU zdQous__}~WL>Z0n3eInq<7b+1eQ>1>LQ%+~L``-Wpb^~dkTXxxG)W2{y^03+7Oa{_X)5y%v6m{WR+e7MbnvL%fm$)8%O z1PgrLa?eIAM_5>n4+Y>J&{{B_Y2QwwLk3i-J?R1uU4k6ii+@E^oC_1JB=}iui^Ymz zdy9)Urg-w@7vY7^d?=oB*(C%3Cr_P5-@DD=q0t6j7s#V`zXsoV7PC3-Uv@YfO=k1S zWOA>0h( z;mH#_*8gcNpI-sJ+OdSNOQR&1;Um~kYNYaB8Jf)a4<*)5llcT6b#~K2& z#cIVE^%fT#n&Qciyf0q#)GP3W2V6v8#)*@s(RV$X7HEiO44S(|I*hhyzbXOM-hwH| zf#qU_RaXh9eEX?^jXY?8>x7cscv zMN#kD^FfEu*Rb!;DSFh@yyf~Qqxyc56i|uBJpJ)70HQd9<+3PE6}so`3Q`-Ss*n#h zTzTYQ_T~ZsfMA*irXh4Ii^a0Rg_~nM>+u)kC%*H_>mGdmp{rKQ6+i^j7(ct{&Ii$p zpalok_{qH`!fLg|YBhYy9~t8ZSRjG}S6|oUx!aBb zW5Q%a=q-V*TZ*n%W+wX-`##EtY9v4n;7{Xi+@Jv3)?l?{EVobLpMT5O;6J|j8((qX zgOgXEI(d4V33H}q9$@-tG{ST`y_dWalvludp61)zSxf7_<{s3ZzWPpKJMd!PuVTsv zj)nrNaQ{sCTq}o#&9K(JYim5d_W_lpb12DRqkixPhGM3{o7HjbNzT7)DX8TVNP@Orjy(a-xoCy#C z6#$G3p`A={&5gJ5kN%H0!4S-Q_GC%>8kto%wy;K2NJ5pzpC8JiG3h?b(|haB{s| zE%ixe;jS1>jUx5c3aHk+*tZbhf}TXfZu>PuS}qq@b)62V5P}J(J3$Pi9I$UYF~B@) zn$dhVo6LG@=I_7d%lyi}ybgc*cmIIdqybH5?xn!iKP2oBxeZ$&>vUBvsZ-WH1b7}b z6XiOA7_ca1)6r1INtum{J0X5@)d;<28P*Nk1w!g$*&m8F<*$5*?!Tww=hG}3dD)*Y zI*fJ}c<{xC@gvXsI=tu^4<`b!v*>2VU@rG*l&w9pfNDtQ+|1_61ymuEv?s>sdi@Mv zzgnSbTTEwDeBkCUe(sn5;N2I!?cF!v)MABZHic;bbUh3Ry$>i;$jU+%fH31%cDWx= zGd@5iLSuk-Y_Qy30V|82c;Pefvgbek1!qsq)hAD#J|5+t!mCIKlhFv1>9jfue^1i7 zasmt21yn))?qThzE)h_T{)s_qK6uaU-b2;*oVz0@=V4ay9t?oTYe*-F#-MS$$AR(x z*8{4`uU!Hv02qy0j7Q_WH1Vq#P|e|11VQMiHoJRSy(F>h|0e>f;Ga&MI1#TYfyl^9 zI7b`}8;xw1uRwFPAbpzkdRgw4$ls6z%w8o0$W;^@7oGy{C$nkY(M7Em=m z9dJ!RB@JWNnqX%vxxGRS5p36EzUa|d!jZG~;mXU8;9oxRLHLG;-uEIQLmp5C-SM{r_;>qg-EsQUc7)MngfE}i{@$zKchhVC z?d#r+JC2>gc>h5xR~`J@ZV?V!am#XhA7q8PI3Dt#TE_`Q2Yrk|9!kB5fdDJbiT84j z=Jkm;jl_nh=My7zK$Vp%0xCsg>OlYD1FC4>2>x^zUtX~Leumlrw(GIjUgE5=!8bkO zLHOD4dD3+cJ97A{W!J-6o{idOZW%KI&y_VIO8XoEHzUh%yPN=(ndwT(D$jPA9{X8CzF`LZ- znAtO*lw8QP2Y`9{^y$Jz$$*N*0a>9tBqk{E8xrsGfpNBs>D28nI^$Gx9MyaRuff^B z`FxJ9v( zWI-rT^mT4W0Jv9m7>q_EgypHbrF$Dt0d5PLftOdRgBaLULfE*;yU z_5enpEy~Sl_Pik=4cPcH*8W)8^9 z5T);t^}<<6`ANwx>L2V3iDakE!6Kv!-ha%&=nosi@pv|mD#)SK-8=Flb9 z!Knbb^epLP@^_k|QvQ_PBvF5~`Qb(grU17ZBi(1Of8_T`E$2HJ^&Kucau$B{pIwQU ze$!(Pw~al1*NOR&(Wu>S435Lvq=@7WwFivzYim+5{=!<`8601(8;uANOdQlC^gUzQ z^QHS|qnl0B;GLhmmH*=(z6bBP{zlBV7Z^_)n5IS71I#HROCXs9QWn9J50=u5s=vqK zl@9K2(-7L$;Pl-maN$Mg;MO>L=vt&Pd1q;e(FP?nAS;6n(sDX5{x zNU`rIzLtbj;nn)H#%jKLe(L?&f_CiIvwKUqFSeFdaLPe=Xf17Pa(NMO`Z|=^R{Vme7^J4 zS6}myYhM1x@5Xd&fXNtkv2@GnJy?mcc$L^tH)Yq{N8CRVN8V~8L|UN}2a*RWo|D#H zE4va^Ng5|Gs50te5D;*5K>536xHK%vjH+NE|3bk>c~FCBloF88WlO@?w}A+-eUIg` z1Nt84?VsV%mmb0Qef>l6yvIK9GHRzcpFTausrh`%5Y5MJJ2!rIgp4ZEw@=Df@Sb6I zB)#vd7O;n=O(t%mZ+LNPY|B?8po;xV5y17f$6|Zoz@m55yA6y4dUjvt?0Zzo6fe)fBw@{xyLc<@nQx%X+54~lqrd)p-1>z(KrJw7 z8(6qm1c-N+<$Ov3l?QTy=Nye2`$LG_J%&3eu_40FU3cS=k9jcu+fO}j`!ScEyD0&h zD9zb+p)<>c-(NVS@6~`RNoJT~h`k#Jq|-A&&x6)%Zf*#Gs7fnoh<{{XX-f2yB9pIU zu~@{{CJd$;j_}umEh|XL0uA?#VaQ-InWAY-;&p|OU#)OT7I0FFdzbUc6P8_F5>E}5WH*Hy55&m)4(K$ zF$NnOGhq`G4v524_oP0b-06tHA6o$FkSKRC^JOk$K_@~f`GAN7SVi*O4#sXM?PXKs zUQ?LT^aUpcioW*D1F9j~m>F&BHl>p=HtvCYKzz*xR_Krcm3kLd*ia4fC?W$du^&W4 z9S$A}0Fc?u*!W_Y-IV5JGPzfRIM~M6Fi9q3vD|^}tqZ6UdeTLO_kU<;4}h{!&UFEm z8_jImX3ta8drcNV*V|cddraGQzUq1QN7vuD{nFomJC@t0v2kc0>|zcEftw~dZU}jk zPAq(7sjk7KWrkPy4YheX7#iU;(&o)n9>==8Ze}{hs90@^cLqF z7~|0oz6js)_=n&*m*4OC7oBzB^~>cFCr|GHWM-qbog3qa>jQwP8dle_)}~iRgrtHh zPd5Ne#$$~3xS9EkQ{=s?pFrqskDd7r;^_N2+Zi1h++LAA22>Vlxugv*_H0^FSnXMV z%iDPeqRQo*;Ry?%>v~w`*=#(TA3wG8)Yre~Q`h|b>)wOAPR=pjH$%6x1bVmBkNqrF zI!+y44n^&mZK60jD)g9BR;MFEzJ33zQz%0jag>6^M=C51hWUV8>PoZ_YIHR4CDEjh zz2=NwFLgxmm~3Y+NDRaQ>Xg7Z1Ky*7MN1ajJ3V;8c-W=q<7fYmC*a$zd?4*?Z)3Sy zVLTcE#(>!^x247;s86Z>T4E7sSpU-J@i=?84*<)w<@_Y(#?X8+a&q;D@Ax>s=Fi`U z4}9z>c5IKy*v+u@eR$_!SRUwUA*6vT5m3b*kFv%|x3g1S&8UT4uF&0m8qfOXtMD5? z_RX(-;Q5EXk8Ka@XR*k;?-~$y0B(V$*h3iyE8$1WMPMR5MAU2^qcYFPBTKRx5YGGTelA1%D%C2`}z|!grC@wE-3H7ErM^^!GBUfGQ_vucNiQ zJS)qP0oATxW4AOQoOyDJ*r%7Xt!Ya+g9S)$7^@J|lk$l$L-oHipklUIES52794u-L zJ$v2Y97bB2rXElwAbSRF_dH}~be3V6XO?+3Zkpqxw!z=ra4Y}h|9l%hdCTW<;M@aP zcAX2V(D;6kPTbFIMkg|G^s%5zQEDW3lRio^fb%hD$Cu z2hVxz1M&S|_rPc0@7%+0LT_iMws+>8bu-weAqDw0}H0a@VQTN5|uFtk;+ZAc*(mm|TP+Wp3dM18|3n^nH)I3fD0Z&wR)eL$s-_?Pa<|IU3vO7;D0LwLt>T7~mf3n;4nplNae)gsP{ z4ceu>B;{YqHdyOt;llnxLB~I3ax+w`YFt>uKGN6K`hI9HbevgU7f>;4DUwE_I&&Se z4)jO}s1gx?+aTv2l#hmPsR5IiF95B*&QR@Qb!wuZ9A$97vc9ayot*{xz86j>0U-?} zC7c#@iDKiY7|{xC3!mfh$OlwqL!!Z^0p-stj(9@Wmo{*^8AOYPZ{xbri^w+_2>424 zpkIt|m7`8!$=_r$foy`DBpQ^%6fvms+@NGw#>s98iDeL(*>v2_KX~hx?)bm{*F=#&ULt_4}!G^2q7BX5|_++y?h@)(i-SENVI)-n z!un6PJ^J2aG?`*NnZzZVeb1PTM`+syw|wdNufFQ)kG|}UZ~p}T@$H@bAsBA4bJq#%KmRa(^(D{2w?FOSFWA}`{lQ|n zMB9$^jDk0L((lNASuR~brEPIN>4O3?9xBn*wjfU%{;)5J3-Y~>+B1}LTx?OO<6;0P zgAHM?r2GxpEIG>_u9bBqyGO=gItjBkd$g;WQUrO~txp17)qtu1hqWbyW&85)d6F1s zT|R~HgX~4DChSYJKcc;rVwcM$7Rv>iV!1G?vXGgUUD~DlDsJ8ICt%9@%HfGMNhn^u zOE}Xio%onDo47Z_+MvE45+G|kQ__$ zdv!xHGYFR2f8rVva;eAwc19lA_rqj?k$yNU12&Cn?i4Aql-_4C_Cy>et zI$Oyt6v_V~?aT}T@XOM=uET1@*k}p&J+y(xJmeyL`<0jB84o%_o3k0Z#S$my3otMn zwPqe2eWr8lm#J{ZTq%pA(a4`FBxDWge!cx^CP7|Pc?N)1-}l(@0aYsAS^m7ba*2*s z^c*0{{s^;pVTLLmMO&DqOm>8xSNDTdWTWdXR=wQ<^L#Qgb7LCZcK7yg|IV8~^paov zG}`o#`7EX9h9q4-PE6K7KxX^C9CR|z%*ok4Hb`wHQQICYcUznTURlNKwd zAUdI5j|j{v_EX_k5+9tECu~pHi`Jk=V;J*g2VSo5HCH?U|NceK#4{d#-;EQe=5yvA zZQHsN`iub?#CM<7HqKj{PGPjx!uA%;c#NhU&AQ$mo{XELlhFuwoY;Qq@4n?@*S!AC zAHxlwy&YX|F_|=IjN4DuTg_WxTnl(ue zWK+S1e92#QF@^aQy1J&{^3R;dLo-zQcAKgnjXW>=J+_tWzGt~yVzF4DF-^kszAakc zVig5$8=QU1uz>5w2D8}|5w8iEDEyTQF7l%5{Tka#iC1#TU%}fj7$rw(ve+UJC?&7n zW^a4y0hRlb)=P(L$`j1x3ED(|`&I77U6q7NA1~7Tj#!nE&2m#d=1Ku<7c4PbF+kJoJ4IjGswqJhJ z^|1si6xJEH(jkygR|4ah{q3_%Q7KR8H z?w{ci54Zr&c=QAD?8}e5;{N9y{5e?0iPNXCTJ>lef@xZqsGELfQ`8q*A%t=~9;stm z*KH(DEvPKZ)IUVMqG}&dEqDBqzsvy@%M{M%v4?%(50xmAxDG$cc7G$5{dj z0u{2_+jNjYV_e|gG{AO`D_-}W8$a?>|NTw4<4ead+qVJREn#~GlL64^cC(jtazU1} zGbAuqvi_9uLk>6v84P)kQd7i zO*`J&*tdb%xIKRS)Xr1?``bT$&7ZyPWBAyOx8d|o4>O&hos0n6gWVB+krU3WT8%lB zzt;^E77QS#|AsAyR$vCqc!cHl0{zYc-}&4pJ_L&j->7aEHZ-HIf^So~JBuCks}AH3A>j9;h5{Kmw;={p(@8oKD)K0ONln(% z@VP^X%j05IL znm#ZJ0IY0={}Y2>PNnPjTqSvA2p$Pw6j{Kr;KU_PZY3U9ELb0D@%;m1V2qokuw93p zofTjk9NL)Te&-#)RS!KM-|?7B@Wji`KirPT$LI4M%$G|T2HLjuBivpDg^oCXnQTA` zs2I|ohPI0C5rpPV%bYb34^)Wzb$sgk9*gC|&rnqWju>4_RMy9^Bk!Zl3;PYVO&?Fj z7`2svijhu(th9OEeuSJCA$WCQhOt~%EQ{tO_a_C05ba{TEO zFI89kkd`Es6=$cVy@{P`;TAso-J%8{wwRylaMu0NH11{2@c^eV%N1yo9Yk@1d6)@{%Nj}8VIqJHh#3v_Fvh~P6P!9Z$7njj z%U|#e{LphB_mXq=PhN9!duOX5GjCg(n@n!k%`$}h%#4+vp~}%u&O!<-F3SnCnTy3T4RGXwQt1l- zbrlhMKNwJPekg^o)08$_2;U^#My7xj!t%7UGj|3v=J#}FK?6i*#`bVbk{EHL= zs!5_XA-;h}MCU{y^30Rx=L=w%3&+|cMJvK4&Q3U#LNr1}w!yGxd?Ycgn*~(sMpv4)#k6wp#t@H_9EA_vCS)?__HED> z0~!2J}eYZz0|3yHR<*zxo(3k02pjj1+Aiu@(L{USMhxA<3 zaZ2q%q%Scu>Y{&CA1ow|hjB0b^dp=G3>biWi*9FyzO!f=#>EFW@bF8I;8~BpAHL<0 z7hiV4;e*Fufs?1_$5*S~1!Rp2%Hna$6y(tT8;{2rkN5ay_B7fNd0PY4q`v5$?fV|f z@}dO?TZ)$l|oPRJeC=~Wpt~RJ86yxqwxqIzU?b_ z{QQ4=%i*iv^D#^h%+OhYdyX#+hVK(6t3fhM!S58b3q1&bIJK}YzryTA-AmRl73g#z z+PqvbvjG!XO9d__(~e}r5%XtMN;?!P&kdvnm_pD(Ansv^VTiCjw-~i8{@K?*9KZPD zXIy>Rd54~J;`H`x)HHL`xc4y;+-#JexQFd~cW423vwa)0BkgoFzxnfbT=AFh`}Eas zd+$HseK*{O6DM~-qY1{d31G<2a2Y|a1)xviD|nv}5n@0UExP9iG2B$OMbj9x#^BW5 zb6j-)BlzVX_(pu&lOA;Cti|>7#cE~`0l)>c7Vqqs`yF4+Prb@sVfcR|YW~g)^Ta>71&u7AA z0Fu+1UnmB~g{G0Ze&|=9ECpS_HkVQ`MSIpe_;+8w^-9CZ;n;TQ?bp7m4-*@Bo zzk9=b@#))7;lQCyEW4FEeTtK;vL8{6fq?Qy$rx8*6vOY2pv+;Exy$yDK57}dGxgpL zO%IFf3P^-|B6xCGl}g9uWhgq*P@Z?ztb|KD)6}(`1dc+R1Q=A`WZP5w)N&60X`>zU zvkaalLkz<`y44DcogQGqS^Fk<;Dv|rgv&3+cYN&wapnEbKTOT&_+n>{?VSZ|&uEQ- zX`=OZ^%>(%G8?zpQyL1WYQ99`AQ52pww$3#AS!dRta+r%LTpRTR)v9`JfKQ;qT;MV z^PDmUL@3_{)7vtOg>r;Er->mSruQgYd{5H>Gx0-AT#QdsEauZg2Xem z*$oPH`p+0prCB(cN}MIhky5SsPy!&G@_})d{U?KttSzcIFGF#^BMW~k6j=sTC7_r5 zD%)MIV9@Otnk58)MchMWD*2TqM35#~2eS^?gN?22N!o3OD!&$WUG^81GFn>-FEQrs z0hL~wn$r?AsJ^_Fl?X6%9#E~<;@Y&C6pYFP>Rv6NQnMJk=t5u%pirqUJ|6*xhQ>Jl@>_@dq6Om zOyaTWfNoc+*2!=&;6@6{LmI(^t8{71jMZ|5uwbuacVNMEHpQ3kp8uPF|0nNy#cTfL z8cYstf&ti`0czo9rcAOs;l+d)teDu~Y|Mnlg}6q{c1K z8d&T51_mtOy$B#ghfXCWUPuF6+9=r|obEJ0^gaUv4Pn%@Se!TwOD%r*yPuAq{O%{b z_I_vY`#!ckRvlo0Ez|Jv5t*p0nG_5M1zCy#m2~Pt&ekH4-27%Oce0^80RSCPg=OCE zzPIpIFbI(k<$X?d<~FDrP(@o&0n38kh)rTZkmOyR^a{uGbph47l`TcXGGdYmV2v$( zDg!Es1=rLm6u{)NZi+q8KoQqSJ(B`F1sz%Ab}F2!j$po%9T4O8g< zr|29LAvq+3;!)AYET94qU&NVw6{Y^lrGnD^g2P!r6_yyelMMC9#$Nj;f{-FV7q%+2 zakqdf;UAG9cIEEq|Ezariz+G`o z;6j-%(VFz7Fn-8WWgn-Q4b$MAv(Hq95^=8Q3Ux4BknIyt^_%Vc-og!T5w<2{Tz26W z9`~>d@r{qT5RZGn`E=I)eKTJ6hfggQN4vgmMcwFVo={;0chaLOXw{_Qm3d!z}xFGu3`XztlXQ%?{ zo#okVI-VcfUj6ugdBgRu{N>+!3<;MRaU22%?n_o@REcp-gKR78$-miAAzP+!Ys zIQoq8T3}89a_JT;`9|!L?695iJqUCr(=2EwxzElA8fwHhQv_KbDVl>W5KP;Eh_HQX zf%DGVhky6|Pr(m9`_Z&qEwI>GV*mdA0C%(Z{=*lx|M1$6;~nq)ByRfLSI{jw&h$Ij%EzYtgn znsORNf$pPnU*Vvv%H?8#RhJzpo&`henm07CDg!FHTBtg+5&hj7ZVudva3|uSy#-Y8 zw66=ONdH0pEqcNX#19>tPU4w(k236&rQHImkXEaee-9N6Hc8o@&`(HKlZ0N>P8QDF zSbMSWp0;ufwTpvY(5oC|(70SJ6Nb-VCa;;C@#?e4MFn0Adsgn)Le9E?xaKg+4Vf2l7_KnL~8rN1Rt=q4 z3#htI1sk=IoZ8YxIckH-{aor(urc;NrRphl9ntep$=hH~qrZAHwH8{}t>%Fu}??AkJ*OJX;v+z=0w^;2VEkI$e^Whw^YMo45`LO*%Kh zyD$PBxXxKAq^`T~ftD&Sg+>yf_i*GY@8v8WnjwbPBgvc|X5a28AF`OFbk1~UOC~~_ zlXIqcEjqG1@{_!>R?z9mH2$4dJ!84kq3?laWN_buQ#|mJ``}5BxERlT*hM#8apdd= zjmINkwRrqaPuH)wxdPnZX8b`IhH%^%fMP_0&-*xb!APsfbOsKqHu z-}|boKk(ZB^VNTi(X<6k#^^f$;bpWo)k}iE9H2ph?MuaUVzd3jLT!34P@1Ws{X11kN;W9?2Lqjlt>Da~ztD z@RQHG5-U+tH}dP=@d^Ch2S1COKlf!|wZv%LxTSVr^cG-h0J$8~&j>jX zP5!`}&<`y7fCbOhQ6cVqp4M^ocPs(WQLyr2!TtAdT+ICrPZB$+^CkmAfVVsa;Kvlyv^1I&7 z5N{S`uB+1p8#(vIZI`)d0TRe)4ULwn&_V$>QP z;v2;(Qk#Px+G{{1xmulREX_*(nER+KBUmk$Sge*XR0dSS6c-pv1(i7_g_dP0N40=T zJ(~>*R`pL3hjqH-2BB*M9HEGubwgVcqKvYBTDCRPAC}-1Q(ZOU!TO$1U>Q*5&xKSy zm<(D9qacLm=oV98pG#bTiYDuF^NHKamtrhEf|qJG5fp>i*TQ$+a& z>nv8i1uU>JZE^9| zL0o$AeQ?!7&c)LoeEw@6eg7lh=T5u;c2+BNo!v5q=55o=8{_mtEz4n~(dE#J2<{WV z!e@|&0OD#hRGNtx>|f0xmrdK#3@M3#s%c!Hq61f-tLFGK{wov18my{-&i{4+l|MF_ z(~@h3TjFO%EjrVF^Y6d)qgVgftKW#GCzy>HtnI+uARhk54A;M*?->xsaf|U_aeAhd z|KwPeZjvZoGcDGmrBWgul37bLUY01to^_`9Og>AM3NGs)BnD;IeemOSfWc(Yj#_Nr zeHsVa2H*Y6%VE&tjqm(8Zu`n9!1gdB!f4#MeNDZEB?4ez(R!x2a*2#rm8AD9`XTm2 z!A`L^g#qFouszVP+$nzJ3Fdd5LNjXcBj5Qn{J?iS2@ktqA1#+lFbtZ8A{a8>XUV>- zt#VK-sRbu{4yY=#(WqmaNJ0i0^E^Y#;nMed+oD{p!Bcsi%x+&w3O0ld9Z1UeQoLAt zH3>aLn|C`M&OI7zW@!V9nHpDc6(5B(c(@pI^&M~pJu$$8z<2JcV%v)dsM0JcNow7d z0lOLpPjjk-O{fJ_%jFWw<+5m_f{4iF*MF~p8EARBHvv^GtqZ7%%8 z!bSxlwVWu)l~lyUgg6cF2Rq^|*>;H?d_CHvi+g}tmXS8KXXRD=r_*)+jS?+s;DpQi z{qNdVZmCOZmLruca_3+o*_=2iL;!^oNLloQ2bwnMhcW)hXp7adN4IoSADd%?`yblG zL+*b*u6*c)c;Z7Y`p6?MIsZ|O=T+ZZtgM~+=Fb6|F)$fOB#$Q}{NX!4&OiQJZ@|e@9h&|7(62nG5B| zFVkT)-ZxU{(=>vO2uy?R41zBt-`!3U9$6{-Pw**8*T+m1m3={tV;vP-6 zK+`hN_t-vm3ir9+dH97N_-1_P(;oTkgR|yMr{;^mOD2y0ss+ltEkcg-zI89X4$mVCsPet{ zbqu8gDnwn;t6L%o>jNs2uu;Mq$r`4*D4HrQ|44o`YwunHs-b~^h}$^3r%&EeWdv*& zu)uP;s=nAa1tI!CJcgEyQjakts_s_p)V(}aM;QF?B%rBvLo-!-d9iOOEW!cNxo12> z)%q9vDn<14N)lNJRLoU6|GlJYKo!4`64Y?7aOANKiV_`|0p*K*3xG=n{fd@KT4zYZ z{h@%Ws3Q*yB*^k*37xMRxpe_mZH91Ns*WpVhCv2YmMsiSG&sx_!Cr@DD%|%V+s&qv z$!rBa{x=`Lm4D?8@4>r2`2}q5pMaYNt7Q-F-3TubK$Dia6v%QC`*5G7drFR3@=h?t zm&cLTSPvzmQRP}RrX`bNISO2+9;SF%I!XOa&l2kU`o+H5$Yhux)}w7tr7fxjvTD{D zrLPfcAG*X{GO^We`4gOuQv+))R*Mz-#R{;D1Je=ich-K~@5tGB#DkCEDGxbSj)2kT%mS44oHor;=9 zfK|b#q}S6G%7_CpZdtWKk8xwsoj#4l&I(Vv>Y@0V?|BNIbj1URt;MRhTWw>Ghvj`F z{sp-k^dq7#V_*P%O{T?iiPh3Aqly8PC@TQyp_Bvk@O@nxS`McM#l;|PmG-Dh$v3-9 z>Jb3-fU26R1E2%XDA$(St!AhUsWVE{5^sp0t*Eks>%_epfA-Kh!Bme!a7?D2fxy(HFOqix(1i8@7RvkM~FwHUFNptL8u3gNw|xLREu z`Kbrv^YQ5jrV}@+W!Em;bJh(eNdx6K@;Y;4oV8y+f6o{$XP>Hs-owPq{{1Wrj_*!W zf{ifhXsMZ>n(xe~t-17D9&yRx%g#OY^54Jq!!P@dciw>c-KVf|U>`c$fvg4lP4bLj z6vZe^6jeE*2L;~BvxBmvMMtnhpEQ=Tiy2Be0;C1Es4-kgpQJ&P1R}_aOL0Sja6^MO zc}r^rWff=>o4{CjKJn0Mu@eZBWAP+{s<02mxOb1*(2oYA*%YIVDQMMUzF6R6U$_Gw zyX`CZ>%adr{$y(dmt1t1AAHGu@WcmSgvVWa(XF3UC`r(LGSq9)Ji< zL+Gu=e6hs0KJG!ZG5!vI>8sv=FWi0#?f(5(ExITOA$&~xsVcPjA9Zes(OP-8u)$KU z8FJI1dntFkIoMtf#YCYTV8+nHd0ByeXmFC}l1l{^N?GrX93Wt!H9v=$4=tF!A<)bu?tA#nZ_due62L(1* zW24~tyzbP4S~>%pa;B;1H&JELzk7tTB;_N&A@GL8e~O=j1t)r{HahCK_Z>=D1qmVZ zJroB97xm{etL3V+dsde$Kf&ru!14i)y_V_!*1A;9Pz^=v&Y&cK$Ke_$*pjSo{XhyJ z9h+WT<+6k5ZP?+_|#Umb{EcBTUAVtV~x?9BE5vsVIN9Jz<*0)JA#AUse_ zt7G5sHKB`bj5Ab`swDR$mUq<9)j(pOKkqBcjAj0=tsoP*lUP$vK3yF0*VcHuJyer$ zm{Ue)3KRx6#tVm7>;ueb3D3x*sE5|BvzJ##R}XaE765E+OfNdo+1uXu(OZuF@}IvO zpSb1A*x0`T(-KxIi=N!Z>@aI*I2f}WELFcksT_nphI|AeBLm%#1t5|uVR=AUViIyu zd|d#%e1*BGY*Db%&9vN*5^-rp+gC9};-CcOKsGp;TJvF*yI=CN4hjFz$Epxw!n2b8+Qm_ras?ckY#krjzRd zz;+gkuEWamrOXUNG&e-srlEO5G*6@J@S~aTZSc%i%mUj)w_q@d=7!PV`VyZC5(#Z2 zU^1SdZCam8^kKAZ`hcRuYRA)JpM$XbL;WUar~*Rq=V!V_WPZljGGo=-Ekigyn~ZVo z4WH!~{`z0y3%8$!+1LkOt^8OW1Mz)v$!n!G`AMeTJ=QaK2+O>J<_LXcX?u_WQ7DbI zpQNN5T8{!Z;}5ZLH-1D0A{u?s#}MTp@`J<+EB#ol?sg zD(ychI%QdE;CV5lqikyF69Wy4>I{{@XljNu6|HhBUtiW0Zdre_?qoXkOEiT&K{l8w zZHchg&M$~Qges;4@gVGEFZRusfkpo%X$HhH*TmbQtt++VaMhW{>IG7Eb13E5NVX%) zP{pOMl*%kugN62ZCR3$;;Rh3$sjWkM;S{!wHZkijQC1x*B!0{Cqdtn~b3Vv^kh&)C z$!7zdwSoNI11ceyVMtj5xa5Gc#^uj5FyEPjtyRRSsscl0SzOCrLapI|YOF;r+350` zA|`xPIyS3Urs^qwve3XvQDnixN?ophP+Zw9t!+&d`tUPztX1m7;=+K9j$94X8k1Vk~wRN>+1@v3Qn!fIw`) zwx9LP^T}w8>9oD{gSUOGhpzm+zx@Q*c9GaII} z2gk;U?BcAr0bl??AMY-&*Yt%E2i)~eJek+8Ew8nKQ(N;n-8HH(K)ctiLcYX3Z(FoI zVDU9kDc!caAUrVv;ou1p*PQLLFxCRxBkX-504QFIE+yxGnHX-fe^c1h$n4=(!69zw;Yi0DYVsJ`pUdWgBI=Or0AxkkJje8H>-YM0N@Hgs8 zDAzB2j%*=Ch?i6Z&Jhp?GR&w&ON7&Roxo_{3@?1nRe0$?dn~TF@DMF_=9n*6Ahu`? z%_h_7+|g^|K!no)&(G)@?tMT7)R+9#0*w5*kZJ){%FD=Agot)|>8-3=%VbsGyojrS zLHbW0G=|q0L~t+b%$<}dTISP0Hr`Rs6sPb9RDWZ9;;AAkHcpfm zQn80BqPd3Eq*f8m6rrPdV4Z^00;;%)Uv!dQ-yHB> zT!>P%siyQpGgL*;5}f-$K*jN%a4;EtsZ5LIaH;0byL}>2>Cg?yXXdapkU?x`w(n$q0g$0@=|E0%DD}_XG4)(|7`!b-PQ6rax=opj!Ca)jbQy4;N)a7RX zD9e=i7TT!S1tw+?B7Z2-DV!*WJt7toWa^-fVGN=1IEy>?`hjlQ13d$c!Qt5$N6y-h z3+}Up2V8s}9)7>`@TmKrxBcMr&w9{-&FN9e`A(gzWS2B)J@j z@J$W@mGz&wQw%;q>Q?F-7f_92yId@jbUt$*G1X>z>oa6J4FyzTFe1&`rIBOHz^dzD zfvwHS`1reS`7;0DEB_L=eD-#<`!-;^CAbfcSnTB#G9iywcl|4UoY0Ltd=Rp#X315X zDQ1-KjnZ-(+*<-XDWH;N1b*Z^^@RvO8AnVwwKLg@AmC}BC+)qABt*N<*1bSC7UO59 zVt^Gn;yK0u*d!YSAe~oX692=Ko^+>z7N#Mz;}KSi6&9yX<6#fGKmPSUe=?r)gonQ5 z;DlZ?-=3pmH#=tg4nzjCjalSelDif5e~6BFeb5xY~$dJoz$t?^3GfzE3%y5SBFxF zq8MdB6@j>1mM!b%R7Op<08|1hq42SC6_thtOX7qPLdKXi0Tqiz=p{>Xrb^TuN>}~i z=v4=Qc)$<>s%q5FNf@GVR_I`{&XO6?+ivUgm4JEO4AHFx!}6G@atTpZOyH)?dFDfApRkfyQ8SpL=hWJGI%Q zx)|=P^-vXyy&e+W2p^rAAPxVJBNmMk#!s_LF6dJ%jCEHuQ}j(_Q~hY|tVU-Bw2bGe zSY8my5);lqd2q5cjYJ-w^iTlSwsr{RjaMF)$h#v_v>@*GaUSGrZuN z9)}f*CEVOLx8o$h!X=(0U}Yhg@_>1^s~4qS);P;)f}N|A)r<~*Q^Piou) zxTUFX)IYpZMEg7CW2?Bte^BY$3cu-7ZOI=IW%e}iy`)*M(2&XLdyZ|3fGP)-B*V5! z61<4@6M%u)j=}d(2^`?49jH-|DZ|9r%NajvGgPW9VYl+Wj6tH6vXiX>AX5D`6j1HS zo@P8K$X!#$a=FA}xj-7EtwK8Wn0(BoAYhd9DDAM32uclu`y%dkv;Ub%+fYeov3$m1SD)vD{e} zd#IG*$VLLCAcwm3Y?K(G&1u7#1ys%viOMqFP$P$x(Ul^g%G6FfWkwj`jzN|CBPtG~ zGcES*o8pV7=HL5A@Ba8}f9owD#Am*AH^!SYG@};W`S67Zan}*~vi!fqJ^_lnBa$J6 zATec&Yzy2;j=q#|jqo_Xnqe}PyD~ah@!>_CsXLOR(;0O6F^jNSl-2L930ot9yZ;k; z8ooyrOG~{phcb!F1_J`HRQF`tIGi$PV?7K%P;UTuAl7$1R?8mf0KmYEM>ubDg8LlW z#5so#;eHpNgUc^D2M;;2g^RZ~UwPqK8$UN2P3MX<+hNsp=vF;?W;b&{AqWZdFaVwb zJY&Y38LkXJL&338J_Kf9G8y}TO8AUu1NN4xGgBO9t*OWx_D~rzvC|TsbF^xQ3s}!% z+xM^*m`+Ey{xe_U7ys9*al^+xhw=Umz%JdZJOV$Ia5EH|jPjY$7}velZBF7I(tQY9 zrqwOBIrqgk%hF&K}>=(gurZlA`Zued*c^m$Ljw|w2hUa~c7U$fkqqqht) z4Hz~KYFXPm05_YZpgT(vUnn~PX@OY#Ie|ke_`kY`O0LLoY#GKDv7agdm8LyaoCj0| zmQ%%Z`8!^cd#wCtEuh-#DSt>J6(xZ6Ae~b&p#&8iw_89Z+f}wX>814Ds(l5`BOT-jl#^;sSh5{-@Xzpukv`9tdFy0Dp|5#;HOa4@$ zmFCqHMK~Abc!I1;QOE)+#SBql8W9P>lnQF#4uvDDmRi36bC!6v+( zFH1Prn2-Iz6%G&?f*X`E4HyPp&scTVEe`|%ZG(fe7U%EZz}W|;IPdIzc)szzGNoM-n4gew81JZ$nE!WWMEUiPkj!sCpq;l=?Vd;u4-+^%i|^XMJyH z`!*)WKYZIUe(A6MCEowh&tS5D1GekkYzrBHZR#gcK|XMs?~sbXEt5M}(txGU{9oQ? zl6425wue*S1BvLzjODN&)$ZzhmK9xB3#O%Do@(xqKLAM zd9acD)v^>Vn{o-H!x)(@7Bmh8RBEtO%AGXVj<{qaB1NJ9%JvZvc6M|?74X-dR{@E( zCVIs^q;k(BpppZM5^Lv}JzOtlR7F~b{eF$f9;|;`kGELJ5P57NTT3vFiSMDR%844- z$?M2h-mK{dLNJ)>McX>=s9VrL2Ib|8NtqAzy(xm z52ZlKrVu=->*9AY5+A6ujL~?6(Ri$!Z^EM$X6!Wzjm87Whu^~t6`A3(v|^R1s^kNL zHX4mEo=mFNs0dtr`)y>P*bEv0L&dQRqtf?17CTGywilf z{xcg;&~6rfKZ*xsL_pJ`X-s^-o$VOia^-?7pSNinY;8<%Xk(16{Tn#@&^}ynpR;i3 zeGcM*=O4tm2R3ltp^aCZvv2Zq2WOKlH0C(KGu!pEzUwwteSd7Z>gQc&Blv{@47qo) zxfvqDbTUEP8gEOeFg-FZml7$z5!^l}5XABr6e(O_Pw2L%*OMNAHCzfKk}=8apk)|`e}?e_oKHixRm>uQX^=6Kou)q1NickJG9KW zR|6{PbBki7QbP%LsUlH{D>6?CpcP%hSzZ8f-&7!>+GH#8bDXtu2Lw948*~5|Y+AIV z5f<|u^gDBW?V}%rAOG&B;9IYJ@Zs60IX<6n!&>-RsX&eog#87}7L92znN7;R%50u8 zJ!Myvvk?A|oUI6H@Vz&c@`~$O(320;B+NtV{@Q>_$}0uhxjN{cfF#9-OMg}dR658T zgm;SOAdu3N6=LIU!{7{62}=R*qJ1*%3hf#lE_vyr#;MD)kr*-rOyqiq8d>E2B`Z9R_NOss*|4 z-DY|grA?%Oqr30PBi{3+<@Bgj#yi zP;2zfW&L_Y#a*C~hk<>w$(A+d`1?QiWq#c|KY>4Z|1CIn_crz)+=T5JeZO)`SO|V8 zO*-aT8IH(gf^JmcX=Vf{InI3l3IM;HSD(BT4QDiZq8>SF=8X>v{>oY3NEOTcP^hNn zG^$INd>wM;l0-d$u9_o5F*@rVysFzjVRPOEKqJbI&!sBVfjyE=D~J_&!YHWHfv7wF zxalx^gtR}(c)hm0#j<1cU7wD!ZVWa@24`)w*gtM@@W2FT9oUEaoO1~GJ?9`UKJNgI zoV_0x9-O`Uoc$ZGK6`U|6E%%n_Q!T+EzkR|$Fl3tbv?SiM>`r}G8wyxHqZ=Avn1jK zBFqgi2bmcGb0$$@1v0082k&2qIw;{z&r7*2RDeu%yd_KwKC^w+XQXYFj& z*&_!wCO3cb=&`r|*en0+X@C2{n=v}LAGYrRcFWL$zNVqN1KB%^DXr|Fv-`L0|X@6)u4;- zYj?>;o`=0i@H_&GU08%Ta~qbuI#sYR+@nE{W;}wmgzY;|W8|9Dd;2zV7u8 zIdb;%`)-NTJ4-Y~ATru^ful_eJT{HNWHKEL)a7V@!Zyko#CE1jq~t3H0Yd?mToS(* zU|85?LR=}72UHsyGo=%IU6NMar;@>xnmet|P>K9X*CS1U8kiHj2(m1YY*c1z;RC8Q zC*TQ;Q(uBcs#wmRQ$_iPxII)WL6GbZ+32#25-<;6UKdc+{NP@f%O&!{UxBUtqs!$I z%f$jsn4uB_2J(O=O*e^gBe4yEgZ)c3Ov(W>K#f1;ua0yDwt&V;STD;%DJ&JQE%}Rd z%b>65SkX>p0}{D;(#NI;o9qh_t|Bi#en})yK}Y^<45%R3P6KtQa^y&fUfNcUjwWWe zZHwu6?3`b2P*}Sz;hn09Q3`P_g^>+oOy-1QO&WD&flUH(do#N7B*RdFY>G7Gl@g+o z>^1oB`yM;XCG1c@wYC6?0hJt4VbQ|{g}f%9N=OV!f(ipCK4dgp;f(`H6lYUQ)e>!~ z1XODY@SS74RcCA6X4H)-PAyhPuD$W-ZNK^E594h&97WqOW}6dqs}=e_EJG5&#iKb1 zWYXXRDH0SY5-dr!LAuhR)47Q>z;6YhwjeXG{l;FU95hHSe zHsOF09?f-9w$I&H;v5FoSzEl6DmpIF2xl{w6&eElp4fsu5QMD^{VRZi@v~XR1zy2X zbKjv`cIa12pzGix3!rI0;}&OaOmNn|3C`L#!=e5AaNfBGao@8K;>gw}&OJ24`Dbn7 z`~#aWKYMfhOZz6HEz=snjE*Oo8H=t*Z|%(XJae1gX~P)WCSXoPXbjB*O{!%B0Tly! zQ#TP-t0kJoz)%x)PjQIE6&9~5CcyX;AVMZfa8m%R5Q zpT>Cqeh@5rOJIN0eK|MRqqG^E<5l-EG60jCu_xOk7$G+o9 zc=lBfIlM6$9Y4Lj4a*!~6@c82gqlbPRMW|H(45F86R20tIJt>E_+uassOou#S*LKA}#p~SWN1*BG^(Z#K83+)BD`js>5ov^mGKfTGyl6L{0eEoAv`_{T`~k zj9N!9P@e85(JG6B9x7=*pT|h{%mOMoa#!vZDhHJ)22^1WRbkRA0aa};gc{ON3Y-9@ zBxZ5O0aezKIp`Qj4&G^Y+LYpGlE z(2s)wRrsQmDX&<35EcDgYw>)(1LidW6_POwbnc!=DW@@M&(v%-MbjAE{FS@k_!rmR z`0U?#=g0BsFMb8HjS z@N`BfdD^7U7QCqK$&#S2Ts|Rq9}5*AF%Py7Xv@8YE-O77%JQ~H82vB^fvm1jM?r&h z7?EFv8yBDHdmOL><;)RTDfX=^ITc~zAck8SNNj<=hwXc;x*pcL-+;@4W(SAayx(UxtZP%FM}f6#}Z^XL8V73$XUOR|f#5vsqexze|b| z!5n==d@}Mf3T(Vl3#gJ`6~1SPjKbdxC8|5_!pBvDiVk z>Q#Hrq)+yeBpxyzs~RO6kyMqxItwTCKQ^XX(*t|=_DdGLlt?nMpyI-qrK^rc-YTS)gnB>)vuNyg=JLtjA-4F6+H?i z#+j>j)L=TvUL=-1Q2K|GHq~9ys6&7`axa&h&*$z$DjJ$|DcgKc_z}STs2yQEDQBp3 z>+(9nwR)M=YhKuy*#(Wg9HH7f%{eV8)s(`erfD#n%@CHYtTW3)ZCIB|df3ZqZlHw! zT&vVo%KUTL^W>Jzn5NxoOoQpTISv4Scgq*~f4uwS`0wxe6qd_vY-~(mEjuF*2`&(q z&H3G0y2=RPDH~Y|C@APY;_tAcJ&v@Cd@%&)^h*cSB+B-s5$QS@#Y$EM+=8>q<&*<; zIk?P>f^;~6K@kf|{ncPt+W_5P%JH%luA`#`=FQIs>&M?4P)Q2lq{I?x9Vbw{-yL zA3lI{4sGCq!~1dWp-r5+Qn? zY%iCKd1KmH+nQsRc_Z+OfNc=@-`LLOgMkeKwk5-R%ZFE8f4H}H!}b>E9@@P2x?8@& zKlm$uj!%5-7SN#$G=|{bU*?vVncUWK`bc-u!m|W!0%#5BT<%9qQj!Afa*lW1@^sdJ zTwPrAJ%Z8-_{wLs<4rmE2U03L$bS@| zA*ID)vFi+#D)C+gQ_k0IZf@vcBb1{?|MyZ_{bCAQT@KYotpIhK73kSBEeY!}yMf2q zbc&{F6wCM2rvphp8~k?y?DP2!x?Z&LjN7n#$^)wDWa0+m2kNNJUac)314zk@s$jWX zVX;`G?J0gxK?hi}G(h&vUQ@tid0W(RhTo6iawM`BGJlV5NnqDNiN&wpcJ$%az+h z6$c^rM!Ou17}nr7UDSN3f9O1D)(Igq=cV@Q*x(b zJMmAznVB#ekI?#A&6W&cfV&r~r(XS`TdsNKTRwyjed0El8DTOTqxYx1F*~Q3whvNi zEHd0LTCIMQycX@8C@uCIS42pHSl@@D_#l$0EE1=JMviGaLrIS{2?GID)i{T}De^h( z5c2+Ie>2i0^eO1GS`rbS3VKkJ?`l95z@^NqLA!1zXU|I;l?aNp6VhI-fK0$3|1w{f z(~7bQFa}KS;0q!HWBd{Rfeh=H&AIno0k(&q8Ud)mxM^@;I>P?h2nRPN*gqR#-)w@z zXYIq*{wWS^OmO(%CeGS7#kq$zacJKZ)5++%{nOFa2WO){n2twBC*v{NCf|R$TT1+O z@7GE!BB5)+nOX*V%dp^?-!C{Hj~cxHGq>|k|JK!b*N1NbwFV6}Zi5N)qHgE~qSYNPtoR zML7m+qQ z+TYLzV$jYQ6IV8bL!u&I1F2TpG#36-H;&o$t&zs80$R%DaFxD2;{m>*o>JesHhTXr&Kge_9Z-nnu%d$z9 zNy1*;GrEXKzsBeu0y#CA693dw*L7-!YGAcrDvwKBvL~868Fc#8Dfi{xpwwMb5Rl1u zj3WB12w1HIKnOFZQPp(}W$RuDS%Dz~bx2W6SJ${EO&8#%ZH-aaCEk|-z)YB_i2;Ut*!c2o4|ixqXWiir)&gDcs`B=bOoQ2|!N#b?p#w8)P8y6x4K}7@ z?3<1;osKb^O);B}uzzEMeH&vO+Bd^l`={7H8)0)i!l-R99vN(m+MA~1=A+Y5d()^f zw;955L$pnVIhbaKaEyq+gbm9$%#2yz+gWezM&H?4XYJut*B|aIA6fPMw4G&#t%Lh- zy7s2qFZ=heeglr(bsD3Q3oxB-2?653{M7GB4)p1l#q6x;qY$jCK9bdt$nOn`2(#2S zt29W%@nO9bHtAahZO z_0+a)^#5mysaVJuXY!y^u(OUaE5A2#%|WSqrvd8$C*WRV;`~43On_(DuTN19;0D-H zmLY=*2C!N#ou3uY#=Lu+&Dd+Q%ow#}_kJb@idO>dAtjHvo}TE5*d3t2mcuD7MPJ6? zD8rMrMBz_i3sP#E22I=UX;#LDLAgxE2#7OWE{j#q$>7Oa>)Ocrl>=+>+EDv)tm~ds z-)4((>m~F(BVQ_`Pg`N>nGUo$wRh{wnzP9cCjL|=JKn2c@_YA;b&(&r|urmFb zx1sAgu(e{QXfNfTIUj;U42*8FV<^M=>>(;@BN9U+Bl@xv(q+G_JR`uO%PM}P=La^g z)ahimDY!8WOn%g6g~x@V6nRWR?~o#~KbXP4EIG3aXY51v7*I7$qhz&4Z){6;qGN3Y zWjFn@U5{?nrQ`O=V0*Eeo5c!`zwqG3<~3rxn!>b= zJ38AMgyW+_y)ghG=w(2h>5}+NV6ZAMo;Gny+1OM_3VuX!0{xZ!HqeXfI=40(r0597 zG21U0e^jh$klDx1&h6#S+G50-uKvEt#HTbxtrkv0JiY}%UGXV zlZeT9gpKJKv$n-#ekE1pN*=CXvUOn7!xgd+q=sh_KW)(3P7E@btn z8RFn8IP`U>a6qra0D%Nnp^3_gq;|XeVg_Hi@*LzC@oe~N(N0?2{>3}+*MIj(Jow1r ze{*m`zhq2%crkQ*ogL9VXXFj{oZOOecc==DON_IZR1Gx4z-&eG#^22>I~9eXXbKxSKSJWorMcFl90v*NRWCaJQ$+i zEu+{d^6ysone?5ahukS8&^Y?iB z&0hxD9@BjrU~9m=JLZ*PfUxm1fMJ3L?GbFHs3(bR0LgO6U*1MYC0AHD&mX`{F|rtF zk=J4@!$=g@mPsH5N}T8ocjK&9P4|O+^L$9(Q*aPzleklrC4wMXe+*~>UnyouGikCP z!bm==8Age}Q=p@&7bv}wp$arar+G$KN9ZI0ax{)Z8{Itx^5x7NhqeT#$*CLdmy~K$hQ-g0BT_N zZ=z`%ID3-XUcRF$)Gv9C^e6ODkp0+QK_5hS_=nw|LnU2WHdTNVUQZweR)~fmPf1Bu zRMKTG6&L`gsWSZu#G}z;J<2WvZidQRvuN8GuolJui&Ljz7AyR#@Baq;@=Km|7}g$N zbp55H#vE;pnUC5=vpDG25E%1qaR>fb?Ck7Bx^@FgLGcFSEa zBKk*Bd)1Y&x-sA0-V=7K1^^XbmDjIly@APeQpY&=BB|hA&=zJk<~wt+O&&qJD&eoP z_Uz{CB>}>nVLF|lZAWfqBUhp`NPC%u3BkYHX3!(PsQRmfm4|pR9y?k6rwYOq4Ze** zAOFdd_e0~!BiX|1_u$m*efZT(ecB)^*JpK|7F_r&5~9n2N!pNd?Cj{GI>bo3q+ zpT3F;B}q7wl+T0OR*5Fvt)Z7%aOEJ115+ zdp5o41y6eT;m2Kev*EA^37`>Ys%i*51Xtd~ zBLUKoNPOncY8<99c`fkGnyhM(%M*MFYmSiCqL|v6oJiIdZ|j6qSIbp1J%N4+KqFu- z+v0AgdIL-fb5wexb9M~9xzgq0~M^x${SL%BOZ*S;9a&{EnXIV!hyMI$*<#A zqFgmc1h4*dKQI_p%!-hBjyyk_QKN$=V?6iV5?77`1}5<=zN4N6Uu4j2LDn7D4enha z2aB-GlhMMO#-F?y*q5YO4mjuqNd(#Y*nU9soC!-DKYfu%o$dY7ryrS63hIPc)m(hx!cUy zJ+4ZQDx#%zVuKlWm16U6AipytMNwVs@KN`0^NC)=+PhYh(2+8ghuXWG1 zv6f&YcU!x7CikR}nlq<*HzTHuJ!vq(-eFlzn4(63Vu$jC#ocO>8;95PZg-QsrzeZi zctnRbL}4oB-X|9S_LKssXXohlvff$d(Y7pj?tpH0HBq7D;wnLacL+x@MBXk{-J4OK z&>U;6Ulw7r90b!eAZDDL@662(<_|vS(98eza~}J$r#$Sw+kg7rPvOt6{}ev=rMuA1 z#u#sI_)&ca8iQ`IrL6XR&?w6N`HTGUvF3#_fm=)zjp6DYrBb5a_d2p`H8e<(@vb18UW4xREkDG~1 z&Na|kwpO&oreDMsc4aX>FvZTv1^&~2zXsFEn1ABCo=B$ej`!Bih|S#g>{o!w{vJra z-_uH6VH22l^+CH99>2EKX zV4?#E)ZKGrye3sfQuJQ$foEdo^d+aSq%}#ETI?&2Y*bTPQ5e0W%BCw>Ii|!U{beW( zEYng;QG%mJ0tZ?7!_F=xE6Y{c0?k_dl=9V<3+zP-q!CgE&3(q>)wwdl8Gv1lL1N^& zI1LPd+?U~OfrpNwk8~Y z{~Z0BW2r=#YZ?T^fGdD0xg;a-bjZO-=Uvqmox5HJ{L(1_pqj?%=-nqz9UqNG__|Ba zKm5px&OQE3kG+)t>^+~r>ppM`?mTu9qsUz+;UKlM_#4D>dCpHYeT-$Dc#?YsgI= zxQLUU{zpTD}Dsm>sqxkJ}&mrwit zq#zn`9#rQOvJ%Ilvg0aUfJ7?j556hpi?YG)l@H-*O>`_XcA^!>!G++~Goo9pFx@x7 z_NgU)@ps>h$++Pk`;Mz<*?05hvYWNW%+aI+f}(y$o(^D<@K2JJ**BGhT%{$_sQ~E% zWO1s029i9SBw{QF2!Ax3*cTZC7yFSWw2xy;?+9zu)9Jnm6ROs3v4ytnB$;Dw5d$JAMDb$px zFw#=M_E@reE)S-paULjSa2RFpDZ#hAA@?Rp=Tji2y_Il=Z7P&+C`H>=4L$c>S^Sy= zv@riwf!T#T--xPF@_*!sbVP)vZP52U?!N2P@#%Der$79D^tcCHaO4?}eaLOEfA`06 z^@l%$Q+J-kWOIbkc!X8Y;4sQB4T@@7HbbERcLg&=9^`TxE)Fna*W;*i#JOAk001RG zK?1yrw*0yBTHsHu%GjiUisP&gB}NEkjyxmxa4`T)q8f3;dr`M^FsdVT-c*7IPzr5O zpfq07y6VIGPF0$M&9cs1p%=7 zGKcq~`3p?wc2<~ejB)bx0>AL;H)Aqx`3Jw{YpF99o#m~Oq2qmgjfD)JGa5tS!h}At zCIQ@a4Xm`d>_dtlsW^^z3JAJlBjJ@6k1-0hy6Sx#*j#5iZ1b}yyCIMwIY*!rT1 z^?g`#A@$PN`n)cFJ8HOf#%|9DXT)f9L6qj~C>RltwDp#}I zyXokffN4#MgC%ozSJ=wTtygIvS{G2ovKcb+)%9za5;h{QotDpA!&1sqk85Q}jxYGM zIC3lB@SZ)Gjd$v*vnj#cIflbISs5LLP9Q;W9KFojE{%EsHL_|}rRiruZZAzO(jVk; zGM0?6X*rcGmvRKBR1IV(o#b?;DLU}M6Vh_u=2dJ@qZuJD0M5@B&1H`glGE@ojizU_ zeEKXcC8&vJT~yW@o%S{wRGX!hqvUSSi5SFl{nHSd#$dVXuw0$OzS;EHw>|cO^mUhA z@V(#su}{DDFW>hM`0I}!#i_gI7)?hQO-8WR9dr@uWkY^137{MULygu8$eG$Ift}}N zn$h#?!KIB7PEAB6{(qri;=OL#Bgjt{g(`Bi-YdJJq%MwNMewPX1o-7QQD=o*aB6dy z2~*S&z?{Mpk|g9Tr1T^Fb*zj#fjm8>45vakm8G)i3hPHlOUgOgy-;54t88YS#5Gp@ z6)8?iWJ17J<#qfIav<&~xd|3Oyx3LxiF8_9lpWviX-1P(nMC!Ygu_W@92Lz!6#GQf zTZp8XPfW&5x1|Cp@)vH`Y>|6F+oL2K+S#wS*umB?&iY2` znX=!N)gybt0HQ!8FO@;}+!Ti0AgLOP{ihnK3Q9IJFVEc;D?`FxLR@t*JbN*egd|%k zD~x1P<$Gq>_P|c{oTpt`4qfz7+)<@{?98kRnwTggdl1m6Ga-wm&&kl7cjlSQeWF zx$#HXc+K*nrsduppP!=(p}4y^7CEK7zW%Zx)_*i-3#TWfhSL>d$$QC}MWXBmflLD;#(c4y^L&AGXX9)Ck0(5op8T+jfBadW_}nYsaQ%&V z>&HHa?K^ic-WXvtZP0h@Hs9ydRMPfGU6C6fbavO4;Jw%NkGQ7xJ9_=D$*srToV7R9 z>A;PoKa*)?&xC};Y(egV!_q>aIqiNG`Xil}>iYn}#P5vPj>ocqzyqiA1Kd;;sjG20 zs~{u>6o`W>rR^L@%q8%U{yV>hRCbI-MJD&vdJ+dVp>syRe^$+&$!->v6#SBPSM`ll zFjMYs)1*n(re#z9x5!j)mjHK)apawL;u{ndT$Ri8G^3EzcuCsCih;{os+QB%Y>)I` zoNCXr#}yC?8)W5?g=D@pga(AJvzQ*3;n>Lqe)hNi290U>`=9v;+TK~r`<}L_p}A$i z_ybNNKFDNdXg|_kf`jBsMN^f36a7!}RjtffuL zL10%lv7(qHmAXb=w36vVi!Wc2`PaF=6?np8Z*$ zWM5VZ;ZWWHI*31NEBqVFr+}jWKI|yN3lj}Y)8N#6arETLZCtp2 z`s#oAgon^?yzm=d@n2u~G(6{PFM**Rr|&)q*aaq2!l)$}Vi>rM-|#^SgTdtfSpe2= z!e;+E5ZJUAq)t}lDhJ6BpRDs!E7yd=(fkL6wi1gYn;lwtpFBN%M{!27Uszab1 z_O56ER+gH;1S-NM47Z%cTbr~kOcSzPX5-k!*>}#edO9ro{V&OByQ1~1T+v!jex4_6 zYYW(10g+H9>%76jNp z%1!710;;sV)TSZiA}d-WFN0~1&&a-KcBVHvzzoTRwC>;DF1D7bjY&$7bew^kkht=6Q7ao6GN^4Yy|r#eFwuu8f{WxXDeM;WdzC#j_h z0G1Vo?`nNhx)n=^ktIbMc0C~{=wL)M14-Rt0p7(;=Byt|XQbMfDAiSoLi8v`HtIpr zAZ4b25}PC|B@qFXQ+z-;#mE;iD_N~+T@nq=@1!HVR2$XI8>FfG_7Iw*0*U*AFIVV;h{aI0L}woOtX>tBr*z_iO`H1Sj#v)-@%<$>V0V()X#J@-wS_vM@~Q&Ntam6|{kU`t}sfZI00mIpA{Wee;o8z@(G z8T_kq*`i$TMsm6B23)qwqFrtmY8xA*0?8l-144k%fX0-RsZ_q4^W8Vzd&V8B|A=X= zh}ip_`!Z>F2!?IXzUKIh%b(NEn*-YDV?ZL+ozE6!|5W|qwr#{)Rd%yao{5z8_Suv+&f6}n_3K{ zZC(|KDQEnP*GMbdU{vCauQ+3z?4(*1k`-`qksM*rmwd=%x}jD~IJZD094I8q=^o2x z>RnaAODwD95e_R*<51X>LY@F*gi)$VDX(-SxDSrFDDC7Q`acmT+ToTvA%1W!GA0sqZ=e-4I-zxSJ8 zLZE4N=@}`;#TNUdNIs4t8sxp61G3OzsFjSM~ZMC{4 zNQ4qMmF2hEYTqNr+JPRWVGj~ZgajW@Cp+~=4&}m>iSSMuJEf)L)O;c~jb-xs$XP#b z2q@f862i!^j55xw`B4*x`O5rYav80(O_8AF0gJ8NqSINH+cIeC+bJaRRKArq+8(h@ zaH}0pajbHJ9Z|MvEGul!DZkqAJTT@nM#R{sxZ;<(Ff__SW*lv9BqQ%gW|%M=UOTEf z+`EU3R+4@>7wed`{W#Y6YH7g*Gbn zDT9z)8Q0{lYKGr+Q?-&+y5;QNM%nwLj#c$uKYQnXDs>jKiZz~u&IuoqHJn2g4bTAU zoxvPVf}8E^)R9y8pk~zBUh*<@!vrFOrfJa_gUhq|?DFLUJm;Dd@BM3Ueg*yGzx>vp z{Gb2q8}XKx-2tpEuIyg|uh$rlMleka_c6|JGErjA1~Lec0e=|tnmjEOm&Y4-%Wj1$ zOfw7T>#ni@pemc{U6dM7YI;$twdMa6VN;o&Qw}tJg41%ztQlR-tYod64o+uQQ z##Z!*?a!;6ZtrmBR75@CUYeB$3Fb4a->rIjDk!a$gd|TU6V#%x9#pxP(c(%9LBvTH zA2^Un*Sccwv%Sv~>QHn=ZES`mn+Sw79jZC?DEQfm;0pdKTbm@X2tTD?s#Zy0@p0*D zeUM@jrx0?fAF&yApJUy+xBdDOk?RYXXp=27x~{|S$sO!JwU7VyJ^v2>;uk*2$9Bg1 zM3{A!r|zTA`2lc&%FRZ3$S!DcNjsdE+{R}-3l3t7W^y0K*|ULyy^s3CpDmJd5NT}p zN`qY<8Q9CJG+wUM!u~#0l)W~oIw%tq!)a?#^p3R+DUPWD%u>)Z)R5MNXV8;_X`8XO zl~A~f%qzdOF%I^IMSd23s$Qe`x0qGm1m^pbakSKxEv-)Z|0&#KHVb?_o zWyZlT(Wm2i-Cwzs8J!>q`Hn^@aMhd~=z7#5d)>S@pM(Hq8tmDk4(H58G4^){Mm7mD z%Uuj4iplGe2q*fwq~wc-Rb~ddJug$s+Pn130UMX;#amx>FJOVo=dYk!uQ49CXxavb;I~!v_euiyKGVL>?{cZh{tnFApmZ3hE1(yGg;1* zQqif=a;ep@0IaR<{FsGBz8p&?8Km23btT#C0CK6&VGdhNSoei2FGS;cuvxz+%Cu$7 z$1aKI-u4ly<4WTnZ|~LYtp8ggdc+mo7*rWSfgC(gDkHrk%f67=NnRvAr5%?#n<^0% zx&1xykybJ9=VCFAG?o(v0%a7tMy%f@q$lj6yqUz821KZv8Jz;J=6FO@oK%Rz>)xrq z$)t0Iyt|fFS!S%6v3t!FPd$AJ|Mfro0RHLE{~qt|jAy2y*>Y{qbk@S=M`}kp!#28_ z?e$xhBVG_ZR&pXEJSRgll%0S&#-rBWu` z%DaPdTZ?=!Z<*xy(oO1#rGB@}e*E+wD4W1 zJK{y3J~5EHJvj>#NoJj+xa<=^Xq$xZ^Vib3WwjPG0Z8u<$hy^Ys`EMEP`yQVNEH3M6nTMs&PB!`mqiKMf*S1)eJz_bKri;D+` z7>!1F-VN9O*t@>%+8_JYSKaj!AO7T5-u0o6KZsxa>{%R~zk>0k#m;nuHCwFL3|NMV zfk6etF;IRG6;bcP7zp5@6k0HviBWf{WgHzuINU}BBB|XNR|{IwSWpj(vg%r7kZW?P z`xGMUGXyE9QJim7gM6!Br9iZ`Qp5X_+)6A!wXECsv95=7t_na*o0$TotZfkd33?eV zT(tLf4bih0cOj^f<)TaT zKeX_D7D<%6(3Mf1U!@d8Fti`hCya%9E55y3{!CA*L07*@uuulkCy zuVfj-OC@ON-OANd0~q4;Qxc;AMYq;o7fD%bermgWLzGr?>(2K7W&0QM^gtxZ zJKl&Sp5vZ=s4?Q(8Y0yLu;6*BK*-kN-#p;tqm}k<&bEGB7Exw_pWGTW2R@sGJ(qf`mZ!WY@ zO5al^%L51PWIe3Tx};E3l6=V4Lisv!(uQ3a__&Hv^5`^ByZG=tmQ_YgEUah&!iFtg9nb|bi@phil(Ryt9d_P??nx+DQ`?P~ z$2Zlza6{NP0593tCOezk1(j?@sI(Ef-YR~G^adC$CKNc&qiKrjE}qND2nvlcqWNN3 zfeANE9GB~^!}P=$7cS57-~FQxqFY=3FW>PRTCcm=y0c)IDZ$PfW6)$rZAA;IRwahe zNslgNd0eN}eOYSR3nGe+QL0_vu8)k&qk!Iw$HI4u-z0ulYO0d6kre%9gg^9DSQD;2 z)v1r~Vr4K?k(uh+DpdY%5rFjmPmj=s4mT;@)yqgJD;Cy%0Lu-v-}ihF+en)*Wa~Di zih@yoBiyUG$88(w@!{@ivU6^0dSI*KD@9@k+UUEpOz8u8X~|7CS>)}V4b+Sj3mif_ zjsn!nEo7y@!~X@Xv0(_SIp8r9a)FGG^QCgXGXrU6BYe|jSP|8Lql~wsDrzjsqCWjR z0xypOVwIAg$`WzkDKWK_9}1C^zA5m{XKI4~l^`z+s)#>aYr;LHLsK+V?jIQOrP;i_ zcrCY-MrP}LU9C|mh=Q=D{j>MO`l0om0GP&rnP>Cmddk4`mTQl__xrx#-uJ%szUTg} z|M=;L-u>aTvyDU_wvZ~cXM>=n(^n!hKa(Sya<@|@$;k-{Ik3%bLa+{u-TN6~I?PFpb z)waV?CM#tEDAC)OIO)=nH{12`nB7;R5@g1S{D8r@KI%86KK_DVVG}Lx|S-VHb zrS2y~U0BbgbcwK%4~haxEp+)WaN%>8)F}x+HgTyvI?Jp7b8+9&-fA59iZ`q@I;B5DO3G zJ!ESa6ozgok-(QR1^{LN&z9>B0OQ6J;~)ETufONV-g4h_-|?$oJo_^r{=|d$kDvT9 z9(d>pV7g*C5LvLm;?gkAq{4U{>-a#!}o8MgpQpV6POLQ(ciK)?LW5 zZtX^EGL|4O1{&%cSs`C?iX~_iyk#;jwNg&(CU71yE;Ma-+I z0KibY_7m{^LFEZ%tb?hHt<)5Y_nI<_q&<(%D+f#bU;oK3Vz#pUH{S8}bZpFL7i*qc%UCg^X-w4i z!3BaI7@=fY!yiKx$VZ~>ZOng?RO!)bC#dy;dXk;5m9+Zm!w?IxE$P#;p-HUtT4D}q z57`6Q;xtU8?QZ&`+Cl~ue8YL3UOOvqWGCNAzG@&UuPDP2*6;kNC51OAQt8R)X;U^o zxGSiRW8$x&i6S1nQ6|oCOs#2oFXZW|R-F`BLuA1vQKc&8O=tEbk|=xso3+i?zVV2u zf=64)L;(Cjp$YJNn$w`HIVRCUqFQDn4M$W3K~jZ74YOuhj|E3vTUipV_mSv$lB5Ko z#?Op;LiiZckO#|iWS!C-%_L@>r6yfAx|6-7PB zQ+>7T-kFi`FC}mh?#1_WL>n$o=*!a4*V>l!YP&JSs~A|(rdNXJ!EsyCrOU}NlN@Y# zTo^GqWo?9`jz%14jDaDFU%4>MSa-l|v7Rzxdd;+X|DSlp9rU*Qo;&?dUw;1KM?U#g z{K_Zp$8Ue-QSkl+&~A(AWDEwuuHE4hZbg;=HqlvGPnRAqnnjBQeBvqtC z)xb>oAn2T5_44=PHr%|9IBde85nPhC1Jcnt@Fj019Z5D#%OHREvp&*HWu7is4Fcj$ zI$=E`mwBq0{d&WBPEt-PZK}}PAWJGYLel2x-2tk%r2QC3G3hHTwdWv|H&`n@?pn6{O4cyJtubX(^n1_d!{h} zXul;!`i75G=1_McAX(o5%Tb%q8xopeSdWt2x`dU4L?=}cW8s6;1c>O*>PnB2yz*;8 z)2b|FL=2}mc#-TjWsjlpQmVQi2r=B2cw>z3vP5xCQnUqOY*MLLF)vr-T1zZ1b^hMP z0FcrF0K-9)-{Mpqm$~j$W}u2vIj_E4Z8w*V^6c0DL>HF^#SfsgI)=@kF{-qw7Vo1i z?<2_n!vHARyEGo^?MX0F-&j{M(!&NkCVwaeYvKYioH`*8QkwLTKl4_Km}Io7!FX_< zlv+;8OilkS6bmr5QAMnvk9 ztH@>$?4bj~rfH^NyT9rf-DAe}=;0rvGuddbPr*MV*Asj&XRV+Vb z;)=4!M^6q!05vmH>0-(c1*qU0y`7C>%Lx=n%0&Ju+6fLKO?IS7g`7H$Iv;OGWvU#b zEw(!4RpqPT0=|?4)>1hTbw3Nb6rWqvrw`^qZ=quRii=Q3>KA`icIGfKpj?7J3u#&B zUPGyoJlI7uriN1f5#X@8S6OwGbmy3jgrMWt5L?)4_Ht;Fzor**q{XeU!my>_*$0Rg zSTEL?9v@+TWr@H0&pwQchx7OSt?z#Q^!gK%pSpNue)p&~`xX=rPpm*xO~8Qr$-lX! zB!843s{l>mPbT0k%MYQWM4QV=0>i1iUiSvh(sBB?iAS!`6UIsDq_TXOd2MQXC|rsl>7dQpBl9B!32xAA!{Hjll-e*(%ln=?}DN=bTMFo`RmG+BQ?A6Vm zZ~)OmmJ3CP78w{`Nh$*-12w(wEdw1YkyqQ0v9|Rr`{hXL=PQOO1xP5WQ#T^3@UFOb zdEaM_!Y6fGrNX!gp~t?@fsy~k>_7fmtGJ$OFI85b$rZjV5UXH^NM(e~VwN zFogY%8H>eg4+OmAmc4sla_ecl^Xu+@?^$L_~R{@^S4^21L8>lsGJcQM+T z!V&>p2iP?jK*utG_l90HoNwu1C83h#V*aeZo{ zP`|1$p>!tR4q&hs5A^g??U}k3eI*sFMxq27J&!95CmwRb6}O;mFw}>7W01!6_H|v_HdX1%1!u+myv{ICh*Up>U`C2KNGRF(3P3>Een~oy zz*i+MBl)AwyL2p>YKM1WYg;o1lb3tZM{+ViW|i~^a<_V&rdkV1jUz%4WJxEl+SN6+ zssBhBHw6Y{Lxn?2L@5X1FM5rEyiM5yg-WF1k`8w3 zLSG&r5|;b}7mB!^Eqf{v;*rgnnJFAxSy#OiitVU*zWk?LiK_tqh!jVsT)Z-*=#bFQZNK}&p3P~TO&qgT2%wl3GSGJTdfisbZ`_{T;)1qE&Mig~% zOCI?$v0qrr!XnvxVUN`6a>hY=kd60({?tFYibg#T<2CaK;cvX1+fU9URs8NF8Y)jw zzp5t4nTrYbutlD;vbn0H_bYN;%E5sI9Gc)WQu13YYw=R5nG8mKrGpD9%AFh= zz=5=b$&RFvmsrxf0`$-szzq57da)w!{k0UZT-{9s)a%s+QQAyVCe*_fSgl}QS$B2I zKPS8q%5ipGGadO(tD+CRAs|IVo=4|TdRuAG^B2ciMwqsbeTj>oy_hH1CKlLIw4t!n zKq`F*DIetS=seLz=vn1Hwdmy`(iHLMXxwnCK#Pl(t{Qyxz0m$+75Ti4Q14qM1$tC?i7?SlZL36eV6969W5w(1K*D#h%0BY^;VZX()OxN+YLjvWF46#z)G%hayZ&O z8g4@GG1ZUa9g;D;9zRC`JhkSg@E=;o{7wF=tLKl31d=QCf$ryqS97cLwEt-*LYM$;0&1lw8PrUAzT0fa^LFL!b7 z)R5&vzLM*$jIvAqwOe+Y#Mx|W1oqOlg)z%s2MuQetVz-d-`NRQFXDEifC%F+VN3E+ z-{)-f8%yl(NCgW+JgJJT+c}=ng=r2XB@q8Q-Kr^bZA+m5ZP3TU#MP%D5+Qo+hmf7T z=x*jOAd3e`13>m?(Cv&#R+maQPttq4vON7v+DVbI%VawBSZNB>2GbNBDIX#gg}%T!L6Jy5T<*&|S#m zzxA>E@t6LG_v6R^##{JXU-g{bO9uzDFb0Y-xn7PZ<;~ z0WZI>H7Y3E)?3D6J=!*_9S<>Tp-87>NwT5p6c?29u*rSPJh7V@?sE)OQ7boIwEv9E zxjz(WNlmEg`w|1`tI!*;4Uxh>wN>|C_A@M?+wUhdY!zp+qClmdoK}%HtQPANKkGHH z!~z>_NY-TRQ=wN7b{E0RQoN4sM!cn|fnW8DRc0ojChPorYR)c8e-M0Y@`-(QZ4^Kl zN`mCfeW=T_x?+V&KTHZ8IM3a)Xe2XKLrF19D8B0C^RPmHZY{k(=n(GEGbmUeefYG~8S^9v!Br{N%yMI@6jgDYXvpT|-5w#U%bDip2 zR=IUW7{t>0l6Fke@a4@#$4J;x(5ZPAkd{Jap3WXnk$o&k>JzX1%};$9 zzy1dg;7gBR1Z)R0Zm~0NL8AtpHSU{Mp=xPoB$yVmO+H-x=#fF6@I}7`aLB1}x#b2u zzbl8CWZOj&ja107NI41?KtYTk^|;_MByrG6G()jI==uPyMx0z{%*En&l$F%Kd}Ss5 zC6zxak+2+DNLG>*$9#E2v(K5Yv)mpO7V5ujG^6%pA0<5)yfDuLEE3m-MQb;UY=AiL0Mms;6L(aBcm z=u=6(J)_=;dz#fyLlyOP|DprsR+pm;dRI0BI!H!8O*UpUIU+Pos*Y_nHU(p8Z*1MM z7BB6UAH z^b9u*1&QGU#%irFGg=8SQ7j|rRc&MjH+SgOaZgn9?crfjPCH=DOF`d;r1}H-c8T!E z>2gEH9m`G><-J&~(XpKp2roLb_qrF|b{g+|&0YA7FP!BM{qC3W$@|aZ3yBwxn#TLc)a_At4}=@40cKazkj zifisWR*$4JxkHBKEN;@1M^ftfBuoZP+#RKtg4OEr%RpA8)^%|a=~gQzP%`it^z-;D zIZowM185USwespX`bH{O_v*6erRJ1t{6)`LfF)&5*}WqpIdV-^+VPWHDlC(#C;P(^ ztN|#@hXpyZTeA%`vmjbnH-Ev1D~>_OeLa1vkjkuNcEOO8hwxRZ^;9iaPG}4Ln+{|0 zrF-yIQKzah-)tS^!Ju%UPL!R2wHC$@j@@t)k3Mk$fBii_j|b15=fCmJZ+P2vC#E00 zaCx>r8MiQGJil%k+!(-GrJ+#Eym6&kG$;AVCJUAS2t(c-rxEjo6>IgbNG*7(C8>x? zZyl}D{%pkC0{1WkJ^93_Y@?{8k~3RP18H4OJ7?9DH^gWhoWE%@pa7ysTTAAI6Re)IlE@cUmri~Aox zkEgH90n0EWgUP6c8MR<0aA(2Rx{p~&0AU5qxo`vk%9(IO+}k=UnM>n>0WoFm_={PD zjVQ-_25hol1-$k3g~=5S*8&@9n_U8_B=Th_Rm^-ADxBHk6fEa;ZGQdUfFr+xa?y6~BVv)5M~%?_*&)S82q={= zN5W=Ne(L3Q2RvLJ18W(UI~==a2eZoy{QZCVYk1=P>;r%Mzj))jpLgSlcVE1GI3sJ( zG;IWJ1co64%kmAe+ITKyk#Hy@53EW)w>^z)o5bp>80%X$Q={_goZmnnZ&O{d1t2RI zhmY6zLu0`J0RR9=L_t)|0&ELg&Xqa{Ww7QSY~DckEF@XIG6&&h1e9CR)uj8;=_|)= zeg#y4dmr7;FiCfk#$Nhe_2(6GwjzaUwhMy!{xNADV!#Uife)Q%bMiHju>DUuKW4v;h+kI}YbCuMY~vfMCV zTW!zsJgwF%EEY>uPS+)h*z%?DZB~s^ldjG2c#NiLpaGAlvyXtQOzZU;^Z6Xcm{?^o zQRDxKx1-#lXSH%?-9ul}RZ$@3_4l^mO%+js(q)&+C046dq(>ekqOU3`W78dsng)lEhggzFb179;I4!1I`^Hcup&YR@_+$pu%!u-@loJM z-i&W;1m6<7o%9Nr*DDQclfzR1LB8T%>k_dNms>FTvTU$gGTbQYU=(#!69-r)Krge> z)v9@7@u-5Gswcz3NsB0xF%r;^Z4S_@5~Y6FDtneQ8$qeBGvJU$V$d}p!#lCTusZ9; zNthjV-(iDgxEH47Qk1_U0>k+4v^CyM$X+I~Gf{So00Nx!uP%t7Ka@n5(+^a~eqq~5 z{i@Owt|M(kC|63o41Ak5Hk9|26ga6z5hsh4#3(GbAarQj2CJpT>R^s~yojYbi3X$)1VSSwC{%68}kon&hI;VwHwakpkWP-MB>+;X+M5;TtEHz_MtAk*z!>ZO=^kI_PC=2v@F8akR=nLgX zZHw`E99LAq8FtUdU4`EokG0c7i3nZSVLqR!T?sj_6}O_eF1n*4_mGj9F&d9C8jp33 zY$B-_6ZiSSp2T3Z+XhNU38ZJtL5A zH<+Bt(&eT!v{#i8h#{pQz4^IftotabMJ$j;TJzJBJ?7mu)%WNp+B<7u!c3&#pcoJy zSOz>3a4?Db%EnXwhAk@j>`5BD13KK7Xjm2-R{?uc-x2nk$}qcaOz9mm-q2TROJ7d6 z`wQ`xU{H#vX z&wc4E{@{@(@zwn+z}f@>-sqXCJv1mM}dti_ZF%n!X_<+p<# zc{J@h(%mn_T#=u6y)o!u)I~{W;U$GW0%>NovQ>lyX(>Jt_Ev~RexD@4dSoNuxY|t@zRdHL;g563)y1cFr1LG+uuG(^Mm|cvKl&~69^`(Nf za3j%_?7!%!NOvffI*^$QeNDDGuOkd#D!L#vVa3*>G}rIs%1evU2xyOw@S$J*G`{-y z)A-T9{B8Va|L9AIMt1Mg;bPx3qbV7{FwYzf96@G%*GiJMdmIOyu!nWM+vE?A;x8jL zeLf%!j_H}KyuIdfY6c>5Zplz1wc)5)Agkl1q!Q5waF8YL4({CZB?2o zx{;&Q@@Jw}$sq($p<%HtFUnE9Q6#wLW2diI_0Yb(ho;|{J`l2*qR_`Te)vS%*&_d`?6f#(D-LPK9==vpI)*A zeMe0-o~@q4+NoOmxxUsWN&4R1 z7ldp~%nY*Dg2C}6&B4sY5TweelvL{Sv)RmjhlZTs;xfPVe3cYml=TC?Z`WmLC;V-i z20J?rq=oHb14uJNzaeWfZc;g<;z{;rvqN<24#pTo3mLOTzmSf$<#dZ|#5ZlN#b`9b zWM=|`Sh)#xc<`FKiIg%`gFb1IDyg#_=JN%*^*VxRxpGk&ICo#l-<^1CVPJ}UqQZE; zZCgyIQw%Ct6i#Vi$qS?ADryGIvc=(SmShns@w6M?_Zw`TY9ol969BGlQ-K-b2*maPYq!BE>n86m+s2YV`apTJhP@7NiB*R0QEs}kb z`{=ah!>R6Q3sS%%ux{*TX-Ttaqw2&Qm?iNm*c$155|A&QU~O92QCVSD33JQo$ zm*-zIR1lpu8h5@827|1HX&9rn!Qtf@QZJ~ z_I77~EE?0K51hk~SHYJdQo*!(jevp0VuAH~t@X1KP=#8}0BX|#RmHdYa>tJCdW^KK zN2(;|LQ%N*<(|*ybF5aY!cPZ`BV*hc1e;__-GqltkF&1L?SL@`yVEI%Oq|5&0dbK= zy;>vnjRx^bNQ=cnZNX11FgP4u;#YFQL|mvlQ6lV7){Jbw>nxhaU^?A_F-?g{YMjQ& zg{*GosB#I)_3*e{V!4>RHkI#S#Y+l$G_Fj#pGdH5qYiNRfV}_RG~{2UNUw{edVO8Q z5OX!D=HOxn#8T6W*?f-Ga_NId0vU~gL+annmMT^&U6~95k1n8!9he4wtauP$2S=?e zqIxWeo6Tmh);pT;v9+qx%>*M1QY(jLz!L@qxWqrxxd_G6l zby@J0YV4;N6&Z7xS+LH`7>!04PsTMwR4p@fUk<{))O8(}%cbJcm90DF{CRY)$OH7c zkqiAenM@SHc|e<13;aJDW*p=jBzdydVz!t^ERgdRjVJp0Qa{oA*(;9IGDhQ3)YVvf ztvjidvGauqa0v|Li*HT~44--6F?`{nC-C6Ym#~_zoY9*!*cltN zqXr!e)-k|B3a0!jRSK&72d^X_Ab{i~fHU+}`3PR)Sdv3G05Br45)=9>>1}X6#Ff5} zfG5~x-&oW|Z@oBW4+_k(jzp4gGdaaTzS;sA(2@TLY1++|Y`%)Y!}!kV5Aujv3tJ={ zET_X1BE69>E$2c;(DJBd4Z~2)p=EMTLzSG)1dkCxhKc#ZE(Sw@frY^uupQQ`6&CX~ zuqL1x;n>L&xbw_)xc%nScYcw`hJTfs-g)sn3q5;A_L<*lry6r20iy<5#FXF;dPz0yL5b z*G4VauKT2*SyZ5RtF7T?azZ-x1d*6t+f8AX~hH?3Du{RmD z`(Xl5tpNJ*(zimx%vdg$So_aM#O4Lfx>QYx(-`5*R)jopY%qg~a4dT_eQ-ifb$n_z zY71*RYCjeW$D^uN;iA-M(&q^ks6ZPLJPLL#7{(Y({6I@-YX|zrmI)S1YWR zi#RbZ{amiMs+NA>lloOUBTrA$80_p!5dE#FyFVp`)jT0C03<&ZAH>V~Vu7^}jDrlN zylTPgMhqMIOsln_NDBbcB;_NqypunzD~$H4`hFBlHiPAEQ7k^t@R3q=(3QhE(fv#t zP7GGs-KLyKc{LT%%HW_+<7*H@H~*}q91tEM^=&P?diqKMZhGsCn85mFnxc;W2vi%A zqFk-UjfUkY=~)~+dA-`ExM3ava4^Q1{)sJNwQUpz1SSCAKp?+{F$7{W17Svf>nyCr zYSp1*3kIfVuG{_o=iG4T_y38nzZ2)LEZ_R^FF*Ey-+$;FKKR~1Q_CjDIZTX4MbmuEVDS5KOK>8J>ZYdG?K7?SOU zw!#<+2RQ`#Bq9?~IiXEKlc>wns6IOtLlW0cB08T|ftuFW&gfPv z%;!t+VgYmjMq^xe-F0~0E!W{?&%Xt)dckeD@9tZ1=gp_yb=~ptPq`*6hz$P0fBAp; z`L-Rs?O*@G?_u3p>`X^kuNcfW9)VpuPFlbX1fLtTi6A@yXZcJ6-B_2H{7Skkl#q=G zvXablpcjv}kKN-gQt%WCkpQWc!&wS5n;Nelf)XYdbdLrtvx^nXc!cTcWB9$_{v!U& zm!HIc_orXS-}fiK{#`fk9s8-n`EqJ3&x}a{?56iH9Gz5vuB$P_1xFc@?G1X4+|E%? z92CIZGRO!(n-eqyx_hhl{c2dLTU7056Q9V=8K^hkhNmUZF#hud&#L?0IyoLTVHubF z*c1I7%&a2)naViyyYz{wVv6JW=$MCvTM#%RSB#2n^QDib@3{`k@htsaocMrSp&DdC zMsVALi`u*E2|Ho`&XcBndw;Q#3xWXz1FZ7>;6dS@Z>{JQeMLYYs^Ze&ix ztx&B?Wf8N^S-<3j2Lh!HEy@L2MkBql5xSW(O{mLBx4w;j_pea-`kW_Apjr$7WsoC8 z5-z)^GuyVs&dyHpytYic&7S2=Tk5Q}n9sxMkU#<|0+6B}9OP-6LCnnQIHtSv1n))#5Ij08|6W;3{v}jbTY2}JjTgd2+h2@H#ABzR`l}3<4 zq9EJq@L*1~gf^n!SNHvaLctPap&zf;>GveikIGX z6JGqh8}Q=WPwuvWdtupjI9RNw>&~8T8*`2bv)#!EXD=*%;{W!qe(ha9`R{%M%hei_ z-6^_m>A)))5De4@p5@q#cePJ-Vyj3g_hY5RMSlj#DX;AQP424jh02f0Oo3X#gjQdz z{4sdr3>IcMLypi8pv9E~)?2**x0S4IM>xDR2No-Q*SEX~|J9#=BVPaF+lkrYaJHIK z0+hVu{oUPN?bE!?N-JCOwksEX znzTi_OyriF)f6G|*P!&Kh2bucu5VYHMUR920<#ax3>#rNyhAuKStK06K^foQ6eO zy%7#i086D1-LBDgjAJK{;g)NT z<9WB7#=XzE0WZGeM%;bodc5fN>)&(3$@Yg`br$oLor2w}M+hPqgxWsl^yl;zJ>AIWDZd=2^Vzp~?` zrYp(c_(u_W*T#AUFh#o|e40S-xf-ZpNFfi$%!*f4&S_sWYJt@nizm0JN>yZw#XRiO8LjD(go5-5XM;U&{N5dO0CjtjKxnP)@`< zJ>A{it=8S^E(QOxZI?Z*c8BLg$=0QSDto_3Ov=UK<;Pv%GdGvvhuroo_bj{lE+0_s z?!di!qYDpj*DCRi)b1fz7y8kVn7oLlI{Ed2rx3&%?Q1i#m7kZvMr=>;668;E2SXHD zgkbMDF9G1ebNWSv^?1Sx8`4xFw ztyCGUGu|Im+-UlSV0M2fMhb^gfYTuC1DZM#4g)-aCIkT4Lws*Q6+2!SKv}2%Q@nHI zg;87dWCq%{DFUiGU)uQ8K<&0c)qFlzdvBdgJ&l|cf(naANSjxKOoP+(R8p*0Rfs^{FtgLV#vVR4UdXF;Djz-v-ObSC(OM1m7 z>6B(NklNFy><$;v6Aa>jVvfv+x@7yL0;;san{CGtWd;MPO1~)Nqo_z79i6x&P*gde z&7%XaCATGwd|jD=tBglAZds4YuIn(_nfULQK#Y%i<6#&?Fv8*6R_SHtxJR9V&hm8K z+0#LQ~1I|PvdKkp2H*i7xDO|1FQ}Xf%OV7 z4KQjj8ntMe7BFqx2FMKfqX|9m7Bh*N*~`pzx+liJdth}5;q=w)eXz#>;T0#rvn**n7wT7#Ly`-}CMlZ7#NLl>clbJxOW`4-*gS0f9K73@trr}&Red> zi=T7D`))eX{)N!$a<#&IW$y+9jiGaG+sqn6E}-(fIsfH4wOg)m`Qqj2cs#<1YfjDH z_o3hCzx`7`kB1-I$IkI7VAtr@1dsun#_M15F~nT`)Kd=mqIfGtL2SYk_q^QV{j5x= zP~ARyKovAP_GL5x0upkq3K7~X7{QQRYEwW?o<6bl2#kh0j11xO(-#34yz|>%jqiKs zH{p-GeZw^Q@&Xeo zn?~ZkAS%?-c8Z?xw@k7Mmn zeNf{!yHMZ0lIkKByBA+w2tzd9_tf?14FFKrb)qpKo(Po@@0iPhqwjJG!pl9OW}pbD7${IY ztMIByhw|UT5U9j%Wn(;+hZ*GDC!iyFQr8k&RAxi+dwD<=%LU6OjB6y+4?_8s?DRMi z*&k5(Eq{7OL-&PTp&~I0R4^H-67Ey*Vy!K={8<5tqB3N%sc2zt>&w*}_JQ%pz0AnE zmp8po7zb-;%sVkhp3vCJw1?XcCv>%D43(om`7E2+k@<678&Ada?^ymLA!tWeEW@EV?{v6XbT7#oEHN5F;!e?U6PFsxA31FEEt*>FKvrGj-KRX9dG znjGt9{M{Boo<>l$UhTIHxq#dl02Y_7Ecd>)fB4H^div6RpL^sSzWC5%_}ary;)y3O z;PFdWaN%(253Vpk+hWwVXc|IG1T+L|36>p=%;~cQGUeJ%fjtWRg?ENHIjF*xNry?k zFNLf)+1%7`xm`)+6_rx|6~U!85VHRCjyAOvXbE(N_hfX9an-6~j+0~54@-9!>ZD{3 zT(p~&_p3ORX2?TU_Z=wzmltmB+rGyPv|}7UaSS)^ox+{BU61FTxdAV} z=N8;`%XPT-w!QnGw>P<0Qo34o=&XgcaHzr1l!(w6Gb3OYzWWw%C=0nRmrE??OLVLC zl$&O@ckL1LM zw#cgYk`M7ffPH_8s3que3TEUn$jR@Qzzw1=q4b1Ad%;ICkqVX^l;HRyU-bwR4H|qU zUJZ9JSYp&RSj^T~?q9(zcix7-`kk-CcYfP_@4M&Ly}z(tcUZ31XiS5~kUtGjtiVwD zfp#g!kdG5PC7y~tE%|#191BxVe#>74CnX_Q#=qzf6;Ks}laMcSx&s?>9tE}$pH7I9 z7L&4pHU*l4K!gT6b8llnC0B0{>X+|l`ZDS8n3}&8bVysO>a7J-BydwAAV?MkZdL7#3b$!fL2V!5op9~f+F1;^ATL95tVm=7YiT{@h) z9ce+1(Xx6gI8-hcMB85R!9d@5gs?LLL*&mXNtSdmZ89Z4GN6hLq#ufqsP|>_ks->S zn;zdgmWM*U+4I; z_T-=#NPPiSXjAo;KHNXQEX60FjLcXKsD$xPPBkfHGVt2C)Q}aczmBNz4prZv>8&ps zg-~IAJ5wzcx|$X1rK1-uR#ZI}=?SPfn(Iob928Zk%7IL{CfDZNzeCkGRuuxOBsa;Vb~I!hfLZusQ`!0>UCDhRell+MMs0H%23Ras z=N`W>f9+SFzWjl&Jb4lKpWVj;kDS9}PhG$h=MQo2${{Y!=jg&rmub+n4H{!$n(!?z z0wb(oc^cvj6hTg{NAM?@i)S|ka1%|MvZk>DPHd}`cV&29eN#3Yj^#5Crh1e;;#cXx z2b`n49kEt6BP(fEYM^fVdF}{IEGTjq@)@|*9RKYn{{lUj!PcT%t=#I-Ot$$IaK_CC|C;CvUlC^8JZai{-jQ$Cwfmnuca>Z+_Sw zmn1^oCWdX`3ynH9YJMhuS2$jY27#a4$sek72#X{$V>3O-}!pH4CtUA{vVWfEjA8m{dm34ur+Q1zJNBA^QOM)M=&qXDEC+pat7GR#=1 z1yn^47a7hk<#w@1g-*iHTk8U<-CcJyycL=AATwd>&DgC_`0UrB*lFY%OD0|7;w0C^ zrdWyNG;u3^R|wFoWwdRB$wUWK`RggscZUiBu~i^P{Ve+XtJSJ_zo^Jw3B+nNmW8=c zg-rofl%vj&K^{_ltl5{DU8)6CL4J8ZYL*$f3yWW6Gg0U)!ELRI^Y15X! zQXi6_d#_iPW80)or{|@WUtvnK7 zMh#9*$JjeD#r1n9aOUPcJpZ{j;;!4S!>!ky#C><(`tIwGwLh9jw^%GYtUEjHm`@WC zn#LS9jhPvunV}F0$bK|V9}W4fv-cRE71W-vAA$gNhTfGPlm%p&9g6;dV^cLHb(Kg)nB!HW1d10Ctm z2&q(}-xQ`0_4v%Hh1hVux|!JlRY$U~35uqP4ltMR`m&AsYp@1!hh{tiuNd=lbC}cD z;s?Itm3ZgdUy0Yf;8p^F!})5@T8mNB>^E%#L%@02AbWQ9rf$ ziFDLmumW9*ymI#i6#tSP?fujkZgePeZo{#Q{M_zTG^wr0!9Ea z>BI8Ed=Y}4lpc#Z+a;xxL4Y(<#W<-b4KUaVKnYSqhm-=LG+Qfxce#ZuZ7Wb*d%E&~ zs%)i?Ze{thHboK!D99vk`4fjy6vgDA6v0Mqn_&@$h)P31H5pHk??WvMg!)9^NaGgs zX%)@iQ0oh*B(ce7Bu(j&XlgPkp?bh9-=WH9J<9#qHF}g`_e~}Fr*>qT&1SG%)6E+B zLH2@6;r-&C_KHypS;vzxMs0ZlUa!nT!I*h~QlZu{sFnehFW)E2+DdFrr}~vSDZuHC zT%k&2m-Xg`x*kYVAsqQ_^5B@{7F@QB@S#rcuE7j+9-J`K6hza>sM(+HjQuyWQl*Q< z0uMZX>0f^J+@vI<$Q^$63!*$1T>y4*z&+U7-{f1Mx?S@mh{f3k8zkTo6ckS+s0OsjxwSq-EbB9J? zMqZ!d#Df^_L=Nz{U_QMMKoou>l?yBjdmq+Xma7#OKA<~`* zGq=UaZC>f0Q+=Y{P5w*f7q&U^AhC${%c=??Cz3%H0I-EY=V^CGgSVpzR`C>h749%z^bnCS{%mB#je+6$8d{?&hd)nfPQ^gF+ z6{`Fl;xO*iR=aG~xrPaf?SUHus?-k!i30DXp`CCY18Rj;(!|!HX|i zk@bVbfB7N-K+2XCi!a4@s46Q|l3yVt{brh!M>c+Hv4KePP>O<2LNVSFZz#nKsWmcV zqNV59bh$c_?Va`&NqsKg`>0e27i{QvsQTezhzubcB=BA|*6TRK!u-JVcZYSeuCWibr zL8r5p-Bt|1?16x`q5a8dlzo_(F*{t~$%}{I{mA~6_dWFVWjuQR5Raa_gs(k*0Z%@C z5$CTQ;^M&qmk(Dsm@l!kYk$OcMB^X;4FRU{Cx=DW98cj;8|?wYjJvb9@zggW#K1)G z7ad?OznCk#TM4L&E?}Y1%&DHB|IE=w$9HAm?zxw?DUuupBU7VzA^%}!*B>3aj$L4E z*#)hzfH7#=7RPo*IB{%*lhX;VJ-Le;PM^SY&s>i)*PX;Ir+0DFwa0P$4JY4y%eBXU zbUF@Wt($hs^>ndZ&gRSYtm_yZWAEh2lNgPf{Se;;83vq?Y+SNMVEt}HJ}Vx~5PMlA z)g}K9)xu5UkmEV@$6~p}?(P&k8lU;c|KWEY{zw1nm+<%#moPbb48}C*EPzx@^X=GWZ)JW-`)pEJaJ|u3kNj62FNbEj@0V$(|Q3h0c`%b34!JEWKxuHnHt);$zsx$(jv!J|}TyiWF zs{&GM0hL;+i_vX(RvMkSkfG#~gSm98ekg^@AZI6QPD(wa@X|WPZ82*5jtHpo6{={~ zL=(DiLXN;=WU}yxHDEj#P&vDw>Sb+=SY+=td_dgWF9WJDn;&Vd%1+m#_)}avYVyGu zQvQu5*#=koJ)W*6XWgVdjE+9(u&mc@`IBJX6)I)KT8Mz?x2#d$m+BNapT~V`Yp!N^ zYW&IBb-g_>h1%g<8P{)pdc)Y+nH(vgDjl5!Me2$E*B@CMcwDbL#4Q9t{beu!I8g5C zckkS|x)=l|bB3A0U3bp11+1MhcQ8cpM8L)v7{ZjA(F_1)i|)+h=db+Wqvx;u&?Ea- z@Z`AzJbB>&Ph32}6X!4C-1!5Xzj%l%^Es{@&T%kbV!rgjmKE;e%~lIJxs9*BsyZQfjl?>sB4+%jN!Z)xr92lM$Ru-8ZHHw!qHru6sYu z2O|y?hp~%l+V0&A_`#$h`nri+!GnbCOfno}qC|J}zv&wu})ei$GB z+*yo|?VuTrv9`WXnH>Xg+aaUBlm1NOSa%(G6aK+TP5#b-2jT$)F+d6R){0c_sV!+m z_8!|1TwC1gUp5u}90&dL+Q=zrRNvYO0aXP433`wL8dw-&&}0I(EoK*Hz}VnzU;jM( zskgiuZ+gWY-*xlp6YmE)99%hcpS>eDD^GIfPS~#6_H>B>(jqS|^Eb$vn@!d{} z^hHlViISn!ASsJ9&a@8oZuz6IMOf%xz*AxC9TIYrcy-gHw_2g9w438*ju|!2V1c4~ z`~Wj_KvlfB)ti!1kmy*o=dozaZNIT>(_q~YP{o$AjvQJUk;<(Csz4v*hFZL6SQsEL zZ1L?7%~Y7ROh7~iRHgAN2c3j9+L#LV$SYF@azfBJnM|@ehYe|-V(z^ED`l*;SS%Lk zx~@92q0J^qJL_q7xni(F3GAh80l;wz8aD(~+7N_i-rOtUDqMJgVB!0 z)5*?w=7JxC@Zn*Z4%YTHk34lK!r`^YiaueM3_62>Gsx`_-7F$@d{6c6hF0_f4UP>mUX zi+$&_*B!PT$D&(F@z?Qx3+}v8web4t>6G8y0)PfE)M7Gju{$1PXVPM4GQ#f81SfVz zxaQPx?43G>lgCE5@tR#+f9e>nKedY+_D$yuwOq^L2OQJKp?Kyzbtc-}RiEPW*J!HdriIv(;)1LOQ%A2s8yy zg5o~AE{t#TrHCsKg8@~K|4;fw&>|N1Q7KD=<-m8SBzDOF3zBA(bhsSSCnsCqmd0MBQiNC-T zQ0YrGjOth?u25~l{TXhO^reDcpA`hrIyCqWRSgG5%it#7(vG7fBegAYESyM?C!npO?>&iu+ zap<}(u2A(2L=soY&T0jf10b$O`hHG5%`q^R0adQ_zCvFjwMo)JhR*77FfuX3vFTCg zQs1dnz6_7%tF+MxWN(V*Iy@SWF>2fD3}i`QAMF`2QE!tR$P>-Xm2HjLcobU(k~0%J znyFZvokA&JYppsqy(WW_&0&L*Vr$(Oc|a9bQ){55+?tDIYbfbq_`?Ku(x5-Bi$kCQ z23w#RjW8OGu6}3nTF6BLSx)1bhUJ4v3}Xb!^KhXYirSU7M*3R z))s4szKzJ&Gu`Jj6pC~CTmRSkpspcu|GUK`jEq~on~X*nk6ITfjYgPG$C&Pnacp;t z-JLN`9N)o--6^iWW*2+McX8_21SgM8aLw_Z!|RSu-hIQ#<3D|DIywtpPeEqp2(SS2 zlsh|Jb>04IwZ_^XI18Sxo2s6qT)}KsagI4j3<+kTc-3kJQHfEoUN2$nqADsvG)D)JvRBxv*^o} zhYHO}9_8l*(gcK!zKKB0Xhww5sKI*H;qbx?baEHp@}k@DrZ?P;H@@nQ54`w!H@tl^ z9-&)zm@ijeKaD^Bo3nNq(ZKZJwPHfqvwhTnsxO#|vV+#!Ja||xuO^@hPy2mDoIJ?# zl{F|=Q{e-9VWQQDOo*MOdLqG+@{>}M!ZL$z8WzTdU%Dz%!<~wo`hK=S)BbWt)y43 zPz^0tCXnuwK*K1hTC&0DyCWU}r&In6h4YcL(W*wgk!NY(Lm|D?s2mepv~3nprDD}o zH=?1@`ZBmoowZno6{-jvhP8xi{jF7{;7#hF3aAi_Tb;+$TZkPbMY4&%@Jw&{%knCG zA;D8}=CZDkLHi#)xX0u1VDO)u2zuoWB$<(5HlGdG0hK#Qz!_jxbtvGGIdMfn&m@I> zyk1+ssGt+6QI}{p4b9xQZVZqQSf7?_JH2=?f8+Tpi|;vDuHU#^ zcBc}#y>)BLSh?>efjM=fvq4^8J)ks1 ze!Mewr#m>YGXa=j;U*o%BZEoXVA3`ij~YzJ4R*#O9GmW7cV~>_yAvGW9pl7w{L9C8 zMjzQ7H6NLb&8J$zY^YB<>sGuDu3Q28Rlu~m?N*!`za28lI(S3&A#Vsy0)np%eM&nD zthLznD^yZ0Q8--x*$4EJP<6h*2NAh%!uWuS9O+&^*pD~2YD%qJXIC*>*Xj}ZR zzxXMB@4x;veDNz!VYEAeF%4|DMmPl#V854=5MBw%&2PA=M?Q;xu8(w)AUU~N|Z@d1~?gzo^>1@87Em!VjWisTyCgyZAg%cFpb$^v)3Xs3M zyITzkLLQlvef2WR%Ot6Ik0$$uNPpNj<`U%v-NEbywxn){=HvIBNcLZ%-!vv3Db8W# zm34mUFRDA4B>$?N8Wu=f{%Up9fWNATS?QLBuw@_0ps|>Uuau2_l1*&n0f*)-Gh7@3 zss)HliATK+Wq*c&=wwwl$^5?FzMyqeK&9%<15$4!w(;XK4W06rr=hKk`R_U%gjWCT zA-2Gjr8!O+LyjKDrLt4mk(-M6e{yWDTdy@m(YaO!37{6JbW9)KL#Y+$MfJ5GebkA( zS@y!o$!C=8Z}KkNHMQYEpV0`;{_%`y_iI}rG#V^k9 zDRWt=3;{>0lmoRPL#mqFh85Pd)U{O7UOS~o{FVW6W#(-oNg@*`tKVDhs76yZ14$2~ za5D8kI>EWgV&$h`Jh5Ay^`$!@YMZ}*gi96p3j*9p8@C) z;9ciX=^VgQkl80-+F8t+CV$s&%j9|NtVL%#EEg-xEY5)W&;q9kd=6wzgLy{4p=pf! zh-!mb zY=P0p;;($$eRTJkYxzAt{j2!U?>>M9cbM*s+&f~{x{px%Kq|Z=Rr-=`7!t%)DsWqN zkbtxJ*NuXjt*mSZ956-cUIGExIoVBOtI$8UB3&@sBTMKdBC zzi}5>b@;>=9>FI*`zWrx>G$!+UVG06zUk}l#p_;p^Lw6mTgV}L@- z+c48Z&=FH;zt;vt9*&M{Qv+KhmKV}OaCyJ-{n7M0yzWxNuo>RTf++xLWlI^!EwJ7e zi3?1U<90eyThEdTxR!G{xSQ^}IOQ+MU%vbo`y>fD+87Fj`nQyY)c0*41&AL$eW zO)w(OUR)HboPg7NCKnUG0wM~MM}1ZggtVn!qwmRi;b5xZRj&4Q)X2M zGcX>HF&U552PkV+pJO#%mjp@ChcTuA&)iA{?YRJv0pb}LFhnzEi@99ckZo8->>C1_ zCIkz9)hTfa^{z+-GzYuYS+|->#>8257YOpy2e4B~2m`xBI3(BRj0iLN5n~2TnK3m) zGmqY;0MGo!DwxK7QpNz+1LneuGeXWD#B*f2E|~H8ZR4T{88~8jvqUY$1Yxe$N&7Ve)DJkw-5Y2E?qvv zbaxCQi}l)qVZ6GEv-mko6b8Co$AmHMhLU`bN*JO{zl)W)VzN<8KyZG~U&SiO`#;KZ z>C|f{@}^PgyJ++BI&=0o<%{f>J~WgiFpOcCwgscX>dGAJSqGfl!5?|at@!3w--S24 z;<>o{)@$#(>EvWe;M0rc`s`xa-QQWBfyf^^V^V*MF)LdSsxsZ(E%Z_88EZ+WcT++= z<#x6{n-8E^p~~}=I4xN?VcR4HsT>gu8U!T?JC7#g35deUs~ou)T8+wgRpdnV=~d*h z_^@xFoz-83)8y(@$mg-4!U=*Nxq4IGm6FjA`%CzG?bIYbsSa2G{$t|HMcPfZA#kqM zRQgNAwvW0(RjmF*^{sE^WSyy+(xDXP7Q_S<^bVa0Lp{8f@+zkqbFdLSe{4N(l*HeD z1?@}Z+lVFOz5ppyJs2aY$wpLTp+J!l#xwy2j(-y{%s9zbO~ONQ0&o?SRqu(;P<-T- zXLDDM%=_*DrHh-*?1cQctQ6CI7FmUp;cGq$zh zR)U>sfE&wavK9tdKdO}X1C~7@eZ3Ly=l#XGMwN!Vt_ivhD97MR$+#?7C;wx{DdWDY zgAm@mY7Bwdf$F$@42Y*T`9R0L^X0h@K^C){XODi_f0)x_8du&1PLiAhz;WB*+`sdJAjQCt!Np6LaKrK4_rLeAejDBUyqowR{=a_>_doCi zMmsG=twGn>_<1fzyY*fnoxI2~#MZW1**x*NiNtEnK9x8@=yfKiGyr0kZXv5;w@Gs8 z!$|}Un|nJ0z=Qc*!<{9p7ac&1cDKd!*!aQvFdn_2s5_;z%xVS?OzynnJ%d7UN(-Da+?wkRL_|b zkhM-v?fF%-AIG3KtlI4ha6Fil$5D54OuS8PX}o0mvmsbZ*|L7)%02n`C~_=(HD$lc z>_=6dtJu4-jl~)+t*%)c&M?5L?ykzAqo?*L+SfkkI&@FYJ``j~Wvwe?m5^#Ku4Kp@ zsrZ$_XhlzYe?}_GCY4YSIo-`?3kIu5Krzjp$QqNeMEG&wc*W;9>=ot|xrlO>-`}DE6AL%}VB}DS07pF91 ztLPJ~i2Grz(_ln;KBqx{N13E*O-$%?>hC`HTf zc~Vm*J%%Fd!0L7-E@d5`un>LJcm!opM=|FW2W5`Kh{ZurK~_|dsJ5{olNU3(rG;H} zXd2-7>Ep1S#p92i$N&D7$ML`a!XM!I&$|xa^vb)>z4pH6;#GHD_d_?|aO@|qJwACE zk(qU!JzTE&OKaQtQ<;(L1M%`Dcv5AuIx|g-;Fvl8OaUUS%?$#}?@(Kspi9K zV7~Tpq52M0PFwsbwlKwN>juQxAKBR&{KzeT>>ZvQ1QB)}5pdUE+)Tgo?@$ftt1smK z46T01Hf0&EADdn`emTI=eVrc!;{u*i7bK5~whSt=DiZla#Q<(f%vme7_kDo^~ouFwO*mVcD zO2@EFu}&kwc`fA=U$L7LO-a32=gIj_y(fH7xTEE?{fc#{8>&x&-*C4n22=qvIDjh$ zXR?D5{}jAs9HoELR!Rz5MeI(OBnGt&i~;O?jm4EYur|P{<9Pi&dw9hQ&fw)QybaHP z-VJ!}P1oLc^EJDNFzuHBz;=vv*TofS=l0w;nr!4TC}bTf#=uterPM2lJ(NEdX|Y(K zTdyOY&{#f&upuQM&(3BrgTQ+L%|K?xL?ANG>X<}5fk4Kcir9|ys~Z3?Uv_(q;eA75 zJFIAPFiF2t!7uqKe|`2tmbAj3`$D~eo|;(Z`j)@&Y{+iNzRUw3W>z0x4mK;~i(CFo zI6y7?cYt1`h$P(9&WlJKa^>nXl`Vg2n{;MJHz&Qcfl6KaJ5(CQ1s=ml;feu?uj%Cd zBCh3=7Qrd>r6V}_=&-jbvuXAtRSG!`q~Ey+Ls$Oot)zxU#f=JR6L$&yhFw(?er8He zfO?sF*x_U?M~72pW(ZJI)Stb7RXBr9pk`p}9MFsYI2T;rY(_!MPKo9r%H+FjX@)f$ z&|53wvzz)`B+=#RlrlgYz#?taT{+vuWo^8q-*QDliLiIPga=n4aRZ- zRmejZdf&~}WCajZC$}cgIJ!gks#)!1@)g*WV}e4n+n!*QDhNFwZ#xGp9|U+J0at}7 zPeWXT$w`rpGs49z8)X+hQ*_R;P_ASG=w;1SDpzVrH9|PgwOQ?0ZL6)INR@XRt(W5@ z)8pE>Qj=ljV@e&Ieg(Y&V932|XIca52p2D0!l~Vz5B}Znc_ZC-_f7oc@B0;e^wSTa zGmOb}1hN*~Sr8d?+@>~b`WcDHKt=54+;D78nd&P}i&V8kd3|LdR^L7>{jM_%azuF; zuj$lX*+Y=@x5>W7-+o*&Gk9sy0U$%zy>=Id2qoiTWX3iO80-0GJ7u=Ju0jitnSmI_v}oG~ZEFxdRt_*$ z9pka{hd+4k(v>%!ed5B~4(DsU^sZaqf7dOizH7bi&{;+kKfm|Pe7=Y)l}ZOtT`nL< zvzFc+ash7|7gdvAG_D_PwIU=d-;l+%on_|yj&KN`e!Z(mV$GZjp#`kp&+O%dpmtOh zX#iqKGar16oIsT2iiIJ5W(YCZtzs^(b9(^F0@?DLqk)S&#S3}^3f(s&F11nt1f=^a z{-QiX#h{86s=m(DGX|-;8VB_O;6o1apqSYJ{4vh#-${tQuV__lOM{kyZh6hj7>&mM zz=q6GNRaI7%v$x?b-m^A(m+qGP$kQn%9ThUF0JkfcB7M%dfYP}gCcm~$jq3{ zXZ1c0HZ$8A!||c!zCMem%~f2X%6Q}qoytkCTD?PdMlJgT=sJtVvOJVR7Zv@)P~UqC z{Hl+iM;WAw`1{cBat2Ij2_nZ?eVR7_mBH0@iwdPZ zLy~(|2V_5vB0X{2XU+C!UMtCkRQ&@k*R4>^4z)i_N`l}xWPMtOo`{MEOg1Gw3&*C{ zPu|RJkeswi&!Q&MuwRTTRI3#h%cYuCR?TGoF7Ko8S8l-VRx2#+n`pp*XKelYRbKl}71B~3qYkA37 z%vZ4U4rmOnz2REC76ORQtrQ5 zXTW>Z5E^54M{PT8Mx%2evkx>_TTCw>&R_QQrNi%e^xVO_9(-gUUwL>RUwH6IeCcbC z;p}7Quz%$c-}56=B^#WQ=gZAyx&$vI!7Jx5{uTIHtxyS`^scDjpQSa=NULF-%%3pxP(URp50^zpYQwo{ zc3?J}xs%hfD%2cNZpDNQ(^6x2ATwocbGhYj(^jG(9%}4|ps+8XN`}j1KvOa(@4-6{ z-+3mns_~TTNXv|I?UX;E$qM^r1G0EwItSMTrNjh+WsBw9fmD)9#hYe^1`J#+&fv!c1bHVX4Z-SD?52>7XL!3DJ!V%4Ag)N0j$b$YO0hpo(-yP+b3>h~CcH?^C3n zxqe*0`hY5dz`T~^0CMmb>Pb&}i14)b2UIA`RMPYSN}O%$)#+TeZ~@hPo^;ibQqjAN zo+OL1Ew!qy34jH#69X#bITDjOLZ*`bZN_4tR|QmsI3-x1e%>|(RKBFO7Q4s#0xD4# zgssj9OOvkJu9f7v`>WLo%ccLYuiu`UTQB)-IrQ3@;7wiWu5%M$dnb;avEak^{mN&~ z{XhTBujBXr;30q+<6}E$jKR7CtmjwbmTZhj{~LT2K}jJ=1!+8Ld=!TuWvx`Y2r-}% zKu%d;DQlKAmOd^z6-ln=ON_$w?L1VrUAq=iB}9IPJ$>yR`LPWV!3i3&xV`IHoh;7Av6u`wWir6 zLm={}e!`#P=_Zw@i?#jId~K%}4wm12@nHU@{fo1AJa+C99(v>g9(d#&zVPrleEE?} zc4 z6`l?G*xJOG$|HiYbW41Psxkh<VZUTbIivmdjSpen-ut&_=uqq2l z>Hlay#jCNkPFKZ~!W0~OWgA+Ot&AarNi8YI@Zy~U0bx*b;=Ve&*VlHWF_T@iisE;m z!554Q-sjZxD06=lv)*AS9wl$uA*J!|0fUSH2dyHq?(Ub9Y99J+ojxgsS+!tTf=t3o zwQ?`M+DaU1lvN8>S=}m1mHes0HCV~8um6!fRY6MNL+P$Ckc7CRn8y5uj*zk!&T5#x z%pk@l%C@BAk~2`%@u#N6lDbP;lFuW!RXFJ&%C_MrP7(;NP+CQTIc@1LrRiHSKJo&r z9uxs<04Nojr9%ureCsVFm81g?Ap`Leej3vmppdK}{Gcc^DY~HYIZwq~x1p?{h1l`v z?vW@bWE|v8R7|*RN>a6i8%OLo-CcpGikqx3sJIIth4lE7v*meyvGnM+x)CfokRgo6 zE%q;6IomWXzV};RPOrK5%#Z)$fBV}%^mD)T37mcM9L#ux@pJ;V6hEUtHrRG?Xhj55 zi3hhsgK~ltk<#X*Qt;k52sCzLEF8^`7nj?PmdTHVh$-by_q^99(MCmvrN0Vt49rv6 zZSuGBSIK6iVI%4gS;7GyOavIW!pO|9s}9||Lt_YLr@`*-6lg}^b%(>*3cvsPNAdfg z{wiQCurtB+*G_TA&DXr`*1h9zyZ5;_y!*MgoyPThCvfuE1gDNq?ms>qfAr+>$w!Xu zj6XFUHJ_Tc?cfKshtkf@1UuvAZh&TBo`U>ee_)R7c(z#c+0}~o=Bw4|E3?%bFI=9# z^>DF#)BXU_KrX+Zz=j|FC?H4>?oww1Xtvt@!7jwkaP| z0pCeGmSdB=zFY)7{FW2Bn`~^bKdItDe<1ol;0ZAY7j>*v0Id>4DE^1q6O0Z98kKvj zzo;t+%mwVtaWUgt*6ILpiF3+1(ZbsmcZ=T}9C2z-3yuoyD%*7fsa{@Q4UMBA`B#^u zRb-Mq6FQMrUn;E^NVLq78#}iRK+sT8gQ1jf@hs@7&At!(O2ynh`YH{v3t2K#)D!`o z0L*IEbySd;Kr3bUv;pZGkNvB9xdRYwZ!p@DM|Ha5hF(;Y71<<3ZS`2yx)m5M zW#wq}&nTEik-PV#y2Kaje^ML4;E1-XWX2{qcH6N1?A4s!XQjL(sga|s1-(sGIn`L! zJ;}Ff%6envqD{S0pmkTR42D3f;72>?f>0s>wtL#m_|9B#(PoW?RF!VOw*D?xs}-#( zFJ~Eoz4g>{x~u#*^hL5q9>~Kwy8MAE?PP>*+2M&N_VL{7kN@yL`Ri}}(YL8>^PdX0k2ol`gQEaNbc5_Ty>S)9ow=x1!*)6aUeP|QVfXor|c%2?@UKDo-IrQq}Cc%}5-L5z97`~OAo z)iJ;;*N03DG6u~~i|Ouhge`-1xx&RuSMaeX_JPI16>1w`cY>2Arnu#XllRexNE z-E{JMZaRGer%&$UhU-pY@8m9yO-I<7w3v)X*cp$0c`_R9?~I#Iwrw*rM2EiXcG-q+ z&GBr$TAi6MR<|wJtLbXFdfRf{VX^42Sgx^u#sS5|N2Qy&qz72%70mfrAlMyC6J1~1=plQ&7z#Y5qtgS4FS7_EN7-pceShc{2 z7!N*j4p-*OmtC_v`IOs9;QL$npg!!jX-8E)#z8ea
@pJd=OOj9$}gzBVNY_pbn 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 z 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 z==

(Tj7#8BM?~R9OHGaJXrktx;8NyzPc- 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 literal 0 HcmV?d00001 diff --git a/webui/frontend/public/vendor/ngl.js b/webui/frontend/public/vendor/ngl.js new file mode 100644 index 0000000..645dfb7 --- /dev/null +++ b/webui/frontend/public/vendor/ngl.js @@ -0,0 +1,88 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).NGL={})}(this,(function(e){"use strict";const t=1,i=2,n=3,r=0,s=1,a=2,o=100,l=101,c=102,u=200,h=201,d=202,f=203,m=204,p=205,g=206,_=207,y=208,v=209,b=210,x=211,w=212,S=213,M=214,A=0,C=1,T=2,P=0,E=1,I=2,D=3,R=4,L=5,k=301,O=302,N=306,F=1e3,B=1001,z=1002,U=1003,V=1004,$=1005,G=1006,H=1007,j=1008,W=1009,q=1012,X=1013,Y=1014,K=1015,Z=1016,Q=1020,J=1023,ee=1026,te=1027,ie=33776,ne=33777,re=33778,se=33779,ae=36492,oe=3001,le="",ce="srgb",ue="srgb-linear",he="display-p3",de="display-p3-linear",fe="linear",me="srgb",pe="rec709",ge="p3",_e=7680,ye=512,ve=513,be=514,xe=515,we=516,Se=517,Me=518,Ae=519,Ce=35044,Te=35048,Pe="300 es",Ee=1035,Ie=2e3,De=2001;class Re{addEventListener(e,t){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[e]&&(i[e]=[]),-1===i[e].indexOf(t)&&i[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[e]&&-1!==i[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;const i=this._listeners[e];if(void 0!==i){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;const t=this._listeners[e.type];if(void 0!==t){e.target=this;const i=t.slice(0);for(let t=0,n=i.length;t>8&255]+Le[e>>16&255]+Le[e>>24&255]+"-"+Le[255&t]+Le[t>>8&255]+"-"+Le[t>>16&15|64]+Le[t>>24&255]+"-"+Le[63&i|128]+Le[i>>8&255]+"-"+Le[i>>16&255]+Le[i>>24&255]+Le[255&n]+Le[n>>8&255]+Le[n>>16&255]+Le[n>>24&255]).toLowerCase()}function Fe(e,t,i){return Math.max(t,Math.min(i,e))}function Be(e,t,i){return(1-i)*e+i*t}function ze(e){return!(e&e-1)&&0!==e}function Ue(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))}function Ve(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return e/4294967295;case Uint16Array:return e/65535;case Uint8Array:return e/255;case Int32Array:return Math.max(e/2147483647,-1);case Int16Array:return Math.max(e/32767,-1);case Int8Array:return Math.max(e/127,-1);default:throw new Error("Invalid component type.")}}function $e(e,t){switch(t.constructor){case Float32Array:return e;case Uint32Array:return Math.round(4294967295*e);case Uint16Array:return Math.round(65535*e);case Uint8Array:return Math.round(255*e);case Int32Array:return Math.round(2147483647*e);case Int16Array:return Math.round(32767*e);case Int8Array:return Math.round(127*e);default:throw new Error("Invalid component type.")}}class Ge{constructor(e=0,t=0){Ge.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,i=this.y,n=e.elements;return this.x=n[0]*t+n[3]*i+n[6],this.y=n[1]*t+n[4]*i+n[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Fe(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y;return t*t+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const i=Math.cos(t),n=Math.sin(t),r=this.x-e.x,s=this.y-e.y;return this.x=r*i-s*n+e.x,this.y=r*n+s*i+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class He{constructor(e,t,i,n,r,s,a,o,l){He.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==e&&this.set(e,t,i,n,r,s,a,o,l)}set(e,t,i,n,r,s,a,o,l){const c=this.elements;return c[0]=e,c[1]=n,c[2]=a,c[3]=t,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],this}extractBasis(e,t,i){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[3],o=i[6],l=i[1],c=i[4],u=i[7],h=i[2],d=i[5],f=i[8],m=n[0],p=n[3],g=n[6],_=n[1],y=n[4],v=n[7],b=n[2],x=n[5],w=n[8];return r[0]=s*m+a*_+o*b,r[3]=s*p+a*y+o*x,r[6]=s*g+a*v+o*w,r[1]=l*m+c*_+u*b,r[4]=l*p+c*y+u*x,r[7]=l*g+c*v+u*w,r[2]=h*m+d*_+f*b,r[5]=h*p+d*y+f*x,r[8]=h*g+d*v+f*w,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],l=e[7],c=e[8];return t*s*c-t*a*l-i*r*c+i*a*o+n*r*l-n*s*o}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],l=e[7],c=e[8],u=c*s-a*l,h=a*o-c*r,d=l*r-s*o,f=t*u+i*h+n*d;if(0===f)return this.set(0,0,0,0,0,0,0,0,0);const m=1/f;return e[0]=u*m,e[1]=(n*l-c*i)*m,e[2]=(a*i-n*s)*m,e[3]=h*m,e[4]=(c*t-n*o)*m,e[5]=(n*r-a*t)*m,e[6]=d*m,e[7]=(i*o-l*t)*m,e[8]=(s*t-i*r)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,i,n,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(i*o,i*l,-i*(o*s+l*a)+s+e,-n*l,n*o,-n*(-l*s+o*a)+a+t,0,0,1),this}scale(e,t){return this.premultiply(je.makeScale(e,t)),this}rotate(e){return this.premultiply(je.makeRotation(-e)),this}translate(e,t){return this.premultiply(je.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,i,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<9;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<9;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e}clone(){return(new this.constructor).fromArray(this.elements)}}const je=new He;function We(e){for(let t=e.length-1;t>=0;--t)if(e[t]>=65535)return!0;return!1}function qe(e){return document.createElementNS("http://www.w3.org/1999/xhtml",e)}function Xe(){const e=qe("canvas");return e.style.display="block",e}const Ye={};function Ke(e){e in Ye||(Ye[e]=!0,console.warn(e))}const Ze=(new He).set(.8224621,.177538,0,.0331941,.9668058,0,.0170827,.0723974,.9105199),Qe=(new He).set(1.2249401,-.2249404,0,-.0420569,1.0420571,0,-.0196376,-.0786361,1.0982735),Je={[ue]:{transfer:fe,primaries:pe,toReference:e=>e,fromReference:e=>e},[ce]:{transfer:me,primaries:pe,toReference:e=>e.convertSRGBToLinear(),fromReference:e=>e.convertLinearToSRGB()},[de]:{transfer:fe,primaries:ge,toReference:e=>e.applyMatrix3(Qe),fromReference:e=>e.applyMatrix3(Ze)},[he]:{transfer:me,primaries:ge,toReference:e=>e.convertSRGBToLinear().applyMatrix3(Qe),fromReference:e=>e.applyMatrix3(Ze).convertLinearToSRGB()}},et=new Set([ue,de]),tt={enabled:!0,_workingColorSpace:ue,get legacyMode(){return console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),!this.enabled},set legacyMode(e){console.warn("THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150."),this.enabled=!e},get workingColorSpace(){return this._workingColorSpace},set workingColorSpace(e){if(!et.has(e))throw new Error(`Unsupported working color space, "${e}".`);this._workingColorSpace=e},convert:function(e,t,i){if(!1===this.enabled||t===i||!t||!i)return e;const n=Je[t].toReference;return(0,Je[i].fromReference)(n(e))},fromWorkingColorSpace:function(e,t){return this.convert(e,this._workingColorSpace,t)},toWorkingColorSpace:function(e,t){return this.convert(e,t,this._workingColorSpace)},getPrimaries:function(e){return Je[e].primaries},getTransfer:function(e){return e===le?fe:Je[e].transfer}};function it(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function nt(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}let rt;class st{static getDataURL(e){if(/^data:/i.test(e.src))return e.src;if("undefined"==typeof HTMLCanvasElement)return e.src;let t;if(e instanceof HTMLCanvasElement)t=e;else{void 0===rt&&(rt=qe("canvas")),rt.width=e.width,rt.height=e.height;const i=rt.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),t=rt}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}static sRGBToLinear(e){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const t=qe("canvas");t.width=e.width,t.height=e.height;const i=t.getContext("2d");i.drawImage(e,0,0,e.width,e.height);const n=i.getImageData(0,0,e.width,e.height),r=n.data;for(let e=0;e0&&(i.userData=this.userData),t||(e.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(300!==this.mapping)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case F:e.x=e.x-Math.floor(e.x);break;case B:e.x=e.x<0?0:1;break;case z:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case F:e.y=e.y-Math.floor(e.y);break;case B:e.y=e.y<0?0:1;break;case z:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){!0===e&&(this.version++,this.source.needsUpdate=!0)}get encoding(){return Ke("THREE.Texture: Property .encoding has been replaced by .colorSpace."),this.colorSpace===ce?oe:3e3}set encoding(e){Ke("THREE.Texture: Property .encoding has been replaced by .colorSpace."),this.colorSpace=e===oe?ce:le}}ut.DEFAULT_IMAGE=null,ut.DEFAULT_MAPPING=300,ut.DEFAULT_ANISOTROPY=1;class ht{constructor(e=0,t=0,i=0,n=1){ht.prototype.isVector4=!0,this.x=e,this.y=t,this.z=i,this.w=n}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,i,n){return this.x=e,this.y=t,this.z=i,this.w=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=this.w,s=e.elements;return this.x=s[0]*t+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*t+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*t+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*t+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,i,n,r;const s=.01,a=.1,o=e.elements,l=o[0],c=o[4],u=o[8],h=o[1],d=o[5],f=o[9],m=o[2],p=o[6],g=o[10];if(Math.abs(c-h)o&&e>_?e_?o=0?1:-1,n=1-t*t;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,t*i);e=Math.sin(e*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*e+h*r,l=l*e+d*r,c=c*e+f*r,u=u*e+m*r,e===1-a){const e=1/Math.sqrt(o*o+l*l+c*c+u*u);o*=e,l*=e,c*=e,u*=e}}e[t]=o,e[t+1]=l,e[t+2]=c,e[t+3]=u}static multiplyQuaternionsFlat(e,t,i,n,r,s){const a=i[n],o=i[n+1],l=i[n+2],c=i[n+3],u=r[s],h=r[s+1],d=r[s+2],f=r[s+3];return e[t]=a*f+c*u+o*d-l*h,e[t+1]=o*f+c*h+l*u-a*d,e[t+2]=l*f+c*d+a*h-o*u,e[t+3]=c*f-a*u-o*h-l*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,i,n){return this._x=e,this._y=t,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t){const i=e._x,n=e._y,r=e._z,s=e._order,a=Math.cos,o=Math.sin,l=a(i/2),c=a(n/2),u=a(r/2),h=o(i/2),d=o(n/2),f=o(r/2);switch(s){case"XYZ":this._x=h*c*u+l*d*f,this._y=l*d*u-h*c*f,this._z=l*c*f+h*d*u,this._w=l*c*u-h*d*f;break;case"YXZ":this._x=h*c*u+l*d*f,this._y=l*d*u-h*c*f,this._z=l*c*f-h*d*u,this._w=l*c*u+h*d*f;break;case"ZXY":this._x=h*c*u-l*d*f,this._y=l*d*u+h*c*f,this._z=l*c*f+h*d*u,this._w=l*c*u-h*d*f;break;case"ZYX":this._x=h*c*u-l*d*f,this._y=l*d*u+h*c*f,this._z=l*c*f-h*d*u,this._w=l*c*u+h*d*f;break;case"YZX":this._x=h*c*u+l*d*f,this._y=l*d*u+h*c*f,this._z=l*c*f-h*d*u,this._w=l*c*u-h*d*f;break;case"XZY":this._x=h*c*u-l*d*f,this._y=l*d*u-h*c*f,this._z=l*c*f+h*d*u,this._w=l*c*u+h*d*f;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==t&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const i=t/2,n=Math.sin(i);return this._x=e.x*n,this._y=e.y*n,this._z=e.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],n=t[4],r=t[8],s=t[1],a=t[5],o=t[9],l=t[2],c=t[6],u=t[10],h=i+a+u;if(h>0){const e=.5/Math.sqrt(h+1);this._w=.25/e,this._x=(c-o)*e,this._y=(r-l)*e,this._z=(s-n)*e}else if(i>a&&i>u){const e=2*Math.sqrt(1+i-a-u);this._w=(c-o)/e,this._x=.25*e,this._y=(n+s)/e,this._z=(r+l)/e}else if(a>u){const e=2*Math.sqrt(1+a-i-u);this._w=(r-l)/e,this._x=(n+s)/e,this._y=.25*e,this._z=(o+c)/e}else{const e=2*Math.sqrt(1+u-i-a);this._w=(s-n)/e,this._x=(r+l)/e,this._y=(o+c)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let i=e.dot(t)+1;return iMath.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=i):(this._x=0,this._y=-e.z,this._z=e.y,this._w=i)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=i),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Fe(this.dot(e),-1,1)))}rotateTowards(e,t){const i=this.angleTo(e);if(0===i)return this;const n=Math.min(1,t/i);return this.slerp(e,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const i=e._x,n=e._y,r=e._z,s=e._w,a=t._x,o=t._y,l=t._z,c=t._w;return this._x=i*c+s*a+n*l-r*o,this._y=n*c+s*o+r*a-i*l,this._z=r*c+s*l+i*o-n*a,this._w=s*c-i*a-n*o-r*l,this._onChangeCallback(),this}slerp(e,t){if(0===t)return this;if(1===t)return this.copy(e);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*e._w+i*e._x+n*e._y+r*e._z;if(a<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,a=-a):this.copy(e),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const e=1-t;return this._w=e*s+t*this._w,this._x=e*i+t*this._x,this._y=e*n+t*this._y,this._z=e*r+t*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),u=Math.sin((1-t)*c)/l,h=Math.sin(t*c)/l;return this._w=s*u+this._w*h,this._x=i*u+this._x*h,this._y=n*u+this._y*h,this._z=r*u+this._z*h,this._onChangeCallback(),this}slerpQuaternions(e,t,i){return this.copy(e).slerp(t,i)}random(){const e=Math.random(),t=Math.sqrt(1-e),i=Math.sqrt(e),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(t*Math.cos(n),i*Math.sin(r),i*Math.cos(r),t*Math.sin(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class _t{constructor(e=0,t=0,i=0){_t.prototype.isVector3=!0,this.x=e,this.y=t,this.z=i}set(e,t,i){return void 0===i&&(i=this.z),this.x=e,this.y=t,this.z=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(vt.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(vt.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[3]*i+r[6]*n,this.y=r[1]*t+r[4]*i+r[7]*n,this.z=r[2]*t+r[5]*i+r[8]*n,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=e.elements,s=1/(r[3]*t+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*t+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*t+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*t+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(e){const t=this.x,i=this.y,n=this.z,r=e.x,s=e.y,a=e.z,o=e.w,l=2*(s*n-a*i),c=2*(a*t-r*n),u=2*(r*i-s*t);return this.x=t+o*l+s*u-a*c,this.y=i+o*c+a*l-r*u,this.z=n+o*u+r*c-s*l,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[4]*i+r[8]*n,this.y=r[1]*t+r[5]*i+r[9]*n,this.z=r[2]*t+r[6]*i+r[10]*n,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const i=e.x,n=e.y,r=e.z,s=t.x,a=t.y,o=t.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(e){const t=e.lengthSq();if(0===t)return this.set(0,0,0);const i=e.dot(this)/t;return this.copy(e).multiplyScalar(i)}projectOnPlane(e){return yt.copy(this).projectOnVector(e),this.sub(yt)}reflect(e){return this.sub(yt.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Fe(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y,n=this.z-e.z;return t*t+i*i+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,i){const n=Math.sin(t)*e;return this.x=n*Math.sin(i),this.y=Math.cos(t)*e,this.z=n*Math.cos(i),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,i){return this.x=e*Math.sin(t),this.y=i,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),i=this.setFromMatrixColumn(e,1).length(),n=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=i,this.z=n,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,4*t)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,3*t)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=2*(Math.random()-.5),t=Math.random()*Math.PI*2,i=Math.sqrt(1-e**2);return this.x=i*Math.cos(t),this.y=i*Math.sin(t),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const yt=new _t,vt=new gt;class bt{constructor(e=new _t(1/0,1/0,1/0),t=new _t(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){this.makeEmpty();for(let t=0,i=e.length;tthis.max.x||e.ythis.max.y||e.zthis.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.xthis.max.x||e.max.ythis.max.y||e.max.zthis.max.z)}intersectsSphere(e){return this.clampPoint(e.center,wt),wt.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,i;return e.normal.x>0?(t=e.normal.x*this.min.x,i=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,i=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,i+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,i+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,i+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,i+=e.normal.z*this.min.z),t<=-e.constant&&i>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(It),Dt.subVectors(this.max,It),Mt.subVectors(e.a,It),At.subVectors(e.b,It),Ct.subVectors(e.c,It),Tt.subVectors(At,Mt),Pt.subVectors(Ct,At),Et.subVectors(Mt,Ct);let t=[0,-Tt.z,Tt.y,0,-Pt.z,Pt.y,0,-Et.z,Et.y,Tt.z,0,-Tt.x,Pt.z,0,-Pt.x,Et.z,0,-Et.x,-Tt.y,Tt.x,0,-Pt.y,Pt.x,0,-Et.y,Et.x,0];return!!kt(t,Mt,At,Ct,Dt)&&(t=[1,0,0,0,1,0,0,0,1],!!kt(t,Mt,At,Ct,Dt)&&(Rt.crossVectors(Tt,Pt),t=[Rt.x,Rt.y,Rt.z],kt(t,Mt,At,Ct,Dt)))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,wt).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=.5*this.getSize(wt).length()),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()||(xt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),xt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),xt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),xt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),xt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),xt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),xt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),xt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(xt)),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}const xt=[new _t,new _t,new _t,new _t,new _t,new _t,new _t,new _t],wt=new _t,St=new bt,Mt=new _t,At=new _t,Ct=new _t,Tt=new _t,Pt=new _t,Et=new _t,It=new _t,Dt=new _t,Rt=new _t,Lt=new _t;function kt(e,t,i,n,r){for(let s=0,a=e.length-3;s<=a;s+=3){Lt.fromArray(e,s);const a=r.x*Math.abs(Lt.x)+r.y*Math.abs(Lt.y)+r.z*Math.abs(Lt.z),o=t.dot(Lt),l=i.dot(Lt),c=n.dot(Lt);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const Ot=new bt,Nt=new _t,Ft=new _t;class Bt{constructor(e=new _t,t=-1){this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const i=this.center;void 0!==t?i.copy(t):Ot.setFromPoints(e).getCenter(i);let n=0;for(let t=0,r=e.length;tthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;Nt.subVectors(e,this.center);const t=Nt.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),i=.5*(e-this.radius);this.center.addScaledVector(Nt,i/e),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(!0===this.center.equals(e.center)?this.radius=Math.max(this.radius,e.radius):(Ft.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(Nt.copy(e.center).add(Ft)),this.expandByPoint(Nt.copy(e.center).sub(Ft))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const zt=new _t,Ut=new _t,Vt=new _t,$t=new _t,Gt=new _t,Ht=new _t,jt=new _t;class Wt{constructor(e=new _t,t=new _t(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,zt)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const i=t.dot(this.direction);return i<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=zt.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(zt.copy(this.origin).addScaledVector(this.direction,t),zt.distanceToSquared(e))}distanceSqToSegment(e,t,i,n){Ut.copy(e).add(t).multiplyScalar(.5),Vt.copy(t).sub(e).normalize(),$t.copy(this.origin).sub(Ut);const r=.5*e.distanceTo(t),s=-this.direction.dot(Vt),a=$t.dot(this.direction),o=-$t.dot(Vt),l=$t.lengthSq(),c=Math.abs(1-s*s);let u,h,d,f;if(c>0)if(u=s*o-a,h=s*a-o,f=r*c,u>=0)if(h>=-f)if(h<=f){const e=1/c;u*=e,h*=e,d=u*(u+s*h+2*a)+h*(s*u+h+2*o)+l}else h=r,u=Math.max(0,-(s*h+a)),d=-u*u+h*(h+2*o)+l;else h=-r,u=Math.max(0,-(s*h+a)),d=-u*u+h*(h+2*o)+l;else h<=-f?(u=Math.max(0,-(-s*r+a)),h=u>0?-r:Math.min(Math.max(-r,-o),r),d=-u*u+h*(h+2*o)+l):h<=f?(u=0,h=Math.min(Math.max(-r,-o),r),d=h*(h+2*o)+l):(u=Math.max(0,-(s*r+a)),h=u>0?r:Math.min(Math.max(-r,-o),r),d=-u*u+h*(h+2*o)+l);else h=s>0?-r:r,u=Math.max(0,-(s*h+a)),d=-u*u+h*(h+2*o)+l;return i&&i.copy(this.origin).addScaledVector(this.direction,u),n&&n.copy(Ut).addScaledVector(Vt,h),d}intersectSphere(e,t){zt.subVectors(e.center,this.origin);const i=zt.dot(this.direction),n=zt.dot(zt)-i*i,r=e.radius*e.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return o<0?null:a<0?this.at(o,t):this.at(a,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(e.normal)+e.constant)/t;return i>=0?i:null}intersectPlane(e,t){const i=this.distanceToPlane(e);return null===i?null:this.at(i,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);if(0===t)return!0;return e.normal.dot(this.direction)*t<0}intersectBox(e,t){let i,n,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,u=1/this.direction.z,h=this.origin;return l>=0?(i=(e.min.x-h.x)*l,n=(e.max.x-h.x)*l):(i=(e.max.x-h.x)*l,n=(e.min.x-h.x)*l),c>=0?(r=(e.min.y-h.y)*c,s=(e.max.y-h.y)*c):(r=(e.max.y-h.y)*c,s=(e.min.y-h.y)*c),i>s||r>n?null:((r>i||isNaN(i))&&(i=r),(s=0?(a=(e.min.z-h.z)*u,o=(e.max.z-h.z)*u):(a=(e.max.z-h.z)*u,o=(e.min.z-h.z)*u),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o=0?i:n,t)))}intersectsBox(e){return null!==this.intersectBox(e,zt)}intersectTriangle(e,t,i,n,r){Gt.subVectors(t,e),Ht.subVectors(i,e),jt.crossVectors(Gt,Ht);let s,a=this.direction.dot(jt);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}$t.subVectors(this.origin,e);const o=s*this.direction.dot(Ht.crossVectors($t,Ht));if(o<0)return null;const l=s*this.direction.dot(Gt.cross($t));if(l<0)return null;if(o+l>a)return null;const c=-s*$t.dot(jt);return c<0?null:this.at(c/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class qt{constructor(e,t,i,n,r,s,a,o,l,c,u,h,d,f,m,p){qt.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==e&&this.set(e,t,i,n,r,s,a,o,l,c,u,h,d,f,m,p)}set(e,t,i,n,r,s,a,o,l,c,u,h,d,f,m,p){const g=this.elements;return g[0]=e,g[4]=t,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=u,g[14]=h,g[3]=d,g[7]=f,g[11]=m,g[15]=p,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new qt).fromArray(this.elements)}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],this}copyPosition(e){const t=this.elements,i=e.elements;return t[12]=i[12],t[13]=i[13],t[14]=i[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,i){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(e,t,i){return this.set(e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,i=e.elements,n=1/Xt.setFromMatrixColumn(e,0).length(),r=1/Xt.setFromMatrixColumn(e,1).length(),s=1/Xt.setFromMatrixColumn(e,2).length();return t[0]=i[0]*n,t[1]=i[1]*n,t[2]=i[2]*n,t[3]=0,t[4]=i[4]*r,t[5]=i[5]*r,t[6]=i[6]*r,t[7]=0,t[8]=i[8]*s,t[9]=i[9]*s,t[10]=i[10]*s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,i=e.x,n=e.y,r=e.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),l=Math.sin(n),c=Math.cos(r),u=Math.sin(r);if("XYZ"===e.order){const e=s*c,i=s*u,n=a*c,r=a*u;t[0]=o*c,t[4]=-o*u,t[8]=l,t[1]=i+n*l,t[5]=e-r*l,t[9]=-a*o,t[2]=r-e*l,t[6]=n+i*l,t[10]=s*o}else if("YXZ"===e.order){const e=o*c,i=o*u,n=l*c,r=l*u;t[0]=e+r*a,t[4]=n*a-i,t[8]=s*l,t[1]=s*u,t[5]=s*c,t[9]=-a,t[2]=i*a-n,t[6]=r+e*a,t[10]=s*o}else if("ZXY"===e.order){const e=o*c,i=o*u,n=l*c,r=l*u;t[0]=e-r*a,t[4]=-s*u,t[8]=n+i*a,t[1]=i+n*a,t[5]=s*c,t[9]=r-e*a,t[2]=-s*l,t[6]=a,t[10]=s*o}else if("ZYX"===e.order){const e=s*c,i=s*u,n=a*c,r=a*u;t[0]=o*c,t[4]=n*l-i,t[8]=e*l+r,t[1]=o*u,t[5]=r*l+e,t[9]=i*l-n,t[2]=-l,t[6]=a*o,t[10]=s*o}else if("YZX"===e.order){const e=s*o,i=s*l,n=a*o,r=a*l;t[0]=o*c,t[4]=r-e*u,t[8]=n*u+i,t[1]=u,t[5]=s*c,t[9]=-a*c,t[2]=-l*c,t[6]=i*u+n,t[10]=e-r*u}else if("XZY"===e.order){const e=s*o,i=s*l,n=a*o,r=a*l;t[0]=o*c,t[4]=-u,t[8]=l*c,t[1]=e*u+r,t[5]=s*c,t[9]=i*u-n,t[2]=n*u-i,t[6]=a*c,t[10]=r*u+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Kt,e,Zt)}lookAt(e,t,i){const n=this.elements;return ei.subVectors(e,t),0===ei.lengthSq()&&(ei.z=1),ei.normalize(),Qt.crossVectors(i,ei),0===Qt.lengthSq()&&(1===Math.abs(i.z)?ei.x+=1e-4:ei.z+=1e-4,ei.normalize(),Qt.crossVectors(i,ei)),Qt.normalize(),Jt.crossVectors(ei,Qt),n[0]=Qt.x,n[4]=Jt.x,n[8]=ei.x,n[1]=Qt.y,n[5]=Jt.y,n[9]=ei.y,n[2]=Qt.z,n[6]=Jt.z,n[10]=ei.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[4],o=i[8],l=i[12],c=i[1],u=i[5],h=i[9],d=i[13],f=i[2],m=i[6],p=i[10],g=i[14],_=i[3],y=i[7],v=i[11],b=i[15],x=n[0],w=n[4],S=n[8],M=n[12],A=n[1],C=n[5],T=n[9],P=n[13],E=n[2],I=n[6],D=n[10],R=n[14],L=n[3],k=n[7],O=n[11],N=n[15];return r[0]=s*x+a*A+o*E+l*L,r[4]=s*w+a*C+o*I+l*k,r[8]=s*S+a*T+o*D+l*O,r[12]=s*M+a*P+o*R+l*N,r[1]=c*x+u*A+h*E+d*L,r[5]=c*w+u*C+h*I+d*k,r[9]=c*S+u*T+h*D+d*O,r[13]=c*M+u*P+h*R+d*N,r[2]=f*x+m*A+p*E+g*L,r[6]=f*w+m*C+p*I+g*k,r[10]=f*S+m*T+p*D+g*O,r[14]=f*M+m*P+p*R+g*N,r[3]=_*x+y*A+v*E+b*L,r[7]=_*w+y*C+v*I+b*k,r[11]=_*S+y*T+v*D+b*O,r[15]=_*M+y*P+v*R+b*N,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[4],n=e[8],r=e[12],s=e[1],a=e[5],o=e[9],l=e[13],c=e[2],u=e[6],h=e[10],d=e[14];return e[3]*(+r*o*u-n*l*u-r*a*h+i*l*h+n*a*d-i*o*d)+e[7]*(+t*o*d-t*l*h+r*s*h-n*s*d+n*l*c-r*o*c)+e[11]*(+t*l*u-t*a*d-r*s*u+i*s*d+r*a*c-i*l*c)+e[15]*(-n*a*c-t*o*u+t*a*h+n*s*u-i*s*h+i*o*c)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,i){const n=this.elements;return e.isVector3?(n[12]=e.x,n[13]=e.y,n[14]=e.z):(n[12]=e,n[13]=t,n[14]=i),this}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],l=e[7],c=e[8],u=e[9],h=e[10],d=e[11],f=e[12],m=e[13],p=e[14],g=e[15],_=u*p*l-m*h*l+m*o*d-a*p*d-u*o*g+a*h*g,y=f*h*l-c*p*l-f*o*d+s*p*d+c*o*g-s*h*g,v=c*m*l-f*u*l+f*a*d-s*m*d-c*a*g+s*u*g,b=f*u*o-c*m*o-f*a*h+s*m*h+c*a*p-s*u*p,x=t*_+i*y+n*v+r*b;if(0===x)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/x;return e[0]=_*w,e[1]=(m*h*r-u*p*r-m*n*d+i*p*d+u*n*g-i*h*g)*w,e[2]=(a*p*r-m*o*r+m*n*l-i*p*l-a*n*g+i*o*g)*w,e[3]=(u*o*r-a*h*r-u*n*l+i*h*l+a*n*d-i*o*d)*w,e[4]=y*w,e[5]=(c*p*r-f*h*r+f*n*d-t*p*d-c*n*g+t*h*g)*w,e[6]=(f*o*r-s*p*r-f*n*l+t*p*l+s*n*g-t*o*g)*w,e[7]=(s*h*r-c*o*r+c*n*l-t*h*l-s*n*d+t*o*d)*w,e[8]=v*w,e[9]=(f*u*r-c*m*r-f*i*d+t*m*d+c*i*g-t*u*g)*w,e[10]=(s*m*r-f*a*r+f*i*l-t*m*l-s*i*g+t*a*g)*w,e[11]=(c*a*r-s*u*r-c*i*l+t*u*l+s*i*d-t*a*d)*w,e[12]=b*w,e[13]=(c*m*n-f*u*n+f*i*h-t*m*h-c*i*p+t*u*p)*w,e[14]=(f*a*n-s*m*n-f*i*o+t*m*o+s*i*p-t*a*p)*w,e[15]=(s*u*n-c*a*n+c*i*o-t*u*o-s*i*h+t*a*h)*w,this}scale(e){const t=this.elements,i=e.x,n=e.y,r=e.z;return t[0]*=i,t[4]*=n,t[8]*=r,t[1]*=i,t[5]*=n,t[9]*=r,t[2]*=i,t[6]*=n,t[10]*=r,t[3]*=i,t[7]*=n,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],n=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,n))}makeTranslation(e,t,i){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,i,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),i=Math.sin(e);return this.set(1,0,0,0,0,t,-i,0,0,i,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,0,i,0,0,1,0,0,-i,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,0,i,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const i=Math.cos(t),n=Math.sin(t),r=1-i,s=e.x,a=e.y,o=e.z,l=r*s,c=r*a;return this.set(l*s+i,l*a-n*o,l*o+n*a,0,l*a+n*o,c*a+i,c*o-n*s,0,l*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(e,t,i){return this.set(e,0,0,0,0,t,0,0,0,0,i,0,0,0,0,1),this}makeShear(e,t,i,n,r,s){return this.set(1,i,r,0,e,1,s,0,t,n,1,0,0,0,0,1),this}compose(e,t,i){const n=this.elements,r=t._x,s=t._y,a=t._z,o=t._w,l=r+r,c=s+s,u=a+a,h=r*l,d=r*c,f=r*u,m=s*c,p=s*u,g=a*u,_=o*l,y=o*c,v=o*u,b=i.x,x=i.y,w=i.z;return n[0]=(1-(m+g))*b,n[1]=(d+v)*b,n[2]=(f-y)*b,n[3]=0,n[4]=(d-v)*x,n[5]=(1-(h+g))*x,n[6]=(p+_)*x,n[7]=0,n[8]=(f+y)*w,n[9]=(p-_)*w,n[10]=(1-(h+m))*w,n[11]=0,n[12]=e.x,n[13]=e.y,n[14]=e.z,n[15]=1,this}decompose(e,t,i){const n=this.elements;let r=Xt.set(n[0],n[1],n[2]).length();const s=Xt.set(n[4],n[5],n[6]).length(),a=Xt.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),e.x=n[12],e.y=n[13],e.z=n[14],Yt.copy(this);const o=1/r,l=1/s,c=1/a;return Yt.elements[0]*=o,Yt.elements[1]*=o,Yt.elements[2]*=o,Yt.elements[4]*=l,Yt.elements[5]*=l,Yt.elements[6]*=l,Yt.elements[8]*=c,Yt.elements[9]*=c,Yt.elements[10]*=c,t.setFromRotationMatrix(Yt),i.x=r,i.y=s,i.z=a,this}makePerspective(e,t,i,n,r,s,a=2e3){const o=this.elements,l=2*r/(t-e),c=2*r/(i-n),u=(t+e)/(t-e),h=(i+n)/(i-n);let d,f;if(a===Ie)d=-(s+r)/(s-r),f=-2*s*r/(s-r);else{if(a!==De)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);d=-s/(s-r),f=-s*r/(s-r)}return o[0]=l,o[4]=0,o[8]=u,o[12]=0,o[1]=0,o[5]=c,o[9]=h,o[13]=0,o[2]=0,o[6]=0,o[10]=d,o[14]=f,o[3]=0,o[7]=0,o[11]=-1,o[15]=0,this}makeOrthographic(e,t,i,n,r,s,a=2e3){const o=this.elements,l=1/(t-e),c=1/(i-n),u=1/(s-r),h=(t+e)*l,d=(i+n)*c;let f,m;if(a===Ie)f=(s+r)*u,m=-2*u;else{if(a!==De)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);f=r*u,m=-1*u}return o[0]=2*l,o[4]=0,o[8]=0,o[12]=-h,o[1]=0,o[5]=2*c,o[9]=0,o[13]=-d,o[2]=0,o[6]=0,o[10]=m,o[14]=-f,o[3]=0,o[7]=0,o[11]=0,o[15]=1,this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<16;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<16;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e[t+9]=i[9],e[t+10]=i[10],e[t+11]=i[11],e[t+12]=i[12],e[t+13]=i[13],e[t+14]=i[14],e[t+15]=i[15],e}}const Xt=new _t,Yt=new qt,Kt=new _t(0,0,0),Zt=new _t(1,1,1),Qt=new _t,Jt=new _t,ei=new _t,ti=new qt,ii=new gt;class ni{constructor(e=0,t=0,i=0,n=ni.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=i,this._order=n}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,i,n=this._order){return this._x=e,this._y=t,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,i=!0){const n=e.elements,r=n[0],s=n[4],a=n[8],o=n[1],l=n[5],c=n[9],u=n[2],h=n[6],d=n[10];switch(t){case"XYZ":this._y=Math.asin(Fe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(h,l),this._z=0);break;case"YXZ":this._x=Math.asin(-Fe(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(Fe(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(-u,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Fe(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(h,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(Fe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Fe(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(h,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,!0===i&&this._onChangeCallback(),this}setFromQuaternion(e,t,i){return ti.makeRotationFromQuaternion(e),this.setFromRotationMatrix(ti,t,i)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return ii.setFromEuler(this),this.setFromQuaternion(ii,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}ni.DEFAULT_ORDER="XYZ";class ri{constructor(){this.mask=1}set(e){this.mask=1<>>0}enable(e){this.mask|=1<1){for(let e=0;e1){for(let e=0;e0&&(i=i.concat(r))}return i}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(ui,e,hi),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(ui,di,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(e){e(this);const t=this.children;for(let i=0,n=t.length;i0&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),n.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(n.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(e.geometries,this.geometry);const t=this.geometry.parameters;if(void 0!==t&&void 0!==t.shapes){const i=t.shapes;if(Array.isArray(i))for(let t=0,n=i.length;t0){n.children=[];for(let t=0;t0){n.animations=[];for(let t=0;t0&&(i.geometries=t),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),l.length>0&&(i.skeletons=l),c.length>0&&(i.animations=c),u.length>0&&(i.nodes=u)}return i.object=n,i;function s(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}}clone(e){return(new this.constructor).copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(e,t,i,n,r){vi.subVectors(n,t),bi.subVectors(i,t),xi.subVectors(e,t);const s=vi.dot(vi),a=vi.dot(bi),o=vi.dot(xi),l=bi.dot(bi),c=bi.dot(xi),u=s*l-a*a;if(0===u)return r.set(-2,-1,-1);const h=1/u,d=(l*o-a*c)*h,f=(s*c-a*o)*h;return r.set(1-d-f,f,d)}static containsPoint(e,t,i,n){return this.getBarycoord(e,t,i,n,wi),wi.x>=0&&wi.y>=0&&wi.x+wi.y<=1}static getUV(e,t,i,n,r,s,a,o){return!1===Ei&&(console.warn("THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation()."),Ei=!0),this.getInterpolation(e,t,i,n,r,s,a,o)}static getInterpolation(e,t,i,n,r,s,a,o){return this.getBarycoord(e,t,i,n,wi),o.setScalar(0),o.addScaledVector(r,wi.x),o.addScaledVector(s,wi.y),o.addScaledVector(a,wi.z),o}static isFrontFacing(e,t,i,n){return vi.subVectors(i,t),bi.subVectors(e,t),vi.cross(bi).dot(n)<0}set(e,t,i){return this.a.copy(e),this.b.copy(t),this.c.copy(i),this}setFromPointsAndIndices(e,t,i,n){return this.a.copy(e[t]),this.b.copy(e[i]),this.c.copy(e[n]),this}setFromAttributeAndIndices(e,t,i,n){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,i),this.c.fromBufferAttribute(e,n),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return vi.subVectors(this.c,this.b),bi.subVectors(this.a,this.b),.5*vi.cross(bi).length()}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Ii.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return Ii.getBarycoord(e,this.a,this.b,this.c,t)}getUV(e,t,i,n,r){return!1===Ei&&(console.warn("THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation()."),Ei=!0),Ii.getInterpolation(e,this.a,this.b,this.c,t,i,n,r)}getInterpolation(e,t,i,n,r){return Ii.getInterpolation(e,this.a,this.b,this.c,t,i,n,r)}containsPoint(e){return Ii.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Ii.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const i=this.a,n=this.b,r=this.c;let s,a;Si.subVectors(n,i),Mi.subVectors(r,i),Ci.subVectors(e,i);const o=Si.dot(Ci),l=Mi.dot(Ci);if(o<=0&&l<=0)return t.copy(i);Ti.subVectors(e,n);const c=Si.dot(Ti),u=Mi.dot(Ti);if(c>=0&&u<=c)return t.copy(n);const h=o*u-c*l;if(h<=0&&o>=0&&c<=0)return s=o/(o-c),t.copy(i).addScaledVector(Si,s);Pi.subVectors(e,r);const d=Si.dot(Pi),f=Mi.dot(Pi);if(f>=0&&d<=f)return t.copy(r);const m=d*l-o*f;if(m<=0&&l>=0&&f<=0)return a=l/(l-f),t.copy(i).addScaledVector(Mi,a);const p=c*f-d*u;if(p<=0&&u-c>=0&&d-f>=0)return Ai.subVectors(r,n),a=(u-c)/(u-c+(d-f)),t.copy(n).addScaledVector(Ai,a);const g=1/(p+m+h);return s=m*g,a=h*g,t.copy(i).addScaledVector(Si,s).addScaledVector(Mi,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const Di={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ri={h:0,s:0,l:0},Li={h:0,s:0,l:0};function ki(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+6*(t-e)*(2/3-i):e}class Oi{constructor(e,t,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,i)}set(e,t,i){if(void 0===t&&void 0===i){const t=e;t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t)}else this.setRGB(e,t,i);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=ce){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,tt.toWorkingColorSpace(this,t),this}setRGB(e,t,i,n=tt.workingColorSpace){return this.r=e,this.g=t,this.b=i,tt.toWorkingColorSpace(this,n),this}setHSL(e,t,i,n=tt.workingColorSpace){var r;if(e=(e%(r=1)+r)%r,t=Fe(t,0,1),i=Fe(i,0,1),0===t)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+t):i+t-i*t,r=2*i-n;this.r=ki(r,n,e+1/3),this.g=ki(r,n,e),this.b=ki(r,n,e-1/3)}return tt.toWorkingColorSpace(this,n),this}setStyle(e,t=ce){function i(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let n;if(n=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const s=n[1],a=n[2];switch(s){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+e)}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(e)){const i=n[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,t);if(6===r)return this.setHex(parseInt(i,16),t);console.warn("THREE.Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=ce){const i=Di[e.toLowerCase()];return void 0!==i?this.setHex(i,t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=it(e.r),this.g=it(e.g),this.b=it(e.b),this}copyLinearToSRGB(e){return this.r=nt(e.r),this.g=nt(e.g),this.b=nt(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=ce){return tt.fromWorkingColorSpace(Ni.copy(this),e),65536*Math.round(Fe(255*Ni.r,0,255))+256*Math.round(Fe(255*Ni.g,0,255))+Math.round(Fe(255*Ni.b,0,255))}getHexString(e=ce){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=tt.workingColorSpace){tt.fromWorkingColorSpace(Ni.copy(this),t);const i=Ni.r,n=Ni.g,r=Ni.b,s=Math.max(i,n,r),a=Math.min(i,n,r);let o,l;const c=(a+s)/2;if(a===s)o=0,l=0;else{const e=s-a;switch(l=c<=.5?e/(s+a):e/(2-s-a),s){case i:o=(n-r)/e+(n0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(void 0!==e)for(const t in e){const i=e[t];if(void 0===i){console.warn(`THREE.Material: parameter '${t}' has value of undefined.`);continue}const n=this[t];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[t]=i:console.warn(`THREE.Material: '${t}' is not a property of THREE.${this.type}.`)}}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});const i={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function n(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(e).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(e).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(e).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(e).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(e).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(e).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(e).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(e).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),this.side!==r&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),this.blendEquation!==o&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==_e&&(i.stencilFail=this.stencilFail),this.stencilZFail!==_e&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==_e&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),t){const t=n(e.textures),r=n(e.images);t.length>0&&(i.textures=t),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let i=null;if(null!==t){const e=t.length;i=new Array(e);for(let n=0;n!==e;++n)i[n]=t[n].clone()}return this.clippingPlanes=i,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}}class zi extends Bi{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Oi(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=A,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ui=new _t,Vi=new Ge;class $i{constructor(e,t,i=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=i,this.usage=Ce,this.updateRange={offset:0,count:-1},this.gpuType=K,this.version=0}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,i){e*=this.itemSize,i*=t.itemSize;for(let n=0,r=this.itemSize;n0&&(e.userData=this.userData),void 0!==this.parameters){const t=this.parameters;for(const i in t)void 0!==t[i]&&(e[i]=t[i]);return e}e.data={attributes:{}};const t=this.index;null!==t&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const i=this.attributes;for(const t in i){const n=i[t];e.data.attributes[t]=n.toJSON(e.data)}const n={};let r=!1;for(const t in this.morphAttributes){const i=this.morphAttributes[t],s=[];for(let t=0,n=i.length;t0&&(n[t]=s,r=!0)}r&&(e.data.morphAttributes=n,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(e.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),e}clone(){return(new this.constructor).copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const i=e.index;null!==i&&this.setIndex(i.clone(t));const n=e.attributes;for(const e in n){const i=n[e];this.setAttribute(e,i.clone(t))}const r=e.morphAttributes;for(const e in r){const i=[],n=r[e];for(let e=0,r=n.length;e0){const i=e[t[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=i.length;e(e.far-e.near)**2)return}en.copy(r).invert(),tn.copy(e.ray).applyMatrix4(en),null!==i.boundingBox&&!1===tn.intersectsBox(i.boundingBox)||this._computeIntersections(e,t,tn)}}_computeIntersections(e,t,i){let n;const r=this.geometry,s=this.material,a=r.index,o=r.attributes.position,l=r.attributes.uv,c=r.attributes.uv1,u=r.attributes.normal,h=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(s))for(let r=0,o=h.length;ri.far?null:{distance:h,point:_n.clone(),object:e}}(e,t,i,n,sn,an,on,gn);if(d){a&&(un.fromBufferAttribute(a,c),hn.fromBufferAttribute(a,u),dn.fromBufferAttribute(a,h),d.uv=Ii.getInterpolation(gn,sn,an,on,un,hn,dn,new Ge)),o&&(un.fromBufferAttribute(o,c),hn.fromBufferAttribute(o,u),dn.fromBufferAttribute(o,h),d.uv1=Ii.getInterpolation(gn,sn,an,on,un,hn,dn,new Ge),d.uv2=d.uv1),l&&(fn.fromBufferAttribute(l,c),mn.fromBufferAttribute(l,u),pn.fromBufferAttribute(l,h),d.normal=Ii.getInterpolation(gn,sn,an,on,fn,mn,pn,new _t),d.normal.dot(n.direction)>0&&d.normal.multiplyScalar(-1));const e={a:c,b:u,c:h,normal:new _t,materialIndex:0};Ii.getNormal(sn,an,on,e.normal),d.face=e}return d}class bn extends Ji{constructor(e=1,t=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],u=[];let h=0,d=0;function f(e,t,i,n,r,s,f,m,p,g,_){const y=s/p,v=f/g,b=s/2,x=f/2,w=m/2,S=p+1,M=g+1;let A=0,C=0;const T=new _t;for(let s=0;s0?1:-1,c.push(T.x,T.y,T.z),u.push(o/p),u.push(1-s/g),A+=1}}for(let e=0;e0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const i={};for(const e in this.extensions)!0===this.extensions[e]&&(i[e]=!0);return Object.keys(i).length>0&&(t.extensions=i),t}}class Cn extends yi{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new qt,this.projectionMatrix=new qt,this.projectionMatrixInverse=new qt,this.coordinateSystem=Ie}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}class Tn extends Cn{constructor(e=50,t=1,i=.1,n=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=2*Oe*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(.5*ke*this.fov);return.5*this.getFilmHeight()/e}getEffectiveFOV(){return 2*Oe*Math.atan(Math.tan(.5*ke*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,t,i,n,r,s){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(.5*ke*this.fov)/this.zoom,i=2*t,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const e=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/e,t-=s.offsetY*i/a,n*=s.width/e,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,t,t-i,e,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const Pn=-90;class En extends yi{constructor(e,t,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const n=new Tn(Pn,1,e,t);n.layers=this.layers,this.add(n);const r=new Tn(Pn,1,e,t);r.layers=this.layers,this.add(r);const s=new Tn(Pn,1,e,t);s.layers=this.layers,this.add(s);const a=new Tn(Pn,1,e,t);a.layers=this.layers,this.add(a);const o=new Tn(Pn,1,e,t);o.layers=this.layers,this.add(o);const l=new Tn(Pn,1,e,t);l.layers=this.layers,this.add(l)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[i,n,r,s,a,o]=t;for(const e of t)this.remove(e);if(e===Ie)i.up.set(0,1,0),i.lookAt(1,0,0),n.up.set(0,1,0),n.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),s.up.set(0,0,1),s.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(e!==De)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);i.up.set(0,-1,0),i.lookAt(-1,0,0),n.up.set(0,-1,0),n.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),s.up.set(0,0,-1),s.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const e of t)this.add(e),e.updateMatrixWorld()}update(e,t){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:n}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,s,a,o,l,c]=this.children,u=e.getRenderTarget(),h=e.getActiveCubeFace(),d=e.getActiveMipmapLevel(),f=e.xr.enabled;e.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,e.setRenderTarget(i,0,n),e.render(t,r),e.setRenderTarget(i,1,n),e.render(t,s),e.setRenderTarget(i,2,n),e.render(t,a),e.setRenderTarget(i,3,n),e.render(t,o),e.setRenderTarget(i,4,n),e.render(t,l),i.texture.generateMipmaps=m,e.setRenderTarget(i,5,n),e.render(t,c),e.setRenderTarget(u,h,d),e.xr.enabled=f,i.texture.needsPMREMUpdate=!0}}class In extends ut{constructor(e,t,i,n,r,s,a,o,l,c){super(e=void 0!==e?e:[],t=void 0!==t?t:k,i,n,r,s,a,o,l,c),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Dn extends ft{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const i={width:e,height:e,depth:1},n=[i,i,i,i,i,i];void 0!==t.encoding&&(Ke("THREE.WebGLCubeRenderTarget: option.encoding has been replaced by option.colorSpace."),t.colorSpace=t.encoding===oe?ce:le),this.texture=new In(n,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==t.generateMipmaps&&t.generateMipmaps,this.texture.minFilter=void 0!==t.minFilter?t.minFilter:G}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"varying vec3 vWorldDirection;vec3 transformDirection(in vec3 dir,in mat4 matrix){return normalize((matrix*vec4(dir,0.0)).xyz);}void main(){vWorldDirection=transformDirection(position,modelMatrix);\n#include \n#include \n}",fragmentShader:"uniform sampler2D tEquirect;varying vec3 vWorldDirection;\n#include \nvoid main(){vec3 direction=normalize(vWorldDirection);vec2 sampleUV=equirectUv(direction);gl_FragColor=texture2D(tEquirect,sampleUV);}"},n=new bn(5,5,5),r=new An({name:"CubemapFromEquirect",uniforms:xn(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:s,blending:0});r.uniforms.tEquirect.value=t;const a=new yn(n,r),o=t.minFilter;t.minFilter===j&&(t.minFilter=G);return new En(1,10,this).update(e,a),t.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(e,t,i,n){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,i,n);e.setRenderTarget(r)}}const Rn=new _t,Ln=new _t,kn=new He;class On{constructor(e=new _t(1,0,0),t=0){this.isPlane=!0,this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,i,n){return this.normal.set(e,t,i),this.constant=n,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,i){const n=Rn.subVectors(i,t).cross(Ln.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(n,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(e).addScaledVector(this.normal,-this.distanceToPoint(e))}intersectLine(e,t){const i=e.delta(Rn),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(e.start)?t.copy(e.start):null;const r=-(e.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:t.copy(e.start).addScaledVector(i,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),i=this.distanceToPoint(e.end);return t<0&&i>0||i<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const i=t||kn.getNormalMatrix(e),n=this.coplanarPoint(Rn).applyMatrix4(e),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const Nn=new Bt,Fn=new _t;class Bn{constructor(e=new On,t=new On,i=new On,n=new On,r=new On,s=new On){this.planes=[e,t,i,n,r,s]}set(e,t,i,n,r,s){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(e){const t=this.planes;for(let i=0;i<6;i++)t[i].copy(e.planes[i]);return this}setFromProjectionMatrix(e,t=2e3){const i=this.planes,n=e.elements,r=n[0],s=n[1],a=n[2],o=n[3],l=n[4],c=n[5],u=n[6],h=n[7],d=n[8],f=n[9],m=n[10],p=n[11],g=n[12],_=n[13],y=n[14],v=n[15];if(i[0].setComponents(o-r,h-l,p-d,v-g).normalize(),i[1].setComponents(o+r,h+l,p+d,v+g).normalize(),i[2].setComponents(o+s,h+c,p+f,v+_).normalize(),i[3].setComponents(o-s,h-c,p-f,v-_).normalize(),i[4].setComponents(o-a,h-u,p-m,v-y).normalize(),t===Ie)i[5].setComponents(o+a,h+u,p+m,v+y).normalize();else{if(t!==De)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);i[5].setComponents(a,u,m,y).normalize()}return this}intersectsObject(e){if(void 0!==e.boundingSphere)null===e.boundingSphere&&e.computeBoundingSphere(),Nn.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;null===t.boundingSphere&&t.computeBoundingSphere(),Nn.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(Nn)}intersectsSprite(e){return Nn.center.set(0,0,0),Nn.radius=.7071067811865476,Nn.applyMatrix4(e.matrixWorld),this.intersectsSphere(Nn)}intersectsSphere(e){const t=this.planes,i=e.center,n=-e.radius;for(let e=0;e<6;e++){if(t[e].distanceToPoint(i)0?e.max.x:e.min.x,Fn.y=n.normal.y>0?e.max.y:e.min.y,Fn.z=n.normal.z>0?e.max.z:e.min.z,n.distanceToPoint(Fn)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let i=0;i<6;i++)if(t[i].distanceToPoint(e)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function zn(){let e=null,t=!1,i=null,n=null;function r(t,s){i(t,s),n=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==i&&(n=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(n),t=!1},setAnimationLoop:function(e){i=e},setContext:function(t){e=t}}}function Un(e,t){const i=t.isWebGL2,n=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),n.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);const i=n.get(t);i&&(e.deleteBuffer(i.buffer),n.delete(t))},update:function(t,r){if(t.isGLBufferAttribute){const e=n.get(t);return void((!e||e.version0\nvec4 plane;\n#pragma unroll_loop_start\nfor(int i=0;iplane.w)discard;}\n#pragma unroll_loop_end\n#if UNION_CLIPPING_PLANESplane.w)&&clipped;}\n#pragma unroll_loop_end\nif(clipped)discard;\n#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES>0\nvarying vec3 vClipPosition;uniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES>0\nvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES>0\nvClipPosition=-mvPosition.xyz;\n#endif",color_fragment:"#if defined(USE_COLOR_ALPHA)\ndiffuseColor*=vColor;\n#elif defined(USE_COLOR)\ndiffuseColor.rgb*=vColor;\n#endif",color_pars_fragment:"#if defined(USE_COLOR_ALPHA)\nvarying vec4 vColor;\n#elif defined(USE_COLOR)\nvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined(USE_COLOR_ALPHA)\nvarying vec4 vColor;\n#elif defined(USE_COLOR)||defined(USE_INSTANCING_COLOR)\nvarying vec3 vColor;\n#endif",color_vertex:"#if defined(USE_COLOR_ALPHA)\nvColor=vec4(1.0);\n#elif defined(USE_COLOR)||defined(USE_INSTANCING_COLOR)\nvColor=vec3(1.0);\n#endif\n#ifdef USE_COLOR\nvColor*=color;\n#endif\n#ifdef USE_INSTANCING_COLOR\nvColor.xyz*=instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a)clamp(a,0.0,1.0)\n#endif\n#define whiteComplement(a)(1.0-saturate(a))\nfloat pow2(const in float x){return x*x;}vec3 pow2(const in vec3 x){return x*x;}float pow3(const in float x){return x*x*x;}float pow4(const in float x){float x2=x*x;return x2*x2;}float max3(const in vec3 v){return max(max(v.x,v.y),v.z);}float average(const in vec3 v){return dot(v,vec3(0.3333333));}highp float rand(const in vec2 uv){const highp float a=12.9898,b=78.233,c=43758.5453;highp float dt=dot(uv.xy,vec2(a,b)),sn=mod(dt,PI);return fract(sin(sn)*c);}\n#ifdef HIGH_PRECISION\nfloat precisionSafeLength(vec3 v){return length(v);}\n#else\nfloat precisionSafeLength(vec3 v){float maxComponent=max3(abs(v));return length(v/maxComponent)*maxComponent;}\n#endif\nstruct IncidentLight{vec3 color;vec3 direction;bool visible;};struct ReflectedLight{vec3 directDiffuse;vec3 directSpecular;vec3 indirectDiffuse;vec3 indirectSpecular;};\n#ifdef USE_ALPHAHASH\nvarying vec3 vPosition;\n#endif\nvec3 transformDirection(in vec3 dir,in mat4 matrix){return normalize((matrix*vec4(dir,0.0)).xyz);}vec3 inverseTransformDirection(in vec3 dir,in mat4 matrix){return normalize((vec4(dir,0.0)*matrix).xyz);}mat3 transposeMat3(const in mat3 m){mat3 tmp;tmp[0]=vec3(m[0].x,m[1].x,m[2].x);tmp[1]=vec3(m[0].y,m[1].y,m[2].y);tmp[2]=vec3(m[0].z,m[1].z,m[2].z);return tmp;}float luminance(const in vec3 rgb){const vec3 weights=vec3(0.2126729,0.7151522,0.0721750);return dot(weights,rgb);}bool isPerspectiveMatrix(mat4 m){return m[2][3]==-1.0;}vec2 equirectUv(in vec3 dir){float u=atan(dir.z,dir.x)*RECIPROCAL_PI2+0.5;float v=asin(clamp(dir.y,-1.0,1.0))*RECIPROCAL_PI+0.5;return vec2(u,v);}vec3 BRDF_Lambert(const in vec3 diffuseColor){return RECIPROCAL_PI*diffuseColor;}vec3 F_Schlick(const in vec3 f0,const in float f90,const in float dotVH){float fresnel=exp2((-5.55473*dotVH-6.98316)*dotVH);return f0*(1.0-fresnel)+(f90*fresnel);}float F_Schlick(const in float f0,const in float f90,const in float dotVH){float fresnel=exp2((-5.55473*dotVH-6.98316)*dotVH);return f0*(1.0-fresnel)+(f90*fresnel);}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_minMipLevel 4.0\n#define cubeUV_minTileSize 16.0\nfloat getFace(vec3 direction){vec3 absDirection=abs(direction);float face=-1.0;if(absDirection.x>absDirection.z){if(absDirection.x>absDirection.y)face=direction.x>0.0?0.0:3.0;else face=direction.y>0.0?1.0:4.0;}else{if(absDirection.z>absDirection.y)face=direction.z>0.0?2.0:5.0;else face=direction.y>0.0?1.0:4.0;}return face;}vec2 getUV(vec3 direction,float face){vec2 uv;if(face==0.0){uv=vec2(direction.z,direction.y)/abs(direction.x);}else if(face==1.0){uv=vec2(-direction.x,-direction.z)/abs(direction.y);}else if(face==2.0){uv=vec2(-direction.x,direction.y)/abs(direction.z);}else if(face==3.0){uv=vec2(-direction.z,direction.y)/abs(direction.x);}else if(face==4.0){uv=vec2(-direction.x,direction.z)/abs(direction.y);}else{uv=vec2(direction.x,direction.y)/abs(direction.z);}return 0.5*(uv+1.0);}vec3 bilinearCubeUV(sampler2D envMap,vec3 direction,float mipInt){float face=getFace(direction);float filterInt=max(cubeUV_minMipLevel-mipInt,0.0);mipInt=max(mipInt,cubeUV_minMipLevel);float faceSize=exp2(mipInt);highp vec2 uv=getUV(direction,face)*(faceSize-2.0)+1.0;if(face>2.0){uv.y+=faceSize;face-=3.0;}uv.x+=face*faceSize;uv.x+=filterInt*3.0*cubeUV_minTileSize;uv.y+=4.0*(exp2(CUBEUV_MAX_MIP)-faceSize);uv.x*=CUBEUV_TEXEL_WIDTH;uv.y*=CUBEUV_TEXEL_HEIGHT;\n#ifdef texture2DGradEXT\nreturn texture2DGradEXT(envMap,uv,vec2(0.0),vec2(0.0)).rgb;\n#else\nreturn texture2D(envMap,uv).rgb;\n#endif\n}\n#define cubeUV_r0 1.0\n#define cubeUV_v0 0.339\n#define cubeUV_m0-2.0\n#define cubeUV_r1 0.8\n#define cubeUV_v1 0.276\n#define cubeUV_m1-1.0\n#define cubeUV_r4 0.4\n#define cubeUV_v4 0.046\n#define cubeUV_m4 2.0\n#define cubeUV_r5 0.305\n#define cubeUV_v5 0.016\n#define cubeUV_m5 3.0\n#define cubeUV_r6 0.21\n#define cubeUV_v6 0.0038\n#define cubeUV_m6 4.0\nfloat roughnessToMip(float roughness){float mip=0.0;if(roughness>=cubeUV_r1){mip=(cubeUV_r0-roughness)*(cubeUV_m1-cubeUV_m0)/(cubeUV_r0-cubeUV_r1)+cubeUV_m0;}else if(roughness>=cubeUV_r4){mip=(cubeUV_r1-roughness)*(cubeUV_m4-cubeUV_m1)/(cubeUV_r1-cubeUV_r4)+cubeUV_m1;}else if(roughness>=cubeUV_r5){mip=(cubeUV_r4-roughness)*(cubeUV_m5-cubeUV_m4)/(cubeUV_r4-cubeUV_r5)+cubeUV_m4;}else if(roughness>=cubeUV_r6){mip=(cubeUV_r5-roughness)*(cubeUV_m6-cubeUV_m5)/(cubeUV_r5-cubeUV_r6)+cubeUV_m5;}else{mip=-2.0*log2(1.16*roughness);}return mip;}vec4 textureCubeUV(sampler2D envMap,vec3 sampleDir,float roughness){float mip=clamp(roughnessToMip(roughness),cubeUV_m0,CUBEUV_MAX_MIP);float mipF=fract(mip);float mipInt=floor(mip);vec3 color0=bilinearCubeUV(envMap,sampleDir,mipInt);if(mipF==0.0){return vec4(color0,1.0);}else{vec3 color1=bilinearCubeUV(envMap,sampleDir,mipInt+1.0);return vec4(mix(color0,color1,mipF),1.0);}}\n#endif",defaultnormal_vertex:"vec3 transformedNormal=objectNormal;\n#ifdef USE_INSTANCING\nmat3 m=mat3(instanceMatrix);transformedNormal/=vec3(dot(m[0],m[0]),dot(m[1],m[1]),dot(m[2],m[2]));transformedNormal=m*transformedNormal;\n#endif\ntransformedNormal=normalMatrix*transformedNormal;\n#ifdef FLIP_SIDED\ntransformedNormal=-transformedNormal;\n#endif\n#ifdef USE_TANGENT\nvec3 transformedTangent=(modelViewMatrix*vec4(objectTangent,0.0)).xyz;\n#ifdef FLIP_SIDED\ntransformedTangent=-transformedTangent;\n#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\nuniform sampler2D displacementMap;uniform float displacementScale;uniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\ntransformed+=normalize(objectNormal)*(texture2D(displacementMap,vDisplacementMapUv).x*displacementScale+displacementBias);\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\nvec4 emissiveColor=texture2D(emissiveMap,vEmissiveMapUv);totalEmissiveRadiance*=emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\nuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor=linearToOutputTexel(gl_FragColor);",colorspace_pars_fragment:"const mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3=mat3(vec3(0.8224621,0.177538,0.0),vec3(0.0331941,0.9668058,0.0),vec3(0.0170827,0.0723974,0.9105199));const mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB=mat3(vec3(1.2249401,-0.2249404,0.0),vec3(-0.0420569,1.0420571,0.0),vec3(-0.0196376,-0.0786361,1.0982735));vec4 LinearSRGBToLinearDisplayP3(in vec4 value){return vec4(value.rgb*LINEAR_SRGB_TO_LINEAR_DISPLAY_P3,value.a);}vec4 LinearDisplayP3ToLinearSRGB(in vec4 value){return vec4(value.rgb*LINEAR_DISPLAY_P3_TO_LINEAR_SRGB,value.a);}vec4 LinearTransferOETF(in vec4 value){return value;}vec4 sRGBTransferOETF(in vec4 value){return vec4(mix(pow(value.rgb,vec3(0.41666))*1.055-vec3(0.055),value.rgb*12.92,vec3(lessThanEqual(value.rgb,vec3(0.0031308)))),value.a);}vec4 LinearToLinear(in vec4 value){return value;}vec4 LinearTosRGB(in vec4 value){return sRGBTransferOETF(value);}",envmap_fragment:"#ifdef USE_ENVMAP\n#ifdef ENV_WORLDPOS\nvec3 cameraToFrag;if(isOrthographic){cameraToFrag=normalize(vec3(-viewMatrix[0][2],-viewMatrix[1][2],-viewMatrix[2][2]));}else{cameraToFrag=normalize(vWorldPosition-cameraPosition);}vec3 worldNormal=inverseTransformDirection(normal,viewMatrix);\n#ifdef ENVMAP_MODE_REFLECTION\nvec3 reflectVec=reflect(cameraToFrag,worldNormal);\n#else\nvec3 reflectVec=refract(cameraToFrag,worldNormal,refractionRatio);\n#endif\n#else\nvec3 reflectVec=vReflect;\n#endif\n#ifdef ENVMAP_TYPE_CUBE\nvec4 envColor=textureCube(envMap,vec3(flipEnvMap*reflectVec.x,reflectVec.yz));\n#else\nvec4 envColor=vec4(0.0);\n#endif\n#ifdef ENVMAP_BLENDING_MULTIPLY\noutgoingLight=mix(outgoingLight,outgoingLight*envColor.xyz,specularStrength*reflectivity);\n#elif defined(ENVMAP_BLENDING_MIX)\noutgoingLight=mix(outgoingLight,envColor.xyz,specularStrength*reflectivity);\n#elif defined(ENVMAP_BLENDING_ADD)\noutgoingLight+=envColor.xyz*specularStrength*reflectivity;\n#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\nuniform float envMapIntensity;uniform float flipEnvMap;\n#ifdef ENVMAP_TYPE_CUBE\nuniform samplerCube envMap;\n#else\nuniform sampler2D envMap;\n#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\nuniform float reflectivity;\n#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)||defined(LAMBERT)\n#define ENV_WORLDPOS\n#endif\n#ifdef ENV_WORLDPOS\nvarying vec3 vWorldPosition;uniform float refractionRatio;\n#else\nvarying vec3 vReflect;\n#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n#if defined(USE_BUMPMAP)||defined(USE_NORMALMAP)||defined(PHONG)||defined(LAMBERT)\n#define ENV_WORLDPOS\n#endif\n#ifdef ENV_WORLDPOS\nvarying vec3 vWorldPosition;\n#else\nvarying vec3 vReflect;uniform float refractionRatio;\n#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\nvec3 getIBLIrradiance(const in vec3 normal){\n#ifdef ENVMAP_TYPE_CUBE_UV\nvec3 worldNormal=inverseTransformDirection(normal,viewMatrix);vec4 envMapColor=textureCubeUV(envMap,worldNormal,1.0);return PI*envMapColor.rgb*envMapIntensity;\n#else\nreturn vec3(0.0);\n#endif\n}vec3 getIBLRadiance(const in vec3 viewDir,const in vec3 normal,const in float roughness){\n#ifdef ENVMAP_TYPE_CUBE_UV\nvec3 reflectVec=reflect(-viewDir,normal);reflectVec=normalize(mix(reflectVec,normal,roughness*roughness));reflectVec=inverseTransformDirection(reflectVec,viewMatrix);vec4 envMapColor=textureCubeUV(envMap,reflectVec,roughness);return envMapColor.rgb*envMapIntensity;\n#else\nreturn vec3(0.0);\n#endif\n}\n#ifdef USE_ANISOTROPY\nvec3 getIBLAnisotropyRadiance(const in vec3 viewDir,const in vec3 normal,const in float roughness,const in vec3 bitangent,const in float anisotropy){\n#ifdef ENVMAP_TYPE_CUBE_UV\nvec3 bentNormal=cross(bitangent,viewDir);bentNormal=normalize(cross(bentNormal,bitangent));bentNormal=normalize(mix(bentNormal,normal,pow2(pow2(1.0-anisotropy*(1.0-roughness)))));return getIBLRadiance(viewDir,bentNormal,roughness);\n#else\nreturn vec3(0.0);\n#endif\n}\n#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n#ifdef ENV_WORLDPOS\nvWorldPosition=worldPosition.xyz;\n#else\nvec3 cameraToVertex;if(isOrthographic){cameraToVertex=normalize(vec3(-viewMatrix[0][2],-viewMatrix[1][2],-viewMatrix[2][2]));}else{cameraToVertex=normalize(worldPosition.xyz-cameraPosition);}vec3 worldNormal=inverseTransformDirection(transformedNormal,viewMatrix);\n#ifdef ENVMAP_MODE_REFLECTION\nvReflect=reflect(cameraToVertex,worldNormal);\n#else\nvReflect=refract(cameraToVertex,worldNormal,refractionRatio);\n#endif\n#endif\n#endif",fog_vertex:"#ifdef USE_FOG\nvFogDepth=-mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\nvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n#ifdef FOG_EXP2\nfloat fogFactor=1.0-exp(-fogDensity*fogDensity*vFogDepth*vFogDepth);\n#else\nfloat fogFactor=smoothstep(fogNear,fogFar,vFogDepth);\n#endif\ngl_FragColor.rgb=mix(gl_FragColor.rgb,fogColor,fogFactor);\n#endif",fog_pars_fragment:"#ifdef USE_FOG\nuniform vec3 fogColor;varying float vFogDepth;\n#ifdef FOG_EXP2\nuniform float fogDensity;\n#else\nuniform float fogNear;uniform float fogFar;\n#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\nuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance(vec3 normal,vec3 lightDirection){float dotNL=dot(normal,lightDirection);vec2 coord=vec2(dotNL*0.5+0.5,0.0);\n#ifdef USE_GRADIENTMAP\nreturn vec3(texture2D(gradientMap,coord).r);\n#else\nvec2 fw=fwidth(coord)*0.5;return mix(vec3(0.7),vec3(1.0),smoothstep(0.7-fw.x,0.7+fw.x,coord.x));\n#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\nvec4 lightMapTexel=texture2D(lightMap,vLightMapUv);vec3 lightMapIrradiance=lightMapTexel.rgb*lightMapIntensity;reflectedLight.indirectDiffuse+=lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\nuniform sampler2D lightMap;uniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;material.diffuseColor=diffuseColor.rgb;material.specularStrength=specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;struct LambertMaterial{vec3 diffuseColor;float specularStrength;};void RE_Direct_Lambert(const in IncidentLight directLight,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in LambertMaterial material,inout ReflectedLight reflectedLight){float dotNL=saturate(dot(geometryNormal,directLight.direction));vec3 irradiance=dotNL*directLight.color;reflectedLight.directDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}void RE_IndirectDiffuse_Lambert(const in vec3 irradiance,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in LambertMaterial material,inout ReflectedLight reflectedLight){reflectedLight.indirectDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}\n#define RE_Direct RE_Direct_Lambert\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;uniform vec3 ambientLightColor;\n#if defined(USE_LIGHT_PROBES)\nuniform vec3 lightProbe[9];\n#endif\nvec3 shGetIrradianceAt(in vec3 normal,in vec3 shCoefficients[9]){float x=normal.x,y=normal.y,z=normal.z;vec3 result=shCoefficients[0]*0.886227;result+=shCoefficients[1]*2.0*0.511664*y;result+=shCoefficients[2]*2.0*0.511664*z;result+=shCoefficients[3]*2.0*0.511664*x;result+=shCoefficients[4]*2.0*0.429043*x*y;result+=shCoefficients[5]*2.0*0.429043*y*z;result+=shCoefficients[6]*(0.743125*z*z-0.247708);result+=shCoefficients[7]*2.0*0.429043*x*z;result+=shCoefficients[8]*0.429043*(x*x-y*y);return result;}vec3 getLightProbeIrradiance(const in vec3 lightProbe[9],const in vec3 normal){vec3 worldNormal=inverseTransformDirection(normal,viewMatrix);vec3 irradiance=shGetIrradianceAt(worldNormal,lightProbe);return irradiance;}vec3 getAmbientLightIrradiance(const in vec3 ambientLightColor){vec3 irradiance=ambientLightColor;return irradiance;}float getDistanceAttenuation(const in float lightDistance,const in float cutoffDistance,const in float decayExponent){\n#if defined(LEGACY_LIGHTS)\nif(cutoffDistance>0.0&&decayExponent>0.0){return pow(saturate(-lightDistance/cutoffDistance+1.0),decayExponent);}return 1.0;\n#else\nfloat distanceFalloff=1.0/max(pow(lightDistance,decayExponent),0.01);if(cutoffDistance>0.0){distanceFalloff*=pow2(saturate(1.0-pow4(lightDistance/cutoffDistance)));}return distanceFalloff;\n#endif\n}float getSpotAttenuation(const in float coneCosine,const in float penumbraCosine,const in float angleCosine){return smoothstep(coneCosine,penumbraCosine,angleCosine);}\n#if NUM_DIR_LIGHTS>0\nstruct DirectionalLight{vec3 direction;vec3 color;};uniform DirectionalLight directionalLights[NUM_DIR_LIGHTS];void getDirectionalLightInfo(const in DirectionalLight directionalLight,out IncidentLight light){light.color=directionalLight.color;light.direction=directionalLight.direction;light.visible=true;}\n#endif\n#if NUM_POINT_LIGHTS>0\nstruct PointLight{vec3 position;vec3 color;float distance;float decay;};uniform PointLight pointLights[NUM_POINT_LIGHTS];void getPointLightInfo(const in PointLight pointLight,const in vec3 geometryPosition,out IncidentLight light){vec3 lVector=pointLight.position-geometryPosition;light.direction=normalize(lVector);float lightDistance=length(lVector);light.color=pointLight.color;light.color*=getDistanceAttenuation(lightDistance,pointLight.distance,pointLight.decay);light.visible=(light.color!=vec3(0.0));}\n#endif\n#if NUM_SPOT_LIGHTS>0\nstruct SpotLight{vec3 position;vec3 direction;vec3 color;float distance;float decay;float coneCos;float penumbraCos;};uniform SpotLight spotLights[NUM_SPOT_LIGHTS];void getSpotLightInfo(const in SpotLight spotLight,const in vec3 geometryPosition,out IncidentLight light){vec3 lVector=spotLight.position-geometryPosition;light.direction=normalize(lVector);float angleCos=dot(light.direction,spotLight.direction);float spotAttenuation=getSpotAttenuation(spotLight.coneCos,spotLight.penumbraCos,angleCos);if(spotAttenuation>0.0){float lightDistance=length(lVector);light.color=spotLight.color*spotAttenuation;light.color*=getDistanceAttenuation(lightDistance,spotLight.distance,spotLight.decay);light.visible=(light.color!=vec3(0.0));}else{light.color=vec3(0.0);light.visible=false;}}\n#endif\n#if NUM_RECT_AREA_LIGHTS>0\nstruct RectAreaLight{vec3 color;vec3 position;vec3 halfWidth;vec3 halfHeight;};uniform sampler2D ltc_1;uniform sampler2D ltc_2;uniform RectAreaLight rectAreaLights[NUM_RECT_AREA_LIGHTS];\n#endif\n#if NUM_HEMI_LIGHTS>0\nstruct HemisphereLight{vec3 direction;vec3 skyColor;vec3 groundColor;};uniform HemisphereLight hemisphereLights[NUM_HEMI_LIGHTS];vec3 getHemisphereLightIrradiance(const in HemisphereLight hemiLight,const in vec3 normal){float dotNL=dot(normal,hemiLight.direction);float hemiDiffuseWeight=0.5*dotNL+0.5;vec3 irradiance=mix(hemiLight.groundColor,hemiLight.skyColor,hemiDiffuseWeight);return irradiance;}\n#endif",lights_toon_fragment:"ToonMaterial material;material.diffuseColor=diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;struct ToonMaterial{vec3 diffuseColor;};void RE_Direct_Toon(const in IncidentLight directLight,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in ToonMaterial material,inout ReflectedLight reflectedLight){vec3 irradiance=getGradientIrradiance(geometryNormal,directLight.direction)*directLight.color;reflectedLight.directDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}void RE_IndirectDiffuse_Toon(const in vec3 irradiance,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in ToonMaterial material,inout ReflectedLight reflectedLight){reflectedLight.indirectDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}\n#define RE_Direct RE_Direct_Toon\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;material.diffuseColor=diffuseColor.rgb;material.specularColor=specular;material.specularShininess=shininess;material.specularStrength=specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;struct BlinnPhongMaterial{vec3 diffuseColor;vec3 specularColor;float specularShininess;float specularStrength;};void RE_Direct_BlinnPhong(const in IncidentLight directLight,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in BlinnPhongMaterial material,inout ReflectedLight reflectedLight){float dotNL=saturate(dot(geometryNormal,directLight.direction));vec3 irradiance=dotNL*directLight.color;reflectedLight.directDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);reflectedLight.directSpecular+=irradiance*BRDF_BlinnPhong(directLight.direction,geometryViewDir,geometryNormal,material.specularColor,material.specularShininess)*material.specularStrength;}void RE_IndirectDiffuse_BlinnPhong(const in vec3 irradiance,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in BlinnPhongMaterial material,inout ReflectedLight reflectedLight){reflectedLight.indirectDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}\n#define RE_Direct RE_Direct_BlinnPhong\n#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;material.diffuseColor=diffuseColor.rgb*(1.0-metalnessFactor);vec3 dxy=max(abs(dFdx(nonPerturbedNormal)),abs(dFdy(nonPerturbedNormal)));float geometryRoughness=max(max(dxy.x,dxy.y),dxy.z);material.roughness=max(roughnessFactor,0.0525);material.roughness+=geometryRoughness;material.roughness=min(material.roughness,1.0);\n#ifdef IOR\nmaterial.ior=ior;\n#ifdef USE_SPECULAR\nfloat specularIntensityFactor=specularIntensity;vec3 specularColorFactor=specularColor;\n#ifdef USE_SPECULAR_COLORMAP\nspecularColorFactor*=texture2D(specularColorMap,vSpecularColorMapUv).rgb;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\nspecularIntensityFactor*=texture2D(specularIntensityMap,vSpecularIntensityMapUv).a;\n#endif\nmaterial.specularF90=mix(specularIntensityFactor,1.0,metalnessFactor);\n#else\nfloat specularIntensityFactor=1.0;vec3 specularColorFactor=vec3(1.0);material.specularF90=1.0;\n#endif\nmaterial.specularColor=mix(min(pow2((material.ior-1.0)/(material.ior+1.0))*specularColorFactor,vec3(1.0))*specularIntensityFactor,diffuseColor.rgb,metalnessFactor);\n#else\nmaterial.specularColor=mix(vec3(0.04),diffuseColor.rgb,metalnessFactor);material.specularF90=1.0;\n#endif\n#ifdef USE_CLEARCOAT\nmaterial.clearcoat=clearcoat;material.clearcoatRoughness=clearcoatRoughness;material.clearcoatF0=vec3(0.04);material.clearcoatF90=1.0;\n#ifdef USE_CLEARCOATMAP\nmaterial.clearcoat*=texture2D(clearcoatMap,vClearcoatMapUv).x;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\nmaterial.clearcoatRoughness*=texture2D(clearcoatRoughnessMap,vClearcoatRoughnessMapUv).y;\n#endif\nmaterial.clearcoat=saturate(material.clearcoat);material.clearcoatRoughness=max(material.clearcoatRoughness,0.0525);material.clearcoatRoughness+=geometryRoughness;material.clearcoatRoughness=min(material.clearcoatRoughness,1.0);\n#endif\n#ifdef USE_IRIDESCENCE\nmaterial.iridescence=iridescence;material.iridescenceIOR=iridescenceIOR;\n#ifdef USE_IRIDESCENCEMAP\nmaterial.iridescence*=texture2D(iridescenceMap,vIridescenceMapUv).r;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\nmaterial.iridescenceThickness=(iridescenceThicknessMaximum-iridescenceThicknessMinimum)*texture2D(iridescenceThicknessMap,vIridescenceThicknessMapUv).g+iridescenceThicknessMinimum;\n#else\nmaterial.iridescenceThickness=iridescenceThicknessMaximum;\n#endif\n#endif\n#ifdef USE_SHEEN\nmaterial.sheenColor=sheenColor;\n#ifdef USE_SHEEN_COLORMAP\nmaterial.sheenColor*=texture2D(sheenColorMap,vSheenColorMapUv).rgb;\n#endif\nmaterial.sheenRoughness=clamp(sheenRoughness,0.07,1.0);\n#ifdef USE_SHEEN_ROUGHNESSMAP\nmaterial.sheenRoughness*=texture2D(sheenRoughnessMap,vSheenRoughnessMapUv).a;\n#endif\n#endif\n#ifdef USE_ANISOTROPY\n#ifdef USE_ANISOTROPYMAP\nmat2 anisotropyMat=mat2(anisotropyVector.x,anisotropyVector.y,-anisotropyVector.y,anisotropyVector.x);vec3 anisotropyPolar=texture2D(anisotropyMap,vAnisotropyMapUv).rgb;vec2 anisotropyV=anisotropyMat*normalize(2.0*anisotropyPolar.rg-vec2(1.0))*anisotropyPolar.b;\n#else\nvec2 anisotropyV=anisotropyVector;\n#endif\nmaterial.anisotropy=length(anisotropyV);anisotropyV/=material.anisotropy;material.anisotropy=saturate(material.anisotropy);material.alphaT=mix(pow2(material.roughness),1.0,pow2(material.anisotropy));material.anisotropyT=tbn[0]*anisotropyV.x-tbn[1]*anisotropyV.y;material.anisotropyB=tbn[1]*anisotropyV.x+tbn[0]*anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial{vec3 diffuseColor;float roughness;vec3 specularColor;float specularF90;\n#ifdef USE_CLEARCOAT\nfloat clearcoat;float clearcoatRoughness;vec3 clearcoatF0;float clearcoatF90;\n#endif\n#ifdef USE_IRIDESCENCE\nfloat iridescence;float iridescenceIOR;float iridescenceThickness;vec3 iridescenceFresnel;vec3 iridescenceF0;\n#endif\n#ifdef USE_SHEEN\nvec3 sheenColor;float sheenRoughness;\n#endif\n#ifdef IOR\nfloat ior;\n#endif\n#ifdef USE_TRANSMISSION\nfloat transmission;float transmissionAlpha;float thickness;float attenuationDistance;vec3 attenuationColor;\n#endif\n#ifdef USE_ANISOTROPY\nfloat anisotropy;float alphaT;vec3 anisotropyT;vec3 anisotropyB;\n#endif\n};vec3 clearcoatSpecularDirect=vec3(0.0);vec3 clearcoatSpecularIndirect=vec3(0.0);vec3 sheenSpecularDirect=vec3(0.0);vec3 sheenSpecularIndirect=vec3(0.0);vec3 Schlick_to_F0(const in vec3 f,const in float f90,const in float dotVH){float x=clamp(1.0-dotVH,0.0,1.0);float x2=x*x;float x5=clamp(x*x2*x2,0.0,0.9999);return(f-vec3(f90)*x5)/(1.0-x5);}float V_GGX_SmithCorrelated(const in float alpha,const in float dotNL,const in float dotNV){float a2=pow2(alpha);float gv=dotNL*sqrt(a2+(1.0-a2)*pow2(dotNV));float gl=dotNV*sqrt(a2+(1.0-a2)*pow2(dotNL));return 0.5/max(gv+gl,EPSILON);}float D_GGX(const in float alpha,const in float dotNH){float a2=pow2(alpha);float denom=pow2(dotNH)*(a2-1.0)+1.0;return RECIPROCAL_PI*a2/pow2(denom);}\n#ifdef USE_ANISOTROPY\nfloat V_GGX_SmithCorrelated_Anisotropic(const in float alphaT,const in float alphaB,const in float dotTV,const in float dotBV,const in float dotTL,const in float dotBL,const in float dotNV,const in float dotNL){float gv=dotNL*length(vec3(alphaT*dotTV,alphaB*dotBV,dotNV));float gl=dotNV*length(vec3(alphaT*dotTL,alphaB*dotBL,dotNL));float v=0.5/(gv+gl);return saturate(v);}float D_GGX_Anisotropic(const in float alphaT,const in float alphaB,const in float dotNH,const in float dotTH,const in float dotBH){float a2=alphaT*alphaB;highp vec3 v=vec3(alphaB*dotTH,alphaT*dotBH,a2*dotNH);highp float v2=dot(v,v);float w2=a2/v2;return RECIPROCAL_PI*a2*pow2(w2);}\n#endif\n#ifdef USE_CLEARCOAT\nvec3 BRDF_GGX_Clearcoat(const in vec3 lightDir,const in vec3 viewDir,const in vec3 normal,const in PhysicalMaterial material){vec3 f0=material.clearcoatF0;float f90=material.clearcoatF90;float roughness=material.clearcoatRoughness;float alpha=pow2(roughness);vec3 halfDir=normalize(lightDir+viewDir);float dotNL=saturate(dot(normal,lightDir));float dotNV=saturate(dot(normal,viewDir));float dotNH=saturate(dot(normal,halfDir));float dotVH=saturate(dot(viewDir,halfDir));vec3 F=F_Schlick(f0,f90,dotVH);float V=V_GGX_SmithCorrelated(alpha,dotNL,dotNV);float D=D_GGX(alpha,dotNH);return F*(V*D);}\n#endif\nvec3 BRDF_GGX(const in vec3 lightDir,const in vec3 viewDir,const in vec3 normal,const in PhysicalMaterial material){vec3 f0=material.specularColor;float f90=material.specularF90;float roughness=material.roughness;float alpha=pow2(roughness);vec3 halfDir=normalize(lightDir+viewDir);float dotNL=saturate(dot(normal,lightDir));float dotNV=saturate(dot(normal,viewDir));float dotNH=saturate(dot(normal,halfDir));float dotVH=saturate(dot(viewDir,halfDir));vec3 F=F_Schlick(f0,f90,dotVH);\n#ifdef USE_IRIDESCENCE\nF=mix(F,material.iridescenceFresnel,material.iridescence);\n#endif\n#ifdef USE_ANISOTROPY\nfloat dotTL=dot(material.anisotropyT,lightDir);float dotTV=dot(material.anisotropyT,viewDir);float dotTH=dot(material.anisotropyT,halfDir);float dotBL=dot(material.anisotropyB,lightDir);float dotBV=dot(material.anisotropyB,viewDir);float dotBH=dot(material.anisotropyB,halfDir);float V=V_GGX_SmithCorrelated_Anisotropic(material.alphaT,alpha,dotTV,dotBV,dotTL,dotBL,dotNV,dotNL);float D=D_GGX_Anisotropic(material.alphaT,alpha,dotNH,dotTH,dotBH);\n#else\nfloat V=V_GGX_SmithCorrelated(alpha,dotNL,dotNV);float D=D_GGX(alpha,dotNH);\n#endif\nreturn F*(V*D);}vec2 LTC_Uv(const in vec3 N,const in vec3 V,const in float roughness){const float LUT_SIZE=64.0;const float LUT_SCALE=(LUT_SIZE-1.0)/LUT_SIZE;const float LUT_BIAS=0.5/LUT_SIZE;float dotNV=saturate(dot(N,V));vec2 uv=vec2(roughness,sqrt(1.0-dotNV));uv=uv*LUT_SCALE+LUT_BIAS;return uv;}float LTC_ClippedSphereFormFactor(const in vec3 f){float l=length(f);return max((l*l+f.z)/(l+1.0),0.0);}vec3 LTC_EdgeVectorFormFactor(const in vec3 v1,const in vec3 v2){float x=dot(v1,v2);float y=abs(x);float a=0.8543985+(0.4965155+0.0145206*y)*y;float b=3.4175940+(4.1616724+y)*y;float v=a/b;float theta_sintheta=(x>0.0)?v:0.5*inversesqrt(max(1.0-x*x,1e-7))-v;return cross(v1,v2)*theta_sintheta;}vec3 LTC_Evaluate(const in vec3 N,const in vec3 V,const in vec3 P,const in mat3 mInv,const in vec3 rectCoords[4]){vec3 v1=rectCoords[1]-rectCoords[0];vec3 v2=rectCoords[3]-rectCoords[0];vec3 lightNormal=cross(v1,v2);if(dot(lightNormal,P-rectCoords[0])<0.0)return vec3(0.0);vec3 T1,T2;T1=normalize(V-N*dot(V,N));T2=-cross(N,T1);mat3 mat=mInv*transposeMat3(mat3(T1,T2,N));vec3 coords[4];coords[0]=mat*(rectCoords[0]-P);coords[1]=mat*(rectCoords[1]-P);coords[2]=mat*(rectCoords[2]-P);coords[3]=mat*(rectCoords[3]-P);coords[0]=normalize(coords[0]);coords[1]=normalize(coords[1]);coords[2]=normalize(coords[2]);coords[3]=normalize(coords[3]);vec3 vectorFormFactor=vec3(0.0);vectorFormFactor+=LTC_EdgeVectorFormFactor(coords[0],coords[1]);vectorFormFactor+=LTC_EdgeVectorFormFactor(coords[1],coords[2]);vectorFormFactor+=LTC_EdgeVectorFormFactor(coords[2],coords[3]);vectorFormFactor+=LTC_EdgeVectorFormFactor(coords[3],coords[0]);float result=LTC_ClippedSphereFormFactor(vectorFormFactor);return vec3(result);}\n#if defined(USE_SHEEN)\nfloat D_Charlie(float roughness,float dotNH){float alpha=pow2(roughness);float invAlpha=1.0/alpha;float cos2h=dotNH*dotNH;float sin2h=max(1.0-cos2h,0.0078125);return(2.0+invAlpha)*pow(sin2h,invAlpha*0.5)/(2.0*PI);}float V_Neubelt(float dotNV,float dotNL){return saturate(1.0/(4.0*(dotNL+dotNV-dotNL*dotNV)));}vec3 BRDF_Sheen(const in vec3 lightDir,const in vec3 viewDir,const in vec3 normal,vec3 sheenColor,const in float sheenRoughness){vec3 halfDir=normalize(lightDir+viewDir);float dotNL=saturate(dot(normal,lightDir));float dotNV=saturate(dot(normal,viewDir));float dotNH=saturate(dot(normal,halfDir));float D=D_Charlie(sheenRoughness,dotNH);float V=V_Neubelt(dotNV,dotNL);return sheenColor*(D*V);}\n#endif\nfloat IBLSheenBRDF(const in vec3 normal,const in vec3 viewDir,const in float roughness){float dotNV=saturate(dot(normal,viewDir));float r2=roughness*roughness;float a=roughness<0.25?-339.2*r2+161.4*roughness-25.9:-8.48*r2+14.3*roughness-9.95;float b=roughness<0.25?44.0*r2-23.7*roughness+3.26:1.97*r2-3.27*roughness+0.72;float DG=exp(a*dotNV+b)+(roughness<0.25?0.0:0.1*(roughness-0.25));return saturate(DG*RECIPROCAL_PI);}vec2 DFGApprox(const in vec3 normal,const in vec3 viewDir,const in float roughness){float dotNV=saturate(dot(normal,viewDir));const vec4 c0=vec4(-1,-0.0275,-0.572,0.022);const vec4 c1=vec4(1,0.0425,1.04,-0.04);vec4 r=roughness*c0+c1;float a004=min(r.x*r.x,exp2(-9.28*dotNV))*r.x+r.y;vec2 fab=vec2(-1.04,1.04)*a004+r.zw;return fab;}vec3 EnvironmentBRDF(const in vec3 normal,const in vec3 viewDir,const in vec3 specularColor,const in float specularF90,const in float roughness){vec2 fab=DFGApprox(normal,viewDir,roughness);return specularColor*fab.x+specularF90*fab.y;}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence(const in vec3 normal,const in vec3 viewDir,const in vec3 specularColor,const in float specularF90,const in float iridescence,const in vec3 iridescenceF0,const in float roughness,inout vec3 singleScatter,inout vec3 multiScatter){\n#else\nvoid computeMultiscattering(const in vec3 normal,const in vec3 viewDir,const in vec3 specularColor,const in float specularF90,const in float roughness,inout vec3 singleScatter,inout vec3 multiScatter){\n#endif\nvec2 fab=DFGApprox(normal,viewDir,roughness);\n#ifdef USE_IRIDESCENCE\nvec3 Fr=mix(specularColor,iridescenceF0,iridescence);\n#else\nvec3 Fr=specularColor;\n#endif\nvec3 FssEss=Fr*fab.x+specularF90*fab.y;float Ess=fab.x+fab.y;float Ems=1.0-Ess;vec3 Favg=Fr+(1.0-Fr)*0.047619;vec3 Fms=FssEss*Favg/(1.0-Ems*Favg);singleScatter+=FssEss;multiScatter+=Fms*Ems;}\n#if NUM_RECT_AREA_LIGHTS>0\nvoid RE_Direct_RectArea_Physical(const in RectAreaLight rectAreaLight,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in PhysicalMaterial material,inout ReflectedLight reflectedLight){vec3 normal=geometryNormal;vec3 viewDir=geometryViewDir;vec3 position=geometryPosition;vec3 lightPos=rectAreaLight.position;vec3 halfWidth=rectAreaLight.halfWidth;vec3 halfHeight=rectAreaLight.halfHeight;vec3 lightColor=rectAreaLight.color;float roughness=material.roughness;vec3 rectCoords[4];rectCoords[0]=lightPos+halfWidth-halfHeight;rectCoords[1]=lightPos-halfWidth-halfHeight;rectCoords[2]=lightPos-halfWidth+halfHeight;rectCoords[3]=lightPos+halfWidth+halfHeight;vec2 uv=LTC_Uv(normal,viewDir,roughness);vec4 t1=texture2D(ltc_1,uv);vec4 t2=texture2D(ltc_2,uv);mat3 mInv=mat3(vec3(t1.x,0,t1.y),vec3(0,1,0),vec3(t1.z,0,t1.w));vec3 fresnel=(material.specularColor*t2.x+(vec3(1.0)-material.specularColor)*t2.y);reflectedLight.directSpecular+=lightColor*fresnel*LTC_Evaluate(normal,viewDir,position,mInv,rectCoords);reflectedLight.directDiffuse+=lightColor*material.diffuseColor*LTC_Evaluate(normal,viewDir,position,mat3(1.0),rectCoords);}\n#endif\nvoid RE_Direct_Physical(const in IncidentLight directLight,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in PhysicalMaterial material,inout ReflectedLight reflectedLight){float dotNL=saturate(dot(geometryNormal,directLight.direction));vec3 irradiance=dotNL*directLight.color;\n#ifdef USE_CLEARCOAT\nfloat dotNLcc=saturate(dot(geometryClearcoatNormal,directLight.direction));vec3 ccIrradiance=dotNLcc*directLight.color;clearcoatSpecularDirect+=ccIrradiance*BRDF_GGX_Clearcoat(directLight.direction,geometryViewDir,geometryClearcoatNormal,material);\n#endif\n#ifdef USE_SHEEN\nsheenSpecularDirect+=irradiance*BRDF_Sheen(directLight.direction,geometryViewDir,geometryNormal,material.sheenColor,material.sheenRoughness);\n#endif\nreflectedLight.directSpecular+=irradiance*BRDF_GGX(directLight.direction,geometryViewDir,geometryNormal,material);reflectedLight.directDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}void RE_IndirectDiffuse_Physical(const in vec3 irradiance,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in PhysicalMaterial material,inout ReflectedLight reflectedLight){reflectedLight.indirectDiffuse+=irradiance*BRDF_Lambert(material.diffuseColor);}void RE_IndirectSpecular_Physical(const in vec3 radiance,const in vec3 irradiance,const in vec3 clearcoatRadiance,const in vec3 geometryPosition,const in vec3 geometryNormal,const in vec3 geometryViewDir,const in vec3 geometryClearcoatNormal,const in PhysicalMaterial material,inout ReflectedLight reflectedLight){\n#ifdef USE_CLEARCOAT\nclearcoatSpecularIndirect+=clearcoatRadiance*EnvironmentBRDF(geometryClearcoatNormal,geometryViewDir,material.clearcoatF0,material.clearcoatF90,material.clearcoatRoughness);\n#endif\n#ifdef USE_SHEEN\nsheenSpecularIndirect+=irradiance*material.sheenColor*IBLSheenBRDF(geometryNormal,geometryViewDir,material.sheenRoughness);\n#endif\nvec3 singleScattering=vec3(0.0);vec3 multiScattering=vec3(0.0);vec3 cosineWeightedIrradiance=irradiance*RECIPROCAL_PI;\n#ifdef USE_IRIDESCENCE\ncomputeMultiscatteringIridescence(geometryNormal,geometryViewDir,material.specularColor,material.specularF90,material.iridescence,material.iridescenceFresnel,material.roughness,singleScattering,multiScattering);\n#else\ncomputeMultiscattering(geometryNormal,geometryViewDir,material.specularColor,material.specularF90,material.roughness,singleScattering,multiScattering);\n#endif\nvec3 totalScattering=singleScattering+multiScattering;vec3 diffuse=material.diffuseColor*(1.0-max(max(totalScattering.r,totalScattering.g),totalScattering.b));reflectedLight.indirectSpecular+=radiance*singleScattering;reflectedLight.indirectSpecular+=multiScattering*cosineWeightedIrradiance;reflectedLight.indirectDiffuse+=diffuse*cosineWeightedIrradiance;}\n#define RE_Direct RE_Direct_Physical\n#define RE_Direct_RectArea RE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse RE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular RE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion(const in float dotNV,const in float ambientOcclusion,const in float roughness){return saturate(pow(dotNV+ambientOcclusion,exp2(-16.0*roughness-1.0))-1.0+ambientOcclusion);}",lights_fragment_begin:"vec3 geometryPosition=-vViewPosition;vec3 geometryNormal=normal;vec3 geometryViewDir=(isOrthographic)?vec3(0,0,1):normalize(vViewPosition);vec3 geometryClearcoatNormal=vec3(0.0);\n#ifdef USE_CLEARCOAT\ngeometryClearcoatNormal=clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\nfloat dotNVi=saturate(dot(normal,geometryViewDir));if(material.iridescenceThickness==0.0){material.iridescence=0.0;}else{material.iridescence=saturate(material.iridescence);}if(material.iridescence>0.0){material.iridescenceFresnel=evalIridescence(1.0,material.iridescenceIOR,dotNVi,material.iridescenceThickness,material.specularColor);material.iridescenceF0=Schlick_to_F0(material.iridescenceFresnel,1.0,dotNVi);}\n#endif\nIncidentLight directLight;\n#if (NUM_POINT_LIGHTS>0)&&defined(RE_Direct)\nPointLight pointLight;\n#if defined(USE_SHADOWMAP)&&NUM_POINT_LIGHT_SHADOWS>0\nPointLightShadow pointLightShadow;\n#endif\n#pragma unroll_loop_start\nfor(int i=0;i0)&&defined(RE_Direct)\nSpotLight spotLight;vec4 spotColor;vec3 spotLightCoord;bool inSpotLightMap;\n#if defined(USE_SHADOWMAP)&&NUM_SPOT_LIGHT_SHADOWS>0\nSpotLightShadow spotLightShadow;\n#endif\n#pragma unroll_loop_start\nfor(int i=0;i0)&&defined(RE_Direct)\nDirectionalLight directionalLight;\n#if defined(USE_SHADOWMAP)&&NUM_DIR_LIGHT_SHADOWS>0\nDirectionalLightShadow directionalLightShadow;\n#endif\n#pragma unroll_loop_start\nfor(int i=0;i0)&&defined(RE_Direct_RectArea)\nRectAreaLight rectAreaLight;\n#pragma unroll_loop_start\nfor(int i=0;i0)\n#pragma unroll_loop_start\nfor(int i=0;i0\nvarying vec4 vSpotLightCoord[NUM_SPOT_LIGHT_COORDS];\n#endif\n#if NUM_SPOT_LIGHT_MAPS>0\nuniform sampler2D spotLightMap[NUM_SPOT_LIGHT_MAPS];\n#endif\n#ifdef USE_SHADOWMAP\n#if NUM_DIR_LIGHT_SHADOWS>0\nuniform sampler2D directionalShadowMap[NUM_DIR_LIGHT_SHADOWS];varying vec4 vDirectionalShadowCoord[NUM_DIR_LIGHT_SHADOWS];struct DirectionalLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;};uniform DirectionalLightShadow directionalLightShadows[NUM_DIR_LIGHT_SHADOWS];\n#endif\n#if NUM_SPOT_LIGHT_SHADOWS>0\nuniform sampler2D spotShadowMap[NUM_SPOT_LIGHT_SHADOWS];struct SpotLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;};uniform SpotLightShadow spotLightShadows[NUM_SPOT_LIGHT_SHADOWS];\n#endif\n#if NUM_POINT_LIGHT_SHADOWS>0\nuniform sampler2D pointShadowMap[NUM_POINT_LIGHT_SHADOWS];varying vec4 vPointShadowCoord[NUM_POINT_LIGHT_SHADOWS];struct PointLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;float shadowCameraNear;float shadowCameraFar;};uniform PointLightShadow pointLightShadows[NUM_POINT_LIGHT_SHADOWS];\n#endif\nfloat texture2DCompare(sampler2D depths,vec2 uv,float compare){return step(compare,unpackRGBAToDepth(texture2D(depths,uv)));}vec2 texture2DDistribution(sampler2D shadow,vec2 uv){return unpackRGBATo2Half(texture2D(shadow,uv));}float VSMShadow(sampler2D shadow,vec2 uv,float compare){float occlusion=1.0;vec2 distribution=texture2DDistribution(shadow,uv);float hard_shadow=step(compare,distribution.x);if(hard_shadow!=1.0){float distance=compare-distribution.x;float variance=max(0.00000,distribution.y*distribution.y);float softness_probability=variance/(variance+distance*distance);softness_probability=clamp((softness_probability-0.3)/(0.95-0.3),0.0,1.0);occlusion=clamp(max(hard_shadow,softness_probability),0.0,1.0);}return occlusion;}float getShadow(sampler2D shadowMap,vec2 shadowMapSize,float shadowBias,float shadowRadius,vec4 shadowCoord){float shadow=1.0;shadowCoord.xyz/=shadowCoord.w;shadowCoord.z+=shadowBias;bool inFrustum=shadowCoord.x>=0.0&&shadowCoord.x<=1.0&&shadowCoord.y>=0.0&&shadowCoord.y<=1.0;bool frustumTest=inFrustum&&shadowCoord.z<=1.0;if(frustumTest){\n#if defined(SHADOWMAP_TYPE_PCF)\nvec2 texelSize=vec2(1.0)/shadowMapSize;float dx0=-texelSize.x*shadowRadius;float dy0=-texelSize.y*shadowRadius;float dx1=+texelSize.x*shadowRadius;float dy1=+texelSize.y*shadowRadius;float dx2=dx0/2.0;float dy2=dy0/2.0;float dx3=dx1/2.0;float dy3=dy1/2.0;shadow=(texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx0,dy0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(0.0,dy0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx1,dy0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx2,dy2),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(0.0,dy2),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx3,dy2),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx0,0.0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx2,0.0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy,shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx3,0.0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx1,0.0),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx2,dy3),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(0.0,dy3),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx3,dy3),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx0,dy1),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(0.0,dy1),shadowCoord.z)+texture2DCompare(shadowMap,shadowCoord.xy+vec2(dx1,dy1),shadowCoord.z))*(1.0/17.0);\n#elif defined(SHADOWMAP_TYPE_PCF_SOFT)\nvec2 texelSize=vec2(1.0)/shadowMapSize;float dx=texelSize.x;float dy=texelSize.y;vec2 uv=shadowCoord.xy;vec2 f=fract(uv*shadowMapSize+0.5);uv-=f*texelSize;shadow=(texture2DCompare(shadowMap,uv,shadowCoord.z)+texture2DCompare(shadowMap,uv+vec2(dx,0.0),shadowCoord.z)+texture2DCompare(shadowMap,uv+vec2(0.0,dy),shadowCoord.z)+texture2DCompare(shadowMap,uv+texelSize,shadowCoord.z)+mix(texture2DCompare(shadowMap,uv+vec2(-dx,0.0),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(2.0*dx,0.0),shadowCoord.z),f.x)+mix(texture2DCompare(shadowMap,uv+vec2(-dx,dy),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(2.0*dx,dy),shadowCoord.z),f.x)+mix(texture2DCompare(shadowMap,uv+vec2(0.0,-dy),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(0.0,2.0*dy),shadowCoord.z),f.y)+mix(texture2DCompare(shadowMap,uv+vec2(dx,-dy),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(dx,2.0*dy),shadowCoord.z),f.y)+mix(mix(texture2DCompare(shadowMap,uv+vec2(-dx,-dy),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(2.0*dx,-dy),shadowCoord.z),f.x),mix(texture2DCompare(shadowMap,uv+vec2(-dx,2.0*dy),shadowCoord.z),texture2DCompare(shadowMap,uv+vec2(2.0*dx,2.0*dy),shadowCoord.z),f.x),f.y))*(1.0/9.0);\n#elif defined(SHADOWMAP_TYPE_VSM)\nshadow=VSMShadow(shadowMap,shadowCoord.xy,shadowCoord.z);\n#else\nshadow=texture2DCompare(shadowMap,shadowCoord.xy,shadowCoord.z);\n#endif\n}return shadow;}vec2 cubeToUV(vec3 v,float texelSizeY){vec3 absV=abs(v);float scaleToCube=1.0/max(absV.x,max(absV.y,absV.z));absV*=scaleToCube;v*=scaleToCube*(1.0-2.0*texelSizeY);vec2 planar=v.xy;float almostATexel=1.5*texelSizeY;float almostOne=1.0-almostATexel;if(absV.z>=almostOne){if(v.z>0.0)planar.x=4.0-v.x;}else if(absV.x>=almostOne){float signX=sign(v.x);planar.x=v.z*signX+2.0*signX;}else if(absV.y>=almostOne){float signY=sign(v.y);planar.x=v.x+2.0*signY+2.0;planar.y=v.z*signY-2.0;}return vec2(0.125,0.25)*planar+vec2(0.375,0.75);}float getPointShadow(sampler2D shadowMap,vec2 shadowMapSize,float shadowBias,float shadowRadius,vec4 shadowCoord,float shadowCameraNear,float shadowCameraFar){vec2 texelSize=vec2(1.0)/(shadowMapSize*vec2(4.0,2.0));vec3 lightToPosition=shadowCoord.xyz;float dp=(length(lightToPosition)-shadowCameraNear)/(shadowCameraFar-shadowCameraNear);dp+=shadowBias;vec3 bd3D=normalize(lightToPosition);\n#if defined(SHADOWMAP_TYPE_PCF)||defined(SHADOWMAP_TYPE_PCF_SOFT)||defined(SHADOWMAP_TYPE_VSM)\nvec2 offset=vec2(-1,1)*shadowRadius*texelSize.y;return(texture2DCompare(shadowMap,cubeToUV(bd3D+offset.xyy,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.yyy,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.xyx,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.yyx,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.xxy,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.yxy,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.xxx,texelSize.y),dp)+texture2DCompare(shadowMap,cubeToUV(bd3D+offset.yxx,texelSize.y),dp))*(1.0/9.0);\n#else\nreturn texture2DCompare(shadowMap,cubeToUV(bd3D,texelSize.y),dp);\n#endif\n}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS>0\nuniform mat4 spotLightMatrix[NUM_SPOT_LIGHT_COORDS];varying vec4 vSpotLightCoord[NUM_SPOT_LIGHT_COORDS];\n#endif\n#ifdef USE_SHADOWMAP\n#if NUM_DIR_LIGHT_SHADOWS>0\nuniform mat4 directionalShadowMatrix[NUM_DIR_LIGHT_SHADOWS];varying vec4 vDirectionalShadowCoord[NUM_DIR_LIGHT_SHADOWS];struct DirectionalLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;};uniform DirectionalLightShadow directionalLightShadows[NUM_DIR_LIGHT_SHADOWS];\n#endif\n#if NUM_SPOT_LIGHT_SHADOWS>0\nstruct SpotLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;};uniform SpotLightShadow spotLightShadows[NUM_SPOT_LIGHT_SHADOWS];\n#endif\n#if NUM_POINT_LIGHT_SHADOWS>0\nuniform mat4 pointShadowMatrix[NUM_POINT_LIGHT_SHADOWS];varying vec4 vPointShadowCoord[NUM_POINT_LIGHT_SHADOWS];struct PointLightShadow{float shadowBias;float shadowNormalBias;float shadowRadius;vec2 shadowMapSize;float shadowCameraNear;float shadowCameraFar;};uniform PointLightShadow pointLightShadows[NUM_POINT_LIGHT_SHADOWS];\n#endif\n#endif",shadowmap_vertex:"#if (defined(USE_SHADOWMAP)&&(NUM_DIR_LIGHT_SHADOWS>0||NUM_POINT_LIGHT_SHADOWS>0))||(NUM_SPOT_LIGHT_COORDS>0)\nvec3 shadowWorldNormal=inverseTransformDirection(transformedNormal,viewMatrix);vec4 shadowWorldPosition;\n#endif\n#if defined(USE_SHADOWMAP)\n#if NUM_DIR_LIGHT_SHADOWS>0\n#pragma unroll_loop_start\nfor(int i=0;i0\n#pragma unroll_loop_start\nfor(int i=0;i0\n#pragma unroll_loop_start\nfor(int i=0;i0\nDirectionalLightShadow directionalLight;\n#pragma unroll_loop_start\nfor(int i=0;i0\nSpotLightShadow spotLight;\n#pragma unroll_loop_start\nfor(int i=0;i0\nPointLightShadow pointLight;\n#pragma unroll_loop_start\nfor(int i=0;i0\nvec4 worldPosition=vec4(transformed,1.0);\n#ifdef USE_INSTANCING\nworldPosition=instanceMatrix*worldPosition;\n#endif\nworldPosition=modelMatrix*worldPosition;\n#endif",background_vert:"varying vec2 vUv;uniform mat3 uvTransform;void main(){vUv=(uvTransform*vec3(uv,1)).xy;gl_Position=vec4(position.xy,1.0,1.0);}",background_frag:"uniform sampler2D t2D;uniform float backgroundIntensity;varying vec2 vUv;void main(){vec4 texColor=texture2D(t2D,vUv);\n#ifdef DECODE_VIDEO_TEXTURE\ntexColor=vec4(mix(pow(texColor.rgb*0.9478672986+vec3(0.0521327014),vec3(2.4)),texColor.rgb*0.0773993808,vec3(lessThanEqual(texColor.rgb,vec3(0.04045)))),texColor.w);\n#endif\ntexColor.rgb*=backgroundIntensity;gl_FragColor=texColor;\n#include \n#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main(){vWorldDirection=transformDirection(position,modelMatrix);\n#include \n#include \ngl_Position.z=gl_Position.w;}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\nuniform samplerCube envMap;\n#elif defined(ENVMAP_TYPE_CUBE_UV)\nuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;uniform float backgroundBlurriness;uniform float backgroundIntensity;varying vec3 vWorldDirection;\n#include \nvoid main(){\n#ifdef ENVMAP_TYPE_CUBE\nvec4 texColor=textureCube(envMap,vec3(flipEnvMap*vWorldDirection.x,vWorldDirection.yz));\n#elif defined(ENVMAP_TYPE_CUBE_UV)\nvec4 texColor=textureCubeUV(envMap,vWorldDirection,backgroundBlurriness);\n#else\nvec4 texColor=vec4(0.0,0.0,0.0,1.0);\n#endif\ntexColor.rgb*=backgroundIntensity;gl_FragColor=texColor;\n#include \n#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main(){vWorldDirection=transformDirection(position,modelMatrix);\n#include \n#include \ngl_Position.z=gl_Position.w;}",cube_frag:"uniform samplerCube tCube;uniform float tFlip;uniform float opacity;varying vec3 vWorldDirection;void main(){vec4 texColor=textureCube(tCube,vec3(tFlip*vWorldDirection.x,vWorldDirection.yz));gl_FragColor=texColor;gl_FragColor.a*=opacity;\n#include \n#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;void main(){\n#include \n#include \n#ifdef USE_DISPLACEMENTMAP\n#include \n#include \n#include \n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvHighPrecisionZW=gl_Position.zw;}",depth_frag:"#if DEPTH_PACKING==3200\nuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;void main(){\n#include \nvec4 diffuseColor=vec4(1.0);\n#if DEPTH_PACKING==3200\ndiffuseColor.a=opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \nfloat fragCoordZ=0.5*vHighPrecisionZW[0]/vHighPrecisionZW[1]+0.5;\n#if DEPTH_PACKING==3200\ngl_FragColor=vec4(vec3(1.0-fragCoordZ),opacity);\n#elif DEPTH_PACKING==3201\ngl_FragColor=packDepthToRGBA(fragCoordZ);\n#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#ifdef USE_DISPLACEMENTMAP\n#include \n#include \n#include \n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvWorldPosition=worldPosition.xyz;}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;uniform float nearDistance;uniform float farDistance;varying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(1.0);\n#include \n#include \n#include \n#include \nfloat dist=length(vWorldPosition-referencePosition);dist=(dist-nearDistance)/(farDistance-nearDistance);dist=saturate(dist);gl_FragColor=packDepthToRGBA(dist);}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main(){vWorldDirection=transformDirection(position,modelMatrix);\n#include \n#include \n}",equirect_frag:"uniform sampler2D tEquirect;varying vec3 vWorldDirection;\n#include \nvoid main(){vec3 direction=normalize(vWorldDirection);vec2 sampleUV=equirectUv(direction);gl_FragColor=texture2D(tEquirect,sampleUV);\n#include \n#include \n}",linedashed_vert:"uniform float scale;attribute float lineDistance;varying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){vLineDistance=scale*lineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",linedashed_frag:"uniform vec3 diffuse;uniform float opacity;uniform float dashSize;uniform float totalSize;varying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nif(mod(vLineDistance,totalSize)>dashSize){discard;}vec3 outgoingLight=vec3(0.0);vec4 diffuseColor=vec4(diffuse,opacity);\n#include \n#include \n#include \noutgoingLight=diffuseColor.rgb;\n#include \n#include \n#include \n#include \n#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#if defined(USE_ENVMAP)||defined(USE_SKINNING)\n#include \n#include \n#include \n#include \n#include \n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",meshbasic_frag:"uniform vec3 diffuse;uniform float opacity;\n#ifndef FLAT_SHADED\nvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nReflectedLight reflectedLight=ReflectedLight(vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));\n#ifdef USE_LIGHTMAP\nvec4 lightMapTexel=texture2D(lightMap,vLightMapUv);reflectedLight.indirectDiffuse+=lightMapTexel.rgb*lightMapIntensity*RECIPROCAL_PI;\n#else\nreflectedLight.indirectDiffuse+=vec3(1.0);\n#endif\n#include \nreflectedLight.indirectDiffuse*=diffuseColor.rgb;vec3 outgoingLight=reflectedLight.indirectDiffuse;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvViewPosition=-mvPosition.xyz;\n#include \n#include \n#include \n#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;uniform vec3 emissive;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);ReflectedLight reflectedLight=ReflectedLight(vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));vec3 totalEmissiveRadiance=emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvec3 outgoingLight=reflectedLight.directDiffuse+reflectedLight.indirectDiffuse+totalEmissiveRadiance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvViewPosition=-mvPosition.xyz;}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;uniform float opacity;uniform sampler2D matcap;varying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvec3 viewDir=normalize(vViewPosition);vec3 x=normalize(vec3(viewDir.z,0.0,-viewDir.x));vec3 y=cross(viewDir,x);vec2 uv=vec2(dot(x,normal),dot(y,normal))*0.495+0.5;\n#ifdef USE_MATCAP\nvec4 matcapColor=texture2D(matcap,uv);\n#else\nvec4 matcapColor=vec4(vec3(mix(0.2,0.8,uv.y)),1.0);\n#endif\nvec3 outgoingLight=diffuseColor.rgb*matcapColor.rgb;\n#include \n#include \n#include \n#include \n#include \n#include \n}",meshnormal_vert:"#define NORMAL\n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP_TANGENTSPACE)\nvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP_TANGENTSPACE)\nvViewPosition=-mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined(FLAT_SHADED)||defined(USE_BUMPMAP)||defined(USE_NORMALMAP_TANGENTSPACE)\nvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \ngl_FragColor=vec4(packNormalToRGB(normal),opacity);\n#ifdef OPAQUE\ngl_FragColor.a=1.0;\n#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvViewPosition=-mvPosition.xyz;\n#include \n#include \n#include \n#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;uniform vec3 emissive;uniform vec3 specular;uniform float shininess;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);ReflectedLight reflectedLight=ReflectedLight(vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));vec3 totalEmissiveRadiance=emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvec3 outgoingLight=reflectedLight.directDiffuse+reflectedLight.indirectDiffuse+reflectedLight.directSpecular+reflectedLight.indirectSpecular+totalEmissiveRadiance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\nvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvViewPosition=-mvPosition.xyz;\n#include \n#include \n#include \n#ifdef USE_TRANSMISSION\nvWorldPosition=worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n#define IOR\n#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;uniform vec3 emissive;uniform float roughness;uniform float metalness;uniform float opacity;\n#ifdef IOR\nuniform float ior;\n#endif\n#ifdef USE_SPECULAR\nuniform float specularIntensity;uniform vec3 specularColor;\n#ifdef USE_SPECULAR_COLORMAP\nuniform sampler2D specularColorMap;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\nuniform sampler2D specularIntensityMap;\n#endif\n#endif\n#ifdef USE_CLEARCOAT\nuniform float clearcoat;uniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\nuniform float iridescence;uniform float iridescenceIOR;uniform float iridescenceThicknessMinimum;uniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\nuniform vec3 sheenColor;uniform float sheenRoughness;\n#ifdef USE_SHEEN_COLORMAP\nuniform sampler2D sheenColorMap;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\nuniform sampler2D sheenRoughnessMap;\n#endif\n#endif\n#ifdef USE_ANISOTROPY\nuniform vec2 anisotropyVector;\n#ifdef USE_ANISOTROPYMAP\nuniform sampler2D anisotropyMap;\n#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);ReflectedLight reflectedLight=ReflectedLight(vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));vec3 totalEmissiveRadiance=emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvec3 totalDiffuse=reflectedLight.directDiffuse+reflectedLight.indirectDiffuse;vec3 totalSpecular=reflectedLight.directSpecular+reflectedLight.indirectSpecular;\n#include \nvec3 outgoingLight=totalDiffuse+totalSpecular+totalEmissiveRadiance;\n#ifdef USE_SHEEN\nfloat sheenEnergyComp=1.0-0.157*max3(material.sheenColor);outgoingLight=outgoingLight*sheenEnergyComp+sheenSpecularDirect+sheenSpecularIndirect;\n#endif\n#ifdef USE_CLEARCOAT\nfloat dotNVcc=saturate(dot(geometryClearcoatNormal,geometryViewDir));vec3 Fcc=F_Schlick(material.clearcoatF0,material.clearcoatF90,dotNVcc);outgoingLight=outgoingLight*(1.0-material.clearcoat*Fcc)+(clearcoatSpecularDirect+clearcoatSpecularIndirect)*material.clearcoat;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvViewPosition=-mvPosition.xyz;\n#include \n#include \n#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;uniform vec3 emissive;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 diffuseColor=vec4(diffuse,opacity);ReflectedLight reflectedLight=ReflectedLight(vec3(0.0),vec3(0.0),vec3(0.0),vec3(0.0));vec3 totalEmissiveRadiance=emissive;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvec3 outgoingLight=reflectedLight.directDiffuse+reflectedLight.indirectDiffuse+totalEmissiveRadiance;\n#include \n#include \n#include \n#include \n#include \n#include \n}",points_vert:"uniform float size;uniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\nvarying vec2 vUv;uniform mat3 uvTransform;\n#endif\nvoid main(){\n#ifdef USE_POINTS_UV\nvUv=(uvTransform*vec3(uv,1)).xy;\n#endif\n#include \n#include \n#include \n#include \n#include \ngl_PointSize=size;\n#ifdef USE_SIZEATTENUATION\nbool isPerspective=isPerspectiveMatrix(projectionMatrix);if(isPerspective)gl_PointSize*=(scale/-mvPosition.z);\n#endif\n#include \n#include \n#include \n#include \n}",points_frag:"uniform vec3 diffuse;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec3 outgoingLight=vec3(0.0);vec4 diffuseColor=vec4(diffuse,opacity);\n#include \n#include \n#include \n#include \n#include \noutgoingLight=diffuseColor.rgb;\n#include \n#include \n#include \n#include \n#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n}",shadow_frag:"uniform vec3 color;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \ngl_FragColor=vec4(color,opacity*(1.0-getShadowMask()));\n#include \n#include \n#include \n}",sprite_vert:"uniform float rotation;uniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec4 mvPosition=modelViewMatrix*vec4(0.0,0.0,0.0,1.0);vec2 scale;scale.x=length(vec3(modelMatrix[0].x,modelMatrix[0].y,modelMatrix[0].z));scale.y=length(vec3(modelMatrix[1].x,modelMatrix[1].y,modelMatrix[1].z));\n#ifndef USE_SIZEATTENUATION\nbool isPerspective=isPerspectiveMatrix(projectionMatrix);if(isPerspective)scale*=-mvPosition.z;\n#endif\nvec2 alignedPosition=(position.xy-(center-vec2(0.5)))*scale;vec2 rotatedPosition;rotatedPosition.x=cos(rotation)*alignedPosition.x-sin(rotation)*alignedPosition.y;rotatedPosition.y=sin(rotation)*alignedPosition.x+cos(rotation)*alignedPosition.y;mvPosition.xy+=rotatedPosition;gl_Position=projectionMatrix*mvPosition;\n#include \n#include \n#include \n}",sprite_frag:"uniform vec3 diffuse;uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main(){\n#include \nvec3 outgoingLight=vec3(0.0);vec4 diffuseColor=vec4(diffuse,opacity);\n#include \n#include \n#include \n#include \n#include \noutgoingLight=diffuseColor.rgb;\n#include \n#include \n#include \n#include \n}"},Gn={common:{diffuse:{value:new Oi(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new He},alphaMap:{value:null},alphaMapTransform:{value:new He},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new He}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new He}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new He}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new He},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new He},normalScale:{value:new Ge(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new He},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new He}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new He}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new He}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Oi(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Oi(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new He},alphaTest:{value:0},uvTransform:{value:new He}},sprite:{diffuse:{value:new Oi(16777215)},opacity:{value:1},center:{value:new Ge(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new He},alphaMap:{value:null},alphaMapTransform:{value:new He},alphaTest:{value:0}}},Hn={basic:{uniforms:wn([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.fog]),vertexShader:$n.meshbasic_vert,fragmentShader:$n.meshbasic_frag},lambert:{uniforms:wn([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new Oi(0)}}]),vertexShader:$n.meshlambert_vert,fragmentShader:$n.meshlambert_frag},phong:{uniforms:wn([Gn.common,Gn.specularmap,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,Gn.lights,{emissive:{value:new Oi(0)},specular:{value:new Oi(1118481)},shininess:{value:30}}]),vertexShader:$n.meshphong_vert,fragmentShader:$n.meshphong_frag},standard:{uniforms:wn([Gn.common,Gn.envmap,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.roughnessmap,Gn.metalnessmap,Gn.fog,Gn.lights,{emissive:{value:new Oi(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:$n.meshphysical_vert,fragmentShader:$n.meshphysical_frag},toon:{uniforms:wn([Gn.common,Gn.aomap,Gn.lightmap,Gn.emissivemap,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.gradientmap,Gn.fog,Gn.lights,{emissive:{value:new Oi(0)}}]),vertexShader:$n.meshtoon_vert,fragmentShader:$n.meshtoon_frag},matcap:{uniforms:wn([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,Gn.fog,{matcap:{value:null}}]),vertexShader:$n.meshmatcap_vert,fragmentShader:$n.meshmatcap_frag},points:{uniforms:wn([Gn.points,Gn.fog]),vertexShader:$n.points_vert,fragmentShader:$n.points_frag},dashed:{uniforms:wn([Gn.common,Gn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:$n.linedashed_vert,fragmentShader:$n.linedashed_frag},depth:{uniforms:wn([Gn.common,Gn.displacementmap]),vertexShader:$n.depth_vert,fragmentShader:$n.depth_frag},normal:{uniforms:wn([Gn.common,Gn.bumpmap,Gn.normalmap,Gn.displacementmap,{opacity:{value:1}}]),vertexShader:$n.meshnormal_vert,fragmentShader:$n.meshnormal_frag},sprite:{uniforms:wn([Gn.sprite,Gn.fog]),vertexShader:$n.sprite_vert,fragmentShader:$n.sprite_frag},background:{uniforms:{uvTransform:{value:new He},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:$n.background_vert,fragmentShader:$n.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:$n.backgroundCube_vert,fragmentShader:$n.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:$n.cube_vert,fragmentShader:$n.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:$n.equirect_vert,fragmentShader:$n.equirect_frag},distanceRGBA:{uniforms:wn([Gn.common,Gn.displacementmap,{referencePosition:{value:new _t},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:$n.distanceRGBA_vert,fragmentShader:$n.distanceRGBA_frag},shadow:{uniforms:wn([Gn.lights,Gn.fog,{color:{value:new Oi(0)},opacity:{value:1}}]),vertexShader:$n.shadow_vert,fragmentShader:$n.shadow_frag}};Hn.physical={uniforms:wn([Hn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new He},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new He},clearcoatNormalScale:{value:new Ge(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new He},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new He},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new He},sheen:{value:0},sheenColor:{value:new Oi(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new He},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new He},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new He},transmissionSamplerSize:{value:new Ge},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new He},attenuationDistance:{value:0},attenuationColor:{value:new Oi(0)},specularColor:{value:new Oi(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new He},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new He},anisotropyVector:{value:new Ge},anisotropyMap:{value:null},anisotropyMapTransform:{value:new He}}]),vertexShader:$n.meshphysical_vert,fragmentShader:$n.meshphysical_frag};const jn={r:0,b:0,g:0};function Wn(e,t,i,n,a,o,l){const c=new Oi(0);let u,h,d=!0===o?0:1,f=null,m=0,p=null;function g(t,i){t.getRGB(jn,Sn(e)),n.buffers.color.setClear(jn.r,jn.g,jn.b,i,l)}return{getClearColor:function(){return c},setClearColor:function(e,t=1){c.set(e),d=t,g(c,d)},getClearAlpha:function(){return d},setClearAlpha:function(e){d=e,g(c,d)},render:function(o,_){let y=!1,v=!0===_.isScene?_.background:null;if(v&&v.isTexture){v=(_.backgroundBlurriness>0?i:t).get(v)}null===v?g(c,d):v&&v.isColor&&(g(v,1),y=!0);const b=e.xr.getEnvironmentBlendMode();"additive"===b?n.buffers.color.setClear(0,0,0,1,l):"alpha-blend"===b&&n.buffers.color.setClear(0,0,0,0,l),(e.autoClear||y)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),v&&(v.isCubeTexture||v.mapping===N)?(void 0===h&&(h=new yn(new bn(1,1,1),new An({name:"BackgroundCubeMaterial",uniforms:xn(Hn.backgroundCube.uniforms),vertexShader:Hn.backgroundCube.vertexShader,fragmentShader:Hn.backgroundCube.fragmentShader,side:s,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(e,t,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),a.update(h)),h.material.uniforms.envMap.value=v,h.material.uniforms.flipEnvMap.value=v.isCubeTexture&&!1===v.isRenderTargetTexture?-1:1,h.material.uniforms.backgroundBlurriness.value=_.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=_.backgroundIntensity,h.material.toneMapped=tt.getTransfer(v.colorSpace)!==me,f===v&&m===v.version&&p===e.toneMapping||(h.material.needsUpdate=!0,f=v,m=v.version,p=e.toneMapping),h.layers.enableAll(),o.unshift(h,h.geometry,h.material,0,0,null)):v&&v.isTexture&&(void 0===u&&(u=new yn(new Vn(2,2),new An({name:"BackgroundMaterial",uniforms:xn(Hn.background.uniforms),vertexShader:Hn.background.vertexShader,fragmentShader:Hn.background.fragmentShader,side:r,depthTest:!1,depthWrite:!1,fog:!1})),u.geometry.deleteAttribute("normal"),Object.defineProperty(u.material,"map",{get:function(){return this.uniforms.t2D.value}}),a.update(u)),u.material.uniforms.t2D.value=v,u.material.uniforms.backgroundIntensity.value=_.backgroundIntensity,u.material.toneMapped=tt.getTransfer(v.colorSpace)!==me,!0===v.matrixAutoUpdate&&v.updateMatrix(),u.material.uniforms.uvTransform.value.copy(v.matrix),f===v&&m===v.version&&p===e.toneMapping||(u.material.needsUpdate=!0,f=v,m=v.version,p=e.toneMapping),u.layers.enableAll(),o.unshift(u,u.geometry,u.material,0,0,null))}}}function qn(e,t,i,n){const r=e.getParameter(34921),s=n.isWebGL2?null:t.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},l=f(null);let c=l,u=!1;function h(t){return n.isWebGL2?e.bindVertexArray(t):s.bindVertexArrayOES(t)}function d(t){return n.isWebGL2?e.deleteVertexArray(t):s.deleteVertexArrayOES(t)}function f(e){const t=[],i=[],n=[];for(let e=0;e=0){const i=r[t];let n=s[t];if(void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor)),void 0===i)return!0;if(i.attribute!==n)return!0;if(n&&i.data!==n.data)return!0;a++}}return c.attributesNum!==a||c.index!==n}(r,v,d,b),x&&function(e,t,i,n){const r={},s=t.attributes;let a=0;const o=i.getAttributes();for(const t in o){if(o[t].location>=0){let i=s[t];void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor));const n={};n.attribute=i,i&&i.data&&(n.data=i.data),r[t]=n,a++}}c.attributes=r,c.attributesNum=a,c.index=n}(r,v,d,b)}else{const e=!0===l.wireframe;c.geometry===v.id&&c.program===d.id&&c.wireframe===e||(c.geometry=v.id,c.program=d.id,c.wireframe=e,x=!0)}null!==b&&i.update(b,34963),(x||u)&&(u=!1,function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===t.get("ANGLE_instanced_arrays"))return;m();const l=o.attributes,c=a.getAttributes(),u=s.defaultAttributeValues;for(const t in c){const s=c[t];if(s.location>=0){let a=l[t];if(void 0===a&&("instanceMatrix"===t&&r.instanceMatrix&&(a=r.instanceMatrix),"instanceColor"===t&&r.instanceColor&&(a=r.instanceColor)),void 0!==a){const t=a.normalized,l=a.itemSize,c=i.get(a);if(void 0===c)continue;const u=c.buffer,h=c.type,d=c.bytesPerElement,f=!0===n.isWebGL2&&(5124===h||5125===h||a.gpuType===X);if(a.isInterleavedBufferAttribute){const i=a.data,n=i.stride,c=a.offset;if(i.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(35633,36337).precision>0&&e.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&"WebGL2RenderingContext"===e.constructor.name;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=s||t.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,u=e.getParameter(34930),h=e.getParameter(35660),d=e.getParameter(3379),f=e.getParameter(34076),m=e.getParameter(34921),p=e.getParameter(36347),g=e.getParameter(36348),_=e.getParameter(36349),y=h>0,v=s||t.has("OES_texture_float");return{isWebGL2:s,drawBuffers:l,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===t.has("EXT_texture_filter_anisotropic")){const i=t.get("EXT_texture_filter_anisotropic");n=e.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:u,maxVertexTextures:h,maxTextureSize:d,maxCubemapSize:f,maxAttributes:m,maxVertexUniforms:p,maxVaryings:g,maxFragmentUniforms:_,vertexTextures:y,floatFragmentTextures:v,floatVertexTextures:y&&v,maxSamples:s?e.getParameter(36183):0}}function Kn(e){const t=this;let i=null,n=0,r=!1,s=!1;const a=new On,o=new He,l={value:null,needsUpdate:!1};function c(e,i,n,r){const s=null!==e?e.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const t=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length0);t.numPlanes=n,t.numIntersection=0}();else{const e=s?0:n,t=4*e;let r=m.clippingState||null;l.value=r,r=c(h,o,t,u);for(let e=0;e!==t;++e)r[e]=i[e];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=e}}}function Zn(e){let t=new WeakMap;function i(e,t){return 303===t?e.mapping=k:304===t&&(e.mapping=O),e}function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(303===s||304===s){if(t.has(r)){return i(t.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=new Dn(s.height/2);return a.fromEquirectangularTexture(e,r),t.set(r,a),r.addEventListener("dispose",n),i(a.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}class Qn extends Cn{constructor(e=-1,t=1,i=1,n=-1,r=.1,s=2e3){super(),this.isOrthographicCamera=!0,this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this}setViewOffset(e,t,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-e,s=i+e,a=n+t,o=n-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=e*this.view.offsetX,s=r+e*this.view.width,a-=t*this.view.offsetY,o=a-t*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,null!==this.view&&(t.object.view=Object.assign({},this.view)),t}}const Jn=[.125,.215,.35,.446,.526,.582],er=20,tr=new Qn,ir=new Oi;let nr=null,rr=0,sr=0;const ar=(1+Math.sqrt(5))/2,or=1/ar,lr=[new _t(1,1,1),new _t(-1,1,1),new _t(1,1,-1),new _t(-1,1,-1),new _t(0,ar,or),new _t(0,ar,-or),new _t(or,0,ar),new _t(-or,0,ar),new _t(ar,or,0),new _t(-ar,or,0)];class cr{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,i=.1,n=100){nr=this._renderer.getRenderTarget(),rr=this._renderer.getActiveCubeFace(),sr=this._renderer.getActiveMipmapLevel(),this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(e,i,n,r),t>0&&this._blur(r,0,0,t),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=fr(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=dr(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=Jn[a-e+4-1]:0===a&&(o=0),n.push(o);const l=1/(s-2),c=-l,u=1+l,h=[c,c,u,c,u,u,c,c,u,u,c,u],d=6,f=6,m=3,p=2,g=1,_=new Float32Array(m*f*d),y=new Float32Array(p*f*d),v=new Float32Array(g*f*d);for(let e=0;e2?0:-1,n=[t,i,0,t+2/3,i,0,t+2/3,i+1,0,t,i,0,t+2/3,i+1,0,t,i+1,0];_.set(n,m*f*e),y.set(h,p*f*e);const r=[e,e,e,e,e,e];v.set(r,g*f*e)}const b=new Ji;b.setAttribute("position",new $i(_,m)),b.setAttribute("uv",new $i(y,p)),b.setAttribute("faceIndex",new $i(v,g)),t.push(b),r>4&&r--}return{lodPlanes:t,sizeLods:i,sigmas:n}}(n)),this._blurMaterial=function(e,t,i){const n=new Float32Array(er),r=new _t(0,1,0),s=new An({name:"SphericalGaussianBlur",defines:{n:er,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/i,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:r}},vertexShader:mr(),fragmentShader:"precision mediump float;precision mediump int;varying vec3 vOutputDirection;uniform sampler2D envMap;uniform int samples;uniform float weights[n];uniform bool latitudinal;uniform float dTheta;uniform float mipInt;uniform vec3 poleAxis;\n#define ENVMAP_TYPE_CUBE_UV\n#include \nvec3 getSample(float theta,vec3 axis){float cosTheta=cos(theta);vec3 sampleDirection=vOutputDirection*cosTheta+cross(axis,vOutputDirection)*sin(theta)+axis*dot(axis,vOutputDirection)*(1.0-cosTheta);return bilinearCubeUV(envMap,sampleDirection,mipInt);}void main(){vec3 axis=latitudinal?poleAxis:cross(poleAxis,vOutputDirection);if(all(equal(axis,vec3(0.0)))){axis=vec3(vOutputDirection.z,0.0,-vOutputDirection.x);}axis=normalize(axis);gl_FragColor=vec4(0.0,0.0,0.0,1.0);gl_FragColor.rgb+=weights[0]*getSample(0.0,axis);for(int i=1;i=samples){break;}float theta=dTheta*float(i);gl_FragColor.rgb+=weights[i]*getSample(-1.0*theta,axis);gl_FragColor.rgb+=weights[i]*getSample(theta,axis);}}",blending:0,depthTest:!1,depthWrite:!1});return s}(n,e,t)}return n}_compileMaterial(e){const t=new yn(this._lodPlanes[0],e);this._renderer.compile(t,tr)}_sceneToCubeUV(e,t,i,n){const r=new Tn(90,1,t,i),a=[1,-1,1,1,1,1],o=[1,1,1,-1,-1,-1],l=this._renderer,c=l.autoClear,u=l.toneMapping;l.getClearColor(ir),l.toneMapping=P,l.autoClear=!1;const h=new zi({name:"PMREM.Background",side:s,depthWrite:!1,depthTest:!1}),d=new yn(new bn,h);let f=!1;const m=e.background;m?m.isColor&&(h.color.copy(m),e.background=null,f=!0):(h.color.copy(ir),f=!0);for(let t=0;t<6;t++){const i=t%3;0===i?(r.up.set(0,a[t],0),r.lookAt(o[t],0,0)):1===i?(r.up.set(0,0,a[t]),r.lookAt(0,o[t],0)):(r.up.set(0,a[t],0),r.lookAt(0,0,o[t]));const s=this._cubeSize;hr(n,i*s,t>2?s:0,s,s),l.setRenderTarget(n),f&&l.render(d,r),l.render(e,r)}d.geometry.dispose(),d.material.dispose(),l.toneMapping=u,l.autoClear=c,e.background=m}_textureToCubeUV(e,t){const i=this._renderer,n=e.mapping===k||e.mapping===O;n?(null===this._cubemapMaterial&&(this._cubemapMaterial=fr()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=dr());const r=n?this._cubemapMaterial:this._equirectMaterial,s=new yn(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const a=this._cubeSize;hr(t,0,0,3*a,2*a),i.setRenderTarget(t),i.render(s,tr)}_applyPMREM(e){const t=this._renderer,i=t.autoClear;t.autoClear=!1;for(let t=1;ter&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const p=[];let g=0;for(let e=0;e_-4?n-_+4:0),4*(this._cubeSize-y),3*y,2*y),o.setRenderTarget(t),o.render(c,tr)}}function ur(e,t,i){const n=new ft(e,t,i);return n.texture.mapping=N,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function hr(e,t,i,n,r){e.viewport.set(t,i,n,r),e.scissor.set(t,i,n,r)}function dr(){return new An({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:mr(),fragmentShader:"precision mediump float;precision mediump int;varying vec3 vOutputDirection;uniform sampler2D envMap;\n#include \nvoid main(){vec3 outputDirection=normalize(vOutputDirection);vec2 uv=equirectUv(outputDirection);gl_FragColor=vec4(texture2D(envMap,uv).rgb,1.0);}",blending:0,depthTest:!1,depthWrite:!1})}function fr(){return new An({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:mr(),fragmentShader:"precision mediump float;precision mediump int;uniform float flipEnvMap;varying vec3 vOutputDirection;uniform samplerCube envMap;void main(){gl_FragColor=textureCube(envMap,vec3(flipEnvMap*vOutputDirection.x,vOutputDirection.yz));}",blending:0,depthTest:!1,depthWrite:!1})}function mr(){return"precision mediump float;precision mediump int;attribute float faceIndex;varying vec3 vOutputDirection;vec3 getDirection(vec2 uv,float face){uv=2.0*uv-1.0;vec3 direction=vec3(uv,1.0);if(face==0.0){direction=direction.zyx;}else if(face==1.0){direction=direction.xzy;direction.xz*=-1.0;}else if(face==2.0){direction.x*=-1.0;}else if(face==3.0){direction=direction.zyx;direction.xz*=-1.0;}else if(face==4.0){direction=direction.xzy;direction.xy*=-1.0;}else if(face==5.0){direction.z*=-1.0;}return direction;}void main(){vOutputDirection=getDirection(uv,faceIndex);gl_Position=vec4(position,1.0);}"}function pr(e){let t=new WeakMap,i=null;function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping,a=303===s||304===s,o=s===k||s===O;if(a||o){if(r.isRenderTargetTexture&&!0===r.needsPMREMUpdate){r.needsPMREMUpdate=!1;let n=t.get(r);return null===i&&(i=new cr(e)),n=a?i.fromEquirectangular(r,n):i.fromCubemap(r,n),t.set(r,n),n.texture}if(t.has(r))return t.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(e){let t=0;const i=6;for(let n=0;nt.maxTextureSize&&(A=Math.ceil(M/t.maxTextureSize),M=t.maxTextureSize);const C=new Float32Array(M*A*4*f),T=new mt(C,M,A,f);T.type=K,T.needsUpdate=!0;const P=4*S;for(let I=0;I0)return e;const r=t*i;let s=Pr[r];if(void 0===s&&(s=new Float32Array(r),Pr[r]=s),0!==t){n.toArray(s,0);for(let n=1,r=0;n!==t;++n)r+=i,e[n].toArray(s,r)}return s}function kr(e,t){if(e.length!==t.length)return!1;for(let i=0,n=e.length;i":" "} ${r}: ${i[e]}`)}return n.join("\n")}(e.getShaderSource(t),n)}return r}function Rs(e,t){const i=function(e){const t=tt.getPrimaries(tt.workingColorSpace),i=tt.getPrimaries(e);let n;switch(t===i?n="":t===ge&&i===pe?n="LinearDisplayP3ToLinearSRGB":t===pe&&i===ge&&(n="LinearSRGBToLinearDisplayP3"),e){case ue:case de:return[n,"LinearTransferOETF"];case ce:case he:return[n,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space:",e),[n,"LinearTransferOETF"]}}(t);return`vec4 ${e}( vec4 value ) { return ${i[0]}( ${i[1]}( value ) ); }`}function Ls(e,t){let i;switch(t){case E:i="Linear";break;case I:i="Reinhard";break;case D:i="OptimizedCineon";break;case R:i="ACESFilmic";break;case L:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),i="Linear"}return"vec3 "+e+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function ks(e){return""!==e}function Os(e,t){const i=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,i).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Ns(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Fs=/^[ \t]*#include +<([\w\d./]+)>/gm;function Bs(e){return e.replace(Fs,Us)}const zs=new Map([["encodings_fragment","colorspace_fragment"],["encodings_pars_fragment","colorspace_pars_fragment"],["output_fragment","opaque_fragment"]]);function Us(e,t){let i=$n[t];if(void 0===i){const e=zs.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");i=$n[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Bs(i)}const Vs=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function $s(e){return e.replace(Vs,Gs)}function Gs(e,t,i,n){let r="";for(let e=parseInt(t);e0&&(v+="\n"),b=[g,"#define SHADER_TYPE "+s.shaderType,"#define SHADER_NAME "+s.shaderName,_].filter(ks).join("\n"),b.length>0&&(b+="\n")):(v=[Hs(s),"#define SHADER_TYPE "+s.shaderType,"#define SHADER_NAME "+s.shaderName,_,s.instancing?"#define USE_INSTANCING":"",s.instancingColor?"#define USE_INSTANCING_COLOR":"",s.useFog&&s.fog?"#define USE_FOG":"",s.useFog&&s.fogExp2?"#define FOG_EXP2":"",s.map?"#define USE_MAP":"",s.envMap?"#define USE_ENVMAP":"",s.envMap?"#define "+f:"",s.lightMap?"#define USE_LIGHTMAP":"",s.aoMap?"#define USE_AOMAP":"",s.bumpMap?"#define USE_BUMPMAP":"",s.normalMap?"#define USE_NORMALMAP":"",s.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",s.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",s.displacementMap?"#define USE_DISPLACEMENTMAP":"",s.emissiveMap?"#define USE_EMISSIVEMAP":"",s.anisotropy?"#define USE_ANISOTROPY":"",s.anisotropyMap?"#define USE_ANISOTROPYMAP":"",s.clearcoatMap?"#define USE_CLEARCOATMAP":"",s.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",s.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",s.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",s.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",s.specularMap?"#define USE_SPECULARMAP":"",s.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",s.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",s.roughnessMap?"#define USE_ROUGHNESSMAP":"",s.metalnessMap?"#define USE_METALNESSMAP":"",s.alphaMap?"#define USE_ALPHAMAP":"",s.alphaHash?"#define USE_ALPHAHASH":"",s.transmission?"#define USE_TRANSMISSION":"",s.transmissionMap?"#define USE_TRANSMISSIONMAP":"",s.thicknessMap?"#define USE_THICKNESSMAP":"",s.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",s.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",s.mapUv?"#define MAP_UV "+s.mapUv:"",s.alphaMapUv?"#define ALPHAMAP_UV "+s.alphaMapUv:"",s.lightMapUv?"#define LIGHTMAP_UV "+s.lightMapUv:"",s.aoMapUv?"#define AOMAP_UV "+s.aoMapUv:"",s.emissiveMapUv?"#define EMISSIVEMAP_UV "+s.emissiveMapUv:"",s.bumpMapUv?"#define BUMPMAP_UV "+s.bumpMapUv:"",s.normalMapUv?"#define NORMALMAP_UV "+s.normalMapUv:"",s.displacementMapUv?"#define DISPLACEMENTMAP_UV "+s.displacementMapUv:"",s.metalnessMapUv?"#define METALNESSMAP_UV "+s.metalnessMapUv:"",s.roughnessMapUv?"#define ROUGHNESSMAP_UV "+s.roughnessMapUv:"",s.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+s.anisotropyMapUv:"",s.clearcoatMapUv?"#define CLEARCOATMAP_UV "+s.clearcoatMapUv:"",s.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+s.clearcoatNormalMapUv:"",s.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+s.clearcoatRoughnessMapUv:"",s.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+s.iridescenceMapUv:"",s.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+s.iridescenceThicknessMapUv:"",s.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+s.sheenColorMapUv:"",s.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+s.sheenRoughnessMapUv:"",s.specularMapUv?"#define SPECULARMAP_UV "+s.specularMapUv:"",s.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+s.specularColorMapUv:"",s.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+s.specularIntensityMapUv:"",s.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+s.transmissionMapUv:"",s.thicknessMapUv?"#define THICKNESSMAP_UV "+s.thicknessMapUv:"",s.vertexTangents&&!1===s.flatShading?"#define USE_TANGENT":"",s.vertexColors?"#define USE_COLOR":"",s.vertexAlphas?"#define USE_COLOR_ALPHA":"",s.vertexUv1s?"#define USE_UV1":"",s.vertexUv2s?"#define USE_UV2":"",s.vertexUv3s?"#define USE_UV3":"",s.pointsUvs?"#define USE_POINTS_UV":"",s.flatShading?"#define FLAT_SHADED":"",s.skinning?"#define USE_SKINNING":"",s.morphTargets?"#define USE_MORPHTARGETS":"",s.morphNormals&&!1===s.flatShading?"#define USE_MORPHNORMALS":"",s.morphColors&&s.isWebGL2?"#define USE_MORPHCOLORS":"",s.morphTargetsCount>0&&s.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",s.morphTargetsCount>0&&s.isWebGL2?"#define MORPHTARGETS_TEXTURE_STRIDE "+s.morphTextureStride:"",s.morphTargetsCount>0&&s.isWebGL2?"#define MORPHTARGETS_COUNT "+s.morphTargetsCount:"",s.doubleSided?"#define DOUBLE_SIDED":"",s.flipSided?"#define FLIP_SIDED":"",s.shadowMapEnabled?"#define USE_SHADOWMAP":"",s.shadowMapEnabled?"#define "+h:"",s.sizeAttenuation?"#define USE_SIZEATTENUATION":"",s.numLightProbes>0?"#define USE_LIGHT_PROBES":"",s.useLegacyLights?"#define LEGACY_LIGHTS":"",s.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",s.logarithmicDepthBuffer&&s.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(ks).join("\n"),b=[g,Hs(s),"#define SHADER_TYPE "+s.shaderType,"#define SHADER_NAME "+s.shaderName,_,s.useFog&&s.fog?"#define USE_FOG":"",s.useFog&&s.fogExp2?"#define FOG_EXP2":"",s.map?"#define USE_MAP":"",s.matcap?"#define USE_MATCAP":"",s.envMap?"#define USE_ENVMAP":"",s.envMap?"#define "+d:"",s.envMap?"#define "+f:"",s.envMap?"#define "+m:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",s.lightMap?"#define USE_LIGHTMAP":"",s.aoMap?"#define USE_AOMAP":"",s.bumpMap?"#define USE_BUMPMAP":"",s.normalMap?"#define USE_NORMALMAP":"",s.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",s.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",s.emissiveMap?"#define USE_EMISSIVEMAP":"",s.anisotropy?"#define USE_ANISOTROPY":"",s.anisotropyMap?"#define USE_ANISOTROPYMAP":"",s.clearcoat?"#define USE_CLEARCOAT":"",s.clearcoatMap?"#define USE_CLEARCOATMAP":"",s.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",s.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",s.iridescence?"#define USE_IRIDESCENCE":"",s.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",s.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",s.specularMap?"#define USE_SPECULARMAP":"",s.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",s.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",s.roughnessMap?"#define USE_ROUGHNESSMAP":"",s.metalnessMap?"#define USE_METALNESSMAP":"",s.alphaMap?"#define USE_ALPHAMAP":"",s.alphaTest?"#define USE_ALPHATEST":"",s.alphaHash?"#define USE_ALPHAHASH":"",s.sheen?"#define USE_SHEEN":"",s.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",s.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",s.transmission?"#define USE_TRANSMISSION":"",s.transmissionMap?"#define USE_TRANSMISSIONMAP":"",s.thicknessMap?"#define USE_THICKNESSMAP":"",s.vertexTangents&&!1===s.flatShading?"#define USE_TANGENT":"",s.vertexColors||s.instancingColor?"#define USE_COLOR":"",s.vertexAlphas?"#define USE_COLOR_ALPHA":"",s.vertexUv1s?"#define USE_UV1":"",s.vertexUv2s?"#define USE_UV2":"",s.vertexUv3s?"#define USE_UV3":"",s.pointsUvs?"#define USE_POINTS_UV":"",s.gradientMap?"#define USE_GRADIENTMAP":"",s.flatShading?"#define FLAT_SHADED":"",s.doubleSided?"#define DOUBLE_SIDED":"",s.flipSided?"#define FLIP_SIDED":"",s.shadowMapEnabled?"#define USE_SHADOWMAP":"",s.shadowMapEnabled?"#define "+h:"",s.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",s.numLightProbes>0?"#define USE_LIGHT_PROBES":"",s.useLegacyLights?"#define LEGACY_LIGHTS":"",s.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",s.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",s.logarithmicDepthBuffer&&s.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",s.toneMapping!==P?"#define TONE_MAPPING":"",s.toneMapping!==P?$n.tonemapping_pars_fragment:"",s.toneMapping!==P?Ls("toneMapping",s.toneMapping):"",s.dithering?"#define DITHERING":"",s.opaque?"#define OPAQUE":"",$n.colorspace_pars_fragment,Rs("linearToOutputTexel",s.outputColorSpace),s.useDepthPacking?"#define DEPTH_PACKING "+s.depthPacking:"","\n"].filter(ks).join("\n")),c=Bs(c),c=Os(c,s),c=Ns(c,s),u=Bs(u),u=Os(u,s),u=Ns(u,s),c=$s(c),u=$s(u),s.isWebGL2&&!0!==s.isRawShaderMaterial&&(x="#version 300 es\n",v=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+v,b=["precision mediump sampler2DArray;","#define varying in",s.glslVersion===Pe?"":"layout(location = 0) out highp vec4 pc_fragColor;",s.glslVersion===Pe?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+b);const w=x+b+u,S=Ps(o,35633,x+v+c),M=Ps(o,35632,w);function E(t){if(e.debug.checkShaderErrors){const i=o.getProgramInfoLog(y).trim(),n=o.getShaderInfoLog(S).trim(),r=o.getShaderInfoLog(M).trim();let s=!0,a=!0;if(!1===o.getProgramParameter(y,35714))if(s=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(o,y,S,M);else{const e=Ds(o,S,"vertex"),t=Ds(o,M,"fragment");console.error("THREE.WebGLProgram: Shader Error "+o.getError()+" - VALIDATE_STATUS "+o.getProgramParameter(y,35715)+"\n\nProgram Info Log: "+i+"\n"+e+"\n"+t)}else""!==i?console.warn("THREE.WebGLProgram: Program Info Log:",i):""!==n&&""!==r||(a=!1);a&&(t.diagnostics={runnable:s,programLog:i,vertexShader:{log:n,prefix:v},fragmentShader:{log:r,prefix:b}})}o.deleteShader(S),o.deleteShader(M),I=new Ts(o,y),D=function(e,t){const i={},n=e.getProgramParameter(t,35721);for(let r=0;r0,X=a.clearcoat>0,Y=a.iridescence>0,K=a.sheen>0,Z=a.transmission>0,Q=q&&!!a.anisotropyMap,J=X&&!!a.clearcoatMap,ee=X&&!!a.clearcoatNormalMap,te=X&&!!a.clearcoatRoughnessMap,ie=Y&&!!a.iridescenceMap,ne=Y&&!!a.iridescenceThicknessMap,re=K&&!!a.sheenColorMap,se=K&&!!a.sheenRoughnessMap,ae=!!a.specularMap,oe=!!a.specularColorMap,le=!!a.specularIntensityMap,ce=Z&&!!a.transmissionMap,he=Z&&!!a.thicknessMap,de=!!a.gradientMap,fe=!!a.alphaMap,pe=a.alphaTest>0,ge=!!a.alphaHash,_e=!!a.extensions,ye=!!b.attributes.uv1,ve=!!b.attributes.uv2,be=!!b.attributes.uv3;let xe=P;return a.toneMapped&&(null!==L&&!0!==L.isXRRenderTarget||(xe=e.toneMapping)),{isWebGL2:h,shaderID:M,shaderType:a.type,shaderName:a.name,vertexShader:T,fragmentShader:E,defines:a.defines,customVertexShaderID:I,customFragmentShaderID:D,isRawShaderMaterial:!0===a.isRawShaderMaterial,glslVersion:a.glslVersion,precision:m,instancing:k,instancingColor:k&&null!==y.instanceColor,supportsVertexTextures:f,outputColorSpace:null===L?e.outputColorSpace:!0===L.isXRRenderTarget?L.texture.colorSpace:ue,map:O,matcap:F,envMap:B,envMapMode:B&&w.mapping,envMapCubeUVHeight:S,aoMap:z,lightMap:U,bumpMap:V,normalMap:$,displacementMap:f&&G,emissiveMap:H,normalMapObjectSpace:$&&1===a.normalMapType,normalMapTangentSpace:$&&0===a.normalMapType,metalnessMap:j,roughnessMap:W,anisotropy:q,anisotropyMap:Q,clearcoat:X,clearcoatMap:J,clearcoatNormalMap:ee,clearcoatRoughnessMap:te,iridescence:Y,iridescenceMap:ie,iridescenceThicknessMap:ne,sheen:K,sheenColorMap:re,sheenRoughnessMap:se,specularMap:ae,specularColorMap:oe,specularIntensityMap:le,transmission:Z,transmissionMap:ce,thicknessMap:he,gradientMap:de,opaque:!1===a.transparent&&1===a.blending,alphaMap:fe,alphaTest:pe,alphaHash:ge,combine:a.combine,mapUv:O&&g(a.map.channel),aoMapUv:z&&g(a.aoMap.channel),lightMapUv:U&&g(a.lightMap.channel),bumpMapUv:V&&g(a.bumpMap.channel),normalMapUv:$&&g(a.normalMap.channel),displacementMapUv:G&&g(a.displacementMap.channel),emissiveMapUv:H&&g(a.emissiveMap.channel),metalnessMapUv:j&&g(a.metalnessMap.channel),roughnessMapUv:W&&g(a.roughnessMap.channel),anisotropyMapUv:Q&&g(a.anisotropyMap.channel),clearcoatMapUv:J&&g(a.clearcoatMap.channel),clearcoatNormalMapUv:ee&&g(a.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:te&&g(a.clearcoatRoughnessMap.channel),iridescenceMapUv:ie&&g(a.iridescenceMap.channel),iridescenceThicknessMapUv:ne&&g(a.iridescenceThicknessMap.channel),sheenColorMapUv:re&&g(a.sheenColorMap.channel),sheenRoughnessMapUv:se&&g(a.sheenRoughnessMap.channel),specularMapUv:ae&&g(a.specularMap.channel),specularColorMapUv:oe&&g(a.specularColorMap.channel),specularIntensityMapUv:le&&g(a.specularIntensityMap.channel),transmissionMapUv:ce&&g(a.transmissionMap.channel),thicknessMapUv:he&&g(a.thicknessMap.channel),alphaMapUv:fe&&g(a.alphaMap.channel),vertexTangents:!!b.attributes.tangent&&($||q),vertexColors:a.vertexColors,vertexAlphas:!0===a.vertexColors&&!!b.attributes.color&&4===b.attributes.color.itemSize,vertexUv1s:ye,vertexUv2s:ve,vertexUv3s:be,pointsUvs:!0===y.isPoints&&!!b.attributes.uv&&(O||fe),fog:!!v,useFog:!0===a.fog,fogExp2:v&&v.isFogExp2,flatShading:!0===a.flatShading,sizeAttenuation:!0===a.sizeAttenuation,logarithmicDepthBuffer:d,skinning:!0===y.isSkinnedMesh,morphTargets:void 0!==b.morphAttributes.position,morphNormals:void 0!==b.morphAttributes.normal,morphColors:void 0!==b.morphAttributes.color,morphTargetsCount:C,morphTextureStride:R,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:a.dithering,shadowMapEnabled:e.shadowMap.enabled&&u.length>0,shadowMapType:e.shadowMap.type,toneMapping:xe,useLegacyLights:e._useLegacyLights,decodeVideoTexture:O&&!0===a.map.isVideoTexture&&tt.getTransfer(a.map.colorSpace)===me,premultipliedAlpha:a.premultipliedAlpha,doubleSided:2===a.side,flipSided:a.side===s,useDepthPacking:a.depthPacking>=0,depthPacking:a.depthPacking||0,index0AttributeName:a.index0AttributeName,extensionDerivatives:_e&&!0===a.extensions.derivatives,extensionFragDepth:_e&&!0===a.extensions.fragDepth,extensionDrawBuffers:_e&&!0===a.extensions.drawBuffers,extensionShaderTextureLOD:_e&&!0===a.extensions.shaderTextureLOD,rendererExtensionFragDepth:h||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:h||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:h||n.has("EXT_shader_texture_lod"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:a.customProgramCacheKey()}},getProgramCacheKey:function(t){const i=[];if(t.shaderID?i.push(t.shaderID):(i.push(t.customVertexShaderID),i.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)i.push(e),i.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(i,t),function(e,t){l.disableAll(),t.isWebGL2&&l.enable(0);t.supportsVertexTextures&&l.enable(1);t.instancing&&l.enable(2);t.instancingColor&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.skinning&&l.enable(4);t.morphTargets&&l.enable(5);t.morphNormals&&l.enable(6);t.morphColors&&l.enable(7);t.premultipliedAlpha&&l.enable(8);t.shadowMapEnabled&&l.enable(9);t.useLegacyLights&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);e.push(l.mask)}(i,t),i.push(e.outputColorSpace)),i.push(t.customProgramCacheKey),i.join()},getUniforms:function(e){const t=p[e.type];let i;if(t){const e=Hn[t];i=Mn.clone(e.uniforms)}else i=e.uniforms;return i},acquireProgram:function(t,i){let n;for(let e=0,t=u.length;e0?n.push(u):!0===a.transparent?r.push(u):i.push(u)},unshift:function(e,t,a,o,l,c){const u=s(e,t,a,o,l,c);a.transmission>0?n.unshift(u):!0===a.transparent?r.unshift(u):i.unshift(u)},finish:function(){for(let i=t,n=e.length;i1&&i.sort(e||Zs),n.length>1&&n.sort(t||Qs),r.length>1&&r.sort(t||Qs)}}}function ea(){let e=new WeakMap;return{get:function(t,i){const n=e.get(t);let r;return void 0===n?(r=new Js,e.set(t,[r])):i>=n.length?(r=new Js,n.push(r)):r=n[i],r},dispose:function(){e=new WeakMap}}}function ta(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new _t,color:new Oi};break;case"SpotLight":i={position:new _t,direction:new _t,color:new Oi,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new _t,color:new Oi,distance:0,decay:0};break;case"HemisphereLight":i={direction:new _t,skyColor:new Oi,groundColor:new Oi};break;case"RectAreaLight":i={color:new Oi,position:new _t,halfWidth:new _t,halfHeight:new _t}}return e[t.id]=i,i}}}let ia=0;function na(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ra(e,t){const i=new ta,n=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ge};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Ge,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)r.probe.push(new _t);const s=new _t,a=new qt,o=new qt;return{setup:function(s,a){let o=0,l=0,c=0;for(let e=0;e<9;e++)r.probe[e].set(0,0,0);let u=0,h=0,d=0,f=0,m=0,p=0,g=0,_=0,y=0,v=0,b=0;s.sort(na);const x=!0===a?Math.PI:1;for(let e=0,t=s.length;e0&&(t.isWebGL2||!0===e.has("OES_texture_float_linear")?(r.rectAreaLTC1=Gn.LTC_FLOAT_1,r.rectAreaLTC2=Gn.LTC_FLOAT_2):!0===e.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Gn.LTC_HALF_1,r.rectAreaLTC2=Gn.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=l,r.ambient[2]=c;const w=r.hash;w.directionalLength===u&&w.pointLength===h&&w.spotLength===d&&w.rectAreaLength===f&&w.hemiLength===m&&w.numDirectionalShadows===p&&w.numPointShadows===g&&w.numSpotShadows===_&&w.numSpotMaps===y&&w.numLightProbes===b||(r.directional.length=u,r.spot.length=d,r.rectArea.length=f,r.point.length=h,r.hemi.length=m,r.directionalShadow.length=p,r.directionalShadowMap.length=p,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=_,r.spotShadowMap.length=_,r.directionalShadowMatrix.length=p,r.pointShadowMatrix.length=g,r.spotLightMatrix.length=_+y-v,r.spotLightMap.length=y,r.numSpotLightShadowsWithMaps=v,r.numLightProbes=b,w.directionalLength=u,w.pointLength=h,w.spotLength=d,w.rectAreaLength=f,w.hemiLength=m,w.numDirectionalShadows=p,w.numPointShadows=g,w.numSpotShadows=_,w.numSpotMaps=y,w.numLightProbes=b,r.version=ia++)},setupView:function(e,t){let i=0,n=0,l=0,c=0,u=0;const h=t.matrixWorldInverse;for(let t=0,d=e.length;t=s.length?(a=new sa(e,t),s.push(a)):a=s[r],a},dispose:function(){i=new WeakMap}}}class oa extends Bi{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class la extends Bi{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}function ca(e,i,o){let l=new Bn;const c=new Ge,u=new Ge,h=new ht,d=new oa({depthPacking:3201}),f=new la,m={},p=o.maxTextureSize,g={[r]:s,[s]:r,[a]:2},_=new An({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Ge},radius:{value:4}},vertexShader:"void main(){gl_Position=vec4(position,1.0);}",fragmentShader:"uniform sampler2D shadow_pass;uniform vec2 resolution;uniform float radius;\n#include \nvoid main(){const float samples=float(VSM_SAMPLES);float mean=0.0;float squared_mean=0.0;float uvStride=samples<=1.0?0.0:2.0/(samples-1.0);float uvStart=samples<=1.0?0.0:-1.0;for(float i=0.0;i0||i.map&&i.alphaTest>0){const e=a.uuid,t=i.uuid;let n=m[e];void 0===n&&(n={},m[e]=n);let r=n[t];void 0===r&&(r=a.clone(),n[t]=r),a=r}if(a.visible=i.visible,a.wireframe=i.wireframe,a.side=s===n?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:g[i.side],a.alphaMap=i.alphaMap,a.alphaTest=i.alphaTest,a.map=i.map,a.clipShadows=i.clipShadows,a.clippingPlanes=i.clippingPlanes,a.clipIntersection=i.clipIntersection,a.displacementMap=i.displacementMap,a.displacementScale=i.displacementScale,a.displacementBias=i.displacementBias,a.wireframeLinewidth=i.wireframeLinewidth,a.linewidth=i.linewidth,!0===r.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=r}return a}function A(t,r,s,a,o){if(!1===t.visible)return;if(t.layers.test(r.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&o===n)&&(!t.frustumCulled||l.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,t.matrixWorld);const n=i.update(t),r=t.material;if(Array.isArray(r)){const i=n.groups;for(let l=0,c=i.length;lp||c.y>p)&&(c.x>p&&(u.x=Math.floor(p/g.x),c.x=u.x*g.x,o.mapSize.x=u.x),c.y>p&&(u.y=Math.floor(p/g.y),c.y=u.y*g.y,o.mapSize.y=u.y)),null===o.map||!0===f||!0===m){const e=this.type!==n?{minFilter:U,magFilter:U}:{};null!==o.map&&o.map.dispose(),o.map=new ft(c.x,c.y,e),o.map.texture.name=a.name+".shadowMap",o.camera.updateProjectionMatrix()}e.setRenderTarget(o.map),e.clear();const _=o.getViewportCount();for(let e=0;e<_;e++){const t=o.getViewport(e);h.set(u.x*t.x,u.y*t.y,u.x*t.z,u.y*t.w),d.viewport(h),o.updateMatrices(a,e),l=o.getFrustum(),A(i,r,o.camera,a,this.type)}!0!==o.isPointLightShadow&&this.type===n&&S(o,r),o.needsUpdate=!1}w=this.type,x.needsUpdate=!1,e.setRenderTarget(s,a,o)}}function ua(e,t,i){const n=i.isWebGL2;const r=new function(){let t=!1;const i=new ht;let n=null;const r=new ht(0,0,0,0);return{setMask:function(i){n===i||t||(e.colorMask(i,i,i,i),n=i)},setLocked:function(e){t=e},setClear:function(t,n,s,a,o){!0===o&&(t*=a,n*=a,s*=a),i.set(t,n,s,a),!1===r.equals(i)&&(e.clearColor(t,n,s,a),r.copy(i))},reset:function(){t=!1,n=null,r.set(-1,0,0,0)}}},a=new function(){let t=!1,i=null,n=null,r=null;return{setTest:function(e){e?oe(2929):le(2929)},setMask:function(n){i===n||t||(e.depthMask(n),i=n)},setFunc:function(t){if(n!==t){switch(t){case 0:e.depthFunc(512);break;case 1:e.depthFunc(519);break;case 2:e.depthFunc(513);break;case 3:default:e.depthFunc(515);break;case 4:e.depthFunc(514);break;case 5:e.depthFunc(518);break;case 6:e.depthFunc(516);break;case 7:e.depthFunc(517)}n=t}},setLocked:function(e){t=e},setClear:function(t){r!==t&&(e.clearDepth(t),r=t)},reset:function(){t=!1,i=null,n=null,r=null}}},A=new function(){let t=!1,i=null,n=null,r=null,s=null,a=null,o=null,l=null,c=null;return{setTest:function(e){t||(e?oe(2960):le(2960))},setMask:function(n){i===n||t||(e.stencilMask(n),i=n)},setFunc:function(t,i,a){n===t&&r===i&&s===a||(e.stencilFunc(t,i,a),n=t,r=i,s=a)},setOp:function(t,i,n){a===t&&o===i&&l===n||(e.stencilOp(t,i,n),a=t,o=i,l=n)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,i=null,n=null,r=null,s=null,a=null,o=null,l=null,c=null}}},C=new WeakMap,T=new WeakMap;let P={},E={},I=new WeakMap,D=[],R=null,L=!1,k=null,O=null,N=null,F=null,B=null,z=null,U=null,V=new Oi(0,0,0),$=0,G=!1,H=null,j=null,W=null,q=null,X=null;const Y=e.getParameter(35661);let K=!1,Z=0;const Q=e.getParameter(7938);-1!==Q.indexOf("WebGL")?(Z=parseFloat(/^WebGL (\d)/.exec(Q)[1]),K=Z>=1):-1!==Q.indexOf("OpenGL ES")&&(Z=parseFloat(/^OpenGL ES (\d)/.exec(Q)[1]),K=Z>=2);let J=null,ee={};const te=e.getParameter(3088),ie=e.getParameter(2978),ne=(new ht).fromArray(te),re=(new ht).fromArray(ie);function se(t,i,r,s){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,10241,9728),e.texParameteri(t,10240,9728);for(let o=0;on||e.height>n)&&(r=n/Math.max(e.width,e.height)),r<1||!0===t){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const n=t?Ue:Math.floor,s=n(r*e.width),a=n(r*e.height);void 0===p&&(p=y(s,a));const o=i?y(s,a):p;o.width=s,o.height=a;return o.getContext("2d").drawImage(e,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+e.width+"x"+e.height+") to ("+s+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+e.width+"x"+e.height+")."),e}return e}function b(e){return ze(e.width)&&ze(e.height)}function x(e,t){return e.generateMipmaps&&t&&e.minFilter!==U&&e.minFilter!==G}function w(t){e.generateMipmap(t)}function S(i,n,r,s,a=!1){if(!1===o)return n;if(null!==i){if(void 0!==e[i])return e[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let l=n;if(6403===n&&(5126===r&&(l=33326),5131===r&&(l=33325),5121===r&&(l=33321)),36244===n&&(5121===r&&(l=33330),5123===r&&(l=33332),5125===r&&(l=33334),5120===r&&(l=33329),5122===r&&(l=33331),5124===r&&(l=33333)),33319===n&&(5126===r&&(l=33328),5131===r&&(l=33327),5121===r&&(l=33323)),6408===n){const e=a?fe:tt.getTransfer(s);5126===r&&(l=34836),5131===r&&(l=34842),5121===r&&(l=e===me?35907:32856),32819===r&&(l=32854),32820===r&&(l=32855)}return 33325!==l&&33326!==l&&33327!==l&&33328!==l&&34842!==l&&34836!==l||t.get("EXT_color_buffer_float"),l}function M(e,t,i){return!0===x(e,i)||e.isFramebufferTexture&&e.minFilter!==U&&e.minFilter!==G?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function A(e){return e===U||1004===e||e===$?9728:9729}function C(e){const t=e.target;t.removeEventListener("dispose",C),function(e){const t=n.get(e);if(void 0===t.__webglInit)return;const i=e.source,r=g.get(i);if(r){const n=r[t.__cacheKey];n.usedTimes--,0===n.usedTimes&&P(e),0===Object.keys(r).length&&g.delete(i)}n.remove(e)}(t),t.isVideoTexture&&m.delete(t)}function T(t){const i=t.target;i.removeEventListener("dispose",T),function(t){const i=t.texture,r=n.get(t),s=n.get(i);void 0!==s.__webglTexture&&(e.deleteTexture(s.__webglTexture),a.memory.textures--);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(r.__webglFramebuffer[t]))for(let i=0;i0&&r.__version!==e.version){const i=e.image;if(null===i)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==i.complete)return void N(r,e,t);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.bindTexture(3553,r.__webglTexture,33984+t)}const D={[F]:10497,[B]:33071,[z]:33648},R={[U]:9728,[V]:9984,[$]:9986,[G]:9729,[H]:9985,[j]:9987},L={[ye]:512,[Ae]:519,[ve]:513,[xe]:515,[be]:514,[Me]:518,[we]:516,[Se]:517};function k(i,s,a){if(a?(e.texParameteri(i,10242,D[s.wrapS]),e.texParameteri(i,10243,D[s.wrapT]),32879!==i&&35866!==i||e.texParameteri(i,32882,D[s.wrapR]),e.texParameteri(i,10240,R[s.magFilter]),e.texParameteri(i,10241,R[s.minFilter])):(e.texParameteri(i,10242,33071),e.texParameteri(i,10243,33071),32879!==i&&35866!==i||e.texParameteri(i,32882,33071),s.wrapS===B&&s.wrapT===B||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),e.texParameteri(i,10240,A(s.magFilter)),e.texParameteri(i,10241,A(s.minFilter)),s.minFilter!==U&&s.minFilter!==G&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),s.compareFunction&&(e.texParameteri(i,34892,34894),e.texParameteri(i,34893,L[s.compareFunction])),!0===t.has("EXT_texture_filter_anisotropic")){const a=t.get("EXT_texture_filter_anisotropic");if(s.magFilter===U)return;if(s.minFilter!==$&&s.minFilter!==j)return;if(s.type===K&&!1===t.has("OES_texture_float_linear"))return;if(!1===o&&s.type===Z&&!1===t.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(e.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function O(t,i){let n=!1;void 0===t.__webglInit&&(t.__webglInit=!0,i.addEventListener("dispose",C));const r=i.source;let s=g.get(r);void 0===s&&(s={},g.set(r,s));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(i);if(o!==t.__cacheKey){void 0===s[o]&&(s[o]={texture:e.createTexture(),usedTimes:0},a.memory.textures++,n=!0),s[o].usedTimes++;const r=s[t.__cacheKey];void 0!==r&&(s[t.__cacheKey].usedTimes--,0===r.usedTimes&&P(i)),t.__cacheKey=o,t.__webglTexture=s[o].texture}return n}function N(t,r,a){let l=3553;(r.isDataArrayTexture||r.isCompressedArrayTexture)&&(l=35866),r.isData3DTexture&&(l=32879);const c=O(t,r),h=r.source;i.bindTexture(l,t.__webglTexture,33984+a);const d=n.get(h);if(h.version!==d.__version||!0===c){i.activeTexture(33984+a);const t=tt.getPrimaries(tt.workingColorSpace),n=r.colorSpace===le?null:tt.getPrimaries(r.colorSpace),f=r.colorSpace===le||t===n?0:37444;e.pixelStorei(37440,r.flipY),e.pixelStorei(37441,r.premultiplyAlpha),e.pixelStorei(3317,r.unpackAlignment),e.pixelStorei(37443,f);const m=function(e){return!o&&(e.wrapS!==B||e.wrapT!==B||e.minFilter!==U&&e.minFilter!==G)}(r)&&!1===b(r.image);let p=v(r.image,m,!1,u);p=ae(r,p);const g=b(p)||o,_=s.convert(r.format,r.colorSpace);let y,A=s.convert(r.type),C=S(r.internalFormat,_,A,r.colorSpace,r.isVideoTexture);k(l,r,g);const T=r.mipmaps,P=o&&!0!==r.isVideoTexture,E=void 0===d.__version||!0===c,I=M(r,p,g);if(r.isDepthTexture)C=6402,o?C=r.type===K?36012:r.type===Y?33190:r.type===Q?35056:33189:r.type===K&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),r.format===ee&&6402===C&&r.type!==q&&r.type!==Y&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),r.type=Y,A=s.convert(r.type)),r.format===te&&6402===C&&(C=34041,r.type!==Q&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),r.type=Q,A=s.convert(r.type))),E&&(P?i.texStorage2D(3553,1,C,p.width,p.height):i.texImage2D(3553,0,C,p.width,p.height,0,_,A,null));else if(r.isDataTexture)if(T.length>0&&g){P&&E&&i.texStorage2D(3553,I,C,T[0].width,T[0].height);for(let e=0,t=T.length;e>=1,t>>=1}}else if(T.length>0&&g){P&&E&&i.texStorage2D(3553,I,C,T[0].width,T[0].height);for(let e=0,t=T.length;e>c),t=Math.max(1,r.height>>c);32879===l||35866===l?i.texImage3D(l,c,f,e,t,r.depth,0,u,h,null):i.texImage2D(l,c,f,e,t,0,u,h,null)}i.bindFramebuffer(36160,t),se(r)?d.framebufferTexture2DMultisampleEXT(36160,o,l,n.get(a).__webglTexture,0,re(r)):(3553===l||l>=34069&&l<=34074)&&e.framebufferTexture2D(36160,o,l,n.get(a).__webglTexture,c),i.bindFramebuffer(36160,null)}function ie(t,i,n){if(e.bindRenderbuffer(36161,t),i.depthBuffer&&!i.stencilBuffer){let r=!0===o?33190:33189;if(n||se(i)){const t=i.depthTexture;t&&t.isDepthTexture&&(t.type===K?r=36012:t.type===Y&&(r=33190));const n=re(i);se(i)?d.renderbufferStorageMultisampleEXT(36161,n,r,i.width,i.height):e.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else e.renderbufferStorage(36161,r,i.width,i.height);e.framebufferRenderbuffer(36160,36096,36161,t)}else if(i.depthBuffer&&i.stencilBuffer){const r=re(i);n&&!1===se(i)?e.renderbufferStorageMultisample(36161,r,35056,i.width,i.height):se(i)?d.renderbufferStorageMultisampleEXT(36161,r,35056,i.width,i.height):e.renderbufferStorage(36161,34041,i.width,i.height),e.framebufferRenderbuffer(36160,33306,36161,t)}else{const t=!0===i.isWebGLMultipleRenderTargets?i.texture:[i.texture];for(let r=0;r0&&!0===t.has("WEBGL_multisampled_render_to_texture")&&!1!==i.__useRenderToTexture}function ae(e,i){const n=e.colorSpace,r=e.format,s=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||e.format===Ee||n!==ue&&n!==le&&(tt.getTransfer(n)===me?!1===o?!0===t.has("EXT_sRGB")&&r===J?(e.format=Ee,e.minFilter=G,e.generateMipmaps=!1):i=st.sRGBToLinear(i):r===J&&s===W||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),i}this.allocateTextureUnit=function(){const e=E;return e>=l&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+l),E+=1,e},this.resetTextureUnits=function(){E=0},this.setTexture2D=I,this.setTexture2DArray=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?N(r,e,t):i.bindTexture(35866,r.__webglTexture,33984+t)},this.setTexture3D=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?N(r,e,t):i.bindTexture(32879,r.__webglTexture,33984+t)},this.setTextureCube=function(t,r){const a=n.get(t);t.version>0&&a.__version!==t.version?function(t,r,a){if(6!==r.image.length)return;const l=O(t,r),u=r.source;i.bindTexture(34067,t.__webglTexture,33984+a);const h=n.get(u);if(u.version!==h.__version||!0===l){i.activeTexture(33984+a);const t=tt.getPrimaries(tt.workingColorSpace),n=r.colorSpace===le?null:tt.getPrimaries(r.colorSpace),d=r.colorSpace===le||t===n?0:37444;e.pixelStorei(37440,r.flipY),e.pixelStorei(37441,r.premultiplyAlpha),e.pixelStorei(3317,r.unpackAlignment),e.pixelStorei(37443,d);const f=r.isCompressedTexture||r.image[0].isCompressedTexture,m=r.image[0]&&r.image[0].isDataTexture,p=[];for(let e=0;e<6;e++)p[e]=f||m?m?r.image[e].image:r.image[e]:v(r.image[e],!1,!0,c),p[e]=ae(r,p[e]);const g=p[0],_=b(g)||o,y=s.convert(r.format,r.colorSpace),A=s.convert(r.type),C=S(r.internalFormat,y,A,r.colorSpace),T=o&&!0!==r.isVideoTexture,P=void 0===h.__version||!0===l;let E,I=M(r,g,_);if(k(34067,r,_),f){T&&P&&i.texStorage2D(34067,I,C,g.width,g.height);for(let e=0;e<6;e++){E=p[e].mipmaps;for(let t=0;t0&&I++,i.texStorage2D(34067,I,C,p[0].width,p[0].height));for(let e=0;e<6;e++)if(m){T?i.texSubImage2D(34069+e,0,0,0,p[e].width,p[e].height,y,A,p[e].data):i.texImage2D(34069+e,0,C,p[e].width,p[e].height,0,y,A,p[e].data);for(let t=0;t0){c.__webglFramebuffer[t]=[];for(let i=0;i0){c.__webglFramebuffer=[];for(let t=0;t0&&!1===se(t)){const n=d?l:[l];c.__webglMultisampledFramebuffer=e.createFramebuffer(),c.__webglColorRenderbuffer=[],i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer);for(let i=0;i0)for(let i=0;i0)for(let i=0;i0&&!1===se(t)){const r=t.isWebGLMultipleRenderTargets?t.texture:[t.texture],s=t.width,a=t.height;let o=16384;const l=[],c=t.stencilBuffer?33306:36096,u=n.get(t),h=!0===t.isWebGLMultipleRenderTargets;if(h)for(let t=0;to+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else null!==o&&e.gripSpace&&(r=t.getPose(e.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(n=t.getPose(e.targetRaySpace,i),null===n&&null!==r&&(n=r),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(pa)))}return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}_getHandJoint(e,t){if(void 0===e.joints[t.jointName]){const i=new ma;i.matrixAutoUpdate=!1,i.visible=!1,e.joints[t.jointName]=i,e.add(i)}return e.joints[t.jointName]}}class _a extends ut{constructor(e,t,i,n,r,s,a,o,l,c){if((c=void 0!==c?c:ee)!==ee&&c!==te)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===ee&&(i=Y),void 0===i&&c===te&&(i=Q),super(null,n,r,s,a,o,c,i,l),this.isDepthTexture=!0,this.image={width:e,height:t},this.magFilter=void 0!==a?a:U,this.minFilter=void 0!==o?o:U,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return null!==this.compareFunction&&(t.compareFunction=this.compareFunction),t}}class ya extends Re{constructor(e,t){super();const i=this;let n=null,r=1,s=null,a="local-floor",o=1,l=null,c=null,u=null,h=null,d=null,f=null;const m=t.getContextAttributes();let p=null,g=null;const _=[],y=[],v=new Tn;v.layers.enable(1),v.viewport=new ht;const b=new Tn;b.layers.enable(2),b.viewport=new ht;const x=[v,b],w=new fa;w.layers.enable(1),w.layers.enable(2);let S=null,M=null;function A(e){const t=y.indexOf(e.inputSource);if(-1===t)return;const i=_[t];void 0!==i&&(i.update(e.inputSource,e.frame,l||s),i.dispatchEvent({type:e.type,data:e.inputSource}))}function C(){n.removeEventListener("select",A),n.removeEventListener("selectstart",A),n.removeEventListener("selectend",A),n.removeEventListener("squeeze",A),n.removeEventListener("squeezestart",A),n.removeEventListener("squeezeend",A),n.removeEventListener("end",C),n.removeEventListener("inputsourceschange",T);for(let e=0;e<_.length;e++){const t=y[e];null!==t&&(y[e]=null,_[e].disconnect(t))}S=null,M=null,e.setRenderTarget(p),d=null,h=null,u=null,n=null,g=null,R.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function T(e){for(let t=0;t=0&&(y[n]=null,_[n].disconnect(i))}for(let t=0;t=y.length){y.push(i),n=e;break}if(null===y[e]){y[e]=i,n=e;break}}if(-1===n)break}const r=_[n];r&&r.connect(i)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=_[e];return void 0===t&&(t=new ga,_[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=_[e];return void 0===t&&(t=new ga,_[e]=t),t.getGripSpace()},this.getHand=function(e){let t=_[e];return void 0===t&&(t=new ga,_[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){r=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){a=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return l||s},this.setReferenceSpace=function(e){l=e},this.getBaseLayer=function(){return null!==h?h:d},this.getBinding=function(){return u},this.getFrame=function(){return f},this.getSession=function(){return n},this.setSession=async function(c){if(n=c,null!==n){if(p=e.getRenderTarget(),n.addEventListener("select",A),n.addEventListener("selectstart",A),n.addEventListener("selectend",A),n.addEventListener("squeeze",A),n.addEventListener("squeezestart",A),n.addEventListener("squeezeend",A),n.addEventListener("end",C),n.addEventListener("inputsourceschange",T),!0!==m.xrCompatible&&await t.makeXRCompatible(),void 0===n.renderState.layers||!1===e.capabilities.isWebGL2){const i={antialias:void 0!==n.renderState.layers||m.antialias,alpha:!0,depth:m.depth,stencil:m.stencil,framebufferScaleFactor:r};d=new XRWebGLLayer(n,t,i),n.updateRenderState({baseLayer:d}),g=new ft(d.framebufferWidth,d.framebufferHeight,{format:J,type:W,colorSpace:e.outputColorSpace,stencilBuffer:m.stencil})}else{let i=null,s=null,a=null;m.depth&&(a=m.stencil?35056:33190,i=m.stencil?te:ee,s=m.stencil?Q:Y);const o={colorFormat:32856,depthFormat:a,scaleFactor:r};u=new XRWebGLBinding(n,t),h=u.createProjectionLayer(o),n.updateRenderState({layers:[h]}),g=new ft(h.textureWidth,h.textureHeight,{format:J,type:W,depthTexture:new _a(h.textureWidth,h.textureHeight,s,void 0,void 0,void 0,void 0,void 0,void 0,i),stencilBuffer:m.stencil,colorSpace:e.outputColorSpace,samples:m.antialias?4:0});e.properties.get(g).__ignoreDepthValues=h.ignoreDepthValues}g.isXRRenderTarget=!0,this.setFoveation(o),l=null,s=await n.requestReferenceSpace(a),R.setContext(n),R.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==n)return n.environmentBlendMode};const P=new _t,E=new _t;function I(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===n)return;w.near=b.near=v.near=e.near,w.far=b.far=v.far=e.far,S===w.near&&M===w.far||(n.updateRenderState({depthNear:w.near,depthFar:w.far}),S=w.near,M=w.far);const t=e.parent,i=w.cameras;I(w,t);for(let e=0;e0&&(n.alphaTest.value=r.alphaTest);const a=t.get(r).envMap;if(a&&(n.envMap.value=a,n.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,n.reflectivity.value=r.reflectivity,n.ior.value=r.ior,n.refractionRatio.value=r.refractionRatio),r.lightMap){n.lightMap.value=r.lightMap;const t=!0===e._useLegacyLights?Math.PI:1;n.lightMapIntensity.value=r.lightMapIntensity*t,i(r.lightMap,n.lightMapTransform)}r.aoMap&&(n.aoMap.value=r.aoMap,n.aoMapIntensity.value=r.aoMapIntensity,i(r.aoMap,n.aoMapTransform))}return{refreshFogUniforms:function(t,i){i.color.getRGB(t.fogColor.value,Sn(e)),i.isFog?(t.fogNear.value=i.near,t.fogFar.value=i.far):i.isFogExp2&&(t.fogDensity.value=i.density)},refreshMaterialUniforms:function(e,r,a,o,l){r.isMeshBasicMaterial||r.isMeshLambertMaterial?n(e,r):r.isMeshToonMaterial?(n(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(n(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(n(e,r),function(e,n){e.metalness.value=n.metalness,n.metalnessMap&&(e.metalnessMap.value=n.metalnessMap,i(n.metalnessMap,e.metalnessMapTransform));e.roughness.value=n.roughness,n.roughnessMap&&(e.roughnessMap.value=n.roughnessMap,i(n.roughnessMap,e.roughnessMapTransform));const r=t.get(n).envMap;r&&(e.envMapIntensity.value=n.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,n){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,i(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,i(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,i(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,i(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,i(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===s&&e.clearcoatNormalScale.value.negate()));t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,i(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,i(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=n.texture,e.transmissionSamplerSize.value.set(n.width,n.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,i(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,i(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,i(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,i(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,i(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,l)):r.isMeshMatcapMaterial?(n(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?n(e,r):r.isMeshDistanceMaterial?(n(e,r),function(e,i){const n=t.get(i).light;e.referencePosition.value.setFromMatrixPosition(n.matrixWorld),e.nearDistance.value=n.shadow.camera.near,e.farDistance.value=n.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?n(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,i(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,n,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*n,e.scale.value=.5*r,t.map&&(e.map.value=t.map,i(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,i(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,i(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,i(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function ba(e,t,i,n){let r={},s={},a=[];const o=i.isWebGL2?e.getParameter(35375):0;function l(e,t,i){const n=e.value;if(void 0===i[t]){if("number"==typeof n)i[t]=n;else{const e=Array.isArray(n)?n:[n],r=[];for(let t=0;t0){r=i%n;0!==r&&n-r-a.boundary<0&&(i+=n-r,s.__offset=i)}i+=a.storage}r=i%n,r>0&&(i+=n-r);e.__size=i,e.__cache={}}(i),d=function(t){const i=function(){for(let e=0;e0),h=!!i.morphAttributes.position,d=!!i.morphAttributes.normal,f=!!i.morphAttributes.color;let m=P;n.toneMapped&&(null!==M&&!0!==M.isXRRenderTarget||(m=b.toneMapping));const p=i.morphAttributes.position||i.morphAttributes.normal||i.morphAttributes.color,g=void 0!==p?p.length:0,y=le.get(n),v=_.state.lights;if(!0===$&&(!0===G||e!==C)){const t=e===C&&n.id===A;xe.setState(n,e,t)}let x=!1;n.version===y.__version?y.needsLights&&y.lightsStateVersion!==v.state.version||y.outputColorSpace!==o||r.isInstancedMesh&&!1===y.instancing?x=!0:r.isInstancedMesh||!0!==y.instancing?r.isSkinnedMesh&&!1===y.skinning?x=!0:r.isSkinnedMesh||!0!==y.skinning?r.isInstancedMesh&&!0===y.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===y.instancingColor&&null!==r.instanceColor||y.envMap!==l||!0===n.fog&&y.fog!==s?x=!0:void 0===y.numClippingPlanes||y.numClippingPlanes===xe.numPlanes&&y.numIntersection===xe.numIntersection?(y.vertexAlphas!==c||y.vertexTangents!==u||y.morphTargets!==h||y.morphNormals!==d||y.morphColors!==f||y.toneMapping!==m||!0===se.isWebGL2&&y.morphTargetsCount!==g)&&(x=!0):x=!0:x=!0:x=!0:(x=!0,y.__version=n.version);let w=y.currentProgram;!0===x&&(w=Ke(n,t,r));let S=!1,T=!1,E=!1;const I=w.getUniforms(),D=y.uniforms;ae.useProgram(w.program)&&(S=!0,T=!0,E=!0);n.id!==A&&(A=n.id,T=!0);if(S||C!==e){I.setValue(Ie,"projectionMatrix",e.projectionMatrix),I.setValue(Ie,"viewMatrix",e.matrixWorldInverse);const t=I.map.cameraPosition;void 0!==t&&t.setValue(Ie,te.setFromMatrixPosition(e.matrixWorld)),se.logarithmicDepthBuffer&&I.setValue(Ie,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&I.setValue(Ie,"isOrthographic",!0===e.isOrthographicCamera),C!==e&&(C=e,T=!0,E=!0)}if(r.isSkinnedMesh){I.setOptional(Ie,r,"bindMatrix"),I.setOptional(Ie,r,"bindMatrixInverse");const e=r.skeleton;e&&(se.floatVertexTextures?(null===e.boneTexture&&e.computeBoneTexture(),I.setValue(Ie,"boneTexture",e.boneTexture,he),I.setValue(Ie,"boneTextureSize",e.boneTextureSize)):console.warn("THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required."))}const R=i.morphAttributes;(void 0!==R.position||void 0!==R.normal||void 0!==R.color&&!0===se.isWebGL2)&&Me.update(r,i,w);(T||y.receiveShadow!==r.receiveShadow)&&(y.receiveShadow=r.receiveShadow,I.setValue(Ie,"receiveShadow",r.receiveShadow));n.isMeshGouraudMaterial&&null!==n.envMap&&(D.envMap.value=l,D.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);T&&(I.setValue(Ie,"toneMappingExposure",b.toneMappingExposure),y.needsLights&&(N=E,(L=D).ambientLightColor.needsUpdate=N,L.lightProbe.needsUpdate=N,L.directionalLights.needsUpdate=N,L.directionalLightShadows.needsUpdate=N,L.pointLights.needsUpdate=N,L.pointLightShadows.needsUpdate=N,L.spotLights.needsUpdate=N,L.spotLightShadows.needsUpdate=N,L.rectAreaLights.needsUpdate=N,L.hemisphereLights.needsUpdate=N),s&&!0===n.fog&&ye.refreshFogUniforms(D,s),ye.refreshMaterialUniforms(D,n,O,k,H),Ts.upload(Ie,Ze(y),D,he));var L,N;n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(Ts.upload(Ie,Ze(y),D,he),n.uniformsNeedUpdate=!1);n.isSpriteMaterial&&I.setValue(Ie,"center",r.center);if(I.setValue(Ie,"modelViewMatrix",r.modelViewMatrix),I.setValue(Ie,"normalMatrix",r.normalMatrix),I.setValue(Ie,"modelMatrix",r.matrixWorld),n.isShaderMaterial||n.isRawShaderMaterial){const e=n.uniformsGroups;for(let t=0,i=e.length;t{function i(){n.forEach((function(e){le.get(e).currentProgram.isReady()&&n.delete(e)})),0!==n.size?setTimeout(i,10):t(e)}null!==re.get("KHR_parallel_shader_compile")?i():setTimeout(i,10)}))};let ze=null;function Ve(){He.stop()}function $e(){He.start()}const He=new zn;function je(e,t,i,n){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)i=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)_.pushLight(e),e.castShadow&&_.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||V.intersectsSprite(e)){n&&te.setFromMatrixPosition(e.matrixWorld).applyMatrix4(X);const t=ge.update(e),r=e.material;r.visible&&g.push(e,t,r,i,te.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||V.intersectsObject(e))){const t=ge.update(e),r=e.material;if(n&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),te.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),te.copy(t.boundingSphere.center)),te.applyMatrix4(e.matrixWorld).applyMatrix4(X)),Array.isArray(r)){const n=t.groups;for(let s=0,a=n.length;s0&&function(e,t,i,n){const r=!0===i.isScene?i.overrideMaterial:null;if(null!==r)return;const a=se.isWebGL2;null===H&&(H=new ft(1,1,{generateMipmaps:!0,type:re.has("EXT_color_buffer_half_float")?Z:W,minFilter:j,samples:a?4:0}));b.getDrawingBufferSize(ee),a?H.setSize(ee.x,ee.y):H.setSize(Ue(ee.x),Ue(ee.y));const o=b.getRenderTarget();b.setRenderTarget(H),b.getClearColor(D),R=b.getClearAlpha(),R<1&&b.setClearColor(16777215,.5);b.clear();const l=b.toneMapping;b.toneMapping=P,qe(e,i,n),he.updateMultisampleRenderTarget(H),he.updateRenderTargetMipmap(H);let c=!1;for(let e=0,r=t.length;e0&&qe(r,t,i),a.length>0&&qe(a,t,i),o.length>0&&qe(o,t,i),ae.buffers.depth.setTest(!0),ae.buffers.depth.setMask(!0),ae.buffers.color.setMask(!0),ae.setPolygonOffset(!1)}function qe(e,t,i){const n=!0===t.isScene?t.overrideMaterial:null;for(let r=0,s=e.length;r0?v[v.length-1]:null,y.pop(),g=y.length>0?y[y.length-1]:null},this.getActiveCubeFace=function(){return w},this.getActiveMipmapLevel=function(){return S},this.getRenderTarget=function(){return M},this.setRenderTargetTextures=function(e,t,i){le.get(e.texture).__webglTexture=t,le.get(e.depthTexture).__webglTexture=i;const n=le.get(e);n.__hasExternalTextures=!0,n.__hasExternalTextures&&(n.__autoAllocateDepthBuffer=void 0===i,n.__autoAllocateDepthBuffer||!0===re.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),n.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(e,t){const i=le.get(e);i.__webglFramebuffer=t,i.__useDefaultFramebuffer=void 0===t},this.setRenderTarget=function(e,t=0,i=0){M=e,w=t,S=i;let n=!0,r=null,s=!1,a=!1;if(e){const o=le.get(e);void 0!==o.__useDefaultFramebuffer?(ae.bindFramebuffer(36160,null),n=!1):void 0===o.__webglFramebuffer?he.setupRenderTarget(e):o.__hasExternalTextures&&he.rebindTextures(e,le.get(e.texture).__webglTexture,le.get(e.depthTexture).__webglTexture);const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(a=!0);const c=le.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][i]:c[t],s=!0):r=se.isWebGL2&&e.samples>0&&!1===he.useMultisampledRTT(e)?le.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[i]:c,T.copy(e.viewport),E.copy(e.scissor),I=e.scissorTest}else T.copy(B).multiplyScalar(O).floor(),E.copy(z).multiplyScalar(O).floor(),I=U;if(ae.bindFramebuffer(36160,r)&&se.drawBuffers&&n&&ae.drawBuffers(e,r),ae.viewport(T),ae.scissor(E),ae.setScissorTest(I),s){const n=le.get(e.texture);Ie.framebufferTexture2D(36160,36064,34069+t,n.__webglTexture,i)}else if(a){const n=le.get(e.texture),r=t||0;Ie.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}A=-1},this.readRenderTargetPixels=function(e,t,i,n,r,s,a){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=le.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){ae.bindFramebuffer(36160,o);try{const a=e.texture,o=a.format,l=a.type;if(o!==J&&Te.convert(o)!==Ie.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===Z&&(re.has("EXT_color_buffer_half_float")||se.isWebGL2&&re.has("EXT_color_buffer_float"));if(!(l===W||Te.convert(l)===Ie.getParameter(35738)||l===K&&(se.isWebGL2||re.has("OES_texture_float")||re.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-n&&i>=0&&i<=e.height-r&&Ie.readPixels(t,i,n,r,Te.convert(o),Te.convert(l),s)}finally{const e=null!==M?le.get(M).__webglFramebuffer:null;ae.bindFramebuffer(36160,e)}}},this.copyFramebufferToTexture=function(e,t,i=0){const n=Math.pow(2,-i),r=Math.floor(t.image.width*n),s=Math.floor(t.image.height*n);he.setTexture2D(t,0),Ie.copyTexSubImage2D(3553,i,0,0,e.x,e.y,r,s),ae.unbindTexture()},this.copyTextureToTexture=function(e,t,i,n=0){const r=t.image.width,s=t.image.height,a=Te.convert(i.format),o=Te.convert(i.type);he.setTexture2D(i,0),Ie.pixelStorei(37440,i.flipY),Ie.pixelStorei(37441,i.premultiplyAlpha),Ie.pixelStorei(3317,i.unpackAlignment),t.isDataTexture?Ie.texSubImage2D(3553,n,e.x,e.y,r,s,a,o,t.image.data):t.isCompressedTexture?Ie.compressedTexSubImage2D(3553,n,e.x,e.y,t.mipmaps[0].width,t.mipmaps[0].height,a,t.mipmaps[0].data):Ie.texSubImage2D(3553,n,e.x,e.y,a,o,t.image),0===n&&i.generateMipmaps&&Ie.generateMipmap(3553),ae.unbindTexture()},this.copyTextureToTexture3D=function(e,t,i,n,r=0){if(b.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=e.max.x-e.min.x+1,a=e.max.y-e.min.y+1,o=e.max.z-e.min.z+1,l=Te.convert(n.format),c=Te.convert(n.type);let u;if(n.isData3DTexture)he.setTexture3D(n,0),u=32879;else{if(!n.isDataArrayTexture)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");he.setTexture2DArray(n,0),u=35866}Ie.pixelStorei(37440,n.flipY),Ie.pixelStorei(37441,n.premultiplyAlpha),Ie.pixelStorei(3317,n.unpackAlignment);const h=Ie.getParameter(3314),d=Ie.getParameter(32878),f=Ie.getParameter(3316),m=Ie.getParameter(3315),p=Ie.getParameter(32877),g=i.isCompressedTexture?i.mipmaps[0]:i.image;Ie.pixelStorei(3314,g.width),Ie.pixelStorei(32878,g.height),Ie.pixelStorei(3316,e.min.x),Ie.pixelStorei(3315,e.min.y),Ie.pixelStorei(32877,e.min.z),i.isDataTexture||i.isData3DTexture?Ie.texSubImage3D(u,r,t.x,t.y,t.z,s,a,o,l,c,g.data):i.isCompressedArrayTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),Ie.compressedTexSubImage3D(u,r,t.x,t.y,t.z,s,a,o,l,g.data)):Ie.texSubImage3D(u,r,t.x,t.y,t.z,s,a,o,l,c,g),Ie.pixelStorei(3314,h),Ie.pixelStorei(32878,d),Ie.pixelStorei(3316,f),Ie.pixelStorei(3315,m),Ie.pixelStorei(32877,p),0===r&&n.generateMipmaps&&Ie.generateMipmap(u),ae.unbindTexture()},this.initTexture=function(e){e.isCubeTexture?he.setTextureCube(e,0):e.isData3DTexture?he.setTexture3D(e,0):e.isDataArrayTexture||e.isCompressedArrayTexture?he.setTexture2DArray(e,0):he.setTexture2D(e,0),ae.unbindTexture()},this.resetState=function(){w=0,S=0,M=null,ae.reset(),Pe.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return Ie}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(e){this._outputColorSpace=e;const t=this.getContext();t.drawingBufferColorSpace=e===he?"display-p3":"srgb",t.unpackColorSpace=tt.workingColorSpace===de?"display-p3":"srgb"}get physicallyCorrectLights(){return console.warn("THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),!this.useLegacyLights}set physicallyCorrectLights(e){console.warn("THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead."),this.useLegacyLights=!e}get outputEncoding(){return console.warn("THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead."),this.outputColorSpace===ce?oe:3e3}set outputEncoding(e){console.warn("THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead."),this.outputColorSpace=e===oe?ce:ue}get useLegacyLights(){return console.warn("THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733."),this._useLegacyLights}set useLegacyLights(e){console.warn("THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733."),this._useLegacyLights=e}}class wa{constructor(e,t=1,i=1e3){this.isFog=!0,this.name="",this.color=new Oi(e),this.near=t,this.far=i}clone(){return new wa(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Sa extends yi{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return null!==this.fog&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(t.object.backgroundIntensity=this.backgroundIntensity),t}}class Ma extends ut{constructor(e=null,t=1,i=1,n,r,s,a,o,l=1003,c=1003,u,h){super(null,s,a,o,l,c,n,r,u,h),this.isDataTexture=!0,this.image={data:e,width:t,height:i},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Aa extends Bi{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Oi(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const Ca=new _t,Ta=new _t,Pa=new qt,Ea=new Wt,Ia=new Bt;class Da extends yi{constructor(e=new Ji,t=new Aa){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(null===e.index){const t=e.attributes.position,i=[0];for(let e=1,n=t.count;eo)continue;h.applyMatrix4(this.matrixWorld);const s=e.ray.origin.distanceTo(h);se.far||t.push({distance:s,point:u.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(m.count,s.start+s.count)-1;io)continue;h.applyMatrix4(this.matrixWorld);const n=e.ray.origin.distanceTo(h);ne.far||t.push({distance:n,point:u.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){const e=this.geometry.morphAttributes,t=Object.keys(e);if(t.length>0){const i=e[t[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=i.length;e0){const i=e[t[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,t=i.length;er.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:i,index:t,face:null,object:a})}}class $a extends ut{constructor(e,t,i,n,r,s,a,o,l){super(e,t,i,n,r,s,a,o,l),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Ga extends Ji{constructor(e=1,t=1,i=1,n=32,r=1,s=!1,a=0,o=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:e,radiusBottom:t,height:i,radialSegments:n,heightSegments:r,openEnded:s,thetaStart:a,thetaLength:o};const l=this;n=Math.floor(n),r=Math.floor(r);const c=[],u=[],h=[],d=[];let f=0;const m=[],p=i/2;let g=0;function _(i){const r=f,s=new Ge,m=new _t;let _=0;const y=!0===i?e:t,v=!0===i?1:-1;for(let e=1;e<=n;e++)u.push(0,p*v,0),h.push(0,v,0),d.push(.5,.5),f++;const b=f;for(let e=0;e<=n;e++){const t=e/n*o+a,i=Math.cos(t),r=Math.sin(t);m.x=y*r,m.y=p*v,m.z=y*i,u.push(m.x,m.y,m.z),h.push(0,v,0),s.x=.5*i+.5,s.y=.5*r*v+.5,d.push(s.x,s.y),f++}for(let e=0;e0&&_(!0),t>0&&_(!1)),this.setIndex(c),this.setAttribute("position",new ji(u,3)),this.setAttribute("normal",new ji(h,3)),this.setAttribute("uv",new ji(d,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new Ga(e.radiusTop,e.radiusBottom,e.height,e.radialSegments,e.heightSegments,e.openEnded,e.thetaStart,e.thetaLength)}}class Ha extends Ga{constructor(e=1,t=1,i=32,n=1,r=!1,s=0,a=2*Math.PI){super(0,e,t,i,n,r,s,a),this.type="ConeGeometry",this.parameters={radius:e,height:t,radialSegments:i,heightSegments:n,openEnded:r,thetaStart:s,thetaLength:a}}static fromJSON(e){return new Ha(e.radius,e.height,e.radialSegments,e.heightSegments,e.openEnded,e.thetaStart,e.thetaLength)}}class ja extends Ji{constructor(e=[],t=[],i=1,n=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:e,indices:t,radius:i,detail:n};const r=[],s=[];function a(e,t,i,n){const r=n+1,s=[];for(let n=0;n<=r;n++){s[n]=[];const a=e.clone().lerp(i,n/r),o=t.clone().lerp(i,n/r),l=r-n;for(let e=0;e<=l;e++)s[n][e]=0===e&&n===r?a:a.clone().lerp(o,e/l)}for(let e=0;e.9&&a<.1&&(t<.2&&(s[e+0]+=1),i<.2&&(s[e+2]+=1),n<.2&&(s[e+4]+=1))}}()}(),this.setAttribute("position",new ji(r,3)),this.setAttribute("normal",new ji(r.slice(),3)),this.setAttribute("uv",new ji(s,2)),0===n?this.computeVertexNormals():this.normalizeNormals()}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new ja(e.vertices,e.indices,e.radius,e.details)}}class Wa extends ja{constructor(e=1,t=0){const i=(1+Math.sqrt(5))/2;super([-1,i,0,1,i,0,-1,-i,0,1,-i,0,0,-1,i,0,1,i,0,-1,-i,0,1,-i,i,0,-1,i,0,1,-i,0,-1,-i,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],e,t),this.type="IcosahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new Wa(e.radius,e.detail)}}class qa extends ja{constructor(e=1,t=0){super([1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],e,t),this.type="OctahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new qa(e.radius,e.detail)}}class Xa extends ja{constructor(e=1,t=0){super([1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],e,t),this.type="TetrahedronGeometry",this.parameters={radius:e,detail:t}}static fromJSON(e){return new Xa(e.radius,e.detail)}}class Ya extends Ji{constructor(e=1,t=.4,i=12,n=48,r=2*Math.PI){super(),this.type="TorusGeometry",this.parameters={radius:e,tube:t,radialSegments:i,tubularSegments:n,arc:r},i=Math.floor(i),n=Math.floor(n);const s=[],a=[],o=[],l=[],c=new _t,u=new _t,h=new _t;for(let s=0;s<=i;s++)for(let d=0;d<=n;d++){const f=d/n*r,m=s/i*Math.PI*2;u.x=(e+t*Math.cos(m))*Math.cos(f),u.y=(e+t*Math.cos(m))*Math.sin(f),u.z=t*Math.sin(m),a.push(u.x,u.y,u.z),c.x=e*Math.cos(f),c.y=e*Math.sin(f),h.subVectors(u,c).normalize(),o.push(h.x,h.y,h.z),l.push(d/n),l.push(s/i)}for(let e=1;e<=i;e++)for(let t=1;t<=n;t++){const i=(n+1)*e+t-1,r=(n+1)*(e-1)+t-1,a=(n+1)*(e-1)+t,o=(n+1)*e+t;s.push(i,r,o),s.push(r,a,o)}this.setIndex(s),this.setAttribute("position",new ji(a,3)),this.setAttribute("normal",new ji(o,3)),this.setAttribute("uv",new ji(l,2))}copy(e){return super.copy(e),this.parameters=Object.assign({},e.parameters),this}static fromJSON(e){return new Ya(e.radius,e.tube,e.radialSegments,e.tubularSegments,e.arc)}}class Ka extends yi{constructor(e,t=1){super(),this.isLight=!0,this.type="Light",this.color=new Oi(e),this.intensity=t}dispose(){}copy(e,t){return super.copy(e,t),this.color.copy(e.color),this.intensity=e.intensity,this}toJSON(e){const t=super.toJSON(e);return t.object.color=this.color.getHex(),t.object.intensity=this.intensity,void 0!==this.groundColor&&(t.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(t.object.distance=this.distance),void 0!==this.angle&&(t.object.angle=this.angle),void 0!==this.decay&&(t.object.decay=this.decay),void 0!==this.penumbra&&(t.object.penumbra=this.penumbra),void 0!==this.shadow&&(t.object.shadow=this.shadow.toJSON()),t}}const Za=new qt,Qa=new _t,Ja=new _t;class eo{constructor(e){this.camera=e,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new Ge(512,512),this.map=null,this.mapPass=null,this.matrix=new qt,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new Bn,this._frameExtents=new Ge(1,1),this._viewportCount=1,this._viewports=[new ht(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(e){const t=this.camera,i=this.matrix;Qa.setFromMatrixPosition(e.matrixWorld),t.position.copy(Qa),Ja.setFromMatrixPosition(e.target.matrixWorld),t.lookAt(Ja),t.updateMatrixWorld(),Za.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Za),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(Za)}getViewport(e){return this._viewports[e]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const e={};return 0!==this.bias&&(e.bias=this.bias),0!==this.normalBias&&(e.normalBias=this.normalBias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}class to extends eo{constructor(){super(new Qn(-5,5,5,-5,.5,500)),this.isDirectionalLightShadow=!0}}class io extends Ka{constructor(e,t){super(e,t),this.isDirectionalLight=!0,this.type="DirectionalLight",this.position.copy(yi.DEFAULT_UP),this.updateMatrix(),this.target=new yi,this.shadow=new to}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}class no extends Ka{constructor(e,t){super(e,t),this.isAmbientLight=!0,this.type="AmbientLight"}}const ro=new qt,so=new qt,ao=new qt;class oo{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Tn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Tn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(e){const t=this._cache;if(t.focus!==e.focus||t.fov!==e.fov||t.aspect!==e.aspect*this.aspect||t.near!==e.near||t.far!==e.far||t.zoom!==e.zoom||t.eyeSep!==this.eyeSep){t.focus=e.focus,t.fov=e.fov,t.aspect=e.aspect*this.aspect,t.near=e.near,t.far=e.far,t.zoom=e.zoom,t.eyeSep=this.eyeSep,ao.copy(e.projectionMatrix);const i=t.eyeSep/2,n=i*t.near/t.focus,r=t.near*Math.tan(ke*t.fov*.5)/t.zoom;let s,a;so.elements[12]=-i,ro.elements[12]=i,s=-r*t.aspect+n,a=r*t.aspect+n,ao.elements[0]=2*t.near/(a-s),ao.elements[8]=(a+s)/(a-s),this.cameraL.projectionMatrix.copy(ao),s=-r*t.aspect-n,a=r*t.aspect-n,ao.elements[0]=2*t.near/(a-s),ao.elements[8]=(a+s)/(a-s),this.cameraR.projectionMatrix.copy(ao)}this.cameraL.matrixWorld.copy(e.matrixWorld).multiply(so),this.cameraR.matrixWorld.copy(e.matrixWorld).multiply(ro)}}class lo{constructor(e){this.value=e}clone(){return new lo(void 0===this.value.clone?this.value:this.value.clone())}}function co(e){if("undefined"==typeof window)return;const t=new RegExp(`${e}=([^&#=]*)`).exec(window.location.search);return t?decodeURIComponent(t[1]):void 0}function uo(e,t){return void 0!==e?e:t}function ho(e,t){const i=Object.assign({},e);for(const n in t){void 0===e[n]&&(i[n]=t[n])}return i}function fo(e,t){for(const i in t){const n=t[i];void 0!==n&&(e[i]=n)}return e}function mo(){if("undefined"==typeof window)return!1;const e=window.navigator.userAgent;return/Opera|OPR/.test(e)?"Opera":/Chrome/i.test(e)?"Chrome":/Firefox/i.test(e)?"Firefox":/Mobile(\/.*)? Safari/i.test(e)?"Mobile Safari":/MSIE/i.test(e)?"Internet Explorer":!!/Safari/i.test(e)&&"Safari"}function po(e){window.open(e,"_blank")||(window.location.href=e)}function go(e,t="download"){if(!e)return;const i="Safari"===mo(),n=/CriOS\/[\d]+/.test(window.navigator.userAgent),r=document.createElement("a");function s(e){po(n?e:e.replace(/^data:[^;]*;/,"data:attachment/file;"))}if("undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(e,t);else if((i||n)&&FileReader)if(e instanceof Blob){var a=new FileReader;a.onloadend=function(){s(a.result)},a.readAsDataURL(e)}else s(e);else{let i=!1;e instanceof Blob&&(e=URL.createObjectURL(e),i=!0),"download"in r?(r.style.display="hidden",document.body.appendChild(r),r.href=e,r.download=t,r.target="_blank",r.click(),document.body.removeChild(r)):po(e),i&&window.URL.revokeObjectURL(e)}}function _o(e,t){return et?1:0}function yo(e,t,i=_o){let n=0,r=e.length-1;for(;n<=r;){const s=n+r>>1,a=i(t,e[s]);if(a>0)n=s+1;else{if(!(a<0))return s;r=s-1}}return-n-1}function vo(e,t,i){const n=function(e,t){let i=e.length-1;if(e[i]>1;e[r]>=t?i=r-1:n=r+1}return i+1}(e,t),r=function(e,t){if(e[0]>t)return-1;let i=0,n=e.length-1;for(;i<=n;){const r=i+n>>1;e[r]>t?n=r-1:i=r+1}return i-1}(e,i);return-1===n||-1===r||n>r?0:r-n+1}function bo(e){return e.sort().filter((function(e,t,i){return 0===t||e!==i[t-1]}))}function xo(e){const t=28672;if(e.length>t){const i=[];for(let n=0;n65535?Uint32Array:Uint16Array)(e)}function Mo(e){return e.buffer&&e.buffer instanceof ArrayBuffer?e.buffer:e}function Ao(e,t){return void 0===e?e=new t:Array.isArray(e)&&(e=(new t).fromArray(e)),e}function Co(e){return Ao(e,_t)}function To(e){return Ao(e,qt)}function Po(e){return Ao(e,gt)}function Eo(e){return t=e,i=Float32Array,t instanceof i?t:new i(t);var t,i}function Io(e){return uo(e,"").toString().toLowerCase()}class Do{constructor(e){this.name=e,this._dict={}}add(e,t){this._dict[Io(e)]=t}get(e){return this._dict[Io(e)]}get names(){return Object.keys(this._dict)}}function Ro(e){return.01745*e}const Lo="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),ko=new Array(36);function Oo(){let e,t=0;for(let i=0;i<36;i++)8===i||13===i||18===i||23===i?ko[i]="-":14===i?ko[i]="4":(t<=2&&(t=33554432+16777216*Math.random()|0),e=15&t,t>>=4,ko[i]=Lo[19===i?3&e|8:e]);return ko.join("")}function No(e,t,i){return Math.max(t,Math.min(i,e))}function Fo(e,t,i){return e+(t-e)*i}function Bo(e,t,i,n,r,s){const a=(i-e)*s,o=(n-t)*s,l=r*r;return(2*t-2*i+a+o)*(r*l)+(-3*t+3*i-2*a-o)*l+a*r+t}function zo(e,t,i){var n;return n=function(e,t,i){return(e-t)/(i-t)}(i,e,t),(i=No(n,0,1))*i*(3-2*i)}var Uo="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Vo(e){var t={exports:{}};return e(t,t.exports),t.exports}var $o=Vo((function(e,t){ +/** + * @license + * + * chroma.js - JavaScript library for color conversions + * + * Copyright (c) 2011-2017, Gregor Aisch + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name Gregor Aisch may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GREGOR AISCH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +(function(){var i,n,r,s,a,o,l,c,u,h,d,f,m,p,g,_,y,v,b,x,w,S,M,A,C,T,P,E,I,D,R,L,k,O,N,F,B,z,U,V,$,G,H,j,W,q,X,Y,K,Z,Q,J,ee,te,ie,ne,re,se,ae,oe,le,ce,ue,he,de,fe,me,pe,ge,_e,ye,ve,be,xe,we,Se,Me,Ae,Ce,Te,Pe=[].slice;Se=function(){var e,t,i,n,r;for(e={},n=0,t=(r="Boolean Number String Function Array Date RegExp Undefined Null".split(" ")).length;ni&&(e=i),e},Me=function(e){return e.length>=3?Array.prototype.slice.call(e):e[0]},w=function(e){var t,i;for(e._clipped=!1,e._unclipped=e.slice(0),t=i=0;i<3;t=++i)t<3?((e[t]<0||e[t]>255)&&(e._clipped=!0),e[t]<0&&(e[t]=0),e[t]>255&&(e[t]=255)):3===t&&(e[t]<0&&(e[t]=0),e[t]>1&&(e[t]=1));return e._clipped||delete e._unclipped,e},s=Math.PI,ye=Math.round,M=Math.cos,E=Math.floor,ie=Math.pow,Y=Math.log,be=Math.sin,xe=Math.sqrt,p=Math.atan2,Q=Math.max,m=Math.abs,l=2*s,a=s/3,n=s/180,o=180/s,x=function(){return arguments[0]instanceof i?arguments[0]:function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,arguments,(function(){}))},x.default=x,f=[],null!==e&&null!=e.exports&&(e.exports=x),(null!==t?t:this).chroma=x,x.version="1.4.1",d={},u=[],h=!1,i=function(){function e(){var e,t,i,n,r,s,a,o,l;for(s=this,t=[],o=0,n=arguments.length;o1&&(a=t[t.length-1]),null!=d[a])s._rgb=w(d[a](Me(t.slice(0,-1))));else{for(h||(u=u.sort((function(e,t){return t.p-e.p})),h=!0),l=0,r=u.length;l3?t[3]:1]},Te=function(e){return 255*(e<=.00304?12.92*e:1.055*ie(e,1/2.4)-.055)},H=function(e){return e>r.t1?e*e*e:r.t2*(e-r.t0)},r={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},ue=function(){var e,t,i,n,r,s,a;return i=(n=Me(arguments))[0],t=n[1],e=n[2],s=(r=pe(i,t,e))[0],[116*(a=r[1])-16,500*(s-a),200*(a-r[2])]},ge=function(e){return(e/=255)<=.04045?e/12.92:ie((e+.055)/1.055,2.4)},Ce=function(e){return e>r.t3?ie(e,1/3):e/r.t2+r.t0},pe=function(){var e,t,i,n;return i=(n=Me(arguments))[0],t=n[1],e=n[2],i=ge(i),t=ge(t),e=ge(e),[Ce((.4124564*i+.3575761*t+.1804375*e)/r.Xn),Ce((.2126729*i+.7151522*t+.072175*e)/r.Yn),Ce((.0193339*i+.119192*t+.9503041*e)/r.Zn)]},x.lab=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["lab"]),(function(){}))},d.lab=G,i.prototype.lab=function(){return ue(this._rgb)},g=function(e){var t,i,n,r,s,a,o,l,c,u,h;return 2===(e=function(){var t,i,n;for(n=[],i=0,t=e.length;i=0&&t[3]<=1?"rgb":void 0}}),d.lrgb=d.rgb,z=function(e,t,n,r){var s,a;return s=e._rgb,a=t._rgb,new i(xe(ie(s[0],2)*(1-n)+ie(a[0],2)*n),xe(ie(s[1],2)*(1-n)+ie(a[1],2)*n),xe(ie(s[2],2)*(1-n)+ie(a[2],2)*n),r)},c=function(e){var t,n,r,s,a;for(t=1/e.length,a=[0,0,0,0],r=0,n=e.length;r1&&(a[3]=1),new i(w(a))},f.push(["lrgb",z]),x.average=function(e,t){var i,n,r,a,o,l,u,h,d,f,m,g,_;if(null==t&&(t="rgb"),d=e.length,e=e.map((function(e){return x(e)})),u=e.splice(0,1)[0],"lrgb"===t)return c(e);for(h in a=[],o=0,l=0,g=u.get(t))g[h]=g[h]||0,a.push(isNaN(g[h])?0:1),"h"!==t.charAt(h)||isNaN(g[h])||(i=g[h]/180*s,o+=M(i),l+=be(i));for(n=u.alpha(),m=0,f=e.length;m=360;)i-=360;g[h]=i}else g[h]=g[h]/a[h];return x(g,t).alpha(n/d)},D=function(e){var t,i;if(e.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))return 4!==e.length&&7!==e.length||(e=e.substr(1)),3===e.length&&(e=(e=e.split(""))[0]+e[0]+e[1]+e[1]+e[2]+e[2]),[(i=parseInt(e,16))>>16,i>>8&255,255&i,1];if(e.match(/^#?([A-Fa-f0-9]{8})$/))return 9===e.length&&(e=e.substr(1)),[(i=parseInt(e,16))>>24&255,i>>16&255,i>>8&255,ye((255&i)/255*100)/100];if(null!=d.css&&(t=d.css(e)))return t;throw"unknown color: "+e},ae=function(e,t){var i,n,r,s,a,o;return null==t&&(t="auto"),a=e[0],r=e[1],n=e[2],i=e[3],"auto"===t&&(t=i<1?"rgba":"rgb"),a=Math.round(a),r=Math.round(r),n=Math.round(n),o=(o="000000"+(a<<16|r<<8|n).toString(16)).substr(o.length-6),s=(s="0"+ye(255*i).toString(16)).substr(s.length-2),"#"+function(){switch(t.toLowerCase()){case"rgba":return o+s;case"argb":return s+o;default:return o}}()},d.hex=function(e){return D(e)},x.hex=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["hex"]),(function(){}))},i.prototype.hex=function(e){return null==e&&(e="auto"),ae(this._rgb,e)},u.push({p:4,test:function(e){if(1===arguments.length&&"string"===Se(e))return"hex"}}),k=function(){var e,t,i,n,r,s,a,o,l,c,u,h,d,f;if(r=(e=Me(arguments))[0],u=e[1],a=e[2],0===u)l=n=t=255*a;else{for(i=[0,0,0],h=2*a-(d=a<.5?a*(1+u):a+u-a*u),(f=[0,0,0])[0]=(r/=360)+1/3,f[1]=r,f[2]=r-1/3,s=o=0;o<=2;s=++o)f[s]<0&&(f[s]+=1),f[s]>1&&(f[s]-=1),6*f[s]<1?i[s]=h+6*(d-h)*f[s]:2*f[s]<1?i[s]=d:3*f[s]<2?i[s]=h+(d-h)*(2/3-f[s])*6:i[s]=h;l=(c=[ye(255*i[0]),ye(255*i[1]),ye(255*i[2])])[0],n=c[1],t=c[2]}return e.length>3?[l,n,t,e[3]]:[l,n,t]},le=function(e,t,i){var n,r,s,a,o;return void 0!==e&&e.length>=3&&(e=(a=e)[0],t=a[1],i=a[2]),e/=255,t/=255,i/=255,s=Math.min(e,t,i),r=((Q=Math.max(e,t,i))+s)/2,Q===s?(o=0,n=Number.NaN):o=r<.5?(Q-s)/(Q+s):(Q-s)/(2-Q-s),e===Q?n=(t-i)/(Q-s):t===Q?n=2+(i-e)/(Q-s):i===Q&&(n=4+(e-t)/(Q-s)),(n*=60)<0&&(n+=360),[n,o,r]},x.hsl=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["hsl"]),(function(){}))},d.hsl=k,i.prototype.hsl=function(){return le(this._rgb)},O=function(){var e,t,i,n,r,s,a,o,l,c,u,h,d,f,m,p,g,_;if(r=(e=Me(arguments))[0],p=e[1],_=e[2],_*=255,0===p)l=n=t=_;else switch(360===r&&(r=0),r>360&&(r-=360),r<0&&(r+=360),a=_*(1-p),o=_*(1-p*(i=(r/=60)-(s=E(r)))),g=_*(1-p*(1-i)),s){case 0:l=(c=[_,g,a])[0],n=c[1],t=c[2];break;case 1:l=(u=[o,_,a])[0],n=u[1],t=u[2];break;case 2:l=(h=[a,_,g])[0],n=h[1],t=h[2];break;case 3:l=(d=[a,o,_])[0],n=d[1],t=d[2];break;case 4:l=(f=[g,a,_])[0],n=f[1],t=f[2];break;case 5:l=(m=[_,a,o])[0],n=m[1],t=m[2]}return[l,n,t,e.length>3?e[3]:1]},ce=function(){var e,t,i,n,r,s,a,o,l;return s=(a=Me(arguments))[0],i=a[1],e=a[2],r=Math.min(s,i,e),t=(Q=Math.max(s,i,e))-r,l=Q/255,0===Q?(n=Number.NaN,o=0):(o=t/Q,s===Q&&(n=(i-e)/t),i===Q&&(n=2+(e-s)/t),e===Q&&(n=4+(s-i)/t),(n*=60)<0&&(n+=360)),[n,o,l]},x.hsv=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["hsv"]),(function(){}))},d.hsv=O,i.prototype.hsv=function(){return ce(this._rgb)},ee=function(e){return"number"===Se(e)&&e>=0&&e<=16777215?[e>>16,e>>8&255,255&e,1]:(console.warn("unknown num color: "+e),[0,0,0,1])},fe=function(){var e;return((e=Me(arguments))[0]<<16)+(e[1]<<8)+e[2]},x.num=function(e){return new i(e,"num")},i.prototype.num=function(e){return null==e&&(e="rgb"),fe(this._rgb,e)},d.num=ee,u.push({p:1,test:function(e){if(1===arguments.length&&"number"===Se(e)&&e>=0&&e<=16777215)return"num"}}),I=function(){var e,t,i,n,r,s,a,o,l,c,u,h,d,f,m,p,g,_,y,v;if(o=(i=Me(arguments))[0],r=i[1],t=i[2],a=a/100*255,e=255*(r/=100),0===r)h=a=n=t;else switch(360===o&&(o=0),o>360&&(o-=360),o<0&&(o+=360),u=(c=t*(1-r))+e*(1-(s=(o/=60)-(l=E(o)))),y=c+e*s,v=c+e,l){case 0:h=(d=[v,y,c])[0],a=d[1],n=d[2];break;case 1:h=(f=[u,v,c])[0],a=f[1],n=f[2];break;case 2:h=(m=[c,v,y])[0],a=m[1],n=m[2];break;case 3:h=(p=[c,u,v])[0],a=p[1],n=p[2];break;case 4:h=(g=[y,c,v])[0],a=g[1],n=g[2];break;case 5:h=(_=[v,c,u])[0],a=_[1],n=_[2]}return[h,a,n,i.length>3?i[3]:1]},se=function(){var e,t,i,n,r,s,a,o,l;return o=(l=Me(arguments))[0],r=l[1],t=l[2],a=Math.min(o,r,t),i=100*(n=(Q=Math.max(o,r,t))-a)/255,e=a/(255-n)*100,0===n?s=Number.NaN:(o===Q&&(s=(r-t)/n),r===Q&&(s=2+(t-o)/n),t===Q&&(s=4+(o-r)/n),(s*=60)<0&&(s+=360)),[s,i,e]},x.hcg=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["hcg"]),(function(){}))},d.hcg=I,i.prototype.hcg=function(){return se(this._rgb)},A=function(e){var t,i,n,r,s,a,o,l;if(e=e.toLowerCase(),null!=x.colors&&x.colors[e])return D(x.colors[e]);if(s=e.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){for(o=s.slice(1,4),r=a=0;a<=2;r=++a)o[r]=+o[r];o[3]=1}else if(s=e.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/))for(o=s.slice(1,5),r=l=0;l<=3;r=++l)o[r]=+o[r];else if(s=e.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){for(o=s.slice(1,4),r=t=0;t<=2;r=++t)o[r]=ye(2.55*o[r]);o[3]=1}else if(s=e.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){for(o=s.slice(1,5),r=i=0;i<=2;r=++i)o[r]=ye(2.55*o[r]);o[3]=+o[3]}else(s=e.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/))?((n=s.slice(1,4))[1]*=.01,n[2]*=.01,(o=k(n))[3]=1):(s=e.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/))&&((n=s.slice(1,4))[1]*=.01,n[2]*=.01,(o=k(n))[3]=+s[4]);return o},re=function(e){var t;return"rgb"===(t=e[3]<1?"rgba":"rgb")?t+"("+e.slice(0,3).map(ye).join(",")+")":"rgba"===t?t+"("+e.slice(0,3).map(ye).join(",")+","+e[3]+")":void 0},_e=function(e){return ye(100*e)/100},L=function(e,t){var i;return i=t<1?"hsla":"hsl",e[0]=_e(e[0]||0),e[1]=_e(100*e[1])+"%",e[2]=_e(100*e[2])+"%","hsla"===i&&(e[3]=t),i+"("+e.join(",")+")"},d.css=function(e){return A(e)},x.css=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["css"]),(function(){}))},i.prototype.css=function(e){return null==e&&(e="rgb"),"rgb"===e.slice(0,3)?re(this._rgb):"hsl"===e.slice(0,3)?L(this.hsl(),this.alpha()):void 0},d.named=function(e){return D(Ae[e])},u.push({p:5,test:function(e){if(1===arguments.length&&null!=Ae[e])return"named"}}),i.prototype.name=function(e){var t,i;for(i in arguments.length&&(Ae[e]&&(this._rgb=D(Ae[e])),this._rgb[3]=1),t=this.hex("rgb"),Ae)if(t===Ae[i])return i;return t},j=function(){var e,t,i,r;return i=(r=Me(arguments))[0],e=r[1],t=r[2],[i,M(t*=n)*e,be(t)*e]},W=function(){var e,t,i,n,r,s,a,o,l;return a=(i=Me(arguments))[0],r=i[1],s=i[2],e=(o=j(a,r,s))[0],t=o[1],n=o[2],[(l=G(e,t,n))[0],l[1],n=l[2],i.length>3?i[3]:1]},$=function(){var e,t,i,n,r,s;return r=(s=Me(arguments))[0],e=s[1],t=s[2],i=xe(e*e+t*t),n=(p(t,e)*o+360)%360,0===ye(1e4*i)&&(n=Number.NaN),[r,i,n]},he=function(){var e,t,i,n,r,s,a;return r=(s=Me(arguments))[0],i=s[1],t=s[2],n=(a=ue(r,i,t))[0],e=a[1],t=a[2],$(n,e,t)},x.lch=function(){var e;return e=Me(arguments),new i(e,"lch")},x.hcl=function(){var e;return e=Me(arguments),new i(e,"hcl")},d.lch=W,d.hcl=function(){var e,t,i,n;return t=(n=Me(arguments))[0],e=n[1],i=n[2],W([i,e,t])},i.prototype.lch=function(){return he(this._rgb)},i.prototype.hcl=function(){return he(this._rgb).reverse()},ne=function(e){var t,i,n,r,s,a;return null==e&&(e="rgb"),s=(a=Me(arguments))[0],n=a[1],t=a[2],n/=255,t/=255,[(1-(s/=255)-(r=1-Math.max(s,Math.max(n,t))))*(i=r<1?1/(1-r):0),(1-n-r)*i,(1-t-r)*i,r]},S=function(){var e,t,i,n,r,s;return i=(t=Me(arguments))[0],r=t[1],s=t[2],n=t[3],e=t.length>4?t[4]:1,1===n?[0,0,0,e]:[i>=1?0:255*(1-i)*(1-n),r>=1?0:255*(1-r)*(1-n),s>=1?0:255*(1-s)*(1-n),e]},d.cmyk=function(){return S(Me(arguments))},x.cmyk=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["cmyk"]),(function(){}))},i.prototype.cmyk=function(){return ne(this._rgb)},d.gl=function(){var e,t,i,n,r;for(n=function(){var e,i;for(t in i=[],e=Me(arguments))r=e[t],i.push(r);return i}.apply(this,arguments),e=i=0;i<=2;e=++i)n[e]*=255;return n},x.gl=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["gl"]),(function(){}))},i.prototype.gl=function(){var e;return[(e=this._rgb)[0]/255,e[1]/255,e[2]/255,e[3]]},de=function(e,t,i){var n;return e=(n=Me(arguments))[0],t=n[1],i=n[2],.2126*(e=K(e))+.7152*(t=K(t))+.0722*(i=K(i))},K=function(e){return(e/=255)<=.03928?e/12.92:ie((e+.055)/1.055,2.4)},V=function(e,t,n,r){var s,a;return s=e._rgb,a=t._rgb,new i(s[0]+n*(a[0]-s[0]),s[1]+n*(a[1]-s[1]),s[2]+n*(a[2]-s[2]),r)},f.push(["rgb",V]),i.prototype.luminance=function(e,t){var i,n,r,s;return null==t&&(t="rgb"),arguments.length?(r=this._rgb,0===e?r=[0,0,0,this._rgb[3]]:1===e?r=[255,255,255,this[3]]:(i=de(this._rgb),1e-7,n=20,s=function(i,r){var a,o;return a=(o=i.interpolate(r,.5,t)).luminance(),Math.abs(e-a)<1e-7||!n--?o:a>e?s(i,o):s(o,r)},r=i>e?s(x("black"),this).rgba():s(this,x("white")).rgba()),x(r).alpha(this.alpha())):de(this._rgb)},we=function(e){var t,i,n,r;return(r=e/100)<66?(n=255,i=-155.25485562709179-.44596950469579133*(i=r-2)+104.49216199393888*Y(i),t=r<20?0:.8274096064007395*(t=r-10)-254.76935184120902+115.67994401066147*Y(t)):(n=351.97690566805693+.114206453784165*(n=r-55)-40.25366309332127*Y(n),i=325.4494125711974+.07943456536662342*(i=r-50)-28.0852963507957*Y(i),t=255),[n,i,t]},me=function(){var e,t,i,n,r,s,a;for(n=(r=Me(arguments))[0],r[1],e=r[2],i=1e3,t=4e4,.4;t-i>.4;)(s=we(a=.5*(t+i)))[2]/s[0]>=e/n?t=a:i=a;return ye(a)},x.temperature=x.kelvin=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["temperature"]),(function(){}))},d.temperature=d.kelvin=d.K=we,i.prototype.temperature=function(){return me(this._rgb)},i.prototype.kelvin=i.prototype.temperature,x.contrast=function(e,t){var n,r,s,a;return"string"!==(s=Se(e))&&"number"!==s||(e=new i(e)),"string"!==(a=Se(t))&&"number"!==a||(t=new i(t)),(n=e.luminance())>(r=t.luminance())?(n+.05)/(r+.05):(r+.05)/(n+.05)},x.distance=function(e,t,n){var r,s,a,o,l,c,u;for(s in null==n&&(n="lab"),"string"!==(l=Se(e))&&"number"!==l||(e=new i(e)),"string"!==(c=Se(t))&&"number"!==c||(t=new i(t)),a=e.get(n),o=t.get(n),u=0,a)u+=(r=(a[s]||0)-(o[s]||0))*r;return Math.sqrt(u)},x.deltaE=function(e,t,n,r){var a,o,l,c,u,h,d,f,g,_,y,v,b,x,w,S,A,C,T,P,E,I,D,R;for(null==n&&(n=1),null==r&&(r=1),"string"!==(w=Se(e))&&"number"!==w||(e=new i(e)),"string"!==(S=Se(t))&&"number"!==S||(t=new i(t)),a=(A=e.lab())[0],l=A[1],u=A[2],o=(C=t.lab())[0],c=C[1],h=C[2],d=xe(l*l+u*u),f=xe(c*c+h*h),P=a<16?.511:.040975*a/(1+.01765*a),T=.0638*d/(1+.0131*d)+.638,x=d<1e-6?0:180*p(u,l)/s;x<0;)x+=360;for(;x>=360;)x-=360;return E=x>=164&&x<=345?.56+m(.2*M(s*(x+168)/180)):.36+m(.4*M(s*(x+35)/180)),b=xe((g=d*d*d*d)/(g+1900)),xe((I=(a-o)/(n*P))*I+(D=(v=d-f)/(r*T))*D+((_=l-c)*_+(y=u-h)*y-v*v)/((R=T*(b*E+1-b))*R))},i.prototype.get=function(e){var t,i,n,r,s;return this,n=(r=e.split("."))[0],t=r[1],s=this[n](),t?(i=n.indexOf(t))>-1?s[i]:console.warn("unknown channel "+t+" in mode "+n):s},i.prototype.set=function(e,t){var i,n,r,s,a;if(this,r=(s=e.split("."))[0],i=s[1])if(a=this[r](),(n=r.indexOf(i))>-1)if("string"===Se(t))switch(t.charAt(0)){case"+":case"-":a[n]+=+t;break;case"*":a[n]*=+t.substr(1);break;case"/":a[n]/=+t.substr(1);break;default:a[n]=+t}else a[n]=t;else console.warn("unknown channel "+i+" in mode "+r);else a=t;return x(a,r).alpha(this.alpha())},i.prototype.clipped=function(){return this._rgb._clipped||!1},i.prototype.alpha=function(e){return arguments.length?x.rgb([this._rgb[0],this._rgb[1],this._rgb[2],e]):this._rgb[3]},i.prototype.darken=function(e){var t;return null==e&&(e=1),this,(t=this.lab())[0]-=r.Kn*e,x.lab(t).alpha(this.alpha())},i.prototype.brighten=function(e){return null==e&&(e=1),this.darken(-e)},i.prototype.darker=i.prototype.darken,i.prototype.brighter=i.prototype.brighten,i.prototype.saturate=function(e){var t;return null==e&&(e=1),this,(t=this.lch())[1]+=e*r.Kn,t[1]<0&&(t[1]=0),x.lch(t).alpha(this.alpha())},i.prototype.desaturate=function(e){return null==e&&(e=1),this.saturate(-e)},i.prototype.premultiply=function(){var e,t;return t=this.rgb(),e=this.alpha(),x(t[0]*e,t[1]*e,t[2]*e,e)},J=function(e,t){return e*t/255},C=function(e,t){return e>t?t:e},q=function(e,t){return e>t?e:t},ve=function(e,t){return 255*(1-(1-e/255)*(1-t/255))},te=function(e,t){return t<128?2*e*t/255:255*(1-2*(1-e/255)*(1-t/255))},b=function(e,t){return 255*(1-(1-t/255)/(e/255))},T=function(e,t){return 255===e||(e=t/255*255/(1-e/255))>255?255:e},(_=function(e,t,i){if(!_[i])throw"unknown blend mode "+i;return _[i](e,t)}).normal=(y=function(e){return function(t,i){var n,r;return n=x(i).rgb(),r=x(t).rgb(),x(e(n,r),"rgb")}})((P=function(e){return function(t,i){var n,r,s;for(s=[],n=r=0;r<=3;n=++r)s[n]=e(t[n],i[n]);return s}})((function(e,t){return e}))),_.multiply=y(P(J)),_.screen=y(P(ve)),_.overlay=y(P(te)),_.darken=y(P(C)),_.lighten=y(P(q)),_.dodge=y(P(T)),_.burn=y(P(b)),x.blend=_,x.analyze=function(e){var t,i,n,r;for(n={min:Number.MAX_VALUE,max:-1*Number.MAX_VALUE,sum:0,values:[],count:0},i=0,t=e.length;in.max&&(n.max=r),n.count+=1);return n.domain=[n.min,n.max],n.limits=function(e,t){return x.limits(n,e,t)},n},x.scale=function(e,t){var i,n,r,s,a,o,l,c,u,h,d,f,m,p,g,_,y,v,b,w,S;return u="rgb",h=x("#ccc"),p=0,a=[0,1],m=[],f=[0,0],i=!1,r=[],d=!1,c=0,l=1,s=!1,n={},g=!0,o=1,w=function(e){var t,i,n,s,a,o;if(null==e&&(e=["#fff","#000"]),null!=e&&"string"===Se(e)&&null!=x.brewer&&(e=x.brewer[e]||x.brewer[e.toLowerCase()]||e),"array"===Se(e)){for(1===e.length&&(e=[e[0],e[0]]),t=n=0,s=(e=e.slice(0)).length-1;0<=s?n<=s:n>=s;t=0<=s?++n:--n)i=e[t],"string"===Se(i)&&(e[t]=x(i));for(m.length=0,t=o=0,a=e.length-1;0<=a?o<=a:o>=a;t=0<=a?++o:--o)m.push(t/(e.length-1))}return b(),r=e},y=function(e){var t,n;if(null!=i){for(n=i.length-1,t=0;t=i[t];)t++;return t-1}return 0},S=function(e){return e},v=function(e,t){var s,a,d,p,_,v,b;if(null==t&&(t=!1),isNaN(e)||null===e)return h;if(b=t?e:i&&i.length>2?y(e)/(i.length-2):l!==c?(e-c)/(l-c):1,t||(b=S(b)),1!==o&&(b=ie(b,o)),b=f[0]+b*(1-f[0]-f[1]),b=Math.min(1,Math.max(0,b)),d=Math.floor(1e4*b),g&&n[d])s=n[d];else{if("array"===Se(r))for(a=p=0,v=m.length-1;0<=v?p<=v:p>=v;a=0<=v?++p:--p){if(b<=(_=m[a])){s=r[a];break}if(b>=_&&a===m.length-1){s=r[a];break}if(b>_&&b=u;t=0<=u?++h:--h)m.push(t/(n-1));return a=[c,l],_},_.mode=function(e){return arguments.length?(u=e,b(),_):u},_.range=function(e,t){return w(e),_},_.out=function(e){return d=e,_},_.spread=function(e){return arguments.length?(p=e,_):p},_.correctLightness=function(e){return null==e&&(e=!0),s=e,b(),S=s?function(e){var t,i,n,r,s,a,o,l,c;for(t=v(0,!0).lab()[0],i=v(1,!0).lab()[0],o=t>i,n=v(e,!0).lab()[0],r=n-(s=t+(i-t)*e),l=0,c=1,a=20;Math.abs(r)>.01&&a-- >0;)o&&(r*=-1),r<0?(l=e,e+=.5*(c-e)):(c=e,e+=.5*(l-e)),n=v(e,!0).lab()[0],r=n-s;return e}:function(e){return e},_},_.padding=function(e){return null!=e?("number"===Se(e)&&(e=[e,e]),f=e,_):f},_.colors=function(t,n){var s,o,l,c,u,h,d,f;if(arguments.length<2&&(n="hex"),u=[],0===arguments.length)u=r.slice(0);else if(1===t)u=[_(.5)];else if(t>1)o=a[0],s=a[1]-o,u=function(){h=[];for(var e=0;0<=t?et;0<=t?e++:e--)h.push(e);return h}.apply(this).map((function(e){return _(o+e/(t-1)*s)}));else{if(e=[],d=[],i&&i.length>2)for(l=f=1,c=i.length;1<=c?fc;l=1<=c?++f:--f)d.push(.5*(i[l-1]+i[l]));else d=a;u=d.map((function(e){return _(e)}))}return x[n]&&(u=u.map((function(e){return e[n]()}))),u},_.cache=function(e){return null!=e?(g=e,_):g},_.gamma=function(e){return null!=e?(o=e,_):o},_.nodata=function(e){return null!=e?(h=x(e),_):h},_},null==x.scales&&(x.scales={}),x.scales.cool=function(){return x.scale([x.hsl(180,1,.9),x.hsl(250,.7,.4)])},x.scales.hot=function(){return x.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")},x.analyze=function(e,t,i){var n,r,s,a,o,l;if(o={min:Number.MAX_VALUE,max:-1*Number.MAX_VALUE,sum:0,values:[],count:0},null==i&&(i=function(){return!0}),n=function(e){null==e||isNaN(e)||(o.values.push(e),o.sum+=e,eo.max&&(o.max=e),o.count+=1)},l=function(e,r){if(i(e,r))return null!=t&&"function"===Se(t)?n(t(e)):null!=t&&"string"===Se(t)||"number"===Se(t)?n(e[t]):n(e)},"array"===Se(e))for(a=0,s=e.length;a=U;M=1<=U?++N:--N)T.push(I+M/i*(Q-I));T.push(Q)}else if("l"===t.substr(0,1)){if(I<=0)throw"Logarithmic scales are only possible for values > 0";for(D=Math.LOG10E*Y(I),P=Math.LOG10E*Y(Q),T.push(I),M=ce=1,V=i-1;1<=V?ce<=V:ce>=V;M=1<=V?++ce:--ce)T.push(ie(10,D+M/i*(P-D)));T.push(Q)}else if("q"===t.substr(0,1)){for(T.push(I),M=n=1,q=i-1;1<=q?n<=q:n>=q;M=1<=q?++n:--n)F=(le.length-1)*M/i,(B=E(F))===F?T.push(le[B]):(z=F-B,T.push(le[B]*(1-z)+le[B+1]*z));T.push(Q)}else if("k"===t.substr(0,1)){for(L=le.length,_=new Array(L),w=new Array(i),re=!0,k=0,v=null,(v=[]).push(I),M=r=1,X=i-1;1<=X?r<=X:r>=X;M=1<=X?++r:--r)v.push(I+M/i*(Q-I));for(v.push(Q);re;){for(A=s=0,K=i-1;0<=K?s<=K:s>=K;A=0<=K?++s:--s)w[A]=0;for(M=a=0,Z=L-1;0<=Z?a<=Z:a>=Z;M=0<=Z?++a:--a){for(oe=le[M],R=Number.MAX_VALUE,A=o=0,J=i-1;0<=J?o<=J:o>=J;A=0<=J?++o:--o)(S=m(v[A]-oe))=ee;A=0<=ee?++l:--l)O[A]=null;for(M=c=0,te=L-1;0<=te?c<=te:c>=te;M=0<=te?++c:--c)null===O[b=_[M]]?O[b]=le[M]:O[b]+=le[M];for(A=u=0,ne=i-1;0<=ne?u<=ne:u>=ne;A=0<=ne?++u:--u)O[A]*=1/w[A];for(re=!1,A=h=0,$=i-1;0<=$?h<=$:h>=$;A=0<=$?++h:--h)if(O[A]!==v[M]){re=!0;break}v=O,++k>200&&(re=!1)}for(C={},A=d=0,G=i-1;0<=G?d<=G:d>=G;A=0<=G?++d:--d)C[A]=[];for(M=f=0,H=L-1;0<=H?f<=H:f>=H;M=0<=H?++f:--f)C[b=_[M]].push(le[M]);for(se=[],A=p=0,j=i-1;0<=j?p<=j:p>=j;A=0<=j?++p:--p)se.push(C[A][0]),se.push(C[A][C[A].length-1]);for(se=se.sort((function(e,t){return e-t})),T.push(se[0]),M=g=1,W=se.length-1;g<=W;M=g+=2)ae=se[M],isNaN(ae)||-1!==T.indexOf(ae)||T.push(ae)}return T},R=function(e,t,i){var n,r,s,o;return e=(n=Me(arguments))[0],t=n[1],i=n[2],isNaN(e)&&(e=0),(e/=360)<1/3?s=1-((r=(1-t)/3)+(o=(1+t*M(l*e)/M(a-l*e))/3)):e<2/3?r=1-((o=(1-t)/3)+(s=(1+t*M(l*(e-=1/3))/M(a-l*e))/3)):o=1-((s=(1-t)/3)+(r=(1+t*M(l*(e-=2/3))/M(a-l*e))/3)),[255*(o=X(i*o*3)),255*(s=X(i*s*3)),255*(r=X(i*r*3)),n.length>3?n[3]:1]},oe=function(){var e,t,i,n,r,s,a;return r=(s=Me(arguments))[0],t=s[1],e=s[2],l=2*Math.PI,r/=255,t/=255,e/=255,0===(a=1-Math.min(r,t,e)/(n=(r+t+e)/3))?i=0:(i=(r-t+(r-e))/2,i/=Math.sqrt((r-t)*(r-t)+(r-e)*(t-e)),i=Math.acos(i),e>t&&(i=l-i),i/=l),[360*i,a,n]},x.hsi=function(){return function(e,t,i){i.prototype=e.prototype;var n=new i,r=e.apply(n,t);return Object(r)===r?r:n}(i,Pe.call(arguments).concat(["hsi"]),(function(){}))},d.hsi=R,i.prototype.hsi=function(){return oe(this._rgb)},F=function(e,t,i,n){var r,s,a,o,l,c,u,h,d,f;return"hsl"===n?(d=e.hsl(),f=t.hsl()):"hsv"===n?(d=e.hsv(),f=t.hsv()):"hcg"===n?(d=e.hcg(),f=t.hcg()):"hsi"===n?(d=e.hsi(),f=t.hsi()):"lch"!==n&&"hcl"!==n||(n="hcl",d=e.hcl(),f=t.hcl()),"h"===n.substr(0,1)&&(s=d[0],u=d[1],o=d[2],a=f[0],h=f[1],l=f[2]),isNaN(s)||isNaN(a)?isNaN(s)?isNaN(a)?r=Number.NaN:(r=a,1!==o&&0!==o||"hsv"===n||(c=h)):(r=s,1!==l&&0!==l||"hsv"===n||(c=u)):r=s+i*(a>s&&a-s>180?a-(s+360):a180?a+360-s:a-s),null==c&&(c=u+i*(h-u)),x[n](r,c,o+i*(l-o))},U=function(e,t,i,n){var r,s;return r=e.num(),s=t.num(),x.num(r+(s-r)*i,"num")},(f=f.concat(function(){var e,t,i,n;for(n=[],t=0,e=(i=["hsv","hsl","hsi","hcl","lch","hcg"]).length;t>16&255)/255,t[i+1]=(e>>8&255)/255,t[i+2]=(255&e)/255,t}atomColorToArray(e,t,i){return this.colorToArray(this.atomColor?this.atomColor(e):0,t,i)}bondColor(e,t){return this.atomProxy&&this.atomColor?(this.atomProxy.index=t?e.atomIndex1:e.atomIndex2,this.atomColor(this.atomProxy)):0}bondColorToArray(e,t,i,n){return this.colorToArray(this.bondColor(e,t),i,n)}volumeColorToArray(e,t,i){return this.colorToArray(this.volumeColor?this.volumeColor(e):0,t,i)}positionColorToArray(e,t,i){return this.colorToArray(this.positionColor?this.positionColor(e):0,t,i)}}var Xo,Yo=Vo((function(e){ +/** @license + * JS Signals + * Released under the MIT license + * Author: Miller Medeiros + * Version: 1.0.0 - Build: 268 (2012/11/29 05:48 PM) + */ +!function(t){function i(e,t,i,n,r){this._listener=t,this._isOnce=i,this.context=n,this._signal=e,this._priority=r||0}function n(e,t){if("function"!=typeof e)throw new Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",t))}function r(){this._bindings=[],this._prevParams=null;var e=this;this.dispatch=function(){r.prototype.dispatch.apply(e,arguments)}}i.prototype={active:!0,params:null,execute:function(e){var t,i;return this.active&&this._listener&&(i=this.params?this.params.concat(e):e,t=this._listener.apply(this.context,i),this._isOnce&&this.detach()),t},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal,delete this._listener,delete this.context},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+", isBound:"+this.isBound()+", active:"+this.active+"]"}},r.prototype={VERSION:"1.0.0",memorize:!1,_shouldPropagate:!0,active:!0,_registerListener:function(e,t,n,r){var s,a=this._indexOfListener(e,n);if(-1!==a){if((s=this._bindings[a]).isOnce()!==t)throw new Error("You cannot add"+(t?"":"Once")+"() then add"+(t?"Once":"")+"() the same listener without removing the relationship first.")}else s=new i(this,e,t,n,r),this._addBinding(s);return this.memorize&&this._prevParams&&s.execute(this._prevParams),s},_addBinding:function(e){var t=this._bindings.length;do{--t}while(this._bindings[t]&&e._priority<=this._bindings[t]._priority);this._bindings.splice(t+1,0,e)},_indexOfListener:function(e,t){for(var i,n=this._bindings.length;n--;)if((i=this._bindings[n])._listener===e&&i.context===t)return n;return-1},has:function(e,t){return-1!==this._indexOfListener(e,t)},add:function(e,t,i){return n(e,"add"),this._registerListener(e,!1,t,i)},addOnce:function(e,t,i){return n(e,"addOnce"),this._registerListener(e,!0,t,i)},remove:function(e,t){n(e,"remove");var i=this._indexOfListener(e,t);return-1!==i&&(this._bindings[i]._destroy(),this._bindings.splice(i,1)),e},removeAll:function(){for(var e=this._bindings.length;e--;)this._bindings[e]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=!1},dispatch:function(e){if(this.active){var t,i=Array.prototype.slice.call(arguments),n=this._bindings.length;if(this.memorize&&(this._prevParams=i),n){t=this._bindings.slice(),this._shouldPropagate=!0;do{n--}while(t[n]&&this._shouldPropagate&&!1!==t[n].execute(i))}}},forget:function(){this._prevParams=null},dispose:function(){this.removeAll(),delete this._bindings,delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};var s=r;s.Signal=r,e.exports?e.exports=s:t.signals=s}(Uo)}));!function(e){e[e.PROTEIN=1]="PROTEIN",e[e.NUCLEIC=2]="NUCLEIC",e[e.RNA=3]="RNA",e[e.DNA=4]="DNA",e[e.POLYMER=5]="POLYMER",e[e.WATER=6]="WATER",e[e.HELIX=7]="HELIX",e[e.SHEET=8]="SHEET",e[e.TURN=9]="TURN",e[e.BACKBONE=10]="BACKBONE",e[e.SIDECHAIN=11]="SIDECHAIN",e[e.ALL=12]="ALL",e[e.HETERO=13]="HETERO",e[e.ION=14]="ION",e[e.SACCHARIDE=15]="SACCHARIDE",e[e.SUGAR=15]="SUGAR",e[e.BONDED=16]="BONDED",e[e.RING=17]="RING",e[e.AROMATICRING=18]="AROMATICRING",e[e.METAL=19]="METAL",e[e.POLARH=20]="POLARH",e[e.NONE=21]="NONE"}(Xo||(Xo={}));const Ko=["*","","ALL"],Zo=["NONE"],Qo=[Xo.BACKBONE,Xo.SIDECHAIN,Xo.BONDED,Xo.RING,Xo.AROMATICRING,Xo.METAL,Xo.POLARH],Jo=[Xo.POLYMER,Xo.WATER],el=["ALA","GLY","SER"],tl=["CYS","SER","THR"],il=["ALA","ILE","LEU","MET","PHE","PRO","TRP","VAL"],nl=["PHE","TRP","TYR","HIS"],rl=["ASN","GLN"],sl=["ASP","GLU"],al=["ARG","HIS","LYS"],ol=["ARG","ASP","GLU","HIS","LYS"],ll=["ASN","ARG","ASP","CYS","GLY","GLN","GLU","HIS","LYS","SER","THR","TYR"],cl=["ALA","ILE","LEU","MET","PHE","PRO","TRP","VAL"],ul=["HIS","PHE","PRO","TRP","TYR"],hl=["ALA","GLY","ILE","LEU","VAL"];function dl(e,t){if(void 0===t.atomname&&void 0===t.element&&void 0===t.altloc&&void 0===t.atomindex&&void 0===t.keyword&&void 0===t.inscode&&void 0===t.resname&&void 0===t.sstruc&&void 0===t.resno&&void 0===t.chainname&&void 0===t.model)return-1;if(void 0!==t.keyword){if(t.keyword===Xo.BACKBONE&&!e.isBackbone())return!1;if(t.keyword===Xo.SIDECHAIN&&!e.isSidechain())return!1;if(t.keyword===Xo.BONDED&&!e.isBonded())return!1;if(t.keyword===Xo.RING&&!e.isRing())return!1;if(t.keyword===Xo.AROMATICRING&&!e.isAromatic())return!1;if(t.keyword===Xo.HETERO&&!e.isHetero())return!1;if(t.keyword===Xo.PROTEIN&&!e.isProtein())return!1;if(t.keyword===Xo.NUCLEIC&&!e.isNucleic())return!1;if(t.keyword===Xo.RNA&&!e.isRna())return!1;if(t.keyword===Xo.DNA&&!e.isDna())return!1;if(t.keyword===Xo.POLYMER&&!e.isPolymer())return!1;if(t.keyword===Xo.WATER&&!e.isWater())return!1;if(t.keyword===Xo.HELIX&&!e.isHelix())return!1;if(t.keyword===Xo.SHEET&&!e.isSheet())return!1;if(t.keyword===Xo.TURN&&!e.isTurn())return!1;if(t.keyword===Xo.ION&&!e.isIon())return!1;if(t.keyword===Xo.SACCHARIDE&&!e.isSaccharide())return!1;if(t.keyword===Xo.METAL&&!e.isMetal())return!1;if(t.keyword===Xo.POLARH&&!e.isPolarHydrogen())return!1}if(void 0!==t.atomname&&t.atomname!==e.atomname)return!1;if(void 0!==t.element&&t.element!==e.element)return!1;if(void 0!==t.altloc&&t.altloc!==e.altloc)return!1;if(void 0!==t.atomindex&&yo(t.atomindex,e.index)<0)return!1;if(void 0!==t.resname)if(Array.isArray(t.resname)){if(!t.resname.includes(e.resname))return!1}else if(t.resname!==e.resname)return!1;if(void 0!==t.sstruc&&t.sstruc!==e.sstruc)return!1;if(void 0!==t.resno)if(Array.isArray(t.resno)&&2===t.resno.length){if(t.resno[0]>e.resno||t.resno[1]e.resno||t.resno[1]0?e:null}function yl(e,t=!1){let i=e;return t&&(i=_l(e,(function(e){return void 0!==e.keyword&&!Qo.includes(e.keyword)||(void 0!==e.model||(void 0!==e.chainname||(void 0!==e.resname||(void 0!==e.resno||void 0!==e.sstruc))))}))),gl(i,dl)}function vl(e,t=!1){let i=e;return t&&(i=_l(e,(function(e){return!(void 0===e.keyword||!Qo.includes(e.keyword))||(void 0!==e.model||(void 0!==e.chainname||(void 0!==e.atomname||(void 0!==e.element||void 0!==e.altloc))))}))),gl(i,fl)}function bl(e,t=!1){let i=e;return t&&(i=_l(e,(function(e){return void 0!==e.keyword&&!Jo.includes(e.keyword)||(void 0!==e.resname||(void 0!==e.resno||(void 0!==e.atomname||(void 0!==e.element||(void 0!==e.altloc||(void 0!==e.sstruc||void 0!==e.inscode))))))}))),gl(i,ml)}function xl(e,t=!1){let i=e;return t&&(i=_l(e,(function(e){return void 0!==e.keyword||(void 0!==e.chainname||(void 0!==e.resname||(void 0!==e.resno||(void 0!==e.atomname||(void 0!==e.element||(void 0!==e.altloc||(void 0!==e.sstruc||void 0!==e.inscode)))))))}))),gl(i,pl)}class wl{constructor(e){this.signals={stringChanged:new Yo.Signal},this.setString(e)}get type(){return"selection"}setString(e,t){if(void 0===e&&(e=this.string||""),e===this.string)return;try{this.selection=function(e){let t={operator:void 0,rules:[]};if(!e)return t;let i,n,r=t;const s=[];"("===(e=e.replace(/\(/g," ( ").replace(/\)/g," ) ").trim()).charAt(0)&&")"===e.substr(-1)&&(e=e.slice(1,-1).trim());const a=e.split(/\s+/),o=e=>{i={operator:e,rules:[]},void 0===r?(r=i,t=i):(r.rules.push(i),s.push(r),r=i)},l=function(e){n=r,r=s.pop(),void 0===r&&(o(e),c(n))},c=function(e){r.rules.push(e)};let u=!1;for(let e=0;e0)if("NOT"===i)u=1;else if(1===u)u=2;else{if(2!==u)throw new Error("something went wrong with 'not'");u=!1,l()}if("AND"===i){if("OR"===r.operator){const e=r.rules.pop();o("AND"),c(e)}else r.operator="AND";continue}if("OR"===i){"AND"===r.operator?l("OR"):r.operator="OR";continue}if("NOT"===t.toUpperCase()){u=1,o(),r.negate=!0;continue}if(+i!=+i){const e=Xo[i];if(void 0!==e){c({keyword:e});continue}}if("HYDROGEN"===i){c({operator:"OR",rules:[{element:"H"},{element:"D"}]});continue}if("SMALL"===i){c({resname:el});continue}if("NUCLEOPHILIC"===i){c({resname:tl});continue}if("HYDROPHOBIC"===i){c({resname:il});continue}if("AROMATIC"===i){c({resname:nl});continue}if("AMIDE"===i){c({resname:rl});continue}if("ACIDIC"===i){c({resname:sl});continue}if("BASIC"===i){c({resname:al});continue}if("CHARGED"===i){c({resname:ol});continue}if("POLAR"===i){c({resname:ll});continue}if("NONPOLAR"===i){c({resname:cl});continue}if("CYCLIC"===i){c({resname:ul});continue}if("ALIPHATIC"===i){c({resname:hl});continue}if("SIDECHAINATTACHED"===i){c({operator:"OR",rules:[{keyword:Xo.SIDECHAIN},{operator:"AND",negate:!1,rules:[{keyword:Xo.PROTEIN},{operator:"OR",negate:!1,rules:[{atomname:"CA"},{atomname:"BB"}]}]},{operator:"AND",negate:!1,rules:[{resname:"PRO"},{atomname:"N"}]},{operator:"AND",negate:!1,rules:[{keyword:Xo.NUCLEIC},{operator:"OR",negate:!0,rules:[{atomname:"P"},{atomname:"OP1"},{atomname:"OP2"},{atomname:"O3'"},{atomname:"O3*"},{atomname:"HO3'"},{atomname:"O5'"},{atomname:"O5*"},{atomname:"HO5'"},{atomname:"C5'"},{atomname:"C5*"},{atomname:"H5'"},{atomname:"H5''"}]}]}]});continue}if("APOLARH"===i){c({operator:"AND",negate:!1,rules:[{element:"H"},{negate:!0,operator:void 0,rules:[{keyword:Xo.POLARH}]}]});continue}if("LIGAND"===i){c({operator:"AND",rules:[{operator:"OR",rules:[{operator:"AND",rules:[{keyword:Xo.HETERO},{negate:!0,operator:void 0,rules:[{keyword:Xo.POLYMER}]}]},{negate:!0,operator:void 0,rules:[{keyword:Xo.POLYMER}]}]},{negate:!0,operator:void 0,rules:[{operator:"OR",rules:[{keyword:Xo.WATER},{keyword:Xo.ION}]}]}]});continue}if(-1!==Ko.indexOf(i)){c({keyword:Xo.ALL});continue}if("@"===t.charAt(0)){const e=t.substr(1).split(",").map((e=>parseInt(e)));e.sort((function(e,t){return e-t})),c({atomindex:e});continue}if("#"===t.charAt(0)){console.error("# for element selection deprecated, use _"),c({element:i.substr(1)});continue}if("_"===t.charAt(0)){c({element:i.substr(1)});continue}if("["===t[0]&&"]"===t[t.length-1]){const e=i.substr(1,t.length-2).split(","),n=e.length>1?e:e[0];c({resname:n});continue}if(t.length>=1&&t.length<=4&&"^"!==t[0]&&":"!==t[0]&&"."!==t[0]&&"%"!==t[0]&&"/"!==t[0]&&isNaN(parseInt(t))){c({resname:i});continue}const n={operator:"AND",rules:[]},s=t.split("/");if(s.length>1&&s[1]){if(isNaN(parseInt(s[1])))throw new Error("model must be an integer");n.rules.push({model:parseInt(s[1])})}const h=s[0].split("%");h.length>1&&n.rules.push({altloc:h[1]});const d=h[0].split(".");if(d.length>1&&d[1]){if(d[1].length>4)throw new Error("atomname must be one to four characters");n.rules.push({atomname:d[1].substring(0,4).toUpperCase()})}const f=d[0].split(":");f.length>1&&f[1]&&n.rules.push({chainname:f[1]});const m=f[0].split("^");if(m.length>1&&n.rules.push({inscode:m[1]}),m[0]){let e,t;"-"===m[0][0]&&(m[0]=m[0].substr(1),e=!0),m[0].includes("--")&&(m[0]=m[0].replace("--","-"),t=!0);let i=m[0].split("-");if(1===i.length){let t=parseInt(i[0]);if(isNaN(t))throw new Error("resi must be an integer");e&&(t*=-1),n.rules.push({resno:t})}else{if(2!==i.length)throw new Error("resi range must contain one '-'");{const r=i.map((e=>parseInt(e)));e&&(r[0]*=-1),t&&(r[1]*=-1),n.rules.push({resno:[r[0],r[1]]})}}}if(1===n.rules.length)c(n.rules[0]);else{if(!(n.rules.length>1))throw new Error("empty selection chunk");c(n)}}return void 0===t.operator&&1===t.rules.length&&t.rules[0].hasOwnProperty("operator")&&(t=t.rules[0]),t}(e)}catch(e){this.selection={error:e.message}}const i=this.selection;this.string=e,this.test=yl(i),this.residueTest=vl(i),this.chainTest=bl(i),this.modelTest=xl(i),this.atomOnlyTest=yl(i,!0),this.residueOnlyTest=vl(i,!0),this.chainOnlyTest=bl(i,!0),this.modelOnlyTest=xl(i,!0),t||this.signals.stringChanged.dispatch(this.string)}isAllSelection(){return Ko.includes(this.string.toUpperCase())}isNoneSelection(){return Zo.includes(this.string.toUpperCase())}}class Sl extends qo{constructor(e){super(e),this.colormakerList=[],this.selectionList=[];(e.dataList||[]).forEach((e=>{const[t,i,n={}]=e;$l.hasScheme(t)?Object.assign(n,{scheme:t,structure:this.parameters.structure}):Object.assign(n,{scheme:"uniform",value:new Oi(t).getHex()}),this.colormakerList.push($l.getScheme(n)),this.selectionList.push(new wl(i))}))}atomColor(e){for(let t=0,i=this.selectionList.length;t{}),e)}catch(e){}const Rl="undefined"!=typeof window&&void 0!==window.orientation;let Ll=!1;function kl(e){Ll=e}let Ol=!1;function Nl(e){Ol=e}const Fl={log:Function.prototype.bind.call(console.log,console),info:Function.prototype.bind.call(console.info,console),warn:Function.prototype.bind.call(console.warn,console),error:Function.prototype.bind.call(console.error,console),time:Function.prototype.bind.call(console.time,console),timeEnd:Function.prototype.bind.call(console.timeEnd,console)};let Bl={color:"green",labelColor:8421504,labelAttachment:"bottom-center",labelSize:.7,labelZOffset:.5,labelYOffset:.1,labelBorder:!0,labelBorderColor:13882323,labelBorderWidth:.25,lineOpacity:.8,linewidth:5,opacity:.6,labelUnit:"angstrom",arcVisible:!0,planeVisible:!1};var zl;e.Debug=!!(zl=co("debug"))&&("string"!=typeof zl||/^1|true|t|yes|y$/i.test(zl));const Ul=["ngl","js"],Vl=new class{constructor(){this.activeWorkerCount=0,this._funcDict={},this._depsDict={},this._blobDict={}}add(e,t,i){this._funcDict[e]=t,this._depsDict[e]=i}get(e){return this._blobDict[e]||(this._blobDict[e]=El(this._funcDict[e],this._depsDict[e])),this._blobDict[e]}},$l=new class{constructor(){this.schemes={},this.userSchemes={}}getScheme(e){const t=((e||{}).scheme||"").toLowerCase();let i;return i=t in this.schemes?this.schemes[t]:t in this.userSchemes?this.userSchemes[t]:qo,new i(e)}getSchemes(){const e={};return Object.keys(this.schemes).forEach((function(t){e[t]=t})),Object.keys(this.userSchemes).forEach((function(t){e[t]=t.split("|")[1]})),e}getScales(){return Ml}getModes(){return Al}add(e,t){e=e.toLowerCase(),this.schemes[e]=t}addScheme(e,t){return function(e){return e instanceof qo}(e)||(e=this._createScheme(e)),this._addUserScheme(e,t)}_addUserScheme(e,t){t=t||"";const i=`${Oo()}|${t}`.toLowerCase();return this.userSchemes[i]=e,i}removeScheme(e){e=e.toLowerCase(),delete this.userSchemes[e]}_createScheme(e){return class extends qo{constructor(t){super(t),e.call(this,t)}}}addSelectionScheme(e,t){return this._addUserScheme(class extends Sl{constructor(t){super(Object.assign({dataList:e},t))}},t)}hasScheme(e){return(e=e.toLowerCase())in this.schemes||e in this.userSchemes}},Gl=new Do("datasource"),Hl=new Do("representatation"),jl=new class extends Do{constructor(){super("parser")}__hasObjName(e,t){const i=this.get(e);return i&&i.prototype.__objName===t}isTrajectory(e){return this.__hasObjName(e,"frames")}isStructure(e){return this.__hasObjName(e,"structure")}isVolume(e){return this.__hasObjName(e,"volume")}isSurface(e){return this.__hasObjName(e,"surface")}isBinary(e){const t=this.get(e);return t&&t.prototype.isBinary}isXml(e){const t=this.get(e);return t&&t.prototype.isXml}isJson(e){const t=this.get(e);return t&&t.prototype.isJson}getTrajectoryExtensions(){return this.names.filter((e=>this.isTrajectory(e)))}getStructureExtensions(){return this.names.filter((e=>this.isStructure(e)))}getVolumeExtensions(){return this.names.filter((e=>this.isVolume(e)))}getSurfaceExtensions(){return this.names.filter((e=>this.isSurface(e)))}},Wl=new Do("shader"),ql=new Do("decompressor"),Xl=new Do("component"),Yl=new Do("buffer"),Kl=new Do("picker");e.ListingDatasource=void 0,e.TrajectoryDatasource=void 0;class Zl{constructor(e,t={}){this.chunkSize=10485760,this.newline="\n",this.__pointer=0,this.__partialLine="",this.compressed=uo(t.compressed,!1),this.binary=uo(t.binary,!1),this.json=uo(t.json,!1),this.xml=uo(t.xml,!1),this.src=e}isBinary(){return this.binary||this.compressed}read(){return this._read().then((e=>{const t=this.compressed?ql.get(this.compressed):void 0;return this.compressed&&t?this.data=t(e):((this.binary||this.compressed)&&e instanceof ArrayBuffer&&(e=new Uint8Array(e)),this.data=e),this.data}))}_chunk(e,t){return t=Math.min(this.data.length,t),0===e&&this.data.length===t?this.data:this.isBinary()?this.data.subarray(e,t):this.data.substring(e,t)}chunk(e){const t=e+this.chunkSize;return this._chunk(e,t)}peekLines(e){const t=this.data,i=t.length,n=this.isBinary()?this.newline.charCodeAt(0):this.newline;let r,s=0;for(r=0;ri).lines}chunkCount(){return Math.floor(this.data.length/this.chunkSize)+1}asText(){return this.isBinary()?xo(this.data):this.data}chunkToLines(e,t,i){const n=this.newline;if(!this.isBinary()&&e.length===this.data.length)return{lines:e.split(n),partialLine:""};let r=[];const s=this.isBinary()?xo(e):e,a=s.lastIndexOf(n);if(-1===a)t+=s;else{const e=t+s.substr(0,a);r=r.concat(e.split(n)),t=a===s.length-n.length?"":s.substr(a+n.length)}return i&&""!==t&&r.push(t),{lines:r,partialLine:t}}nextChunk(){const e=this.__pointer;if(!(e>this.data.length))return this.__pointer+=this.chunkSize,this.chunk(e)}nextChunkOfLines(){const e=this.nextChunk();if(void 0===e)return;const t=this.__pointer>this.data.length,i=this.chunkToLines(e,this.__partialLine,t);return this.__partialLine=i.partialLine,i.lines}eachChunk(e){const t=this.chunkSize,i=this.data.length,n=this.chunkCount();for(let r=0;r{const r=i===n+1,s=this.chunkToLines(t,this.__partialLine,r);this.__partialLine=s.partialLine,e(s.lines,i,n)}))}dispose(){delete this.src}}class Ql extends Zl{_read(){return new Promise(((e,t)=>{const i=this.src,n=new FileReader;n.onload=t=>{t.target&&e(t.target.result)},n.onerror=e=>t(e),this.binary||this.compressed?n.readAsArrayBuffer(i):n.readAsText(i)}))}}class Jl extends Zl{_read(){return new Promise(((e,t)=>{const i=this.src,n=new XMLHttpRequest;n.open("GET",i,!0),n.addEventListener("load",(()=>{if(200===n.status||304===n.status||0===n.status)try{e(n.response)}catch(e){t(e)}else t(n.statusText)}),!1),n.addEventListener("error",(e=>t("network error")),!1),this.isBinary()?n.responseType="arraybuffer":this.json?n.responseType="json":this.xml?n.responseType="document":n.responseType="text",n.send()}))}}class ec{constructor(e,t={}){this.parameters=ho(t,{ext:"",compressed:!1,binary:jl.isBinary(t.ext||""),name:"",dir:"",path:"",protocol:""});const i={compressed:this.parameters.compressed,binary:this.parameters.binary,json:jl.isJson(this.parameters.ext),xml:jl.isXml(this.parameters.ext)};"undefined"!=typeof File&&e instanceof File||"undefined"!=typeof Blob&&e instanceof Blob?this.streamer=new Ql(e,i):this.streamer=new Jl(e,i)}}class tc extends ec{constructor(e,t={}){super(e,t),this.parserParams={voxelSize:t.voxelSize,firstModelOnly:t.firstModelOnly,asTrajectory:t.asTrajectory,cAlphaOnly:t.cAlphaOnly,delimiter:t.delimiter,comment:t.comment,columnNames:t.columnNames,inferBonds:t.inferBonds,name:this.parameters.name,path:this.parameters.path}}load(){return new(jl.get(this.parameters.ext))(this.streamer,this.parserParams).parse()}}class ic{constructor(e,t,i){this.name=t,this.path=i,this.signals={elementAdded:new Yo.Signal,elementRemoved:new Yo.Signal,nameChanged:new Yo.Signal},this.type="Script",this.dir=i.substring(0,i.lastIndexOf("/")+1);try{this.fn=new Function("stage","__name","__path","__dir",e)}catch(e){Fl.error("Script compilation failed",e),this.fn=function(){}}}run(e){return new Promise(((t,i)=>{try{this.fn.apply(null,[e,this.name,this.path,this.dir]),t()}catch(e){Fl.error("Script.fn",e),i(e)}}))}}class nc extends ec{load(){return this.streamer.read().then((()=>new ic(this.streamer.asText(),this.parameters.name,this.parameters.path)))}}function rc(e){const t=ql.names;let i,n,r="";i=e instanceof File?e.name:e instanceof Blob?"":e;const s=i.lastIndexOf("?"),a=-1!==s?i.substring(s):"";i=i.substring(0,-1===s?i.length:s);const o=i.replace(/^.*[\\/]/,"");let l=o.substring(0,o.lastIndexOf("."));const c=o.split(".");let u=c.length>1?(c.pop()||"").toLowerCase():"";const h=i.match(/^(.+):\/\/(.+)$/);h&&(r=h[1].toLowerCase(),i=h[2]||"");const d=i.substring(0,i.lastIndexOf("/")+1);if(t.includes(u)){n=u;const e=i.length-u.length-1;u=(i.substr(0,e).split(".").pop()||"").toLowerCase();const t=l.length-u.length-1;l=l.substr(0,t)}else n=!1;return{path:i,name:o,ext:u,base:l,dir:d,compressed:n,protocol:r,query:a,src:e}}function sc(e){let t=rc(e);const i=Gl.get(t.protocol);return i&&(t=rc(i.getUrl(t.src)),!t.ext&&i.getExt&&(t.ext=i.getExt(e))),t}function ac(e,t={}){const i=Object.assign(sc(e),t);let n;return jl.names.includes(i.ext)?n=new tc(i.src,i):Ul.includes(i.ext)&&(n=new nc(i.src,i)),n?n.load():Promise.reject(new Error(`autoLoad: ext '${i.ext}' unknown`))}var oc=Vo((function(e,t){!function(){var e={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function i(t){return function(t,n){var r,s,a,o,l,c,u,h,d,f=1,m=t.length,p="";for(s=0;s=0),o.type){case"b":r=parseInt(r,10).toString(2);break;case"c":r=String.fromCharCode(parseInt(r,10));break;case"d":case"i":r=parseInt(r,10);break;case"j":r=JSON.stringify(r,null,o.width?parseInt(o.width):0);break;case"e":r=o.precision?parseFloat(r).toExponential(o.precision):parseFloat(r).toExponential();break;case"f":r=o.precision?parseFloat(r).toFixed(o.precision):parseFloat(r);break;case"g":r=o.precision?String(Number(r.toPrecision(o.precision))):parseFloat(r);break;case"o":r=(parseInt(r,10)>>>0).toString(8);break;case"s":r=String(r),r=o.precision?r.substring(0,o.precision):r;break;case"t":r=String(!!r),r=o.precision?r.substring(0,o.precision):r;break;case"T":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=o.precision?r.substring(0,o.precision):r;break;case"u":r=parseInt(r,10)>>>0;break;case"v":r=r.valueOf(),r=o.precision?r.substring(0,o.precision):r;break;case"x":r=(parseInt(r,10)>>>0).toString(16);break;case"X":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}e.json.test(o.type)?p+=r:(!e.number.test(o.type)||h&&!o.sign?d="":(d=h?"+":"-",r=r.toString().replace(e.sign,"")),c=o.pad_char?"0"===o.pad_char?"0":o.pad_char.charAt(1):" ",u=o.width-(d+r).length,l=o.width&&u>0?c.repeat(u):"",p+=o.align?d+r+l:"0"===c?d+l+r:l+d+r)}return p}(function(t){if(r[t])return r[t];var i,n=t,s=[],a=0;for(;n;){if(null!==(i=e.text.exec(n)))s.push(i[0]);else if(null!==(i=e.modulo.exec(n)))s.push("%");else{if(null===(i=e.placeholder.exec(n)))throw new SyntaxError("[sprintf] unexpected placeholder");if(i[2]){a|=1;var o=[],l=i[2],c=[];if(null===(c=e.key.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(o.push(c[1]);""!==(l=l.substring(c[0].length));)if(null!==(c=e.key_access.exec(l)))o.push(c[1]);else{if(null===(c=e.index_access.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");o.push(c[1])}i[2]=o}else a|=2;if(3===a)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");s.push({placeholder:i[0],param_no:i[1],keys:i[2],sign:i[3],pad_char:i[4],align:i[5],width:i[6],precision:i[7],type:i[8]})}n=n.substring(i[0].length)}return r[t]=s}(t),arguments)}function n(e,t){return i.apply(null,[e].concat(t||[]))}var r=Object.create(null);t.sprintf=i,t.vsprintf=n,"undefined"!=typeof window&&(window.sprintf=i,window.vsprintf=n)}()}));class lc{getBlob(){return new Blob([this.getData()],{type:this.mimeType})}download(e,t){e=uo(e,this.defaultName),t=uo(t,this.defaultExt),go(this.getBlob(),`${e}.${t}`)}}const cc=[];class uc{constructor(e,t={}){this._mark=0,this._marks=[],this.offset=0,this.littleEndian=!0;let i=!1;void 0===e&&(e=8192),"number"==typeof e?e=new ArrayBuffer(e):i=!0;const n=t.offset?t.offset>>>0:0;let r=e.byteLength-n,s=n;e instanceof ArrayBuffer||(e.byteLength!==e.buffer.byteLength&&(s=e.byteOffset+n),e=e.buffer),this._lastWrittenByte=i?r:0,this.buffer=e,this.length=r,this.byteLength=r,this.byteOffset=s,this._data=new DataView(this.buffer,s,r)}available(e){return void 0===e&&(e=1),this.offset+e<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(e){return void 0===e&&(e=1),this.offset+=e,this}seek(e){return this.offset=e,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){const e=this._marks.pop();if(void 0===e)throw new Error("Mark stack empty");return this.seek(e),this}rewind(){return this.offset=0,this}ensureAvailable(e){if(void 0===e&&(e=1),!this.available(e)){const t=2*(this.offset+e),i=new Uint8Array(t);i.set(new Uint8Array(this.buffer)),this.buffer=i.buffer,this.length=this.byteLength=t,this._data=new DataView(this.buffer)}return this}readBoolean(){return 0!==this.readUint8()}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(e){void 0===e&&(e=1);for(var t=new Uint8Array(e),i=0;ithis._lastWrittenByte&&(this._lastWrittenByte=this.offset)}}class hc{constructor(){this.count=0,this.signals={countChanged:new Yo.Signal}}clear(){this.change(-this.count)}change(e){this.count+=e,this.signals.countChanged.dispatch(e,this.count),this.count<0&&Fl.warn("Counter.count below zero",this.count)}increment(){this.change(1)}decrement(){this.change(-1)}listen(e){this.change(e.count),e.signals.countChanged.add(this.change,this)}unlisten(e){const t=e.signals.countChanged;t.has(this.change,this)&&t.remove(this.change,this)}onZeroOnce(e,t){if(0===this.count)e.call(t);else{const i=()=>{0===this.count&&(this.signals.countChanged.remove(i,this),e.call(t))};this.signals.countChanged.add(i,this)}}dispose(){this.clear(),this.signals.countChanged.dispose()}}Wl.add("shader/BasicLine.vert","void main(){\n#include begin_vertex\n#include project_vertex\n}"),Wl.add("shader/BasicLine.frag","uniform vec3 uColor;\n#include common\n#include fog_pars_fragment\nvoid main(){\ngl_FragColor = vec4( uColor, 1.0 );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n}"),Wl.add("shader/Quad.vert","varying vec2 vUv;\nvoid main() {\nvUv = uv;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"),Wl.add("shader/Quad.frag","varying vec2 vUv;\nuniform sampler2D tForeground;\nuniform float scale;\nvoid main() {\nvec4 foreground = texture2D( tForeground, vUv );\ngl_FragColor = foreground * scale;\n}");class dc{constructor(){this.signals={updated:new Yo.Signal},this.maxDuration=-1/0,this.minDuration=1/0,this.avgDuration=14,this.lastDuration=1/0,this.prevFpsTime=0,this.lastFps=1/0,this.lastFrames=1,this.frames=0,this.count=0,this.begin()}update(){this.startTime=this.end(),this.currentTime=this.startTime,this.signals.updated.dispatch()}begin(){this.startTime=window.performance.now(),this.lastFrames=this.frames}end(){const e=window.performance.now();return this.count+=1,this.frames+=1,this.lastDuration=e-this.startTime,this.minDuration=Math.min(this.minDuration,this.lastDuration),this.maxDuration=Math.max(this.maxDuration,this.lastDuration),this.avgDuration-=this.avgDuration/30,this.avgDuration+=this.lastDuration/30,e>this.prevFpsTime+1e3&&(this.lastFps=this.frames,this.prevFpsTime=e,this.frames=0),e}}Wl.add("shader/chunk/fog_fragment.glsl","#ifdef USE_FOG\nfloat depth = length( vViewPosition );\n#ifdef FOG_EXP2\nfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"),Wl.add("shader/chunk/interior_fragment.glsl","if( gl_FrontFacing == false ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}"),Wl.add("shader/chunk/matrix_scale.glsl","float matrixScale( in mat4 m ){\nvec4 r = m[ 0 ];\nreturn sqrt( r[ 0 ] * r[ 0 ] + r[ 1 ] * r[ 1 ] + r[ 2 ] * r[ 2 ] );\n}"),Wl.add("shader/chunk/nearclip_vertex.glsl","#ifdef NEAR_CLIP\nif( vViewPosition.z < clipNear - 5.0 )\ngl_Position.z = 2.0 * gl_Position.w;\n#endif"),Wl.add("shader/chunk/nearclip_fragment.glsl","#ifdef NEAR_CLIP\nif( vViewPosition.z < clipNear )\ndiscard;\n#endif"),Wl.add("shader/chunk/opaque_back_fragment.glsl","#ifdef OPAQUE_BACK\n#ifdef FLIP_SIDED\nif( gl_FrontFacing == true ){\ngl_FragColor.a = 1.0;\n}\n#else\nif( gl_FrontFacing == false ){\ngl_FragColor.a = 1.0;\n}\n#endif\n#endif"),Wl.add("shader/chunk/radiusclip_vertex.glsl","#ifdef RADIUS_CLIP\nif( distance( vViewPosition, vClipCenter ) > clipRadius + 5.0 )\ngl_Position.z = 2.0 * gl_Position.w;\n#endif"),Wl.add("shader/chunk/radiusclip_fragment.glsl","#ifdef RADIUS_CLIP\nif( distance( vViewPosition, vClipCenter ) > clipRadius )\ndiscard;\n#endif"),Wl.add("shader/chunk/unpack_color.glsl","vec3 unpackColor(float f) {\nvec3 color;\ncolor.r = floor(f / 256.0 / 256.0);\ncolor.g = floor((f - color.r * 256.0 * 256.0) / 256.0);\ncolor.b = floor(f - color.r * 256.0 * 256.0 - color.g * 256.0);\nreturn color / 255.0;\n}");const fc=/^(?!\/\/)\s*#include\s+(\S+)/gim,mc={};function pc(e,t={}){let i=e+"|";for(const e in t)i+=e+":"+t[e];if(!mc[i]){const n=function(e){if(void 0===e)return"";const t=[];for(const i in e){const n=e[i];n&&t.push(`#define ${i} ${n}`)}return t.join("\n")+"\n"}(t);let r=Wl.get(`shader/${e}`);if(!r)throw new Error(`empty shader, '${e}'`);r=r.replace(fc,(function(e,t){const i=`shader/chunk/${t}.glsl`,n=Wl.get(i)||$n[t];if(!n)throw new Error(`empty chunk, '${t}'`);return n})),mc[i]=n+r}return mc[i]}if("undefined"!=typeof WebGLRenderingContext){const t=WebGLRenderingContext.prototype,i=t.getShaderParameter;t.getShaderParameter=function(){return!e.Debug||i.apply(this,arguments)};const n=t.getShaderInfoLog;t.getShaderInfoLog=function(){return e.Debug?n.apply(this,arguments):""};const r=t.getProgramParameter;t.getProgramParameter=function(i,n){return!e.Debug&&n===t.LINK_STATUS||r.apply(this,arguments)};const s=t.getProgramInfoLog;t.getProgramInfoLog=function(){return e.Debug?s.apply(this,arguments):""}}const gc=[[[0,0]],[[4,4],[-4,-4]],[[-2,-6],[6,-2],[-6,2],[2,6]],[[1,-3],[-1,3],[5,1],[-3,-5],[-5,5],[-7,-1],[3,7],[7,-7]],[[1,1],[-1,-3],[-3,2],[4,-1],[-5,-2],[2,5],[5,3],[3,-5],[-2,6],[0,-7],[-4,-6],[-6,4],[-8,0],[7,-4],[6,7],[-7,-8]],[[-4,-7],[-7,-5],[-3,-5],[-5,-4],[-1,-4],[-2,-2],[-6,-1],[-4,0],[-7,1],[-1,2],[-6,3],[-3,3],[-7,6],[-3,6],[-5,7],[-1,7],[5,-7],[1,-6],[6,-5],[4,-4],[2,-3],[7,-2],[1,-1],[4,-1],[2,1],[6,2],[0,4],[4,4],[2,5],[7,5],[5,6],[3,7]]];gc.forEach((e=>{e.forEach((e=>{e[0]*=.0625,e[1]*=.0625}))}));class _c{constructor(e,t,i,n){this.canvas=document.createElement("canvas"),this._viewer=i,this._factor=uo(n.factor,2),this._antialias=uo(n.antialias,!1),this._onProgress=n.onProgress,this._onFinish=n.onFinish,this._antialias&&(this._factor*=2),this._n=this._factor*this._factor,this._width=this._viewer.width,this._height=this._viewer.height,this._antialias?(this.canvas.width=this._width*this._factor/2,this.canvas.height=this._height*this._factor/2):(this.canvas.width=this._width*this._factor,this.canvas.height=this._height*this._factor),this._ctx=this.canvas.getContext("2d"),this._viewerSampleLevel=i.sampleLevel,this._viewer.setSampling(-1)}_renderTile(e){const t=this._viewer,i=this._width,n=this._height,r=this._factor,s=e%r*i,a=Math.floor(e/r)*n;if(t.camera.setViewOffset(i*r,n*r,s,a,i,n),t.render(),this._antialias){const e=Math.round((s+i)/2)-Math.round(s/2),r=Math.round((a+n)/2)-Math.round(a/2);this._ctx.drawImage(t.renderer.domElement,Math.round(s/2),Math.round(a/2),e,r)}else this._ctx.drawImage(t.renderer.domElement,Math.floor(s),Math.floor(a),Math.ceil(i),Math.ceil(n));"function"==typeof this._onProgress&&this._onProgress(e+1,this._n,!1)}_finalize(){this._viewer.setSampling(this._viewerSampleLevel),this._viewer.camera.view=null,"function"==typeof this._onFinish&&this._onFinish(this._n+1,this._n,!1)}render(){for(let e=0;e<=this._n;++e)e===this._n?this._finalize():this._renderTile(e)}renderAsync(){let e=0;const t=this._n,i=()=>{e===t?this._finalize():this._renderTile(e),e+=1};for(let e=0;e<=t;++e)setTimeout(i,0)}}const yc=2*Math.PI,vc=180/Math.PI;function bc(e,t,i=1,n=0,r){const s=r?r.length:e.length/i;let a=0,o=0;if(r)for(let l=0;lt&&(t=e[i]);return t}function Dc(e){let t=1/0;for(let i=0,n=e.length;i=0;c--){for(l=a-1;l>=0;l--)if(h=4*(c*a+l),o[h]!==t||o[h+1]!==i||o[h+2]!==n||o[h+3]!==r){u=!0;break}if(u)break}const m=c;for(u=!1,l=a-1;l>=0;l--){for(c=s-1;c>=0;c--)if(h=4*(c*a+l),o[h]!==t||o[h+1]!==i||o[h+2]!==n||o[h+3]!==r){u=!0;break}if(u)break}const p=l,g=document.createElement("canvas");return g.width=p-f,g.height=m-d,g.getContext("2d").drawImage(e,f,d,g.width,g.height,0,0,g.width,g.height),g}(e,s?0:255*t.r,s?0:255*t.g,s?0:255*t.b,s?0:255)}return e}function d(e,i,n){"function"==typeof t.onProgress&&t.onProgress(e,i,n)}return new Promise((function(t,i){const c=new _c(a,o,e,{factor:n,antialias:r,onProgress:d,onFinish:function(n,r){h(c.canvas).toBlob((function(n){a.setClearAlpha(l),u(!0),e.requestRender(),d(r,r,!0),n?t(n):i("error creating image")}),"image/png")}});a.setClearAlpha(s?0:1),u(),c.renderAsync()}))}const Nc=new _t,Fc=new qt,Bc=new qt;const zc=new Ge,Uc=new qt,Vc=new qt;function $c(e,t){Uc.copy(t.projectionMatrix).invert(),Vc.copy(t.projectionMatrix).transpose(),e.traverse((function(e){const t=e.material;if(!t)return;const i=t.uniforms;i&&(i.projectionMatrixInverse&&i.projectionMatrixInverse.value.copy(Uc),i.projectionMatrixTranspose&&i.projectionMatrixTranspose.value.copy(Vc))}))}function Gc(e,t,i){const n=e.createShader(i);if(!n)return void console.log(`error creating WebGL shader ${i}`);e.shaderSource(n,t),e.compileShader(n);return e.getShaderParameter(n,e.COMPILE_STATUS)?n:(console.log(`error compiling shader ${n}: ${e.getShaderInfoLog(n)}`),e.deleteShader(n),null)}function Hc(e,t){const i=e.getExtension(t);return i||console.log(`extension '${t}' not available`),i}const jc=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]);function Wc(e){const t=document.createElement("canvas");t.width=16,t.height=16,t.style.width="16px",t.style.height="16px";const i=t.getContext("webgl")||t.getContext("experimental-webgl");if(!i)return console.log(`error creating webgl context for ${e}`),!1;if(!(i instanceof WebGLRenderingContext))return console.log("Got unexpected type for WebGL rendering context"),!1;Hc(i,"OES_texture_float"),Hc(i,"OES_texture_half_float"),Hc(i,"WEBGL_color_buffer_float");const n=Gc(i,"\nattribute vec4 a_position;\n\nvoid main() {\n gl_Position = a_position;\n}",i.VERTEX_SHADER),r=Gc(i,"\nprecision mediump float;\nuniform vec4 u_color;\nuniform sampler2D u_texture;\n\nvoid main() {\n gl_FragColor = texture2D(u_texture, vec2(0.5, 0.5)) * u_color;\n}",i.FRAGMENT_SHADER);if(!n||!r)return!1;const s=function(e,t,i,n){const r=e.createProgram();return r?(t.forEach((t=>e.attachShader(r,t))),i&&i.forEach(((t,i)=>{e.bindAttribLocation(r,n?n[i]:i,t)})),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?r:(console.log(`error linking program: ${e.getProgramInfoLog(r)}`),e.deleteProgram(r),null)):void console.log("error creating WebGL program")}(i,[n,r]);if(!s)return console.log("error creating WebGL program"),!1;i.useProgram(s);const a=i.getAttribLocation(s,"a_position"),o=i.getUniformLocation(s,"u_color");if(!o)return console.log("error getting 'u_color' uniform location"),!1;const l=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,l),i.bufferData(i.ARRAY_BUFFER,jc,i.STATIC_DRAW),i.enableVertexAttribArray(a),i.vertexAttribPointer(a,2,i.FLOAT,!1,0,0);const c=i.createTexture(),u=new Uint8Array([255,255,255,255]);i.bindTexture(i.TEXTURE_2D,c),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,1,1,0,i.RGBA,i.UNSIGNED_BYTE,u);const h=i.createTexture();i.bindTexture(i.TEXTURE_2D,h),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,1,1,0,i.RGBA,e,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST);const d=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,d),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,h,0);if(i.checkFramebufferStatus(i.FRAMEBUFFER)!==i.FRAMEBUFFER_COMPLETE)return console.log(`error creating framebuffer for ${e}`),!1;i.bindTexture(i.TEXTURE_2D,c),i.uniform4fv(o,[0,10,20,1]),i.drawArrays(i.TRIANGLES,0,6),i.bindTexture(i.TEXTURE_2D,h),i.bindFramebuffer(i.FRAMEBUFFER,null),i.clearColor(1,0,0,1),i.clear(i.COLOR_BUFFER_BIT),i.uniform4fv(o,[0,.1,.05,1]),i.drawArrays(i.TRIANGLES,0,6);const f=new Uint8Array(4);if(i.readPixels(0,0,1,1,i.RGBA,i.UNSIGNED_BYTE,f),0!==f[0]||f[1]<248||f[2]<248||f[3]<254)return console.log(`not able to actually render to ${e} texture`),!1;if(e===i.FLOAT){i.bindFramebuffer(i.FRAMEBUFFER,d);const e=new Float32Array(4);i.readPixels(0,0,1,1,i.RGBA,i.FLOAT,e);const t=i.getError();if(t)return console.log(`error reading pixels as float: '${function(e,t){switch(t){case e.NO_ERROR:return"no error";case e.INVALID_ENUM:return"invalid enum";case e.INVALID_VALUE:return"invalid value";case e.INVALID_OPERATION:return"invalid operation";case e.INVALID_FRAMEBUFFER_OPERATION:return"invalid framebuffer operation";case e.OUT_OF_MEMORY:return"out of memory";case e.CONTEXT_LOST_WEBGL:return"context lost"}return"unknown error"}(i,t)}'`),!1}return!0}const qc=new Float32Array(100),Xc=new Uint8Array(100),Yc=[12,7,13,17,11,6,8,18,16,2,14,22,10,1,3,9,19,23,21,15,5,0,4,24,20],Kc=new qt;function Zc(e,t,i,n,r){const s=r.uniforms,a=[];if(s&&(s.objectId&&(s.objectId.value=Ll?this.id:this.id/255,a.push("objectId")),(s.modelViewMatrixInverse||s.modelViewMatrixInverseTranspose||s.modelViewProjectionMatrix||s.modelViewProjectionMatrixInverse)&&this.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,this.matrixWorld),s.modelViewMatrixInverse&&(s.modelViewMatrixInverse.value.copy(this.modelViewMatrix).invert(),a.push("modelViewMatrixInverse")),s.modelViewMatrixInverseTranspose&&(s.modelViewMatrixInverse?s.modelViewMatrixInverseTranspose.value.copy(s.modelViewMatrixInverse.value).transpose():s.modelViewMatrixInverseTranspose.value.copy(this.modelViewMatrix).invert().transpose(),a.push("modelViewMatrixInverseTranspose")),s.modelViewProjectionMatrix&&(s.modelViewProjectionMatrix.value.multiplyMatrices(i.projectionMatrix,this.modelViewMatrix),a.push("modelViewProjectionMatrix")),s.modelViewProjectionMatrixInverse&&(s.modelViewProjectionMatrix?(Kc.copy(s.modelViewProjectionMatrix.value),s.modelViewProjectionMatrixInverse.value.copy(Kc.invert())):(Kc.multiplyMatrices(i.projectionMatrix,this.modelViewMatrix),s.modelViewProjectionMatrixInverse.value.copy(Kc.invert())),a.push("modelViewProjectionMatrixInverse")),a.length)){const t=e.properties.get(r);if(t.program){const i=e.getContext(),n=t.program;i.useProgram(n.program);const r=n.getUniforms();a.forEach((function(e){r.setValue(i,e,s[e].value)}))}}}class Qc{constructor(e){if(this.boundingBox=new bt,this.boundingBoxSize=new _t,this.boundingBoxLength=0,this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}},this.distVector=new _t,this.signals={ticked:new Yo.Signal,rendered:new Yo.Signal},"string"==typeof e){const t=document.getElementById(e);this.container=null===t?document.createElement("div"):t}else e instanceof HTMLElement?this.container=e:this.container=document.createElement("div");if(this.container===document.body)this.width=window.innerWidth||1,this.height=window.innerHeight||1;else{const e=this.container.getBoundingClientRect();this.width=e.width||1,this.height=e.height||1,this.container.style.overflow="hidden"}this.wrapper=document.createElement("div"),this.wrapper.style.position="relative",this.container.appendChild(this.wrapper),this._initParams(),this._initStats(),this._initCamera(),this._initScene(),!1!==this._initRenderer()?(this._initHelper(),this.setBackground(),this.setFog(),this.animate=this.animate.bind(this)):Fl.error("Viewer: could not initialize renderer")}_initParams(){this.parameters={fogColor:new Oi(0),fogNear:50,fogFar:100,backgroundColor:new Oi(0),cameraType:"perspective",cameraFov:40,cameraEyeSep:.3,cameraZ:-80,clipNear:0,clipFar:100,clipDist:10,clipMode:"scene",clipScale:"relative",lightColor:new Oi(14540253),lightIntensity:1.2,ambientColor:new Oi(14540253),ambientIntensity:.3,sampleLevel:0,outputColorSpace:"srgb-linear"}}_initCamera(){const e=new _t(0,0,0),{width:t,height:i}=this;this.perspectiveCamera=new Tn(this.parameters.cameraFov,t/i),this.perspectiveCamera.position.z=this.parameters.cameraZ,this.perspectiveCamera.lookAt(e),this.orthographicCamera=new Qn(t/-2,t/2,i/2,i/-2),this.orthographicCamera.position.z=this.parameters.cameraZ,this.orthographicCamera.lookAt(e),this.stereoCamera=new oo,this.stereoCamera.aspect=.5,this.stereoCamera.eyeSep=this.parameters.cameraEyeSep;const n=this.parameters.cameraType;if("orthographic"===n)this.camera=this.orthographicCamera;else{if("perspective"!==n&&"stereo"!==n)throw new Error(`Unknown cameraType '${n}'`);this.camera=this.perspectiveCamera}this.camera.updateProjectionMatrix()}_initStats(){this.stats=new dc}_initScene(){this.scene||(this.scene=new Sa,this.scene.name="scene"),this.rotationGroup=new ma,this.rotationGroup.name="rotationGroup",this.scene.add(this.rotationGroup),this.translationGroup=new ma,this.translationGroup.name="translationGroup",this.rotationGroup.add(this.translationGroup),this.modelGroup=new ma,this.modelGroup.name="modelGroup",this.translationGroup.add(this.modelGroup),this.pickingGroup=new ma,this.pickingGroup.name="pickingGroup",this.translationGroup.add(this.pickingGroup),this.backgroundGroup=new ma,this.backgroundGroup.name="backgroundGroup",this.translationGroup.add(this.backgroundGroup),this.helperGroup=new ma,this.helperGroup.name="helperGroup",this.translationGroup.add(this.helperGroup),this.scene.fog=new wa(this.parameters.fogColor.getHex()),this.directionalLight=new io(this.parameters.lightColor.getHex(),this.parameters.lightIntensity),this.scene.add(this.directionalLight),this.ambientLight=new no(this.parameters.ambientColor.getHex(),this.parameters.ambientIntensity),this.scene.add(this.ambientLight)}_initRenderer(){const t=window.devicePixelRatio,{width:i,height:n}=this;try{this.renderer=new xa({preserveDrawingBuffer:!0,alpha:!0,antialias:!0})}catch(e){return this.wrapper.innerHTML='',!1}this.renderer.setPixelRatio(t),this.renderer.setSize(i,n),this.renderer.autoClear=!1,this.renderer.sortObjects=!0,this.renderer.outputColorSpace=this.parameters.outputColorSpace,this.renderer.useLegacyLights=!0;const r=this.renderer.getContext();this.renderer.capabilities.isWebGL2?(Nl(!0),kl(this.renderer.extensions.get("EXT_color_buffer_float")),this.supportsHalfFloat=!0):(Nl(this.renderer.extensions.get("EXT_frag_depth")),this.renderer.extensions.get("OES_element_index_uint"),kl(this.renderer.extensions.get("OES_texture_float")&&this.renderer.extensions.get("WEBGL_color_buffer_float")||this.renderer.extensions.get("OES_texture_float")&&Wc(r.FLOAT)),this.renderer.extensions.get("OES_texture_float"),this.supportsHalfFloat=this.renderer.extensions.get("OES_texture_half_float")&&Wc(36193)),this.wrapper.appendChild(this.renderer.domElement);const s=i*t,a=n*t;e.Debug&&console.log(JSON.stringify({Browser:Il,OES_texture_float:!!this.renderer.extensions.get("OES_texture_float"),OES_texture_half_float:!!this.renderer.extensions.get("OES_texture_half_float"),WEBGL_color_buffer_float:!!this.renderer.extensions.get("WEBGL_color_buffer_float"),"testTextureSupport Float":Wc(r.FLOAT),"testTextureSupport HalfFloat":Wc(36193),"this.supportsHalfFloat":this.supportsHalfFloat,SupportsReadPixelsFloat:Ll},null,2)),this.pickingTarget=new ft(s,a,{minFilter:U,magFilter:U,stencilBuffer:!1,format:J,type:Ll?K:W}),this.pickingTarget.texture.generateMipmaps=!1,this.pickingTarget.texture.colorSpace=this.parameters.outputColorSpace,this.renderer.setRenderTarget(this.pickingTarget),this.renderer.clear(),this.renderer.setRenderTarget(null),this.sampleTarget=new ft(s,a,{minFilter:G,magFilter:G,format:J,type:this.supportsHalfFloat?Z:Ll?K:W}),this.sampleTarget.texture.colorSpace=this.parameters.outputColorSpace,this.holdTarget=new ft(s,a,{minFilter:U,magFilter:U,format:J,type:this.supportsHalfFloat?Z:Ll?K:W}),this.holdTarget.texture.colorSpace=this.parameters.outputColorSpace,this.compositeUniforms={tForeground:new lo(this.sampleTarget.texture),scale:new lo(1)},this.compositeMaterial=new An({uniforms:this.compositeUniforms,vertexShader:pc("Quad.vert"),fragmentShader:pc("Quad.frag"),premultipliedAlpha:!0,transparent:!0,blending:2,depthTest:!1,depthWrite:!1}),this.compositeCamera=new Qn(-1,1,1,-1,0,1),this.compositeScene=new Sa,this.compositeScene.name="compositeScene",this.compositeScene.add(new yn(new Vn(2,2),this.compositeMaterial))}_initHelper(){const e=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),t=new Float32Array(24),i=new Ji;i.setIndex(new $i(e,1)),i.setAttribute("position",new $i(t,3));const n=new An({uniforms:{uColor:{value:new Oi("skyblue")}},vertexShader:pc("BasicLine.vert"),fragmentShader:pc("BasicLine.frag")});this.boundingBoxMesh=new ka(i,n),this.helperGroup.add(this.boundingBoxMesh)}updateHelper(){const e=this.boundingBoxMesh.geometry.attributes.position,t=e.array,{min:i,max:n}=this.boundingBox;t[0]=n.x,t[1]=n.y,t[2]=n.z,t[3]=i.x,t[4]=n.y,t[5]=n.z,t[6]=i.x,t[7]=i.y,t[8]=n.z,t[9]=n.x,t[10]=i.y,t[11]=n.z,t[12]=n.x,t[13]=n.y,t[14]=i.z,t[15]=i.x,t[16]=n.y,t[17]=i.z,t[18]=i.x,t[19]=i.y,t[20]=i.z,t[21]=n.x,t[22]=i.y,t[23]=i.z,e.needsUpdate=!0,this.boundingBox.isEmpty()||this.boundingBoxMesh.geometry.computeBoundingSphere()}get cameraDistance(){return Math.abs(this.camera.position.z)}set cameraDistance(e){this.camera.position.z=-e}add(t,i){i?i.forEach((e=>this.addBuffer(t,e))):this.addBuffer(t),t.group.name="meshGroup",t.wireframeGroup.name="wireframeGroup",t.parameters.background?(this.backgroundGroup.add(t.group),this.backgroundGroup.add(t.wireframeGroup)):(this.modelGroup.add(t.group),this.modelGroup.add(t.wireframeGroup)),t.pickable&&this.pickingGroup.add(t.pickingGroup),e.Debug&&this.updateHelper()}addBuffer(e,t){function i(n){n instanceof ma?n.children.forEach(i):(n.userData.buffer=e,n.userData.instance=t,n.onBeforeRender=Zc)}const n=e.getMesh();t&&n.applyMatrix4(t.matrix),i(n),e.group.add(n);const r=e.getWireframeMesh();if(t&&(r.matrix.copy(n.matrix),r.position.copy(n.position),r.quaternion.copy(n.quaternion),r.scale.copy(n.scale)),i(r),e.wireframeGroup.add(r),e.pickable){const r=e.getPickingMesh();t&&(r.matrix.copy(n.matrix),r.position.copy(n.position),r.quaternion.copy(n.quaternion),r.scale.copy(n.scale)),i(r),e.pickingGroup.add(r)}t?this._updateBoundingBox(e.geometry,e.matrix,t.matrix):this._updateBoundingBox(e.geometry,e.matrix)}remove(t){this.translationGroup.children.forEach((function(e){e.remove(t.group),e.remove(t.wireframeGroup)})),t.pickable&&this.pickingGroup.remove(t.pickingGroup),this.updateBoundingBox(),e.Debug&&this.updateHelper()}_updateBoundingBox(e,t,i){const n=this.boundingBox;function r(e,t,i){null==e.boundingBox&&e.computeBoundingBox();const r=e.boundingBox.clone();t&&r.applyMatrix4(t),i&&r.applyMatrix4(i),r.min.equals(r.max)&&r.expandByScalar(5),n.union(r)}function s(e){if(void 0!==e.geometry){let t,i;e.userData.buffer&&(t=e.userData.buffer.matrix),e.userData.instance&&(i=e.userData.instance.matrix),r(e.geometry,t,i)}}e?r(e,t,i):(n.makeEmpty(),this.modelGroup.traverse(s),this.backgroundGroup.traverse(s)),n.getSize(this.boundingBoxSize),this.boundingBoxLength=this.boundingBoxSize.length()}updateBoundingBox(){this._updateBoundingBox(),e.Debug&&this.updateHelper()}getPickingPixels(){const{width:e,height:t}=this,i=e*t*4,n=Ll?new Float32Array(i):new Uint8Array(i);return this.render(!0),this.renderer.readRenderTargetPixels(this.pickingTarget,0,0,e,t,n),n}getImage(e){return new Promise((t=>{if(e){const{width:e,height:i}=this,n=e*i*4;let r=this.getPickingPixels();if(Ll){const e=new Uint8Array(n);for(let t=0;t500&&!this.isStill&&this.sampleLevel<3&&-1!==this.sampleLevel){const t=this.sampleLevel;this.sampleLevel=3,this.renderPending=!0,this.render(),this.isStill=!0,this.sampleLevel=t,e.Debug&&Fl.log("rendered still frame")}this.frameRequest=window.requestAnimationFrame(this.animate)}pick(e,t){if("stereo"===this.parameters.cameraType)return{pid:0,instance:void 0,picker:void 0};e*=window.devicePixelRatio,t*=window.devicePixelRatio,e=Math.max(e-2,0),t=Math.max(t-2,0);let i,n,r=0;const s=Ll?qc:Xc;this.render(!0),this.renderer.readRenderTargetPixels(this.pickingTarget,e,t,5,5,s);for(let e=0;e22&&(this.stats.begin(),this.isStill=!1),this.renderPending=!0,window.requestAnimationFrame((()=>{this.render(),this.stats.update()})))}updateZoom(){const e=Ro(this.perspectiveCamera.fov),t=2*Math.tan(e/2)*this.cameraDistance;this.orthographicCamera.zoom=this.height/t}absoluteToRelative(e){return 50*(1-e/this.bRadius)}relativeToAbsolute(e){return this.bRadius*(1-e/50)}__updateClipping(){const e=this.parameters;this.bRadius=Math.max(10,.5*this.boundingBoxLength),isFinite(this.bRadius)||(this.bRadius=50),this.camera.getWorldPosition(this.distVector),this.cDist=this.distVector.length(),this.cDist||(this.cameraDistance=Math.abs(e.cameraZ),this.cDist=Math.abs(e.cameraZ));const t=this.scene.fog;if(t.color.set(e.fogColor),"camera"===e.clipMode)this.camera.near=e.clipNear,this.camera.far=e.clipFar,t.near=e.fogNear,t.far=e.fogFar;else if("absolute"===e.clipScale)this.camera.near=this.cDist-e.clipNear,this.camera.far=this.cDist+e.clipFar,t.near=this.cDist-e.fogNear,t.far=this.cDist+e.fogFar;else{const i=(50-e.clipNear)/50,n=-(50-e.clipFar)/50;this.camera.near=this.cDist-this.bRadius*i,this.camera.far=this.cDist+this.bRadius*n;const r=(50-e.fogNear)/50,s=-(50-e.fogFar)/50;t.near=this.cDist-this.bRadius*r,t.far=this.cDist+this.bRadius*s}"camera"!==e.clipMode&&("PerspectiveCamera"===this.camera.type?(this.camera.near=Math.max(.1,e.clipDist,this.camera.near),this.camera.far=Math.max(1,this.camera.far),t.near=Math.max(.1,t.near),t.far=Math.max(1,t.far)):"OrthographicCamera"===this.camera.type&&e.clipDist>0&&(this.camera.near=Math.max(e.clipDist,this.camera.near)))}__updateCamera(){const e=this.camera;e.updateMatrix(),e.updateMatrixWorld(!0),e.updateProjectionMatrix(),function(e,t,i,n,r){let s=new Ge;i.getSize(s);const a=s.height,o=i.getPixelRatio(),l="OrthographicCamera"===t.type;zc.set(s.width,s.height),Uc.copy(t.projectionMatrix).invert(),Vc.copy(t.projectionMatrix).transpose(),e.traverse((function(e){const t=e.material;if(!t)return;const i=t.uniforms;if(i){if(t.clipNear){const e=(50-t.clipNear)/50,s=n-r*e;i.clipNear.value=s}i.canvasHeight&&(i.canvasHeight.value=a),i.resolution&&i.resolution.value.copy(zc),i.pixelRatio&&(i.pixelRatio.value=o),i.projectionMatrixInverse&&i.projectionMatrixInverse.value.copy(Uc),i.projectionMatrixTranspose&&i.projectionMatrixTranspose.value.copy(Vc),i.ortho&&(i.ortho.value=l)}}))}(this.scene,e,this.renderer,this.cDist,this.bRadius),function(e,t){e.traverseVisible((function(e){if(!(e instanceof Ua&&e.userData.buffer.parameters.sortParticles))return;const i=e.geometry.attributes,n=i.position.count;if(0===n)return;let r,s,a,o,l,c,u,h;Fc.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld),Bc.multiplyMatrices(t.projectionMatrix,Fc),e.userData.sortData?(r=e.userData.sortData,a=r.__zArray,s=r.__sortArray,o=r.__cmpFn):(a=new Float32Array(n),s=new Uint32Array(n),o=function(e,t){const i=a[e],n=a[t];return i>n?1:it?1:e=c&&t(e[a],s)>0;)e[a+1]=e[a],--a;e[a+1]=s}if(-1===l)break;u=r[l--],c=r[l--]}else{for(a=c+1,o=u,h(c+u>>1,a),t(e[c],e[u])>0&&h(c,u),t(e[a],e[u])>0&&h(a,u),t(e[c],e[a])>0&&h(c,a),s=e[a];;){do{a++}while(t(e[a],s)<0);do{o--}while(t(e[o],s)>0);if(o=o-c?(r[++l]=a,r[++l]=u,u=o-1):(r[++l]=c,r[++l]=o-1,c=a)}}(s,o);for(let e in i){const t=i[e],a=t.array,o=t.itemSize;r[e]||(r[e]=new Float32Array(o*n)),h=r[e],r[e]=a;for(let e=0;e0&&"stereo"!==this.parameters.cameraType?this.__renderSuperSample(t,i):this.__renderModelGroup(t,i)}render(e=!1,t){if(this.rendering)Fl.warn("'tried to call 'render' from within 'render'");else{this.rendering=!0;try{this.__updateClipping(),this.__updateCamera(),this.__updateLights(),this.updateInfo(!0),"stereo"===this.parameters.cameraType?this.__renderStereo(e,t):this.__render(e,this.camera,t),this.lastRenderedPicking=e}finally{this.rendering=!1,this.renderPending=!1}this.signals.rendered.dispatch()}}clear(){Fl.log("scene cleared"),this.scene.remove(this.rotationGroup),this._initScene(),this.renderer.clear()}dispose(){this.renderer.dispose(),window.cancelAnimationFrame(this.frameRequest)}}function Jc(e){const t=e.touches[0].pageX-e.touches[1].pageX,i=e.touches[0].pageY-e.touches[1].pageY;return Math.sqrt(t*t+i*i)}class eu{constructor(e,t={}){this.domElement=e,this.signals={moved:new Yo.Signal,scrolled:new Yo.Signal,dragged:new Yo.Signal,dropped:new Yo.Signal,clicked:new Yo.Signal,hovered:new Yo.Signal,doubleClicked:new Yo.Signal},this.position=new Ge,this.prevPosition=new Ge,this.down=new Ge,this.canvasPosition=new Ge,this.prevClickCP=new Ge,this.moving=!1,this.hovering=!0,this.scrolled=!1,this.lastMoved=1/0,this.which=0,this.buttons=0,this.pressed=!1,this.altKey=!1,this.ctrlKey=!1,this.metaKey=!1,this.shiftKey=!1,this.domElement.style.touchAction="none",this.hoverTimeout=uo(t.hoverTimeout,50),this.handleScroll=uo(t.handleScroll,!0),this.doubleClickSpeed=uo(t.doubleClickSpeed,500),this._listen=this._listen.bind(this),this._onMousewheel=this._onMousewheel.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMousedown=this._onMousedown.bind(this),this._onMouseup=this._onMouseup.bind(this),this._onContextmenu=this._onContextmenu.bind(this),this._onTouchstart=this._onTouchstart.bind(this),this._onTouchend=this._onTouchend.bind(this),this._onTouchmove=this._onTouchmove.bind(this),this._listen();const i={passive:!1};document.addEventListener("mousewheel",this._onMousewheel,i),document.addEventListener("wheel",this._onMousewheel,i),document.addEventListener("MozMousePixelScroll",this._onMousewheel,i),document.addEventListener("mousemove",this._onMousemove,i),document.addEventListener("mousedown",this._onMousedown,i),document.addEventListener("mouseup",this._onMouseup,i),document.addEventListener("contextmenu",this._onContextmenu,i),document.addEventListener("touchstart",this._onTouchstart,i),document.addEventListener("touchend",this._onTouchend,i),document.addEventListener("touchmove",this._onTouchmove,i)}get key(){let e=0;return this.altKey&&(e+=1),this.ctrlKey&&(e+=2),this.metaKey&&(e+=4),this.shiftKey&&(e+=8),e}setParameters(e={}){this.hoverTimeout=uo(e.hoverTimeout,this.hoverTimeout)}_listen(){const e=window.performance.now(),t=this.canvasPosition;this.doubleClickPending&&e-this.lastClicked>this.doubleClickSpeed&&(this.doubleClickPending=!1),e-this.lastMoved>this.hoverTimeout&&(this.moving=!1),(this.scrolled||!this.moving&&!this.hovering)&&(this.scrolled=!1,-1!==this.hoverTimeout&&this.overElement&&(this.hovering=!0,this.signals.hovered.dispatch(t.x,t.y))),this.frameRequest=window.requestAnimationFrame(this._listen)}_onMousewheel(e){if(e.target!==this.domElement||!this.handleScroll)return;e.preventDefault(),this._setKeys(e);let t=0;"deltaY"in e&&"deltaMode"in e&&void 0!==e.deltaY&&void 0!==e.deltaMode?t=e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?.025*-e.deltaY:e.deltaMode===WheelEvent.DOM_DELTA_LINE?-e.deltaY*(2.5/3):2.5*-e.deltaY:"deltaY"in e&&!("detail"in e)?t=.025*-e.deltaY:void 0!==e.wheelDelta?t=.025*-e.wheelDelta:void 0!==e.wheelDeltaY?t=.025*-e.wheelDeltaY:void 0!==e.detail&&(t=-e.detail/3),this.signals.scrolled.dispatch(t),setTimeout((()=>{this.scrolled=!0}),this.hoverTimeout)}_onMousemove(e){e.target===this.domElement?(e.preventDefault(),this.overElement=!0):this.overElement=!1,this._setKeys(e),this.moving=!0,this.hovering=!1,this.lastMoved=window.performance.now(),this.prevPosition.copy(this.position),this.position.set(e.clientX,e.clientY),this._setCanvasPosition(e);const t=this.prevPosition.x-this.position.x,i=this.prevPosition.y-this.position.y;this.signals.moved.dispatch(t,i),this.pressed&&this.signals.dragged.dispatch(t,i)}_onMousedown(e){e.target===this.domElement&&(e.preventDefault(),this._setKeys(e),this.moving=!1,this.hovering=!1,this.down.set(e.clientX,e.clientY),this.position.set(e.clientX,e.clientY),this.which=e.which,this.buttons=function(e){if("object"==typeof e){if("buttons"in e)return e.buttons;if("which"in e){const t=e.which;if(2===t)return 4;if(3===t)return 2;if(t>0)return 1<=0)return 1<2&&this.handleScroll&&this.position.distanceTo(this.prevPosition)<2)this.which=0,this.buttons=0,this.signals.scrolled.dispatch(i/2);else{this.which=3,this.buttons=2;const e=this.prevPosition.x-this.position.x,t=this.prevPosition.y-this.position.y;this.signals.moved.dispatch(e,t),this.pressed&&this.signals.dragged.dispatch(e,t)}}}}_distance(){return this.position.distanceTo(this.down)}_setCanvasPosition(e){const t=this.domElement.getBoundingClientRect();let i,n;"clientX"in e&&"clientY"in e?(i=e.clientX-t.left,n=e.clientY-t.top):(i=e.offsetX,n=e.offsetY),this.canvasPosition.set(i,t.height-n)}_setKeys(e){this.altKey=e.altKey,this.ctrlKey=e.ctrlKey,this.metaKey=e.metaKey,this.shiftKey=e.shiftKey}dispose(){document.removeEventListener("mousewheel",this._onMousewheel),document.removeEventListener("wheel",this._onMousewheel),document.removeEventListener("MozMousePixelScroll",this._onMousewheel),document.removeEventListener("mousemove",this._onMousemove),document.removeEventListener("mousedown",this._onMousedown),document.removeEventListener("mouseup",this._onMouseup),document.removeEventListener("contextmenu",this._onContextmenu),document.removeEventListener("touchstart",this._onTouchstart),document.removeEventListener("touchend",this._onTouchend),document.removeEventListener("touchmove",this._onTouchmove),window.cancelAnimationFrame(this.frameRequest)}}const tu=new qt,iu=new qt,nu=new qt,ru=new qt,su=new qt,au=new _t,ou=new gt,lu=new gt,cu=new qt,uu=new _t,hu=new _t;class du{constructor(e,t={}){this.stage=e,this.rotateSpeed=uo(t.rotateSpeed,2),this.zoomSpeed=uo(t.zoomSpeed,1.2),this.panSpeed=uo(t.panSpeed,1),this.viewer=e.viewer,this.mouse=e.mouseObserver,this.controls=e.viewerControls}get component(){return this.stage.transformComponent}get atom(){return this.stage.transformAtom}_setPanVector(e,t,i=0){const n=this.controls.getCanvasScaleFactor(i);uu.set(e,t,0),uu.multiplyScalar(this.panSpeed*n)}_getRotateXY(e,t){return[this.rotateSpeed*-e*.01,this.rotateSpeed*t*.01]}_getCameraRotation(e){return e.extractRotation(this.viewer.camera.matrixWorld),e.multiply(iu.makeRotationY(Math.PI)),e}_transformPanVector(){this.component&&(cu.extractRotation(this.component.transform),cu.premultiply(this.viewer.rotationGroup.matrix),cu.invert(),cu.multiply(this._getCameraRotation(ru)),uu.applyMatrix4(cu))}zoom(e){this.controls.zoom(this.zoomSpeed*e*.02)}pan(e,t){this._setPanVector(e,t),cu.copy(this.viewer.rotationGroup.matrix).invert(),cu.multiply(this._getCameraRotation(ru)),uu.applyMatrix4(cu),this.controls.translate(uu)}panComponent(e,t){this.component&&(this._setPanVector(e,t),this._transformPanVector(),this.component.position.add(uu),this.component.updateMatrix())}panAtom(e,t){this.atom&&this.component&&(this.atom.positionToVector3(hu),hu.add(this.viewer.translationGroup.position),hu.applyMatrix4(this.viewer.rotationGroup.matrix),this._setPanVector(e,t,hu.z),this._transformPanVector(),this.atom.positionAdd(uu),this.component.updateRepresentations({position:!0}))}rotate(e,t){const[i,n]=this._getRotateXY(e,t);this._getCameraRotation(ru),au.set(1,0,0),au.applyMatrix4(ru),ou.setFromAxisAngle(au,n),au.set(0,1,0),au.applyMatrix4(ru),lu.setFromAxisAngle(au,i),ou.multiply(lu),ru.makeRotationFromQuaternion(ou),this.controls.applyMatrix(ru)}zRotate(e,t){const i=this.rotateSpeed*((-e+t)/-2)*.01;nu.makeRotationZ(i),this.controls.applyMatrix(nu)}rotateComponent(e,t){if(!this.component)return;const[i,n]=this._getRotateXY(e,t);this._getCameraRotation(su),ru.extractRotation(this.component.transform),ru.premultiply(this.viewer.rotationGroup.matrix),ru.invert(),ru.premultiply(su),au.set(1,0,0),au.applyMatrix4(ru),tu.makeRotationAxis(au,n),au.set(0,1,0),au.applyMatrix4(ru),iu.makeRotationAxis(au,i),tu.multiply(iu),ou.setFromRotationMatrix(tu),this.component.quaternion.premultiply(ou),this.component.quaternion.normalize(),this.component.updateMatrix()}}const fu=new _t;class mu{constructor(e,t){this.stage=t,this.pid=e.pid,this.picker=e.picker,this.instance=e.instance,this.stage=t,this.controls=t.viewerControls,this.mouse=t.mouseObserver}get type(){return this.picker.type}get altKey(){return this.mouse.altKey}get ctrlKey(){return this.mouse.ctrlKey}get metaKey(){return this.mouse.metaKey}get shiftKey(){return this.mouse.shiftKey}get canvasPosition(){return this.mouse.canvasPosition}get component(){return this.stage.getComponentsByObject(this.picker.data).list[0]}get object(){return this.picker.getObject(this.pid)}get position(){return this.picker.getPosition(this.pid,this.instance,this.component)}get closestBondAtom(){if("bond"!==this.type||!this.bond)return;const e=this.bond,t=this.controls,i=this.canvasPosition,n=e.atom1.positionToVector3(),r=e.atom2.positionToVector3();n.applyMatrix4(this.component.matrix),r.applyMatrix4(this.component.matrix);const s=t.getPositionOnCanvas(n),a=t.getPositionOnCanvas(r);return l=s,c=a,(o=i).distanceTo(l)=e.length))return new mu(i,this.stage);console.error("pid >= picker.array.length")}}}const gu=new gt,_u=new _t,yu=new _t,vu=new _t,bu=new _t,xu=new qt,wu=new _t,Su=new qt;class Mu{constructor(e){this.stage=e,this.signals={changed:new Yo.Signal},this.viewer=e.viewer}get position(){return this.viewer.translationGroup.position}get rotation(){return this.viewer.rotationGroup.quaternion}changed(){this.viewer.requestRender(),this.signals.changed.dispatch()}getPositionOnCanvas(e,t){const i=Ao(t,Ge);const n=this.viewer;return vu.copy(e).add(n.translationGroup.position).applyMatrix4(n.rotationGroup.matrix).project(n.camera),i.set((vu.x+1)*n.width/2,(vu.y+1)*n.height/2)}getCanvasScaleFactor(e=0){const t=this.viewer.camera;if(t instanceof Qn)return 1/t.zoom;{e=Math.abs(e),e+=this.getCameraDistance();const i=Ro(t.fov);return 2*e*Math.tan(i/2)/this.viewer.height}}getOrientation(e){const t=To(e);t.copy(this.viewer.rotationGroup.matrix);const i=this.getCameraDistance();return t.scale(bu.set(i,i,i)),t.setPosition(this.viewer.translationGroup.position),t}orient(e){To(e).decompose(_u,gu,yu);const t=this.viewer;t.rotationGroup.setRotationFromQuaternion(gu),t.translationGroup.position.copy(_u),t.cameraDistance=yu.z,t.updateZoom(),this.changed()}translate(e){this.viewer.translationGroup.position.add(Co(e)),this.changed()}center(e){this.viewer.translationGroup.position.copy(Co(e)).negate(),this.changed()}zoom(e){this.distance(this.getCameraDistance()*(1-e))}getCameraDistance(){return this.viewer.cameraDistance}distance(e){this.viewer.cameraDistance=Math.max(Math.abs(e),.2),this.viewer.updateZoom(),this.changed()}spin(e,t){xu.copy(this.viewer.rotationGroup.matrix).invert(),wu.copy(Co(e)).applyMatrix4(xu),this.viewer.rotationGroup.rotateOnAxis(wu,t),this.changed()}rotate(e){this.viewer.rotationGroup.setRotationFromQuaternion(Po(e)),this.changed()}align(e){Su.copy(To(e)).invert(),this.viewer.rotationGroup.setRotationFromMatrix(Su),this.changed()}applyMatrix(e){this.viewer.rotationGroup.applyMatrix4(To(e)),this.changed()}}class Au{constructor(e,t,...i){this.pausedTime=-1,this.elapsedDuration=0,this.pausedDuration=0,this.ignoreGlobalToggle=!1,this._paused=!1,this._resolveList=[],this.duration=uo(e,1e3),this.controls=t,this.startTime=window.performance.now(),this._init(...i)}get done(){return 1===this.alpha}get paused(){return this._paused}tick(e){if(!this._paused)return this.elapsedDuration=e.currentTime-this.startTime-this.pausedDuration,0===this.duration?this.alpha=1:this.alpha=zo(0,1,this.elapsedDuration/this.duration),this._tick(e),this.done&&this._resolveList.forEach((e=>e())),this.done}pause(e){e&&(this._hold=!0),-1===this.pausedTime&&(this.pausedTime=window.performance.now()),this._paused=!0}resume(e){!e&&this._hold||(this.pausedDuration+=window.performance.now()-this.pausedTime,this._paused=!1,this._hold=!1,this.pausedTime=-1)}toggle(){this._paused?this.resume():this.pause()}then(e){let t;return t=this.done?Promise.resolve():new Promise((e=>this._resolveList.push(e))),t.then(e)}}class Cu extends Au{constructor(e,t,...i){super(uo(e,1/0),t,...i)}_init(e,t){Array.isArray(e)?this.axis=(new _t).fromArray(e):this.axis=uo(e,new _t(0,1,0)),this.angle=uo(t,.01)}_tick(e){this.axis&&this.angle&&this.controls.spin(this.axis,this.angle*e.lastDuration/16)}}class Tu extends Au{constructor(e,t,...i){super(uo(e,1/0),t,...i),this.angleSum=0,this.direction=1}_init(e,t,i){Array.isArray(e)?this.axis=(new _t).fromArray(e):this.axis=uo(e,new _t(0,1,0)),this.angleStep=uo(t,.01),this.angleEnd=uo(i,.2)}_tick(e){if(!this.axis||!this.angleStep||!this.angleEnd)return;const t=zo(0,1,Math.abs(this.angleSum)/this.angleEnd),i=this.angleStep*this.direction*(1.1-t);this.controls.spin(this.axis,i*e.lastDuration/16),this.angleSum+=this.angleStep,this.angleSum>=this.angleEnd&&(this.direction*=-1,this.angleSum=-this.angleEnd)}}class Pu extends Au{_init(e,t){this.moveFrom=Co(uo(e,new _t)),this.moveTo=Co(uo(t,new _t))}_tick(){this.controls.position.lerpVectors(this.moveFrom,this.moveTo,this.alpha).negate(),this.controls.changed()}}class Eu extends Au{_init(e,t){this.zoomFrom=e,this.zoomTo=t}_tick(){this.controls.distance(Fo(this.zoomFrom,this.zoomTo,this.alpha))}}class Iu extends Au{constructor(){super(...arguments),this._currentRotation=new gt}_init(e,t){this.rotateFrom=Po(e),this.rotateTo=Po(t),this._currentRotation=new gt}_tick(){this._currentRotation.copy(this.rotateFrom).slerp(this.rotateTo,this.alpha),this.controls.rotate(this._currentRotation)}}class Du extends Au{_init(e,t,i){this.valueFrom=e,this.valueTo=t,this.callback=i}_tick(){this.callback(Fo(this.valueFrom,this.valueTo,this.alpha))}}class Ru extends Au{_init(e){this.callback=e}_tick(){1===this.alpha&&this.callback()}}class Lu{constructor(e=[]){this._resolveList=[],this._list=e}get done(){return this._list.every((e=>e.done))}then(e){let t;return t=this.done?Promise.resolve():new Promise((e=>{this._resolveList.push(e),this._list.forEach((e=>{e.then((()=>{this._resolveList.forEach((e=>{e()})),this._resolveList.length=0}))}))})),t.then(e)}}class ku{constructor(e){this.stage=e,this.animationList=[],this.finishedList=[],this.viewer=e.viewer,this.controls=e.viewerControls}get paused(){return this.animationList.every((e=>e.paused))}add(e){return 0===e.duration?e.tick(this.viewer.stats):this.animationList.push(e),e}remove(e){const t=this.animationList,i=t.indexOf(e);i>-1&&t.splice(i,1)}run(e){const t=this.finishedList,i=this.animationList,n=i.length;for(let r=0;re.pause()))}resume(){this.animationList.forEach((e=>e.resume()))}toggle(){this.paused?this.resume():this.pause()}clear(){this.animationList.length=0}dispose(){this.clear()}}class Ou{constructor(e,t){if(this.fn=e,this.queue=[],this.pending=!1,this.next=this.next.bind(this),t){for(let e=0,i=t.length;ethis.run(e)))):this.pending=!1}push(e){this.queue.push(e),this.pending||this.next()}kill(){this.queue.length=0}length(){return this.queue.length}}class Nu{constructor(e,t,i){this.type="",this.parameters={lazy:{type:"boolean"},clipNear:{type:"range",step:1,max:100,min:0,buffer:!0},clipRadius:{type:"number",precision:1,max:1e3,min:0,buffer:!0},clipCenter:{type:"vector3",precision:1,buffer:!0},flatShaded:{type:"boolean",buffer:!0},opacity:{type:"range",step:.01,max:1,min:0,buffer:!0},depthWrite:{type:"boolean",buffer:!0},side:{type:"select",buffer:!0,options:{front:"front",back:"back",double:"double"}},wireframe:{type:"boolean",buffer:!0},colorData:{type:"hidden",update:"color"},colorScheme:{type:"select",update:"color",options:{}},colorScale:{type:"select",update:"color",options:$l.getScales()},colorReverse:{type:"boolean",update:"color"},colorValue:{type:"color",update:"color"},colorDomain:{type:"hidden",update:"color"},colorMode:{type:"select",update:"color",options:$l.getModes()},roughness:{type:"range",step:.01,max:1,min:0,buffer:!0},metalness:{type:"range",step:.01,max:1,min:0,buffer:!0},diffuse:{type:"color",buffer:!0},diffuseInterior:{type:"boolean",buffer:!0},useInteriorColor:{type:"boolean",buffer:!0},interiorColor:{type:"color",buffer:!0},interiorDarkening:{type:"range",step:.01,max:1,min:0,buffer:!0},matrix:{type:"hidden",buffer:!0},disablePicking:{type:"boolean",rebuild:!0}},this.viewer=t,this.tasks=new hc,this.queue=new Ou(this.make.bind(this)),this.bufferList=[],this.parameters.colorScheme&&(this.parameters.colorScheme.options=$l.getSchemes()),this.toBePrepared=!1}init(e){const t=e||{};this.clipNear=uo(t.clipNear,0),this.clipRadius=uo(t.clipRadius,0),this.clipCenter=uo(t.clipCenter,new _t),this.flatShaded=uo(t.flatShaded,!1),this.side=uo(t.side,"double"),this.opacity=uo(t.opacity,1),this.depthWrite=uo(t.depthWrite,!0),this.wireframe=uo(t.wireframe,!1),this.setColor(t.color,t),this.colorData=uo(t.colorData,void 0),this.colorScheme=uo(t.colorScheme,"uniform"),this.colorScale=uo(t.colorScale,""),this.colorReverse=uo(t.colorReverse,!1),this.colorValue=uo(t.colorValue,9474192),this.colorDomain=uo(t.colorDomain,void 0),this.colorMode=uo(t.colorMode,"hcl"),this.visible=uo(t.visible,!0),this.quality=uo(t.quality,void 0),this.roughness=uo(t.roughness,.4),this.metalness=uo(t.metalness,0),this.diffuse=uo(t.diffuse,16777215),this.diffuseInterior=uo(t.diffuseInterior,!1),this.useInteriorColor=uo(t.useInteriorColor,!1),this.interiorColor=uo(t.interiorColor,2236962),this.interiorDarkening=uo(t.interiorDarkening,0),this.lazy=uo(t.lazy,!1),this.lazyProps={build:!1,bufferParams:{},what:{}},this.matrix=uo(t.matrix,new qt),this.disablePicking=uo(t.disablePicking,!1);const i=this.parameters;!0===i.sphereDetail&&(i.sphereDetail={type:"integer",max:3,min:0,rebuild:"impostor"}),!0===i.radialSegments&&(i.radialSegments={type:"integer",max:25,min:5,rebuild:"impostor"}),!0===i.openEnded&&(i.openEnded={type:"boolean",rebuild:"impostor",buffer:!0}),!0===i.disableImpostor&&(i.disableImpostor={type:"boolean",rebuild:!0}),"low"===t.quality?(i.sphereDetail&&(this.sphereDetail=0),i.radialSegments&&(this.radialSegments=5)):"medium"===t.quality?(i.sphereDetail&&(this.sphereDetail=1),i.radialSegments&&(this.radialSegments=10)):"high"===t.quality?(i.sphereDetail&&(this.sphereDetail=2),i.radialSegments&&(this.radialSegments=20)):(i.sphereDetail&&(this.sphereDetail=uo(t.sphereDetail,1)),i.radialSegments&&(this.radialSegments=uo(t.radialSegments,10))),i.openEnded&&(this.openEnded=uo(t.openEnded,!0)),i.disableImpostor&&(this.disableImpostor=uo(t.disableImpostor,!1))}getColorParams(e){return Object.assign({data:this.colorData,scheme:this.colorScheme,scale:this.colorScale,reverse:this.colorReverse,value:this.colorValue,domain:this.colorDomain,mode:this.colorMode,colorSpace:this.colorSpace},e)}getBufferParams(e={}){return Object.assign({clipNear:this.clipNear,clipRadius:this.clipRadius,clipCenter:this.clipCenter,flatShaded:this.flatShaded,opacity:this.opacity,depthWrite:this.depthWrite,side:this.side,wireframe:this.wireframe,roughness:this.roughness,metalness:this.metalness,diffuse:this.diffuse,diffuseInterior:this.diffuseInterior,useInteriorColor:this.useInteriorColor,interiorColor:this.interiorColor,interiorDarkening:this.interiorDarkening,matrix:this.matrix,disablePicking:this.disablePicking},e)}setColor(e,t){const i=Object.keys($l.getSchemes());if("string"==typeof e&&i.includes(e.toLowerCase()))t?t.colorScheme=e:this.setParameters({colorScheme:e});else if(void 0!==e){let i=new Oi(e).getHex();t?(t.colorScheme="uniform",t.colorValue=i):this.setParameters({colorScheme:"uniform",colorValue:i})}return this}prepare(e){}create(){}update(e){this.build()}build(e){if(!this.lazy||this.visible&&this.opacity){if(!this.toBePrepared)return this.tasks.increment(),void this.make();this.queue.length()>0?(this.tasks.change(1-this.queue.length()),this.queue.kill()):this.tasks.increment(),this.queue.push(e||!1)}else this.lazyProps.build=!0}make(t,i){e.Debug&&Fl.time("Representation.make "+this.type);const n=()=>{t?(this.update(t),this.viewer.requestRender(),this.tasks.decrement(),i&&i()):(this.clear(),this.create(),this.manualAttach||this.disposed||(e.Debug&&Fl.time("Representation.attach "+this.type),this.attach((()=>{e.Debug&&Fl.timeEnd("Representation.attach "+this.type),this.tasks.decrement(),i&&i()})))),e.Debug&&Fl.timeEnd("Representation.make "+this.type)};this.toBePrepared?this.prepare(n):n()}attach(e){this.setVisibility(this.visible),e()}setVisibility(e,t){if(this.visible=e,this.visible&&this.opacity){const e=this.lazyProps,t=e.bufferParams,i=e.what;if(e.build)return e.build=!1,this.build(),this;(Object.keys(t).length||Object.keys(i).length)&&(e.bufferParams={},e.what={},this.updateParameters(t,i))}return this.bufferList.forEach((function(t){t.setVisibility(e)})),t||this.viewer.requestRender(),this}setParameters(e,t={},i=!1){const n=e||{},r=this.parameters,s={};this.opacity||void 0===n.opacity||(this.lazyProps.build?(this.lazyProps.build=!1,i=!0):(Object.assign(s,this.lazyProps.bufferParams),Object.assign(t,this.lazyProps.what),this.lazyProps.bufferParams={},this.lazyProps.what={})),this.setColor(n.color,n);for(let e in n)if(void 0!==n[e]&&null!=r[e]&&(r[e].int&&(n[e]=parseInt(n[e])),r[e].float&&(n[e]=parseFloat(n[e])),n[e]!==this[e]||n[e].equals&&!n[e].equals(this[e]))){if(this[e]&&this[e].copy&&n[e].copy?this[e].copy(n[e]):this[e]&&this[e].set?this[e].set(n[e]):this[e]=n[e],r[e].buffer)if(!0===r[e].buffer)s[e]=n[e];else{s[r[e].buffer]=n[e]}r[e].update&&(t[r[e].update]=!0),!r[e].rebuild||"impostor"===r[e].rebuild&&Ol&&!this.disableImpostor||(i=!0)}return i?this.build():this.updateParameters(s,t),this}updateParameters(e={},t){if(this.lazy&&(!this.visible||!this.opacity)&&!1===e.hasOwnProperty("opacity"))return Object.assign(this.lazyProps.bufferParams,e),void Object.assign(this.lazyProps.what,t);this.bufferList.forEach((function(t){t.setParameters(e)})),Object.keys(t).length&&this.update(t),this.viewer.requestRender()}getParameters(){const e={lazy:this.lazy,visible:this.visible,quality:this.quality};return Object.keys(this.parameters).forEach((t=>{null!==this.parameters[t]&&(e[t]=this[t])})),e}clear(){this.bufferList.forEach((e=>{this.viewer.remove(e),e.dispose()})),this.bufferList.length=0,this.viewer.requestRender()}dispose(){this.disposed=!0,this.queue.kill(),this.tasks.dispose(),this.clear()}}class Fu{constructor(t){this.pending=0,this.postCount=0,this.onmessageDict={},this.onerrorDict={},this.name=t,this.blobUrl=window.URL.createObjectURL(Vl.get(t)),this.worker=new Worker(this.blobUrl),Vl.activeWorkerCount+=1,this.worker.onmessage=i=>{this.pending-=1;const n=i.data.__postId;e.Debug&&Fl.timeEnd("Worker.postMessage "+t+" #"+n);const r=this.onmessageDict[n];r&&r.call(this.worker,i),delete this.onmessageDict[n],delete this.onerrorDict[n]},this.worker.onerror=e=>{if(this.pending-=1,e.data){const i=e.data.__postId,n=this.onerrorDict[i];n?n.call(this.worker,e):Fl.error("Worker.onerror",i,t,e),delete this.onmessageDict[i],delete this.onerrorDict[i]}else Fl.error("Worker.onerror",t,e)}}post(t={},i,n,r){this.onmessageDict[this.postCount]=n,this.onerrorDict[this.postCount]=r,t.__name=this.name,t.__postId=this.postCount,t.__debug=e.Debug,e.Debug&&Fl.time(`Worker.postMessage ${this.name} #${this.postCount}`);try{this.worker.postMessage(t,i)}catch(e){Fl.error("worker.post:",e),this.worker.postMessage(t)}return this.pending+=1,this.postCount+=1,this}terminate(){this.worker?(this.worker.terminate(),window.URL.revokeObjectURL(this.blobUrl),Vl.activeWorkerCount-=1):Fl.log("no worker to terminate")}}class Bu{constructor(e,t=2){this.pool=[],this.count=0,this.maxCount=Math.min(8,t),this.name=e}post(e={},t,i,n){const r=this.getNextWorker();return r?r.post(e,t,i,n):console.error("unable to get worker from pool"),this}terminate(){this.pool.forEach((function(e){e.terminate()}))}getNextWorker(){let e,t=1/0;for(let i=0;i=this.count){e=new Fu(this.name),this.pool.push(e),this.count+=1;break}const n=this.pool[i];if(0===n.pending){e=n;break}n.pendingr&&(r=l),c>s&&(s=c),u>a&&(a=u)}return[ju([t,i,n]),ju([r,s,a])]}function $u(e,t){for(let i=0,n=t.length;i0){const a=1/Math.sqrt(s);e[t]=i*a,e[t+1]=n*a,e[t+2]=r*a}}}function ju(e){return new Float32Array(e||3)}function Wu(e,t,i){const n=t[0],r=t[1],s=t[2],a=i[0],o=i[1],l=i[2];e[0]=r*l-s*o,e[1]=s*a-n*l,e[2]=n*o-r*a}function qu(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Xu(e,t,i){e[0]=t[0]-i[0],e[1]=t[1]-i[1],e[2]=t[2]-i[2]}function Yu(e,t,i){e[0]=t[0]+i[0],e[1]=t[1]+i[1],e[2]=t[2]+i[2]}function Ku(e,t,i=0){e[0]=t[i],e[1]=t[i+1],e[2]=t[i+2]}function Zu(e,t,i=0){t[i]=e[0],t[i+1]=e[1],t[i+2]=e[2]}function Qu(e){return e[0]*e[0]+e[1]*e[1]+e[2]*e[2]}function Ju(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2])}function eh(e,t,i){th(e,t,1/i)}function th(e,t,i){e[0]=t[0]*i,e[1]=t[1]*i,e[2]=t[2]*i}function ih(e,t){const i=Qu(t);0==i?(e[0]=t[0],e[1]=t[1],e[2]=t[2]):th(e,t,1/Math.sqrt(i))}function nh(e,t,i){e[0]=t[0]-i,e[1]=t[1]-i,e[2]=t[2]-i}function rh(e,t,i){e[0]=t[0]+i,e[1]=t[1]+i,e[2]=t[2]+i}function sh(e,t){e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2])}function ah(e,t){e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2])}function oh(e,t){e[0]=-t[0],e[1]=-t[1],e[2]=-t[2]}function lh(e,t){const i=e[0],n=e[1],r=e[2],s=t[0],a=t[1],o=t[2],l=n*o-r*a,c=r*s-i*o,u=i*a-n*s,h=Math.sqrt(l*l+c*c+u*u),d=i*s+n*a+r*o;return Math.atan2(h,d)}function ch(e,t=9){const i=Math.floor(t/2),n=e.position1.length/3,r=3*(i*n),s=1/t,a=wc(e.position1,e.position2),o=new Float32Array(r),l=new Float32Array(r),c=new _t;for(let t=0;t0){const t=3*f;r[t]=e.position2[3*u-3],r[t+1]=e.position2[3*u-2],r[t+1]=e.position2[3*u-1]}const g=new Float32Array(n),_=new Float32Array(r),y=xc(g,_),v=new Float32Array(s),b={position:y,position1:g,position2:_,color:v,color2:v};return a&&(b.radius=new Float32Array(a)),o&&e.picking&&(e.picking.array=new Float32Array(o),b.picking=e.picking),l&&(b.primitiveId=new Float32Array(l)),b}Bu.prototype.constructor=Bu,Vu.__deps=[ju],eh.__deps=[th],ih.__deps=[th,Qu];const dh=new _t;class fh{static get Picker(){return Kl.get(this.type)}static get Buffer(){return Yl.get(this.type)}static getShapeKey(e){return this.type+e[0].toUpperCase()+e.substr(1)}static expandBoundingBox(e,t){}static valueToShape(e,t,i){const n=e._primitiveData[this.getShapeKey(t)];switch(this.fields[t]){case"v3":case"c":!function(e,t){void 0!==e.toArray?e=e.toArray():void 0!==e.x?e=[e.x,e.y,e.z]:void 0!==e.r&&(e=[e.r,e.g,e.b]),t.push.apply(t,e)}(i,n);break;default:n.push(i)}}static objectToShape(e,t){Object.keys(this.fields).forEach((i=>{this.valueToShape(e,i,t[i])})),this.valueToShape(e,"name",t.name),this.expandBoundingBox(e.boundingBox,t)}static valueFromShape(e,t,i){const n=e._primitiveData[this.getShapeKey(i)];switch(this.fields[i]){case"v3":return(new _t).fromArray(n,3*t);case"c":return(new Oi).fromArray(n,3*t);default:return n[t]}}static objectFromShape(e,t){let i=this.valueFromShape(e,t,"name");void 0===i&&(i=`${this.type}: ${t} (${e.name})`);const n={shape:e,name:i};return Object.keys(this.fields).forEach((i=>{n[i]=this.valueFromShape(e,t,i)})),n}static arrayFromShape(e,t){const i=e._primitiveData[this.getShapeKey(t)];return"s"===this.fields[t]?i:new Float32Array(i)}static dataFromShape(e){const t={};return this.Picker&&(t.picking=new this.Picker(e)),Object.keys(this.fields).forEach((i=>{t[i]=this.arrayFromShape(e,i)})),t}static bufferFromShape(e,t){return new this.Buffer(this.dataFromShape(e),t)}}fh.type="",fh.fields={};class mh extends fh{static positionFromShape(e,t){return this.valueFromShape(e,t,"position")}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position))}}mh.type="sphere",mh.fields={position:"v3",color:"c",radius:"f"};class ph extends fh{static positionFromShape(e,t){return this.valueFromShape(e,t,"position")}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position))}}ph.type="box",ph.fields={position:"v3",color:"c",size:"f",heightAxis:"v3",depthAxis:"v3"};class gh extends ph{}gh.type="octahedron";class _h extends ph{}_h.type="tetrahedron";class yh extends fh{static positionFromShape(e,t){const i=this.valueFromShape(e,t,"position1"),n=this.valueFromShape(e,t,"position2");return i.add(n).multiplyScalar(.5)}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position1)),e.expandByPoint(dh.fromArray(t.position2))}static bufferFromShape(e,t={}){let i=this.dataFromShape(e);return"cylinder"===this.type&&t.dashedCylinder&&(i=uh(i)),new this.Buffer(i,t)}}yh.type="cylinder",yh.fields={position1:"v3",position2:"v3",color:"c",radius:"f"};class vh extends yh{}vh.type="arrow";class bh extends yh{}bh.type="cone";class xh extends mh{}xh.type="ellipsoid",xh.fields={position:"v3",color:"c",radius:"f",majorAxis:"v3",minorAxis:"v3"};class wh extends xh{}wh.type="torus";class Sh extends fh{static positionFromShape(e,t){return this.valueFromShape(e,t,"position")}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position))}}Sh.type="text",Sh.fields={position:"v3",color:"c",size:"f",text:"s"};class Mh extends fh{static positionFromShape(e,t){return this.valueFromShape(e,t,"position")}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position))}}Mh.type="point",Mh.fields={position:"v3",color:"c"};class Ah extends fh{static positionFromShape(e,t){const i=this.valueFromShape(e,t,"position1"),n=this.valueFromShape(e,t,"position2");return i.add(n).multiplyScalar(.5)}static expandBoundingBox(e,t){e.expandByPoint(dh.fromArray(t.position1)),e.expandByPoint(dh.fromArray(t.position2))}}Ah.type="wideline",Ah.fields={position1:"v3",position2:"v3",color:"c"};class Ch{constructor(e,t){this.exp=3;const i=t||function(e){const{x:t,y:i,z:n}=e,r=new bt,s=t.length,{min:a,max:o}=r;for(let e=0;e>this.exp),this.boundY=1+(i.max.y-this.minY>>this.exp),this.boundZ=1+(i.max.z-this.minZ>>this.exp);const n=this.boundX*this.boundY*this.boundZ,r=void 0!==e.count?e.count:e.x.length,s=e.x,a=e.y,o=e.z;let l=0;const c=new Uint32Array(n),u=new Int32Array(r);for(let e=0;e>this.exp,i=a[e]-this.minY>>this.exp,n=o[e]-this.minZ>>this.exp,r=(t*this.boundY+i)*this.boundZ+n;1===(c[r]+=1)&&(l+=1),u[e]=r}const h=new Uint16Array(l);for(let e=0,t=0;e0&&(c[e]=t+1,h[t]=i,t+=1)}const d=new Uint32Array(l);for(let e=1;e0){const i=t-1;m[d[i]+f[i]]=e,f[i]+=1}}this.grid=c,this.bucketCount=h,this.bucketOffset=d,this.bucketArray=m,this.xArray=s,this.yArray=a,this.zArray=o}within(e,t,i,n){const r=[];return this.eachWithin(e,t,i,n,(e=>r.push(e))),r}eachWithin(e,t,i,n,r){const s=n*n,a=Math.max(0,e-n-this.minX>>this.exp),o=Math.max(0,t-n-this.minY>>this.exp),l=Math.max(0,i-n-this.minZ>>this.exp),c=Math.min(this.boundX,1+(e+n-this.minX>>this.exp)),u=Math.min(this.boundY,1+(t+n-this.minY>>this.exp)),h=Math.min(this.boundZ,1+(i+n-this.minZ>>this.exp));for(let n=a;n0){const n=c-1,a=this.bucketOffset[n],o=a+this.bucketCount[n];for(let n=a;nn?r.set(this[t].subarray(0,n)):r.set(this[t]),this[t]=r}}growIfFull(){if(this.count>=this.length){const e=Math.round(1.5*this.length);this.resize(Math.max(256,e))}}copyFrom(e,t,i,n){for(let r=0,s=this._fields.length;r0;)u-=1;c<=u&&(c===l?l=u:u===l&&(l=c),(a=c)!==(o=u)&&(i.copyFrom(t,0,a,1),t.copyWithin(a,o,1),t.copyFrom(i,o,0,1)),c+=1,u-=1)}while(c<=u);n(r,u),n(c,s)}var a,o}(0,this.count-1),Fl.timeEnd("Store.sort")}clear(){this.count=0}dispose(){for(let e=0,t=this._fields.length;e>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24}class Ih{constructor(e,t){this.length=e,this._words=new Uint32Array(e+32>>>5),!0===t&&this.setAll()}get(e){return!!(this._words[e>>>5]&1<>>5]|=1<>>5]&=~(1<>>5]^=1<>>5,a=t>>>5;for(let e=s+1;e>>5]|=1<>>5]|=1<>>5]|=1<>>5]&=~(1<>>5]&=~(1<>>5]&=~(1<>>5]|=1<>>5]&=~(1<>>i,this}_isRangeValue(e,t,i){if(t>>5,a=t>>>5;for(let e=s+1;e>>5]&1<>>5]&1<>>5]&1<>>5]&1<>>5]&1<0){const{types:n,groups:r,centers:s,atomSets:a}=e;n.push(t.type),r.push(t.group),s.x.push(t.x/i),s.y.push(t.y/i),s.z.push(t.z/i),a.push(t.atomSet)}}const Oh=0,Nh=["D-BETA-PEPTIDE, C-GAMMA LINKING","D-GAMMA-PEPTIDE, C-DELTA LINKING","D-PEPTIDE COOH CARBOXY TERMINUS","D-PEPTIDE NH3 AMINO TERMINUS","D-PEPTIDE LINKING","L-BETA-PEPTIDE, C-GAMMA LINKING","L-GAMMA-PEPTIDE, C-DELTA LINKING","L-PEPTIDE COOH CARBOXY TERMINUS","L-PEPTIDE NH3 AMINO TERMINUS","L-PEPTIDE LINKING","PEPTIDE LINKING","PEPTIDE-LIKE"],Fh=["RNA OH 3 PRIME TERMINUS","RNA OH 5 PRIME TERMINUS","RNA LINKING"],Bh=["DNA OH 3 PRIME TERMINUS","DNA OH 5 PRIME TERMINUS","DNA LINKING","L-DNA LINKING","L-RNA LINKING"],zh=["D-SACCHARIDE","D-SACCHARIDE 1,4 AND 1,4 LINKING","D-SACCHARIDE 1,4 AND 1,6 LINKING","L-SACCHARIDE","L-SACCHARIDE 1,4 AND 1,4 LINKING","L-SACCHARIDE 1,4 AND 1,6 LINKING","SACCHARIDE"],Uh=["NON-POLYMER"].concat(["OTHER"],zh),Vh=["h","g","i"],$h=["e","b"],Gh=["s","t","l",""],Hh={H:1,D:1,T:1,HE:2,LI:3,BE:4,B:5,C:6,N:7,O:8,F:9,NE:10,NA:11,MG:12,AL:13,SI:14,P:15,S:16,CL:17,AR:18,K:19,CA:20,SC:21,TI:22,V:23,CR:24,MN:25,FE:26,CO:27,NI:28,CU:29,ZN:30,GA:31,GE:32,AS:33,SE:34,BR:35,KR:36,RB:37,SR:38,Y:39,ZR:40,NB:41,MO:42,TC:43,RU:44,RH:45,PD:46,AG:47,CD:48,IN:49,SN:50,SB:51,TE:52,I:53,XE:54,CS:55,BA:56,LA:57,CE:58,PR:59,ND:60,PM:61,SM:62,EU:63,GD:64,TB:65,DY:66,HO:67,ER:68,TM:69,YB:70,LU:71,HF:72,TA:73,W:74,RE:75,OS:76,IR:77,PT:78,AU:79,HG:80,TL:81,PB:82,BI:83,PO:84,AT:85,RN:86,FR:87,RA:88,AC:89,TH:90,PA:91,U:92,NP:93,PU:94,AM:95,CM:96,BK:97,CF:98,ES:99,FM:100,MD:101,NO:102,LR:103,RF:104,DB:105,SG:106,BH:107,HS:108,MT:109,DS:110,RG:111,CN:112,NH:113,FL:114,MC:115,LV:116,TS:117,OG:118},jh={1:1.1,2:1.4,3:1.81,4:1.53,5:1.92,6:1.7,7:1.55,8:1.52,9:1.47,10:1.54,11:2.27,12:1.73,13:1.84,14:2.1,15:1.8,16:1.8,17:1.75,18:1.88,19:2.75,20:2.31,21:2.3,22:2.15,23:2.05,24:2.05,25:2.05,26:2.05,27:2,28:2,29:2,30:2.1,31:1.87,32:2.11,33:1.85,34:1.9,35:1.83,36:2.02,37:3.03,38:2.49,39:2.4,40:2.3,41:2.15,42:2.1,43:2.05,44:2.05,45:2,46:2.05,47:2.1,48:2.2,49:2.2,50:1.93,51:2.17,52:2.06,53:1.98,54:2.16,55:3.43,56:2.68,57:2.5,58:2.48,59:2.47,60:2.45,61:2.43,62:2.42,63:2.4,64:2.38,65:2.37,66:2.35,67:2.33,68:2.32,69:2.3,70:2.28,71:2.27,72:2.25,73:2.2,74:2.1,75:2.05,76:2,77:2,78:2.05,79:2.1,80:2.05,81:1.96,82:2.02,83:2.07,84:1.97,85:2.02,86:2.2,87:3.48,88:2.83,89:2,90:2.4,91:2,92:2.3,93:2,94:2,95:2,96:2,97:2,98:2,99:2,100:2,101:2,102:2,103:2,104:2,105:2,106:2,107:2,108:2,109:2,110:2,111:2,112:2,113:2,114:2,115:2,116:2,117:2,118:2},Wh={1:.31,2:.28,3:1.28,4:.96,5:.84,6:.76,7:.71,8:.66,9:.57,10:.58,11:1.66,12:1.41,13:1.21,14:1.11,15:1.07,16:1.05,17:1.02,18:1.06,19:2.03,20:1.76,21:1.7,22:1.6,23:1.53,24:1.39,25:1.39,26:1.32,27:1.26,28:1.24,29:1.32,30:1.22,31:1.22,32:1.2,33:1.19,34:1.2,35:1.2,36:1.16,37:2.2,38:1.95,39:1.9,40:1.75,41:1.64,42:1.54,43:1.47,44:1.46,45:1.42,46:1.39,47:1.45,48:1.44,49:1.42,50:1.39,51:1.39,52:1.38,53:1.39,54:1.4,55:2.44,56:2.15,57:2.07,58:2.04,59:2.03,60:2.01,61:1.99,62:1.98,63:1.98,64:1.96,65:1.94,66:1.92,67:1.92,68:1.89,69:1.9,70:1.87,71:1.87,72:1.75,73:1.7,74:1.62,75:1.51,76:1.44,77:1.41,78:1.36,79:1.36,80:1.32,81:1.45,82:1.46,83:1.48,84:1.4,85:1.5,86:1.5,87:2.6,88:2.21,89:2.15,90:2.06,91:2,92:1.96,93:1.9,94:1.87,95:1.8,96:1.69,97:1.6,98:1.6,99:1.6,100:1.6,101:1.6,102:1.6,103:1.6,104:1.6,105:1.6,106:1.6,107:1.6,108:1.6,109:1.6,110:1.6,111:1.6,112:1.6,113:1.6,114:1.6,115:1.6,116:1.6,117:1.6,118:1.6},qh={1:[1],2:[0],3:[1],4:[2],5:[3],6:[4],7:[3],8:[2],9:[1],10:[0],11:[1],12:[2],13:[6],14:[6],15:[3,5,7],16:[2,4,6],17:[1],18:[0],19:[1],20:[2],31:[3],32:[4],33:[3,5],34:[2,4,6],35:[1],36:[0],37:[1],38:[2],49:[3],50:[4],51:[3,5],52:[2],53:[1,2,5],54:[0,2],55:[1],56:[2],81:[3],82:[4],83:[3],84:[2],85:[1],86:[0],87:[1],88:[2]},Xh={1:1,2:2,3:1,4:2,5:3,6:4,7:5,8:6,9:7,10:8,11:1,12:2,13:3,14:4,15:5,16:6,17:7,18:8,19:1,20:2,21:3,22:4,23:5,24:6,25:7,26:8,27:9,28:10,29:11,30:2,31:3,32:4,33:5,34:6,35:7,36:8,37:1,38:2,39:3,40:4,41:5,42:6,43:7,44:8,45:9,46:10,47:11,48:2,49:3,50:4,51:5,52:6,53:7,54:8,55:1,56:2,57:3,58:4,59:3,60:4,61:5,62:6,63:7,64:8,65:9,66:10,67:11,68:12,69:13,70:14,71:15,72:4,73:5,74:6,75:7,76:8,77:9,78:10,79:11,80:2,81:3,82:4,83:5,84:6,85:7,86:8,87:1,88:2,89:3,90:4,91:3,92:4,93:5,94:6,95:7,96:8,97:9,98:10,99:11,100:12,101:13,102:14,103:15,104:2,105:2,106:2,107:2,108:2,109:2,110:2,111:2,112:2,113:3,114:4,115:5,116:6,117:7,118:8},Yh={ALA:[.17,.5,.33],ARG:[.81,1.81,1],ASN:[.42,.85,.43],ASP:[1.23,3.64,2.41],ASH:[-.07,.43,.5],CYS:[-.24,-.02,.22],GLN:[.58,.77,.19],GLU:[2.02,3.63,1.61],GLH:[-.01,.11,.12],GLY:[.01,1.15,1.14],HIS:[.17,.11,-.06],ILE:[-.31,-1.12,-.81],LEU:[-.56,-1.25,-.69],LYS:[.99,2.8,1.81],MET:[-.23,-.67,-.44],PHE:[-1.13,-1.71,-.58],PRO:[.45,.14,-.31],SER:[.13,.46,.33],THR:[.14,.25,.11],TRP:[-1.85,-2.09,-.24],TYR:[-.94,-.71,.23],VAL:[.07,-.46,-.53]},Kh=[0,0,0],Zh={HIS:"H",ARG:"R",LYS:"K",ILE:"I",PHE:"F",LEU:"L",TRP:"W",ALA:"A",MET:"M",PRO:"P",CYS:"C",ASN:"N",VAL:"V",GLY:"G",SER:"S",GLN:"Q",TYR:"Y",ASP:"D",GLU:"E",THR:"T",SEC:"U",PYL:"O"},Qh=Object.keys(Zh),Jh=["A","C","T","G","U","I"],ed=["DA","DC","DT","DG","DU","DI"],td=["A","G","I","DA","DG","DI"],id=Jh.concat(ed),nd=["SOL","WAT","HOH","H2O","W","DOD","D3O","TIP3","TIP4","SPC"],rd=["118","119","1AL","1CU","2FK","2HP","2OF","3CO","3MT","3NI","3OF","3P8","4MO","4PU","543","6MO","ACT","AG","AL","ALF","AM","ATH","AU","AU3","AUC","AZI","BA","BCT","BEF","BF4","BO4","BR","BS3","BSY","CA","CAC","CD","CD1","CD3","CD5","CE","CHT","CL","CO","CO3","CO5","CON","CR","CS","CSB","CU","CU1","CU3","CUA","CUZ","CYN","DME","DMI","DSC","DTI","DY","E4N","EDR","EMC","ER3","EU","EU3","F","FE","FE2","FPO","GA","GD3","GEP","HAI","HG","HGC","IN","IOD","IR","IR3","IRI","IUM","K","KO4","LA","LCO","LCP","LI","LU","MAC","MG","MH2","MH3","MLI","MLT","MMC","MN","MN3","MN5","MN6","MO1","MO2","MO3","MO4","MO5","MO6","MOO","MOS","MOW","MW1","MW2","MW3","NA","NA2","NA5","NA6","NAO","NAW","NCO","NET","NH4","NI","NI1","NI2","NI3","NO2","NO3","NRU","O4M","OAA","OC1","OC2","OC3","OC4","OC5","OC6","OC7","OC8","OCL","OCM","OCN","OCO","OF1","OF2","OF3","OH","OS","OS4","OXL","PB","PBM","PD","PDV","PER","PI","PO3","PO4","PR","PT","PT4","PTN","RB","RH3","RHD","RU","SB","SCN","SE4","SEK","SM","SMO","SO3","SO4","SR","T1A","TB","TBA","TCN","TEA","TH","THE","TL","TMA","TRA","UNX","V","VN3","VO4","W","WO5","Y1","YB","YB2","YH","YT3","ZCM","ZN","ZN2","ZN3","ZNO","ZO3","OHX"],sd=["045","0AT","0BD","0MK","0NZ","0TS","0V4","0XY","0YT","10M","147","149","14T","15L","16G","18T","18Y","1AR","1BW","1GL","1GN","1JB","1LL","1NA","1S3","26M","26Q","26R","26V","26W","26Y","27C","289","291","293","2DG","2F8","2FG","2FL","2FP","2GL","2M4","2M5","32O","34V","3CM","3DO","3DY","3FM","3LR","3MF","3MG","3SA","3ZW","46D","46M","46Z","48Z","4CQ","4GC","4NN","50A","5DI","5GF","5MM","5RP","5SA","5SP","64K","6PG","6SA","7JZ","7SA","A1Q","A2G","AAB","AAL","AAO","ABC","ABD","ABE","ABF","ABL","ACG","ACI","ACR","ACX","ADA","ADG","ADR","AF1","AFD","AFL","AFO","AFP","AFR","AGC","AGH","AGL","AHR","AIG","ALL","ALX","AMU","AOG","AOS","ARA","ARB","ARE","ARI","ASG","ASO","AXP","AXR","B0D","B16","B2G","B4G","B6D","B8D","B9D","BBK","BCD","BDG","BDP","BDR","BEM","BFP","BGC","BGL","BGP","BGS","BHG","BMA","BMX","BNG","BNX","BOG","BRI","BXF","BXP","BXX","BXY","C3X","C4X","C5X","CAP","CBI","CBK","CBS","CDR","CEG","CGF","CHO","CR1","CR6","CRA","CT3","CTO","CTR","CTT","D6G","DAF","DAG","DDA","DDB","DDL","DEL","DFR","DFX","DG0","DGC","DGD","DGM","DGS","DIG","DLF","DLG","DMU","DNO","DOM","DP5","DQQ","DQR","DR2","DR3","DR4","DRI","DSR","DT6","DVC","E4P","E5G","EAG","EBG","EBQ","EGA","EJT","EPG","ERE","ERI","F1P","F1X","F6P","FBP","FCA","FCB","FCT","FDP","FDQ","FFC","FIX","FMO","FRU","FSI","FU4","FUB","FUC","FUD","FUL","FXP","G16","G1P","G2F","G3I","G4D","G4S","G6D","G6P","G6S","GAC","GAD","GAL","GC1","GC4","GCD","GCN","GCO","GCS","GCT","GCU","GCV","GCW","GCX","GE1","GFG","GFP","GIV","GL0","GL2","GL5","GL6","GL7","GL9","GLA","GLB","GLC","GLD","GLF","GLG","GLO","GLP","GLS","GLT","GLW","GMH","GN1","GNX","GP1","GP4","GPH","GPM","GQ1","GQ2","GQ4","GS1","GS4","GSA","GSD","GTE","GTH","GTK","GTR","GTZ","GU0","GU1","GU2","GU3","GU4","GU5","GU6","GU8","GU9","GUF","GUP","GUZ","GYP","GYV","H2P","HDL","HMS","HS2","HSD","HSG","HSH","HSJ","HSQ","HSR","HSU","HSX","HSY","HSZ","IAB","IDG","IDR","IDS","IDT","IDU","IDX","IDY","IMK","IN1","IPT","ISL","KBG","KD2","KDA","KDM","KDO","KFN","KO1","KO2","KTU","L6S","LAG","LAI","LAK","LAO","LAT","LB2","LBT","LCN","LDY","LGC","LGU","LM2","LMT","LMU","LOG","LOX","LPK","LSM","LTM","LVZ","LXB","LXZ","M1F","M3M","M6P","M8C","MA1","MA2","MA3","MAB","MAG","MAL","MAN","MAT","MAV","MAW","MBG","MCU","MDA","MDM","MDP","MFA","MFB","MFU","MG5","MGA","MGL","MLB","MMA","MMN","MN0","MRP","MTT","MUG","MVP","MXY","N1L","N9S","NAA","NAG","NBG","NDG","NED","NG1","NG6","NGA","NGB","NGC","NGE","NGF","NGL","NGS","NGY","NHF","NM6","NM9","NTF","NTO","NTP","NXD","NYT","OPG","OPM","ORP","OX2","P3M","P53","P6P","PA5","PNA","PNG","PNW","PRP","PSJ","PSV","PTQ","QDK","QPS","QV4","R1P","R1X","R2B","R5P","RAA","RAE","RAF","RAM","RAO","RAT","RB5","RBL","RCD","RDP","REL","RER","RF5","RG1","RGG","RHA","RIB","RIP","RNS","RNT","ROB","ROR","RPA","RST","RUB","RUU","RZM","S6P","S7P","SA0","SCR","SDD","SF6","SF9","SG4","SG5","SG6","SG7","SGA","SGC","SGD","SGN","SGS","SHB","SHG","SI3","SIO","SOE","SOL","SSG","SUC","SUP","SUS","T6P","T6T","TAG","TCB","TDG","TGK","TGY","TH1","TIA","TM5","TM6","TM9","TMR","TMX","TOA","TOC","TRE","TYV","UCD","UDC","VG1","X0X","X1X","X2F","X4S","X5S","X6X","XBP","XDN","XDP","XIF","XIM","XLF","XLS","XMM","XUL","XXR","XYP","XYS","YO5","Z3Q","Z6J","Z9M","ZDC","ZDM"],ad=["CA","C","N","O","O1","O2","OC1","OC2","OX1","OXT","OT1","OT2","H","H1","H2","H3","HA","HN","BB"],od=["P","OP1","OP2","HOP2","HOP3","O2'","O3'","O4'","O5'","C1'","C2'","C3'","C4'","C5'","H1'","H2'","H2''","HO2'","H3'","H4'","H5'","H5''","HO3'","HO5'","O2*","O3*","O4*","O5*","C1*","C2*","C3*","C4*","C5*"],ld={1:{trace:"CA",direction1:"C",direction2:["O","OC1","O1","OX1","OXT","OT1","OT2"],backboneStart:"N",backboneEnd:"C"},2:{trace:["C4'","C4*"],direction1:["C1'","C1*"],direction2:["C3'","C3*"],backboneStart:"P",backboneEnd:["O3'","O3*"]},3:{trace:["C3'","C3*"],direction1:["C2'","C2*"],direction2:["O4'","O4*"],backboneStart:"P",backboneEnd:["O3'","O3*"]},4:{trace:["CA","BB"],backboneStart:["CA","BB"],backboneEnd:["CA","BB"]},5:{trace:["C4'","C4*","P"],backboneStart:["C4'","C4*","P"],backboneEnd:["C4'","C4*","P"]},6:{trace:["C3'","C3*","C2'","P"],backboneStart:["C3'","C3*","C2'","P"],backboneEnd:["C3'","C3*","C2'","P"]}};ld[Oh]={};const cd={HD:"H",HS:"H",A:"C",NA:"N",NS:"N",OA:"O",OS:"O",SA:"S",G0:"C",G1:"C",G2:"C",G3:"C",CG0:"C",CG1:"C",CG2:"C",CG3:"C",W:"O"};function ud(e){switch(e){case 0:return 0;case 1:return 1;case 2:return 2;case 3:return 3;case 4:return 4;default:return 8}}const hd=new Map([[2,Ro(180)],[3,Ro(120)],[4,Ro(109.4721)],[6,Ro(90)]]);function dd(e,t){let i=[];const n=new _t,r=new _t;return n.subVectors(t,e),e.eachBondedAtom((t=>{1!==t.number&&(r.subVectors(t,e),i.push(n.angleTo(r)))})),i}function fd(e,t){const i=e.clone(),n=new _t;n.subVectors(t,e);const r=[new _t,new _t];let s=0;if(e.eachBondedAtom((t=>{s>1||1!==t.number&&(i.index=t.index,r[s++].subVectors(t,e))})),1===s&&i.eachBondedAtom((t=>{s>1||1!==t.number&&t.index!==e.index&&r[s++].subVectors(t,e)})),2!==s)return;const a=r[0].cross(r[1]);return Math.abs(Math.PI/2-a.angleTo(n))}function md(e,t){const i=e.structure,n=i.atomCount,r=new Int8Array(n),s=new Int8Array(n),a=new Int8Array(n),o=new Int8Array(n);return i.eachAtom((e=>{const i=e.index,[n,l,c,u]=function(e,t){const i=e.bondToElementCount(1);let n=e.formalCharge||0;const r="always"===t.assignCharge||"auto"===t.assignCharge&&0===n,s="always"===t.assignH||"auto"===t.assignH&&0===i,a=e.bondCount,o=function(e){let t=0;return e.eachBond((e=>t+=e.bondOrder)),t}(e),l=function(e){const t=e.structure.getBondProxy(),i=e.number,n=8===i||7===i;if(n&&4===e.bondCount)return!1;let r=!1;return e.eachBond((i=>{if(i.bondOrder>1)r=!0;else if(n){const n=i.getOtherAtom(e);n.eachBond((e=>{if(e.bondOrder>1){const t=n.number;if((15===t||16===t)&&8===e.getOtherAtom(n).number)return;r=!0}}),t)}})),r}(e),c=o-a>0;let u=0,h=8;switch(e.number){case 1:r&&(0===a?(n=1,h=0):1===a&&(n=0,h=1));break;case 6:r&&(n=0),s&&(u=Math.max(0,4-o-Math.abs(n))),h=ud(a+u+Math.max(0,-n));break;case 7:if(r)if(s)if(l&&o<4)n=a-i==1&&o-i==2?1:0;else{let t=!1;e.eachBondedAtom((e=>{(16===e.number||e.isMetal())&&(t=!0)})),n=t?0:1}else n=o-3;s&&(u=Math.max(0,3-o+n)),h=ud(l&&!c?a+u-n:a+u+1-n);break;case 8:r&&(s||(n=o-2),1===o&&e.eachBondedAtom((t=>{t.eachBond((i=>{const r=i.getOtherAtom(t);r.index!==e.index&&8===r.number&&2===i.bondOrder&&(n=-1)}))}))),s&&(u=Math.max(0,2-o+n)),h=ud(l&&!c?a+u-n+1:a+u-n+2);break;case 16:r&&(s||(n=o<=3&&!e.bondToElementCount(8)?o-2:0)),s&&o<2&&(u=Math.max(0,2-o+n)),o<=3&&(h=ud(a+u-n+2));break;case 9:case 17:case 35:case 53:case 85:r&&(n=o-1);break;case 3:case 11:case 19:case 37:case 55:case 87:r&&(n=1-o);break;case 4:case 12:case 20:case 38:case 56:case 88:r&&(n=2-o);break;default:console.warn("Requested charge, protonation for an unhandled element",e.element)}return[n,u,u+i,h]}(e,t);r[i]=n,s[i]=l,a[i]=c,o[i]=u})),{charge:r,implicitH:s,totalH:a,idealGeometry:o}}function pd(e){if(e["@valenceModel"])return e["@valenceModel"];const t=md(e,{assignCharge:"auto",assignH:"auto"});return e["@valenceModel"]=t,t}function gd(e){return 15===e.number&&e.bondToElementCount(8)===e.bondCount}const _d=["ARG","HIS","LYS"],yd=["GLU","ASP"];function vd(e,t){return 2===e&&1===t||1===e&&2===t}function bd(e,t){return 3===e&&3===t}function xd(e,t){return 3===e&&1===t||1===e&&3===t}function wd(e){return"HIS"===e.resname&&7==e.number&&e.isRing()}function Sd(e,t){return 5===e&&4===t||4===e&&5===t}function Md(e,t){return 9===e&&5===t||5===e&&9===t}const Ad=[3,11,19,37,55,12,20,38,56,13,31,49,81,21,50,82,83,51,80];function Cd(e,t){return 12===e?11===t||12===t:13===e?10===t:void 0}const Td=[17,35,53,85];const Pd=[7,8,16],Ed=[6,7,15,16];const Id=Ro(180),Dd=Ro(120);function Rd(e,t,i){return!kd(e,t,i)&&(e.modelIndex!==t.modelIndex||e.altloc&&t.altloc&&e.altloc!==t.altloc)}const Ld={maxHydrophobicDist:4,maxHbondDist:3.5,maxHbondSulfurDist:4.1,maxHbondAccAngle:45,maxHbondDonAngle:45,maxHbondAccPlaneAngle:90,maxHbondDonPlaneAngle:30,maxPiStackingDist:5.5,maxPiStackingOffset:2,maxPiStackingAngle:30,maxCationPiDist:6,maxCationPiOffset:2,maxIonicDist:5,maxHalogenBondDist:4,maxHalogenBondAngle:30,maxMetalDist:3,refineSaltBridges:!0,masterModelIndex:-1,lineOfSightDistFactor:1};function kd(e,t,i){return e.modelIndex===i&&t.modelIndex!==i||t.modelIndex===i&&e.modelIndex!==i}function Od(e,t,i){return!kd(e,t,i)&&(e.modelIndex!==t.modelIndex||e.residueIndex===t.residueIndex||e.altloc&&t.altloc&&e.altloc!==t.altloc)}function Nd(t){const i={types:[],groups:[],centers:{x:[],y:[],z:[]},atomSets:[]};return e.Debug&&Fl.time("calculateFeatures"),function(e,t){const{charge:i}=pd(e.data),n={};e.eachResidue((e=>{if(_d.includes(e.resname)){const i=Rh(1);e.eachAtom((e=>{7===e.number&&e.isSidechain()&&Lh(i,e)})),kh(t,i)}else Qh.includes(e.resname)||e.isNucleic()||(e.eachAtom((e=>{let i=!1;const r=Rh(1);!function(e){let t=0;return 6===e.number&&3===e.bondCount&&3===e.bondToElementCount(7)&&e.eachBondedAtom((e=>{e.bondCount-e.bondToElementCount(1)==1&&++t})),2===t}(e)?function(e){let t=0;return 6===e.number&&3===e.bondCount&&2===e.bondToElementCount(7)&&1===e.bondToElementCount(6)&&e.eachBondedAtom((e=>{e.bondCount-e.bondToElementCount(1)==1&&++t})),2===t}(e)&&(r.group=9,i=!0):(r.group=8,i=!0),i&&(e.eachBondedAtom((e=>{7===e.number&&(n[e.index]=!0,Lh(r,e))})),kh(t,r))})),e.eachAtom((e=>{const r=Rh(1);i[e.index]>0&&(n[e.index]||(Lh(r,e),kh(t,r)))})))}))}(t,i),function(e,t){const{charge:i}=pd(e.data),n={};e.eachResidue((e=>{if(yd.includes(e.resname)){const i=Rh(2);e.eachAtom((e=>{8===e.number&&e.isSidechain()&&Lh(i,e)})),kh(t,i)}else if(id.includes(e.resname)){const i=Rh(2);e.eachAtom((e=>{gd(e)&&(i.group=6,e.eachBondedAtom((e=>{8===e.number&&Lh(i,e)})),kh(t,i))}))}else Qh.includes(e.resname)||id.includes(e.resname)||(e.eachAtom((e=>{let i=!1;const r=Rh(2);!function(e){return 16===e.number&&3===e.bondToElementCount(8)}(e)?gd(e)?(r.group=6,i=!0):function(e){return 16===e.number&&4===e.bondToElementCount(8)}(e)?(r.group=5,i=!0):function(e){let t=0;return 6===e.number&&2===e.bondToElementCount(8)&&1===e.bondToElementCount(6)&&e.eachBondedAtom((e=>{8===e.number&&e.bondCount-e.bondToElementCount(1)==1&&++t})),2===t}(e)&&(r.group=10,i=!0):(r.group=4,i=!0),i&&(e.eachBondedAtom((e=>{8===e.number&&(n[e.index]=!0,Lh(r,e))})),kh(t,r))})),e.eachAtom((e=>{const r=Rh(2);i[e.index]<0&&(n[e.index]||(Lh(r,e),kh(t,r)))})))}))}(t,i),function(e,t){const i=e.getAtomProxy();e.eachResidue((e=>{const n=e.getAromaticRings();if(n){const r=e.atomOffset;n.forEach((e=>{const n=Rh(3);e.forEach((e=>{i.index=e+r,Lh(n,i)})),kh(t,n)}))}}))}(t,i),function(e,t){const{charge:i,implicitH:n,idealGeometry:r}=pd(e.data);e.eachAtom((e=>{const s=Rh(5),a=e.number;if(8===a)Lh(s,e),kh(t,s);else if(7===a){if(wd(e))Lh(s,e),kh(t,s);else if(i[e.index]<1){const i=e.bondCount+n[e.index],a=r[e.index];(4===a&&i<4||3===a&&i<3||2===a&&i<2)&&(Lh(s,e),kh(t,s))}}else 16===a&&("CYS"!==e.resname&&"MET"!==e.resname&&-1!==e.formalCharge||(Lh(s,e),kh(t,s)))}))}(t,i),function(e,t){const{totalH:i}=pd(e.data);e.eachAtom((e=>{const n=Rh(4),r=e.number;(wd(e)||i[e.index]>0&&(7===r||8===r||16===r))&&(Lh(n,e),kh(t,n))}))}(t,i),function(e,t){const{totalH:i}=pd(e.data);e.eachAtom((e=>{if(6===e.number&&i[e.index]>0&&(e.bondToElementCount(7)>0||e.bondToElementCount(8)>0||function(e){if(!e.isAromatic())return!1;const t=e.residueType.getRings();if(!t)return!1;let i=!1;return t.rings.forEach((t=>{i||t.some((t=>e.index-e.residueAtomOffset===t))&&(i=t.some((t=>{const i=e.residueType.atomTypeIdList[t],n=e.atomMap.get(i).number;return 7===n||8===n})))})),i}(e))){const i=Rh(9);Lh(i,e),kh(t,i)}}))}(t,i),function(e,t){e.eachAtom((e=>{let i=!1,n=!1;const r=Qh.includes(e.resname),s=id.includes(e.resname);if(r||s?r?8===e.number?(["ASP","GLU","SER","THR","TYR","ASN","GLN"].includes(e.resname)&&e.isSidechain()||e.isBackbone())&&(i=!0,n=!0):16===e.number&&"CYS"===e.resname?(i=!0,n=!0):7===e.number&&"HIS"===e.resname&&e.isSidechain()&&(i=!0):s&&(8===e.number&&e.isBackbone()?(i=!0,n=!0):["N3","N4","N7"].includes(e.atomname)?i=!0:["O2","O4","O6"].includes(e.atomname)&&(i=!0,n=!0)):e.isHalogen()||8===e.number||16===e.number?(i=!0,n=!0):7===e.number&&(i=!0),i){const i=Rh(11);Lh(i,e),kh(t,i)}if(n){const i=Rh(10);Lh(i,e),kh(t,i)}}))}(t,i),function(e,t){e.eachAtom((e=>{if(e.isTransitionMetal()||30===e.number||48===e.number){const i=Rh(12);Lh(i,e),kh(t,i)}else if(Ad.includes(e.number)){const i=Rh(13);Lh(i,e),kh(t,i)}}))}(t,i),function(e,t){e.eachAtom((e=>{const i=Rh(8);let n=!1;6===e.number?(n=!0,e.eachBondedAtom((e=>{const t=e.number;6!==t&&1!==t&&(n=!1)}))):9===e.number&&(n=!0),n&&(Lh(i,e),kh(t,i))}))}(t,i),function(e,t){e.eachAtom((e=>{if(Pd.includes(e.number)){let i=!1;if(e.eachBondedAtom((e=>{Ed.includes(e.number)&&(i=!0)})),i){const i=Rh(7);Lh(i,e),kh(t,i)}}}))}(t,i),function(e,t){e.eachAtom((e=>{if(Td.includes(e.number)&&1===e.bondToElementCount(6)){const i=Rh(6);Lh(i,e),kh(t,i)}}))}(t,i),e.Debug&&Fl.timeEnd("calculateFeatures"),i}function Fd(t,i=Ld){const n=function(e){const{types:t,centers:i}=e;return{features:e,spatialHash:new Ch(i),contactStore:new Ph,featureSet:new Ih(t.length,!1)}}(Nd(t));e.Debug&&Fl.time("calculateContacts"),function(e,t,i={}){const n=uo(i.maxIonicDist,Ld.maxIonicDist),r=uo(i.maxPiStackingDist,Ld.maxPiStackingDist),s=uo(i.maxPiStackingOffset,Ld.maxPiStackingOffset),a=uo(i.maxPiStackingAngle,Ld.maxPiStackingAngle),o=uo(i.maxCationPiDist,Ld.maxCationPiDist),l=uo(i.maxCationPiOffset,Ld.maxCationPiOffset),c=uo(i.masterModelIndex,Ld.masterModelIndex),u=Math.max(n+2,r,o),h=r*r,d=o*o,{features:f,spatialHash:m,contactStore:p,featureSet:g}=t,{types:_,centers:y,atomSets:v}=f,{x:b,y:x,z:w}=y,S=_.length,M=e.atomStore.x,A=e.atomStore.y,C=e.atomStore.z,T=e.getAtomProxy(),P=e.getAtomProxy(),E=function(e,t,i){const n=e.length,r=t.length;for(let s=0;s{if(t<=e)return;if(T.index=v[e][0],P.index=v[t][0],Od(T,P,c))return;const r=_[e],o=_[t];if(vd(r,o))E(v[e],v[t],n)&&z(e,t,1);else if(bd(r,o)){if(i<=h){F(v[e],O),F(v[t],N);const i=57.29578*O.angleTo(N);Math.min(B(e,t,N),B(t,e,O))<=s&&(i<=a||i>=180-a||i<=a+90&&i>=90-a)&&z(e,t,3)}}else if(xd(r,o)&&i<=d){const[i,n]=3===r?[e,t]:[t,e];F(v[i],O),B(n,i,O)<=l&&z(i,n,2)}}))}(t,n,i),function(e,t,i={}){const n=uo(i.maxHbondDist,Ld.maxHbondDist),r=uo(i.maxHbondSulfurDist,Ld.maxHbondSulfurDist),s=Ro(uo(i.maxHbondAccAngle,Ld.maxHbondAccAngle)),a=Ro(uo(i.maxHbondDonAngle,Ld.maxHbondDonAngle)),o=Ro(uo(i.maxHbondAccPlaneAngle,Ld.maxHbondAccPlaneAngle)),l=Ro(uo(i.maxHbondDonPlaneAngle,Ld.maxHbondDonPlaneAngle)),c=uo(i.masterModelIndex,Ld.masterModelIndex),u=Math.max(n,r),h=n*n,{features:d,spatialHash:f,contactStore:m,featureSet:p}=t,{types:g,centers:_,atomSets:y}=d,{x:v,y:b,z:x}=_,w=g.length,{idealGeometry:S}=pd(e.data),M=e.getAtomProxy(),A=e.getAtomProxy();for(let e=0;e{if(t<=e)return;const n=g[e],r=g[t],u=Md(n,r);if(!u&&!Sd(n,r))return;const[d,f]=5===r?[e,t]:[t,e];if(M.index=y[d][0],A.index=y[f][0],A.index===M.index)return;if(Od(M,A,c))return;if(16!==M.number&&16!==A.number&&i>h)return;if(M.connectedTo(A))return;const _=dd(M,A),v=hd.get(S[M.index])||Ro(120);if(_.some((e=>Math.abs(v-e)>a)))return;if(3===S[M.index]){const e=fd(M,A);if(void 0!==e&&e>l)return}const b=dd(A,M),x=hd.get(S[A.index])||Ro(120);if(b.some((e=>x-e>s)))return;if(3===S[A.index]){const e=fd(A,M);if(void 0!==e&&e>o)return}p.setBits(d,f);const w=u?8:function(e,t){return e.isWater()&&t.isWater()}(C=M,T=A)?9:function(e,t){return e.isBackbone()&&t.isBackbone()}(C,T)?10:4;var C,T;m.addContact(d,f,w)}))}(t,n,i),function(e,t,i={}){const n=uo(i.maxMetalDist,Ld.maxMetalDist),r=uo(i.masterModelIndex,Ld.masterModelIndex),{features:s,spatialHash:a,contactStore:o,featureSet:l}=t,{types:c,centers:u,atomSets:h}=s,{x:d,y:f,z:m}=u,p=c.length,g=e.getAtomProxy(),_=e.getAtomProxy();for(let e=0;e{if(t<=e)return;if(g.index=h[e][0],_.index=h[t][0],Od(g,_,r))return;const n=g.isMetal(),s=_.isMetal();if(!n&&!s)return;const[a,u]=n?[c[e],c[t]]:[c[t],c[e]];Cd(a,u)&&(l.setBits(e,t),o.addContact(e,t,7))}))}(t,n,i),function(e,t,i={}){const n=uo(i.maxHydrophobicDist,Ld.maxHydrophobicDist),r=uo(i.masterModelIndex,Ld.masterModelIndex),{features:s,spatialHash:a,contactStore:o,featureSet:l}=t,{types:c,centers:u,atomSets:h}=s,{x:d,y:f,z:m}=u,p=c.length,g=e.getAtomProxy(),_=e.getAtomProxy();for(let e=0;e{var n,s;t<=e||(g.index=h[e][0],_.index=h[t][0],Od(g,_,r)||9===g.number&&9===_.number||g.connectedTo(_)||(n=c[e],s=c[t],8===n&&8===s&&(l.setBits(e,t),o.addContact(e,t,6))))}))}(t,n,i),function(e,t,i={}){const n=uo(i.maxHalogenBondDist,Ld.maxHalogenBondDist),r=Ro(uo(i.maxHalogenBondAngle,Ld.maxHalogenBondAngle)),s=uo(i.masterModelIndex,Ld.masterModelIndex),{features:a,spatialHash:o,contactStore:l,featureSet:c}=t,{types:u,centers:h,atomSets:d}=a,{x:f,y:m,z:p}=h,g=u.length,_=e.getAtomProxy(),y=e.getAtomProxy();for(let e=0;e{if(t<=e)return;if(_.index=d[e][0],y.index=d[t][0],Od(_,y,s))return;if(n=u[e],a=u[t],!(7===n&&6===a||6===n&&7===a))return;var n,a;const[o,h]=6===u[e]?[_,y]:[y,_],f=dd(o,h);if(1!==f.length)return;if(Id-f[0]>r)return;const m=dd(h,o);0!==m.length&&(m.some((e=>Dd-e>r))||(c.setBits(e,t),l.addContact(e,t,5)))}))}(t,n,i);const r=function(e){const{index1:t,index2:i,count:n}=e.contactStore,r=Dh({nodeArray1:t,nodeArray2:i,edgeCount:n,nodeCount:e.featureSet.length}),s=new Ih(e.contactStore.count,!0);return Object.assign({adjacencyList:r,contactSet:s},e)}(n);return function(t,i,n={}){e.Debug&&Fl.time("refineLineOfSight");const r=uo(n.lineOfSightDistFactor,Ld.lineOfSightDistFactor),s=uo(n.masterModelIndex,Ld.masterModelIndex),a=t.spatialHash,{contactSet:o,contactStore:l,features:c}=i,{index1:u,index2:h}=l,{centers:d,atomSets:f}=c,{x:m,y:p,z:g}=d,_=t.getAtomProxy(),y=t.getAtomProxy(),v=t.getAtomProxy(),b=new _t,x=new _t,w=3*r,S=r*r;o.forEach((t=>{b.set(m[u[t]],p[u[t]],g[u[t]]),x.set(m[h[t]],p[h[t]],g[h[t]]);const i=(b.x+x.x)/2,n=(b.y+x.y)/2,r=(b.z+x.z)/2,l=f[u[t]],c=f[h[t]];_.index=l[0],y.index=c[0],a.eachWithin(i,n,r,w,((i,n)=>{v.index=i,1!==v.number&&v.vdw*v.vdw*S>n&&!Rd(_,v,s)&&!Rd(y,v,s)&&!l.includes(i)&&!c.includes(i)&&b.distanceToSquared(v)>1&&x.distanceToSquared(v)>1&&(o.clear(t),e.Debug&&Fl.log("removing",_.qualifiedName(),y.qualifiedName(),"because",v.qualifiedName()))}))})),e.Debug&&Fl.timeEnd("refineLineOfSight")}(t,r,i),function(e,t){const{contactSet:i,contactStore:n,features:r}=t,{type:s,index1:a,index2:o}=n,{atomSets:l}=r,c=e.getAtomProxy(),u=e.getAtomProxy(),h={},d=function(e,t,n){const[r,s]=h[n]||[1/0,-1];e{if(6!==s[e])return;c.index=l[a[e]][0],u.index=l[o[e]][0];const t=c.distanceTo(u);d(t,e,`${c.index}|${u.residueIndex}`),d(t,e,`${u.index}|${c.residueIndex}`)}))}(t,r),i.refineSaltBridges&&function(e,t){const{contactSet:i,contactStore:n,features:r}=t,{type:s,index1:a,index2:o}=n,{atomSets:l}=r,c={},u=function(e,t){c[e]||(c[e]=[]),c[e].push(t)};i.forEach((e=>{1===s[e]&&(l[a[e]].forEach((t=>u(t,e))),l[o[e]].forEach((t=>u(t,e))))})),i.forEach((e=>{if(!function(e){return 4===e||9===e||10===e}(s[e]))return;const t=c[l[a[e]][0]],n=c[l[o[e]][0]];if(!t||!n)return;const r=t.length;for(let s=0;s{3===s[e]&&(l[a[e]].forEach((t=>u(t,e))),l[o[e]].forEach((t=>u(t,e))))})),i.forEach((e=>{if(6!==s[e]&&2!==s[e])return;const t=c[l[a[e]][0]],n=c[l[o[e]][0]];if(!t||!n)return;const r=t.length;for(let s=0;s{1===s[e]&&(l[a[e]].forEach((t=>u(t,e))),l[o[e]].forEach((t=>u(t,e))))})),i.forEach((e=>{if(7!==s[e])return;const t=c[l[a[e]][0]],n=c[l[o[e]][0]];if(!t||!n)return;const r=t.length;for(let e=0;et.getAtomSet(new wl(e)))):t.getAtomSet(new wl(n.filterSele))),a.forEach((e=>{const t=p[e];if(!r.includes(t))return;if(x){const t=c[f[e]][0],i=c[m[e]][0];if(Array.isArray(x)){if(!(x[0].isSet(t)&&x[1].isSet(i)||x[1].isSet(t)&&x[0].isSet(i)))return}else if(!x.isSet(t)&&!x.isSet(i))return}const i=f[e],s=m[e];g.push(u[i],h[i],d[i]),_.push(u[s],h[s],d[s]),y.push(...function(e){switch(e){case 4:case 9:case 10:return Ud.setHex(2851770).toArray();case 6:return Ud.setHex(8421504).toArray();case 5:return Ud.setHex(4259775).toArray();case 1:return Ud.setHex(15779860).toArray();case 7:return Ud.setHex(9191577).toArray();case 2:return Ud.setHex(16744448).toArray();case 3:return Ud.setHex(9220966).toArray();case 8:return Ud.setHex(12967404).toArray();default:return Ud.setHex(13421772).toArray()}}(t)),v.push(n.radius),b.push(e)})),{position1:new Float32Array(g),position2:new Float32Array(_),color:new Float32Array(y),color2:new Float32Array(y),radius:new Float32Array(v),picking:new qd(b,e,t)}}class $d{constructor(e){this.array=e}get type(){return""}get data(){return{}}getIndex(e){return this.array?this.array[e]:e}getObject(e){return{}}_applyTransformations(e,t,i){return t&&e.applyMatrix4(t.matrix),i&&e.applyMatrix4(i.matrix),e}_getPosition(e){return new _t}getPosition(e,t,i){return this._applyTransformations(this._getPosition(e),t,i)}}class Gd extends $d{constructor(e){super(),this.shape=e}get primitive(){}get data(){return this.shape}get type(){return this.primitive.type}getObject(e){return this.primitive.objectFromShape(this.shape,this.getIndex(e))}_getPosition(e){return this.primitive.positionFromShape(this.shape,this.getIndex(e))}}class Hd extends $d{constructor(e,t){super(e),this.structure=t}get type(){return"atom"}get data(){return this.structure}getObject(e){return this.structure.getAtomProxy(this.getIndex(e))}_getPosition(e){return(new _t).copy(this.getObject(e))}}class jd extends $d{constructor(e){super(),this.axes=e}get type(){return"axes"}get data(){return this.axes}getObject(){return{axes:this.axes}}_getPosition(){return this.axes.center.clone()}}class Wd extends $d{constructor(e,t,i){super(e),this.structure=t,this.bondStore=i||t.bondStore}get type(){return"bond"}get data(){return this.structure}getObject(e){const t=this.structure.getBondProxy(this.getIndex(e));return t.bondStore=this.bondStore,t}_getPosition(e){const t=this.getObject(e);return(new _t).copy(t.atom1).add(t.atom2).multiplyScalar(.5)}}class qd extends $d{constructor(e,t,i){super(e),this.contacts=t,this.structure=i}get type(){return"contact"}get data(){return this.contacts}getObject(e){const t=this.getIndex(e),{features:i,contactStore:n}=this.contacts,{centers:r,atomSets:s}=i,{x:a,y:o,z:l}=r,{index1:c,index2:u,type:h}=n,d=c[t],f=u[t];return{center1:new _t(a[d],o[d],l[d]),center2:new _t(a[f],o[f],l[f]),atom1:this.structure.getAtomProxy(s[d][0]),atom2:this.structure.getAtomProxy(s[f][0]),type:Bd(h[t])}}_getPosition(e){const{center1:t,center2:i}=this.getObject(e);return(new _t).addVectors(t,i).multiplyScalar(.5)}}class Xd extends $d{constructor(e,t,i){super(e),this.validation=t,this.structure=i}get type(){return"clash"}get data(){return this.validation}getObject(e){const t=this.validation,i=this.getIndex(e);return{validation:t,index:i,clash:t.clashArray[i]}}_getAtomProxyFromSele(e){const t=new wl(e),i=this.structure.getAtomIndices(t)[0];return this.structure.getAtomProxy(i)}_getPosition(e){const t=this.getObject(e).clash,i=this._getAtomProxyFromSele(t.sele1),n=this._getAtomProxyFromSele(t.sele2);return(new _t).copy(i).add(n).multiplyScalar(.5)}}class Yd extends Wd{get type(){return"distance"}}class Kd extends $d{get type(){return"ignore"}}class Zd extends Gd{constructor(e,t){super(e),this.mesh=t}get type(){return"mesh"}getObject(){const e=this.mesh;return{shape:this.shape,name:e.name,serial:e.serial}}_getPosition(){return this.__position||(this.__position=zu(this.mesh.position)),this.__position}}class Qd extends $d{constructor(e,t){super(e),this.surface=t}get type(){return"surface"}get data(){return this.surface}getObject(e){return{surface:this.surface,index:this.getIndex(e)}}_getPosition(){return this.surface.center.clone()}}class Jd extends $d{constructor(e,t){super(),this.unitcell=e,this.structure=t}get type(){return"unitcell"}get data(){return this.unitcell}getObject(){return{unitcell:this.unitcell,structure:this.structure}}_getPosition(){return this.unitcell.getCenter(this.structure)}}class ef extends $d{constructor(e,t){super(e),this.volume=t}get type(){return"volume"}get data(){return this.volume}getObject(e){const t=this.volume,i=this.getIndex(e);return{volume:t,index:i,value:t.data[i]}}_getPosition(e){const t=this.volume.position,i=this.getIndex(e);return new _t(t[3*i],t[3*i+1],t[3*i+2])}}class tf extends ef{get type(){return"slice"}}function nf(){return new Uint32Array([0,265,515,778,1030,1295,1541,1804,2060,2309,2575,2822,3082,3331,3593,3840,400,153,915,666,1430,1183,1941,1692,2460,2197,2975,2710,3482,3219,3993,3728,560,825,51,314,1590,1855,1077,1340,2620,2869,2111,2358,3642,3891,3129,3376,928,681,419,170,1958,1711,1445,1196,2988,2725,2479,2214,4010,3747,3497,3232,1120,1385,1635,1898,102,367,613,876,3180,3429,3695,3942,2154,2403,2665,2912,1520,1273,2035,1786,502,255,1013,764,3580,3317,4095,3830,2554,2291,3065,2800,1616,1881,1107,1370,598,863,85,348,3676,3925,3167,3414,2650,2899,2137,2384,1984,1737,1475,1226,966,719,453,204,4044,3781,3535,3270,3018,2755,2505,2240,2240,2505,2755,3018,3270,3535,3781,4044,204,453,719,966,1226,1475,1737,1984,2384,2137,2899,2650,3414,3167,3925,3676,348,85,863,598,1370,1107,1881,1616,2800,3065,2291,2554,3830,4095,3317,3580,764,1013,255,502,1786,2035,1273,1520,2912,2665,2403,2154,3942,3695,3429,3180,876,613,367,102,1898,1635,1385,1120,3232,3497,3747,4010,2214,2479,2725,2988,1196,1445,1711,1958,170,419,681,928,3376,3129,3891,3642,2358,2111,2869,2620,1340,1077,1855,1590,314,51,825,560,3728,3993,3219,3482,2710,2975,2197,2460,1692,1941,1183,1430,666,915,153,400,3840,3593,3331,3082,2822,2575,2309,2060,1804,1541,1295,1030,778,515,265,0])}function rf(){return new Int32Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,9,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,10,0,2,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,8,3,2,10,8,10,9,8,-1,-1,-1,-1,-1,-1,-1,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,8,11,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,11,2,1,9,11,9,8,11,-1,-1,-1,-1,-1,-1,-1,3,10,1,11,10,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,10,1,0,8,10,8,11,10,-1,-1,-1,-1,-1,-1,-1,3,9,0,3,11,9,11,10,9,-1,-1,-1,-1,-1,-1,-1,9,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,7,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,1,9,4,7,1,7,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,4,7,3,0,4,1,2,10,-1,-1,-1,-1,-1,-1,-1,9,2,10,9,0,2,8,4,7,-1,-1,-1,-1,-1,-1,-1,2,10,9,2,9,7,2,7,3,7,9,4,-1,-1,-1,-1,8,4,7,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,4,7,11,2,4,2,0,4,-1,-1,-1,-1,-1,-1,-1,9,0,1,8,4,7,2,3,11,-1,-1,-1,-1,-1,-1,-1,4,7,11,9,4,11,9,11,2,9,2,1,-1,-1,-1,-1,3,10,1,3,11,10,7,8,4,-1,-1,-1,-1,-1,-1,-1,1,11,10,1,4,11,1,0,4,7,11,4,-1,-1,-1,-1,4,7,8,9,0,11,9,11,10,11,0,3,-1,-1,-1,-1,4,7,11,4,11,9,9,11,10,-1,-1,-1,-1,-1,-1,-1,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,4,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,5,4,8,3,5,3,1,5,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,10,4,9,5,-1,-1,-1,-1,-1,-1,-1,5,2,10,5,4,2,4,0,2,-1,-1,-1,-1,-1,-1,-1,2,10,5,3,2,5,3,5,4,3,4,8,-1,-1,-1,-1,9,5,4,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,0,8,11,4,9,5,-1,-1,-1,-1,-1,-1,-1,0,5,4,0,1,5,2,3,11,-1,-1,-1,-1,-1,-1,-1,2,1,5,2,5,8,2,8,11,4,8,5,-1,-1,-1,-1,10,3,11,10,1,3,9,5,4,-1,-1,-1,-1,-1,-1,-1,4,9,5,0,8,1,8,10,1,8,11,10,-1,-1,-1,-1,5,4,0,5,0,11,5,11,10,11,0,3,-1,-1,-1,-1,5,4,8,5,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,9,7,8,5,7,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,3,0,9,5,3,5,7,3,-1,-1,-1,-1,-1,-1,-1,0,7,8,0,1,7,1,5,7,-1,-1,-1,-1,-1,-1,-1,1,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,7,8,9,5,7,10,1,2,-1,-1,-1,-1,-1,-1,-1,10,1,2,9,5,0,5,3,0,5,7,3,-1,-1,-1,-1,8,0,2,8,2,5,8,5,7,10,5,2,-1,-1,-1,-1,2,10,5,2,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,7,9,5,7,8,9,3,11,2,-1,-1,-1,-1,-1,-1,-1,9,5,7,9,7,2,9,2,0,2,7,11,-1,-1,-1,-1,2,3,11,0,1,8,1,7,8,1,5,7,-1,-1,-1,-1,11,2,1,11,1,7,7,1,5,-1,-1,-1,-1,-1,-1,-1,9,5,8,8,5,7,10,1,3,10,3,11,-1,-1,-1,-1,5,7,0,5,0,9,7,11,0,1,0,10,11,10,0,-1,11,10,0,11,0,3,10,5,0,8,0,7,5,7,0,-1,11,10,5,7,11,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,0,1,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,1,9,8,5,10,6,-1,-1,-1,-1,-1,-1,-1,1,6,5,2,6,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,6,5,1,2,6,3,0,8,-1,-1,-1,-1,-1,-1,-1,9,6,5,9,0,6,0,2,6,-1,-1,-1,-1,-1,-1,-1,5,9,8,5,8,2,5,2,6,3,2,8,-1,-1,-1,-1,2,3,11,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,0,8,11,2,0,10,6,5,-1,-1,-1,-1,-1,-1,-1,0,1,9,2,3,11,5,10,6,-1,-1,-1,-1,-1,-1,-1,5,10,6,1,9,2,9,11,2,9,8,11,-1,-1,-1,-1,6,3,11,6,5,3,5,1,3,-1,-1,-1,-1,-1,-1,-1,0,8,11,0,11,5,0,5,1,5,11,6,-1,-1,-1,-1,3,11,6,0,3,6,0,6,5,0,5,9,-1,-1,-1,-1,6,5,9,6,9,11,11,9,8,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,4,7,3,6,5,10,-1,-1,-1,-1,-1,-1,-1,1,9,0,5,10,6,8,4,7,-1,-1,-1,-1,-1,-1,-1,10,6,5,1,9,7,1,7,3,7,9,4,-1,-1,-1,-1,6,1,2,6,5,1,4,7,8,-1,-1,-1,-1,-1,-1,-1,1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1,8,4,7,9,0,5,0,6,5,0,2,6,-1,-1,-1,-1,7,3,9,7,9,4,3,2,9,5,9,6,2,6,9,-1,3,11,2,7,8,4,10,6,5,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,2,4,2,0,2,7,11,-1,-1,-1,-1,0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1,9,2,1,9,11,2,9,4,11,7,11,4,5,10,6,-1,8,4,7,3,11,5,3,5,1,5,11,6,-1,-1,-1,-1,5,1,11,5,11,6,1,0,11,7,11,4,0,4,11,-1,0,5,9,0,6,5,0,3,6,11,6,3,8,4,7,-1,6,5,9,6,9,11,4,7,9,7,11,9,-1,-1,-1,-1,10,4,9,6,4,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,10,6,4,9,10,0,8,3,-1,-1,-1,-1,-1,-1,-1,10,0,1,10,6,0,6,4,0,-1,-1,-1,-1,-1,-1,-1,8,3,1,8,1,6,8,6,4,6,1,10,-1,-1,-1,-1,1,4,9,1,2,4,2,6,4,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,9,2,4,9,2,6,4,-1,-1,-1,-1,0,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,3,2,8,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,10,4,9,10,6,4,11,2,3,-1,-1,-1,-1,-1,-1,-1,0,8,2,2,8,11,4,9,10,4,10,6,-1,-1,-1,-1,3,11,2,0,1,6,0,6,4,6,1,10,-1,-1,-1,-1,6,4,1,6,1,10,4,8,1,2,1,11,8,11,1,-1,9,6,4,9,3,6,9,1,3,11,6,3,-1,-1,-1,-1,8,11,1,8,1,0,11,6,1,9,1,4,6,4,1,-1,3,11,6,3,6,0,0,6,4,-1,-1,-1,-1,-1,-1,-1,6,4,8,11,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,10,6,7,8,10,8,9,10,-1,-1,-1,-1,-1,-1,-1,0,7,3,0,10,7,0,9,10,6,7,10,-1,-1,-1,-1,10,6,7,1,10,7,1,7,8,1,8,0,-1,-1,-1,-1,10,6,7,10,7,1,1,7,3,-1,-1,-1,-1,-1,-1,-1,1,2,6,1,6,8,1,8,9,8,6,7,-1,-1,-1,-1,2,6,9,2,9,1,6,7,9,0,9,3,7,3,9,-1,7,8,0,7,0,6,6,0,2,-1,-1,-1,-1,-1,-1,-1,7,3,2,6,7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,11,10,6,8,10,8,9,8,6,7,-1,-1,-1,-1,2,0,7,2,7,11,0,9,7,6,7,10,9,10,7,-1,1,8,0,1,7,8,1,10,7,6,7,10,2,3,11,-1,11,2,1,11,1,7,10,6,1,6,7,1,-1,-1,-1,-1,8,9,6,8,6,7,9,1,6,11,6,3,1,3,6,-1,0,9,1,11,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,8,0,7,0,6,3,11,0,11,6,0,-1,-1,-1,-1,7,11,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,1,9,8,3,1,11,7,6,-1,-1,-1,-1,-1,-1,-1,10,1,2,6,11,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,8,6,11,7,-1,-1,-1,-1,-1,-1,-1,2,9,0,2,10,9,6,11,7,-1,-1,-1,-1,-1,-1,-1,6,11,7,2,10,3,10,8,3,10,9,8,-1,-1,-1,-1,7,2,3,6,2,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,0,8,7,6,0,6,2,0,-1,-1,-1,-1,-1,-1,-1,2,7,6,2,3,7,0,1,9,-1,-1,-1,-1,-1,-1,-1,1,6,2,1,8,6,1,9,8,8,7,6,-1,-1,-1,-1,10,7,6,10,1,7,1,3,7,-1,-1,-1,-1,-1,-1,-1,10,7,6,1,7,10,1,8,7,1,0,8,-1,-1,-1,-1,0,3,7,0,7,10,0,10,9,6,10,7,-1,-1,-1,-1,7,6,10,7,10,8,8,10,9,-1,-1,-1,-1,-1,-1,-1,6,8,4,11,8,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,6,11,3,0,6,0,4,6,-1,-1,-1,-1,-1,-1,-1,8,6,11,8,4,6,9,0,1,-1,-1,-1,-1,-1,-1,-1,9,4,6,9,6,3,9,3,1,11,3,6,-1,-1,-1,-1,6,8,4,6,11,8,2,10,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,11,0,6,11,0,4,6,-1,-1,-1,-1,4,11,8,4,6,11,0,2,9,2,10,9,-1,-1,-1,-1,10,9,3,10,3,2,9,4,3,11,3,6,4,6,3,-1,8,2,3,8,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,0,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,4,2,4,6,4,3,8,-1,-1,-1,-1,1,9,4,1,4,2,2,4,6,-1,-1,-1,-1,-1,-1,-1,8,1,3,8,6,1,8,4,6,6,10,1,-1,-1,-1,-1,10,1,0,10,0,6,6,0,4,-1,-1,-1,-1,-1,-1,-1,4,6,3,4,3,8,6,10,3,0,3,9,10,9,3,-1,10,9,4,6,10,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,5,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,5,11,7,6,-1,-1,-1,-1,-1,-1,-1,5,0,1,5,4,0,7,6,11,-1,-1,-1,-1,-1,-1,-1,11,7,6,8,3,4,3,5,4,3,1,5,-1,-1,-1,-1,9,5,4,10,1,2,7,6,11,-1,-1,-1,-1,-1,-1,-1,6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1,7,6,11,5,4,10,4,2,10,4,0,2,-1,-1,-1,-1,3,4,8,3,5,4,3,2,5,10,5,2,11,7,6,-1,7,2,3,7,6,2,5,4,9,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,6,0,6,2,6,8,7,-1,-1,-1,-1,3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1,6,2,8,6,8,7,2,1,8,4,8,5,1,5,8,-1,9,5,4,10,1,6,1,7,6,1,3,7,-1,-1,-1,-1,1,6,10,1,7,6,1,0,7,8,7,0,9,5,4,-1,4,0,10,4,10,5,0,3,10,6,10,7,3,7,10,-1,7,6,10,7,10,8,5,4,10,4,8,10,-1,-1,-1,-1,6,9,5,6,11,9,11,8,9,-1,-1,-1,-1,-1,-1,-1,3,6,11,0,6,3,0,5,6,0,9,5,-1,-1,-1,-1,0,11,8,0,5,11,0,1,5,5,6,11,-1,-1,-1,-1,6,11,3,6,3,5,5,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,11,9,11,8,11,5,6,-1,-1,-1,-1,0,11,3,0,6,11,0,9,6,5,6,9,1,2,10,-1,11,8,5,11,5,6,8,0,5,10,5,2,0,2,5,-1,6,11,3,6,3,5,2,10,3,10,5,3,-1,-1,-1,-1,5,8,9,5,2,8,5,6,2,3,8,2,-1,-1,-1,-1,9,5,6,9,6,0,0,6,2,-1,-1,-1,-1,-1,-1,-1,1,5,8,1,8,0,5,6,8,3,8,2,6,2,8,-1,1,5,6,2,1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,6,1,6,10,3,8,6,5,6,9,8,9,6,-1,10,1,0,10,0,6,9,5,0,5,6,0,-1,-1,-1,-1,0,3,8,5,6,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,7,5,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,11,7,5,8,3,0,-1,-1,-1,-1,-1,-1,-1,5,11,7,5,10,11,1,9,0,-1,-1,-1,-1,-1,-1,-1,10,7,5,10,11,7,9,8,1,8,3,1,-1,-1,-1,-1,11,1,2,11,7,1,7,5,1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,7,1,7,5,7,2,11,-1,-1,-1,-1,9,7,5,9,2,7,9,0,2,2,11,7,-1,-1,-1,-1,7,5,2,7,2,11,5,9,2,3,2,8,9,8,2,-1,2,5,10,2,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,8,2,0,8,5,2,8,7,5,10,2,5,-1,-1,-1,-1,9,0,1,5,10,3,5,3,7,3,10,2,-1,-1,-1,-1,9,8,2,9,2,1,8,7,2,10,2,5,7,5,2,-1,1,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,7,0,7,1,1,7,5,-1,-1,-1,-1,-1,-1,-1,9,0,3,9,3,5,5,3,7,-1,-1,-1,-1,-1,-1,-1,9,8,7,5,9,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,8,4,5,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,5,0,4,5,11,0,5,10,11,11,3,0,-1,-1,-1,-1,0,1,9,8,4,10,8,10,11,10,4,5,-1,-1,-1,-1,10,11,4,10,4,5,11,3,4,9,4,1,3,1,4,-1,2,5,1,2,8,5,2,11,8,4,5,8,-1,-1,-1,-1,0,4,11,0,11,3,4,5,11,2,11,1,5,1,11,-1,0,2,5,0,5,9,2,11,5,4,5,8,11,8,5,-1,9,4,5,2,11,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,5,10,3,5,2,3,4,5,3,8,4,-1,-1,-1,-1,5,10,2,5,2,4,4,2,0,-1,-1,-1,-1,-1,-1,-1,3,10,2,3,5,10,3,8,5,4,5,8,0,1,9,-1,5,10,2,5,2,4,1,9,2,9,4,2,-1,-1,-1,-1,8,4,5,8,5,3,3,5,1,-1,-1,-1,-1,-1,-1,-1,0,4,5,1,0,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,4,5,8,5,3,9,0,5,0,3,5,-1,-1,-1,-1,9,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,11,7,4,9,11,9,10,11,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,7,9,11,7,9,10,11,-1,-1,-1,-1,1,10,11,1,11,4,1,4,0,7,4,11,-1,-1,-1,-1,3,1,4,3,4,8,1,10,4,7,4,11,10,11,4,-1,4,11,7,9,11,4,9,2,11,9,1,2,-1,-1,-1,-1,9,7,4,9,11,7,9,1,11,2,11,1,0,8,3,-1,11,7,4,11,4,2,2,4,0,-1,-1,-1,-1,-1,-1,-1,11,7,4,11,4,2,8,3,4,3,2,4,-1,-1,-1,-1,2,9,10,2,7,9,2,3,7,7,4,9,-1,-1,-1,-1,9,10,7,9,7,4,10,2,7,8,7,0,2,0,7,-1,3,7,10,3,10,2,7,4,10,1,10,0,4,0,10,-1,1,10,2,8,7,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,7,1,3,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,0,8,1,8,7,1,-1,-1,-1,-1,4,0,3,7,4,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,8,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,11,9,10,-1,-1,-1,-1,-1,-1,-1,0,1,10,0,10,8,8,10,11,-1,-1,-1,-1,-1,-1,-1,3,1,10,11,3,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,11,1,11,9,9,11,8,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,1,2,9,2,11,9,-1,-1,-1,-1,0,2,11,8,0,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,10,8,9,-1,-1,-1,-1,-1,-1,-1,9,10,2,0,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,0,1,8,1,10,8,-1,-1,-1,-1,1,10,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1])}function sf(e,t,i,n,r){var s,a,o,l,c,u,h,d=[[0,4,4,4,2,0,0,0,2,2,0,0],[4,0,4,4,0,8,0,0,0,8,8,0],[4,4,0,4,0,0,8,0,0,0,8,8],[4,4,4,0,0,0,0,1,1,0,0,1],[2,0,0,0,0,8,8,8,2,2,0,0],[0,8,0,0,8,0,8,8,0,8,8,0],[0,0,8,0,8,8,0,8,0,0,8,8],[0,0,0,1,8,8,8,0,1,0,0,1],[2,0,0,1,2,0,0,1,0,2,0,1],[2,8,0,0,2,8,0,0,2,0,8,0],[0,8,8,0,0,8,8,0,0,8,0,8],[0,0,8,1,0,0,8,1,1,0,8,0]],f=0,m=!1,p=!1,g=!1,_=!1,y=-1,v=t*i*n,b=t,x=t*i,w=new Int32Array(12),S=[],M=[],A=[],C=[],T=nf(),P=rf();function E(e,t,i){return e+(t-e)*i}function I(e,r,s){return x*(s=(s+h)%n)+b*(r=(r+u)%i)+(e=(e+c)%t)}function D(e,t,i,n,l,c,u){var h=3*e;if(a[h]<0){var d=(f-c)/(u-c),p=s,g=3*o;if(S[g]=i+d,S[g+1]=n,S[g+2]=l,!m){var _=3*e;M[g]=y*E(p[_],p[_+3],d),M[g+1]=y*E(p[_+1],p[_+4],d),M[g+2]=y*E(p[_+2],p[_+5],d)}r&&(C[o]=r[e+Math.round(d)]),a[h]=o,w[t]=o,o+=1}else w[t]=a[h]}function R(e,t,i,n,l,c,u){var h=3*e+1;if(a[h]<0){var d=(f-c)/(u-c),p=s,g=3*o;if(S[g]=i,S[g+1]=n+d,S[g+2]=l,!m){var _=3*e,v=_+3*b;M[g]=y*E(p[_],p[v],d),M[g+1]=y*E(p[_+1],p[v+1],d),M[g+2]=y*E(p[_+2],p[v+2],d)}r&&(C[o]=r[e+Math.round(d)*b]),a[h]=o,w[t]=o,o+=1}else w[t]=a[h]}function L(e,t,i,n,l,c,u){var h=3*e+2;if(a[h]<0){var d=(f-c)/(u-c),p=s,g=3*o;if(S[g]=i,S[g+1]=n,S[g+2]=l+d,!m){var _=3*e,v=_+3*x;M[g]=y*E(p[_],p[v],d),M[g+1]=y*E(p[_+1],p[v+1],d),M[g+2]=y*E(p[_+2],p[v+2],d)}r&&(C[o]=r[e+Math.round(d)*x]),a[h]=o,w[t]=o,o+=1}else w[t]=a[h]}function k(t){var i=3*t;0===s[i]&&(s[i]=e[(t-1+v)%v]-e[(t+1)%v],s[i+1]=e[(t-b+v)%v]-e[(t+b)%v],s[i+2]=e[(t-x+v)%v]-e[(t+x)%v])}function O(t,i,n,r,s){var a,o,c,u,h,y,v;g?(r=I(t,i,n),a=I(t+1,i,n),o=I(t,i+1,n),c=I(t,i,n+1),u=I(t+1,i+1,n),h=I(t+1,i,n+1),y=I(t,i+1,n+1),v=I(t+1,i+1,n+1)):(a=r+1,u=(o=r+b)+1,h=(c=r+x)+1,v=(y=o+x)+1);var S=0,M=e[r],C=e[a],E=e[o],O=e[u],N=e[c],F=e[h],B=e[y],z=e[v];M=f){L=y,E=!0;break}if(E)break}if(E)break}for(E=!1,_=s;_=f){R=_,E=!0;break}if(E)break}if(E)break}for(E=!1,p=r;p=f){D=p,E=!0;break}if(E)break}if(E)break}for(E=!1,y=u;y>=o;--y){for(_=c;_>=s;--_){for(p=l;p>=r;--p)if(h=t*i*y+t*_+p,e[h]>=f){F=y,E=!0;break}if(E)break}if(E)break}for(E=!1,_=c;_>=s;--_){for(y=F;y>=o;--y){for(p=l;p>=r;--p)if(h=t*i*y+t*_+p,e[h]>=f){N=_,E=!0;break}if(E)break}if(E)break}for(E=!1,p=l;p>=r;--p){for(_=N;_>=s;--_){for(y=F;y>=o;--y)if(h=t*i*y+t*_+p,e[h]>=f){k=p,E=!0;break}if(E)break}if(E)break}m?(r=Math.max(0,D-1),s=Math.max(0,R-1),o=Math.max(0,L-1),l=Math.min(t-1,k+1),c=Math.min(i-1,N+1),u=Math.min(n-1,F+1)):(r=Math.max(1,D-1),s=Math.max(1,R-1),o=Math.max(1,L-1),l=Math.min(t-2,k+1),c=Math.min(i-2,N+1),u=Math.min(n-2,F+1))}var B=15;for(y=o;y0?-1:1,s||(s=new Float32Array(3*v)));var T=3*v;if(a&&a.length===T||(a=new Int32Array(T)),o=0,l=0,void 0!==b){var P=b[0].map(Math.round),E=b[1].map(Math.round);c=t*Math.ceil(Math.abs(P[0])/t),u=i*Math.ceil(Math.abs(P[1])/i),h=n*Math.ceil(Math.abs(P[2])/n),N(P[0],P[1],P[2],E[0],E[1],E[2])}else c=u=h=0,N();return S.length=3*o,m||(M.length=3*o),A.length=l,r&&(C.length=o),{position:new Float32Array(S),normal:m?void 0:new Float32Array(M),index:So(A,S.length/3),atomindex:r?new Int32Array(C):void 0,contour:p}}}Kl.add("arrow",class extends Gd{get primitive(){return vh}}),Kl.add("box",class extends Gd{get primitive(){return ph}}),Kl.add("cone",class extends Gd{get primitive(){return bh}}),Kl.add("cylinder",class extends Gd{get primitive(){return yh}}),Kl.add("ellipsoid",class extends Gd{get primitive(){return xh}}),Kl.add("octahedron",class extends Gd{get primitive(){return gh}}),Kl.add("sphere",class extends Gd{get primitive(){return mh}}),Kl.add("tetrahedron",class extends Gd{get primitive(){return _h}}),Kl.add("torus",class extends Gd{get primitive(){return wh}}),Kl.add("point",class extends Gd{get primitive(){return Mh}}),Kl.add("wideline",class extends Gd{get primitive(){return Ah}}),Object.assign(sf,{__deps:[nf,rf,So]});class af{constructor(e,t){this.cols=e,this.rows=t,this.size=this.cols*this.rows,this.data=new Float32Array(this.size)}copyTo(e){e.data.set(this.data)}}function of(e,t){let i=0,n=0;const r=t.rows,s=t.cols;let a=0,o=0,l=0;const c=t.data,u=e.data;for(;i(t=Math.abs(t))?(t/=e,e*Math.sqrt(1+t*t)):t>0?(e/=t,t*Math.sqrt(1+e*e)):0}const mf=1.192092896e-7,pf=1e-37;function gf(e,t,i,n){let r=0,s=0;const a=e.rows,o=e.cols;let l=a,c=o;l>16?k:-k,e[u*t+d]=L;for(f=0;f<2;f++)for(h=0;h{const t=e.data.sd,i=e.data.p;a(this._makeSurface(t,i.isolevel,i.smooth))}),(o=>{console.warn("Volume.getSurfaceWorker error - trying without worker",o);const l=this.getSurface(e,t,i,n,r,s);a(l)}))}else{const o=this.getSurface(e,t,i,n,r,s);a(o)}}getValueForSigma(e){return this.mean+uo(e,2)*this.rms}getSigmaForValue(e){return(uo(e,0)-this.mean)/this.rms}get position(){if(!this._position){const e=this.nz,t=this.ny,i=this.nx,n=new Float32Array(i*t*e*3);let r=0;for(let s=0;si){const e=t;t=i,i=e}const n=e[t];return void 0===n?(e[t]=[i],!0):!n.includes(i)&&(n.push(i),!0)}const i=this.geometry,n=i.index;if(this.parameters.wireframe)if(n){const r=n.array;let s,a=r.length;if(i.drawRange.count!==1/0&&(a=i.drawRange.count),this.wireframeIndex&&this.wireframeIndex.length>2*a)s=this.wireframeIndex;else{s=So(2*a,i.attributes.position.count)}let o=0;e.length=0;for(let e=0;e2*e?this.wireframeIndex:So(2*e,e);for(let i=0,n=0;ithis.wireframeGeometry.index.array.length)this.wireframeGeometry.setIndex(new $i(this.wireframeIndex,1).setUsage(this.dynamic?Te:Ce));else{const e=this.wireframeGeometry.getIndex();if(!e)return void Fl.error("Index is null");e.set(this.wireframeIndex),e.needsUpdate=this.wireframeIndexCount>0,e.updateRange.count=this.wireframeIndexCount}this.wireframeGeometry.setDrawRange(0,this.wireframeIndexCount)}}getRenderOrder(){let e=0;return this.isText?e=1:this.transparent&&(e=this.isSurface?3:2),e}_getMesh(e){this.material||this.makeMaterial();const t=this.geometry,i=this[e];let n;return n=this.isLine?new ka(t,i):this.isPoint?new Ua(t,i):new yn(t,i),n.frustumCulled=!1,n.renderOrder=this.getRenderOrder(),n}getMesh(){return this._getMesh("material")}getWireframeMesh(){let e;return this.material||this.makeMaterial(),this.wireframeGeometry||this.makeWireframeGeometry(),e=new ka(this.wireframeGeometry,this.wireframeMaterial),e.frustumCulled=!1,e.renderOrder=this.getRenderOrder(),e}getPickingMesh(){return this._getMesh("pickingMaterial")}getShader(e,t){return pc(e,this.getDefines(t))}getVertexShader(e){return this.getShader(this.vertexShader,e)}getFragmentShader(e){return this.getShader(this.fragmentShader,e)}getDefines(e){const t={};return this.parameters.clipNear&&(t.NEAR_CLIP=1),this.parameters.clipRadius&&(t.RADIUS_CLIP=1),"picking"===e?t.PICKING=1:(("background"===e||this.parameters.background)&&(t.NOLIGHT=1),this.parameters.flatShaded&&(t.FLAT_SHADED=1),this.parameters.opaqueBack&&(t.OPAQUE_BACK=1),this.parameters.diffuseInterior&&(t.DIFFUSE_INTERIOR=1),this.parameters.useInteriorColor&&(t.USE_INTERIOR_COLOR=1)),t}getParameters(){return this.parameters}addUniforms(e){this.uniforms=Mn.merge([this.uniforms,e]),this.pickingUniforms=Mn.merge([this.pickingUniforms,e])}addAttributes(e){for(let t in e){let i;const n=e[t],r=this.attributeSize*Lf[n.type];n.value?(r!==n.value.length&&Fl.error("attribute value has wrong length",t),i=n.value):i=wo("float32",r),this.geometry.setAttribute(t,new $i(i,Lf[n.type]).setUsage(this.dynamic?Te:Ce))}}updateRenderOrder(){const e=this.getRenderOrder();function t(t){t.renderOrder=e}this.group.children.forEach(t),this.pickingGroup&&this.pickingGroup.children.forEach(t)}updateShader(){const e=this.material,t=this.wireframeMaterial,i=this.pickingMaterial;e.vertexShader=this.getVertexShader(),e.fragmentShader=this.getFragmentShader(),e.needsUpdate=!0,t.vertexShader=this.getShader("Line.vert"),t.fragmentShader=this.getShader("Line.frag"),t.needsUpdate=!0,i.vertexShader=this.getVertexShader("picking"),i.fragmentShader=this.getFragmentShader("picking"),i.needsUpdate=!0}setParameters(e){const t=e,i=this.parameterTypes,n=this.parameters,r={},s={};let a=!1,o=!1;for(const e in t){const l=t[e];void 0!==l&&(n[e]=l,void 0!==i[e]&&(i[e].property&&(!0!==i[e].property?r[i[e].property]=l:r[e]=l),i[e].uniform&&(!0!==i[e].uniform?s[i[e].uniform]=l:s[e]=l),i[e].updateShader&&(a=!0),i[e].updateVisibility&&(o=!0),this.dynamic&&"wireframe"===e&&!0===l&&this.updateWireframeIndex(),"forceTransparent"===e&&(r.transparent=this.transparent),"matrix"===e&&(this.matrix=l)))}this.setProperties(r),this.setUniforms(s),a&&this.updateShader(),o&&this.setVisibility(this.visible)}setAttributes(e){const t=this.geometry,i=t.attributes;for(const n in e){if("picking"===n)continue;const r=e[n],s=r.length;if("index"===n){const e=t.getIndex();if(!e){Fl.error("Index is null");continue}t.setDrawRange(0,1/0),s>e.array.length?t.setIndex(new $i(r,1).setUsage(this.dynamic?Te:Ce)):(e.set(r),e.needsUpdate=s>0,e.updateRange.count=s,t.setDrawRange(0,s)),this.indexVersion++,this.parameters.wireframe&&this.updateWireframeIndex()}else{const e=i[n];s>e.array.length?t.setAttribute(n,new $i(r,e.itemSize).setUsage(this.dynamic?Te:Ce)):(i[n].set(r),i[n].needsUpdate=s>0,i[n].updateRange.count=s)}}}setUniforms(e){if(!e)return;const t=this.material.uniforms,i=this.wireframeMaterial.uniforms,n=this.pickingMaterial.uniforms;for(let r in e)"opacity"===r&&this.setProperties({transparent:this.transparent}),void 0!==t[r]&&(t[r].value.isVector3?t[r].value.copy(e[r]):t[r].value.set?t[r].value.set(e[r]):t[r].value=e[r]),void 0!==i[r]&&(i[r].value.isVector3?i[r].value.copy(e[r]):i[r].value.set?i[r].value.set(e[r]):i[r].value=e[r]),void 0!==n[r]&&(n[r].value.isVector3?n[r].value.copy(e[r]):n[r].value.set?n[r].value.set(e[r]):n[r].value=e[r])}setProperties(e){if(!e)return;const t=this.material,i=this.wireframeMaterial,n=this.pickingMaterial;for(const r in e){const s=r;let a=e[s];"transparent"===s?this.updateRenderOrder():"side"===s&&(a=Rf(a)),t[s]=a,i[s]=a,n[s]=a}t.needsUpdate=!0,i.needsUpdate=!0,n.needsUpdate=!0}setVisibility(e){this.visible=e,this.parameters.wireframe?(this.group.visible=!1,this.wireframeGroup.visible=e,this.pickable&&(this.pickingGroup.visible=!1)):(this.group.visible=e,this.wireframeGroup.visible=!1,this.pickable&&(this.pickingGroup.visible=e))}dispose(){this.material&&this.material.dispose(),this.wireframeMaterial&&this.wireframeMaterial.dispose(),this.pickingMaterial&&this.pickingMaterial.dispose(),this.geometry.dispose(),this.wireframeGeometry&&this.wireframeGeometry.dispose()}toJSON(){var e={};for(var t in this)"group"!==t&&"wireframeGroup"!==t&&"pickingGroup"!=t&&"picking"!==t&&(e[t]=this[t]);return e}}class Bf extends Ff{constructor(e,t={}){super(e,t),this.vertexShader="Mesh.vert",this.fragmentShader="Mesh.frag",this.addAttributes({normal:{type:"v3",value:e.normal}}),void 0===e.normal&&this.geometry.computeVertexNormals()}}class zf extends Bf{constructor(){super(...arguments),this.isSurface=!0}}function Uf(e){e.visible=!0}function Vf(e){e.visible=!1}class $f{constructor(e){this.group=new ma,this.wireframeGroup=new ma,this.pickingGroup=new ma,this.frontMeshes=[],this.backMeshes=[],this.size=e.size,this.side=e.parameters.side,this.visible=e.visible,this.geometry=e.geometry,this.picking=e.picking,this.group=new ma,this.wireframeGroup=new ma,this.pickingGroup=new ma,this.matrix=e.matrix;const t=e,i=new e.constructor({position:new Float32Array(0)});t.makeMaterial(),i.makeMaterial(),i.picking=e.picking,i.geometry=e.geometry,i.wireframeGeometry=e.wireframeGeometry,i.setParameters(e.getParameters()),i.updateShader(),t.setParameters({side:"front"}),i.setParameters({side:"back",opacity:i.parameters.opacity}),this.buffer=e,this.frontBuffer=t,this.backBuffer=i}set matrix(e){Ff.prototype.setMatrix.call(this,e)}get matrix(){return this.group.matrix.clone()}get pickable(){return!!this.picking&&!this.parameters.disablePicking}get parameters(){return this.buffer.parameters}getParameters(){const e=Object.assign({},this.buffer.parameters);return e.side=this.side,e}getMesh(e){let t,i;return e?(i=this.backBuffer.getPickingMesh(),t=this.frontBuffer.getPickingMesh()):(i=this.backBuffer.getMesh(),t=this.frontBuffer.getMesh()),this.frontMeshes.push(t),this.backMeshes.push(i),this.setParameters({side:this.side}),(new ma).add(i,t)}getWireframeMesh(){return this.buffer.getWireframeMesh()}getPickingMesh(){return this.getMesh(!0)}setAttributes(e){this.buffer.setAttributes(e)}setParameters(e){"front"===(e=Object.assign({},e)).side?(this.frontMeshes.forEach(Uf),this.backMeshes.forEach(Vf)):"back"===e.side?(this.frontMeshes.forEach(Vf),this.backMeshes.forEach(Uf)):"double"===e.side&&(this.frontMeshes.forEach(Uf),this.backMeshes.forEach(Uf)),void 0!==e.side&&(this.side=e.side),delete e.side,void 0!==e.matrix&&(this.matrix=e.matrix),delete e.matrix,this.frontBuffer.setParameters(e),void 0!==e.wireframe&&(this.wireframe=e.wireframe,this.setVisibility(this.visible)),delete e.wireframe,this.backBuffer.setParameters(e)}setVisibility(e){this.visible=e,this.parameters.wireframe?(this.group.visible=!1,this.wireframeGroup.visible=e,this.pickable&&(this.pickingGroup.visible=!1)):(this.group.visible=e,this.wireframeGroup.visible=!1,this.pickable&&(this.pickingGroup.visible=e))}dispose(){this.frontBuffer.dispose(),this.backBuffer.dispose()}toJSON(){var e={};for(var t in this)["side","size","visible","matrix","parameters"].includes(t)&&(e[t]=this[t]);return e}}Wl.add("shader/Line.vert","uniform float clipNear;\nuniform vec3 clipCenter;\nvarying vec3 vViewPosition;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#include color_pars_vertex\nvoid main(){\n#include color_vertex\n#include begin_vertex\n#include project_vertex\nvViewPosition = -mvPosition.xyz;\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}"),Wl.add("shader/Line.frag","uniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\nvarying vec3 vViewPosition;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\ngl_FragColor = vec4( vColor, opacity );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n}");class Gf extends Ff{constructor(){super(...arguments),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag"}}class Hf extends Nu{constructor(e,t,i){super(e,t,i),this.type="surface",this.parameters=Object.assign({isolevelType:{type:"select",options:{value:"value",sigma:"sigma"}},isolevel:{type:"number",precision:2,max:1e3,min:-1e3},negateIsolevel:{type:"boolean"},isolevelScroll:{type:"boolean"},smooth:{type:"integer",precision:1,max:10,min:0},background:{type:"boolean",rebuild:!0},opaqueBack:{type:"boolean",buffer:!0},boxSize:{type:"integer",precision:1,max:100,min:0},colorVolume:{type:"hidden"},contour:{type:"boolean",rebuild:!0},useWorker:{type:"boolean",rebuild:!0},wrap:{type:"boolean",rebuild:!0}},this.parameters),e instanceof Df?(this.surface=void 0,this.volume=e):(this.surface=e,this.volume=void 0),this.boxCenter=new _t,this.__boxCenter=new _t,this.box=new bt,this.__box=new bt,this._position=new _t,this.inverseMatrix=new qt,this.setBox=function(){this._position.copy(t.translationGroup.position).negate(),this._position.applyMatrix4(this.inverseMatrix),this._position.equals(this.boxCenter)||this.setParameters({boxCenter:this._position})},this.toBePrepared=!0,this.viewer.signals.ticked.add(this.setBox,this),this.init(i)}init(e){const t=e||{};t.colorScheme=uo(t.colorScheme,"uniform"),t.colorValue=uo(t.colorValue,14540253),this.isolevelType=uo(t.isolevelType,"sigma"),this.isolevel=uo(t.isolevel,2),this.negateIsolevel=uo(t.negateIsolevel,!1),this.isolevelScroll=uo(t.isolevelScroll,!1),this.smooth=uo(t.smooth,0),this.background=uo(t.background,!1),this.opaqueBack=uo(t.opaqueBack,!0),this.boxSize=uo(t.boxSize,0),this.colorVolume=uo(t.colorVolume,void 0),this.contour=uo(t.contour,!1),this.useWorker=uo(t.useWorker,!0),this.wrap=uo(t.wrap,!1),super.init(t),this.inverseMatrix.copy(this.matrix).invert(),this.build()}attach(e){this.bufferList.forEach((e=>{this.viewer.add(e)})),this.setVisibility(this.visible),e()}prepare(e){if(this.volume){let t;if(t="sigma"===this.isolevelType?this.volume.getValueForSigma(this.isolevel):this.isolevel,this.negateIsolevel&&(t*=-1),!this.surface||this.__isolevel!==t||this.__smooth!==this.smooth||this.__contour!==this.contour||this.__wrap!==this.wrap||this.__boxSize!==this.boxSize||this.boxSize>0&&!this.__boxCenter.equals(this.boxCenter)){this.__isolevel=t,this.__smooth=this.smooth,this.__contour=this.contour,this.__wrap=this.wrap,this.__boxSize=this.boxSize,this.__boxCenter.copy(this.boxCenter),this.__box.copy(this.box);const i=t=>{this.surface=t,e()};this.useWorker?this.volume.getSurfaceWorker(t,this.smooth,this.boxCenter,this.boxSize,this.contour,this.wrap,i):i(this.volume.getSurface(t,this.smooth,this.boxCenter,this.boxSize,this.contour,this.wrap))}else e()}else e()}create(){const e={position:this.surface.getPosition(),color:this.surface.getColor(this.getColorParams()),index:this.surface.getIndex()};let t;if(this.contour)t=new Gf(e,this.getBufferParams({wireframe:!1}));else{Object.assign(e,{normal:this.surface.getNormal(),picking:this.surface.getPicking()});const i=new zf(e,this.getBufferParams({background:this.background,opaqueBack:this.opaqueBack,dullInterior:!1}));t=new $f(i)}this.bufferList.push(t)}update(e){if(0===this.bufferList.length)return;const t={};(e=e||{}).position&&(t.position=this.surface.getPosition()),e.color&&(t.color=this.surface.getColor(this.getColorParams())),e.index&&(t.index=this.surface.getIndex()),e.normal&&(t.normal=this.surface.getNormal()),this.bufferList.forEach((function(e){e.setAttributes(t)}))}setParameters(e,t,i){return e&&void 0!==e.isolevelType&&this.volume&&("value"===this.isolevelType&&"sigma"===e.isolevelType?this.isolevel=this.volume.getSigmaForValue(this.isolevel):"sigma"===this.isolevelType&&"value"===e.isolevelType&&(this.isolevel=this.volume.getValueForSigma(this.isolevel)),this.isolevelType=e.isolevelType),e&&e.boxCenter&&(this.boxCenter.copy(e.boxCenter),delete e.boxCenter),e&&e.wireframe&&(e.contour||void 0===e.contour&&this.contour)&&(e.wireframe=!1),super.setParameters(e,t,i),e.matrix&&this.inverseMatrix.copy(e.matrix).invert(),this.volume&&this.volume.getBox(this.boxCenter,this.boxSize,this.box),e&&void 0!==e.colorVolume&&t&&(t.color=!0),this.surface&&(void 0!==e.isolevel||void 0!==e.negateIsolevel||void 0!==e.smooth||void 0!==e.wrap||void 0!==e.boxSize||this.boxSize>0&&!this.__box.equals(this.box))&&this.build({position:!0,color:!0,index:!0,normal:!this.contour}),this}getColorParams(){const e=super.getColorParams();return e.volume=this.colorVolume,e}dispose(){this.viewer.signals.ticked.remove(this.setBox,this),super.dispose()}}class jf{static zoomScroll(e,t){e.trackballControls.zoom(t)}static clipNearScroll(e,t){const i=e.getParameters();e.setParameters({clipNear:i.clipNear+t/10})}static focusScroll(e,t){const i=e.getFocus(),n=Math.sign(t)*function(e,t,i){if(e>t)return e;const n=e/t;return((2*i-t)*n+(2*t-3*i))*n*n+i}((100-i)/10,5,.2);e.setFocus(i+n)}static zoomFocusScroll(e,t){e.trackballControls.zoom(t);const i=e.viewer.camera.position.z;e.setFocus(100-Math.abs(i/8))}static isolevelScroll(e,t){const i=Math.sign(t)/10;e.eachRepresentation(((e,t)=>{if(e.repr instanceof Hf){const t=e.getParameters();t.isolevelScroll&&e.setParameters({isolevel:t.isolevel+i})}}))}static panDrag(e,t,i){e.trackballControls.pan(t,i)}static rotateDrag(e,t,i){e.trackballControls.rotate(t,i)}static zRotateDrag(e,t,i){e.trackballControls.zRotate(t,i)}static zoomDrag(e,t,i){e.trackballControls.zoom((t+i)/-2)}static zoomFocusDrag(e,t,i){e.trackballControls.zoom((t+i)/-2);const n=e.viewer.camera.position.z;e.setFocus(100-Math.abs(n/8))}static panComponentDrag(e,t,i){e.trackballControls.panComponent(t,i)}static panAtomDrag(e,t,i){e.trackballControls.panAtom(t,i)}static rotateComponentDrag(e,t,i){e.trackballControls.rotateComponent(t,i)}static movePick(e,t){t&&e.animationControls.move(t.position.clone())}static tooltipPick(e,t){const i=e.tooltip;if(e.getParameters().tooltip&&t){const e=t.mouse.position;i.innerText=t.getLabel(),i.style.bottom=window.innerHeight-e.y+3+"px",i.style.left=e.x+3+"px",i.style.display="block"}else i.style.display="none"}static measurePick(e,t){if(t&&(t.atom||t.bond)){const e=t.atom||t.closestBondAtom;t.component.measurePick(e)}else e.measureClear()}}const Wf={default:[["scroll",jf.zoomScroll],["scroll-shift",jf.focusScroll],["scroll-ctrl",jf.isolevelScroll],["scroll-shift-ctrl",jf.zoomFocusScroll],["drag-left",jf.rotateDrag],["drag-right",jf.panDrag],["drag-ctrl-left",jf.panDrag],["drag-ctrl-right",jf.zRotateDrag],["drag-shift-left",jf.zoomDrag],["drag-middle",jf.zoomFocusDrag],["drag-ctrl-shift-right",jf.panComponentDrag],["drag-ctrl-shift-left",jf.rotateComponentDrag],["clickPick-right",jf.measurePick],["clickPick-ctrl-left",jf.measurePick],["clickPick-middle",jf.movePick],["clickPick-left",jf.movePick],["hoverPick",jf.tooltipPick]],pymol:[["drag-left",jf.rotateDrag],["drag-middle",jf.panDrag],["drag-right",jf.zoomDrag],["scroll",jf.focusScroll],["drag-shift-right",jf.focusScroll],["clickPick-ctrl+shift-middle",jf.movePick],["hoverPick",jf.tooltipPick]],coot:[["scroll",jf.isolevelScroll],["drag-left",jf.rotateDrag],["drag-middle",jf.panDrag],["drag-ctrl-left",jf.panDrag],["drag-right",jf.zoomFocusDrag],["drag-ctrl-right",jf.focusScroll],["clickPick-middle",jf.movePick],["hoverPick",jf.tooltipPick]],astexviewer:[["drag-left",jf.rotateDrag],["drag-ctrl-left",jf.panDrag],["drag-shift-left",jf.zoomDrag],["scroll",jf.focusScroll],["clickPick-middle",jf.movePick],["hoverPick",jf.tooltipPick]]};function qf(e){const t=e.split(/[-+]/);let i="";t.includes("scroll")&&(i="scroll"),t.includes("drag")&&(i="drag"),t.includes("click")&&(i="click"),t.includes("doubleClick")&&(i="doubleClick"),t.includes("hover")&&(i="hover"),t.includes("clickPick")&&(i="clickPick"),t.includes("hoverPick")&&(i="hoverPick");let n=0;t.includes("alt")&&(n+=1),t.includes("ctrl")&&(n+=2),t.includes("meta")&&(n+=4),t.includes("shift")&&(n+=8);let r=0;return t.includes("left")&&(r+=1),t.includes("right")&&(r+=2),t.includes("middle")&&(r+=4),[i,n,r]}class Xf{constructor(e,t={}){this.stage=e,this.actionList=[],this.mouse=e.mouseObserver,this.disabled=t.disabled||!1,this.preset(t.preset||"default")}run(e,...t){if(this.disabled)return;const i=this.mouse.key||0,n=this.mouse.buttons||0;this.actionList.forEach((r=>{r.type===e&&r.key===i&&r.button===n&&r.callback(this.stage,...t)}))}add(e,t){const[i,n,r]=qf(e);this.actionList.push({type:i,key:n,button:r,callback:t})}remove(e,t){const i=e.includes("*"),[n,r,s]=qf(e),a=this.actionList.filter((function(e){return!((e.type===n||i&&""===n)&&(e.key===r||i&&0===r)&&(e.button===s||i&&0===s)&&(e.callback===t||void 0===t))}));this.actionList=a}preset(e){this.clear();(Wf[e]||[]).forEach((e=>this.add(e[0],e[1])))}clear(){this.actionList.length=0}}class Yf{static autoView(e){e.autoView(1e3)}static toggleAnimations(e){e.animationControls.toggle()}static toggleRock(e){e.toggleRock()}static toggleSpin(e){e.toggleSpin()}static toggleAntialiasing(e){const t=e.getParameters();e.setParameters({sampleLevel:-1===t.sampleLevel?0:-1})}}const Kf={default:[["i",Yf.toggleSpin],["k",Yf.toggleRock],["p",Yf.toggleAnimations],["a",Yf.toggleAntialiasing],["r",Yf.autoView]]};class Zf{constructor(e,t={}){this.stage=e,this.actionList=[],this.disabled=t.disabled||!1,this.preset(t.preset||"default")}run(e){this.disabled||this.actionList.forEach((t=>{t.key===e&&t.callback(this.stage)}))}add(e,t){this.actionList.push({key:e,callback:t})}remove(e,t){const i=this.actionList.filter((function(i){return!(i.key===e&&(i.callback===t||void 0===t))}));this.actionList=i}preset(e){this.clear();(Kf[e]||[]).forEach((e=>this.add(e[0],e[1])))}clear(){this.actionList.length=0}}class Qf{constructor(e){this.stage=e,this.stage=e,this.mouse=e.mouseObserver,this.controls=e.mouseControls,this.mouse.signals.clicked.add(this._onClick,this),this.mouse.signals.hovered.add(this._onHover,this)}_onClick(e,t){const i=this.stage.pickingControls.pick(e,t);this.stage.signals.clicked.dispatch(i),this.controls.run("clickPick",i)}_onHover(e,t){const i=this.stage.pickingControls.pick(e,t);i&&this.mouse.down.equals(this.mouse.position)&&(this.stage.transformComponent=i.component,this.stage.transformAtom=i.atom),this.stage.signals.hovered.dispatch(i),this.controls.run("hoverPick",i)}dispose(){this.mouse.signals.clicked.remove(this._onClick,this),this.mouse.signals.hovered.remove(this._onHover,this)}}class Jf{constructor(e){this.stage=e,this.stage=e,this.mouse=e.mouseObserver,this.controls=e.mouseControls,this.mouse.signals.moved.add(this._onMove,this),this.mouse.signals.scrolled.add(this._onScroll,this),this.mouse.signals.dragged.add(this._onDrag,this),this.mouse.signals.clicked.add(this._onClick,this),this.mouse.signals.hovered.add(this._onHover,this),this.mouse.signals.doubleClicked.add(this._onDblclick,this)}_onMove(){this.stage.tooltip.style.display="none"}_onScroll(e){this.controls.run("scroll",e)}_onDrag(e,t){this.controls.run("drag",e,t)}_onClick(e,t){this.controls.run("click",e,t)}_onDblclick(e,t){this.controls.run("doubleClick",e,t)}_onHover(e,t){this.controls.run("hover",e,t)}dispose(){this.mouse.signals.moved.remove(this._onMove,this),this.mouse.signals.scrolled.remove(this._onScroll,this),this.mouse.signals.dragged.remove(this._onDrag,this),this.mouse.signals.clicked.remove(this._onClick,this),this.mouse.signals.hovered.remove(this._onHover,this)}}class em{constructor(e){this.stage=e,this.viewer=e.viewer,this.animationControls=e.animationControls,this.viewer.signals.ticked.add(this._onTick,this)}_onTick(e){this.animationControls.run(e)}dispose(){this.viewer.signals.ticked.remove(this._onTick,this)}}const tm=!!Dl&&{passive:!0};class im{constructor(e){this.stage=e,this.stage=e,this.controls=e.keyControls,this.domElement=e.viewer.renderer.domElement,this.domElement.setAttribute("tabIndex","-1"),this.domElement.style.outline="none",this._focusDomElement=this._focusDomElement.bind(this),this._onKeydown=this._onKeydown.bind(this),this._onKeyup=this._onKeyup.bind(this),this._onKeypress=this._onKeypress.bind(this),this.domElement.addEventListener("mousedown",this._focusDomElement),this.domElement.addEventListener("touchstart",this._focusDomElement,tm),this.domElement.addEventListener("keydown",this._onKeydown),this.domElement.addEventListener("keyup",this._onKeyup),this.domElement.addEventListener("keypress",this._onKeypress)}_onKeydown(){}_onKeyup(){}_onKeypress(e){let t;t="key"in KeyboardEvent.prototype?e.key:String.fromCharCode(e.which||e.keyCode),this.controls.run(t)}_focusDomElement(){this.domElement.focus()}dispose(){this.domElement.removeEventListener("mousedown",this._focusDomElement),this.domElement.removeEventListener("touchstart",this._focusDomElement,tm),this.domElement.removeEventListener("keydown",this._onKeypress),this.domElement.removeEventListener("keyup",this._onKeypress),this.domElement.removeEventListener("keypress",this._onKeypress)}}class nm{constructor(e,t,i,n={}){this.component=e,this.position=t,this.offsetX=uo(n.offsetX,0),this.offsetY=uo(n.offsetY,0),this.visible=uo(n.visible,!0),this.stage=e.stage,this.viewer=e.stage.viewer,this._viewerPosition=new _t,this._updateViewerPosition(),this._canvasPosition=new Ge,this._cameraPosition=new _t,this.element=document.createElement("div"),Object.assign(this.element.style,{display:"block",position:"absolute",pointerEvents:"none",whiteSpace:"nowrap",left:"-10000px"}),this.viewer.wrapper.appendChild(this.element),this.setContent(i),this.updateVisibility(),this.viewer.signals.rendered.add(this._update,this),this.component.signals.matrixChanged.add(this._updateViewerPosition,this)}setContent(e){const t=this.element.style.display;if("none"===t&&(this.element.style.left="-10000px",this.element.style.display="block"),e instanceof HTMLElement)this.element.appendChild(e);else{const t=document.createElement("div");t.innerText=e,Object.assign(t.style,{backgroundColor:"rgba( 0, 0, 0, 0.6 )",color:"lightgrey",padding:"8px",fontFamily:"sans-serif"}),this.element.appendChild(t)}this._clientRect=this.element.getBoundingClientRect(),"none"===t&&(this.element.style.display=t)}setVisibility(e){this.visible=e,this.updateVisibility()}getVisibility(){return this.visible&&this.component.parameters.visible}updateVisibility(){this.element.style.display=this.getVisibility()?"block":"none"}_updateViewerPosition(){this._viewerPosition.copy(this.position).applyMatrix4(this.component.matrix)}_update(){if(!this.getVisibility())return;const e=this.element.style,t=this._canvasPosition,i=this._viewerPosition,n=this._clientRect;if(this._cameraPosition.copy(i).add(this.viewer.translationGroup.position).applyMatrix4(this.viewer.rotationGroup.matrix).sub(this.viewer.camera.position),this._cameraPosition.z<0)return void(e.display="none");e.display="block";const r=this._cameraPosition.length(),s=this.viewer.scene.fog;e.opacity=(1-zo(s.near,s.far,r)).toString(),e.zIndex=Math.round(100*(s.far-r)).toString(),this.stage.viewerControls.getPositionOnCanvas(i,t),e.bottom=this.offsetX+t.y+n.height/2+"px",e.left=this.offsetY+t.x-n.width/2+"px"}dispose(){this.viewer.wrapper.removeChild(this.element),this.viewer.signals.ticked.remove(this._update,this),this.component.signals.matrixChanged.remove(this._updateViewerPosition,this)}}const rm=new qt,sm=new _t,am=new gt;class om{constructor(e){this.component=e,this.signals={changed:new Yo.Signal},this.stage=e.stage,this.viewer=e.stage.viewer}get position(){return this.component.position}get rotation(){return this.component.quaternion}changed(){this.component.updateMatrix(),this.viewer.requestRender(),this.signals.changed.dispatch()}spin(e,t){rm.copy(this.viewer.rotationGroup.matrix).invert(),sm.copy(Co(e)).applyMatrix4(rm),rm.extractRotation(this.component.transform),rm.premultiply(this.viewer.rotationGroup.matrix),rm.invert(),sm.copy(Co(e)),sm.applyMatrix4(rm),rm.makeRotationAxis(sm,t),am.setFromRotationMatrix(rm),this.component.quaternion.premultiply(am),this.changed()}}const lm={"":"",vdw:"by vdW radius",covalent:"by covalent radius",sstruc:"by secondary structure",bfactor:"by bfactor",size:"size",data:"data",explicit:"explicit"};class cm{constructor(e={}){this.max=10,this.type=uo(e.type,"size"),this.scale=uo(e.scale,1),this.size=uo(e.size,1),this.data=uo(e.data,{})}atomRadius(e){let t;switch(this.type){case"vdw":t=e.vdw;break;case"covalent":t=e.covalent;break;case"bfactor":t=e.bfactor||1;break;case"sstruc":const i=e.sstruc;t="h"===i||"g"===i||"i"===i||"e"===i||"b"===i?.25:od.includes(e.atomname)?.4:.1;break;case"data":t=uo(this.data[e.index],1);break;case"explicit":t=e.radius,null===t&&(t=this.size);break;default:t=this.size}return Math.min(t*this.scale,this.max)}}cm.types=lm;const um=new _t(-1,-1,-1),hm=new qt;class dm{constructor(e){const t=e.rows,i=t/3,n=new af(t,3),r=new af(3,3),s=new af(1,3),a=new af(3,3),o=new af(3,3),l=uf(e);hf(e,l),of(n,e),lf(r,n,n),gf(r,s,a,o);const c=new _t(l[0],l[1],l[2]),u=new _t(a.data[0],a.data[3],a.data[6]),h=new _t(a.data[1],a.data[4],a.data[7]),d=new _t(a.data[2],a.data[5],a.data[8]),f=u.clone().multiplyScalar(Math.sqrt(s.data[0]/i)),m=h.clone().multiplyScalar(Math.sqrt(s.data[1]/i)),p=d.clone().multiplyScalar(Math.sqrt(s.data[2]/i));this.begA=c.clone().sub(f),this.endA=c.clone().add(f),this.begB=c.clone().sub(m),this.endB=c.clone().add(m),this.begC=c.clone().sub(p),this.endC=c.clone().add(p),this.center=c,this.vecA=f,this.vecB=m,this.vecC=p,this.normVecA=u,this.normVecB=h,this.normVecC=d}getBasisMatrix(e=new qt){const t=e;return t.makeBasis(this.normVecB,this.normVecA,this.normVecC),t.determinant()<0&&t.scale(um),t}getRotationQuaternion(e=new gt){const t=e;return t.setFromRotationMatrix(this.getBasisMatrix(hm)),t.invert()}getProjectedScaleForAtoms(e){let t=-1/0,i=-1/0,n=-1/0,r=-1/0,s=-1/0,a=-1/0;const o=new _t,l=new _t,c=this.center,u=this.normVecA,h=this.normVecB,d=this.normVecC;return e.eachAtom((function(e){Uu(o.copy(e),u,c);const f=l.subVectors(o,c).normalize().dot(u),m=o.distanceTo(c);f>0?m>t&&(t=m):m>i&&(i=m),Uu(o.copy(e),h,c);const p=l.subVectors(o,c).normalize().dot(h),g=o.distanceTo(c);p>0?g>n&&(n=g):g>r&&(r=g),Uu(o.copy(e),d,c);const _=l.subVectors(o,c).normalize().dot(d),y=o.distanceTo(c);_>0?y>s&&(s=y):y>a&&(a=y)})),{d1a:t,d2a:n,d3a:s,d1b:-i,d2b:-r,d3b:-a}}}class fm{constructor(e,t,i,n){this.volume=e,this.setFilter(t,i,n)}get header(){return this.volume.header}get matrix(){return this.volume.matrix}get normalMatrix(){return this.volume.normalMatrix}get inverseMatrix(){return this.volume.inverseMatrix}get center(){return this.volume.center}get boundingBox(){return this.volume.boundingBox}get min(){return this.volume.min}get max(){return this.volume.max}get mean(){return this.volume.mean}get rms(){return this.volume.rms}_getFilterHash(e,t,i){return JSON.stringify([e,t,i])}setFilter(e,t,i){isNaN(e)&&this.header&&(e=this.header.DMEAN+2*this.header.ARMS),e=void 0===e||isNaN(e)?-1/0:e,t=uo(t,1/0),i=uo(i,!1);const n=this.volume.data,r=this.volume.position,s=this.volume.atomindex,a=this._getFilterHash(e,t,i);if(a!==this._filterHash){if(e===-1/0&&t===1/0)this.data=n,this.position=r,this.atomindex=s;else{const a=n.length;this._dataBuffer||(this._dataBuffer=new ArrayBuffer(4*a),this._positionBuffer=new ArrayBuffer(3*a*4),s&&(this._atomindexBuffer=new ArrayBuffer(4*a)));const o=new Float32Array(this._dataBuffer),l=new Float32Array(this._positionBuffer);let c;s&&(c=new Uint32Array(this._atomindexBuffer));let u=0;for(let h=0;h=e&&d<=t||i&&(dt)){const e=3*u;o[u]=d,l[e+0]=r[a+0],l[e+1]=r[a+1],l[e+2]=r[a+2],s&&c&&(c[u]=s[h]),u+=1}}this.data=new Float32Array(this._dataBuffer,0,u),this.position=new Float32Array(this._positionBuffer,0,3*u),s&&(this.atomindex=new Int32Array(this._atomindexBuffer,0,u))}this._filterHash=a}}}fm.prototype.getValueForSigma=Df.prototype.getValueForSigma,fm.prototype.getSigmaForValue=Df.prototype.getSigmaForValue,fm.prototype.getDataAtomindex=Df.prototype.getDataAtomindex,fm.prototype.getDataPosition=Df.prototype.getDataPosition,fm.prototype.getDataColor=Df.prototype.getDataColor,fm.prototype.getDataPicking=Df.prototype.getDataPicking,fm.prototype.getDataSize=Df.prototype.getDataSize;class mm{constructor(e,t){const i=Dh({nodeArray1:e.atomIndex1,nodeArray2:e.atomIndex2,edgeCount:e.count,nodeCount:t});this.countArray=i.countArray,this.offsetArray=i.offsetArray,this.indexArray=i.indexArray}}class pm extends Th{get _defaultFields(){return[["atomIndex1",1,"int32"],["atomIndex2",1,"int32"],["bondOrder",1,"int8"]]}addBond(e,t,i){this.growIfFull();const n=this.count,r=e.index,s=t.index;r0&&(a[t]=v.angleTo(b));const n=Math.cos(m.angleTo(p));c[t]=180/Math.PI*Math.acos(n);const y=m.length(),P=p.length();o[t]=Math.sqrt(P*y)/Math.max(2,2*(1-n)),l[t]=Math.abs(d.dot(v)),g.copy(m).multiplyScalar(o[t]/y),_.copy(p).multiplyScalar(o[t]/P),g.subVectors(A,g),_.subVectors(C,_),g.toArray(r,i+3),_.toArray(r,i+6),x.subVectors(M,w),x.toArray(u,i),b.copy(v),w.copy(g)}g.fromArray(r,3),_.fromArray(r,6),v.subVectors(g,_).normalize(),M.index=e.getAtomIndexByType(0,S),w.copy(M),y.copy(M),Uu(y,v,g),y.toArray(r,0),x.subVectors(w,g),x.toArray(u,0),g.fromArray(r,3*i-6),_.fromArray(r,3*i-9),v.subVectors(g,_).normalize(),M.index=e.getAtomIndexByType(i-1,S),w.copy(M),y.copy(M),Uu(y,v,g),y.toArray(r,3*i-3);for(let t=i-3;tt||c.bending[n]>e)&&(O=!0)),O){if(n-f<4){f=n,O=!1;continue}R.index=I.traceAtomIndex,C=c.axis.subarray(3*f+3,3*n),T=c.center.subarray(3*f,3*n+3),M=zu(C).normalize(),A=zu(T),P.fromArray(T),Uu(P,M,A),E.fromArray(T,T.length-3),Uu(E,M,A),M.subVectors(E,P),M.toArray(p,m),A.toArray(g,m),P.toArray(_,m),E.toArray(y,m),h.atomColorToArray(R,v,m),b.push(R.index),x.push(d.atomRadius(R)),w.push(l+f),S.push(l+n+1-f),m+=3,f=n,O=!1}const N=new Float32Array(b);return{axis:new Float32Array(p),center:new Float32Array(g),begin:new Float32Array(_),end:new Float32Array(y),color:new Float32Array(v),picking:new Hd(N,a),size:new Float32Array(x),residueOffset:w,residueCount:S}}}class wm{constructor(e){this.scoreFunction=e,this.content=[],this.scoreFunction=e}push(e){this.content.push(e),this.bubbleUp(this.content.length-1)}pop(){const e=this.content[0],t=this.content.pop();return t&&this.content.length>0&&(this.content[0]=t,this.sinkDown(0)),e}peek(){return this.content[0]}remove(e){const t=this.content.length;for(let i=0;i0;){const i=Math.floor((e+1)/2)-1,n=this.content[i];if(!(this.scoreFunction(t), 2016 + * @author Roman Bolzern , 2013 + * @author I4DS http://www.fhnw.ch/i4ds, 2013 + * @license MIT License + * @description + * k-d Tree for typed arrays of 3d points (e.g. for Float32Array), in-place + * provides fast nearest neighbour search + * + * Based on https://github.com/ubilabs/kd-tree-javascript by Ubilabs + * + * Further information (including mathematical properties) + * http://en.wikipedia.org/wiki/Binary_tree + * http://en.wikipedia.org/wiki/K-d_tree + * + * @example + * points: [x, y, z, x, y, z, x, y, z, ...] + * metric: function(a, b){ + * return Math.pow(a[0]-b[0], 2) + Math.pow(a[1]-b[1], 2) + Math.pow(a[2]-b[2], 2); + * } + * + * @param {Float32Array} points - points + * @param {Function} metric - metric + */class Sm{constructor(e,t){this.points=e,this.metric=t,this.maxDepth=0,this.currentNode=0;const i=e.length/3,n=new Uint32Array(i);for(let e=0;ethis.maxDepth&&(this.maxDepth=e);const r=n-i;if(0===r)return-1;const s=4*this.currentNode,a=this.nodes;if(this.currentNode+=1,1===r)return a[s]=i,a[s+1]=-1,a[s+2]=-1,a[s+3]=t,s;const o=this.indices,l=this.points,c=i+Math.floor(r/2),u=e%3;let h,d,f,m,p,g=i,_=n-1;for(;_>g;){for(f=g+_>>1,m=l[3*o[f]+u],d=o[f],o[f]=o[_],o[_]=d,p=g,h=g;h<_;++h)l[3*o[h]+u]-e[1])),r=this.nodes,s=this.points,a=this.indices,o=l=>{let c,u;const h=this.getNodeDepth(l)%3,d=3*a[r[l]],f=[s[d+0],s[d+1],s[d+2]],m=this.metric(e,f);function p(e,i){n.push([e,i]),n.size()>t&&n.pop()}const g=r[l+1],_=r[l+2];if(-1===_&&-1===g)return void((n.size()s[3*a[r[e]]+n])throw new Error("left child is > parent!");i+=this.verify(o,t+1)}if(-1!==l){if(s[3*a[r[l]]+n]0}isBackbone(){const e=this.residueType.backboneIndexList;return e.length>0&&e.includes(this.index-this.residueAtomOffset)}isPolymer(){if(this.structure.entityList.length>0)return this.entity.isPolymer();{const e=this.residueType.moleculeType;return 3===e||4===e||5===e}}isSidechain(){return this.isPolymer()&&!this.isBackbone()}isCg(){const e=this.residueType.backboneType;return 4===e||5===e||6===e}isTrace(){return this.index===this.residueType.traceAtomIndex+this.residueAtomOffset}isHetero(){return 1===this.residueType.hetero}isProtein(){return 3===this.residueType.moleculeType}isNucleic(){const e=this.residueType.moleculeType;return 4===e||5===e}isRna(){return 4===this.residueType.moleculeType}isDna(){return 5===this.residueType.moleculeType}isWater(){return 1===this.residueType.moleculeType}isIon(){return 2===this.residueType.moleculeType}isSaccharide(){return 6===this.residueType.moleculeType}isHelix(){return Vh.includes(this.sstruc)}isSheet(){return $h.includes(this.sstruc)}isTurn(){return Gh.includes(this.sstruc)&&this.isProtein()}isBonded(){return 0!==this.bondHash.countArray[this.index]}isRing(){return void 0!==this.residueType.getRings().atomRings[this.index-this.residueAtomOffset]}isAromatic(){return 1===this.aromatic}isPolarHydrogen(){let e=!1;return 1!==this.number||(e=!this.hasBondToElement(6)),e}isMetal(){return this.atomType.isMetal()}isNonmetal(){return this.atomType.isNonmetal()}isMetalloid(){return this.atomType.isMetalloid()}isHalogen(){return this.atomType.isHalogen()}isDiatomicNonmetal(){return this.atomType.isDiatomicNonmetal()}isPolyatomicNonmetal(){return this.atomType.isPolyatomicNonmetal()}isAlkaliMetal(){return this.atomType.isAlkaliMetal()}isAlkalineEarthMetal(){return this.atomType.isAlkalineEarthMetal()}isNobleGas(){return this.atomType.isNobleGas()}isTransitionMetal(){return this.atomType.isTransitionMetal()}isPostTransitionMetal(){return this.atomType.isPostTransitionMetal()}isLanthanide(){return this.atomType.isLanthanide()}isActinide(){return this.atomType.isActinide()}getDefaultValence(){return this.atomType.getDefaultValence()}getValenceList(){return this.atomType.getValenceList()}getOuterShellElectronCount(){return this.atomType.getOuterShellElectronCount()}distanceTo(e){const t=this.atomStore,i=e.atomStore,n=this.index,r=e.index,s=t.x[n]-i.x[r],a=t.y[n]-i.y[r],o=t.z[n]-i.z[r],l=s*s+a*a+o*o;return Math.sqrt(l)}connectedTo(e){const t=this.atomStore,i=e.atomStore,n=this.index,r=e.index;if(t.altloc&&i.altloc){const e=t.altloc[n],s=i.altloc[r];if(0!==e&&0!==s&&32!==e&&32!==s&&e!==s)return!1}const s=t.x[n]-i.x[r],a=t.y[n]-i.y[r],o=t.z[n]-i.z[r],l=s*s+a*a+o*o;if(l<48&&this.isCg())return!0;if(isNaN(l))return!1;const c=this.covalent+e.covalent,u=c+.3,h=c-.5;return lh*h}positionFromArray(e,t=0){return this.x=e[t+0],this.y=e[t+1],this.z=e[t+2],this}positionToArray(e=[],t=0){const i=this.index,n=this.atomStore;return e[t+0]=n.x[i],e[t+1]=n.y[i],e[t+2]=n.z[i],e}positionToVector3(e){return void 0===e&&(e=new _t),e.x=this.x,e.y=this.y,e.z=this.z,e}positionFromVector3(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}positionAdd(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}positionSub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}getResidueBonds(e=!1){const t=this.residueAtomOffset,i=this.index-this.residueAtomOffset,n=this.residueType.getBonds(),r=n.atomIndices1,s=n.atomIndices2;let a,o,l,c;for(e||(c=[]),a=r.indexOf(i);-1!==a;){if(l=s[a]+t,!c)return l;c.push(l),a=r.indexOf(i,a+1)}for(o=s.indexOf(i);-1!==o;){if(l=r[o]+t,!c)return l;c.push(l),o=s.indexOf(i,o+1)}return c}qualifiedName(e=!1){var t="";return this.resname&&!e&&(t+="["+this.resname+"]"),void 0!==this.resno&&(t+=this.resno),this.inscode&&(t+="^"+this.inscode),this.chainname&&(t+=":"+this.chainname),this.atomname&&(t+="."+this.atomname),this.altloc&&(t+="%"+this.altloc),this.structure.modelStore.count>1&&(t+="/"+this.modelIndex),t}clone(){return new Mm(this.structure,this.index)}toObject(){return{index:this.index,residueIndex:this.residueIndex,resname:this.resname,x:this.x,y:this.y,z:this.z,element:this.element,chainname:this.chainname,resno:this.resno,serial:this.serial,vdw:this.vdw,covalent:this.covalent,hetero:this.hetero,bfactor:this.bfactor,altloc:this.altloc,atomname:this.atomname,modelIndex:this.modelIndex}}}function Am(e,t){const i=e[0]-t[0],n=e[1]-t[1],r=e[2]-t[2];return i*i+n*n+r*r}function Cm(e,t){return Math.sqrt(Am(e,t))}const Tm=new Float32Array(3);class Pm{constructor(t,i=!1){e.Debug&&Fl.time("Kdtree build");const n=i?Am:Cm,r=new Float32Array(3*t.atomCount),s=new Uint32Array(t.atomCount);let a=0;t.eachAtom((function(e){r[a+0]=e.x,r[a+1]=e.y,r[a+2]=e.z,s[a/3]=e.index,a+=3})),this.atomIndices=s,this.points=r,this.kdtree=new Sm(r,n),e.Debug&&Fl.timeEnd("Kdtree build")}nearest(e,t,i){e instanceof _t?e.toArray(Tm):e instanceof Mm&&e.positionToArray(Tm);const n=this.kdtree.nearest(Tm,t,i),r=this.kdtree.indices,s=this.kdtree.nodes,a=this.atomIndices,o=[];for(let e=0,t=n.length;e":"3/4-Z","?":"X-Y","@":"Y-X",A:"Z+1/3",B:"Z+2/3",C:"X+2/3",D:"Y+1/3",E:"-Y+2/3",F:"X-Y+1/3",G:"Y-X+2/3",H:"-X+1/3",I:"X+1/3",J:"Y+2/3",K:"-Y+1/3",L:"X-Y+2/3",M:"Y-X+1/3",N:"-X+2/3",O:"2/3+X",P:"1/3+Y",Q:"1/3+Z",R:"2/3-Y",S:"1/3+X-Y",T:"2/3+Y-X",U:"1/3-X",V:"2/3-X",W:"1/3-Y",X:"1/3-Z",Y:"2/3+Y",Z:"1/3+Y-X","[":"2/3+X-Y","]":"1/3+X","^":"2/3+Z",_:"2/3-Z","`":"5/6+Z",a:"1/6+Z",b:"5/6-Z",c:"1/6-Z",d:"Z+5/6",e:"Z+1/6",f:"Z+1/4",g:"+Y"},Im={"P 1":" !#","P -1":" !#$%&","P 1 2 1":" !#$!&","P 1 21 1":" !#$'&","C 1 2 1":" !#$!&()#*)&","P 1 m 1":" !# %#","P 1 c 1":" !# %+","C 1 m 1":" !# %#()#(,#","C 1 c 1":" !# %+()#(,+","P 1 2/m 1":" !# %#$!&$%&","P 1 21/m 1":" !#$)&$%& ,#","C 1 2/m 1":" !# %#$!&$%&()#(,#*)&*,&","P 1 2/c 1":" !#$!-$%& %+","P 1 21/c 1":" !#$%&$)- ,+","C 1 2/c 1":" !#$!-$%& %+()#*)-*,&(,+","P 2 2 2":" !#$%#$!& %&","P 2 2 21":" !#$%+$!- %&","P 21 21 2":" !#$%#*)&(,&","P 21 21 21":" !#*%+$)-(,&","C 2 2 21":" !#$%+$!- %&()#*,+*)-(,&","C 2 2 2":" !#$%#$!& %&()#*,#*)&(,&","F 2 2 2":" !#$%#$!& %& )+$,+$)- ,-(!+*%+*!-(%-()#*,#*)&(,&","I 2 2 2":" !#$%# %&$!&.'/01/.120'2","I 21 21 21":" !#*%+$)-(,&()+$,#*!& %-","P m m 2":" !#$%# %#$!#","P m c 21":" !#$%+ %+$!#","P c c 2":" !#$%# %+$!+","P m a 2":" !#$%#(%#*!#","P c a 21":" !#$%+(%#*!+","P n c 2":" !#$%# ,+$)+","P m n 21":" !#*%+(%+$!#","P b a 2":" !#$%#(,#*)#","P n a 21":" !#$%+(,#*)+","P n n 2":" !#$%#(,+*)+","C m m 2":" !#$%# %#$!#()#*,#(,#*)#","C m c 21":" !#$%+ %+$!#()#*,+(,+*)#","C c c 2":" !#$%# %+$!+()#*,#(,+*)+","A m m 2":" !#$%# %#$!# )+$,+ ,+$)+","A b m 2":" !#$%# ,#$)# )+$,+ %+$!+","A m a 2":" !#$%#(%#*!# )+$,+(,+*)+","A b a 2":" !#$%#(,#*)# )+$,+(%+*!+","F m m 2":" !#$%# %#$!# )+$,+ ,+$)+(!+*%+(%+*!+()#*,#(,#*)#","F d d 2":" !#$%#345675 )+$,+3896:9(!+*%+;49<79()#*,#;85<:5","I m m 2":" !#$%# %#$!#()+*,+(,+*)+","I b a 2":" !#$%#(,#*)#()+*,+ %+$!+","I m a 2":" !#$%#(%#*!#()+*,+ ,+$)+","P 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#","P 2/n 2/n 2/n":" !#$%#$!& %&*,-()-(,+*)+","P 2/c 2/c 2/m":" !#$%#$!- %-$%& !& %+$!+","P 2/b 2/a 2/n":" !#$%#$!& %&*,&()&(,#*)#","P 21/m 2/m 2/a":" !#*%#$!&(%&$%&(!& %#*!#","P 2/n 21/n 2/a":" !#*%#*)- ,-$%&(!&(,+$)+","P 2/m 2/n 21/a":" !#*%+*!- %&$%&(!-(%+$!#","P 21/c 2/c 2/a":" !#*%#$!-(%-$%&(!& %+*!+","P 21/b 21/a 2/m":" !#$%#*)&(,&$%& !&(,#*)#","P 21/c 21/c 2/n":" !#*,#$)-(%-$%&()& ,+*!+","P 2/b 21/c 21/m":" !#$%+$)- ,&$%& !- ,+$)#","P 21/n 21/n 2/m":" !#$%#*)-(,-$%& !&(,+*)+","P 21/m 21/m 2/n":" !#$%#*'&.,&*,&.'& %#$!#","P 21/b 2/c 21/n":" !#*,+$!-(,&$%&()- %+*)#","P 21/b 21/c 21/a":" !#*%+$)-(,&$%&(!- ,+*)#","P 21/n 21/m 21/a":" !#0%/$'&.12$%&.!2 1#0'/","C 2/m 2/c 21/m":" !#$%+$!- %&$%& !- %+$!#()#*,+*)-(,&*,&()-(,+*)#","C 2/m 2/c 21/a":" !#$,+$)- %&$%& )- ,+$!#()#*%+*!-(,&*,&(!-(%+*)#","C 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#()#*,#*)&(,&*,&()&(,#*)#","C 2/c 2/c 2/m":" !#$%#$!- %-$%& !& %+$!+()#*,#*)-(,-*,&()&(,+*)+","C 2/m 2/m 2/a":" !#$,#$)& %&$%& )& ,#$!#()#*%#*!&(,&*,&(!&(%#*)#","C 2/c 2/c 2/a":" !#*,#$!&(,&$,-(!- ,+*!+()#$%#*)& %&*%- )-(%+$)+","F 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!# )+$,+$)- ,-$,- )- ,+$)+(!+*%+*!-(%-*%-(!-(%+*!+()#*,#*)&(,&*,&()&(,#*)#","F 2/d 2/d 2/d":" !#$%#$!& %&64=37=345675 )+$,+$)- ,-68>3:>3896:9(!+*%+*!-(%-<4>;7>;49<79()#*,#*)&(,&<8=;:=;85<:5","I 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#()+*,+*)-(,-*,-()-(,+*)+","I 2/b 2/a 2/m":" !#$%#*)&(,&$%& !&(,#*)#()+*,+$!- %-*,-()- %+$!+","I 21/b 21/c 21/a":" !#*%+$)-(,&$%&(!- ,+*)#()+$,#*!& %-*,- )&(%#$!+","I 21/m 21/m 21/a":" !#$,#$)& %&$%& )& ,#$!#()+*%+*!-(,-*,-(!-(%+*)+","P 4":" !#$%#% #!$#","P 41":" !#$%+% 5!$9","P 42":" !#$%#% +!$+","P 43":" !#$%+% 9!$5","I 4":" !#$%#% #!$#()+*,+,(+)*+","I 41":" !#*,+%(5)$9()+$%#, 9!*5","P -4":" !#$%#!$&% &","I -4":" !#$%#!$&% &()+*,+)*-,(-","P 4/m":" !#$%#% #!$#$%& !&!$&% &","P 42/m":" !#$%#% +!$+$%& !&!$-% -","P 4/n":" !#$%#,(#)*#*,&()&!$&% &","P 42/n":" !#$%#,(+)*+*,-()-!$&% &","I 4/m":" !#$%#% #!$#$%& !&!$&% &()+*,+,(+)*+*,-()-)*-,(-","I 41/a":" !#*,+%(5)$9$,=(!>!$&,(-()+$%#, 9!*5*%> )=)*-% &","P 4 2 2":" !#$%#% #!$#$!& %&! &%$&","P 4 21 2":" !#$%#,(#)*#*)&(,&! &%$&","P 41 2 2":" !#$%+% 5!$9$!& %-! >%$=","P 41 21 2":" !#$%+,(5)*9*)=(,>! &%$-","P 42 2 2":" !#$%#% +!$+$!& %&! -%$-","P 42 21 2":" !#$%#,(+)*+*)-(,-! &%$&","P 43 2 2":" !#$%+% 9!$5$!& %-! =%$>","P 43 21 2":" !#$%+,(9)*5*)>(,=! &%$-","I 4 2 2":" !#$%#% #!$#$!& %&! &%$&()+*,+,(+)*+*)-(,-)(-,*-","I 41 2 2":" !#*,+%(5)$9*!> ,=)(-%$&()+$%#, 9!*5$)=(%>! &,*-","P 4 m m":" !#$%#% #!$# %#$!#%$#! #","P 4 b m":" !#$%#% #!$#(,#*)#,*#)(#","P 42 c m":" !#$%#% +!$+ %+$!+%$#! #","P 42 n m":" !#$%#,(+)*+(,+*)+%$#! #","P 4 c c":" !#$%#% #!$# %+$!+%$+! +","P 4 n c":" !#$%#% #!$#(,+*)+,*+)(+","P 42 m c":" !#$%#% +!$+ %#$!#%$+! +","P 42 b c":" !#$%#% +!$+(,#*)#,*+)(+","I 4 m m":" !#$%#% #!$# %#$!#%$#! #()+*,+,(+)*+(,+*)+,*+)(+","I 4 c m":" !#$%#% #!$# %+$!+%$+! +()+*,+,(+)*+(,#*)#,*#)(#","I 41 m d":" !#*,+%(5)$9 %#*)+%*5) 9()+$%#, 9!*5(,+$!#,$9!(5","I 41 c d":" !#*,+%(5)$9 %+*)#%*9) 5()+$%#, 9!*5(,#$!+,$5!(9","P -4 2 m":" !#$%#% &!$&$!& %&%$#! #","P -4 2 c":" !#$%#% &!$&$!- %-%$+! +","P -4 21 m":" !#$%#% &!$&*)&(,&,*#)(#","P -4 21 c":" !#$%#% &!$&*)-(,-,*+)(+","P -4 m 2":" !#$%#!$&% & %#$!#! &%$&","P -4 c 2":" !#$%#% &!$& %+$!+! -%$-","P -4 b 2":" !#$%#% &!$&(,#*)#)(&,*&","P -4 n 2":" !#$%#% &!$&(,+*)+)(-,*-","I -4 m 2":" !#$%#% &!$& %#$!#! &%$&()+*,+,(-)*-(,+*)+)(-,*-","I -4 c 2":" !#$%#% &!$& %+$!+! -%$-()+*,+,(-)*-(,#*)#)(&,*&","I -4 2 m":" !#$%#% &!$&$!& %&%$#! #()+*,+,(-)*-*)-(,-,*+)(+","I -4 2 d":" !#$%#% &!$&*!>(%>,$9) 9()+*,+,(-)*-$)= ,=%*5!(5","P 4/m 2/m 2/m":" !#$%#% #!$#$!& %&! &%$&$%& !&!$&% & %#$!#%$#! #","P 4/m 2/c 2/c":" !#$%#% #!$#$!- %-! -%$-$%& !&!$&% & %+$!+%$+! +","P 4/n 2/b 2/m":" !#$%#% #!$#$!& %&! &%$&*,&()&)*&,(&(,#*)#,*#)(#","P 4/n 2/n 2/c":" !#$%#% #!$#$!& %&! &%$&*,-()-)*-,(-(,+*)+,*+)(+","P 4/m 21/b 2/m":" !#$%#% #!$#*)&(,&)(&,*&$%& !&!$&% &(,#*)#,*#)(#","P 4/m 21/n 2/c":" !#$%#% #!$#*)-(,-)(-,*-$%& !&!$&% &(,+*)+,*+)(+","P 4/n 21/m 2/m":" !#$%#,(#)*#*)&(,&! &%$&*,&()&!$&% & %#$!#,*#)(#","P 4/n 2/c 2/c":" !#$%#,(#)*#*)-(,-! -%$-*,&()&!$&% & %+$!+,*+)(+","P 42/m 2/m 2/c":" !#$%#% +!$+$!& %&! -%$-$%& !&!$-% - %#$!#%$+! +","P 42/m 2/c 2/m":" !#$%#% +!$+$!- %-! &%$&$%& !&!$-% - %+$!+%$#! #","P 42/n 2/b 2/c":" !#$%#,(+)*+$!- %-)(&,*&*,-()-!$&% &(,#*)#%$+! +","P 42/n 2/n 2/m":" !#$%#,(+)*+$!& %&)(-,*-*,-()-!$&% &(,+*)+%$#! #","P 42/m 21/b 2/c":" !#$%#% +!$+*)&(,&)(-,*-$%& !&!$-% -(,#*)#,*+)(+","P 42/m 21/n 2/m":" !#$%#,./'*/*'-.,-! &%$&$%& !&'*-,.-.,/*'/%$#! #","P 42/n 21/m 2/c":" !#$%#,(+)*+*)-(,-! &%$&*,-()-!$&% & %#$!#,*+)(+","P 42/n 21/c 2/m":" !#$%#,(+)*+*)&(,&! -%$-*,-()-!$&% & %+$!+,*#)(#","I 4/m 2/m 2/m":" !#$%#% #!$#$!& %&! &%$&$%& !&!$&% & %#$!#%$#! #()+*,+,(+)*+*)-(,-)(-,*-*,-()-)*-,(-(,+*)+,*+)(+","I 4/m 2/c 2/m":" !#$%#% #!$#$!- %-! -%$-$%& !&!$&% & %+$!+%$+! +()+*,+,(+)*+*)&(,&)(&,*&*,-()-)*-,(-(,#*)#,*#)(#","I 41/a 2/m 2/d":" !#*,+%(5)$9*!> ,=)(-%$&$,=(!>!$&,(-(,+$!#,$9!(5()+$%#, 9!*5$)=(%>! &,*-*%> )=)*-% & %#*)+%*5) 9","I 41/a 2/c 2/d":" !#*,+%(5)$9*!= ,>)(&%$-$,=(!>!$&,(-(,#$!+,$5!(9()+$%#, 9!*5$)>(%=! -,*&*%> )=)*-% & %+*)#%*9) 5","P 3":" !#%?#@$#","P 31":" !#%?A@$B","P 32":" !#%?B@$A","H 3":" !#%?#@$#CDAEFAGHAIJBKLBMNB","R 3":" !## !!# ","P -3":" !#%?#@$#$%&!@&? &","H -3":" !#%?#@$#$%&!@&? &OPQRSQTUQVWXYZX[]X]Y^W[^ZV^UR_PT_SO_","R -3":" !## !!# $%&&$%%&$","P 3 1 2":" !#%?#@$#%$&@!& ?&","P 3 2 1":" !#%?#@$#! &?%&$@&","P 31 1 2":" !#%?Q@$^%$_@!X ?&","P 31 2 1":" !#%?A@$B! &?%_$@X","P 32 1 2":" !#%?^@$Q%$X@!_ ?&","P 32 2 1":" !#%?B@$A! &?%X$@_","H 3 2":" !#%?#@$#! &?%&$@&OPQRSQTUQY]X[WXVZX]Y^W[^ZV^PO_SR_UT_","R 3 2":" !## !!# %$&$&%&%$","P 3 m 1":" !#%?#@$#%$#@!# ?#","P 3 1 m":" !#%?#@$#! #?%#$@#","P 3 c 1":" !#%?#@$#%$+@!+ ?+","P 3 1 c":" !#%?#@$#! +?%+$@+","H 3 m":" !#%?#@$#%$#@!# ?#OPQRSQTUQRUQTPQOSQ]Y^W[^ZV^WV^ZY^][^","R 3 m":" !## !!# ! # #!#! ","H 3 c":" !#%?#@$#%$+@!+ ?+OPQRSQTUQRU`TP`OS`]Y^W[^ZV^WVaZYa][a","R 3 c":" !## !!# '././'/'.","P -3 1 2/m":" !#%?#@$#%$&@!& ?&$%&!@&? &! #?%#$@#","P -3 1 2/c":" !#%?#@$#%$-@!- ?-$%&!@&? &! +?%+$@+","P -3 2/m 1":" !#%?#@$#! &?%&$@&$%&!@&? &%$#@!# ?#","P -3 2/c 1":" !#%?#@$#! -?%-$@-$%&!@&? &%$+@!+ ?+","H -3 2/m":" !#%?#@$#! &?%&$@&$%&!@&? &%$#@!# ?#OPQRSQTUQY]X[WXVZXVWXYZX[]XRUQTPQOSQ]Y^W[^ZV^PO_SR_UT_UR_PT_SO_WV^ZY^][^","R -3 2/m":" !## !!# %$&$&%&%$$%&&$%%&$! # #!#! ","H -3 2/c":" !#%?#@$#! -?%-$@-$%&!@&? &%$+@!+ ?+OPQRSQTUQY]b[WbVZbVWXYZX[]XRU`TP`OS`]Y^W[^ZV^POcSRcUTcUR_PT_SO_WVaZYa][a","R -3 2/c":" !## !!# 102021210$%&&$%%&$'././'/'.","P 6":" !#%?#@$#$%#!@#? #","P 61":" !#%?A@$B$%/!@d? e","P 65":" !#%?B@$A$%/!@e? d","P 62":" !#%?^@$Q$%#!@^? Q","P 64":" !#%?Q@$^$%#!@Q? ^","P 63":" !#%?#@$#$%+!@+? +","P -6":" !#%?#@$# !&%?&@$&","P 6/m":" !#%?#@$#$%#!@#? #$%&!@&? & !&%?&@$&","P 63/m":" !#%?#@$#$%+!@+? +$%&!@&? & !-%?-@$-","P 6 2 2":" !#%?#@$#$%#!@#? #! &?%&$@&%$&@!& ?&","P 61 2 2":" !#%?Q@$^$%+!@`? a! X?%&$@_%$b@!- ?c","P 65 2 2":" !#%?^@$Q$%+!@a? `! _?%&$@X%$c@!- ?b","P 62 2 2":" !#%?^@$Q$%#!@^? Q! _?%&$@X%$_@!& ?X","P 64 2 2":" !#%?Q@$^$%#!@Q? ^! X?%&$@_%$X@!& ?_","P 63 2 2":" !#%?#@$#$%+!@+? +! &?%&$@&%$-@!- ?-","P 6 m m":" !#%?#@$#$%#!@#? #%$#@!# ?#! #?%#$@#","P 6 c c":" !#%?#@$#$%#!@#? #%$+@!+ ?+! +?%+$@+","P 63 c m":" !#%?#@$#$%+!@+? +%$+@!+ ?+! #?%#$@#","P 63 m c":" !#%?#@$#$%+!@+? +%$#@!# ?#! +?%+$@+","P -6 m 2":" !#%?#@$# !&%?&@$&%$#@!# ?#%$&@!& ?&","P -6 c 2":" !#%?#@$# !-%?-@$-%$+@!+ ?+%$&@!& ?&","P -6 2 m":" !#%?#@$# !&%?&@$&! &?%&$@&! #?%#$@#","P -6 2 c":" !#%?#@$# !-%?-@$-! &?%&$@&! +?%+$@+","P 6/m 2/m 2/m":" !#%?#@$#$%#!@#? #! &?%&$@&%$&@!& ?&$%&!@&? & !&@$&%?&%$#@!# ?#! #?%#$@#","P 6/m 2/c 2/c":" !#%?#@$#$%#!@#? #! -?%-$@-%$-@!- ?-$%&!@&? & !&@$&%?&%$+@!+ ?+! +?%+$@+","P 63/m 2/c 2/m":" !#%?#@$#$%+!@+? +! -?%-$@-%$&@!& ?&$%&!@&? & !-@$-%?-%$+@!+ ?+! #?%#$@#","P 63/m 2/m 2/c":" !#%?#@$#$%+!@+? +! &?%&$@&%$-@!- ?-$%&!@&? & !-@$-%?-%$#@!# ?#! +?%+$@+","P 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ","F 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ","I 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-(","P 21 3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(","I 21 3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- ","P 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$","P 2/n -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& *,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*","F 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$ )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-($,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(*%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- *,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$","F 2/d -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& 64=37=345675=64=375345674=67=3453756 )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(68>3:>3896:9=<8=;:5;85<:4><7>;49;79<(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(<4>;7>;49<79>68>3:93896:8=<:=;85;:5<()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- <8=;:=;8f<:f><4>;79;49<78>6:>3893:96","I 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-(*,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*","P 21/a -3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&($%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*","I 21/a -3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&($%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*()+$,#*g& %-+()#$,&*!- %)+(,#$!&*%- *,- )&(%#$!+-*,& )#(%+$!,-*)& %#(!+$","P 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$","P 42 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*","F 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$ )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(-%*-!*+%(+ +,$+)$-, -)#)*#,(&)(&,*(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() -,$-)$+, +(#,*#)*&,(&)+!*+%(-!(-%*()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(&,*&)*#,(#(+%*+!*-%(-!+)$+, -) -,$","F 41 3 2":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=46 )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<(!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>86","I 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*","P 43 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(7;>46=:<5839398<5:6=4;>75:<983>7;=46","P 41 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<","I 41 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- 7;>46=:<5839398<5:6=4;>75:<983>7;=46","P -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&% ","F -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&% )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(+%*+!*-%(- +)$+,$-) -,#)(#,*&)*&,((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() +,$+)$-, -(#)*#,*&)(&,+!(+%*-!*-%(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(#,*#)*&,(&(+!*+%*-!(-%+) +,$-)$-, ","I -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&% ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,(","P -4 3 n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,(","F -4 3 c":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,( )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-() #,$#)$&, &(#!*#%*&!(&%+! +%$-!$-% (!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(!(#%*#!*&%(& +!$+%$-! -%#) #,$&)$&, ()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ! +%$+!$-% - #)$#,$&) &,#!(#%*&!*&%(","I -4 3 d":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(7354<9:6>8;=357<946>:;=857394<>:6=8;()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- :;98657<=43>;9:658<=73>49:;586=7<>43","P 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ","P 4/n -3 2/n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$*,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","P 42/m -3 2/n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","P 42/n -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,**,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ","F 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(-%*-!*+%(+ +,$+)$-, -)#)*#,(&)(&,*$,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*%*+!(+%(-!*-$-) -, +)$+,&,(&)*#,*#)((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() -,$-)$+, +(#,*#)*&,(&)+!*+%(-!(-%**%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*,$+) +, -)$-*&)(&,(#)*#,-%(-!*+%*+!(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(&,*&)*#,(#(+%*+!*-%(-!+)$+, -) -,$*,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$,*#)(#,(&)*&*-!(-%(+!*+%-, -)$+,$+) ","F 4/m -3 2/c":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)( )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-() &,$&)$#, #(#%*#!*&%(&!+!$+% -! -%$$,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*,$#) #, &)$&*&!(&%(#!*#%-% -!$+%$+! (!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(!(&%*&!*#%(# +%$+!$-% -!#)$#, &) &,$*%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*%*#!(#%(&!*&$-! -% +!$+%&, &)$#,$#) ()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ! -%$-!$+% + #,$#)$&, &)#!*#%(&!(&%**,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$%$+! +% -!$-$&) &, #)$#,&%(&!*#%*#!(","F 41/d -3 2/m":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=4664=3:>;85<79=64>3:5;89<74=6:>385;79<,$+! #%(-)*&*&)(-% #!$+,-%(&)*+,$#! )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<68>37=;49<:5=<8>;753496:4><:=;893756,*#!(+% &)$-*-!(&, +)$#%-, &!$+%*#)((!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<<4>;:=389675>68=379;45<:8=<7>;453:96%$#) +,(&!*-$&! -,(#)*+%&% -)$#,*+!(()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>86<8=;7>3456:9><4=;:9385678>67=349;:5<%*+)(#, -!$&$-) &%(+!*#,&,(-!*#%$+) ","F 41/d -3 2/c":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=46<8>;7=3496:5><8=;793456:8><7=;493:56%*#)(+, &!$-$-! &,(+)*#%&, -!$#%*+)( )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<<4=;:>385679>64=3:9;85<78=67>345;:9<%$+) #,(-!*&$&) -%(#!*+,&%(-)*#,$+! (!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<68=37>;45<:9=<4>;:5389674>6:=389;75<,*+!(#% -)$&*-)(&% +!$#,-,(&!*+%$#) ()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>8664>3:=;89<75=68>375;49<:4=<:>;853796,$#! +%(&)*-*&!(-, #)$+%-% &)$+,*#!(","I 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,**,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","I 41/a -3 2/d":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<$%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*4<97358;=:6>6>:;=8357<94=8;>:694<573()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- 7;>46=:<5839398<5:6=4;>75:<983>7;=46*,- )&(%#$!+-*,& )#(%+$!,-*)& %#(!+$865:;943>7<=<=73>4;9:658>43=7<5869:;","P 1 1 2":" !#$%#","P 1 1 21":" !#$%+","B 1 1 2":" !#$%#(g+*%+","A 1 2 1":" !#$!& )+$)-","C 1 21 1":" !#$)&()#*!&","I 1 2 1":" !#$!&.'/0'2","I 1 21 1":" !#$)&.'/0!-","P 1 1 m":" !# !&","P 1 1 b":" !# )&","B 1 1 m":" !# !&(!+(!-","B 1 1 b":" !# )&(!+()-","P 1 1 2/m":" !# !&$%#$%&","P 1 1 21/m":" !#$%+$%& !-","B 1 1 2/m":" !# !&$%#$%&(!+(!-*%+*%-","P 1 1 2/b":" !#$,#$%& )&","P 1 1 21/b":" !#$%&$,+ )-","B 1 1 2/b":" !#$,#$%& )&(!+*,+*%-()-","P 21 2 2":" !#$!&(%&*%#","P 2 21 2":" !# ,&$)&$%#","P 21 21 2 (a)":" !#*,#.%&$'&","P 21 2 21":" !#$!&(%-*%+","P 2 21 21":" !# %&$)-$,+","C 2 2 21a)":" !#*%+(,&$)-()#$,+ %&*!-","C 2 2 2a":" !#*,#.%&$'&()#$%# ,&*!&","F 2 2 2a":" !#*,#.%&$'& '/*%/.12$!2.!/$,/ %20'2.'#$%# 1&0!&","I 2 2 2a":" !#*,#.%&$'&()+$%+*!- ,-","P 21/m 21/m 2/n a":" !#*,#$)&(%&$%&.'& ,#*!#","P 42 21 2a":" !#*,#%.+'$+$'&.%&! -,*-","I 2 3a":" !#*,#.%&$'&!# ,- '&$%/$# !-*!/$%&.%()+$%+ ,-*!-)+(%&(!-*,#*+()&$)#*,- ,"},Dm=/^[1-9]$/;function Rm(e){let t="";return e.length>0&&(t=":"+bo(e).join(" OR :")),new wl(t)}class Lm{constructor(e=""){this.name=e,this.partList=[]}get type(){return"Assembly"}addPart(e,t){const i=new km(e,t);return this.partList.push(i),i}getAtomCount(e){return this.partList.reduce(((t,i)=>t+i.getAtomCount(e)),0)}getResidueCount(e){return this.partList.reduce(((t,i)=>t+i.getResidueCount(e)),0)}getInstanceCount(){let e=0;return this.partList.forEach((function(t){e+=t.matrixList.length})),e}isIdentity(e){if(1!==this.partList.length)return!1;const t=this.partList[0];if(1!==t.matrixList.length)return!1;if(!(new qt).equals(t.matrixList[0]))return!1;let i=[];return e.eachChain((function(e){i.push(e.chainname)})),i=bo(i),t.chainList.length===i.length}getBoundingBox(e){const t=new bt;return this.partList.forEach((function(i){const n=i.getBoundingBox(e);t.expandByPoint(n.min),t.expandByPoint(n.max)})),t}getCenter(e){return this.getBoundingBox(e).getCenter(new _t)}getSelection(){let e=[];return this.partList.forEach((function(t){e=e.concat(t.chainList)})),Rm(e)}}class km{constructor(e=[],t=[]){this.matrixList=e,this.chainList=t}get type(){return"AssemblyPart"}_getCount(e,t){let i=0;return e.eachChain((e=>{(0===this.chainList.length||this.chainList.includes(e.chainname))&&(i+=e[t])})),this.matrixList.length*i}getAtomCount(e){return this._getCount(e,"atomCount")}getResidueCount(e){return this._getCount(e,"residueCount")}getBoundingBox(e){const t=new bt,i=new bt,n=this.getSelection(),r=e.getBoundingBox(n);return this.matrixList.forEach((function(e){i.copy(r).applyMatrix4(e),t.expandByPoint(i.min),t.expandByPoint(i.max)})),t}getSelection(){return Rm(this.chainList)}getView(e){const t=this.getSelection();return t?e.getView(t):e}getInstanceList(){const e=[];for(let t=0,i=this.matrixList.length;t0&&this.addResidueType(this.ri-1),c.growIfFull(),c.resno[this.ri]=r,void 0!==a&&(c.sstruc[this.ri]=a.charCodeAt(0)),void 0!==o&&(c.inscode[this.ri]=o.charCodeAt(0)),c.atomOffset[this.ri]=this.ai,c.atomCount[this.ri]=0,c.count+=1,c.chainIndex[this.ri]=this.ci,u.residueCount[this.ci]+=1),l.count+=1,l.residueIndex[this.ai]=this.ri,c.atomCount[this.ri]+=1,this.currentModelindex=e,this.currentChainid=i,this.currentResname=n,this.currentResno=r,this.currentInscode=o,this.currentHetero=s}finalize(){this.previousResname=this.currentResname,this.previousHetero=this.currentHetero,this.ri>-1&&this.addResidueType(this.ri)}}function Nm(t,i){if(!i)return;e.Debug&&Fl.time("assignSecondaryStructure");const n=[];t.eachModel((function(e){e.eachChain((function(e){n.push(e.chainname)}))}));const r=n.slice().sort(),s=[];r.forEach((function(e){s.push(n.indexOf(e))}));const a=i.helices.filter((function(e){return yo(r,e[0])>=0}));a.sort((function(e,t){const i=e[0],n=t[0],a=e[1],o=t[1];if(i===n)return a===o?0:a=0}));l.sort((function(e,t){const i=e[0],n=t[0];if(i===n)return 0;const a=yo(r,i),o=yo(r,n);return s[a]=e.residueCount)continue;a.index=s+r,o.index=s+r+t,l.index=a.traceAtomIndex,c.index=o.traceAtomIndex;const u=l.distanceTo(c);if(Math.abs(u-i[t-2])>n)return!1}return!0},i=function(e,i){return t(e,i,[5.45,5.18,6.37],2.1)},n=function(e,i){return t(e,i,[6.1,10.4,13],1.42)};return function(t){e.Debug&&Fl.time("calculateSecondaryStructure"),t.eachPolymer((function(e){if(e.residueCount<4)return;if(e.isCg())!function(e){const t=e.residueStore,i=e.residueIndexStart,n=new xm(e).position,r=new _t,s=new _t;for(let a=0,o=e.residueCount;a1&&n.bending[a]<20&&(t.sstruc[i+a]="h".charCodeAt(0),t.sstruc[i+a+1]="h".charCodeAt(0))}}(e);else{if(!e.isProtein())return;!function(e){const t=e.residueStore,r=e.residueIndexStart;for(let s=0,a=e.residueCount;s=t;)i=Math.floor(i/t),r+=Bm[i%t],n+=1;return n>=5&&Fl.warn("chainname overflow"),r}function Um(t,i=!1){e.Debug&&Fl.time("calculateChainnames");let n=!0;if(t.eachChain((function(e){e.chainname&&(n=!1)})),n){const e=t.modelStore,n=t.chainStore,r=t.residueStore,s=function(t,i,s,a){const o=n.count;for(let e=0;e{h.add(t),e.forEach((e=>{h.add(e)}))}))),t.eachResidue((function(e){if(!i&&u){const t=e.atomCount,i=e.atomOffset;if(t>500)return void Fl.warn("more than 500 atoms, skip residue for auto-bonding",e.qualifiedName());if("auto"===n&&e.hetero)for(let t=e.atomOffset;t{h.forEach((i=>{e.push(t.clone().multiply(i))}))})),c.addPart(e)}else c.addPart(u);const d=new _t,f=new Lm("SUPERCELL"),m=Array.prototype.concat.call(l(d.set(1,0,0)),l(d.set(0,1,0)),l(d.set(0,0,1)),l(d.set(-1,0,0)),l(d.set(0,-1,0)),l(d.set(0,0,-1)),l(d.set(1,1,0)),l(d.set(1,0,1)),l(d.set(0,1,1)),l(d.set(-1,-1,0)),l(d.set(-1,0,-1)),l(d.set(0,-1,-1)),l(d.set(1,-1,-1)),l(d.set(1,1,-1)),l(d.set(1,-1,1)),l(d.set(-1,1,1)),l(d.set(-1,-1,1)),l(d.set(-1,1,-1)),l(d.set(0,1,-1)),l(d.set(0,-1,1)),l(d.set(1,0,-1)),l(d.set(-1,0,1)),l(d.set(1,-1,0)),l(d.set(-1,1,0)),l(),l(d.set(1,1,1)),l(d.set(-1,-1,-1)));if(t.biomolDict.NCS){const e=[];m.forEach((function(t){h.forEach((function(i){e.push(t.clone().multiply(i))}))})),f.addPart(e)}else f.addPart(m);t.biomolDict.UNITCELL=c,t.biomolDict.SUPERCELL=f,e.Debug&&Fl.timeEnd("buildUnitcellAssembly")}const qm=["H","C","O","N","S","P"],Xm=["NA","CL","FE"];function Ym(e){let t=e.toUpperCase(),i=0,n=0;for(let e=0;e0)break;++i}else n=e+1;(i>0||n=3&&-1!==qm.indexOf(t[0])?t[0]:""}function Km(e){const t=e.bondHash,i=t.countArray,n=t.offsetArray,r=t.indexArray,s=e.getBondProxy();e.eachResidue((function(e){const t=e.residueType;if(void 0!==t.bonds)return;var a=e.atomOffset,o=[],l=[],c=[],u={};const h=a+e.atomCount;e.eachAtom((function(e){const t=e.index,d=n[t];for(let e=0,n=i[t];e=h)continue;let i=s.atomIndex2;if(i=h)continue;if(t>i){const e=i;i=t,t=e}const n=t+"|"+i;void 0===u[n]&&(u[n]=!0,o.push(t-a),l.push(i-a),c.push(s.bondOrder))}})),t.bonds={atomIndices1:o,atomIndices2:l,bondOrders:c}}))}const Zm=[3,11,19,37,55,87],Qm=[4,12,20,38,56,88],Jm=[6,15,16,34],ep=[1,7,8,9,17,35,53],tp=[2,10,18,36,54,86],ip=[13,30,31,48,49,50,80,81,82,83,84,85,112],np=[5,14,32,33,51,52,85],rp=[9,17,35,53,85];class sp{constructor(e,t,i){this.structure=e,this.atomname=t,i=i||Ym(t),this.element=i,this.number=Hh[i]||0,this.vdw=jh[this.number]||2,this.covalent=Wh[this.number]||1.6}getDefaultValence(){const e=qh[this.number];return e?e[0]:-1}getValenceList(){return qh[this.number]||[]}getOuterShellElectronCount(){return Xh[this.number]||2}isMetal(){return this.isAlkaliMetal()||this.isAlkalineEarthMetal()||this.isLanthanide()||this.isActinide()||this.isTransitionMetal()||this.isPostTransitionMetal()}isNonmetal(){return this.isDiatomicNonmetal()||this.isPolyatomicNonmetal()||this.isNobleGas()}isMetalloid(){return np.includes(this.number)}isHalogen(){return rp.includes(this.number)}isDiatomicNonmetal(){return ep.includes(this.number)}isPolyatomicNonmetal(){return Jm.includes(this.number)}isAlkaliMetal(){return Zm.includes(this.number)}isAlkalineEarthMetal(){return Qm.includes(this.number)}isNobleGas(){return tp.includes(this.number)}isTransitionMetal(){const e=this.number;return e>=21&&e<=29||e>=39&&e<=47||e>=72&&e<=79||e>=104&&e<=108}isPostTransitionMetal(){return ip.includes(this.number)}isLanthanide(){return this.number>=57&&this.number<=71}isActinide(){return this.number>=89&&this.number<=103}}class ap{constructor(e){this.structure=e,this.dict={},this.list=[],this.structure=e}add(e,t){const i=function(e,t){return e+"|"+t}(e=e.toUpperCase(),t=t?t.toUpperCase():Ym(e));let n=this.dict[i];if(void 0===n){const r=new sp(this.structure,e,t);n=this.list.length,this.dict[i]=n,this.list.push(r)}return n}get(e){return this.list[e]}}class op{constructor(e,t,i,n,r,s){this.structure=e,this.bondReferenceAtomIndices=[],this.resname=t,this.atomTypeIdList=i,this.hetero=n?1:0,this.chemCompType=r,this.bonds=s,this.atomCount=i.length,this.moleculeType=this.getMoleculeType(),this.backboneType=this.getBackboneType(0),this.backboneEndType=this.getBackboneType(-1),this.backboneStartType=this.getBackboneType(1),this.backboneIndexList=this.getBackboneIndexList();const a=ld[this.backboneType],o=ld[this.backboneStartType],l=ld[this.backboneEndType],c=this.getAtomIndexByName(a.trace);this.traceAtomIndex=uo(c,-1);const u=this.getAtomIndexByName(a.direction1);this.direction1AtomIndex=uo(u,-1);const h=this.getAtomIndexByName(a.direction2);this.direction2AtomIndex=uo(h,-1);const d=this.getAtomIndexByName(o.backboneStart);this.backboneStartAtomIndex=uo(d,-1);const f=this.getAtomIndexByName(l.backboneEnd);let m;this.backboneEndAtomIndex=uo(f,-1),m=td.includes(t)?this.getAtomIndexByName("N1"):this.getAtomIndexByName("N3"),this.rungEndAtomIndex=uo(m,-1)}getBackboneIndexList(){const e=[];let t;switch(this.moleculeType){case 3:t=ad;break;case 4:case 5:t=od;break;default:return e}const i=this.structure.atomMap,n=this.atomTypeIdList;for(let r=0,s=this.atomCount;r500)e.Debug&&Fl.warn("more than 500 atoms, skip residue for auto-bonding",t.qualifiedName());else if(s>50){const e=new Pm(t,!0),i=t.isCg()?1.2:2.3;for(let t=a;t=0||hp(e,t);this.rings={atomRings:e.atomRings,rings:e.rings}}isAromatic(e){return this.aromaticAtoms=this.getAromatic(e),1===this.aromaticAtoms[e.index-e.residueAtomOffset]}calculateAromatic(e){const t=this.aromaticAtoms=new Uint8Array(this.atomCount),i=this.getRings().rings,n=i.map((t=>function(e){if(e.some((e=>!lp.includes(e.number))))return!1;let t=0;const i=new af(3,e.length),n=i.data;e.forEach((e=>{n[t+0]=e.x,n[t+1]=e.y,n[t+2]=e.z,t+=3}));return new dm(i).vecC.length()this.structure.getAtomProxy(t+e.atomOffset)))))),r=this.aromaticRings=[];i.forEach(((e,i)=>{n[i]&&(r.push(e),e.forEach((e=>t[e]=1)))}))}assignBondReferenceAtomIndices(){const e=this.getBondGraph(),t=this.getRings(),i=t.atomRings,n=t.rings,r=this.bonds,s=r.atomIndices1,a=r.atomIndices2,o=r.bondOrders,l=this.bondReferenceAtomIndices,c=r.atomIndices1.length;l.length=0;for(let t=0;t1)for(let i=0;i1)for(let i=0;i=0;e--)m[p++]=a[e];const g=e.rings.length;for(let t=0;t0?s[l]!==t&&s[t]!==l&&up(e,t,l):(n[l]=1,r[o++]=l,s[l]=t)}}}const dp=4;class fp{constructor(e){this.structure=e,this.dict={},this.list=[]}add(e,t,i,n="",r){const s=function(e,t,i,n=""){return e+"|"+t.join(",")+"|"+(i?1:0)+"|"+n}(e=e.toUpperCase(),t,i,n);let a=this.dict[s];if(void 0===a){const o=new op(this.structure,e,t,i,n,r);a=this.list.length,this.dict[s]=a,this.list.push(o)}return a}get(e){return this.list[e]}}class mp{constructor(e,t=0){this.structure=e,this.index=t,this.bondStore=e.bondStore,this._v12=new _t,this._v13=new _t,this._ap1=this.structure.getAtomProxy(),this._ap2=this.structure.getAtomProxy(),this._ap3=this.structure.getAtomProxy()}get atom1(){return this.structure.getAtomProxy(this.atomIndex1)}get atom2(){return this.structure.getAtomProxy(this.atomIndex2)}get atomIndex1(){return this.bondStore.atomIndex1[this.index]}set atomIndex1(e){this.bondStore.atomIndex1[this.index]=e}get atomIndex2(){return this.bondStore.atomIndex2[this.index]}set atomIndex2(e){this.bondStore.atomIndex2[this.index]=e}get bondOrder(){return this.bondStore.bondOrder[this.index]}set bondOrder(e){this.bondStore.bondOrder[this.index]=e}getOtherAtomIndex(e){return e===this.atomIndex1?this.atomIndex2:this.atomIndex1}getOtherAtom(e){return this.structure.getAtomProxy(this.getOtherAtomIndex(e.index))}getReferenceAtomIndex(){const e=this._ap1,t=this._ap2;if(e.index=this.atomIndex1,t.index=this.atomIndex2,e.residueIndex!==t.residueIndex)return;const i=e.index-e.residueAtomOffset,n=t.index-t.residueAtomOffset,r=e.residueType.getBondReferenceAtomIndex(i,n);if(void 0!==r)return r+e.residueAtomOffset;console.warn("No reference atom found",e.index,t.index)}calculateShiftDir(e=new _t){const t=this._ap1,i=this._ap2,n=this._ap3,r=this._v12,s=this._v13;t.index=this.atomIndex1,i.index=this.atomIndex2;const a=this.getReferenceAtomIndex();r.subVectors(t,i).normalize(),void 0!==a?(n.index=a,s.subVectors(t,n)):s.copy(t),s.normalize();let o=r.dot(s);return 1-Math.abs(o)<1e-5&&(s.set(1,0,0),o=r.dot(s),1-Math.abs(o)<1e-5&&(s.set(0,1,0),o=r.dot(s))),e.copy(s.sub(r.multiplyScalar(o))).normalize()}qualifiedName(){return this.atomIndex1+"="+this.atomIndex2}clone(){return new mp(this.structure,this.index)}toObject(){return{atomIndex1:this.atomIndex1,atomIndex2:this.atomIndex2,bondOrder:this.bondOrder}}}class pp{constructor(e,t=0){this.structure=e,this.index=t,this.chainStore=e.chainStore,this.residueStore=e.residueStore,this.atomStore=e.atomStore,this.residueMap=e.residueMap,this.atomMap=e.atomMap}get entity(){return this.structure.entityList[this.entityIndex]}get entityIndex(){return this.chainStore.entityIndex[this.chainIndex]}get chain(){return this.structure.getChainProxy(this.chainIndex)}get chainIndex(){return this.residueStore.chainIndex[this.index]}set chainIndex(e){this.residueStore.chainIndex[this.index]=e}get atomOffset(){return this.residueStore.atomOffset[this.index]}set atomOffset(e){this.residueStore.atomOffset[this.index]=e}get atomCount(){return this.residueStore.atomCount[this.index]}set atomCount(e){this.residueStore.atomCount[this.index]=e}get atomEnd(){return this.atomOffset+this.atomCount-1}get modelIndex(){return this.chainStore.modelIndex[this.chainIndex]}get chainname(){return this.chainStore.getChainname(this.chainIndex)}get chainid(){return this.chainStore.getChainid(this.chainIndex)}get resno(){return this.residueStore.resno[this.index]}set resno(e){this.residueStore.resno[this.index]=e}get sstruc(){return this.residueStore.getSstruc(this.index)}set sstruc(e){this.residueStore.setSstruc(this.index,e)}get inscode(){return this.residueStore.getInscode(this.index)}set inscode(e){this.residueStore.setInscode(this.index,e)}get residueType(){return this.residueMap.get(this.residueStore.residueTypeId[this.index])}get resname(){return this.residueType.resname}get hetero(){return this.residueType.hetero}get moleculeType(){return this.residueType.moleculeType}get backboneType(){return this.residueType.backboneType}get backboneStartType(){return this.residueType.backboneStartType}get backboneEndType(){return this.residueType.backboneEndType}get traceAtomIndex(){return this.residueType.traceAtomIndex+this.atomOffset}get direction1AtomIndex(){return this.residueType.direction1AtomIndex+this.atomOffset}get direction2AtomIndex(){return this.residueType.direction2AtomIndex+this.atomOffset}get backboneStartAtomIndex(){return this.residueType.backboneStartAtomIndex+this.atomOffset}get backboneEndAtomIndex(){return this.residueType.backboneEndAtomIndex+this.atomOffset}get rungEndAtomIndex(){return this.residueType.rungEndAtomIndex+this.atomOffset}get x(){let e=0;for(let t=this.atomOffset;t<=this.atomEnd;++t)e+=this.atomStore.x[t];return e/this.atomCount}get y(){let e=0;for(let t=this.atomOffset;t<=this.atomEnd;++t)e+=this.atomStore.y[t];return e/this.atomCount}get z(){let e=0;for(let t=this.atomOffset;t<=this.atomEnd;++t)e+=this.atomStore.z[t];return e/this.atomCount}eachAtom(e,t){const i=this.atomCount,n=this.atomOffset,r=this.structure._ap,s=n+i;if(t&&t.atomOnlyTest){const i=t.atomOnlyTest;for(let t=n;t0)return this.entity.isPolymer();{const e=this.residueType.moleculeType;return 3===e||4===e||5===e}}isHetero(){return 1===this.residueType.hetero}isWater(){return 1===this.residueType.moleculeType}isIon(){return 2===this.residueType.moleculeType}isSaccharide(){return 6===this.residueType.moleculeType}isStandardAminoacid(){return this.residueType.isStandardAminoacid()}isStandardBase(){return this.residueType.isStandardBase()}isHelix(){return Vh.includes(this.sstruc)}isSheet(){return $h.includes(this.sstruc)}isTurn(){return Gh.includes(this.sstruc)&&this.isProtein()}getAtomType(e){return this.atomMap.get(this.atomStore.atomTypeId[e])}getResname1(){return Zh[this.resname.toUpperCase()]||"X"}getBackboneType(e){switch(e){case-1:return this.residueType.backboneStartType;case 1:return this.residueType.backboneEndType;default:return this.residueType.backboneType}}getAtomIndexByName(e){let t=this.residueType.getAtomIndexByName(e);return void 0!==t&&(t+=this.atomOffset),t}hasAtomWithName(e){return this.residueType.hasAtomWithName(e)}getAtomnameList(){console.warn("getAtomnameList - might be expensive");const e=this.atomCount,t=this.atomOffset,i=new Array(e);for(let n=0;n=t){const t=uo(e,this.structure.getResidueProxy());if(t.index=i,t.connectedTo(this))return t}else if(i===t-1){const i=this.chainStore.residueCount[this.chainIndex],n=uo(e,this.structure.getResidueProxy());if(n.index=t+i-1,n.connectedTo(this))return n}}getBonds(){return this.residueType.getBonds(this)}getRings(){return this.residueType.getRings()}getAromaticRings(){return this.residueType.getAromaticRings(this)}qualifiedName(e=!1){let t="";return this.resname&&!e&&(t+="["+this.resname+"]"),void 0!==this.resno&&(t+=this.resno),this.inscode&&(t+="^"+this.inscode),this.chain&&(t+=":"+this.chainname),t+="/"+this.modelIndex,t}clone(){return new pp(this.structure,this.index)}toObject(){return{index:this.index,chainIndex:this.chainIndex,atomOffset:this.atomOffset,atomCount:this.atomCount,resno:this.resno,resname:this.resname,sstruc:this.sstruc}}}class gp{constructor(e,t,i){this.structure=e,this.residueIndexStart=t,this.residueIndexEnd=i,this.chainStore=e.chainStore,this.residueStore=e.residueStore,this.atomStore=e.atomStore,this.residueCount=i-t+1;const n=this.structure.getResidueProxy(this.residueIndexStart),r=this.structure.getResidueProxy(this.residueIndexEnd);this.isPrevConnected=void 0!==n.getPreviousConnectedResidue();const s=r.getNextConnectedResidue();this.isNextConnected=void 0!==s,this.isNextNextConnected=void 0!==s&&void 0!==s.getNextConnectedResidue(),this.isCyclic=r.connectedTo(n),this.__residueProxy=this.structure.getResidueProxy()}get chainIndex(){return this.residueStore.chainIndex[this.residueIndexStart]}get modelIndex(){return this.chainStore.modelIndex[this.chainIndex]}get chainname(){return this.chainStore.getChainname(this.chainIndex)}isProtein(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isProtein()}isCg(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isCg()}isNucleic(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isNucleic()}getMoleculeType(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.moleculeType}getBackboneType(e){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.getBackboneType(e)}getAtomIndexByType(e,t){this.isCyclic?-1===e?e=this.residueCount-1:e===this.residueCount&&(e=0):(-1!==e||this.isPrevConnected||(e+=1),e!==this.residueCount||this.isNextNextConnected||(e-=1));const i=this.__residueProxy;let n;switch(i.index=this.residueIndexStart+e,t){case"trace":n=i.traceAtomIndex;break;case"direction1":n=i.direction1AtomIndex;break;case"direction2":n=i.direction2AtomIndex;break;default:n=i.getAtomIndexByName(t)}return n}eachAtom(e,t){this.eachResidue((function(i){i.eachAtom(e,t)}))}eachAtomN(e,t,i){const n=this.residueCount,r=new Array(e);for(let t=0;t1&&e(new gp(s,i,c.index)),i=n)):(a!==Oh&&c.index-i>1&&e(new gp(s,i,c.index)),i=n)}n-i>1&&this.structure.getResidueProxy(i).backboneEndType&&e(new gp(s,i,n))}qualifiedName(){return":"+this.chainname+"/"+this.modelIndex}clone(){return new _p(this.structure,this.index)}toObject(){return{index:this.index,residueOffset:this.residueOffset,residueCount:this.residueCount,chainname:this.chainname}}}class yp{constructor(e,t=0){this.structure=e,this.index=t,this.modelStore=e.modelStore,this.chainStore=e.chainStore,this.residueStore=e.residueStore}get chainOffset(){return this.modelStore.chainOffset[this.index]}set chainOffset(e){this.modelStore.chainOffset[this.index]=e}get chainCount(){return this.modelStore.chainCount[this.index]}set chainCount(e){this.modelStore.chainCount[this.index]=e}get residueOffset(){return this.chainStore.residueOffset[this.chainOffset]}get atomOffset(){return this.residueStore.atomOffset[this.residueOffset]}get chainEnd(){return this.chainOffset+this.chainCount-1}get residueEnd(){return this.chainStore.residueOffset[this.chainEnd]+this.chainStore.residueCount[this.chainEnd]-1}get atomEnd(){return this.residueStore.atomOffset[this.residueEnd]+this.residueStore.atomCount[this.residueEnd]-1}get residueCount(){return 0===this.chainCount?0:this.residueEnd-this.residueOffset+1}get atomCount(){return 0===this.residueCount?0:this.atomEnd-this.atomOffset+1}eachAtom(e,t){this.eachChain((function(i){i.eachAtom(e,t)}),t)}eachResidue(e,t){this.eachChain((function(i){i.eachResidue(e,t)}),t)}eachPolymer(e,t){if(t&&t.chainOnlyTest){const i=t.chainOnlyTest;this.eachChain((function(n){i(n)&&n.eachPolymer(e,t)}))}else this.eachChain((function(i){i.eachPolymer(e,t)}))}eachChain(e,t){const i=this.chainCount,n=this.chainOffset,r=this.structure._cp,s=n+i;if(t&&t.test){const i=t.chainOnlyTest;if(i)for(let t=n;t{const i=3*t;o.index=e,c&&o.positionToArray(c,i),u&&s.atomColorToArray(o,u,i),h&&(h.array[t]=e),d&&(d[t]=r.atomRadius(o)),f&&(f[t]=e)})),a}getBondData(e){const t=Object.assign({},e);t.colorParams&&(t.colorParams.structure=this.getStructure());const i=t.what,n=uo(t.bondSet,this.bondSet),r=uo(t.multipleBond,"off"),s="off"!==r,a="offset"===r,o=uo(t.bondScale,.4),l=uo(t.bondSpacing,1);let c,u;const h={},d=this.getBondProxy();t.bondStore&&(d.bondStore=t.bondStore);const f=this.getAtomProxy(),m=this.getAtomProxy();let p;if(s){const e=d.bondStore.bondOrder;p=0,n.forEach((function(t){p+=e[t]}))}else p=n.getSize();i&&!i.position||(h.position1=new Float32Array(3*p),h.position2=new Float32Array(3*p)),i&&!i.color||!t.colorParams||(h.color=new Float32Array(3*p),h.color2=new Float32Array(3*p),u=$l.getScheme(t.colorParams)),i&&!i.picking||(h.picking=new Wd(new Float32Array(p),this.getStructure(),t.bondStore)),(!i||i.radius||s&&i.position)&&(c=new cm(t.radiusParams)),i&&!i.radius||(h.radius=new Float32Array(p),t.radius2&&(h.radius2=new Float32Array(p)));const{position1:g,position2:_,color:y,color2:v,picking:b,radius:x,radius2:w}=h;let S,M,A,C,T,P,E=0;const I=new _t,D=new _t,R=new _t;return n.forEach((e=>{if(M=3*E,d.index=e,f.index=d.atomIndex1,m.index=d.atomIndex2,C=d.bondOrder,g)if(s&&C>1){const e=c.atomRadius(f);P=e*o/(.5*C),d.calculateShiftDir(R),a?(T=2*l*e,R.multiplyScalar(T),R.negate(),D.subVectors(m,f).multiplyScalar(Math.max(.1,T/1.88)),f.positionToArray(g,M),m.positionToArray(_,M),C>=2&&(I.addVectors(f,R).add(D).toArray(g,M+3),I.addVectors(m,R).sub(D).toArray(_,M+3),C>=3&&(I.subVectors(f,R).add(D).toArray(g,M+6),I.subVectors(m,R).sub(D).toArray(_,M+6)))):(T=(l-o)*e,R.multiplyScalar(T),2===C?(I.addVectors(f,R).toArray(g,M),I.subVectors(f,R).toArray(g,M+3),I.addVectors(m,R).toArray(_,M),I.subVectors(m,R).toArray(_,M+3)):3===C?(f.positionToArray(g,M),I.addVectors(f,R).toArray(g,M+3),I.subVectors(f,R).toArray(g,M+6),m.positionToArray(_,M),I.addVectors(m,R).toArray(_,M+3),I.subVectors(m,R).toArray(_,M+6)):(f.positionToArray(g,M),m.positionToArray(_,M)))}else f.positionToArray(g,M),m.positionToArray(_,M);if(y&&v&&(u.bondColorToArray(d,1,y,M),u.bondColorToArray(d,0,v,M),s&&C>1))for(S=1;S1))for(S=1;S1))for(P=x[E]*o/(a?1:.5*C),S=a?1:0;S1))for(P=w[E]*o/(a?1:.5*C),S=a?1:0;S{const t=e.x,i=e.y,c=e.z;ta&&(a=t),i>o&&(o=i),c>l&&(l=c)}),t),i.min.set(n,r,s),i.max.set(a,o,l),e.Debug&&Fl.timeEnd("getBoundingBox"),i}getPrincipalAxes(t){e.Debug&&Fl.time("getPrincipalAxes");let i=0;const n=new af(3,this.atomCount),r=n.data;return this.eachAtom((e=>{r[i+0]=e.x,r[i+1]=e.y,r[i+2]=e.z,i+=3}),t),e.Debug&&Fl.timeEnd("getPrincipalAxes"),new dm(n)}atomCenter(e){return e?this.getBoundingBox(e).getCenter(new _t):this.center.clone()}hasCoords(){if(void 0===this._hasCoords){const e=this.atomStore;this._hasCoords=0!==Dc(e.x)||0!==Ic(e.x)||0!==Dc(e.y)||0!==Ic(e.y)||0!==Dc(e.z)||0!==Ic(e.z)||e.count/this.modelStore.count==1}return this._hasCoords}getSequence(e){const t=[],i=this.getResidueProxy();return this.eachAtom((function(e){i.index=e.residueIndex,e.index===i.traceAtomIndex&&t.push(i.getResname1())}),e),t}getAtomIndices(e){if(e&&e.string){const t=[];return this.eachAtom((function(e){t.push(e.index)}),e),new Uint32Array(t)}{const e={what:{index:!0}};return this.getAtomData(e).index}}getChainnameCount(e){const t=new Set;return this.eachChain((function(e){e.residueCount&&t.add(e.chainname)}),e),t.size}updatePosition(e,t=!0){let i=0;this.eachAtom((function(t){t.positionFromArray(e,i),i+=3}),void 0),this._hasCoords=void 0,t&&this.refreshPosition()}refreshPosition(){this.getBoundingBox(void 0,this.boundingBox),this.boundingBox.getCenter(this.center),this.spatialHash=new Ch(this.atomStore,this.boundingBox),this.signals.refreshed.dispatch(this)}dispose(){this.frames&&(this.frames.length=0),this.boxes&&(this.boxes.length=0),this.bondStore.dispose(),this.backboneBondStore.dispose(),this.rungBondStore.dispose(),this.atomStore.dispose(),this.residueStore.dispose(),this.chainStore.dispose(),this.modelStore.dispose(),delete this.bondSet,delete this.atomSet}}const bp=new bt,xp=[vh,ph,bh,yh,xh,gh,mh,_h,Sh,wh,Mh,Ah],wp={aspectRatio:1.5,sphereDetail:2,radialSegments:50,disableImpostor:!1,openEnded:!1,dashedCylinder:!1,labelParams:{},pointSize:2,sizeAttenuation:!1,useTexture:!0,linewidth:2};class Sp{constructor(e="shape",t={}){this.boundingBox=new bt,this.bufferList=[],this.meshCount=0,this._primitiveData={},this.name=e,this.parameters=ho(t,wp),xp.forEach((e=>{Object.keys(e.fields).forEach((t=>{this._primitiveData[e.getShapeKey(t)]=[]})),this._primitiveData[e.getShapeKey("name")]=[]}))}addBuffer(e){this.bufferList.push(e);const t=e.geometry;return t.boundingBox||t.computeBoundingBox(),this.boundingBox.union(t.boundingBox),this}addMesh(e,t,i,n,r){let s;e=Eo(e),t=Eo(t),Array.isArray(i)&&(i=So(i,e.length)),n&&(n=Eo(n)),s=void 0===n||0==n.length?{position:e,color:t,index:i}:{position:e,color:t,index:i,normal:n};const a=new Zd(this,Object.assign({serial:this.meshCount,name:r},s)),o=new Bf(Object.assign({picking:a},s));return this.bufferList.push(o),bp.setFromArray(e),this.boundingBox.union(bp),this.meshCount+=1,this}addSphere(e,t,i,n){return mh.objectToShape(this,{position:e,color:t,radius:i,name:n}),this}addEllipsoid(e,t,i,n,r,s){return xh.objectToShape(this,{position:e,color:t,radius:i,majorAxis:n,minorAxis:r,name:s}),this}addTorus(e,t,i,n,r,s){return wh.objectToShape(this,{position:e,color:t,radius:i,majorAxis:n,minorAxis:r,name:s}),this}addCylinder(e,t,i,n,r){return yh.objectToShape(this,{position1:e,position2:t,color:i,radius:n,name:r}),this}addCone(e,t,i,n,r){return bh.objectToShape(this,{position1:e,position2:t,color:i,radius:n,name:r}),this}addArrow(e,t,i,n,r){return vh.objectToShape(this,{position1:e,position2:t,color:i,radius:n,name:r}),this}addBox(e,t,i,n,r,s){return ph.objectToShape(this,{position:e,color:t,size:i,heightAxis:n,depthAxis:r,name:s}),this}addOctahedron(e,t,i,n,r,s){return gh.objectToShape(this,{position:e,color:t,size:i,heightAxis:n,depthAxis:r,name:s}),this}addTetrahedron(e,t,i,n,r,s){return _h.objectToShape(this,{position:e,color:t,size:i,heightAxis:n,depthAxis:r,name:s}),this}addText(e,t,i,n){return Sh.objectToShape(this,{position:e,color:t,size:i,text:n}),this}addPoint(e,t,i){return Mh.objectToShape(this,{position:e,color:t,name:i}),this}addWideline(e,t,i,n,r){return this.parameters.linewidth=n,Ah.objectToShape(this,{position1:e,position2:t,color:i,name:r}),this}addLabel(e,t,i,n){return console.warn("Shape.addLabel is deprecated, use .addText instead"),this.addText(e,t,i,n)}getBufferList(){const e=[];return xp.forEach((t=>{this._primitiveData[t.getShapeKey("color")].length&&e.push(t.bufferFromShape(this,this.parameters))})),this.bufferList.concat(e)}dispose(){this.bufferList.forEach((function(e){e.dispose()})),this.bufferList.length=0,xp.forEach((e=>{Object.keys(e.fields).forEach((t=>{this._primitiveData[e.getShapeKey(t)].length=0})),this._primitiveData[e.getShapeKey("name")].length=0}))}get center(){return this._center||(this._center=this.boundingBox.getCenter(new _t)),this._center}get type(){return"Shape"}}class Mp extends Nu{constructor(e,t,i){Array.isArray(e)||(e=[e]),super(e,t,i),this.type="buffer",this.parameters=Object.assign({},this.parameters,{colorScheme:null,colorScale:null,colorValue:null,colorDomain:null,colorMode:null}),this.buffer=e,this.init(i)}init(e){super.init(e),this.build()}create(){this.bufferList.push.apply(this.bufferList,this.buffer)}attach(e){this.bufferList.forEach((e=>{this.viewer.add(e),e.setParameters(this.getBufferParams())})),this.setVisibility(this.visible),e()}}const Ap=new qt,Cp=new He;class Tp extends Bf{constructor(e,t={},i){super(function(e,t){const i=t.attributes.position.array,n=t.index?t.index.array:void 0,r=e.position.length/3,s=i.length/3,a=r*s,o=new Float32Array(3*a),l=new Float32Array(3*a),c=new Float32Array(3*a);let u;return n&&(u=So(r*n.length,a)),{position:o,color:c,index:u,normal:l,primitiveId:e.primitiveId||Cc(r,s),picking:e.picking}}(e,i),t),this.updateNormals=!1;const n=i.attributes.position.array,r=i.attributes.normal.array,s=i.index?i.index.array:void 0;this.geoPosition=n,this.geoNormal=r,this.geoIndex=s,this.positionCount=e.position.length/3,this.geoPositionCount=n.length/3,this.transformedGeoPosition=new Float32Array(3*this.geoPositionCount),this.transformedGeoNormal=new Float32Array(3*this.geoPositionCount);const a=this.geometry.attributes;if(this.meshPosition=a.position.array,this.meshColor=a.color.array,this.meshNormal=a.normal.array,this.setAttributes(e),s){const e=this.geometry.getIndex();if(!e)return void Fl.error("Index is null");this.meshIndex=e.array,this.makeIndex()}}setAttributes(e={},t=!1){const i=this.geometry.attributes;let n,r,s,a,o,l,c,u,h;const d=this.updateNormals;e.position&&(n=e.position,s=this.geoPosition,c=this.meshPosition,o=this.transformedGeoPosition,i.position.needsUpdate=!0,(d||t)&&(a=this.geoNormal,h=this.meshNormal,l=this.transformedGeoNormal,i.normal.needsUpdate=!0)),e.color&&(r=e.color,u=this.meshColor,i.color.needsUpdate=!0);const f=this.positionCount,m=this.geoPositionCount;for(let e=0;e 0.0 ){\ncameraPos = rayDirection * posT + rayOrigin;\ninterior = true;\nflag2 = true;\n}\n#else\nif( calcDepth( cameraPos ) <= 0.0 ){\ncameraPos = rayDirection * posT + rayOrigin;\ninterior = true;\n}\n#endif\ncameraNormal = normalize( cameraPos - cameraSpherePos );\ncameraNormal *= float(!interior) * 2.0 - 1.0;\nreturn !interior;\n}\nvoid main(void){\nbool flag = Impostor( cameraPos, cameraNormal );\n#ifdef NEAR_CLIP\nif( calcClip( cameraPos ) > 0.0 )\ndiscard;\n#endif\ngl_FragDepthEXT = calcDepth( cameraPos );\nif( !flag ){\n#ifdef NEAR_CLIP\nif( flag2 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / vRadius ) );\n}else if( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n#else\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n#endif\n}\nif (gl_FragDepthEXT < 0.0)\ndiscard;\nif (gl_FragDepthEXT > 1.0)\ndiscard;\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vNormal = cameraNormal;\nvec3 vViewPosition = -cameraPos;\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\n#include normal_fragment_begin\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n#endif\n}");class Dp extends Ff{constructor(e,t,i={}){super(t,i),this.index=So(this.indexSize,this.attributeSize),this.makeIndex(),this.initIndex(this.index),this.addAttributes({mapping:{type:e,value:null}}),this.setAttributes({primitiveId:Ac(this.size)})}get attributeSize(){return this.size*this.mappingSize}get indexSize(){return this.size*this.mappingIndicesSize}addAttributes(e){const t={};for(const i in e){const n=e[i];t[i]={type:n.type,value:null}}super.addAttributes(t)}getAttributeIndex(e){return 3*e*this.mappingSize}setAttributes(e){e&&!e.position&&e.position1&&e.position2&&(e.position=xc(e.position1,e.position2));const t=this.size,i=this.mappingSize,n=this.geometry.attributes;let r,s,a,o,l,c,u;for(const h in e)if("index"!==h&&"picking"!==h){s=e[h],r=n[h],a=r.itemSize,o=r.array;for(let e=0;e0&&this.parameters.alphaTest<=1&&(t.USE_ALPHATEST=1),t}setUniforms(e){e&&void 0!==e.edgeBleach&&(this.makeTexture(),e.map=this.tex),super.setUniforms(e)}dispose(){super.dispose(),this.tex&&this.tex.dispose()}}Yl.add("point",Up);class Vp extends Nu{constructor(e,t,i){super(e,t,i),this.type="dot",this.parameters=Object.assign({thresholdType:{type:"select",rebuild:!0,options:{value:"value",sigma:"sigma"}},thresholdMin:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},thresholdMax:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},thresholdOut:{type:"boolean",rebuild:!0},dotType:{type:"select",rebuild:!0,options:{"":"",sphere:"sphere",point:"point"}},radiusType:{type:"select",options:{"":"",value:"value","abs-value":"abs-value","value-min":"value-min",deviation:"deviation",size:"size"}},radius:{type:"number",precision:3,max:10,min:.001,property:"size"},scale:{type:"number",precision:3,max:10,min:.001},sphereDetail:!0,disableImpostor:!0,pointSize:{type:"number",precision:1,max:100,min:0,buffer:!0},sizeAttenuation:{type:"boolean",buffer:!0},sortParticles:{type:"boolean",rebuild:!0},useTexture:{type:"boolean",buffer:!0},alphaTest:{type:"range",step:.001,max:1,min:0,buffer:!0},forceTransparent:{type:"boolean",buffer:!0},edgeBleach:{type:"range",step:.001,max:1,min:0,buffer:!0}},this.parameters,{colorScheme:{type:"select",update:"color",options:{"":"",value:"value",uniform:"uniform",random:"random"}}}),e instanceof Df?(this.surface=void 0,this.volume=new fm(e)):(this.surface=e,this.volume=void 0),this.init(i)}init(e){var t=e||{};t.colorScheme=uo(t.colorScheme,"uniform"),t.colorValue=uo(t.colorValue,14540253),this.thresholdType=uo(t.thresholdType,"sigma"),this.thresholdMin=uo(t.thresholdMin,2),this.thresholdMax=uo(t.thresholdMax,1/0),this.thresholdOut=uo(t.thresholdOut,!1),this.dotType=uo(t.dotType,"point"),this.radius=uo(t.radius,.1),this.scale=uo(t.scale,1),this.pointSize=uo(t.pointSize,1),this.sizeAttenuation=uo(t.sizeAttenuation,!0),this.sortParticles=uo(t.sortParticles,!1),this.useTexture=uo(t.useTexture,!1),this.alphaTest=uo(t.alphaTest,.5),this.forceTransparent=uo(t.forceTransparent,!1),this.edgeBleach=uo(t.edgeBleach,0),super.init(t),this.build()}attach(e){this.bufferList.forEach((e=>{this.viewer.add(e)})),this.setVisibility(this.visible),e()}create(){var e={};if(this.volume){var t,i,n=this.volume;"sigma"===this.thresholdType?(t=n.getValueForSigma(this.thresholdMin),i=n.getValueForSigma(this.thresholdMax)):(t=this.thresholdMin,i=this.thresholdMax),n.setFilter(t,i,this.thresholdOut),Object.assign(e,{position:n.getDataPosition(),color:n.getDataColor(this.getColorParams())}),"sphere"===this.dotType&&Object.assign(e,{radius:n.getDataSize(this.radius,this.scale),picking:n.getDataPicking()})}else{var r=this.surface;Object.assign(e,{position:r.getPosition(),color:r.getColor(this.getColorParams())}),"sphere"===this.dotType&&Object.assign(e,{radius:r.getSize(this.radius,this.scale),picking:r.getPicking()})}"sphere"===this.dotType?this.dotBuffer=new Np(e,this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!1})):this.dotBuffer=new Up(e,this.getBufferParams({pointSize:this.pointSize,sizeAttenuation:this.sizeAttenuation,sortParticles:this.sortParticles,useTexture:this.useTexture,alphaTest:this.alphaTest,forceTransparent:this.forceTransparent,edgeBleach:this.edgeBleach})),this.bufferList.push(this.dotBuffer)}update(e={}){if(0===this.bufferList.length)return;const t={};e.color&&(this.volume?Object.assign(t,{color:this.volume.getDataColor(this.getColorParams())}):Object.assign(t,{color:this.surface.getColor(this.getColorParams())})),"sphere"===this.dotType&&(e.radius||e.scale)&&(this.volume?Object.assign(t,{radius:this.volume.getDataSize(this.radius,this.scale)}):Object.assign(t,{radius:this.surface.getSize(this.radius,this.scale)})),this.dotBuffer.setAttributes(t)}setParameters(e,t={},i){return e&&void 0!==e.thresholdType&&this.volume instanceof Df&&("value"===this.thresholdType&&"sigma"===e.thresholdType?(this.thresholdMin=this.volume.getSigmaForValue(this.thresholdMin),this.thresholdMax=this.volume.getSigmaForValue(this.thresholdMax)):"sigma"===this.thresholdType&&"value"===e.thresholdType&&(this.thresholdMin=this.volume.getValueForSigma(this.thresholdMin),this.thresholdMax=this.volume.getValueForSigma(this.thresholdMax)),this.thresholdType=e.thresholdType),e&&void 0!==e.radiusType&&("radius"===e.radiusType?this.radius=.1:this.radius=parseFloat(e.radiusType),t.radius=!0,"sphere"!==this.dotType||Ol&&!this.disableImpostor||(i=!0)),e&&void 0!==e.radius&&(t.radius=!0,"sphere"!==this.dotType||Ol&&!this.disableImpostor||(i=!0)),e&&void 0!==e.scale&&(t.scale=!0,"sphere"!==this.dotType||Ol&&!this.disableImpostor||(i=!0)),super.setParameters(e,t,i),this}}Wl.add("shader/Image.vert","uniform float clipRadius;\nuniform vec3 clipCenter;\nvarying vec2 vUv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\nvoid main() {\n#include begin_vertex\n#include project_vertex\nvUv = uv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n}"),Wl.add("shader/Image.frag","uniform sampler2D map;\nuniform float opacity;\nuniform vec2 mapSize;\nuniform float clipNear;\nuniform float clipRadius;\nvarying vec2 vUv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\nuniform sampler2D pickingMap;\nuniform float objectId;\n#else\n#include fog_pars_fragment\n#endif\n#if defined( CUBIC_INTERPOLATION )\n#if defined( CATMULROM_FILTER ) || defined( MITCHELL_FILTER )\n#if defined( CATMULROM_FILTER )\nconst float B = 0.0;\nconst float C = 0.5;\n#elif defined( MITCHELL_FILTER )\nconst float B = 0.333;\nconst float C = 0.333;\n#endif\nfloat applyFilter( float x ){\nfloat f = x;\nif( f < 0.0 ){\nf = -f;\n}\nif( f < 1.0 ){\nreturn ( ( 12.0 - 9.0 * B - 6.0 * C ) * ( f * f * f ) +\n( -18.0 + 12.0 * B + 6.0 *C ) * ( f * f ) +\n( 6.0 - 2.0 * B ) ) / 6.0;\n}else if( f >= 1.0 && f < 2.0 ){\nreturn ( ( -B - 6.0 * C ) * ( f * f * f )\n+ ( 6.0 * B + 30.0 * C ) * ( f *f ) +\n( - ( 12.0 * B ) - 48.0 * C ) * f +\n8.0 * B + 24.0 * C ) / 6.0;\n}else{\nreturn 0.0;\n}\n}\n#elif defined( BSPLINE_FILTER )\nfloat applyFilter( float x ){\nfloat f = x;\nif( f < 0.0 ){\nf = -f;\n}\nif( f >= 0.0 && f <= 1.0 ){\nreturn ( 2.0 / 3.0 ) + ( 0.5 ) * ( f * f * f ) - ( f * f );\n}else if( f > 1.0 && f <= 2.0 ){\nreturn 1.0 / 6.0 * pow( ( 2.0 - f ), 3.0 );\n}\nreturn 1.0;\n}\n#else\nfloat applyFilter( float x ){\nreturn 1.0;\n}\n#endif\nvec4 biCubic( sampler2D tex, vec2 texCoord ){\nvec2 texelSize = 1.0 / mapSize;\ntexCoord -= texelSize / 2.0;\nvec4 nSum = vec4( 0.0 );\nfloat nDenom = 0.0;\nvec2 cell = fract( texCoord * mapSize );\nfor( float m = -1.0; m <= 2.0; ++m ){\nfor( float n = -1.0; n <= 2.0; ++n ){\nvec4 vecData = texture2D(\ntex, texCoord + texelSize * vec2( m, n )\n);\nfloat c = applyFilter( m - cell.x ) * applyFilter( -n + cell.y );\nnSum += vecData * c;\nnDenom += c;\n}\n}\nreturn nSum / nDenom;\n}\n#endif\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( CUBIC_INTERPOLATION )\ngl_FragColor = biCubic( map, vUv );\n#else\ngl_FragColor = texture2D( map, vUv );\n#endif\n#if defined( PICKING )\nif( gl_FragColor.a < 0.3 )\ndiscard;\ngl_FragColor = vec4( texture2D( pickingMap, vUv ).xyz, objectId );\n#else\nif( gl_FragColor.a < 0.01 )\ndiscard;\ngl_FragColor.a *= opacity;\n#include fog_fragment\n#endif\n}");const $p=new Uint16Array([0,1,2,1,3,2]),Gp=new Float32Array([0,1,0,0,1,1,1,0]),Hp=Object.assign({filter:"nearest",forceTransparent:!0},Of),jp=Object.assign({filter:{updateShader:!0,uniform:!0}},Nf);class Wp extends Ff{constructor(e,t){super({position:e.position,index:$p,picking:e.picking},t),this.parameterTypes=jp,this.alwaysTransparent=!0,this.hasWireframe=!1,this.vertexShader="Image.vert",this.fragmentShader="Image.frag";const{imageData:i,width:n,height:r}=e,s=new Ma(i,n,r);s.flipY=!0,this.tex=s;const a=i.length,o=new Uint8Array(a);for(let e=0;e>16&255,o[e+1]=t>>8&255,o[e+2]=255&t}const l=new Ma(o,n,r);l.flipY=!0,l.minFilter=U,l.magFilter=U,this.pickingTex=l,this.addUniforms({map:{value:s},pickingMap:{value:l},mapSize:{value:new Ge(n,r)}}),this.geometry.setAttribute("uv",new $i(Gp,2))}get defaultParameters(){return Hp}getDefines(e){const t=super.getDefines(e),i=this.parameters.filter;return i.startsWith("cubic")&&(t.CUBIC_INTERPOLATION=1,i.endsWith("bspline")?t.BSPLINE_FILTER=1:i.endsWith("catmulrom")?t.CATMULROM_FILTER=1:i.endsWith("mitchell")&&(t.MITCHELL_FILTER=1)),t}updateTexture(){const e=this.tex,t=this.parameters.filter;t.startsWith("cubic")?(e.minFilter=U,e.magFilter=U):"linear"===t?(e.minFilter=G,e.magFilter=G):(e.minFilter=U,e.magFilter=U),e.needsUpdate=!0,this.pickingTex.needsUpdate=!0}makeMaterial(){super.makeMaterial(),this.updateTexture();const e=this.material;e.uniforms.map.value=this.tex,e.blending=1,e.needsUpdate=!0;const t=this.wireframeMaterial;t.uniforms.map.value=this.tex,t.blending=1,t.needsUpdate=!0;const i=this.pickingMaterial;i.uniforms.map.value=this.tex,i.uniforms.pickingMap.value=this.pickingTex,i.blending=1,i.needsUpdate=!0}setUniforms(e){e&&void 0!==e.filter&&(this.updateTexture(),e.map=this.tex),super.setUniforms(e)}}class qp{constructor(e,t){const i=t||{};this.dimension=uo(i.dimension,"x"),this.positionType=uo(i.positionType,"percent"),this.position=uo(i.position,30),this.thresholdType=uo(i.thresholdType,"sigma"),this.thresholdMin=uo(i.thresholdMin,-1/0),this.thresholdMax=uo(i.thresholdMax,1/0),this.normalize=uo(i.normalize,!1),this.volume=e}getPositionFromCoordinate(e){const t=this.dimension,i=this.volume,n=i.matrix,r=(new _t).setFromMatrixPosition(n)[t],s=(new _t).setFromMatrixScale(n)[t];let a;return a="x"===t?i.nx:"y"===t?i.ny:i.nz,Math.round(((e-r)/(a/100)+1)/s)}getData(e){e=e||{};const t=this.volume,i=t.data,n=t.matrix;let r;function s(e){return Math.round(e/100*(r-1))}function a(e,i,n,r){return 3*(n*t.ny*t.nx+i*t.nx+e)+r}r="coordinate"===this.positionType?this.getPositionFromCoordinate(this.position):this.position;const o=new Float32Array(12),l=new _t;let c,u,h,d,f,m=0,p=0,g=0,_=t.nx,y=t.ny,v=t.nz;function b(e,t,i,r){l.set(e,t,i).applyMatrix4(n).toArray(o,r)}"x"===this.dimension?(h=s(t.nx),d=t.ny-1,f=t.nz-1,c=t.nz,u=t.ny,m=h,_=m+1,b(h,0,0,0),b(h,d,0,3),b(h,0,f,6),b(h,d,f,9)):"y"===this.dimension?(h=t.nx-1,d=s(t.ny),f=t.nz-1,c=t.nz,u=t.nx,p=d,y=p+1,b(0,d,0,0),b(h,d,0,3),b(0,d,f,6),b(h,d,f,9)):"z"===this.dimension&&(h=t.nx-1,d=t.ny-1,f=s(t.nz),c=t.nx,u=t.ny,g=f,v=g+1,b(0,0,f,0),b(0,d,f,3),b(h,0,f,6),b(h,d,f,9));let x=0,w=0;const S=new Uint8Array(c*u*4),M=new Float32Array(c*u);let A,C;"sigma"===this.thresholdType?(A=t.getValueForSigma(this.thresholdMin),C=t.getValueForSigma(this.thresholdMax)):(A=this.thresholdMin,C=this.thresholdMax);const T=Object.assign({},e.colorParams,{volume:t});this.normalize&&(T.domain=[0,1]);const P=$l.getScheme(T),E=new Float32Array(3),I=P.getScale();let D,R=0,L=0;if(this.normalize){R=1/0,D=-1/0;for(let e=p;eD&&(D=r)}L=D-R}for(let e=p;eA&&s{this.viewer.add(e)})),this.setVisibility(this.visible),e()}create(){const e=new qp(this.volume,{positionType:this.positionType,position:this.position,dimension:this.dimension,thresholdType:this.thresholdType,thresholdMin:this.thresholdMin,thresholdMax:this.thresholdMax,normalize:this.normalize}),t=new Wp(e.getData({colorParams:this.getColorParams()}),this.getBufferParams({filter:this.filter}));this.bufferList.push(t)}}function Yp(e){Fl.error(`makeRepresentation: representation type ${e} unknown`)}const Kp={name:"some element",status:""};class Zp{constructor(e,t={}){this.stage=e,this.signals={statusChanged:new Yo.Signal,nameChanged:new Yo.Signal,disposed:new Yo.Signal},this.parameters=ho(t,this.defaultParameters),this.uuid=Oo()}get defaultParameters(){return Kp}get name(){return this.parameters.name}setStatus(e){return this.parameters.status=e,this.signals.statusChanged.dispatch(e),this}setName(e){return this.parameters.name=e,this.signals.nameChanged.dispatch(e),this}dispose(){this.signals.disposed.dispatch()}}const Qp=Object.assign({visible:!0},Kp);class Jp extends Zp{constructor(e,t,i={},n){super(e,Object.assign({name:t.type},i)),this.parent=n,this.signals=Object.assign({visibilityChanged:new Yo.Signal,parametersChanged:new Yo.Signal},this.signals),this.setRepresentation(t)}get defaultParameters(){return Qp}get visible(){return this.parameters.visible}get type(){return"representation"}getType(){return this.repr.type}setRepresentation(e){this._disposeRepresentation(),this.repr=e,this.stage.tasks.listen(this.repr.tasks),this.updateVisibility()}_disposeRepresentation(){this.repr&&(this.stage.tasks.unlisten(this.repr.tasks),this.repr.dispose())}dispose(){this.parent&&this.parent.hasRepresentation(this)?this.parent.removeRepresentation(this):(this._disposeRepresentation(),this.signals.disposed.dispatch())}setVisibility(e){return this.parameters.visible=e,this.updateVisibility(),this.signals.visibilityChanged.dispatch(this.parameters.visible),this}getVisibility(){return this.parent?this.parent.parameters.visible&&this.parameters.visible:this.parameters.visible}toggleVisibility(){return this.setVisibility(!this.parameters.visible)}updateVisibility(){this.repr.setVisibility(this.getVisibility())}update(e){return this.repr.update(e),this}build(e){return this.repr.build(e),this}setSelection(e){const t=this.repr;return t.setSelection&&t.setSelection(e),this}setParameters(e){return this.repr.setParameters(e),this.signals.parametersChanged.dispatch(this.repr.getParameters()),this}getParameters(){return this.repr.getParameters()}setColor(e){return this.repr.setColor(e),this}}const eg=new qt,tg=new _t,ig={name:"",status:"",visible:!0};class ng{constructor(e,t,i={}){this.stage=e,this.object=t,this.signals={representationAdded:new Yo.Signal,representationRemoved:new Yo.Signal,visibilityChanged:new Yo.Signal,matrixChanged:new Yo.Signal,statusChanged:new Yo.Signal,nameChanged:new Yo.Signal,disposed:new Yo.Signal},this.reprList=[],this.annotationList=[],this.matrix=new qt,this.position=new _t,this.quaternion=new gt,this.scale=new _t(1,1,1),this.transform=new qt,this.parameters=ho(i,this.defaultParameters),this.uuid=Oo(),this.viewer=e.viewer,this.controls=new om(this)}get defaultParameters(){return ig}get name(){return this.parameters.name}get status(){return this.parameters.status}get visible(){return this.parameters.visible}setPosition(e){return Array.isArray(e)?this.position.fromArray(e):this.position.copy(e),this.updateMatrix(),this}setRotation(e){if(Array.isArray(e))if(3===e.length){const t=(new ni).fromArray(e);this.quaternion.setFromEuler(t)}else this.quaternion.fromArray(e);else e instanceof ni?this.quaternion.setFromEuler(e):this.quaternion.copy(e);return this.updateMatrix(),this}setScale(e){return this.scale.set(e,e,e),this.updateMatrix(),this}setTransform(e){return this.transform.copy(e),this.updateMatrix(),this}updateMatrix(){const e=this.getCenterUntransformed(tg);this.matrix.makeTranslation(-e.x,-e.y,-e.z),eg.makeRotationFromQuaternion(this.quaternion),this.matrix.premultiply(eg),eg.makeScale(this.scale.x,this.scale.y,this.scale.z),this.matrix.premultiply(eg);const t=this.position;eg.makeTranslation(t.x+e.x,t.y+e.y,t.z+e.z),this.matrix.premultiply(eg),this.matrix.premultiply(this.transform),this.updateRepresentationMatrices(),this.stage.viewer.updateBoundingBox(),this.signals.matrixChanged.dispatch(this.matrix)}updateRepresentationMatrices(){this.reprList.forEach((e=>{e.setParameters({matrix:this.matrix})}))}addAnnotation(e,t,i){const n=new nm(this,e,t,i);return this.annotationList.push(n),n}eachAnnotation(e){this.annotationList.slice().forEach(e)}removeAnnotation(e){const t=this.annotationList.indexOf(e);-1!==t&&(this.annotationList.splice(t,1),e.dispose())}removeAllAnnotations(){this.eachAnnotation((e=>e.dispose())),this.annotationList.length=0}_addRepresentation(t,i,n,r=!1){const s=n||{},a=this.stage.getParameters();s.matrix=this.matrix.clone(),s.quality=s.quality||a.quality,s.disableImpostor=uo(s.disableImpostor,!a.impostor),s.useWorker=uo(s.useWorker,a.workerDefault),s.visible=uo(s.visible,!0);const o=Object.assign({},s,{visible:this.parameters.visible&&s.visible}),l=function(t,i,n,r){var s;if(e.Debug&&Fl.time("makeRepresentation "+t),i instanceof vp){if(!(s=Hl.get(t)))return void Yp(t)}else if(i instanceof Ef)if("surface"===t)s=Hf;else{if("dot"!==t)return void Yp(t);s=Vp}else if(i instanceof Df)if("surface"===t)s=Hf;else if("dot"===t)s=Vp;else{if("slice"!==t)return void Yp(t);s=Xp}else if(i instanceof Sp)s=Mp,i=i.getBufferList();else{if("buffer"!==t)return void Fl.error("makeRepresentation: object "+i+" unknown");s=Mp}const a=new s(i,n,r);return e.Debug&&Fl.timeEnd("makeRepresentation "+t),a}(t,i,this.viewer,o),c=new Jp(this.stage,l,s,this);return r||(this.reprList.push(c),this.signals.representationAdded.dispatch(c)),c}addBufferRepresentation(e,t){return this._addRepresentation.call(this,"buffer",e,t)}hasRepresentation(e){return-1!==this.reprList.indexOf(e)}eachRepresentation(e){this.reprList.slice().forEach(e)}removeRepresentation(e){const t=this.reprList.indexOf(e);-1!==t&&(this.reprList.splice(t,1),e.dispose(),this.signals.representationRemoved.dispatch(e))}updateRepresentations(e){this.reprList.forEach((t=>t.update(e))),this.stage.viewer.requestRender()}removeAllRepresentations(){this.eachRepresentation((e=>e.dispose()))}dispose(){this.removeAllAnnotations(),this.removeAllRepresentations(),this.reprList.length=0,this.signals.disposed.dispatch()}setVisibility(e){return this.parameters.visible=e,this.eachRepresentation((e=>e.updateVisibility())),this.eachAnnotation((e=>e.updateVisibility())),this.signals.visibilityChanged.dispatch(e),this}setStatus(e){return this.parameters.status=e,this.signals.statusChanged.dispatch(e),this}setName(e){return this.parameters.name=e,this.signals.nameChanged.dispatch(e),this}getBox(...e){return this.getBoxUntransformed(...e).clone().applyMatrix4(this.matrix)}getCenter(...e){return this.getCenterUntransformed(...e).clone().applyMatrix4(this.matrix)}getZoom(...e){return this.stage.getZoomForBox(this.getBox(...e))}getBoxUntransformed(...e){return new bt}getCenterUntransformed(...e){return this.getBoxUntransformed().getCenter(new _t)}autoView(e){this.stage.animationControls.zoomMove(this.getCenter(),this.getZoom(),uo(e,0))}}class rg{constructor(e=[]){this.list=e;const t=e.length;for(let i=0;i0?this.list[0]:void 0}forEach(e){return this.list.forEach(e),this}dispose(){return this.forEach((e=>e.dispose()))}}class sg extends rg{setParameters(e){return this.forEach((t=>t.setParameters(e)))}setVisibility(e){return this.forEach((t=>t.setVisibility(e)))}setSelection(e){return this.forEach((t=>t.setSelection(e)))}setColor(e){return this.forEach((t=>t.setColor(e)))}update(e){return this.forEach((t=>t.update(e)))}build(e){return this.forEach((t=>t.build(e)))}dispose(e){return this.forEach((e=>e.dispose()))}}const ag=Object.assign({defaultStep:1,defaultTimeout:50,defaultInterpolateType:"",defaultInterpolateStep:5,defaultMode:"loop",defaultDirection:"forward",initialFrame:0},Kp);class og extends Zp{constructor(e,t,i={}){super(e,Object.assign({name:t.name},i)),this.trajectory=t,this.signals=Object.assign(this.signals,{frameChanged:new Yo.Signal,playerChanged:new Yo.Signal,countChanged:new Yo.Signal,parametersChanged:new Yo.Signal}),t.signals.frameChanged.add((e=>{this.signals.frameChanged.dispatch(e)})),t.signals.playerChanged.add((e=>{this.signals.playerChanged.dispatch(e)})),t.signals.countChanged.add((e=>{this.signals.countChanged.dispatch(e)})),void 0!==i.initialFrame&&this.setFrame(i.initialFrame)}get defaultParameters(){return ag}get type(){return"trajectory"}setFrame(e){this.trajectory.setFrame(e)}setParameters(e={}){this.trajectory.setParameters(e),this.signals.parametersChanged.dispatch(e)}dispose(){this.trajectory.dispose(),super.dispose()}}class lg{constructor(e,t){this.name=e,this.path=t,this.coordinates=[],this.boxes=[],this.times=[],this.timeOffset=0,this.deltaTime=1}get type(){return"Frames"}}class cg{constructor(e,t){let i,n;if(this.A=new af(3,3),this.W=new af(1,3),this.U=new af(3,3),this.V=new af(3,3),this.VH=new af(3,3),this.R=new af(3,3),this.tmp=new af(3,3),this.c=new af(3,3),e instanceof vp)i=e.atomCount;else{if(!(e instanceof Float32Array))return;i=e.length/3}if(t instanceof vp)n=t.atomCount;else{if(!(t instanceof Float32Array))return;n=t.length/3}const r=Math.min(i,n),s=new af(3,r),a=new af(3,r);this.coords1t=new af(r,3),this.coords2t=new af(r,3),this.transformationMatrix=new qt,this.c.data.set([1,0,0,0,1,0,0,0,-1]),this.prepCoords(e,s,r,!1),this.prepCoords(t,a,r,!1),this._superpose(s,a)}_superpose(t,i){this.mean1=uf(t),this.mean2=uf(i),hf(t,this.mean1),hf(i,this.mean2),of(this.coords1t,t),of(this.coords2t,i),lf(this.A,this.coords2t,this.coords1t),gf(this.A,this.W,this.U,this.V),function(e,t){const i=e.data,n=t.data,r=i[4],s=i[8],a=i[5],o=i[7],l=i[0],c=l*r,u=l*a,h=i[3],d=i[1],f=h*d,m=i[2],p=h*m,g=i[6],_=g*d,y=g*m,v=1/(c*s-u*o-f*s+p*o+_*a-y*r);n[0]=(r*s-a*o)*v,n[1]=-(d*s-m*o)*v,n[2]=-(-d*a+m*r)*v,n[3]=-(h*s-a*g)*v,n[4]=(l*s-y)*v,n[5]=-(u-p)*v,n[6]=-(-h*o+r*g)*v,n[7]=-(l*o-_)*v,n[8]=(c-f)*v}(this.V,this.VH),cf(this.R,this.U,this.VH),function(e){const t=e.data;return t[0]*t[4]*t[8]-t[0]*t[5]*t[7]-t[3]*t[1]*t[8]+t[3]*t[2]*t[7]+t[6]*t[1]*t[5]-t[6]*t[2]*t[4]}(this.R)<0&&(e.Debug&&Fl.log("R not a right handed system"),cf(this.tmp,this.c,this.VH),cf(this.R,this.U,this.tmp));const n=new af(4,4),r=new af(4,4),s=new af(4,4),a=new af(4,4),o=new af(4,4),l=new af(4,4),c=this.R.data,u=this.mean1,h=this.mean2;a.data.set([1,0,0,-u[0],0,1,0,-u[1],0,0,1,-u[2],0,0,0,1]),o.data.set([c[0],c[1],c[2],0,c[3],c[4],c[5],0,c[6],c[7],c[8],0,0,0,0,1]),l.data.set([1,0,0,h[0],0,1,0,h[1],0,0,1,h[2],0,0,0,1]),of(r,a),lf(n,o,r),of(s,n),lf(r,l,s),of(n,r),this.transformationMatrix.elements=n.data}prepCoords(e,t,i,n){let r=0;const s=t.data;let a=3,o=3*i;if(n&&(o=4*i,a=4),e instanceof vp)e.eachAtom((function(e){r{e!==this&&this.pause()}),this);const i=uo(e.frameCount,1);this.traj=e,this.parameters=ho(t,ug),this.parameters.end=Math.min(uo(t.end,i-1),i-1),this.parameters.step=uo(t.step,Math.ceil((i+1)/100)),this._currentFrame=this.parameters.start,this._direction="bounce"===this.parameters.direction?"forward":this.parameters.direction,e.signals.countChanged.add((e=>{this.parameters.end=Math.min(uo(this.parameters.end,e-1),e-1)}),this),this._animate=this._animate.bind(this)}get isRunning(){return this._run}setParameters(e={}){fo(this.parameters,e),void 0!==e.direction&&"bounce"!==this.parameters.direction&&(this._direction=this.parameters.direction)}_animate(){if(!this._run)return;this._currentTime=window.performance.now();const e=this._currentTime-this._previousTime,t=this.parameters.interpolateType?this.parameters.interpolateStep:1,i=this.parameters.timeout/t,n=this.traj;if(n&&n.frameCount&&!n.inProgress&&e>=i)if(this.parameters.interpolateType)if(this._currentStep>this.parameters.interpolateStep&&(this._currentStep=1),1===this._currentStep&&(this._currentFrame=this._nextInterpolated()),n.hasFrame(this._currentFrame)){this._currentStep+=1;const e=this._currentStep/(this.parameters.interpolateStep+1),[t,i,r,s]=this._currentFrame;n.setFrameInterpolated(t,i,r,s,e,this.parameters.interpolateType),this._previousTime=this._currentTime}else n.loadFrame(this._currentFrame);else{const e=this._next();n.hasFrame(e)?(n.setFrame(e),this._previousTime=this._currentTime):n.loadFrame(e)}window.requestAnimationFrame(this._animate)}_next(){const e=this.parameters;let t;return t="forward"===this._direction?this.traj.currentFrame+e.step:this.traj.currentFrame-e.step,(t>e.end||t=e.end?i=e.start:"backward"===e.direction&&t<=e.start&&(i=e.end),this.traj.setFrame(i),this._run=!0,this._animate(),this.signals.startedRunning.dispatch()}}pause(){this._run=!1,this.signals.haltedRunning.dispatch()}stop(){this.pause(),this.traj.setFrame(this.parameters.start)}}class dg{constructor(e,t,i={}){this.signals={countChanged:new Yo.Signal,frameChanged:new Yo.Signal,playerChanged:new Yo.Signal},this.frameCache={},this.loadQueue={},this.boxCache={},this.pathCache={},this.frameCacheSize=0,this._frameCount=0,this._currentFrame=-1,this._disposed=!1,this.deltaTime=uo(i.deltaTime,0),this.timeOffset=uo(i.timeOffset,0),this.centerPbc=uo(i.centerPbc,!1),this.removePbc=uo(i.removePbc,!1),this.removePeriodicity=uo(i.removePeriodicity,!1),this.superpose=uo(i.superpose,!1),this.name=e.replace(/^.*[\\/]/,""),this.trajPath=e,this.selection=new wl(uo(i.sele,"backbone and not hydrogen")),this.selection.signals.stringChanged.add((()=>{this.selectionIndices=this.structure.getAtomIndices(this.selection),this._resetCache(),this._saveInitialCoords(),this.setFrame(this._currentFrame)}))}get frameCount(){return this._frameCount}get currentFrame(){return this._currentFrame}_init(e){this.setStructure(e),this._loadFrameCount(),this.setPlayer(new hg(this))}_loadFrameCount(){}setStructure(e){this.structure=e,this.atomCount=e.atomCount,this.backboneIndices=this._getIndices(new wl("backbone and not hydrogen")),this._makeAtomIndices(),this._saveStructureCoords(),this.selectionIndices=this._getIndices(this.selection),this._resetCache(),this._saveInitialCoords(),this.setFrame(this._currentFrame)}_saveInitialCoords(){this.structure.hasCoords()?(this.initialCoords=new Float32Array(this.structureCoords),this._makeSuperposeCoords()):this.frameCache[0]?(this.initialCoords=new Float32Array(this.frameCache[0]),this._makeSuperposeCoords()):this.loadFrame(0,(()=>this._saveInitialCoords()))}_saveStructureCoords(){this.structureCoords=this.structure.getAtomData({what:{position:!0}}).position}setSelection(e){return this.selection.setString(e),this}_getIndices(e){let t=0;const i=e.test,n=[];return i&&this.structure.eachAtom((e=>{i(e)&&n.push(t),t+=1})),n}_makeSuperposeCoords(){const e=3*this.selectionIndices.length;this.coords1=new Float32Array(e),this.coords2=new Float32Array(e);const t=this.initialCoords,i=this.coords2;for(let n=0;n!!this.frameCache[e])):!!this.frameCache[e]}setFrame(e,t){return void 0===e||(this.inProgress=!0,-1===e||this.frameCache[e]?(this._updateStructure(e),t&&t()):this.loadFrame(e,(()=>{this._updateStructure(e),t&&t()}))),this}_interpolate(e,t,i,n,r,s){const a=this.frameCache;let o;o="spline"===s?function(e,t,i,n,r){const s=e.length,a=new Float32Array(s);for(let o=0;o{this._interpolate(e,t,i,n,r,s),a&&a()})):(this._interpolate(e,t,i,n,r,s),a&&a()),this}loadFrame(e,t){Array.isArray(e)?e.forEach((e=>{this.loadQueue[e]||this.frameCache[e]||(this.loadQueue[e]=!0,this._loadFrame(e,(()=>{delete this.loadQueue[e]})))})):this.loadQueue[e]||this.frameCache[e]||(this.loadQueue[e]=!0,this._loadFrame(e,(()=>{delete this.loadQueue[e],t&&t()})))}_loadFrame(e,t){Fl.error("Trajectory._loadFrame not implemented",e,t)}_updateStructure(e){this._disposed?console.error("updateStructure: traj disposed"):(-1===e?this.structureCoords&&this.structure.updatePosition(this.structureCoords):this.structure.updatePosition(this.frameCache[e]),this.structure.trajectory={name:this.trajPath,frame:e},this._currentFrame=e,this.inProgress=!1,this.signals.frameChanged.dispatch(e))}_doSuperpose(e){const t=3*this.selectionIndices.length,i=this.coords1,n=this.coords2;for(let n=0;n0&&this.centerPbc){const e=[t[0],t[4],t[8]],n=function(e,t,i){return[bc(t,i[0],3,0,e),bc(t,i[1],3,1,e),bc(t,i[2],3,2,e)]}(this.backboneIndices,i,e);!function(e,t,i){if(0===i[0]||0===i[8]||0===i[4])return;const n=e.length,r=i[0],s=i[1],a=i[2],o=-t[0]+r+r/2,l=-t[1]+s+s/2,c=-t[2]+a+a/2;for(let t=0;t.5&&(e[r+n]-=t[3*n+n]*Math.round(s))}}(i,t,e)}this.removePbc&&function(e,t){if(0===t[0]||0===t[8]||0===t[4])return;const i=e.length;for(let n=3;n.9*t[3*i+i])if(r>0)for(let r=0;r<3;++r)e[n+r]-=t[3*i+r];else for(let r=0;r<3;++r)e[n+r]+=t[3*i+r]}}(i,t)}this.selectionIndices.length>0&&this.coords1&&this.superpose&&this._doSuperpose(i),this.frameCache[e]=i,this.boxCache[e]=t,this.frameCacheSize+=1}_setFrameCount(e){e!==this._frameCount&&(this._frameCount=e,this.signals.countChanged.dispatch(e))}dispose(){this._resetCache(),this._disposed=!0,this.player&&this.player.stop()}setPlayer(e){this.player=e,this.signals.playerChanged.dispatch(e)}getFrameTime(e){return this.timeOffset+e*this.deltaTime}}class fg extends dg{constructor(e,t,i){const n=i||{};n.timeOffset=uo(n.timeOffset,e.timeOffset),n.deltaTime=uo(n.deltaTime,e.deltaTime),super("",t,n),this.name=e.name,this.path=e.path,this.frames=e.coordinates,this.boxes=e.boxes,this._init(t)}get type(){return"frames"}_makeAtomIndices(){"StructureView"===this.structure.type?this.atomIndices=this.structure.getAtomIndices():this.atomIndices=void 0}_loadFrame(e,t){let i;const n=this.frames[e];if(this.atomIndices){const e=this.atomIndices,t=e.length;i=new Float32Array(3*t);for(let r=0;r{const e=n.response;if(!e)return void Fl.error(`empty arrayBuffer for '${r}'`);const s=new Int32Array(e,0,1)[0],a=new Float32Array(e,8,9),o=new Float32Array(e,44);this._process(t,a,o,s),"function"==typeof i&&i()}),!1),n.send(s)}_loadFrameCount(){const t=new XMLHttpRequest,i=e.TrajectoryDatasource.getCountUrl(this.trajPath);t.open("GET",i,!0),t.addEventListener("load",(()=>{this._setFrameCount(parseInt(t.response))}),!1),t.send()}}class gg extends dg{constructor(e,t,i){super("",t,i),this.requestCallback=e,this._init(t)}get type(){return"callback"}_makeAtomIndices(){const e=[];if("StructureView"===this.structure.type){const t=this.structure.getAtomIndices(),i=t.length;let n=t[0],r=t[0];for(let s=1;s{this._process(e,i,n,r),"function"==typeof t&&t()}),e,this.atomIndices)}_loadFrameCount(){this.requestCallback((e=>this._setFrameCount(e)))}}vp.prototype.getView=function(e){return new _g(this,e)};class _g extends vp{constructor(e,t){super(),this.structure=e,this.selection=t,this.center=new _t,this.boundingBox=new bt,this._bp=this.getBondProxy(),this._ap=this.getAtomProxy(),this._rp=this.getResidueProxy(),this._cp=this.getChainProxy(),this.selection&&this.selection.signals.stringChanged.add(this.refresh,this),this.structure.signals.refreshed.add(this.refresh,this),this.refresh()}init(){}get type(){return"StructureView"}get name(){return this.structure.name}get path(){return this.structure.path}get title(){return this.structure.title}get id(){return this.structure.id}get data(){return this.structure.data}get atomSetDict(){return this.structure.atomSetDict}get biomolDict(){return this.structure.biomolDict}get entityList(){return this.structure.entityList}get unitcell(){return this.structure.unitcell}get frames(){return this.structure.frames}get boxes(){return this.structure.boxes}get validation(){return this.structure.validation}get bondStore(){return this.structure.bondStore}get backboneBondStore(){return this.structure.backboneBondStore}get rungBondStore(){return this.structure.rungBondStore}get atomStore(){return this.structure.atomStore}get residueStore(){return this.structure.residueStore}get chainStore(){return this.structure.chainStore}get modelStore(){return this.structure.modelStore}get atomMap(){return this.structure.atomMap}get residueMap(){return this.structure.residueMap}get bondHash(){return this.structure.bondHash}get spatialHash(){return this.structure.spatialHash}get _hasCoords(){return this.structure._hasCoords}set _hasCoords(e){this.structure._hasCoords=e}refresh(){e.Debug&&Fl.time("StructureView.refresh"),this.atomSetCache={};const t=this.structure;if(this.selection.isAllSelection()&&t!==this&&t.atomSet&&t.bondSet){this.atomSet=t.atomSet.clone(),this.bondSet=t.bondSet.clone();for(let e in this.atomSetDict){const t=this.atomSetDict[e];this.atomSetCache["__"+e]=t.clone()}this.atomCount=t.atomCount,this.bondCount=t.bondCount,this.boundingBox.copy(t.boundingBox),this.center.copy(t.center)}else if(this.selection.isNoneSelection()&&t!==this&&t.atomSet&&t.bondSet){this.atomSet=new Ih(t.atomCount),this.bondSet=new Ih(t.bondCount);for(let e in this.atomSetDict)this.atomSetCache["__"+e]=new Ih(t.atomCount);this.atomCount=0,this.bondCount=0,this.boundingBox.makeEmpty(),this.center.set(0,0,0)}else{this.atomSet=this.getAtomSet(this.selection,!0),t.atomSet&&(this.atomSet=this.atomSet.intersection(t.atomSet)),this.bondSet=this.getBondSet();for(let e in this.atomSetDict){const t=this.atomSetDict[e];this.atomSetCache["__"+e]=t.makeIntersection(this.atomSet)}this.atomCount=this.atomSet.getSize(),this.bondCount=this.bondSet.getSize(),this.boundingBox=this.getBoundingBox(),this.center=this.boundingBox.getCenter(new _t)}e.Debug&&Fl.timeEnd("StructureView.refresh"),this.signals.refreshed.dispatch()}setSelection(e){this.selection=e,this.refresh()}getSelection(e){const t=[];e&&e.string&&t.push(e.string);const i=this.structure.getSelection();i&&i.string&&t.push(i.string),this.selection&&this.selection.string&&t.push(this.selection.string);let n="";return t.length>0&&(n=`( ${t.join(" ) AND ( ")} )`),new wl(n)}getStructure(){return this.structure.getStructure()}eachBond(e,t){this.structure.eachBond(e,this.getSelection(t))}eachAtom(e,t){const i=this.getAtomProxy(),n=this.getAtomSet(t),r=this.atomStore.count;if(n.getSize()=this.V[n][r]?(i="S",this.score=this.S[n][r]):this.V[n][r]>=this.H[n][r]?(i="V",this.score=this.V[n][r]):(i="H",this.score=this.H[n][r]),e.Debug&&Fl.log("Alignment: SCORE",this.score),e.Debug&&Fl.log("Alignment: S, V, H",this.S[n][r],this.V[n][r],this.H[n][r]);n>0&&r>0;)"S"===i?this.S[n][r]===this.S[n-1][r-1]+t(n-1,r-1)?(this.ali1=this.seq1[n-1]+this.ali1,this.ali2=this.seq2[r-1]+this.ali2,--n,--r,i="S"):this.S[n][r]===this.V[n][r]?i="V":this.S[n][r]===this.H[n][r]?i="H":(--n,--r):"V"===i?this.V[n][r]===this.V[n-1][r]+this.gapExtensionPenalty?(this.ali1=this.seq1[n-1]+this.ali1,this.ali2="-"+this.ali2,--n,i="V"):this.V[n][r]===this.S[n-1][r]+this.gap(0)?(this.ali1=this.seq1[n-1]+this.ali1,this.ali2="-"+this.ali2,--n,i="S"):--n:"H"===i?this.H[n][r]===this.H[n][r-1]+this.gapExtensionPenalty?(this.ali1="-"+this.ali1,this.ali2=this.seq2[r-1]+this.ali2,--r,i="H"):this.H[n][r]===this.S[n][r-1]+this.gap(0)?(this.ali1="-"+this.ali1,this.ali2=this.seq2[r-1]+this.ali2,--r,i="S"):--r:Fl.error("Alignment: no matrix");for(;n>0;)this.ali1=this.seq1[n-1]+this.ali1,this.ali2="-"+this.ali2,--n;for(;r>0;)this.ali1="-"+this.ali1,this.ali2=this.seq2[r-1]+this.ali2,--r;e.Debug&&Fl.timeEnd("Alignment.trace"),e.Debug&&Fl.log([this.ali1,this.ali2])}}function wg(e,t,i=!1,n="",r=""){let s,a,o,l,c;if(i){let i=e,u=t;n&&r&&(i=e.getView(new wl(n)),u=t.getView(new wl(r)));const h=i.getSequence(),d=u.getSequence(),f=new xg(h.join(""),d.join(""));let m,p;f.calc(),f.trace(),s=0,a=0,o=f.ali1.length;const g=[],_=[];for(let e=0;ee[t]))}}}(),this.spacefillRepresentation=this.addRepresentation("spacefill",{sele:"none",opacity:Bl.opacity,color:Bl.color,disablePicking:!0,radiusType:"data"},!0),this.distanceRepresentation=this.addRepresentation("distance",Bl,!0),this.angleRepresentation=this.addRepresentation("angle",Bl,!0),this.dihedralRepresentation=this.addRepresentation("dihedral",Bl,!0),this.measureRepresentations=new sg([this.spacefillRepresentation,this.distanceRepresentation,this.angleRepresentation,this.dihedralRepresentation]),this.setDefaultAssembly(this.parameters.defaultAssembly),this.structure.signals.refreshed.add((()=>{this.updateRepresentations({position:!0})}))}get defaultParameters(){return Sg}get type(){return"structure"}initSelection(e){this.selection=new wl(e),this.structureView=new _g(this.structure,this.selection),this.selection.signals.stringChanged.add((()=>{this.structureView.setSelection(this.selection),this.rebuildRepresentations(),this.rebuildTrajectories()}))}setSelection(e){return this.parameters.sele=e,this.selection.setString(e),this}setDefaultAssembly(e){if(void 0===this.structure.biomolDict[e]&&(e=""),this.parameters.defaultAssembly!==e){const t={defaultAssembly:e};this.reprList.forEach((e=>e.setParameters(t))),this.measureRepresentations.setParameters(t),this.parameters.defaultAssembly=e,this.signals.defaultAssemblyChanged.dispatch(e)}return this}rebuildRepresentations(){this.reprList.forEach((e=>{e.build()})),this.measureRepresentations.build()}rebuildTrajectories(){this.trajList.forEach((e=>{e.trajectory.setStructure(this.structureView)}))}updateRepresentations(e){super.updateRepresentations(e),this.measureRepresentations.update(e)}updateRepresentationMatrices(){super.updateRepresentationMatrices(),this.measureRepresentations.setParameters({matrix:this.matrix})}addRepresentation(e,t={},i=!1){t.defaultAssembly=this.parameters.defaultAssembly;const n=this._addRepresentation(e,this.structureView,t,i);return i||n.signals.parametersChanged.add((()=>this.measureUpdate())),n}addTrajectory(e="",t={}){const i=function(e,t,i){let n;return n=e&&e instanceof lg?new fg(e,t,i):!e&&t.frames?new mg(e,t,i):e&&"function"==typeof e?new gg(e,t,i):new pg(e,t,i),n}(e,this.structureView,t),n=new og(this.stage,i,t);return this.trajList.push(n),this.signals.trajectoryAdded.dispatch(n),n}removeTrajectory(e){const t=this.trajList.indexOf(e);-1!==t&&this.trajList.splice(t,1),e.dispose(),this.signals.trajectoryRemoved.dispatch(e)}dispose(){this.trajList.slice().forEach((e=>e.dispose())),this.trajList.length=0,this.structure.dispose(),this.measureRepresentations.dispose(),super.dispose()}autoView(e,t){"number"==typeof e&&(t=e,e=""),this.stage.animationControls.zoomMove(this.getCenter(e),this.getZoom(e),uo(t,0))}getBoxUntransformed(e){let t;return t=e?this.structureView.getBoundingBox(new wl(e)):this.structureView.boundingBox,t}getCenterUntransformed(e){return e&&"string"==typeof e?this.structure.atomCenter(new wl(e)):this.structure.center}superpose(e,t,i,n){return wg(this.structureView,e.structureView,t,i,n),this.updateRepresentations({position:!0}),this}getMaxRepresentationRadius(e){let t=0;const i=this.structure.getAtomProxy(e);return this.eachRepresentation((e=>{if(e.getVisibility()){const n=e.repr;t=Math.max(n.getAtomRadius(i),t)}})),t}measurePick(e){const t=this.pickBuffer.count;if(this.lastPick===e.index&&t>=1){if(t>1){const e=this.pickBuffer.data,i=this.pickBuffer.data.sort();this.pickDict.has(i)?this.pickDict.del(i):this.pickDict.add(i,e),2===t?this.distanceRepresentation.setParameters({atomPair:this.pickDict.values.filter((e=>2===e.length))}):3===t?this.angleRepresentation.setParameters({atomTriple:this.pickDict.values.filter((e=>3===e.length))}):4===t&&this.dihedralRepresentation.setParameters({atomQuad:this.pickDict.values.filter((e=>4===e.length))})}this.pickBuffer.clear(),this.lastPick=void 0}else this.pickBuffer.has(e.index)||this.pickBuffer.push(e.index),this.lastPick=e.index;this.measureUpdate()}measureClear(){this.pickBuffer.clear(),this.lastPick=void 0,this.spacefillRepresentation.setSelection("none")}measureBuild(){const e=this.measureData();this.distanceRepresentation.setParameters({atomPair:e.distance}),this.angleRepresentation.setParameters({atomTriple:e.angle}),this.dihedralRepresentation.setParameters({atomQuad:e.dihedral})}measureUpdate(){const e=this.pickBuffer.data,t={};e.forEach((e=>{const i=Math.max(.1,this.getMaxRepresentationRadius(e));t[e]=i*(2.3-zo(.1,2,i))})),this.spacefillRepresentation.setSelection(e.length?"@"+e.join(","):"none"),e.length&&this.spacefillRepresentation.setParameters({radiusData:t})}measureData(){const e=this.pickDict.values;return{distance:e.filter((e=>2===e.length)),angle:e.filter((e=>3===e.length)),dihedral:e.filter((e=>4===e.length))}}removeAllMeasurements(e){const t=this.pickDict,i=t.values,n=function(e){i.filter((t=>t.length===e)).forEach((e=>t.del(e.slice().sort())))};(!e||1&e)&&n(2),(!e||2&e)&&n(3),(!e||4&e)&&n(4),this.measureBuild()}removeMeasurement(e){this.pickDict.del(e.slice().sort()),this.measureBuild()}addMeasurement(e){if(e.length<2||e.length>4)return;const t=e.slice().sort();this.pickDict.has(t)||this.pickDict.add(t,e),this.measureBuild()}}Xl.add("structure",Mg),Xl.add("structureview",Mg);class Ag extends ng{constructor(e,t,i={}){super(e,t,Object.assign({name:t.name},i)),this.surface=t}get type(){return"surface"}addRepresentation(e,t={}){return this._addRepresentation(e,this.surface,t)}getBoxUntransformed(){return this.surface.boundingBox}getCenterUntransformed(){return this.surface.center}dispose(){this.surface.dispose(),super.dispose()}}Xl.add("surface",Ag);class Cg extends ng{constructor(e,t,i={}){super(e,t,Object.assign({name:t.name},i)),this.volume=t}get type(){return"volume"}addRepresentation(e,t={}){return this._addRepresentation(e,this.volume,t)}getBoxUntransformed(){return this.volume.boundingBox}getCenterUntransformed(){return this.volume.center}dispose(){this.volume.dispose(),super.dispose()}}Xl.add("volume",Cg);class Tg extends rg{addRepresentation(e,t){return this.forEach((i=>i.addRepresentation(e,t)))}autoView(e){return this.forEach((t=>t.autoView(e)))}}function Pg(e,t){return e instanceof RegExp?null!==t.name.match(e):t.name===e}const Eg=new _t,Ig={impostor:!0,quality:"medium",workerDefault:!0,sampleLevel:0,backgroundColor:"black",rotateSpeed:2,zoomSpeed:1.2,panSpeed:1,clipNear:0,clipFar:100,clipDist:10,clipMode:"scene",clipScale:"relative",fogNear:50,fogFar:100,cameraFov:40,cameraEyeSep:.3,cameraType:"perspective",lightColor:14540253,lightIntensity:1.2,ambientColor:14540253,ambientIntensity:.3,hoverTimeout:0,tooltip:!0,mousePreset:"default"};class Dg extends ng{constructor(e,t,i={}){super(e,t,Object.assign({name:t.name},i)),this.shape=t}get type(){return"shape"}addRepresentation(e,t={}){return this._addRepresentation(e,this.shape,t)}getBoxUntransformed(){return this.shape.boundingBox}getCenterUntransformed(){return this.shape.center}dispose(){this.shape.dispose(),super.dispose()}}function Rg(e,t,i,n){var r,s=arguments.length,a=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(r=e[o])&&(a=(s<3?r(a):s>3?r(t,i,a):r(t,i))||a);return s>3&&a&&Object.defineProperty(t,i,a),a}function Lg(e,t,i,n){return new(i||(i=Promise))((function(r,s){function a(e){try{l(n.next(e))}catch(e){s(e)}}function o(e){try{l(n.throw(e))}catch(e){s(e)}}function l(e){e.done?r(e.value):function(e){return e instanceof i?e:new i((function(t){t(e)}))}(e.value).then(a,o)}l((n=n.apply(e,t||[])).next())}))}Xl.add("shape",Dg),"function"==typeof SuppressedError&&SuppressedError;class kg extends qo{constructor(e){super(e),e.scale||(this.parameters.scale="rainbow",this.parameters.reverse=uo(e.reverse,!0)),this.scalePerModel={},e.structure.eachModel((e=>{this.parameters.domain=[e.atomOffset,e.atomEnd],this.scalePerModel[e.index]=this.getScale()}))}atomColor(e){return this.scalePerModel[e.modelIndex](e.index)}}Rg([Wo],kg.prototype,"atomColor",null),$l.add("atomindex",kg);class Og extends qo{constructor(e){if(super(e),e.scale||(this.parameters.scale="OrRd"),!e.domain){let t,i=1/0,n=-1/0;e.sele&&(t=new wl(e.sele)),e.structure.eachAtom((function(e){const t=e.bfactor;i=Math.min(i,t),n=Math.max(n,t)}),t),this.parameters.domain=[i,n]}this.bfactorScale=this.getScale()}atomColor(e){return this.bfactorScale(e.bfactor)}}Rg([Wo],Og.prototype,"atomColor",null),$l.add("bfactor",Og);class Ng extends qo{constructor(e){super(e),this.chainidDictPerModel={},this.scalePerModel={},e.scale||(this.parameters.scale="Spectral"),e.structure.eachModel((e=>{let t=0;const i={};e.eachChain((function(e){void 0===i[e.chainid]&&(i[e.chainid]=t,t+=1)})),this.parameters.domain=[0,t-1],this.chainidDictPerModel[e.index]=i,this.scalePerModel[e.index]=this.getScale()}))}atomColor(e){const t=this.chainidDictPerModel[e.modelIndex];return this.scalePerModel[e.modelIndex](t[e.chainid])}}Rg([Wo],Ng.prototype,"atomColor",null),$l.add("chainid",Ng);class Fg extends qo{constructor(e){super(e),this.scalePerModel={},e.scale||(this.parameters.scale="Spectral"),e.structure.eachModel((e=>{this.parameters.domain=[e.chainOffset,e.chainEnd],this.scalePerModel[e.index]=this.getScale()}))}atomColor(e){return this.scalePerModel[e.modelIndex](e.chainIndex)}}Rg([Wo],Fg.prototype,"atomColor",null),$l.add("chainindex",Fg);class Bg extends qo{constructor(e){super(e),this.chainnameDictPerModel={},this.scalePerModel={},e.scale||(this.parameters.scale="Spectral"),e.structure.eachModel((e=>{let t=0;const i={};e.eachChain((function(e){void 0===i[e.chainname]&&(i[e.chainname]=t,t+=1)})),this.parameters.domain=[0,t-1],this.chainnameDictPerModel[e.index]=i,this.scalePerModel[e.index]=this.getScale()}))}atomColor(e){const t=this.chainnameDictPerModel[e.modelIndex];return this.scalePerModel[e.modelIndex](t[e.chainname])}}Rg([Wo],Bg.prototype,"atomColor",null),$l.add("chainname",Bg);class zg extends qo{constructor(e){super(e),this.rsrzDict={},this.rsccDict={},e.scale||(this.parameters.scale="RdYlBu"),this.rsrzScale=this.getScale({domain:[2,0]}),this.rsccScale=this.getScale({domain:[.678,1]});const t=e.structure.validation;t&&(this.rsrzDict=t.rsrzDict,this.rsccDict=t.rsccDict)}atomColor(e){let t=e.resno+"";e.inscode&&(t+="^"+e.inscode),e.chainname&&(t+=":"+e.chainname),t+="/"+e.modelIndex;const i=this.rsrzDict[t];if(void 0!==i)return this.rsrzScale(i);const n=this.rsccDict[t];return void 0!==n?this.rsccScale(n):9474192}}Rg([Wo],zg.prototype,"atomColor",null),$l.add("densityfit",zg);const Ug={ARG:{CD:.1,CZ:.5,NE:-.1},ASN:{CG:.55,OD1:-.55},ASP:{CB:-.16,CG:.36,OD1:-.6,OD2:-.6},CYS:{CB:.19,SG:-.19},GLN:{CD:.55,OE1:-.55},GLU:{CD:.36,CG:-.16,OE1:-.6,OE2:-.6},HIS:{CB:.1,CD2:.2,CE1:.45,CG:.15,ND1:.05,NE2:.05},LYS:{CE:.25,NZ:.75},MET:{CE:.06,CG:.06,SD:-.12},PTR:{C:.55,CA:.1,CZ:.25,N:-.35,O:-.55,O1P:-.85,O2P:-.85,O3P:-.85,OG1:-1.1,P:1.4},SEP:{C:.55,CA:.1,CB:.25,N:-.35,O:-.55,O1P:-.85,O2P:-.85,O3P:-.85,OG1:-1.1,P:1.4},SER:{CB:.25,OG:-.25},THR:{CB:.25,OG1:-.25},TPO:{C:.55,CA:.1,CB:.25,N:-.35,O:-.55,OG1:-1.1,O1P:-.85,O2P:-.85,O3P:-.85,P:1.4},TRP:{CD1:.06,CD2:.1,CE2:-.04,CE3:-.03,CG:-.03,NE1:-.06},TYR:{CZ:.25,OH:-.25},backbone:{C:.55,O:-.55,N:-.35,CA:.1}};class Vg extends qo{constructor(e){super(e),this.delta=new _t,this.hCharges=[],e.scale||(this.parameters.scale="rwb"),e.domain||(this.parameters.domain=[-50,50]),this.scale=this.getScale(),this.charges=new Float32Array(e.structure.atomCount);const t=[];e.structure.eachAtom((e=>{var i;if(this.charges[e.index]=(null!==(i=e).partialCharge?i.partialCharge:i.isProtein()&&(Ug[i.resname]&&Ug[i.resname][i.atomname]||Ug.backbone[i.atomname])||0)*e.occupancy,"N"===e.atomname){if(e.bondCount>=3)return;if(e.bondToElementCount(1))return;const i=function(e,t=new _t){let i=!1,n=!1,r=!1;return t.set(2*e.x,2*e.y,2*e.z),e.eachBondedAtom((function(e){if(!i)return"H"===e.atomname?(t.set(e.x,e.y,e.z),void(i=!0)):void(n||"CA"!==e.atomname?r||"C"!==e.atomname||(r=!0,t.sub(e)):(t.sub(e),n=!0))})),i?t:n&&r?(t.normalize(),t.multiplyScalar(1.04),t.add(e),t):void 0}(e);void 0!==i&&(t.push(i),this.hCharges.push(.25*e.occupancy))}}));const i=e.structure.getBoundingBox();i.expandByScalar(1.04),this.hStore=function(e){const t=e.length,i=new Float32Array(t),n=new Float32Array(t),r=new Float32Array(t);for(let t=0;t{const r=t[e];0!==r&&(n+=r/i)})),this.hHash.eachWithin(e.x,e.y,e.z,12,((e,t)=>{const r=i[e];0!==r&&(n+=r/t)})),this.scale(332*n)}}Rg([Wo],Vg.prototype,"positionColor",null),$l.add("electrostatic",Vg);const $g={H:16777215,HE:14286847,LI:13402367,BE:12779264,B:16758197,C:9474192,N:3166456,O:16715021,F:9494608,NE:11789301,NA:11230450,MG:9109248,AL:12560038,SI:1578e4,P:16744448,S:16777008,CL:2093087,AR:8442339,K:9388244,CA:4062976,SC:15132390,TI:12567239,V:10921643,CR:9083335,MN:10255047,FE:14706227,CO:15765664,NI:5296208,CU:13140019,ZN:8224944,GA:12750735,GE:6721423,AS:12419299,SE:16752896,BR:10889513,KR:6076625,RB:7351984,SR:65280,Y:9764863,ZR:9756896,NB:7586505,MO:5551541,TC:3907230,RU:2396047,RH:687500,PD:27013,AG:12632256,CD:16767375,IN:10909043,SN:6717568,SB:10380213,TE:13924864,I:9699476,XE:9699476,CS:5707663,BA:51456,LA:7394559,CE:16777159,PR:14286791,ND:13107143,PM:10747847,SM:9437127,EU:6422471,GD:4587463,TB:3211207,DY:2097095,HO:65436,ER:58997,TM:54354,YB:48952,LU:43812,HF:5096191,TA:5089023,W:2200790,RE:2522539,OS:2516630,IR:1528967,PT:13684960,AU:16765219,HG:12105936,TL:10900557,PB:5724513,BI:10375093,PO:11230208,AT:7688005,RN:4358806,FR:4325478,RA:32e3,AC:7384058,TH:47871,PA:41471,U:36863,NP:33023,PU:27647,AM:5528818,CM:7888099,BK:9064419,CF:10565332,ES:11739092,FM:11739066,MD:11734438,NO:12389767,LR:13041766,RF:13369433,DB:13697103,SG:14221381,BH:14680120,HS:15073326,MT:15400998,DS:16777215,RG:16777215,CN:16777215,UUT:16777215,FL:16777215,UUP:16777215,LV:16777215,UUH:16777215,D:16777152,T:16777120};class Gg extends qo{constructor(e){e.value=uo(e.value,$g.C),super(e)}atomColor(e){const t=e.element;return"C"===t?this.parameters.value:$g[t]||16777215}}Rg([Wo],Gg.prototype,"atomColor",null),$l.add("element",Gg);class Hg extends qo{constructor(e){super(e),e.scale||(this.parameters.scale="Spectral"),e.domain||(this.parameters.domain=[0,e.structure.entityList.length-1]),this.entityindexScale=this.getScale()}atomColor(e){return this.entityindexScale(e.entityIndex)}}Rg([Wo],Hg.prototype,"atomColor",null),$l.add("entityindex",Hg);class jg extends qo{atomColor(e){const t=e.entity;switch(t?t.entityType:void 0){case 1:return 8374655;case 2:return 16629894;case 3:return 12496596;case 4:return 3697840;default:return 16777113}}}Rg([Wo],jg.prototype,"atomColor",null),$l.add("entitytype",jg);class Wg extends qo{constructor(e){super(e),this.geoAtomDict={},this.geoDict={};const t=e.structure.validation;t&&(this.geoAtomDict=t.geoAtomDict,this.geoDict=t.geoDict)}atomColor(e){let t,i=e.resno+"";e.inscode&&(i+="^"+e.inscode),e.chainname&&(i+=":"+e.chainname),i+="/"+e.modelIndex;const n=this.geoAtomDict[i];if(void 0!==n){const i=n[e.atomname]||0;r=i,t=16843009*((r=(858993459&(r-=r>>1&1431655765))+(r>>2&858993459))+(r>>4)&252645135)>>24}else t=this.geoDict[i]||0;var r;return 0===t?2188972:1===t?16703627:2===t?16018755:t>=3?10813478:9474192}}Rg([Wo],Wg.prototype,"atomColor",null),$l.add("geoquality",Wg);class qg extends qo{constructor(e){super(e),this.resHF={},e.scale||(this.parameters.scale="RdYlGn");for(const e in Yh)this.resHF[e]=Yh[e][0];if(this.defaultResidueHydrophobicity=Kh[0],!e.domain){let e=1/0,t=-1/0;for(const i in this.resHF){const n=this.resHF[i];e=Math.min(e,n),t=Math.max(t,n)}this.parameters.domain=[e,0,t]}this.hfScale=this.getScale()}atomColor(e){return this.hfScale(this.resHF[e.resname]||this.defaultResidueHydrophobicity)}}Rg([Wo],qg.prototype,"atomColor",null),$l.add("hydrophobicity",qg);class Xg extends qo{constructor(e){super(e),e.scale||(this.parameters.scale="rainbow"),e.domain||(this.parameters.domain=[0,e.structure.modelStore.count]),this.modelindexScale=this.getScale()}atomColor(e){return this.modelindexScale(e.modelIndex)}}Rg([Wo],Xg.prototype,"atomColor",null),$l.add("modelindex",Xg);class Yg extends qo{atomColor(e){switch(e.residueType.moleculeType){case 1:return 3697840;case 2:return 15729279;case 3:return 12496596;case 4:return 16629894;case 5:return 12540695;case 6:return 8374655;default:return 16777113}}}Rg([Wo],Yg.prototype,"atomColor",null),$l.add("moleculetype",Yg);class Kg extends qo{constructor(e){super(e),e.scale||(this.parameters.scale="PuBu"),e.domain||(this.parameters.domain=[0,1]),this.occupancyScale=this.getScale()}atomColor(e){return this.occupancyScale(e.occupancy)}}Rg([Wo],Kg.prototype,"atomColor",null),$l.add("occupancy",Kg);class Zg extends qo{constructor(e){super(e),e.scale||(this.parameters.scale="rwb"),e.domain||(this.parameters.domain=[-1,1]),this.partialchargeScale=this.getScale()}atomColor(e){return this.partialchargeScale(e.partialCharge||0)}}function Qg(){return 16777215*Math.random()}Rg([Wo],Zg.prototype,"atomColor",null),$l.add("partialcharge",Zg);class Jg extends qo{atomColor(){return Qg()}volumeColor(){return Qg()}positionColor(){return Qg()}}Rg([Wo],Jg.prototype,"atomColor",null),Rg([Wo],Jg.prototype,"volumeColor",null),Rg([Wo],Jg.prototype,"positionColor",null),$l.add("random",Jg);class e_ extends qo{constructor(e){super(e),this.rciDict={},e.scale||(this.parameters.scale="RdYlBu"),this.rciScale=this.getScale({domain:[.6,0]});const t=e.structure.validation;t&&(this.rciDict=t.rciDict)}atomColor(e){let t=`[${e.resname}]${e.resno}`;e.chainname&&(t+=":"+e.chainname);const i=this.rciDict[t];return void 0!==i?this.rciScale(i):9474192}}Rg([Wo],e_.prototype,"atomColor",null),$l.add("randomcoilindex",e_);class t_ extends qo{constructor(e){super(e),this.scalePerChain={},e.scale||(this.parameters.scale="rainbow",this.parameters.reverse=uo(e.reverse,!0)),e.structure.eachChain((e=>{this.parameters.domain=[e.residueOffset,e.residueEnd],this.scalePerChain[e.index]=this.getScale()}))}atomColor(e){return this.scalePerChain[e.chainIndex](e.residueIndex)}}Rg([Wo],t_.prototype,"atomColor",null),$l.add("residueindex",t_);const i_={ALA:9240460,ARG:124,ASN:16743536,ASP:10485826,CYS:16777072,GLN:16731212,GLU:6684672,GLY:16777215,HIS:7368959,ILE:19456,LEU:4546117,LYS:4671416,MET:12099650,PHE:5459026,PRO:5395026,SER:16740418,THR:12078080,TRP:5195264,TYR:9203788,VAL:16747775,ASX:16711935,GLX:16711935,ASH:16711935,GLH:16711935,A:14423100,G:3329330,I:10145074,X:8190976,C:16766720,T:4286945,U:4251856,D:35723,DA:14423100,DG:3329330,DI:10145074,DX:8190976,DC:16766720,DT:4286945,DU:4251856,DD:35723};class n_ extends qo{atomColor(e){return i_[e.resname]||16711935}}Rg([Wo],n_.prototype,"atomColor",null),$l.add("resname",n_);const r_=16711808,s_=10485888,a_=6291584,o_=16762880,l_=6324479,c_=16777215,u_=11403518,h_=16580962,d_=10921722;class f_ extends qo{constructor(e){super(e),this.residueProxy=e.structure.getResidueProxy()}atomColor(e){const t=e.sstruc,i=this.residueProxy;return"h"===t?r_:"g"===t?s_:"i"===t?a_:"e"===t||"b"===t?o_:"t"===t?l_:(i.index=e.residueIndex,i.isDna()?u_:i.isRna()?h_:i.isSaccharide()?d_:i.isProtein()||"s"===t||"l"===t?c_:8421504)}}Rg([Wo],f_.prototype,"atomColor",null),$l.add("sstruc",f_);class m_ extends qo{constructor(e){var t,i;super(e),e.scale||(this.parameters.scale="rwb"),this.atomData=null===(t=this.parameters.data)||void 0===t?void 0:t.atomData,this.bondData=null===(i=this.parameters.data)||void 0===i?void 0:i.bondData,this.scale=this.getScale(this.parameters)}atomColor(e){var t;const i=null===(t=this.atomData)||void 0===t?void 0:t[e.index];return void 0!==i?this.scale(i):this.parameters.value}bondColor(e,t){var i;const n=null===(i=this.bondData)||void 0===i?void 0:i[e.index];return void 0!==n?this.scale(n):this.atomProxy?(this.atomProxy.index=t?e.atomIndex1:e.atomIndex2,this.atomColor(this.atomProxy)):this.parameters.value}}Rg([Wo],m_.prototype,"atomColor",null),Rg([Wo],m_.prototype,"bondColor",null),$l.add("structuredata",m_);class p_ extends qo{atomColor(){return this.parameters.value}bondColor(){return this.parameters.value}valueColor(){return this.parameters.value}volumeColor(){return this.parameters.value}}Rg([Wo],p_.prototype,"atomColor",null),Rg([Wo],p_.prototype,"bondColor",null),Rg([Wo],p_.prototype,"valueColor",null),Rg([Wo],p_.prototype,"volumeColor",null),$l.add("uniform",p_);class g_ extends qo{constructor(e){super(e),this.valueScale=this.getScale()}volumeColor(e){return this.valueScale(this.parameters.volume.data[e])}}Rg([Wo],g_.prototype,"volumeColor",null),$l.add("value",g_);class __ extends qo{constructor(e){super(e),this.vec=new _t,this.valueScale=this.getScale()}positionColor(e){const t=this.parameters.volume;if(!t||!t.inverseMatrix)return this.parameters.value;const i=this.vec,n=t.data,r=t.nx,s=t.ny,a=r*s;i.copy(e),i.applyMatrix4(t.inverseMatrix);const o=Math.floor(i.x),l=Math.floor(i.y),c=Math.floor(i.z),u=(c*s+l)*r+o,h=u+1,d=u+r,f=u+a,m=d+1,p=f+1,g=d+a,_=g+1,y=n[u],v=n[h],b=n[d],x=n[f],w=n[m],S=n[p],M=n[g],A=n[_],C=i.x-o,T=i.y-l,P=i.z-c,E=Fo(y,v,C),I=Fo(x,S,C),D=Fo(b,w,C),R=Fo(M,A,C),L=Fo(E,D,T),k=Fo(I,R,T),O=Fo(L,k,P);return this.valueScale(O)}}Rg([Wo],__.prototype,"positionColor",null),$l.add("volume",__);class y_ extends Nu{constructor(e,t,i){const n=i||{};if(super(e,t,n),this.type="structure",this.parameters=Object.assign({radiusType:{type:"select",options:cm.types},radiusData:{type:"hidden"},radiusSize:{type:"number",precision:3,max:10,min:.001},radiusScale:{type:"number",precision:3,max:10,min:.001},assembly:null,defaultAssembly:{type:"hidden"}},this.parameters),this.selection=new wl(n.sele),this.dataList=[],this.structure=e,this.structureView=this.structure.getView(this.selection),e.biomolDict){const t={default:"default","":e.unitcell?"AU":"FULL"};Object.keys(e.biomolDict).forEach((function(e){t[e]=e})),this.parameters.assembly={type:"select",options:t,rebuild:!0}}else this.parameters.assembly=null}get defaultScale(){return{vdw:1,covalent:1,bfactor:.01,sstruc:1}}init(e){const t=e||{};t.colorScheme=uo(t.colorScheme,"element"),this.setRadius(t.radius,t),this.radiusType=uo(t.radiusType,"vdw"),this.radiusData=uo(t.radiusData,{}),this.radiusSize=uo(t.radiusSize,1),this.radiusScale=uo(t.radiusScale,1),this.assembly=uo(t.assembly,"default"),this.defaultAssembly=uo(t.defaultAssembly,""),"auto"===t.quality&&(t.quality=this.getQuality()),super.init(t),this.selection.signals.stringChanged.add((()=>{this.build()})),this.build()}setRadius(e,t){const i=Object.keys(lm);return"string"==typeof e&&i.includes(e.toLowerCase())?t.radiusType=e:void 0!==e&&(t.radiusType="size",t.radiusSize=e),this}getAssembly(){const e="default"===this.assembly?this.defaultAssembly:this.assembly;return this.structure.biomolDict[e]}getQuality(){let e;const t=this.structureView,i=this.getAssembly();e=i?i.getAtomCount(t):t.atomCount,Rl&&(e*=4);return t.atomStore.count/t.residueStore.count<2&&(e*=10),e<15e3?"high":e<8e4?"medium":"low"}create(){if(0===this.structureView.atomCount)return;if(!this.structureView.hasCoords())return void(this.needsBuild=!0);this.needsBuild=!1;const e=this.getAssembly();if(e)e.partList.forEach(((e,t)=>{const i=e.getView(this.structureView);if(0===i.atomCount)return;const n=this.createData(i,t);n&&(n.sview=i,n.instanceList=e.getInstanceList(),this.dataList.push(n))}));else{const e=this.createData(this.structureView,0);e&&(e.sview=this.structureView,this.dataList.push(e))}}update(e){!this.lazy||this.visible?this.needsBuild?this.build():this.dataList.forEach((t=>{t.bufferList.length>0&&this.updateData(e,t)}),this):Object.assign(this.lazyProps.what,e)}updateData(e,t){this.build()}getColorParams(){return Object.assign(Object.assign({},super.getColorParams()),{structure:this.structure})}getRadiusParams(e){return{type:this.radiusType,scale:this.radiusScale,size:this.radiusSize,data:this.radiusData}}getAtomParams(e,t){return Object.assign({what:e,colorParams:this.getColorParams(),radiusParams:this.getRadiusParams()},t)}getBondParams(e,t){return Object.assign({what:e,colorParams:this.getColorParams(),radiusParams:this.getRadiusParams()},t)}getAtomRadius(e){if(this.structureView.atomSet.isSet(e.index)){return new cm(this.getRadiusParams()).atomRadius(e)}return 0}setSelection(e,t){return this.selection.setString(e,t),this}setParameters(e,t={},i=!1){const n=e||{};return this.setRadius(n.radius,n),void 0===n.radiusType&&void 0===n.radiusData&&void 0===n.radiusSize&&void 0===n.radiusScale||(t.radius=!0,Ol&&!this.disableImpostor||(i=!0)),void 0!==n.defaultAssembly&&n.defaultAssembly!==this.defaultAssembly&&("default"===this.assembly&&void 0===n.assembly||"default"===n.assembly)&&(i=!0),super.setParameters(n,t,i),this}getParameters(){return Object.assign(super.getParameters(),{sele:this.selection?this.selection.string:void 0,defaultAssembly:this.defaultAssembly})}attach(e){const t=this.viewer,i=this.bufferList;this.dataList.forEach((function(e){e.bufferList.forEach((function(n){i.push(n),t.add(n,e.instanceList)}))})),this.setVisibility(this.visible),e()}clear(){this.dataList.length=0,super.clear()}dispose(){this.structureView.dispose(),super.dispose()}}class v_ extends y_{constructor(e,t,i){super(e,t,i),this.n=0,this.parameters=Object.assign({labelVisible:{type:"boolean"},labelSize:{type:"number",precision:3,max:10,min:.001},labelColor:{type:"color"},labelFontFamily:{type:"select",options:{"sans-serif":"sans-serif",monospace:"monospace",serif:"serif"},buffer:"fontFamily"},labelFontStyle:{type:"select",options:{normal:"normal",italic:"italic"},buffer:"fontStyle"},labelFontWeight:{type:"select",options:{normal:"normal",bold:"bold"},buffer:"fontWeight"},labelsdf:{type:"boolean",buffer:"sdf"},labelXOffset:{type:"number",precision:1,max:20,min:-20,buffer:"xOffset"},labelYOffset:{type:"number",precision:1,max:20,min:-20,buffer:"yOffset"},labelZOffset:{type:"number",precision:1,max:20,min:-20,buffer:"zOffset"},labelAttachment:{type:"select",options:{"bottom-left":"bottom-left","bottom-center":"bottom-center","bottom-right":"bottom-right","middle-left":"middle-left","middle-center":"middle-center","middle-right":"middle-right","top-left":"top-left","top-center":"top-center","top-right":"top-right"},rebuild:!0},labelBorder:{type:"boolean",buffer:"showBorder"},labelBorderColor:{type:"color",buffer:"borderColor"},labelBorderWidth:{type:"number",precision:2,max:.3,min:0,buffer:"borderWidth"},labelBackground:{type:"boolean",rebuild:!0},labelBackgroundColor:{type:"color",buffer:"backgroundColor"},labelBackgroundMargin:{type:"number",precision:2,max:2,min:0,rebuild:!0},labelBackgroundOpacity:{type:"range",step:.01,max:1,min:0,buffer:"backgroundOpacity"},labelFixedSize:{type:"boolean",buffer:"fixedSize"},lineOpacity:{type:"range",min:0,max:1,step:.01},linewidth:{type:"integer",max:50,min:1,buffer:!0}},this.parameters,{flatShaded:null})}init(e){const t=e||{};this.labelVisible=uo(t.labelVisible,!0),this.labelSize=uo(t.labelSize,2),this.labelColor=uo(t.labelColor,16777215),this.labelFontFamily=uo(t.labelFontFamily,"sans-serif"),this.labelFontStyle=uo(t.labelFontstyle,"normal"),this.labelFontWeight=uo(t.labelFontWeight,"bold"),this.labelsdf=uo(t.labelsdf,"Chrome"===Il),this.labelXOffset=uo(t.labelXOffset,0),this.labelYOffset=uo(t.labelYOffset,0),this.labelZOffset=uo(t.labelZOffset,.5),this.labelAttachment=uo(t.labelAttachment,"bottom-left"),this.labelBorder=uo(t.labelBorder,!1),this.labelBorderColor=uo(t.labelBorderColor,"lightgrey"),this.labelBorderWidth=uo(t.labelBorderWidth,.15),this.labelBackground=uo(t.labelBackground,!1),this.labelBackgroundColor=uo(t.labelBackgroundColor,"lightgrey"),this.labelBackgroundMargin=uo(t.labelBackgroundMargin,.5),this.labelBackgroundOpacity=uo(t.labelBackgroundOpacity,1),this.labelFixedSize=uo(t.labelFixedSize,!1),this.lineOpacity=uo(t.lineOpacity,1),this.linewidth=uo(t.linewidth,2),super.init(t)}update(e){e.position?this.build():super.update(e)}updateData(e,t){const i={};if(e&&!e.labelSize||Object.assign(i,{size:Sc(this.n,this.labelSize)}),!e||e.labelColor){const e=new Oi(this.labelColor);Object.assign(i,{color:Mc(this.n,e.r,e.g,e.b)})}this.textBuffer.setAttributes(i)}setParameters(e,t={},i=!1){return e&&e.labelSize&&(t.labelSize=!0),e&&(e.labelColor||0===e.labelColor)&&(t.labelColor=!0,i=!0),super.setParameters(e,t,i),e&&void 0!==e.opacity&&this.textBuffer.setParameters({opacity:1}),e&&void 0!==e.labelVisible&&this.setVisibility(this.visible),this}setVisibility(e,t){return super.setVisibility(e,!0),this.textBuffer&&this.textBuffer.setVisibility(this.labelVisible&&this.visible),t||this.viewer.requestRender(),this}getLabelBufferParams(e={}){return super.getBufferParams(Object.assign({fontFamily:this.labelFontFamily,fontStyle:this.labelFontStyle,fontWeight:this.labelFontWeight,sdf:this.labelsdf,xOffset:this.labelXOffset,yOffset:this.labelYOffset,zOffset:this.labelZOffset,attachment:this.labelAttachment,showBorder:this.labelBorder,borderColor:this.labelBorderColor,borderWidth:this.labelBorderWidth,showBackground:this.labelBackground,backgroundColor:this.labelBackgroundColor,backgroundMargin:this.labelBackgroundMargin,backgroundOpacity:this.labelBackgroundOpacity,fixedSize:this.labelFixedSize,disablePicking:!0,visible:this.labelVisible},e,{opacity:1}))}getAtomRadius(){return 0}}function b_(e,t){const i=e.getAtomProxy(),n=new wl,r=t.length;if(0===r)return new Float32Array(0);const s=t[0].length,a=e.getAtomSet(),o=new Float32Array(r*s*3);let l=0;return t.forEach((function(t){let r=!1;for(let c=0;c 1.0 ){\ngl_FragColor = vec4( backgroundColor, backgroundOpacity );\n}else{\nfloat sdf = texture2D( fontTexture, texCoord ).a;\nif( showBorder ) sdf += borderWidth;\nfloat a = smoothstep(padding - gamma, padding + gamma, sdf);\nif( a < 0.2 ) discard;\na *= opacity;\nvec3 outgoingLight = vColor;\nif( showBorder && sdf < ( padding + borderWidth ) ){\noutgoingLight = borderColor;\n}\ngl_FragColor = vec4( outgoingLight, a );\n}\n#if defined( PICKING )\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n#endif\n}");const M_={};const A_={font:"sans-serif",size:36,style:"normal",variant:"normal",weight:"normal",outline:3,width:1024,height:1024};class C_{constructor(e={}){this.gamma=1,this.mapped={},this.scratchW=0,this.scratchH=0,this.currentX=0,this.currentY=0,this.cutoff=.25,this.parameters=ho(e,A_);const t=this.parameters;this.radius=t.size/8,this.padding=t.size/3;const i=this.lineHeight=t.size+2*t.outline+Math.round(t.size/4),n=this.maxWidth=t.width/4,r=this.canvas=document.createElement("canvas");r.width=n,r.height=i;const s=this.context=this.canvas.getContext("2d",{willReadFrequently:!0});s.font=`${t.style} ${t.variant} ${t.weight} ${t.size}px ${t.font}`,s.fillStyle="black",s.textAlign="left",s.textBaseline="bottom",s.lineJoin="round",this.gridOuter=new Float64Array(i*n),this.gridInner=new Float64Array(i*n),this.f=new Float64Array(Math.max(i,n)),this.d=new Float64Array(Math.max(i,n)),this.z=new Float64Array(Math.max(i,n)+1),this.v=new Int16Array(Math.max(i,n)),this.data=new Uint8Array(t.width*t.height*4),this.canvas2=document.createElement("canvas"),this.canvas2.width=t.width,this.canvas2.height=t.height,this.context2=this.canvas2.getContext("2d"),this.placeholder=this.map(String.fromCharCode(65533));for(let e=32;e<=126;++e)this.map(String.fromCharCode(e));this.map(String.fromCharCode(176)),this.map(String.fromCharCode(8491)),this.texture=new $a(this.canvas2),this.texture.flipY=!1,this.texture.needsUpdate=!0}map(e){const t=this.parameters;return void 0===this.mapped[e]&&(this.draw(e),this.currentX+this.scratchW>t.width&&(this.currentX=0,this.currentY+=this.scratchH),this.currentY+this.scratchH>t.height&&console.warn("canvas to small"),this.mapped[e]={x:this.currentX,y:this.currentY,w:this.scratchW,h:this.scratchH},this.context2.drawImage(this.canvas,0,0,this.scratchW,this.scratchH,this.currentX,this.currentY,this.scratchW,this.scratchH),this.currentX+=this.scratchW),this.mapped[e]}get(e){return this.mapped[e]||this.placeholder}draw(e){const t=this.parameters,i=this.lineHeight,n=t.outline,r=this.context,s=this.maxWidth,a=n,o=i-t.outline,l=r.measureText(e),c=Math.min(s,Math.ceil(l.width+2*a+1)),u=c*i;r.clearRect(0,0,c,i),r.fillText(e,a,o);const h=r.getImageData(0,0,c,i),d=h.data;for(let e=0;e= 0.0 ) {\ntrimSegment( start, end );\n} else if ( end.z < 0.0 && start.z >= 0.0 ) {\ntrimSegment( end, start );\n}\n}\nvec4 clipStart = projectionMatrix * start;\nvec4 clipEnd = projectionMatrix * end;\nvec2 ndcStart = clipStart.xy / clipStart.w;\nvec2 ndcEnd = clipEnd.xy / clipEnd.w;\nvec2 dir = ndcEnd - ndcStart;\ndir.x *= aspect;\ndir = normalize( dir );\nvec2 offset = vec2( dir.y, - dir.x );\ndir.x /= aspect;\noffset.x /= aspect;\nif ( mapping.x < 0.0 ) offset *= - 1.0;\noffset *= linewidth;\noffset /= resolution.y;\nvec4 clip = ( mapping.y < 0.5 ) ? clipStart : clipEnd;\noffset *= clip.w;\nclip.xy += offset;\ngl_Position = clip;\n#ifndef PICKING\nvViewPosition = ( projectionMatrixInverse * clip ).xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}"),Wl.add("shader/WideLine.frag","uniform vec3 diffuse;\nuniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\n#include common\n#include fog_pars_fragment\nvarying vec3 vViewPosition;\nvarying vec3 vColor;\nvarying vec3 vColor2;\nvarying float flag;\n#endif\nvoid main() {\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( PICKING )\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 outgoingLight = vec3( 0.0 );\nvec4 diffuseColor = vec4( diffuse, 1.0 );\nif ( flag < 0.0 ) {\ndiffuseColor.rgb *= vColor;\n} else {\ndiffuseColor.rgb *= vColor2;\n}\n#include alphatest_fragment\noutgoingLight = diffuseColor.rgb;\ngl_FragColor = vec4( outgoingLight, diffuseColor.a * opacity );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n#endif\n}");const D_=Object.assign({linewidth:2},Of),R_=Object.assign({linewidth:{uniform:!0}},Nf);class L_ extends kp{constructor(e,t={}){super(e,t),this.parameterTypes=R_,this.vertexShader="WideLine.vert",this.fragmentShader="WideLine.frag",!e.color2&&e.color&&(e.color2=e.color),this.addUniforms({linewidth:{value:this.parameters.linewidth},resolution:{value:new Ge},projectionMatrixInverse:{value:new qt}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null}}),this.setAttributes(e),this.makeMapping()}get defaultParameters(){return D_}setParameters(e){super.setParameters(e)}}Yl.add("wideline",L_);class k_ extends v_{constructor(e,t,i){super(e,t,i),this.type="angle",this.parameters=Object.assign({atomTriple:{type:"hidden",rebuild:!0},vectorVisible:{type:"boolean",default:!0},arcVisible:{type:"boolean",default:!0},sectorVisible:{type:"boolean",default:!0}},this.parameters),this.init(i)}init(e){const t=e||{};t.side=uo(t.side,"double"),t.opacity=uo(t.opacity,.5),this.atomTriple=uo(t.atomTriple,[]),this.arcVisible=uo(t.arcVisible,!0),this.sectorVisible=uo(t.sectorVisible,!0),this.vectorVisible=uo(t.vectorVisible,!0),super.init(t)}createData(e){if(!e.atomCount||!this.atomTriple.length)return;const t=function(e,t){return function(e){const t=[],i=e.length/9;for(let n=0;n radius2) {\ndiscard;\n}\n#ifdef CAP\nsurface_point = front_point;\n_normal = axis;\n#else\nsurface_point = ray_target + ( (-a1 - sqrt(d)) / a2 ) * ray_direction;\ndNV = dot(-axis, ray_direction);\nnear = dot(axis, end) / dNV;\nnew_point2 = ray_direction * near + ray_origin;\nif (dot(new_point2 - end, new_point2-base) < radius2) {\ndiscard;\n}\ninterior = true;\n#endif\n}\nif( end_cap_test > 0.0 )\n{\nfloat dNV;\nfloat near;\nvec3 end_point;\nif ( ortho == 1.0 ) {\nend_point = ray_target;\n} else {\ndNV = dot(axis, ray_direction);\nif (dNV < 0.0) {\ndiscard;\n}\nnear = dot(axis, end) / dNV;\nend_point = ray_direction * near + ray_origin;\n}\nif( dot(end_point - end, end_point-base) > radius2 ) {\ndiscard;\n}\n#ifdef CAP\nsurface_point = end_point;\n_normal = axis;\n#else\nsurface_point = ray_target + ( (-a1 - sqrt(d)) / a2 ) * ray_direction;\ndNV = dot(-axis, ray_direction);\nnear = dot(-axis, (base)) / dNV;\nnew_point2 = ray_direction * near + ray_origin;\nif (dot(new_point2 - base, new_point2-base) < radius2) {\ndiscard;\n}\ninterior = true;\n#endif\n}\ngl_FragDepthEXT = calcDepth( surface_point );\n#ifdef NEAR_CLIP\nif( calcClip( surface_point ) > 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nsurface_point = ray_target + dist * ray_direction;\nif( calcClip( surface_point ) > 0.0 ) {\ndiscard;\n}\ninterior = true;\ngl_FragDepthEXT = calcDepth( surface_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / vRadius ) );\n}\n}else if( gl_FragDepthEXT <= 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nsurface_point = ray_target + dist * ray_direction;\ninterior = true;\ngl_FragDepthEXT = calcDepth( surface_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n}\n#else\nif( gl_FragDepthEXT <= 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nsurface_point = ray_target + dist * ray_direction;\ninterior = true;\ngl_FragDepthEXT = calcDepth( surface_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n}\n#endif\nif (gl_FragDepthEXT < 0.0) {\ndiscard;\n}\nif (gl_FragDepthEXT > 1.0) {\ndiscard;\n}\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vViewPosition = -surface_point;\nvec3 vNormal = _normal;\nvec3 vColor;\nif( distSq3( surface_point, end ) < distSq3( surface_point, base ) ){\nif( b < 0.0 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\n}else{\nif( b > 0.0 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\n}\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\nvec3 normal = normalize( vNormal );\nvec3 nonPerturbedNormal = normal;\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n#endif\n}");const $_=new Float32Array([-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1]),G_=new Uint16Array([0,1,2,1,4,2,2,4,3,4,5,3]);class H_ extends Dp{constructor(e,t={}){super("v3",e,t)}get mapping(){return $_}get mappingIndices(){return G_}get mappingIndicesSize(){return 12}get mappingSize(){return 6}get mappingItemSize(){return 3}}const j_=Object.assign({openEnded:!1},Of),W_=Object.assign({openEnded:{updateShader:!0}},Nf);class q_ extends H_{constructor(e,t={}){super(e,t),this.parameterTypes=W_,this.isImpostor=!0,this.vertexShader="CylinderImpostor.vert",this.fragmentShader="CylinderImpostor.frag",this.addUniforms({modelViewMatrixInverse:{value:new qt},ortho:{value:0}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null},radius:{type:"f",value:null}}),this.setAttributes(e),this.makeMapping()}get defaultParameters(){return j_}getDefines(e){const t=H_.prototype.getDefines.call(this,e);return this.parameters.openEnded||(t.CAP=1),t}}Object.assign({disableImpostor:!1},z_,j_);const X_=class{constructor(e,t={}){return!e.color2&&e.color&&(e.color2=e.color),!Ol||t&&t.disableImpostor?new V_(e,t):new q_(e,t)}};Yl.add("cylinder",X_);class Y_ extends y_{constructor(e,t,i){super(e,t,i),this.type="axes",this.parameters=Object.assign({radiusSize:{type:"number",precision:3,max:10,min:.001},sphereDetail:!0,radialSegments:!0,disableImpostor:!0,showAxes:{type:"boolean",rebuild:!0},showBox:{type:"boolean",rebuild:!0}},this.parameters,{assembly:null}),this.init(i)}init(e){const t=e||{};t.radiusSize=uo(t.radiusSize,.5),t.colorValue=uo(t.colorValue,"lightgreen"),t.useInteriorColor=uo(t.useInteriorColor,!0),this.showAxes=uo(t.showAxes,!0),this.showBox=uo(t.showBox,!1),super.init(t)}getPrincipalAxes(){let e;const t=this.getAssembly();return t&&(e=t.partList[0].getSelection()),this.structureView.getPrincipalAxes(e)}getAxesData(e){const t=this.getPrincipalAxes(),i=new Oi(this.colorValue);let n=0,r=0;this.showAxes&&(n+=6,r+=3),this.showBox&&(n+=8,r+=12);const s=new Float32Array(3*n),a=Mc(n,i.r,i.g,i.b),o=Sc(n,this.radiusSize),l=new Float32Array(3*r),c=new Float32Array(3*r),u=Mc(r,i.r,i.g,i.b),h=Sc(r,this.radiusSize);let d=0;if(this.showAxes){const e=function(e,t){e.toArray(s,2*d),t.toArray(s,2*d+3),e.toArray(l,d),t.toArray(c,d),d+=3};e(t.begA,t.endA),e(t.begB,t.endB),e(t.begC,t.endC)}if(this.showBox){const i=new _t,{d1a:n,d2a:r,d3a:a,d1b:o,d2b:u,d3b:h}=t.getProjectedScaleForAtoms(e);let f=2*d;const m=function(e,n,r){i.copy(t.center).addScaledVector(t.normVecA,e).addScaledVector(t.normVecB,n).addScaledVector(t.normVecC,r),i.toArray(s,f),f+=3};m(n,r,a),m(n,r,h),m(n,u,h),m(n,u,a),m(o,u,h),m(o,u,a),m(o,r,a),m(o,r,h);let p=d;const g=function(e,t){i.fromArray(s,2*d+3*e).toArray(l,p),i.fromArray(s,2*d+3*t).toArray(c,p),p+=3};g(0,1),g(0,3),g(0,6),g(1,2),g(1,7),g(2,3),g(2,4),g(3,5),g(4,5),g(4,7),g(5,6),g(6,7)}const f=new jd(t);return{vertex:{position:s,color:a,radius:o,picking:f},edge:{position1:l,position2:c,color:u,color2:u,radius:h,picking:f}}}create(){const e=this.getAxesData(this.structureView);this.sphereBuffer=new Np(e.vertex,this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0})),this.cylinderBuffer=new X_(e.edge,this.getBufferParams({openEnded:!0,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0})),this.dataList.push({sview:this.structureView,bufferList:[this.sphereBuffer,this.cylinderBuffer]})}createData(e){}updateData(e,t){const i=this.getAxesData(t.sview),n={},r={};e&&!e.position||(Object.assign(n,{position:i.vertex.position}),Object.assign(r,{position1:i.edge.position1,position2:i.edge.position2})),e&&!e.color||(Object.assign(n,{color:i.vertex.color}),Object.assign(r,{color:i.edge.color,color2:i.edge.color})),e&&!e.radius||(Object.assign(n,{radius:i.vertex.radius}),Object.assign(r,{radius:i.edge.radius})),this.sphereBuffer.setAttributes(n),this.cylinderBuffer.setAttributes(r)}}Hl.add("axes",Y_);class K_ extends y_{constructor(e,t,i){super(e,t,i),this.type="ball+stick",this.parameters=Object.assign({sphereDetail:!0,radialSegments:!0,openEnded:!0,disableImpostor:!0,aspectRatio:{type:"number",precision:1,max:10,min:1},lineOnly:{type:"boolean",rebuild:!0},cylinderOnly:{type:"boolean",rebuild:!0},multipleBond:{type:"select",rebuild:!0,options:{off:"off",symmetric:"symmetric",offset:"offset"}},bondScale:{type:"number",precision:2,max:1,min:.01},bondSpacing:{type:"number",precision:2,max:2,min:.5},linewidth:{type:"integer",max:50,min:1,buffer:!0}},this.parameters),this.init(i)}init(e){var t=e||{};t.radiusType=uo(t.radiusType,"size"),t.radiusSize=uo(t.radiusSize,.15),t.useInteriorColor=uo(t.useInteriorColor,!0),this.aspectRatio=uo(t.aspectRatio,2),this.lineOnly=uo(t.lineOnly,!1),this.cylinderOnly=uo(t.cylinderOnly,!1),this.multipleBond=uo(t.multipleBond,"off"),this.bondSpacing=uo(t.bondSpacing,1),this.bondScale=uo(t.bondScale,.4),this.linewidth=uo(t.linewidth,2),super.init(t)}getAtomRadius(e){return this.aspectRatio*super.getAtomRadius(e)}getAtomParams(e,t){var i=super.getAtomParams(e,t);return i.radiusParams.scale*=this.aspectRatio,i}getAtomData(e,t,i){return e.getAtomData(this.getAtomParams(t,i))}getBondParams(e,t){return t=Object.assign({multipleBond:this.multipleBond,bondSpacing:this.bondSpacing,bondScale:this.bondScale},t),super.getBondParams(e,t)}getBondData(e,t,i){return e.getBondData(this.getBondParams(t,i))}createData(e){const t=[];if(this.lineOnly)this.lineBuffer=new L_(this.getBondData(e,{position:!0,color:!0,picking:!0}),this.getBufferParams({linewidth:this.linewidth})),t.push(this.lineBuffer);else{const i=new X_(this.getBondData(e),this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0}));if(t.push(i),!this.cylinderOnly){const i=new Np(this.getAtomData(e),this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0}));t.push(i)}}return{bufferList:t}}updateData(e,t){"off"!==this.multipleBond&&e&&e.radius&&(e.position=!0);const i=this.getBondData(t.sview,e);if(this.lineOnly){const n={};e&&!e.position||Object.assign(n,{position1:i.position1,position2:i.position2}),e&&!e.color||Object.assign(n,{color:i.color,color2:i.color2}),t.bufferList[0].setAttributes(n)}else{var n={};if(e&&!e.position||Object.assign(n,{position1:i.position1,position2:i.position2}),e&&!e.color||Object.assign(n,{color:i.color,color2:i.color2}),e&&!e.radius||Object.assign(n,{radius:i.radius}),t.bufferList[0].setAttributes(n),!this.cylinderOnly){var r=this.getAtomData(t.sview,e),s={};e&&!e.position||Object.assign(s,{position:r.position}),e&&!e.color||Object.assign(s,{color:r.color}),e&&!e.radius||Object.assign(s,{radius:r.radius}),t.bufferList[1].setAttributes(s)}}}setParameters(e={}){let t=!1;const i={};return(e.aspectRatio||e.bondSpacing||e.bondScale)&&(Object.assign(i,{radius:!0}),Ol&&!this.disableImpostor||(t=!0)),super.setParameters(e,i,t),this}}Hl.add("ball+stick",K_);class Z_ extends K_{constructor(e,t,i){super(e,t,i),this.type="backbone",this.parameters=Object.assign({},this.parameters,{multipleBond:null,bondSpacing:null}),this.init(i)}init(e){var t=e||{};t.aspectRatio=uo(t.aspectRatio,1),t.radiusSize=uo(t.radiusSize,.25),super.init(t)}getAtomRadius(e){return e.isTrace()?super.getAtomRadius(e):0}getAtomData(e,t,i){return e.getBackboneAtomData(this.getAtomParams(t,i))}getBondData(e,t,i){return e.getBackboneBondData(this.getBondParams(t,i))}}Hl.add("backbone",Z_);class Q_ extends K_{constructor(e,t,i){super(e,t,i),this.type="base",this.parameters=Object.assign({},this.parameters,{multipleBond:null,bondSpacing:null})}init(e){let t=e||{};t.aspectRatio=uo(t.aspectRatio,1),t.radiusSize=uo(t.radiusSize,.3),super.init(t)}getAtomData(e,t,i){return e.getRungAtomData(this.getAtomParams(t,i))}getBondData(e,t,i){let n=this.getBondParams(t,i);return Object.assign(n.colorParams,{rung:!0}),e.getRungBondData(n)}}Hl.add("base",Q_);class J_{constructor(e,t){this.m=e,this.tension=t,this.dt=1/this.m,this.delta=1e-4,this.vec1=new _t,this.vec2=new _t,this.vDir=new _t,this.vTan=new _t,this.vNorm=new _t,this.vBin=new _t,this.m2=Math.ceil(this.m/2)}interpolateToArr(e,t,i,n,r,s,a){s[a+0]=Bo(e.x,t.x,i.x,n.x,r,this.tension),s[a+1]=Bo(e.y,t.y,i.y,n.y,r,this.tension),s[a+2]=Bo(e.z,t.z,i.z,n.z,r,this.tension)}interpolateToVec(e,t,i,n,r,s){s.x=Bo(e.x,t.x,i.x,n.x,r,this.tension),s.y=Bo(e.y,t.y,i.y,n.y,r,this.tension),s.z=Bo(e.z,t.z,i.z,n.z,r,this.tension)}interpolatePosition(e,t,i,n,r,s){for(var a=0;a1&&(c=1),this.interpolateToVec(e,t,i,n,l,this.vec1),this.interpolateToVec(e,t,i,n,c,this.vec2),this.vec2.sub(this.vec1).normalize(),this.vec2.toArray(r,u)}}vectorSubdivide(e,t,i,n,r){let s,a=t.next(),o=t.next(),l=t.next();const c=t.size,u=c-1;let h=n||0;for(let n=0;n0&&n{if(e.residueCount<4)return;i.push(e);const n=this.getSpline(e),r=this.getAspectRatio(e),s=n.getSubdividedPosition(),a=n.getSubdividedOrientation(),o=n.getSubdividedColor(this.getColorParams()),l=n.getSubdividedPicking(),c=n.getSubdividedSize(this.getRadiusParams());t.push(new ry(Object.assign({},s,a,o,l,c),this.getBufferParams({radialSegments:this.radialSegments,aspectRatio:r,capped:this.capped})))}),e.getSelection()),{bufferList:t,polymerList:i}}updateData(t,i){e.Debug&&Fl.time(this.type+" repr update"),t=t||{};for(var n=0,r=i.polymerList.length;n0;Xu(w,y,S);const r=qu(w,b)<0;if(th(w,b,qu(b,v)),Xu(M,v,w),th(w,b,qu(b,x)),Xu(A,x,w),0===Ju(M)||0===Ju(A))continue;ih(M,M),ih(A,A);const R=s[I]=lh(M,A);o[I]=(vc*R).toFixed(1)+String.fromCharCode(176),Wu(P,M,b),ih(P,P),qu(P,A)<0&&oh(P,P),x_(w,S,M,P,R/2),Zu(w,a,3*I);const L=Math.ceil(R/i),k=L+(t.extendLine?4:2),O=t.extendLine?36:0,N=new Float32Array(3*k),F=new Float32Array(3*k),B=new Float32Array(9*L),z=new Float32Array(O);l[I]=N,c[I]=F,u[I]=B,h[I]=z,t.extendLine&&(n?(Xu(w,p,_),ih(w,w),th(C,w,1/qu(M,w)),Yu(C,C,_)):(th(C,v,1/qu(M,v)),Yu(C,C,g)),r?(Xu(w,y,g),ih(w,w),th(T,w,1/qu(A,w)),Yu(T,T,g)):(th(T,x,1/qu(A,x)),Yu(T,T,_))),Yu(E,S,M);let U=0;t.extendLine?(Zu(p,N,U),Zu(C,F,U),U+=3,Zu(C,N,U),Zu(E,F,U),U+=3,Zu(C,z,0),Zu(E,z,3),Zu(n?_:g,z,6),Zu(n?_:g,z,9),Zu(E,z,12),Zu(S,z,15)):(Zu(S,N,U),Zu(E,F,U),U+=3);const V=function(e,t){const i=9*t;Zu(S,B,i),Zu(E,B,i+3),Zu(E,N,U),x_(E,S,M,P,e),Zu(E,B,i+6),Zu(E,F,U),U+=3};let $=0;for(let e=i;e{const t=ly(i,e);Object.assign(e,t)})),t.side=uo(t.side,"double"),t.opacity=uo(t.opacity,.5),t.radiusType=uo(t.radiusType,"size"),t.radiusSize=uo(t.radiusSize,.15),super.init(t)}getHistogramBinBorderBufferParameters(){return this.getBufferParams({linewidth:this.histogramBinBorderWidth,visible:this.histogramBinBorderVisible,opacity:this.histogramBinBorderOpacity})}getBondArrowsBufferParameters(){return this.getBufferParams({linewidth:this.bondArrowWidth,visible:this.bondArrowVisible,opacity:this.bondArrowOpacity})}getOpaqueMiddleDiscBufferParameters(){return this.getBufferParams({visible:this.opaqueMiddleDiscVisible,opacity:this.opaqueMiddleDiscOpacity})}getHistogramBufferParameters(){return this.getBufferParams({visible:!0,opacity:this.histogramOpacity,side:"double"})}createData(e){if(!e.atomCount||!this.histogramsData.length)return;this.histogramsData.forEach((t=>t.atomPositions=b_(e,[t.atomQuad])));const t=this.scaleBinToSectorArea?function(e){return Math.sqrt(e)}:function(e){return e};function i(e){const t=e.map((e=>e.length)),i=new Float32Array(Rc(t));let n=0;for(let t=0;te.startPoints))),position2:i(e.map((e=>e.endPoints))),color:i(e.map((e=>e.startColors))),color2:i(e.map((e=>e.endColors)))},t)}function r(e,t){return new Bf({position:i(e.map((e=>e.triangles))),color:i(e.map((e=>e.triangleColors)))},t)}this.histogramsData.forEach((e=>e.histogram360Scaled=e.histogram360.map(t)));const s=[];for(let e=0;e=3&&(t=hy(i)),void 0!==t&&s.push(t)}return this.frontHistogramBinBordersBuffer=n(s.map((e=>e.frontHistogramBinBorders)),this.getHistogramBinBorderBufferParameters()),this.backHistogramBinBordersBuffer=n(s.map((e=>e.backHistogramBinBorders)),this.getHistogramBinBorderBufferParameters()),this.adjacentBondArrowsBuffer=n(s.map((e=>e.adjacentBondArrows)),this.getBondArrowsBufferParameters()),this.distantBondArrowsBuffer=n(s.map((e=>e.distantBondArrows)),this.getBondArrowsBufferParameters()),this.opaqueMiddleDiscBuffer=r(s.map((e=>e.opaqueMiddleDisc)),this.getOpaqueMiddleDiscBufferParameters()),this.frontHistogramBuffer=r(s.map((e=>e.frontHistogram)),this.getHistogramBufferParameters()),this.backHistogramBuffer=r(s.map((e=>e.backHistogram)),this.getHistogramBufferParameters()),{bufferList:[].concat(this.frontHistogramBinBordersBuffer,this.backHistogramBinBordersBuffer,this.adjacentBondArrowsBuffer,this.distantBondArrowsBuffer,this.opaqueMiddleDiscBuffer,this.frontHistogramBuffer,this.backHistogramBuffer)}}setParameters(e){return super.setParameters(e,{},!1),e&&void 0!==e.histogramBinBorderVisible&&this.setVisibility(this.visible),this}setVisibility(e,t){return super.setVisibility(e,!0),this.frontHistogramBinBordersBuffer&&this.frontHistogramBinBordersBuffer.setVisibility(this.histogramBinBorderVisible),this.backHistogramBinBordersBuffer&&this.backHistogramBinBordersBuffer.setVisibility(this.histogramBinBorderVisible),t||this.viewer.requestRender(),this}}function hy(e){const t=e.atomPositions,i=e.histogram360Scaled,n=i.length<=180?360:2*i.length,r={triangles:new Float32Array(3*n*3),triangleColors:cy(e.opaqueMiddleDiscColor,3*n)},s={triangles:new Float32Array(3*i.length*3),triangleColors:cy(e.frontHistogramColor,3*i.length)},a={triangles:new Float32Array(3*i.length*3),triangleColors:cy(e.backHistogramColor,3*i.length)},o={startPoints:new Float32Array(3*i.length),endPoints:new Float32Array(3*i.length),startColors:cy(e.histogramBinBorderColor,i.length),endColors:cy(e.histogramBinBorderColor,i.length)},l={startPoints:new Float32Array(3*i.length),endPoints:new Float32Array(3*i.length),startColors:cy(e.histogramBinBorderColor,i.length),endColors:cy(e.histogramBinBorderColor,i.length)},c={startPoints:new Float32Array(6),endPoints:new Float32Array(6),startColors:cy(e.adjacentBondArrowColor,i.length),endColors:cy(e.adjacentBondArrowColor,i.length)},u={startPoints:new Float32Array(6),endPoints:new Float32Array(6),startColors:cy(e.distantBondArrowColor,i.length),endColors:cy(e.distantBondArrowColor,i.length)},h=ju(),d=ju(),f=ju(),m=ju(),p=ju(),g=ju(),_=ju(),y=ju(),v=ju(),b=ju(),x=ju(),w=ju(),S=ju(),M=ju(),A=ju(),C=ju(),T=[h,d,f,m];for(let e=0;e{let d=t[0],f=t[1];if("number"==typeof d&&Number.isInteger(d)&&"number"==typeof f&&Number.isInteger(f)){if(!h.get(d)||!h.get(f))return void(u+=1);l.index=d,c.index=f}else{s.setString(d),a.setString(f);var m=e.getAtomIndices(s),p=e.getAtomIndices(a);if(!m.length||!p.length)return void(u+=1);l.index=m[0],c.index=p[0]}o.addBond(l,c,1),i-=u;var g=l.distanceTo(c);switch(this.labelUnit){case"angstrom":n[i]=g.toFixed(2)+" "+String.fromCharCode(8491);break;case"nm":n[i]=(g/10).toFixed(2)+" nm";break;default:n[i]=g.toFixed(2)}var _=3*i;r[_+0]=(l.x+c.x)/2,r[_+1]=(l.y+c.y)/2,r[_+2]=(l.z+c.z)/2})),u>0&&(i-=u,r=r.subarray(0,3*i));var d=new Ih(o.count,!0);return{text:n,position:r,bondSet:d,bondStore:o}}getBondData(e,t,i){const n=e.getBondData(this.getBondParams(t,i));return n.picking&&(n.picking=new Yd(n.picking.array,n.picking.structure,i.bondStore)),n}createData(e){if(!e.atomCount||!this.atomPair.length)return;const t=this.atomPair.length,i=new Oi(this.labelColor),n=this.getDistanceData(e,this.atomPair);this.textBuffer=new I_({position:n.position,size:Sc(t,this.labelSize),color:Mc(t,i.r,i.g,i.b),text:n.text},this.getLabelBufferParams());const r={bondSet:n.bondSet,bondStore:n.bondStore},s=this.getBondData(e,{position:!0,color:!0,picking:!0,radius:this.useCylinder},r);return this.useCylinder?this.distanceBuffer=new X_(s,this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0})):this.distanceBuffer=new L_(uh(s),this.getBufferParams({linewidth:this.linewidth,visible:this.lineVisible,opacity:this.lineOpacity})),{bondSet:n.bondSet,bondStore:n.bondStore,position:n.position,bufferList:[this.textBuffer,this.distanceBuffer]}}updateData(e,t){super.updateData(e,t);const i={bondSet:t.bondSet,bondStore:t.bondStore},n=this.getBondData(t.sview,e,i),r={};e&&!e.color||Object.assign(r,{color:n.color,color2:n.color2}),e&&!e.radius||Object.assign(r,{radius:n.radius}),this.distanceBuffer.setAttributes(r)}setParameters(e){return super.setParameters(e,{},!1),this.useCylinder||(e&&e.lineOpacity&&this.distanceBuffer.setParameters({opacity:e.lineOpacity}),e&&void 0!==e.opacity&&this.distanceBuffer.setParameters({opacity:this.lineOpacity}),e&&e.linewidth&&this.distanceBuffer.setParameters({linewidth:e.linewidth})),this}}function fy(e){return 2*(e.position.length/3)*3}Hl.add("distance",dy);const my=Object.assign({scale:1,color:"grey"},Of);class py extends Ff{constructor(e,t={}){super({position:new Float32Array(fy(e)),color:new Float32Array(fy(e))},t),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag";const i=new Oi(this.parameters.color),n=this.geometry.attributes;Mc(fy(e)/3,i.r,i.g,i.b,n.color.array),this.setAttributes(e)}get defaultParameters(){return my}setAttributes(e={}){const t=this.geometry.attributes;let i,n,r;e.position&&e.vector&&(i=e.position,n=e.vector,r=t.position.array,t.position.needsUpdate=!0);const s=this.size/2,a=this.parameters.scale;if(i&&n)for(let e=0;e{if(e.residueCount<4)return;i.push(e);const n=new bm(e),r=n.getPosition(),s=n.getColor(this.getColorParams()),a=n.getSize(this.getRadiusParams()),o=n.getPicking();t.push(new Np({position:r.center,color:s.color,radius:a.size,picking:o.picking},this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0})),new py({position:r.center,vector:r.axis},this.getBufferParams({color:"skyblue",scale:1})),new py({position:r.center,vector:r.resdir},this.getBufferParams({color:"lightgreen",scale:1})))}),e.getSelection()),{bufferList:t,polymerList:i}}updateData(t,i){e.Debug&&Fl.time(this.type+" repr update"),t=t||{};for(let e=0,n=i.polymerList.length;e radius2) {\nspaceposition.y = mapping.y * 1.5 * radius1;\nspaceposition.x = mapping.x * 1.5 * radius1;\n} else {\nspaceposition.y = mapping.y * 1.5 * radius2;\nspaceposition.x = mapping.x * 1.5 * radius2;\n}\nspaceposition.w = 1.0;\nvec4 e3 = vec4( 1.0 );\nvec3 e1, e1_temp, e2, e2_temp;\ne3.xyz = normalize(position_atom1-position_atom2);\nif (e3.z == 0.0) { e3.z = 0.0000000000001;}\nif ( (position_atom1.x - position_atom2.x) == 0.0) { position_atom1.x += 0.001;}\nif ( (position_atom1.y - position_atom2.y) == 0.0) { position_atom1.y += 0.001;}\nif ( (position_atom1.z - position_atom2.z) == 0.0) { position_atom1.z += 0.001;}\nvec4 focus = vec4( 1.0 );\nfocus.x = ( position_atom1.x*position_atom1.x - position_atom2.x*position_atom2.x +\n( radius2*radius2 - radius1*radius1 )*e3.x*e3.x/shrink )/(2.0*(position_atom1.x - position_atom2.x));\nfocus.y = ( position_atom1.y*position_atom1.y - position_atom2.y*position_atom2.y +\n( radius2*radius2 - radius1*radius1 )*e3.y*e3.y/shrink )/(2.0*(position_atom1.y - position_atom2.y));\nfocus.z = ( position_atom1.z*position_atom1.z - position_atom2.z*position_atom2.z +\n( radius2*radius2 - radius1*radius1 )*e3.z*e3.z/shrink )/(2.0*(position_atom1.z - position_atom2.z));\ne1.x = 1.0;\ne1.y = 1.0;\ne1.z = ( (e3.x*focus.x + e3.y*focus.y + e3.z*focus.z) - e1.x*e3.x - e1.y*e3.y)/e3.z;\ne1_temp = e1 - focus.xyz;\ne1 = normalize(e1_temp);\ne2_temp = e1.yzx * e3.zxy - e1.zxy * e3.yzx;\ne2 = normalize(e2_temp);\nmat3 R= mat3( e1.xyz, e2.xyz, e3.xyz );\nvertex_position.xyz = R * spaceposition.xyz;\nvertex_position.w = 1.0;\nvertex_position.x += (position_atom1.x+position_atom2.x) / 2.0;\nvertex_position.y += (position_atom1.y+position_atom2.y) / 2.0;\nvertex_position.z += (position_atom1.z+position_atom2.z) / 2.0;\ngl_Position = modelViewProjectionMatrix * vertex_position;\nvec4 i_near, i_far;\nvec4 near = gl_Position;\nnear.z = 0.0 ;\nnear = modelViewProjectionMatrixInverse * near;\ni_near = near;\nvec4 far = gl_Position;\nfar.z = far.w ;\ni_far = modelViewProjectionMatrixInverse * far;\nprime1 = vec4( position_atom1 - (position_atom1 - focus.xyz)*shrink, 1.0 );\nprime2 = vec4( position_atom2 - (position_atom2 - focus.xyz)*shrink, 1.0 );\nfloat Rsquare = (radius1*radius1/shrink) - (\n(position_atom1.x - focus.x)*(position_atom1.x - focus.x) +\n(position_atom1.y - focus.y)*(position_atom1.y - focus.y) +\n(position_atom1.z - focus.z)*(position_atom1.z - focus.z)\n);\nfocus.w = Rsquare;\nmatrix_near = mat4( i_near, i_far, focus, e3 );\ngl_Position.z = 1.0;\n}"),Wl.add("shader/HyperballStickImpostor.frag","#define STANDARD\n#define IMPOSTOR\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 interiorColor;\nuniform float interiorDarkening;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\nuniform float clipNear;\nuniform float shrink;\nuniform mat4 modelViewMatrix;\nuniform mat4 modelViewProjectionMatrix;\nuniform mat4 modelViewMatrixInverseTranspose;\nuniform mat4 projectionMatrix;\nvarying mat4 matrix_near;\nvarying vec4 prime1;\nvarying vec4 prime2;\nvarying float vRadius;\nvarying float vRadius2;\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\nvarying vec3 vColor1;\nvarying vec3 vColor2;\n#include common\n#include fog_pars_fragment\n#include bsdfs\n#include lights_pars_begin\n#include lights_physical_pars_fragment\n#endif\nbool interior = false;\nfloat calcClip( vec4 cameraPos ){\nreturn dot( cameraPos, vec4( 0.0, 0.0, 1.0, clipNear - 0.5 ) );\n}\nfloat calcClip( vec3 cameraPos ){\nreturn calcClip( vec4( cameraPos, 1.0 ) );\n}\nfloat calcDepth( in vec3 cameraPos ){\nvec2 clipZW = cameraPos.z * projectionMatrix[2].zw + projectionMatrix[3].zw;\nreturn 0.5 + 0.5 * clipZW.x / clipZW.y;\n}\nstruct Ray {\nvec3 origin ;\nvec3 direction ;\n};\nbool cutoff_plane (vec3 M, vec3 cutoff, vec3 x3){\nfloat a = x3.x;\nfloat b = x3.y;\nfloat c = x3.z;\nfloat d = -x3.x*cutoff.x-x3.y*cutoff.y-x3.z*cutoff.z;\nfloat l = a*M.x+b*M.y+c*M.z+d;\nif (l<0.0) {return true;}\nelse{return false;}\n}\nvec3 isect_surf(Ray r, mat4 matrix_coef){\nvec4 direction = vec4(r.direction, 0.0);\nvec4 origin = vec4(r.origin, 1.0);\nfloat a = dot(direction,(matrix_coef*direction));\nfloat b = dot(origin,(matrix_coef*direction));\nfloat c = dot(origin,(matrix_coef*origin));\nfloat delta =b*b-a*c;\ngl_FragColor.a = 1.0;\nif (delta<0.0){\ndiscard;\n}\nfloat t1 =(-b-sqrt(delta))/a;\nreturn r.origin+t1*r.direction;\n}\nvec3 isect_surf2(Ray r, mat4 matrix_coef){\nvec4 direction = vec4(r.direction, 0.0);\nvec4 origin = vec4(r.origin, 1.0);\nfloat a = dot(direction,(matrix_coef*direction));\nfloat b = dot(origin,(matrix_coef*direction));\nfloat c = dot(origin,(matrix_coef*origin));\nfloat delta =b*b-a*c;\ngl_FragColor.a = 1.0;\nif (delta<0.0){\ndiscard;\n}\nfloat t2 =(-b+sqrt(delta))/a;\nreturn r.origin+t2*r.direction;\n}\nRay primary_ray(vec4 near1, vec4 far1){\nvec3 near=near1.xyz/near1.w;\nvec3 far=far1.xyz/far1.w;\nreturn Ray(near,far-near);\n}\nfloat update_z_buffer(vec3 M, mat4 ModelViewP){\nfloat depth1;\nvec4 Ms=(ModelViewP*vec4(M,1.0));\nreturn depth1=(1.0+Ms.z/Ms.w)/2.0;\n}\nvoid main(){\nfloat radius = max( vRadius, vRadius2 );\nvec4 i_near, i_far, focus;\nvec3 e3, e1, e1_temp, e2;\ni_near = vec4(matrix_near[0][0],matrix_near[0][1],matrix_near[0][2],matrix_near[0][3]);\ni_far = vec4(matrix_near[1][0],matrix_near[1][1],matrix_near[1][2],matrix_near[1][3]);\nfocus = vec4(matrix_near[2][0],matrix_near[2][1],matrix_near[2][2],matrix_near[2][3]);\ne3 = vec3(matrix_near[3][0],matrix_near[3][1],matrix_near[3][2]);\ne1.x = 1.0;\ne1.y = 1.0;\ne1.z = ( (e3.x*focus.x + e3.y*focus.y + e3.z*focus.z) - e1.x*e3.x - e1.y*e3.y)/e3.z;\ne1_temp = e1 - focus.xyz;\ne1 = normalize(e1_temp);\ne2 = normalize(cross(e1,e3));\nvec4 equation = focus;\nfloat shrinkfactor = shrink;\nfloat t1 = -1.0/(1.0-shrinkfactor);\nfloat t2 = 1.0/(shrinkfactor);\nvec4 colonne1, colonne2, colonne3, colonne4;\nmat4 mat;\nvec3 equation1 = vec3(t2,t2,t1);\nfloat A1 = - e1.x*equation.x - e1.y*equation.y - e1.z*equation.z;\nfloat A2 = - e2.x*equation.x - e2.y*equation.y - e2.z*equation.z;\nfloat A3 = - e3.x*equation.x - e3.y*equation.y - e3.z*equation.z;\nfloat A11 = equation1.x*e1.x*e1.x + equation1.y*e2.x*e2.x + equation1.z*e3.x*e3.x;\nfloat A21 = equation1.x*e1.x*e1.y + equation1.y*e2.x*e2.y + equation1.z*e3.x*e3.y;\nfloat A31 = equation1.x*e1.x*e1.z + equation1.y*e2.x*e2.z + equation1.z*e3.x*e3.z;\nfloat A41 = equation1.x*e1.x*A1 + equation1.y*e2.x*A2 + equation1.z*e3.x*A3;\nfloat A22 = equation1.x*e1.y*e1.y + equation1.y*e2.y*e2.y + equation1.z*e3.y*e3.y;\nfloat A32 = equation1.x*e1.y*e1.z + equation1.y*e2.y*e2.z + equation1.z*e3.y*e3.z;\nfloat A42 = equation1.x*e1.y*A1 + equation1.y*e2.y*A2 + equation1.z*e3.y*A3;\nfloat A33 = equation1.x*e1.z*e1.z + equation1.y*e2.z*e2.z + equation1.z*e3.z*e3.z;\nfloat A43 = equation1.x*e1.z*A1 + equation1.y*e2.z*A2 + equation1.z*e3.z*A3;\nfloat A44 = equation1.x*A1*A1 + equation1.y*A2*A2 + equation1.z*A3*A3 - equation.w;\ncolonne1 = vec4(A11,A21,A31,A41);\ncolonne2 = vec4(A21,A22,A32,A42);\ncolonne3 = vec4(A31,A32,A33,A43);\ncolonne4 = vec4(A41,A42,A43,A44);\nmat = mat4(colonne1,colonne2,colonne3,colonne4);\nRay ray = primary_ray(i_near,i_far) ;\nvec3 M;\nM = isect_surf(ray, mat);\nif (cutoff_plane(M, prime1.xyz, -e3) || cutoff_plane(M, prime2.xyz, e3)){ discard; }\nvec4 M1 = vec4(M,1.0);\nvec4 M2 = mat*M1;\nvec3 _normal = ( modelViewMatrixInverseTranspose * M2 ).xyz;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\n#ifdef NEAR_CLIP\nif( calcClip( modelViewMatrix * vec4( M, 1.0 ) ) > 0.0 ){\nM = isect_surf2(ray, mat);\nif( calcClip( modelViewMatrix * vec4( M, 1.0 ) ) > 0.0 )\ndiscard;\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / radius ) );\n}\n}else if( gl_FragDepthEXT <= 0.0 ){\nM = isect_surf2(ray, mat);\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix);\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / radius );\n}\n}\n#else\nif( gl_FragDepthEXT <= 0.0 ){\nM = isect_surf2(ray, mat);\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / radius );\n}\n}\n#endif\nif (cutoff_plane(M, prime1.xyz, -e3) || cutoff_plane(M, prime2.xyz, e3)){ discard; }\nif (gl_FragDepthEXT < 0.0)\ndiscard;\nif (gl_FragDepthEXT > 1.0)\ndiscard;\nfloat distance_ratio = ((M.x-prime2.x)*e3.x + (M.y-prime2.y)*e3.y +(M.z-prime2.z)*e3.z) /\ndistance(prime2.xyz,prime1.xyz);\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vViewPosition = -( modelViewMatrix * vec4( M, 1.0 ) ).xyz;\nvec3 vNormal = _normal;\nvec3 vColor;\nif( distance_ratio>0.5 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\nvec3 normal = normalize( vNormal );\nvec3 nonPerturbedNormal = normal;\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include colorspace_fragment\n#include fog_fragment\n#endif\n}");const yy=new Float32Array([-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1]),vy=new Uint16Array([0,1,2,0,2,3,1,5,6,1,6,2,4,6,5,4,7,6,0,7,4,0,3,7,0,5,1,0,4,5,3,2,6,3,6,7]);class by extends Dp{constructor(e,t={}){super("v3",e,t)}get mapping(){return yy}get mappingIndices(){return vy}get mappingIndicesSize(){return 36}get mappingSize(){return 8}get mappingItemSize(){return 3}}const xy=Object.assign({shrink:.14},Of),wy=Object.assign({shrink:{uniform:!0}},Nf);class Sy extends by{constructor(e,t={}){super(e,t),this.parameterTypes=wy,this.isImpostor=!0,this.vertexShader="HyperballStickImpostor.vert",this.fragmentShader="HyperballStickImpostor.frag",this.addUniforms({modelViewProjectionMatrix:{value:new qt},modelViewProjectionMatrixInverse:{value:new qt},modelViewMatrixInverseTranspose:{value:new qt},shrink:{value:this.parameters.shrink}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null},radius:{type:"f",value:null},radius2:{type:"f",value:null}}),this.setAttributes(e),this.makeMapping()}get defaultParameters(){return xy}}Object.assign({disableImpostor:!1},z_,xy);const My=class{constructor(e,t={}){return!Ol||t&&t.disableImpostor?(e.radius=function(e,t){const i=e.length,n=new Float32Array(i);for(let r=0;ro.push(n.atomLabel(e)))))}else if("residue"===this.labelGrouping){t&&!t.position||(l=[]),t&&!t.color||(u=[]),t&&!t.radius||(c=[]),t&&!t.text||(o=[]),i.colorParams&&(i.colorParams.structure=e.getStructure());const h=$l.getScheme(i.colorParams),d=new cm(i.radiusParams),f=e.getAtomProxy();let m=0;e.eachResidue((e=>{const i=3*m;e.isProtein()||e.isNucleic()?(f.index=e.traceAtomIndex,t&&!t.position||f.positionToArray(l,i)):(f.index=e.atomOffset,t&&!t.position||e.positionToArray(l,i)),t&&!t.color||h.atomColorToArray(f,u,i),t&&!t.radius||(c[m]=d.atomRadius(f)),t&&!t.text||o.push(n.atomLabel(f)),++m})),t&&!t.position||(r=new Float32Array(l)),t&&!t.color||(a=new Float32Array(u)),t&&!t.radius||(s=new Float32Array(c))}return{position:r,size:s,color:a,text:o}}createData(e){return{bufferList:[new I_(this.getTextData(e,{position:!0,color:!0,radius:!0,text:!0}),this.getBufferParams({fontFamily:this.fontFamily,fontStyle:this.fontStyle,fontWeight:this.fontWeight,xOffset:this.xOffset,yOffset:this.yOffset,zOffset:this.zOffset,attachment:this.attachment,showBorder:this.showBorder,borderColor:this.borderColor,borderWidth:this.borderWidth,showBackground:this.showBackground,backgroundColor:this.backgroundColor,backgroundMargin:this.backgroundMargin,backgroundOpacity:this.backgroundOpacity,fixedSize:this.fixedSize}))]}}updateData(e,t){t.bufferList[0].setAttributes(this.getTextData(t.sview,e))}getAtomRadius(){return 0}}function Py(e){const t=e.getAtomSet(),i=e.getBondSet(),n=e.getBondProxy();return i.forEach((function(e){n.index=e,t.clear(n.atomIndex1),t.clear(n.atomIndex2)})),t}Hl.add("label",Ty);class Ey extends y_{constructor(e,t,i){super(e,t,i),this.type="line",this.parameters=Object.assign({multipleBond:{type:"select",rebuild:!0,options:{off:"off",symmetric:"symmetric",offset:"offset"}},bondSpacing:{type:"number",precision:2,max:2,min:.5},linewidth:{type:"integer",max:50,min:1,buffer:!0},lines:{type:"boolean",rebuild:!0},crosses:{type:"select",rebuild:!0,options:{off:"off",lone:"lone",all:"all"}},crossSize:{type:"number",precision:2,max:2,min:.1}},this.parameters,{flatShaded:null,side:null,wireframe:null,roughness:null,metalness:null}),this.init(i)}init(e){var t=e||{};this.multipleBond=uo(t.multipleBond,"off"),this.bondSpacing=uo(t.bondSpacing,1),this.linewidth=uo(t.linewidth,2),this.lines=uo(t.lines,!0),this.crosses=uo(t.crosses,"lone"),this.crossSize=uo(t.crossSize,.4),super.init(t)}getAtomRadius(e){return.1}getBondParams(e,t){return t=Object.assign({multipleBond:this.multipleBond,bondSpacing:this.bondSpacing,radiusParams:{type:"size",size:.1,scale:1}},t),super.getBondParams(e,t)}_crossData(e,t){if(e&&!e.position&&!e.color)return;const i={};"lone"===this.crosses&&Object.assign(i,{atomSet:Py(t)});const n=t.getAtomData(this.getAtomParams(e,i)),r={},s=n.position,a=n.color,o=n.picking,l=(s||a).length,c=3*l;let u=new Float32Array(0),h=new Float32Array(0),d=new Float32Array(0),f=new Float32Array(0),m=0,p=new Float32Array(0);e&&!e.position||(u=r.position1=new Float32Array(c),h=r.position2=new Float32Array(c),m=this.crossSize/2),e&&!e.color||(d=r.color=new Float32Array(c),f=r.color2=new Float32Array(c)),e&&!e.picking||(p=new Float32Array(3*n.picking.array.length));for(let t=0;tc?d[p]=-1:(l=Math.sqrt(c-o),d[p]=Math.floor(l)),++p;m[g]=h,f[g]=d}}function P(i){var n,r,s,o,h,p,y,b,x,w,M,A,C,T,P,E,I,D,R=3*i,L=i;n=Math.floor(.5+a*(e[R]+d[0])),r=Math.floor(.5+a*(e[R+1]+d[1])),s=Math.floor(.5+a*(e[R+2]+d[2]));var k,O=t[L],N=f[O],F=0,B=c*u,z=m[O];for(w=0;w=l||T>=c||P>=u)){var U=C*B+T*u+P;if(g)if(_[U]&S){if(_[U]&S){var V=v[U];V!==R&&y*y+b*b+x*x<(o=n+y-Math.floor(.5+a*(e[V]+d[0])))*o+(h=r+b-Math.floor(.5+a*(e[V+1]+d[1])))*h+(p=s+x-Math.floor(.5+a*(e[V+2]+d[2])))*p&&(v[U]=i)}}else _[U]|=S,v[U]=i;else _[U]|=S}F++}}function E(t){var i,n;for(console.time("EDTSurface fillvoxels"),i=0,n=_.length;i=l||S>=c||A>=u)){var B=w*F+S*u+A;if(_[B]&M){if(g){var z=v[B];y*y+b*b+x*x<(o=Math.floor(.5+a*(e[z]+d[0])))*o+(h=Math.floor(.5+a*(e[z+1]+d[1])))*h+(p=Math.floor(.5+a*(e[z+2]+d[2])))*p&&(v[B]=i)}}else _[B]|=M,g&&(v[B]=i)}O++}}function D(){var e,t,i,n;console.time("EDTSurface fastdistancemap");var r,s=Iy(l,c,u,Uint16Array,3),a=c*u,h=p*p,d=0;for(e=0;e0);var w,C=o*o,T=new Uint16Array(3);for(e=0;e=C)||(_[r]|=A,g&&_[r]&M&&(s.toArray(e,t,i,T),w=T[0]*a+T[1]*u+T[2],v[r]=v[w])));console.timeEnd("EDTSurface fastdistancemap")}function R(e,t,i,n){var r,s,a,o,h,d,f,m,p,g,v,b,x=new Uint16Array(3),w=0;if(0===i)return w;var T=-1,P=-1,E=-1,I=c*u;for(f=0,p=i;f-1&&P-1&&E-1&&(_[v=T*I+u*P+E]&S&&!(_[v]&M)?(t.fromArray(T,P,E,x),g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d,y[v]=g,_[v]|=M,_[v]|=A,n[w]=T,n[w+1]=P,n[w+2]=E,w+=3):_[v]&S&&_[v]&M&&(g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d)-1&&P-1&&E-1&&(_[v=T*I+u*P+E]&S&&!(_[v]&M)?(t.fromArray(T,P,E,x),g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d,y[v]=g,_[v]|=M,_[v]|=A,n[w]=T,n[w+1]=P,n[w+2]=E,w+=3):_[v]&S&&_[v]&M&&(g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d)-1&&P-1&&E-1&&(_[v=T*I+u*P+E]&S&&!(_[v]&M)?(t.fromArray(T,P,E,x),g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d,y[v]=g,_[v]|=M,_[v]|=A,n[w]=T,n[w+1]=P,n[w+2]=E,w+=3):_[v]&S&&_[v]&M&&(g=(o=T-x[0])*o+(h=P-x[1])*h+(d=E-x[2])*d)-1&&a-1&&h-1&&oI&&(I=k)}return{neighbourListLength:27*I+1,withinRadii:function(r,s,a,o,h){for(var d=0,f=m(r,l),p=m(s,c),g=m(a,u),_=Math.max(0,f-1),x=Math.max(0,p-1),S=Math.max(0,g-1),M=Math.min(y,f+2),A=Math.min(v,p+2),E=Math.min(b,g+2),I=_;Id&&(d=u[e]);!function(){const e=Pf(l,c,d,m,0);m=e.scaleFactor,_=e.dim,y=e.matrix,L=Math.max(5,2+Math.floor(f*m)),v=Sc(_[0]*_[1]*_[2],-1001),b=new Int32Array(v.length),x=new Float32Array(_[0]),w=new Float32Array(_[1]),S=new Float32Array(_[2]),O(x,l[0],1/m),O(w,l[1],1/m),O(S,l[2],1/m)}(),function(){var e=0,t=2*Math.PI/g;A=new Float32Array(g),M=new Float32Array(g);for(var i=0;i=0;){if(s!==n&&s!==r&&F(s,e,t,i))return P=s,s;s=T[++a]}return P=-1,-1}function F(t,i,n,r){var s=3*t,a=h[t],o=e[s]-i,l=e[s+1]-n,c=e[s+2]-r;return o*o+l*l+c*c0&&d=0;)e{t(this._makeSurface(e.data.sd,i))}),(e=>{console.warn("MolecularSurface.getSurfaceWorker error - trying without worker",e),this.worker.terminate(),this.worker=void 0;const n=this.getSurface(i);t(n)}))}else{const e=this.getSurface(i);t(e)}}dispose(){this.worker&&this.worker.terminate()}}class Oy extends y_{constructor(e,t,i){super(e,t,i),this.type="surface",this.parameters=Object.assign({surfaceType:{type:"select",rebuild:!0,options:{vws:"vws",sas:"sas",ms:"ms",ses:"ses",av:"av"}},probeRadius:{type:"number",precision:1,max:20,min:0,rebuild:!0},smooth:{type:"integer",precision:1,max:10,min:0,rebuild:!0},scaleFactor:{type:"number",precision:1,max:5,min:0,rebuild:!0},cutoff:{type:"number",precision:2,max:50,min:0,rebuild:!0},contour:{type:"boolean",rebuild:!0},background:{type:"boolean",rebuild:!0},opaqueBack:{type:"boolean",buffer:!0},filterSele:{type:"text",rebuild:!0},colorVolume:{type:"hidden"},useWorker:{type:"boolean",rebuild:!0}},this.parameters,{radius:null,scale:null}),this.__infoList=[],this.structure.signals.refreshed.add((()=>{this.__forceNewMolsurf=!0})),this.toBePrepared=!0,this.init(i)}init(e){const t=e||{};t.colorScheme=uo(t.colorScheme,"uniform"),t.colorValue=uo(t.colorValue,14540253),t.disablePicking=uo(t.disablePicking,!0),this.surfaceType=uo(t.surfaceType,"ms"),this.probeRadius=uo(t.probeRadius,1.4),this.smooth=uo(t.smooth,2),this.scaleFactor=uo(t.scaleFactor,2),this.cutoff=uo(t.cutoff,0),this.contour=uo(t.contour,!1),this.background=uo(t.background,!1),this.opaqueBack=uo(t.opaqueBack,!0),this.filterSele=uo(t.filterSele,""),this.colorVolume=uo(t.colorVolume,void 0),this.useWorker=uo(t.useWorker,!0),super.init(e)}prepareData(e,t,i){let n=this.__infoList[t];if(n||(n={},this.__infoList[t]=n),n.molsurf&&n.sele===e.selection.string)i(t);else{if(this.filterSele){const n=e.structure.getView(new wl(this.filterSele)),r=n.boundingBox.getSize(new _t),s=Math.max(r.x,r.y,r.z),a=e.getAtomSetWithinPoint(n.center,s/2+6);if(0===(e=e.getView(new wl(e.getAtomSetWithinSelection(a,3).toSeleString()))).atomCount)return void i(t)}n.sele=e.selection.string,n.molsurf=new ky(e);const r=this.getSurfaceParams(),s=e=>{n.surface=e,i(t)};this.useWorker?n.molsurf.getSurfaceWorker(r,s):s(n.molsurf.getSurface(r))}}prepare(e){if((this.__forceNewMolsurf||this.__sele!==this.selection.string||this.__surfaceParams!==JSON.stringify(this.getSurfaceParams()))&&(this.__infoList.forEach((e=>{e&&e.molsurf&&e.molsurf.dispose()})),this.__infoList.length=0),0===this.structureView.atomCount)return void e();const t=()=>{this.__sele=this.selection.string,this.__surfaceParams=JSON.stringify(this.getSurfaceParams()),this.__forceNewMolsurf=!1,e()},i="default"===this.assembly?this.defaultAssembly:this.assembly,n=this.structure.biomolDict[i];n?n.partList.forEach(((e,i)=>{const r=e.getView(this.structureView);this.prepareData(r,i,(e=>{e===n.partList.length-1&&t()}))})):this.prepareData(this.structureView,0,t)}createData(e,t){const i=this.__infoList[t],n=i.surface;if(!n)return;const r={position:n.getPosition(),color:n.getColor(this.getColorParams()),index:n.getFilteredIndex(this.filterSele,e)},s=[];if(n.contour){const e=new Gf(r,this.getBufferParams({wireframe:!1}));s.push(e)}else{Object.assign(r,{normal:n.getNormal(),picking:n.getPicking(e.getStructure())});const t=new zf(r,this.getBufferParams({background:this.background,opaqueBack:this.opaqueBack,dullInterior:!1}));if("double"==this.getBufferParams().side){const e=new $f(t);s.push(e)}else s.push(t)}return{bufferList:s,info:i}}updateData(e,t){const i={};if(e.position||e.radius)return this.__forceNewMolsurf=!0,void this.build();e.color&&(i.color=t.info.surface.getColor(this.getColorParams())),e.index&&(i.index=t.info.surface.getFilteredIndex(this.filterSele,t.sview)),t.bufferList[0].setAttributes(i)}setParameters(e,t={},i){return e&&e.filterSele&&(t.index=!0),e&&void 0!==e.colorVolume&&(t.color=!0),e&&e.wireframe&&(e.contour||void 0===e.contour&&this.contour)&&(e.wireframe=!1),super.setParameters(e,t,i),this}getSurfaceParams(e={}){return Object.assign({type:this.surfaceType,probeRadius:this.probeRadius,scaleFactor:this.scaleFactor,smooth:this.smooth&&!this.contour,cutoff:this.cutoff,contour:this.contour,useWorker:this.useWorker,radiusParams:this.getRadiusParams()},e)}getColorParams(){const e=super.getColorParams();return e.volume=this.colorVolume,e}getAtomRadius(){return 0}clear(){super.clear()}dispose(){this.__infoList.forEach((e=>{e&&e.molsurf&&e.molsurf.dispose()})),this.__infoList.length=0,super.dispose()}}Hl.add("surface",Oy);class Ny extends y_{constructor(e,t,i){super(e,t,i),this.type="point",this.parameters=Object.assign({pointSize:{type:"number",precision:1,max:100,min:0,buffer:!0},sizeAttenuation:{type:"boolean",buffer:!0},sortParticles:{type:"boolean",rebuild:!0},useTexture:{type:"boolean",buffer:!0},alphaTest:{type:"range",step:.001,max:1,min:0,buffer:!0},forceTransparent:{type:"boolean",buffer:!0},edgeBleach:{type:"range",step:.001,max:1,min:0,buffer:!0}},this.parameters,{flatShaded:null,wireframe:null,linewidth:null,side:null,roughness:null,metalness:null}),this.init(i)}init(e){var t=e||{};this.pointSize=uo(t.pointSize,1),this.sizeAttenuation=uo(t.sizeAttenuation,!0),this.sortParticles=uo(t.sortParticles,!1),this.useTexture=uo(t.useTexture,!1),this.alphaTest=uo(t.alphaTest,.5),this.forceTransparent=uo(t.forceTransparent,!1),this.edgeBleach=uo(t.edgeBleach,0),super.init(t)}createData(e){var t=e.getAtomData(this.getAtomParams({position:!0,color:!0,picking:!0}));return{bufferList:[new Up(t,this.getBufferParams({pointSize:this.pointSize,sizeAttenuation:this.sizeAttenuation,sortParticles:this.sortParticles,useTexture:this.useTexture,alphaTest:this.alphaTest,forceTransparent:this.forceTransparent,edgeBleach:this.edgeBleach}))]}}updateData(e,t){var i=t.sview.getAtomData(this.getAtomParams(e)),n={};e&&!e.position||Object.assign(n,{position:i.position}),e&&!e.color||Object.assign(n,{color:i.color}),t.bufferList[0].setAttributes(n)}getAtomRadius(){return.1}}Hl.add("point",Ny),Wl.add("shader/Ribbon.vert","#define STANDARD\nuniform float clipNear;\nuniform vec3 clipCenter;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\nattribute vec3 dir;\nattribute float size;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\n#include color_pars_vertex\n#ifndef FLAT_SHADED\nvarying vec3 vNormal;\n#endif\n#endif\n#include common\nvoid main(void){\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\n#include color_vertex\n#include beginnormal_vertex\n#include defaultnormal_vertex\n#ifndef FLAT_SHADED\nvNormal = normalize( transformedNormal );\n#endif\n#endif\n#include begin_vertex\ntransformed += normalize( dir ) * size;\n#include project_vertex\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}");const Fy=new Uint16Array([0,1,2,1,3,2]);function By(e){return 3*(4*(e.position.length/3-1))}class zy extends Bf{constructor(e,t={}){super({position:new Float32Array(By(e)),color:new Float32Array(By(e)),index:So(By(e),By(e)/3),normal:new Float32Array(By(e)),picking:e.picking},t),this.vertexShader="Ribbon.vert";const i=e.position.length/3-1,n=4*i,r=3*n;this.addAttributes({dir:{type:"v3",value:new Float32Array(r)}}),this.addAttributes({size:{type:"f",value:new Float32Array(n)}}),e.primitiveId=Ac(i),this.setAttributes(e),this.makeIndex()}setAttributes(e={}){const t=this.size/4,i=this.geometry.attributes;let n,r,s,a,o,l,c,u,h,d,f,m,p,g,_,y,v,b,x;e.position&&(n=e.position,c=i.position.array,i.position.needsUpdate=!0),e.normal&&(r=e.normal,u=i.normal.array,i.normal.needsUpdate=!0),e.size&&(s=e.size,h=i.size.array,i.size.needsUpdate=!0),e.dir&&(a=e.dir,d=i.dir.array,i.dir.needsUpdate=!0),e.color&&(o=e.color,f=i.color.array,i.color.needsUpdate=!0),e.primitiveId&&(l=e.primitiveId,m=i.primitiveId.array,i.primitiveId.needsUpdate=!0);let w=s?s[0]:null;for(p=0;p{if(!(e.residueCount<4)){i.push(e);var n=new ey(e,this.getSplineParams()),r=n.getSubdividedPosition(),s=n.getSubdividedOrientation(),a=n.getSubdividedColor(this.getColorParams()),o=n.getSubdividedPicking(),l=n.getSubdividedSize(this.getRadiusParams());t.push(new zy({position:r.position,normal:s.binormal,dir:s.normal,color:a.color,size:l.size,picking:o.picking},this.getBufferParams()))}}),e.getSelection()),{bufferList:t,polymerList:i}}updateData(e,t){e=e||{};var i=0,n=t.polymerList.length;for(i=0;i{if(e.residueCount<4||e.isNucleic())return;const r=new xm(e),s=r.getAxis(this.localAngle,this.centerDist,this.ssBorder,this.getColorParams(),this.getRadiusParams());t+=s.size.length,i.push(s),n.push(r)}),e.getSelection());const r={begin:new Float32Array(3*t),end:new Float32Array(3*t),size:new Float32Array(t),color:new Float32Array(3*t),picking:{}};let s=new Float32Array(t),a=0;i.forEach((function(e){r.begin.set(e.begin,3*a),r.end.set(e.end,3*a),r.size.set(e.size,a),r.color.set(e.color,3*a),s.set(e.picking.array,a),a+=e.size.length})),t&&(r.picking=new Hd(s,e.getStructure()));return{bufferList:[new X_({position1:r.begin,position2:r.end,color:r.color,color2:r.color,radius:r.size,picking:r.picking},this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0}))],axisList:i,helixbundleList:n,axisData:r}}updateData(e,t){if((e=e||{}).position)this.build();else{var i={};if(e.color||e.radius){var n=0;t.helixbundleList.forEach((i=>{var r=i.getAxis(this.localAngle,this.centerDist,this.ssBorder,this.getColorParams(),this.getRadiusParams());e.color&&t.axisData.color.set(r.color,3*n),(e.radius||e.scale)&&t.axisData.size.set(r.size,n),n+=r.size.length})),e.color&&Object.assign(i,{color:t.axisData.color,color2:t.axisData.color}),(e.radius||e.scale)&&Object.assign(i,{radius:t.axisData.size})}t.bufferList[0].setAttributes(i)}}}Hl.add("rocket",Vy);class $y extends sy{constructor(e,t,i){super(e,t,i),this.type="rope",this.parameters=Object.assign({smooth:{type:"integer",max:15,min:0,rebuild:!0}},this.parameters,{aspectRatio:null,smoothSheet:null})}init(e){var t=e||{};t.aspectRatio=1,t.tension=uo(t.tension,.5),t.radiusScale=uo(t.radiusScale,5),t.smoothSheet=!1,this.smooth=uo(t.smooth,2),super.init(t)}getSpline(e){var t=new bm(e);return new ey(e,this.getSplineParams({directional:!1,positionIterator:t.getCenterIterator(this.smooth)}))}}Hl.add("rope",$y);class Gy extends y_{constructor(e,t,i){super(e,t,i),this.type="spacefill",this.parameters=Object.assign({sphereDetail:!0,disableImpostor:!0},this.parameters),this.init(i)}init(e){var t=e||{};t.useInteriorColor=uo(t.useInteriorColor,!0),super.init(t)}createData(e){return{bufferList:[new Np(e.getAtomData(this.getAtomParams()),this.getBufferParams({sphereDetail:this.sphereDetail,dullInterior:!0,disableImpostor:this.disableImpostor}))]}}updateData(e,t){var i=t.sview.getAtomData(this.getAtomParams(e)),n={};e&&!e.position||Object.assign(n,{position:i.position}),e&&!e.color||Object.assign(n,{color:i.color}),e&&!e.radius||Object.assign(n,{radius:i.radius}),t.bufferList[0].setAttributes(n)}}function Hy(e){return 3*(e.position.length/3-1)*2}Hl.add("spacefill",Gy);class jy extends Ff{constructor(e,t={}){super({position:new Float32Array(Hy(e)),color:new Float32Array(Hy(e))},t),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag",this.setAttributes(e)}setAttributes(e){let t,i,n,r;const s=this.geometry.attributes;if(e.position&&(t=e.position,n=s.position.array,s.position.needsUpdate=!0),e.color&&(i=e.color,r=s.color.array,s.color.needsUpdate=!0),!t&&!i)return void Fl.warn("TraceBuffer.prototype.setAttributes no data");let a,o;const l=this.size-1;for(let e=0;e{if(!(e.residueCount<4)){i.push(e);var n=new ey(e,this.getSplineParams()),r=n.getSubdividedPosition(),s=n.getSubdividedColor(this.getColorParams());t.push(new jy(Object.assign({},r,s),this.getBufferParams()))}}),e.getSelection()),{bufferList:t,polymerList:i}}updateData(e,t){e=e||{};var i=0,n=t.polymerList.length;for(i=0;i{e.boundingBox||e.computeBoundingBox(),this.boundingBox.union(e.boundingBox)}))}}const nv=Object.assign({aspectRatio:1.5,radialSegments:50,openEnded:!1,disableImpostor:!1},Of);class rv{constructor(e,t={}){this.group=new ma,this.wireframeGroup=new ma,this.pickingGroup=new ma,this.visible=!0,this.parameters=ho(t,this.defaultParameters),this.splitPosition=new Float32Array(e.position1.length),this.cylinderRadius=new Float32Array(e.radius.length);const i=this.makeAttributes(e),n={radialSegments:this.parameters.radialSegments,openEnded:this.parameters.openEnded,disableImpostor:this.parameters.disableImpostor};this.cylinderBuffer=new X_(i.cylinder,n),this.coneBuffer=new tv(i.cone,n),this.geometry=new iv([this.cylinderBuffer.geometry,this.coneBuffer.geometry]),this.matrix=uo(t.matrix,new qt),this.picking=e.picking}get defaultParameters(){return nv}set matrix(e){Ff.prototype.setMatrix.call(this,e)}get matrix(){return this.group.matrix.clone()}get pickable(){return!!this.picking}makeAttributes(e={}){const t=this.splitPosition,i=this.cylinderRadius,n=this.parameters.aspectRatio;let r,s;const a={},o={};if(e.radius){for(r=0,s=i.length;r0&&(s=1/Math.sqrt(s),e[0]=t[0]*s,e[1]=t[1]*s,e[2]=t[2]*s),e}function h(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function d(e,t,i){const n=t[0],r=t[1],s=t[2],a=i[0],o=i[1],l=i[2];return e[0]=r*l-s*o,e[1]=s*a-n*l,e[2]=n*o-r*a,e}e.zero=t,e.clone=function(e){const i=t();return i[0]=e[0],i[1]=e[1],i[2]=e[2],i},e.isFinite=function(e){return $v(e[0])&&$v(e[1])&&$v(e[2])},e.hasNaN=function(e){return isNaN(e[0])||isNaN(e[1])||isNaN(e[2])},e.setNaN=function(e){return e[0]=NaN,e[1]=NaN,e[2]=NaN,e},e.fromObj=function(e){return i(e.x,e.y,e.z)},e.toObj=function(e){return{x:e[0],y:e[1],z:e[2]}},e.fromArray=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],e},e.toArray=function(e,t,i){return t[i+0]=e[0],t[i+1]=e[1],t[i+2]=e[2],t},e.create=i,e.ofArray=function(e){const i=t();return i[0]=e[0],i[1]=e[1],i[2]=e[2],i},e.set=function(e,t,i,n){return e[0]=t,e[1]=i,e[2]=n,e},e.copy=n,e.add=r,e.sub=s,e.mul=function(e,t,i){return e[0]=t[0]*i[0],e[1]=t[1]*i[1],e[2]=t[2]*i[2],e},e.div=function(e,t,i){return e[0]=t[0]/i[0],e[1]=t[1]/i[1],e[2]=t[2]/i[2],e},e.scale=a,e.scaleAndAdd=o,e.scaleAndSub=function(e,t,i,n){return e[0]=t[0]-i[0]*n,e[1]=t[1]-i[1]*n,e[2]=t[2]-i[2]*n,e},e.addScalar=function(e,t,i){return e[0]=t[0]+i,e[1]=t[1]+i,e[2]=t[2]+i,e},e.subScalar=function(e,t,i){return e[0]=t[0]-i,e[1]=t[1]-i,e[2]=t[2]-i,e},e.round=function(e,t){return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e[2]=Math.round(t[2]),e},e.ceil=function(e,t){return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e},e.floor=function(e,t){return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e},e.trunc=function(e,t){return e[0]=Math.trunc(t[0]),e[1]=Math.trunc(t[1]),e[2]=Math.trunc(t[2]),e},e.abs=function(e,t){return e[0]=Math.abs(t[0]),e[1]=Math.abs(t[1]),e[2]=Math.abs(t[2]),e},e.min=function(e,t,i){return e[0]=Math.min(t[0],i[0]),e[1]=Math.min(t[1],i[1]),e[2]=Math.min(t[2],i[2]),e},e.max=function(e,t,i){return e[0]=Math.max(t[0],i[0]),e[1]=Math.max(t[1],i[1]),e[2]=Math.max(t[2],i[2]),e},e.clamp=function(e,t,i,n){return e[0]=Math.max(i[0],Math.min(n[0],t[0])),e[1]=Math.max(i[1],Math.min(n[1],t[1])),e[2]=Math.max(i[2],Math.min(n[2],t[2])),e},e.distance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1],r=t[2]-e[2];return Math.sqrt(i*i+n*n+r*r)},e.squaredDistance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1],r=t[2]-e[2];return i*i+n*n+r*r},e.magnitude=function(e){const t=e[0],i=e[1],n=e[2];return Math.sqrt(t*t+i*i+n*n)},e.squaredMagnitude=l,e.setMagnitude=function(e,t,i){return a(e,u(e,t),i)},e.negate=c,e.inverse=function(e,t){return e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e},e.normalize=u,e.dot=h,e.cross=d,e.lerp=function(e,t,i,n){const r=t[0],s=t[1],a=t[2];return e[0]=r+n*(i[0]-r),e[1]=s+n*(i[1]-s),e[2]=a+n*(i[2]-a),e};const f=t();function m(e,t){const i=Math.sqrt(l(e)*l(t));if(0===i)return Math.PI/2;const n=h(e,t)/i;return Math.acos(zv(n,-1,1))}e.slerp=function(e,t,i,n){const s=zv(h(t,i),-1,1),l=Math.acos(s)*n;return o(f,i,t,-s),u(f,f),r(e,a(e,t,Math.cos(l)),a(f,f,Math.sin(l)))},e.hermite=function(e,t,i,n,r,s){const a=s*s,o=a*(2*s-3)+1,l=a*(s-2)+s,c=a*(s-1),u=a*(3-2*s);return e[0]=t[0]*o+i[0]*l+n[0]*c+r[0]*u,e[1]=t[1]*o+i[1]*l+n[1]*c+r[1]*u,e[2]=t[2]*o+i[2]*l+n[2]*c+r[2]*u,e},e.bezier=function(e,t,i,n,r,s){const a=1-s,o=a*a,l=s*s,c=o*a,u=3*s*o,h=3*l*a,d=l*s;return e[0]=t[0]*c+i[0]*u+n[0]*h+r[0]*d,e[1]=t[1]*c+i[1]*u+n[1]*h+r[1]*d,e[2]=t[2]*c+i[2]*u+n[2]*h+r[2]*d,e},e.quadraticBezier=function(e,t,i,n,r){return e[0]=Vv(t[0],i[0],n[0],r),e[1]=Vv(t[1],i[1],n[1],r),e[2]=Vv(t[2],i[2],n[2],r),e},e.spline=function(e,t,i,n,r,s,a){return e[0]=Uv(t[0],i[0],n[0],r[0],s,a),e[1]=Uv(t[1],i[1],n[1],r[1],s,a),e[2]=Uv(t[2],i[2],n[2],r[2],s,a),e},e.random=function(e,t){const i=2*Math.random()*Math.PI,n=2*Math.random()-1,r=Math.sqrt(1-n*n)*t;return e[0]=Math.cos(i)*r,e[1]=Math.sin(i)*r,e[2]=n*t,e},e.transformMat4=function(e,t,i){const n=t[0],r=t[1],s=t[2],a=1/(i[3]*n+i[7]*r+i[11]*s+i[15]||1);return e[0]=(i[0]*n+i[4]*r+i[8]*s+i[12])*a,e[1]=(i[1]*n+i[5]*r+i[9]*s+i[13])*a,e[2]=(i[2]*n+i[6]*r+i[10]*s+i[14])*a,e},e.transformDirection=function(e,t,i){const n=t[0],r=t[1],s=t[2];return e[0]=i[0]*n+i[4]*r+i[8]*s,e[1]=i[1]*n+i[5]*r+i[9]*s,e[2]=i[2]*n+i[6]*r+i[10]*s,u(e,e)},e.transformMat4Offset=function(e,t,i,n,r,s){const a=t[0+r],o=t[1+r],l=t[2+r],c=1/(i[3+s]*a+i[7+s]*o+i[11+s]*l+i[15+s]||1);return e[0+n]=(i[0+s]*a+i[4+s]*o+i[8+s]*l+i[12+s])*c,e[1+n]=(i[1+s]*a+i[5+s]*o+i[9+s]*l+i[13+s])*c,e[2+n]=(i[2+s]*a+i[6+s]*o+i[10+s]*l+i[14+s])*c,e},e.transformDirectionOffset=function(e,t,i,n,r,s){const a=t[0+r],o=t[1+r],l=t[2+r];e[0+n]=i[0+s]*a+i[4+s]*o+i[8+s]*l,e[1+n]=i[1+s]*a+i[5+s]*o+i[9+s]*l,e[2+n]=i[2+s]*a+i[6+s]*o+i[10+s]*l;const c=Math.hypot(e[0+n],e[1+n],e[2+n]);return c>0&&(e[0+n]/=c,e[1+n]/=c,e[2+n]/=c),e},e.transformMat3=function(e,t,i){const n=t[0],r=t[1],s=t[2];return e[0]=n*i[0]+r*i[3]+s*i[6],e[1]=n*i[1]+r*i[4]+s*i[7],e[2]=n*i[2]+r*i[5]+s*i[8],e},e.transformQuat=function(e,t,i){const n=t[0],r=t[1],s=t[2],a=i[0],o=i[1],l=i[2],c=i[3],u=c*n+o*s-l*r,h=c*r+l*n-a*s,d=c*s+a*r-o*n,f=-a*n-o*r-l*s;return e[0]=u*c+f*-a+h*-l-d*-o,e[1]=h*c+f*-o+d*-a-u*-l,e[2]=d*c+f*-l+u*-o-h*-a,e},e.angle=m;const p=t(),g=t(),_=t(),y=t(),v=t(),b=t(),x=t();e.dihedralAngle=function(e,t,i,n){s(p,e,t),s(g,i,t),s(_,t,i),s(y,n,i),d(v,p,g),d(b,_,y);const r=m(v,b);return d(x,v,b),h(g,x)>0?r:-r},e.directionFromSpherical=function(t,i,n,r){return e.set(t,r*Math.cos(n)*Math.sin(i),r*Math.sin(n)*Math.sin(i),r*Math.cos(i))},e.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]},e.equals=function(e,t){const i=e[0],n=e[1],r=e[2],s=t[0],a=t[1],o=t[2];return Math.abs(i-s)<=Fv*Math.max(1,Math.abs(i),Math.abs(s))&&Math.abs(n-a)<=Fv*Math.max(1,Math.abs(n),Math.abs(a))&&Math.abs(r-o)<=Fv*Math.max(1,Math.abs(r),Math.abs(o))};const w=t();e.makeRotation=function(t,i,n){const r=m(i,n);if(Math.abs(r)<1e-4)return Wv.setIdentity(t);if(Math.abs(r-Math.PI)0?n(e,t):c(e,n(e,t)),e};const C=t(),T=t();e.triangleNormal=function(e,t,i,n){return s(C,i,t),s(T,n,t),u(e,d(e,C,T))},e.toString=function(e,t){return`[${e[0].toPrecision(t)} ${e[1].toPrecision(t)} ${e[2].toPrecision(t)}]`},e.origin=i(0,0,0),e.unit=i(1,1,1),e.negUnit=i(-1,-1,-1),e.unitX=i(1,0,0),e.unitY=i(0,1,0),e.unitZ=i(0,0,1),e.negUnitX=i(-1,0,0),e.negUnitY=i(0,-1,0),e.negUnitZ=i(0,0,-1)}(Gv||(Gv={}));const Hv=Math.PI/180;function jv(e){return e*Hv}function Wv(){return Wv.zero()}function qv(){return qv.zero()}function Xv(){return Xv.zero()}function Yv(){return Yv.zero()}function Kv(e){throw new Error("unreachable")}function Zv(){return Zv.zero()}var Qv,Jv,eb,tb;function ib(e,t,i){let n=t,r=0,s=1;for(45===e.charCodeAt(n)?(s=-1,++n):43===e.charCodeAt(n)&&++n;n9||t<0)return s*r|0;r=10*r+t|0}return s*r}function nb(e,t,i,n){return 43===t.charCodeAt(i)&&i++,e*Math.pow(10,ib(t,i,n))}function rb(e,t,i){let n=t,r=1,s=0,a=0,o=1;for(45===e.charCodeAt(n)?(r=-1,++n):43===e.charCodeAt(n)&&++n;n=0&&t<10)){if(-2===t){for(++n;n=0&&t<10))return 53===t||21===t?nb(r*(s+a/o),e,n+1,i):r*(s+a/o);a=10*a+t,o*=10,++n}return r*(s+a/o)}if(53===t||21===t)return nb(r*s,e,n+1,i);break}s=10*s+t,++n}return r*s}function sb(e,t,i,n){return{schema:i,__array:void 0,isDefined:0===n,rowCount:t,value:t=>e,valueKind:e=>n,toArray:i=>{const{array:n}=Lv(t,i);for(let t=0,i=n.length;t!0}}function ab({value:e,valueKind:t,areValuesEqual:i,rowCount:n,schema:r}){return{schema:r,__array:void 0,isDefined:!0,rowCount:n,value:e,valueKind:t||(e=>0),toArray:t=>{const{array:i,start:r}=Lv(n,t);for(let t=0,n=i.length;te(t)===e(i))}}function ob({array:e,schema:t,valueKind:i}){const n=e.length,r=t.T,s="str"===t.valueType?"lowercase"===t.transform?t=>{const i=e[t];return"string"==typeof i?i.toLowerCase():`${null!=i?i:r}`.toLowerCase()}:"uppercase"===t.transform?t=>{const i=e[t];return"string"==typeof i?i.toUpperCase():`${null!=i?i:r}`.toUpperCase()}:t=>{const i=e[t];return"string"==typeof i?i:`${null!=i?i:r}`}:t=>e[t],a=Ov(e);return{schema:t,__array:e,isDefined:!0,rowCount:n,value:s,valueKind:i||(e=>0),toArray:"str"===t.valueType?"lowercase"===t.transform?t=>{const{start:i,end:s}=Rv(n,t),a=new(t&&void 0!==t.array?t.array:e.constructor)(s-i);for(let t=0,n=s-i;t{const{start:i,end:s}=Rv(n,t),a=new(t&&void 0!==t.array?t.array:e.constructor)(s-i);for(let t=0,n=s-i;t{const{start:i,end:s}=Rv(n,t),a=new(t&&void 0!==t.array?t.array:e.constructor)(s-i);for(let t=0,n=s-i;tNv(e,t):t=>{const{start:i,end:r}=Rv(n,t);if(0===i&&r===e.length)return e;const s=new(t&&void 0!==t.array?t.array:e.constructor)(r-i);for(let t=0,n=r-i;te[t]===e[i]}}function lb(e,t,i){return e.isDefined?0===t&&i===e.rowCount?e:e.__array&&Ov(e.__array)?function(e,t,i){const n=Nv(e.__array,{start:t,end:i}),r=e.valueKind;return ob({array:n,schema:e.schema,valueKind:e=>r(t+e)})}(e,t,i):function(e,t,i){const n=e.value,r=e.valueKind,s=e.areValuesEqual,a=0===t?n:e=>n(e+t),o=i-t;return{schema:e.schema,__array:void 0,isDefined:e.isDefined,rowCount:o,value:a,valueKind:0===t?r:e=>r(e+t),toArray:e=>{const{array:i}=Lv(o,e);for(let e=0,r=i.length;es(e+t,i+t)}}(e,t,i):Jv.Undefined(i-t,e.schema)}function cb(e,t,i){return 0===e.rowCount||i&&function(e,t){if(e.length!==t)return!1;for(let t=0,i=e.length;tr(t[e])})}(e,t):function(e,t){const i=e.value,n=e.valueKind,r=e.areValuesEqual,s=e=>i(t[e]),a=t.length;return{schema:e.schema,__array:void 0,isDefined:e.isDefined,rowCount:a,value:s,valueKind:e=>n(t[e]),toArray:e=>{const{array:n}=Lv(a,e);for(let e=0,r=n.length;er(t[e],t[i])}}(e,t)}function ub(e,t,i){return e[t]-e[i]}function hb(e,t,i){const n=e[t];e[t]=e[i],e[i]=n}function db(e,t,i,n){const r=i+n>>1;return t(e,i,n)>0?t(e,i,r)>0?t(e,r,n)>0?r:n:i:t(e,n,r)>0?t(e,r,i)>0?r:i:n}function fb(e,t,i){const{cmp:n,swap:r,data:s,parts:a}=e;let o=t+1,l=i;for(r(s,t,db(s,n,t,i));n(s,l,t)>0;)--l;for(let e=t+1;e<=l;e++){const i=n(s,e,t);if(i>0){for(r(s,e,l),--l;n(s,l,t)>0;)--l;e--}else 0===i&&(r(s,e,o),o++)}for(let e=t;e=n&&t(e,r,r+1)>0;)i(e,r,r+1),r-=1}}function pb(e,t,i){const{parts:n}=e;for(;ta;)--s;for(let t=i+1;t<=s;t++){const i=e[t];if(i>a){for(hb(e,t,s),--s;e[s]>a;)--s;t--}else i===a&&(hb(e,t,r),++r)}for(let t=i;t=t&&e[r]>i;)e[r+1]=e[r],r-=1;e[r+1]=i}}function yb(e,t,i,n){for(;ii)return!1;return!0}function o(e,t,i,n){e[4*i+t]=n}function l(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}function c(e,t){const i=t[0]+t[5]+t[10];let n=0;return i>0?(n=2*Math.sqrt(i+1),e[3]=.25*n,e[0]=(t[6]-t[9])/n,e[1]=(t[8]-t[2])/n,e[2]=(t[1]-t[4])/n):t[0]>t[5]&&t[0]>t[10]?(n=2*Math.sqrt(1+t[0]-t[5]-t[10]),e[3]=(t[6]-t[9])/n,e[0]=.25*n,e[1]=(t[1]+t[4])/n,e[2]=(t[8]+t[2])/n):t[5]>t[10]?(n=2*Math.sqrt(1+t[5]-t[0]-t[10]),e[3]=(t[8]-t[2])/n,e[0]=(t[1]+t[4])/n,e[1]=.25*n,e[2]=(t[6]+t[9])/n):(n=2*Math.sqrt(1+t[10]-t[0]-t[5]),e[3]=(t[1]-t[4])/n,e[0]=(t[8]+t[2])/n,e[1]=(t[6]+t[9])/n,e[2]=.25*n),e}function u(e,t){const i=t[0],n=t[1],r=t[2],s=t[3],a=t[4],o=t[5],l=t[6],c=t[7],u=t[8],h=t[9],d=t[10],f=t[11],m=t[12],p=t[13],g=t[14],_=t[15],y=i*o-n*a,v=i*l-r*a,b=i*c-s*a,x=n*l-r*o,w=n*c-s*o,S=r*c-s*l,M=u*p-h*m,A=u*g-d*m,C=u*_-f*m,T=h*g-d*p,P=h*_-f*p,E=d*_-f*g;let I=y*E-v*P+b*T+x*C-w*A+S*M;return!!I&&(I=1/I,e[0]=(o*E-l*P+c*T)*I,e[1]=(r*P-n*E-s*T)*I,e[2]=(p*S-g*w+_*x)*I,e[3]=(d*w-h*S-f*x)*I,e[4]=(l*C-a*E-c*A)*I,e[5]=(i*E-r*C+s*A)*I,e[6]=(g*b-m*S-_*v)*I,e[7]=(u*S-d*b+f*v)*I,e[8]=(a*P-o*C+c*M)*I,e[9]=(n*C-i*P-s*M)*I,e[10]=(m*w-p*b+_*y)*I,e[11]=(h*b-u*w-f*y)*I,e[12]=(o*A-a*T-l*M)*I,e[13]=(i*T-n*A+r*M)*I,e[14]=(p*v-m*x-g*y)*I,e[15]=(u*x-h*v+d*y)*I,!0)}function h(e,t,i){const n=t[0],r=t[1],s=t[2],a=t[3],o=t[4],l=t[5],c=t[6],u=t[7],h=t[8],d=t[9],f=t[10],m=t[11],p=t[12],g=t[13],_=t[14],y=t[15];let v=i[0],b=i[1],x=i[2],w=i[3];return e[0]=v*n+b*o+x*h+w*p,e[1]=v*r+b*l+x*d+w*g,e[2]=v*s+b*c+x*f+w*_,e[3]=v*a+b*u+x*m+w*y,v=i[4],b=i[5],x=i[6],w=i[7],e[4]=v*n+b*o+x*h+w*p,e[5]=v*r+b*l+x*d+w*g,e[6]=v*s+b*c+x*f+w*_,e[7]=v*a+b*u+x*m+w*y,v=i[8],b=i[9],x=i[10],w=i[11],e[8]=v*n+b*o+x*h+w*p,e[9]=v*r+b*l+x*d+w*g,e[10]=v*s+b*c+x*f+w*_,e[11]=v*a+b*u+x*m+w*y,v=i[12],b=i[13],x=i[14],w=i[15],e[12]=v*n+b*o+x*h+w*p,e[13]=v*r+b*l+x*d+w*g,e[14]=v*s+b*c+x*f+w*_,e[15]=v*a+b*u+x*m+w*y,e}function d(e,t,i){let r=i[0],s=i[1],a=i[2],o=Math.sqrt(r*r+s*s+a*a);if(Math.abs(o)0&&(f=1/Math.sqrt(f),u*=f,h*=f,d*=f);let m=l*d-c*h,p=c*u-o*d,g=o*h-l*u;return f=m*m+p*p+g*g,f>0&&(f=1/Math.sqrt(f),m*=f,p*=f,g*=f),e[0]=m,e[1]=p,e[2]=g,e[3]=0,e[4]=h*g-d*p,e[5]=d*m-u*g,e[6]=u*p-h*m,e[7]=0,e[8]=u,e[9]=h,e[10]=d,e[11]=0,e[12]=r,e[13]=s,e[14]=a,e[15]=1,e},e.fromPermutation=function(e,t){r(e);for(let i=0;i<4;i++){o(e,i,t[i],1)}return e},e.getMaxScaleOnAxis=function(e){const t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],n=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,n))};const g=[1,0,0],_=[0,1,0],y=[0,0,1];e.rotX90=d(t(),jv(90),g),e.rotX180=d(t(),jv(180),g),e.rotY90=d(t(),jv(90),_),e.rotY180=d(t(),jv(180),_),e.rotY270=d(t(),jv(270),_),e.rotZ90=d(t(),jv(90),y),e.rotZ180=d(t(),jv(180),y),e.rotXY90=h(t(),e.rotX90,e.rotY90),e.rotZY90=h(t(),e.rotZ90,e.rotY90),e.rotZYZ90=h(t(),e.rotZY90,e.rotZ90),e.rotZ90X180=h(t(),e.rotZ90,e.rotX180),e.rotY90Z180=h(t(),e.rotY90,e.rotZ180),e.id=i()}(Wv||(Wv={})),function(e){function t(){const e=[.1,0,0,0,0,0,0,0,0];return e[0]=0,e}function i(){const e=t();return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e}function n(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[4],e[4]=t[5],e[5]=t[6],e[6]=t[8],e[7]=t[9],e[8]=t[10],e}e.zero=t,e.identity=i,e.setIdentity=function(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e},e.toArray=function(e,t,i){return t[i+0]=e[0],t[i+1]=e[1],t[i+2]=e[2],t[i+3]=e[3],t[i+4]=e[4],t[i+5]=e[5],t[i+6]=e[6],t[i+7]=e[7],t[i+8]=e[8],t},e.fromArray=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],e[3]=t[i+3],e[4]=t[i+4],e[5]=t[i+5],e[6]=t[i+6],e[7]=t[i+7],e[8]=t[i+8],e},e.fromColumns=function(e,t,i,n){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=i[0],e[4]=i[1],e[5]=i[2],e[6]=n[0],e[7]=n[1],e[8]=n[2],e},e.fromMat4=n;const r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];e.fromEuler=function(e,t,i){return Wv.fromEuler(r,t,i),n(e,r)},e.create=function(e,i,n,r,s,a,o,l,c){const u=t();return u[0]=e,u[1]=i,u[2]=n,u[3]=r,u[4]=s,u[5]=a,u[6]=o,u[7]=l,u[8]=c,u};const s=i();function a(e,t,i){for(let n=0;n<9;n++)if(Math.abs(e[n]-t[n])>i)return!1;return!0}function o(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e}function l(e,t){if(e===t){const i=t[1],n=t[2],r=t[5];e[1]=t[3],e[2]=t[6],e[3]=i,e[5]=t[7],e[6]=n,e[7]=r}else e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8];return e}function c(e,t){const i=t[0],n=t[1],r=t[2],s=t[3],a=t[4],o=t[5],l=t[6],c=t[7],u=t[8],h=u*a-o*c,d=-u*s+o*l,f=c*s-a*l;let m=i*h+n*d+r*f;return m?(m=1/m,e[0]=h*m,e[1]=(-u*n+r*c)*m,e[2]=(o*n-r*a)*m,e[3]=d*m,e[4]=(u*i-r*l)*m,e[5]=(-o*i+r*s)*m,e[6]=f*m,e[7]=(-c*i+n*l)*m,e[8]=(a*i-n*s)*m,e):(console.warn("non-invertible matrix.",t),e)}function u(e){const t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],l=e[7],c=e[8];return t*(c*s-a*l)+i*(-c*r+a*o)+n*(l*r-s*o)}function h(e){return e[0]+e[4]+e[8]}function d(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e[2]=t[2]-i[2],e[3]=t[3]-i[3],e[4]=t[4]-i[4],e[5]=t[5]-i[5],e[6]=t[6]-i[6],e[7]=t[7]-i[7],e[8]=t[8]-i[8],e}function f(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e[2]=t[2]*i,e[3]=t[3]*i,e[4]=t[4]*i,e[5]=t[5]*i,e[6]=t[6]*i,e[7]=t[7]*i,e[8]=t[8]*i,e}e.isIdentity=function(e,t){return a(e,s,void 0===t?Fv:t)},e.hasNaN=function(e){for(let t=0;t<9;t++)if(isNaN(e[t]))return!0;return!1},e.clone=function(e){return o(t(),e)},e.areEqual=a,e.setValue=function(e,t,i,n){e[3*i+t]=n},e.getValue=function(e,t,i){return e[3*i+t]},e.copy=o,e.transpose=l,e.invert=c,e.symmtricFromUpper=function(e,t){return e===t?(e[3]=t[1],e[6]=t[2],e[7]=t[5]):(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[1],e[4]=t[4],e[5]=t[5],e[6]=t[2],e[7]=t[5],e[8]=t[8]),e},e.symmtricFromLower=function(e,t){return e===t?(e[1]=t[3],e[2]=t[6],e[5]=t[7]):(e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[3],e[4]=t[4],e[5]=t[7],e[6]=t[6],e[7]=t[7],e[8]=t[8]),e},e.determinant=u,e.trace=h,e.sub=d,e.add=function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e[2]=t[2]+i[2],e[3]=t[3]+i[3],e[4]=t[4]+i[4],e[5]=t[5]+i[5],e[6]=t[6]+i[6],e[7]=t[7]+i[7],e[8]=t[8]+i[8],e},e.mul=function(e,t,i){const n=t[0],r=t[1],s=t[2],a=t[3],o=t[4],l=t[5],c=t[6],u=t[7],h=t[8],d=i[0],f=i[1],m=i[2],p=i[3],g=i[4],_=i[5],y=i[6],v=i[7],b=i[8];return e[0]=d*n+f*a+m*c,e[1]=d*r+f*o+m*u,e[2]=d*s+f*l+m*h,e[3]=p*n+g*a+_*c,e[4]=p*r+g*o+_*u,e[5]=p*s+g*l+_*h,e[6]=y*n+v*a+b*c,e[7]=y*r+v*o+b*u,e[8]=y*s+v*l+b*h,e},e.subScalar=function(e,t,i){return e[0]=t[0]-i,e[1]=t[1]-i,e[2]=t[2]-i,e[3]=t[3]-i,e[4]=t[4]-i,e[5]=t[5]-i,e[6]=t[6]-i,e[7]=t[7]-i,e[8]=t[8]-i,e},e.addScalar=function(e,t,i){return e[0]=t[0]+i,e[1]=t[1]+i,e[2]=t[2]+i,e[3]=t[3]+i,e[4]=t[4]+i,e[5]=t[5]+i,e[6]=t[6]+i,e[7]=t[7]+i,e[8]=t[8]+i,e},e.mulScalar=f;const m=Math.PI/3,p=t();e.symmetricEigenvalues=function(t,i){const n=i[1]*i[1]+i[2]*i[2]+i[5]*i[5];if(0===n)t[0]=i[0],t[1]=i[4],t[2]=i[8];else{const r=h(i)/3,s=i[0]-r,a=i[4]-r,o=i[8]-r,l=s*s+a*a+o*o+2*n,c=Math.sqrt(l/6);f(p,e.Identity,r),d(p,i,p),f(p,p,1/c);const g=u(p)/2,_=g<=-1?m:g>=1?0:Math.acos(g)/3;t[0]=r+2*c*Math.cos(_),t[2]=r+2*c*Math.cos(_+2*m),t[1]=3*r-t[0]-t[2]}return t};const g=[.1,0,0],_=[.1,0,0],y=[.1,0,0],v=[.1,0,0],b=[.1,0,0],x=[.1,0,0];e.eigenvector=function(e,t,i){Gv.set(g,t[0]-i,t[1],t[2]),Gv.set(_,t[1],t[4]-i,t[5]),Gv.set(y,t[2],t[5],t[8]-i),Gv.cross(v,g,_),Gv.cross(b,g,y),Gv.cross(x,_,y);const n=Gv.dot(v,v),r=Gv.dot(b,b),s=Gv.dot(x,x);let a=n,o=0;return r>a&&(a=r,o=1),s>a&&(o=2),0===o?Gv.scale(e,v,1/Math.sqrt(n)):1===o?Gv.scale(e,b,1/Math.sqrt(r)):Gv.scale(e,x,1/Math.sqrt(s)),e},e.directionTransform=function(e,t){return n(e,t),c(e,e),l(e,e),e},e.Identity=i(),e.innerProduct=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]+e[4]*t[4]+e[5]*t[5]+e[6]*t[6]+e[7]*t[7]+e[8]*t[8]}}(qv||(qv={})),function(e){function t(){const e=[.1,0];return e[0]=0,e}e.zero=t,e.clone=function(e){const i=t();return i[0]=e[0],i[1]=e[1],i},e.create=function(e,i){const n=t();return n[0]=e,n[1]=i,n},e.hasNaN=function(e){return isNaN(e[0])||isNaN(e[1])},e.toArray=function(e,t,i){return t[i+0]=e[0],t[i+1]=e[1],t},e.fromArray=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e},e.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e},e.set=function(e,t,i){return e[0]=t,e[1]=i,e},e.add=function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e},e.sub=function(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e},e.mul=function(e,t,i){return e[0]=t[0]*i[0],e[1]=t[1]*i[1],e},e.div=function(e,t,i){return e[0]=t[0]/i[0],e[1]=t[1]/i[1],e},e.scale=function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e},e.round=function(e,t){return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e},e.ceil=function(e,t){return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e},e.floor=function(e,t){return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e},e.distance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(i*i+n*n)},e.squaredDistance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1];return i*i+n*n},e.magnitude=function(e){const t=e[0],i=e[1];return Math.sqrt(t*t+i*i)},e.squaredMagnitude=function(e){const t=e[0],i=e[1];return t*t+i*i},e.inverse=function(e,t){return e[0]=1/t[0],e[1]=1/t[1],e},e.areEqual=function(e,t){return e[0]===t[0]&&e[1]===t[1]},e.toString=function(e,t){return`[${e[0].toPrecision(t)} ${e[1].toPrecision(t)}}]`}}(Xv||(Xv={})),function(e){function t(){const e=[.1,0,0,0];return e[0]=0,e}function i(e,t){return e[0]=t.center[0],e[1]=t.center[1],e[2]=t.center[2],e[3]=t.radius,e}e.zero=t,e.clone=function(e){const i=t();return i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[3],i},e.create=function(e,i,n,r){const s=t();return s[0]=e,s[1]=i,s[2]=n,s[3]=r,s},e.fromSphere=i,e.ofSphere=function(e){return i(t(),e)},e.hasNaN=function(e){return isNaN(e[0])||isNaN(e[1])||isNaN(e[2])||isNaN(e[3])},e.toArray=function(e,t,i){return t[i+0]=e[0],t[i+1]=e[1],t[i+2]=e[2],t[i+3]=e[3],t},e.fromArray=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],e[3]=t[i+3],e},e.toVec3Array=function(e,t,i){t[i+0]=e[0],t[i+1]=e[1],t[i+2]=e[2]},e.fromVec3Array=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],e[3]=0,e},e.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},e.set=function(e,t,i,n,r){return e[0]=t,e[1]=i,e[2]=n,e[3]=r,e},e.add=function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e[2]=t[2]+i[2],e[3]=t[3]+i[3],e},e.distance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1],r=t[2]-e[2],s=t[3]-e[3];return Math.sqrt(i*i+n*n+r*r+s*s)},e.scale=function(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e[2]=t[2]*i,e[4]=t[4]*i,e},e.round=function(e,t){return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e[2]=Math.round(t[2]),e[3]=Math.round(t[3]),e},e.ceil=function(e,t){return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e[3]=Math.ceil(t[3]),e},e.floor=function(e,t){return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e[3]=Math.floor(t[3]),e},e.squaredDistance=function(e,t){const i=t[0]-e[0],n=t[1]-e[1],r=t[2]-e[2],s=t[3]-e[3];return i*i+n*n+r*r+s*s},e.norm=function(e){const t=e[0],i=e[1],n=e[2],r=e[3];return Math.sqrt(t*t+i*i+n*n+r*r)},e.squaredNorm=function(e){const t=e[0],i=e[1],n=e[2],r=e[3];return t*t+i*i+n*n+r*r},e.transformMat4=function(e,t,i){const n=t[0],r=t[1],s=t[2],a=t[3];return e[0]=i[0]*n+i[4]*r+i[8]*s+i[12]*a,e[1]=i[1]*n+i[5]*r+i[9]*s+i[13]*a,e[2]=i[2]*n+i[6]*r+i[10]*s+i[14]*a,e[3]=i[3]*n+i[7]*r+i[11]*s+i[15]*a,e},e.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]},e.inverse=function(e,t){return e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e[3]=1/t[3],e},e.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.equals=function(e,t){const i=e[0],n=e[1],r=e[2],s=e[3],a=t[0],o=t[1],l=t[2],c=t[3];return Math.abs(i-a)<=Fv*Math.max(1,Math.abs(i),Math.abs(a))&&Math.abs(n-o)<=Fv*Math.max(1,Math.abs(n),Math.abs(o))&&Math.abs(r-l)<=Fv*Math.max(1,Math.abs(r),Math.abs(l))&&Math.abs(s-c)<=Fv*Math.max(1,Math.abs(s),Math.abs(c))},e.toString=function(e,t){return`[${e[0].toPrecision(t)} ${e[1].toPrecision(t)} ${e[2].toPrecision(t)} ${e[3].toPrecision(t)}]`}}(Yv||(Yv={})),function(e){function t(){const e=[.1,0,0,0];return e[0]=0,e}function i(){const e=t();return e[3]=1,e}function n(e,t,i){i*=.5;const n=Math.sin(i);return e[0]=n*t[0],e[1]=n*t[1],e[2]=n*t[2],e[3]=Math.cos(i),e}function r(e,t,i,n){const r=t[0],s=t[1],a=t[2],o=t[3];let l,c,u,h,d,f=i[0],m=i[1],p=i[2],g=i[3];return c=r*f+s*m+a*p+o*g,c<0&&(c=-c,f=-f,m=-m,p=-p,g=-g),1-c>1e-6?(l=Math.acos(c),u=Math.sin(l),h=Math.sin((1-n)*l)/u,d=Math.sin(n*l)/u):(h=1-n,d=n),e[0]=h*r+d*f,e[1]=h*s+d*m,e[2]=h*a+d*p,e[3]=h*o+d*g,e}function s(e,t){const i=t[0]+t[4]+t[8];let n;if(i>0)n=Math.sqrt(i+1),e[3]=.5*n,n=.5/n,e[0]=(t[5]-t[7])*n,e[1]=(t[6]-t[2])*n,e[2]=(t[1]-t[3])*n;else{let i=0;t[4]>t[0]&&(i=1),t[8]>t[3*i+i]&&(i=2);const r=(i+1)%3,s=(i+2)%3;n=Math.sqrt(t[3*i+i]-t[3*r+r]-t[3*s+s]+1),e[i]=.5*n,n=.5/n,e[3]=(t[3*r+s]-t[3*s+r])*n,e[r]=(t[3*r+i]+t[3*i+r])*n,e[s]=(t[3*s+i]+t[3*i+s])*n}return e}e.zero=t,e.identity=i,e.setIdentity=function(e){e[0]=0,e[1]=0,e[2]=0,e[3]=1},e.hasNaN=function(e){return isNaN(e[0])||isNaN(e[1])||isNaN(e[2])||isNaN(e[3])},e.create=function(e,t,n,r){const s=i();return s[0]=e,s[1]=t,s[2]=n,s[3]=r,s},e.setAxisAngle=n,e.getAxisAngle=function(e,t){const i=2*Math.acos(t[3]),n=Math.sin(i/2);return 0!==n?(e[0]=t[0]/n,e[1]=t[1]/n,e[2]=t[2]/n):(e[0]=1,e[1]=0,e[2]=0),i},e.multiply=function(e,t,i){const n=t[0],r=t[1],s=t[2],a=t[3],o=i[0],l=i[1],c=i[2],u=i[3];return e[0]=n*u+a*o+r*c-s*l,e[1]=r*u+a*l+s*o-n*c,e[2]=s*u+a*c+n*l-r*o,e[3]=a*u-n*o-r*l-s*c,e},e.rotateX=function(e,t,i){i*=.5;const n=t[0],r=t[1],s=t[2],a=t[3],o=Math.sin(i),l=Math.cos(i);return e[0]=n*l+a*o,e[1]=r*l+s*o,e[2]=s*l-r*o,e[3]=a*l-n*o,e},e.rotateY=function(e,t,i){i*=.5;const n=t[0],r=t[1],s=t[2],a=t[3],o=Math.sin(i),l=Math.cos(i);return e[0]=n*l-s*o,e[1]=r*l+a*o,e[2]=s*l+n*o,e[3]=a*l-r*o,e},e.rotateZ=function(e,t,i){i*=.5;const n=t[0],r=t[1],s=t[2],a=t[3],o=Math.sin(i),l=Math.cos(i);return e[0]=n*l+r*o,e[1]=r*l-n*o,e[2]=s*l+a*o,e[3]=a*l-s*o,e},e.calculateW=function(e,t){const i=t[0],n=t[1],r=t[2];return e[0]=i,e[1]=n,e[2]=r,e[3]=Math.sqrt(Math.abs(1-i*i-n*n-r*r)),e},e.slerp=r,e.invert=function(e,t){const i=t[0],n=t[1],r=t[2],s=t[3],a=i*i+n*n+r*r+s*s,o=a?1/a:0;return e[0]=-i*o,e[1]=-n*o,e[2]=-r*o,e[3]=s*o,e},e.conjugate=function(e,t){return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=t[3],e},e.dot=function(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]},e.fromMat3=s,e.fromEuler=function(e,t,i){const[n,r,s]=t,a=Math.cos(n/2),o=Math.cos(r/2),l=Math.cos(s/2),c=Math.sin(n/2),u=Math.sin(r/2),h=Math.sin(s/2);switch(i){case"XYZ":e[0]=c*o*l+a*u*h,e[1]=a*u*l-c*o*h,e[2]=a*o*h+c*u*l,e[3]=a*o*l-c*u*h;break;case"YXZ":e[0]=c*o*l+a*u*h,e[1]=a*u*l-c*o*h,e[2]=a*o*h-c*u*l,e[3]=a*o*l+c*u*h;break;case"ZXY":e[0]=c*o*l-a*u*h,e[1]=a*u*l+c*o*h,e[2]=a*o*h+c*u*l,e[3]=a*o*l-c*u*h;break;case"ZYX":e[0]=c*o*l-a*u*h,e[1]=a*u*l+c*o*h,e[2]=a*o*h-c*u*l,e[3]=a*o*l+c*u*h;break;case"YZX":e[0]=c*o*l+a*u*h,e[1]=a*u*l+c*o*h,e[2]=a*o*h-c*u*l,e[3]=a*o*l-c*u*h;break;case"XZY":e[0]=c*o*l-a*u*h,e[1]=a*u*l-c*o*h,e[2]=a*o*h+c*u*l,e[3]=a*o*l+c*u*h;break;default:Kv()}return e};const a=[0,0,0];function o(e,t){const i=t[0],n=t[1],r=t[2],s=t[3];let a=i*i+n*n+r*r+s*s;return a>0&&(a=1/Math.sqrt(a),e[0]=i*a,e[1]=n*a,e[2]=r*a,e[3]=s*a),e}e.fromUnitVec3=function(e,t,i){let n=Gv.dot(t,i)+1;return nMath.abs(t[2])?Gv.set(a,-t[1],t[0],0):Gv.set(a,0,-t[2],t[1])):Gv.cross(a,t,i),e[0]=a[0],e[1]=a[1],e[2]=a[2],e[3]=n,o(e,e),e},e.clone=function(e){const i=t();return i[0]=e[0],i[1]=e[1],i[2]=e[2],i[3]=e[3],i},e.toArray=function(e,t,i){return t[i+0]=e[0],t[i+1]=e[1],t[i+2]=e[2],t[i+3]=e[3],t},e.fromArray=function(e,t,i){return e[0]=t[i+0],e[1]=t[i+1],e[2]=t[i+2],e[3]=t[i+3],e},e.copy=function(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e},e.set=function(e,t,i,n,r){return e[0]=t,e[1]=i,e[2]=n,e[3]=r,e},e.exactEquals=function(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]},e.equals=function(e,t){const i=e[0],n=e[1],r=e[2],s=e[3],a=t[0],o=t[1],l=t[2],c=t[3];return Math.abs(i-a)<=Fv*Math.max(1,Math.abs(i),Math.abs(a))&&Math.abs(n-o)<=Fv*Math.max(1,Math.abs(n),Math.abs(o))&&Math.abs(r-l)<=Fv*Math.max(1,Math.abs(r),Math.abs(l))&&Math.abs(s-c)<=Fv*Math.max(1,Math.abs(s),Math.abs(c))},e.add=function(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e[2]=t[2]+i[2],e[3]=t[3]+i[3],e},e.normalize=o;const l=[0,0,0],c=[1,0,0],u=[0,1,0];e.rotationTo=function(e,t,i){const r=Gv.dot(t,i);return r<-.999999?(Gv.cross(l,c,t),Gv.magnitude(l)<1e-6&&Gv.cross(l,u,t),Gv.normalize(l,l),n(e,l,Math.PI),e):r>.999999?(e[0]=0,e[1]=0,e[2]=0,e[3]=1,e):(Gv.cross(l,t,i),e[0]=l[0],e[1]=l[1],e[2]=l[2],e[3]=1+r,o(e,e))};const h=t(),d=t();e.sqlerp=function(e,t,i,n,s,a){return r(h,t,s,a),r(d,i,n,a),r(e,h,d,2*a*(1-a)),e};const f=[0,0,0,0,0,0,0,0,0];e.setAxes=function(e,t,i,n){return f[0]=i[0],f[3]=i[1],f[6]=i[2],f[1]=n[0],f[4]=n[1],f[7]=n[2],f[2]=-t[0],f[5]=-t[1],f[8]=-t[2],o(e,s(e,f))},e.toString=function(e,t){return`[${e[0].toPrecision(t)} ${e[1].toPrecision(t)} ${e[2].toPrecision(t)} ${e[3].toPrecision(t)}]`},e.Identity=i()}(Zv||(Zv={})),function(e){function t(e,t,r){const s=function(e,t,i){const n=[];for(let e=0;ee[t],set:(e,t,i)=>e[t]=i,add:(e,t,i)=>e[t]+=i,dataOffset:e=>e,getCoords:(e,t)=>(t[0]=e,t)};case 2:if(0===i[0]&&1===i[1]){const e=t[0];return{get:(t,i,n)=>t[n*e+i],set:(t,i,n,r)=>t[n*e+i]=r,add:(t,i,n,r)=>t[n*e+i]+=r,dataOffset:(t,i)=>i*e+t,getCoords:(t,i)=>(i[0]=t%e,i[1]=Math.floor(t/e),i)}}if(1===i[0]&&0===i[1]){const e=t[1];return{get:(t,i,n)=>t[i*e+n],set:(t,i,n,r)=>t[i*e+n]=r,add:(t,i,n,r)=>t[i*e+n]+=r,dataOffset:(t,i)=>t*e+i,getCoords:(t,i)=>(i[0]=Math.floor(t/e),i[1]=t%e,i)}}throw new Error("bad axis order");case 3:if(0===i[0]&&1===i[1]&&2===i[2]){const e=t[0],i=t[1],n=e*i;return{get:(t,i,r,s)=>t[i+r*e+s*n],set:(t,i,r,s,a)=>t[i+r*e+s*n]=a,add:(t,i,r,s,a)=>t[i+r*e+s*n]+=a,dataOffset:(t,i,r)=>t+i*e+r*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=t%e,n[1]=r%i,n[2]=Math.floor(r/i),n}}}if(0===i[0]&&2===i[1]&&1===i[2]){const e=t[0],i=t[2],n=e*i;return{get:(t,i,r,s)=>t[i+s*e+r*n],set:(t,i,r,s,a)=>t[i+s*e+r*n]=a,add:(t,i,r,s,a)=>t[i+s*e+r*n]+=a,dataOffset:(t,i,r)=>t+r*e+i*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=t%e,n[1]=Math.floor(r/i),n[2]=r%i,n}}}if(1===i[0]&&0===i[1]&&2===i[2]){const e=t[1],i=t[0],n=e*i;return{get:(t,i,r,s)=>t[r+i*e+s*n],set:(t,i,r,s,a)=>t[r+i*e+s*n]=a,add:(t,i,r,s,a)=>t[r+i*e+s*n]+=a,dataOffset:(t,i,r)=>i+t*e+r*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=r%i,n[1]=t%e,n[2]=Math.floor(r/i),n}}}if(1===i[0]&&2===i[1]&&0===i[2]){const e=t[1],i=t[2],n=e*i;return{get:(t,i,r,s)=>t[r+s*e+i*n],set:(t,i,r,s,a)=>t[r+s*e+i*n]=a,add:(t,i,r,s,a)=>t[r+s*e+i*n]+=a,dataOffset:(t,i,r)=>i+r*e+t*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=Math.floor(r/i),n[1]=t%e,n[2]=r%i,n}}}if(2===i[0]&&0===i[1]&&1===i[2]){const e=t[2],i=t[0],n=e*i;return{get:(t,i,r,s)=>t[s+i*e+r*n],set:(t,i,r,s,a)=>t[s+i*e+r*n]=a,add:(t,i,r,s,a)=>t[s+i*e+r*n]+=a,dataOffset:(t,i,r)=>r+t*e+i*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=r%i,n[1]=Math.floor(r/i),n[2]=t%e,n}}}if(2===i[0]&&1===i[1]&&0===i[2]){const e=t[2],i=t[1],n=e*i;return{get:(t,i,r,s)=>t[s+r*e+i*n],set:(t,i,r,s,a)=>t[s+r*e+i*n]=a,add:(t,i,r,s,a)=>t[s+r*e+i*n]+=a,dataOffset:(t,i,r)=>r+i*e+t*n,getCoords:(t,n)=>{const r=Math.floor(t/e);return n[0]=Math.floor(r/i),n[1]=r%i,n[2]=t%e,n}}}throw new Error("bad axis order");default:return{get:(t,...i)=>t[r(e,i)],set:(t,...i)=>t[r(e,i)]=i[i.length-1],add:(t,...i)=>t[r(e,i)]+=i[i.length-1],dataOffset:(...t)=>r(e,t),getCoords:(t,i)=>function(e,t,i){const{dimensions:n,axisOrderFastToSlow:r}=e,s=n.length;let a=t;for(let e=0;enew(t||e.defaultCtor)(i)}function r(e,t){const{accessDimensions:i,axisOrderFastToSlow:n}=e,r=i.length-1;let s=i[r]*t[n[r]];for(let e=r-1;e>=0;e--)s=(s+t[n[e]])*i[e];return s}function s(e,t){const i=[];for(let n=0;ns(e,t)},e.convertToCanonicalAxisIndicesSlowToFast=function(e){const t=new Int32Array(e.length);for(let i=0;is(e,t)}}(Qv||(Qv={})),function(e){let t;function i(e,t){return sb(t.T,e,t,1)}function n(e){return ab(e)}!function(e){function t(t,i=e.float){return{"@type":"tensor",T:t.create(),space:t,valueType:"tensor",baseType:i}}e.str={"@type":"str",T:"",valueType:"str"},e.ustr={"@type":"str",T:"",valueType:"str",transform:"uppercase"},e.lstr={"@type":"str",T:"",valueType:"str",transform:"lowercase"},e.int={"@type":"int",T:0,valueType:"int"},e.coord={"@type":"coord",T:0,valueType:"float"},e.float={"@type":"float",T:0,valueType:"float"},e.Str=function(e){var t;return{"@type":"str",T:null!==(t=null==e?void 0:e.defaultValue)&&void 0!==t?t:"",transform:null==e?void 0:e.transform,valueType:"str"}},e.Int=function(e=0){return{"@type":"int",T:e,valueType:"int"}},e.Float=function(e=0){return{"@type":"float",T:e,valueType:"float"}},e.Tensor=t,e.Vector=function(i,n=e.float){return t(Qv.Vector(i,"int"===n["@type"]?Int32Array:Float64Array),n)},e.Matrix=function(i,n,r=e.float){return t(Qv.ColumnMajorMatrix(i,n,"int"===r["@type"]?Int32Array:Float64Array),r)},e.Aliased=function(e){return e},e.List=function(e,t,i=[]){return{"@type":"list",T:i,separator:e,itemParse:t,valueType:"list"}}}(t=e.Schema||(e.Schema={})),e.is=function(e){return!!e&&!!e.schema&&!!e.value},e.ValueKind={Present:0,NotPresent:1,Unknown:2},e.Undefined=i,e.ofConst=function(e,t,i){return sb(e,t,i,0)},e.ofLambda=n,e.range=function(e,i){return n({value:t=>t+e,rowCount:Math.max(i-e+1,0),schema:t.int})},e.ofArray=function(e){return ob(e)},e.ofIntArray=function(e){return ob({array:e,schema:t.int})},e.ofFloatArray=function(e){return ob({array:e,schema:t.float})},e.ofStringArray=function(e){return ob({array:e,schema:t.str})},e.ofStringAliasArray=function(e){return ob({array:e,schema:t.Aliased(t.str)})},e.ofStringListArray=function(e,i=","){return ob({array:e,schema:t.List(i,(e=>e))})},e.ofIntTokens=function(e){const{count:i,data:n,indices:r}=e;return ab({value:e=>ib(n,r[2*e],r[2*e+1])||0,rowCount:i,schema:t.int})},e.ofFloatTokens=function(e){const{count:i,data:n,indices:r}=e;return ab({value:e=>rb(n,r[2*e],r[2*e+1])||0,rowCount:i,schema:t.float})},e.ofStringTokens=function(e){const{count:i,data:n,indices:r}=e;return ab({value:e=>{const t=n.substring(r[2*e],r[2*e+1]);return"."===t||"?"===t?"":t},rowCount:i,schema:t.str})},e.window=function(e,t,i){return lb(e,t,i)},e.view=function(e,t,i=!0){return cb(e,t,i)},e.createFirstIndexMap=function(e){return function(e){const t=new Map;for(let i=0,n=e.rowCount;it.has(e)?t.get(e):-1}(e)},e.mapToArray=function(e,t,i){return function(e,t,i){const n=new i(e.rowCount);for(let i=0,r=e.rowCount;i0&&(e.chunks[e.chunks.length]=e.current.length===e.offset?e.current.join(""):e.current.slice(0,e.offset).join("")),e.chunks.join("")):e.current.length===e.offset?e.current.join(""):e.current.splice(0,e.offset).join("")},e.getSize=function(e){let t=0;for(const i of e.chunks)t+=i.length;for(let i=0;i0&&(e.current.length===e.offset?e.chunks[e.chunks.length]=e.current.join(""):e.chunks[e.chunks.length]=e.current.slice(0,e.offset).join(""),e.offset=0),e.chunks};const t=[];function i(e,i){i>0&&n(e,t[i])}function n(e,t){e.offset===e.capacity&&(e.chunks[e.chunks.length]=e.current.join(""),e.offset=0),e.current[e.offset++]=t}!function(){let e="";for(let i=0;i<512;i++)t[i]=e,e+=" "}(),e.newline=function(e){n(e,"\n")},e.whitespace=i,e.whitespace1=function(e){n(e," ")},e.write=function(e,t){t&&(e.offset===e.capacity&&(e.chunks[e.chunks.length]=e.current.join(""),e.offset=0),e.current[e.offset++]=t)},e.writeSafe=n,e.writePadLeft=function(e,t,r){if(!t)return void i(e,r);i(e,r-t.length),n(e,t)},e.writePadRight=function(e,t,r){if(!t)return void i(e,r);const s=r-t.length;n(e,t),i(e,s)},e.writeInteger=function(e,t){n(e,""+t)},e.writeIntegerAndSpace=function(e,t){n(e,t+" ")},e.writeIntegerPadLeft=function(e,t,r){const s=""+t;i(e,r-s.length),n(e,s)},e.writeIntegerPadRight=function(e,t,r){const s=""+t,a=r-s.length;n(e,s),i(e,a)},e.writeFloat=function(e,t,i){n(e,""+Math.round(i*t)/i)},e.writeFloatPadLeft=function(e,t,r,s){const a=""+Math.round(r*t)/r;i(e,s-a.length),n(e,a)},e.writeFloatPadRight=function(e,t,r,s){const a=""+Math.round(r*t)/r,o=s-a.length;n(e,a),i(e,o)}}(tb||(tb={}));const bb=function(){if("undefined"!=typeof window&&window.performance){const e=window.performance;return()=>e.now()}return"undefined"!=typeof process&&"undefined"!==process.hrtime&&"function"==typeof process.hrtime?()=>{const e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:Date.now?()=>Date.now():()=>+new Date}();var xb,wb,Sb;function Mb(e,t){return e-t}function Ab(e=0,t=Number.MAX_SAFE_INTEGER){let i=e;return()=>{const e=i;return i=(i+1)%t,e}}!function(e){const t="undefined"!=typeof btoa?btoa:e=>Buffer.from(e).toString("base64"),i=[];e.create22=function(){let e=+new Date+bb();for(let t=0;t<16;t++)i[t]=String.fromCharCode((e+255*Math.random())%255|0),e=Math.floor(e/255);return t(i.join("")).replace(/\+/g,"-").replace(/\//g,"_").substr(0,22)},e.createv4=function(){let e=+new Date+bb();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(t){const i=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===t?i:3&i|8).toString(16)}))},e.is=function(e){return"string"==typeof e}}(xb||(xb={})),function(e){class t{has(e){return!1}forEach(e,t){return t}constructor(){this.size=0}}class i{has(e){return e===this.idx}forEach(e,t){return e(this.idx,t),t}constructor(e){this.idx=e,this.size=1}}class n{has(e){return ee[t++]=i)),function(e){Array.prototype.sort.call(e,Mb)}(e),this._flat=e,this._flat}forEach(e,t){return this._forEach(e,t),t}constructor(e){this.set=e,this._flat=void 0,this.size=e.size}}function a(e){return new s(e)}function o(e,t){return new n(e,t)}e.always=function(e){return new r(e)},e.never=new t,e.ofSet=a,e.singleton=function(e){return new i(e)},e.ofUniqueIndices=function(e){const a=e.length;if(0===a)return new t;if(1===a)return new i(e[0]);let o=0;for(const t of e)t>o&&(o=t);if(a===o)return new r(a);if(a/o<1/12){const t=new Set;for(const i of e)t.add(i);return new s(t)}const l=new Int8Array(o+1);for(const t of e)l[t]=1;return new n(l,e.length)},e.ofMask=o,e.hasAny=function(e,t){for(const i of t)if(e.has(i))return!0;return!1},e.complement=function(e,t){let i=0,n=0;if(t.forEach((t=>{e.has(t)||(i++,t>n&&(n=t))})),i/n<1/12){const i=new Set;return t.forEach((t=>{e.has(t)||i.add(t)})),a(i)}{const r=new Uint8Array(n+1);return t.forEach((t=>{e.has(t)||(r[t]=1)})),o(r,i)}}}(wb||(wb={})),function(e){e.create=function(e){return{ref:e}},e.set=function(e,t){return e.ref=t,e}}(Sb||(Sb={}));const Cb=Ab(0,2147483647);var Tb,Pb,Eb,Ib,Db;function Rb(e){const{data:t,indices:i}=e;return function(e,n){const r=i[2*e],s=i[2*n],a=i[2*e+1]-r;if(a!==i[2*n+1]-s)return!1;for(let e=0;en[e]}}!function(e){e.create=function(e,t){return{id:Cb(),version:0,value:e,metadata:t}},e.withValue=function(e,t){return{id:e.id,version:e.version+1,value:t,metadata:e.metadata}}}(Tb||(Tb={})),function(e){function t(e,t){return Sb.set(e,Tb.withValue(e.ref,t))}e.create=function(e,t){return Sb.create(Tb.create(e,t))},e.update=t,e.set=function(e,t){return Sb.set(e,t)},e.updateIfChanged=function(e,i){return e.ref.value!==i?t(e,i):e}}(Pb||(Pb={})),function(e){function t(e,t,i){const n=Object.create(null),r=Object.keys(t);n._rowCount=i.length,n._columns=r,n._schema=t;for(const t of r)n[t]=Jv.view(e[t],i);return n}function i(e,t){const i=Object.create(null),{_columns:n}=e;for(let r=0;rt[e][s],valueKind:e=>void 0===t[e][s]?1:0});return i},e.ofArrays=function(e,t){var i;const n=Object.create(null),r=Object.keys(e);n._rowCount=0,n._columns=r,n._schema=e;for(const s of r)void 0!==t[s]?(n[s]=Jv.ofArray({array:t[s],schema:e[s]}),n._rowCount=null===(i=t[s])||void 0===i?void 0:i.length):n[s]=Jv.Undefined(n._rowCount,e[s]);return n},e.view=t,e.pick=function(e,i,n){const r=[];for(let t=0,i=e._rowCount;tt(i,n)));let n=!0;for(let e=0,t=i.length;e0?t[i[0]].rowCount:0,name:e,fieldNames:i,getField:e=>t[e]}}e.empty=function(e){return{rowCount:0,name:e,fieldNames:[],getField(e){}}},e.ofFields=t,e.ofTable=function(e,i){const n={};for(const e of i._columns)n[e]=Db.ofColumn(i[e]);return t(e,n)}}(Ob||(Ob={})),function(e){function t(e){const t=e.length,i=t=>{const i=e[t];return i&&"."!==i&&"?"!==i?i:""},n=t=>{const i=e[t];return ib(i,0,i.length)||0},r=t=>{const i=e[t];return rb(i,0,i.length)||0};return{__array:void 0,binaryEncoding:void 0,isDefined:!0,rowCount:t,str:i,int:n,float:r,valueKind:t=>{const i=e[t],n=i.length;if(n>1)return 0;if(0===n)return 1;const r=i.charCodeAt(0);return 46===r?1:63===r?2:0},areValuesEqual:(t,i)=>e[t]===e[i],toStringArray:n=>n?kv(t,i,n):e,toIntArray:e=>kv(t,n,e),toFloatArray:e=>kv(t,r,e)}}function i(e){const{rowCount:t,valueKind:i,areValuesEqual:n,isDefined:r}=e;let s,a,o;switch(e.schema.valueType){case"float":case"int":s=t=>""+e.value(t),a=e.value,o=e.value;break;case"str":s=e.value,a=t=>{const i=e.value(t);return ib(i,0,i.length)||0},o=t=>{const i=e.value(t);return rb(i,0,i.length)||0};break;case"list":const{separator:t}=e.schema;s=i=>e.value(i).join(t),a=e=>NaN,o=e=>NaN;break;default:throw new Error(`unsupported valueType '${e.schema.valueType}'`)}return{__array:void 0,binaryEncoding:void 0,isDefined:r,rowCount:t,str:s,int:a,float:o,valueKind:i,areValuesEqual:n,toStringArray:e=>kv(t,s,e),toIntArray:e=>kv(t,a,e),toFloatArray:e=>kv(t,o,e)}}e.ofString=function(e){return t([e])},e.ofStrings=t,e.ofNumbers=function(e){const t=e.length,i=t=>""+e[t],n=t=>e[t],r=i=>!i||i.array&&e instanceof i.array?e:kv(t,n,i);return{__array:void 0,binaryEncoding:void 0,isDefined:!0,rowCount:t,str:i,int:n,float:n,valueKind:e=>0,areValuesEqual:(t,i)=>e[t]===e[i],toStringArray:e=>kv(t,i,e),toIntArray:r,toFloatArray:r}},e.ofTokens=function(e){const{data:t,indices:i,count:n}=e,r=e=>{const n=t.substring(i[2*e],i[2*e+1]);return"."===n||"?"===n?"":n},s=e=>ib(t,i[2*e],i[2*e+1])||0,a=e=>rb(t,i[2*e],i[2*e+1])||0;return{__array:void 0,binaryEncoding:void 0,isDefined:!0,rowCount:n,str:r,int:s,float:a,valueKind:e=>{const n=i[2*e],r=i[2*e+1]-n;if(r>1)return 0;if(0===r)return 1;const s=t.charCodeAt(n);return 46===s?1:63===s?2:0},areValuesEqual:Rb(e),toStringArray:e=>kv(n,r,e),toIntArray:e=>kv(n,s,e),toFloatArray:e=>kv(n,a,e)}},e.ofColumn=i,e.ofUndefined=function(e,t){return i(Jv.Undefined(e,t))}}(Db||(Db={}));const Nb="undefined"!=typeof setImmediate?"undefined"!=typeof window?{setImmediate:(e,...t)=>window.setImmediate(e,...t),clearImmediate:e=>window.clearImmediate(e)}:{setImmediate:setImmediate,clearImmediate:clearImmediate}:function(){const e=function(){const e="undefined"!=typeof window&&window,t="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i="undefined"!=typeof global&&global;return e||i||t}(),t={},i="undefined"!=typeof document?document:void 0;let n,r=1;function s(e){delete t[e]}function a(e){const i=t[e];s(e),function(e){const t=e.callback,i=e.args;switch(i.length){case 0:t();break;case 1:t(i[0]);break;case 2:t(i[0],i[1]);break;case 3:t(i[0],i[1],i[2]);break;default:t.apply(void 0,i)}}(i)}return"undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?n=function(e){process.nextTick((function(){a(e)}))}:function(){if(e&&e.postMessage&&!e.importScripts){let t=!0;const i=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=i,t}}()?function(){const t="setImmediate$"+Math.random()+"$",i=function(i){i.source===e&&"string"==typeof i.data&&0===i.data.indexOf(t)&&a(+i.data.slice(t.length))};window.addEventListener?window.addEventListener("message",i,!1):window.attachEvent("onmessage",i),n=function(e){window.postMessage(t+e,"*")}}():"undefined"!=typeof MessageChannel?function(){const e=new MessageChannel;e.port1.onmessage=function(e){a(e.data)},n=function(t){e.port2.postMessage(t)}}():i&&"onreadystatechange"in i.createElement("script")?function(){const e=i.documentElement;n=function(t){let n=i.createElement("script");n.onreadystatechange=function(){a(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}():n=function(e){setTimeout(a,0,e)},{setImmediate:function(e,...i){"function"!=typeof e&&(e=new Function(""+e));const s={callback:e,args:i};return t[r]=s,n(r),r++},clearImmediate:s}}();function Fb(e){Nb.setImmediate(e)}const Bb={setImmediate:Nb.setImmediate,clearImmediate:Nb.clearImmediate,immediatePromise:()=>new Promise(Fb),delay:(e,t=void 0)=>new Promise((i=>setTimeout(i,e,t)))};!function(){try{return"production"===process.env.NODE_ENV}catch(e){return!1}}(),function(){try{const e=process.env.DEBUG;return"*"===e||"molstar"===e}catch(e){return!1}}();const zb="undefined"!=typeof performance&&!!performance.mark&&performance.measure&&!1;var Ub;function Vb(e,t,i=250){const n=function(e,t,i){const n={abortRequested:!1,treeAborted:!1,reason:""};return{updateRateMs:i,lastNotified:bb(),observer:t,abortToken:n,taskId:e.id,root:{progress:$b(e),children:[]},tryAbort:Gb(n)}}(e,t,i);return Wb(e,new Kb(n,n.root))}function $b(e){return{taskId:e.id,taskName:e.name,message:"",startedTime:0,canAbort:!0,isIndeterminate:!0,current:0,max:0}}function Gb(e){return t=>{e.abortRequested=!0,e.reason=t||e.reason}}function Hb(e){return{progress:{...e.progress},children:e.children.map(Hb)}}function jb(e){return e.progress.canAbort&&e.children.every(jb)}async function Wb(e,t){Ub.markStart(e),t.node.progress.startedTime=bb();try{const i=await e.f(t);return Ub.markEnd(e),Ub.measure(e),t.info.abortToken.abortRequested&&qb(t.info),i}catch(i){throw Qb.isAbort(i)&&(t.isAborted=!0,t.node.children.length>0&&await new Promise((e=>{t.onChildrenFinished=e})),e.onAbort&&e.onAbort()),i}}function qb(e){throw e.abortToken.treeAborted||(e.abortToken.treeAborted=!0,Xb(e.root),Yb(e,bb())),Qb.Aborted(e.abortToken.reason)}function Xb(e){const t=e.progress;t.isIndeterminate=!0,t.canAbort=!1,t.message="Aborting...";for(const t of e.children)Xb(t)}function Yb(e,t){e.lastNotified=t;const i=function(e){return{root:Hb(e.root),canAbort:jb(e.root),requestAbort:e.tryAbort}}(e);e.observer(i)}!function(e){function t(e){return`startTask${e.id}`}function i(e){return`endTask${e.id}`}e.markStart=function(e){zb&&performance.mark(t(e))},e.markEnd=function(e){zb&&performance.mark(i(e))},e.measure=function(e){zb&&performance.measure(`✳️ ${e.name}`,t(e),i(e))}}(Ub||(Ub={}));class Kb{checkAborted(){this.info.abortToken.abortRequested&&(this.isAborted=!0,qb(this.info))}get shouldUpdate(){return this.checkAborted(),bb()-this.lastUpdatedTime>this.info.updateRateMs}updateProgress(e){if(this.checkAborted(),!e)return;const t=this.node.progress;"string"==typeof e?(t.message=e,t.isIndeterminate=!0):(void 0!==e.canAbort&&(t.canAbort=e.canAbort),void 0!==e.message&&(t.message=e.message),void 0!==e.current&&(t.current=e.current),void 0!==e.max&&(t.max=e.max),t.isIndeterminate=void 0===t.current||void 0===t.max,void 0!==e.isIndeterminate&&(t.isIndeterminate=e.isIndeterminate))}update(e,t){if(this.lastUpdatedTime=bb(),this.updateProgress(e),!t)return Yb(this.info,this.lastUpdatedTime),this.checkAborted(),Bb.immediatePromise()}async runChild(e,t){this.updateProgress(t);const i={progress:$b(e),children:[]},n=this.node.children;n.push(i);const r=new Kb(this.info,i);try{return await Wb(e,r)}catch(e){if(Qb.isAbort(e)&&this.isAborted)return;throw e}finally{const e=n.indexOf(i);if(e>=0){for(let t=e,i=n.length-1;t0;){a+=c;const t=bb()-l;u+=t,o+=t,e.shouldUpdate&&(await r(e,i,a),s=Math.round(u*a/o)+1,l=bb(),u=0)}return e.shouldUpdate&&await r(e,i,a),i}function sx(e){return{data:e,position:0,length:e.length,lineNumber:1,tokenStart:0,tokenEnd:0}}function ax(e){for(;e.position=e.length)return void(e.tokenType=6);e.tokenStart=e.position,e.tokenEnd=e.position,e.isEscaped=!1;const i=e.data.charCodeAt(e.position);switch(i){case 35:!function(e){for(;e.position=5&&95===e.data.charCodeAt(e.tokenStart+4)?!function(e){let t=e.data.charCodeAt(e.tokenStart);return!(68!==t&&100!==t||(t=e.data.charCodeAt(e.tokenStart+1),65!==t&&97!==t||(t=e.data.charCodeAt(e.tokenStart+2),84!==t&&116!==t||(t=e.data.charCodeAt(e.tokenStart+3),65!==t&&97!==t))))}(e)?!function(e){let t=e.data.charCodeAt(e.tokenStart);return!(83!==t&&115!==t||(t=e.data.charCodeAt(e.tokenStart+1),65!==t&&97!==t||(t=e.data.charCodeAt(e.tokenStart+2),86!==t&&118!==t||(t=e.data.charCodeAt(e.tokenStart+3),69!==t&&101!==t))))}(e)?!function(e){if(e.tokenEnd-e.tokenStart!=5)return!1;let t=e.data.charCodeAt(e.tokenStart);return!(76!==t&&108!==t||(t=e.data.charCodeAt(e.tokenStart+1),79!==t&&111!==t||(t=e.data.charCodeAt(e.tokenStart+2),79!==t&&111!==t||(t=e.data.charCodeAt(e.tokenStart+3),80!==t&&112!==t))))}(e)?e.tokenType=3:e.tokenType=2:e.tokenType=1:e.tokenType=0:e.tokenType=3}}function fx(e){for(dx(e);5===e.tokenType;)dx(e)}function mx(){return{categoryNames:[],categoryData:Object.create(null)}}function px(e,t){const i=Object.create(null);for(const n of e){const e=t[n];i[n]=Ob(e.name,e.rowCount,e.fieldNames,e.fields)}return i}function gx(e,t,i){return kb(e.categoryNames,px(e.categoryNames,e.categoryData),t,i)}function _x(e,t){return kb(e.categoryNames,px(e.categoryNames,e.categoryData),t)}function yx(e,t,i,n,r){if(t in e.categoryData){const i=e.categoryData[t];i.fieldNames.push(...n),Object.assign(i.fields,r)}else e.categoryData[t]={name:t,rowCount:i,fieldNames:n,fields:r},e.categoryNames.push(t)}function vx(e,t){const i=e.tokenStart,n=cx(e),r=ux(e,n),s=Object.create(null),a=[];let o=!0;for(;o;){if(4!==e.tokenType||!lx(e,i,n)){o=!1;break}const t=hx(e).substring(r.length+1);if(fx(e),3!==e.tokenType)return{hasError:!0,errorLine:e.lineNumber,errorMessage:"Expected value."};s[t]=Db.ofTokens({data:e.data,indices:[e.tokenStart,e.tokenEnd],count:1}),a[a.length]=t,fx(e)}return yx(t,r.substr(1),1,a,s),{hasError:!1,errorLine:0,errorMessage:""}}function bx(e,t){const{tokenizer:i,tokens:n,fieldCount:r}=t;let s=t.tokenCount,a=0;for(;3===i.tokenType&&a0&&i.push(gx(s,r,a)),r=e.substring(n.tokenStart+5,n.tokenEnd),s=mx(),a=[],fx(n)}else if(1===t){if(n.tokenEnd-n.tokenStart==5)o.categoryNames.length>0&&(a[a.length]=_x(o,c)),n.inSaveFrame=!1;else{if(n.inSaveFrame)return Sx(n.lineNumber,"Save frames cannot be nested.");n.inSaveFrame=!0,c=e.substring(n.tokenStart+5,n.tokenEnd),o=mx()}fx(n)}else if(2===t){const e=await wx(n,n.inSaveFrame?o:s);if(e.hasError)return Sx(e.errorLine,e.errorMessage)}else{if(4!==t)return console.log(n.tokenType,sx.getTokenString(n)),Sx(n.lineNumber,"Unexpected token. Expected data_, loop_, or data name.");{const e=vx(n,n.inSaveFrame?o:s);if(e.hasError)return Sx(e.errorLine,e.errorMessage)}}}return n.inSaveFrame?Sx(n.lineNumber,`Unfinished save frame (${l.header}).`):((s.categoryNames.length>0||a.length>0)&&i.push(gx(s,r,a)),function(e){return ix.success(e)}(Lb(i)))}function Ax(e){return Qb.create("Parse CIF",(async t=>await Mx(e,t)))}!function(e){class t{run(e,t=250){return e?Vb(this,e,t):this.f(Zb)}runAsChild(e,t){return e.isSynchronous?this.f(Zb):function(e,t,i){return e.runChild(t,i)}(e,this,t)}runInContext(e){return e.isSynchronous?this.f(Zb):function(e,t){return Wb(t,e)}(e,this)}constructor(e,t,i){this.name=e,this.f=t,this.onAbort=i,this.id=r()}}function i(e){const t=e;return!!e&&"number"==typeof t.id&&"string"==typeof t.name&&!!t.run}function n(e,i,n){return new t(e,i,n)}e.is=i,e.isAbort=function(e){return!!e&&!!e.isAborted},e.Aborted=function(e){return{isAborted:!0,reason:e,toString:()=>"Aborted"+(e?": "+e:"")}},e.create=n,e.constant=function(e,t){return n(e,(async e=>t))},e.empty=function(){return n("",(async e=>{}))},e.fail=function(e,t){return n(e,(async e=>{throw new Error(t)}))},e.resolveInContext=function(e,t){return i(e)?t?e.runInContext(t):e.run():e};const r=Ab(0,1073741823)}(Qb||(Qb={})),function(e){e.Synchronous=Zb}(Jb||(Jb={})),function(e){function t(e,i=""){const n=e.progress;if(!e.children.length)return n.isIndeterminate?`${i}${n.taskName}: ${n.message}`:`${i}${n.taskName}: [${n.current}/${n.max}] ${n.message}`;const r=i+" |_ ",s=e.children.map((e=>t(e,r)));return n.isIndeterminate?`${i}${n.taskName}: ${n.message}\n${s.join("\n")}`:`${i}${n.taskName}: [${n.current}/${n.max}] ${n.message}\n${s.join("\n")}`}e.format=function(e){return t(e.root)}}(ex||(ex={})),function(e){function t(e){return e.data.substring(e.tokenStart,e.tokenEnd)}function i(e){const{data:t}=e;for(;e.position=r;)a=n.charCodeAt(--s);return e.tokenStart=r,e.tokenEnd=s+1,e.position=i,e}e.getTokenString=t,e.reset=function(e){e.position=0,e.lineNumber=1,e.tokenStart=0,e.tokenEnd=0},e.eatLine=i,e.markStart=function(e){e.tokenStart=e.position},e.markLine=n,e.readLine=function(e){return n(e),t(e)},e.readLineTrim=function(e){n(e);const i=e.position;return s(e,e.tokenStart,e.tokenEnd),e.position=i,t(e)},e.markLines=function(e,t){const i=tx.create(e.data,2*t);return r(e,t,i),i},e.readLines=function(t,i){const n=[];for(let r=0;r{const n=Math.min(t-a,e);return r(i,n,s),a+=n,n}),((e,t)=>e.update({message:"Parsing...",current:t.position,max:t.length}))),s},e.readAllLines=function(t){const i=e(t),r=tx.create(i.data,Math.max(t.length/80,2));for(;n(i);)tx.add(r,i.tokenStart,i.tokenEnd);return r},e.readAllLinesAsync=async function(t,i,r=1e5){const s=e(t),a=tx.create(s.data,Math.max(t.length/80,2));return await rx(i,r,s,((e,t)=>(function(e,t,i){let r=0;for(let s=0;se.update({message:"Parsing...",current:t.position,max:t.length}))),a},e.eatValue=function(e){for(;e.positionn.indicesLenMinus2&&function(e){const t=new Uint32Array(1.61*e.indices.length|0);t.set(e.indices),e.indices=t,e.indicesLenMinus2=t.length-2|0}(n),n.indices[n.offset++]=t,n.indices[n.offset++]=i,e.count++}e.add=t,e.addToken=function(e,i){t(e,i.tokenStart,i.tokenEnd)},e.addUnchecked=function(e,t,i){e.indices[e.offset++]=t,e.indices[e.offset++]=i,e.count++},e.create=function(e,t){return{data:e,indicesLenMinus2:(t=Math.max(10,t))-2|0,count:0,offset:0,indices:new Uint32Array(t)}}}(tx||(tx={})),function(e){e.error=function(e,i=-1){return new t(e,i)},e.success=function(e,t=[]){return new i(e,t)};class t{toString(){return this.line>=0?`[Line ${this.line}] ${this.message}`:this.message}constructor(e,t){this.message=e,this.line=t,this.isError=!0}}e.Error=t;class i{constructor(e,t){this.result=e,this.warnings=t,this.isError=!1}}e.Success=i}(ix||(ix={})),function(e){var t,i;(t=e.IntDataType||(e.IntDataType={}))[t.Int8=1]="Int8",t[t.Int16=2]="Int16",t[t.Int32=3]="Int32",t[t.Uint8=4]="Uint8",t[t.Uint16=5]="Uint16",t[t.Uint32=6]="Uint32",(i=e.FloatDataType||(e.FloatDataType={}))[i.Float32=32]="Float32",i[i.Float64=33]="Float64",e.getDataType=function(t){let i;return i=t instanceof Int8Array?e.IntDataType.Int8:t instanceof Int16Array?e.IntDataType.Int16:t instanceof Int32Array?e.IntDataType.Int32:t instanceof Uint8Array?e.IntDataType.Uint8:t instanceof Uint16Array?e.IntDataType.Uint16:t instanceof Uint32Array?e.IntDataType.Uint32:t instanceof Float32Array?e.FloatDataType.Float32:t instanceof Float64Array?e.FloatDataType.Float64:e.IntDataType.Int32,i},e.isSignedIntegerDataType=function(e){if(e instanceof Int8Array||e instanceof Int16Array||e instanceof Int32Array)return!0;for(let t=0,i=e.length;t=0;i--)t=Px(t,e.encoding[i]);return t}function Px(e,t){switch(t.kind){case"ByteArray":switch(t.type){case nx.IntDataType.Uint8:return e;case nx.IntDataType.Int8:return function(e){return new Int8Array(e.buffer,e.byteOffset)}(e);case nx.IntDataType.Int16:return function(e){return Dx(e,2,Int16Array)}(e);case nx.IntDataType.Uint16:return function(e){return Dx(e,2,Uint16Array)}(e);case nx.IntDataType.Int32:return function(e){return Dx(e,4,Int32Array)}(e);case nx.IntDataType.Uint32:return function(e){return Dx(e,4,Uint32Array)}(e);case nx.FloatDataType.Float32:return function(e){return Dx(e,4,Float32Array)}(e);case nx.FloatDataType.Float64:return function(e){return Dx(e,8,Float64Array)}(e);default:Kv(t.type)}case"FixedPoint":return function(e,t){const i=e.length,n=Ix(t.srcType,i),r=1/t.factor;for(let t=0;t=e.currentSize)a.set(l,o);else for(let e=0,t=l.length;e=e.currentSize&&t(e);const a=e.currentChunk,o=e.currentIndex;return a[o]=i,a[o+1]=n,a[o+2]=r,a[o+3]=s,e.currentIndex+=4,e.elementCount++},e.add3=function(e,i,n,r){e.currentIndex>=e.currentSize&&t(e);const s=e.currentChunk,a=e.currentIndex;return s[a]=i,s[a+1]=n,s[a+2]=r,e.currentIndex+=3,e.elementCount++},e.add2=function(e,i,n){e.currentIndex>=e.currentSize&&t(e);const r=e.currentChunk,s=e.currentIndex;return r[s]=i,r[s+1]=n,e.currentIndex+=2,e.elementCount++},e.add=function(e,i){return e.currentIndex>=e.currentSize&&t(e),e.currentChunk[e.currentIndex]=i,e.currentIndex+=1,e.elementCount++},e.addRepeat=function(e,i,n){for(let r=0;r=e.currentSize&&t(e),e.currentChunk[e.currentIndex++]=n,e.elementCount++;return e.elementCount},e.addMany=function(e,i){const{elementSize:n}=e;for(let r=0,s=i.length;r=e.currentSize&&t(e);const{currentChunk:s}=e;for(let t=0;t=0?Math.ceil((e+1)/t):Math.ceil((e+1)/(-t-1))}function i({limit8:e,limit16:i},n,r){n.pack8+=t(r,e),n.pack16+=t(r,i),n.count+=1}function n(e,i){e.pack8+=t(i,127),e.pack16+=t(i,32767),e.count+=1}function r(e){return 4*e.count<2*e.pack16?{length:4*e.count,elem:4}:2*e.pack16e.length-t.length)),i}e.getSize=c,e.classify=function(e){if(e.length<2)return Nx.by(Nx.byteArray);switch(c(e)[0].kind){case"pack":return Nx.by(Nx.integerPacking);case"rle":return Nx.by(Nx.runLength).and(Nx.integerPacking);case"delta":return Nx.by(Nx.delta).and(Nx.integerPacking);case"delta-rle":return Nx.by(Nx.delta).and(Nx.runLength).and(Nx.integerPacking);default:Kv()}}}(Lx||(Lx={})),function(e){e.classify=function(e){const{mantissaDigits:t,integerDigits:i}=function(e,t,i){let n=1,r=0;for(let s=0,a=e.length;s=0){const r=Fx(e[s],t,i);r<0?n=-1:r>n&&(n=r)}const a=Math.abs(e[s]);if(a>i){const e=Math.floor(Math.log10(Math.abs(a)))+1;e>r&&(r=e)}}return{mantissaDigits:n,integerDigits:r}}(e,4,1e-6);if(t<0||t+i>10)return Nx.by(Nx.byteArray);if(0===t)return Lx.classify(e);const n=function(e){let t=1;for(let i=0;i=0?s/t|0:s/i|0}return n+=e.length,n}e.byteArray=n,e.fixedPoint=function(e){return t=>function(e,t){const i=nx.getDataType(e),n=new Int32Array(e.length);for(let i=0,r=e.length;ifunction(e,t,i,n,r){const s=nx.getDataType(e);if(!e.length)return{encodings:[{kind:"IntervalQuantization",min:t,max:i,numSteps:n,srcType:s}],data:new Int32Array(0)};if(i=i?n-1:0|Math.round((s-t)/a)}return{encodings:[{kind:"IntervalQuantization",min:t,max:i,numSteps:n,srcType:s}],data:o}}(r,e,t,i,n)},e.runLength=function(e){let t=nx.getDataType(e);if(void 0===t&&(e=new Int32Array(e),t=nx.IntDataType.Int32),!e.length)return{encodings:[{kind:"RunLength",srcType:t,srcSize:0}],data:new Int32Array(0)};let i=2;for(let t=1,n=e.length;t=0)for(;n>=i;)a[o]=i,++o,n-=i;else for(;n<=r;)a[o]=r,++o,n-=r;a[o]=n,++o}const l=n(a);return{encodings:[{kind:"IntegerPacking",byteCount:t.bytesPerElement,isUnsigned:!t.isSigned,srcSize:s},l.encodings[0]],data:l.data}}(e,t)},e.stringArray=function(e){const t=Object.create(null),i=[],n=new Int32Array(e.length),r=Rx.create(Int32Array,1,Math.min(1024,e.length<32?e.length+1:Math.round(e.length/8)+1));Rx.add(r,0);let s=0,a=0;for(const o of e){if(null==o){n[a++]=-1;continue}let e=t[o];void 0===e&&(s+=o.length,e=i.length,i[e]=o,t[o]=e,Rx.add(r,s)),n[a++]=e}const o=Rx.compact(r),l=Bx(o).encode(o),c=Bx(n).encode(n);return{encodings:[{kind:"StringArray",dataEncoding:c.encoding,stringData:i.join(""),offsetEncoding:l.encoding,offsets:l.data}],data:c.data}}}(Nx||(Nx={}));const Ux=function(){const e=[];for(let t=0;t<1024;t++)e[t]=String.fromCharCode(t);return e}();function Vx(e){throw new Error(e)}const $x="undefined"!=typeof TextDecoder?new TextDecoder:void 0;function Gx(e,t,i){if($x){const n=t||i!==e.length?e.subarray(t,t+i):e;return $x.decode(n)}return function(e,t,i){const n=Ux;let r,s=0;const a=[];for(let o=t,l=t+i;o0&&(r[r.length]=a.slice(0,s).join("")),r.join("")):a.slice(0,s).join("")}(e,t,i)}function Hx(e,t){const i={};for(let n=0;ne.name)),getField(e){const n=t[e];if(n)return i[e]||(i[e]=function(e){const t=e.mask?Tx(e.mask):void 0,i=Tx(e.data),n=Ov(i),r=n?t?e=>0===t[e]?""+i[e]:"":e=>""+i[e]:t?e=>0===t[e]?i[e]:"":e=>i[e],s=n?e=>i[e]:e=>{const t=i[e];return ib(t,0,t.length)},a=n?e=>i[e]:e=>{const t=i[e];return rb(t,0,t.length)},o=t?e=>t[e]:e=>0,l=i.length;return{__array:i,binaryEncoding:e.data.encoding,isDefined:!0,rowCount:l,str:r,int:s,float:a,valueKind:o,areValuesEqual:(e,t)=>i[e]===i[t],toStringArray:e=>kv(l,r,e),toIntArray:n?e=>Nv(i,e):e=>kv(l,s,e),toFloatArray:n?e=>Nv(i,e):e=>kv(l,a,e)}}(n)),i[e]}}}function Kx(e){return Qb.create("Parse BinaryCIF",(async t=>{const i=[0,3];try{const t=Xx({buffer:n=e,offset:0,dataView:new DataView(n.buffer)});if(!function(e,t){for(let i=0;i<2;i++)if(e[i]>t[i])return!1;return!0}(i,t.version.match(/(\d)\.(\d)\.\d/).slice(1).map((e=>+e))))return ix.error(`Unsupported format version. Current ${t.version}, required ${i.join(".")}.`);const r=Lb(t.dataBlocks.map((e=>{const t=Object.create(null);for(const i of e.categories)t[i.name.substr(1)]=Yx(i);return kb(e.categories.map((e=>e.name.substr(1))),t,e.header)})));return ix.success(r)}catch(e){return ix.error(""+e)}var n}))}var Zx;function Qx(e,t,i){return function(e,t,i){const n=Object.create(null);for(const r of Object.keys(e))n[r]=sw(r,e[r],t,i);return Ib.ofTables(t.header,e,n)}(e,t,i)}function Jx(e){switch(e.valueType){case"str":return(t,i,n)=>function(e,t,i,n){return{schema:e,__array:t.__array,isDefined:t.isDefined,rowCount:t.rowCount,value:"lowercase"===e.transform?e=>i(e).toLowerCase():"uppercase"===e.transform?e=>i(e).toUpperCase():i,valueKind:t.valueKind,areValuesEqual:t.areValuesEqual,toArray:"lowercase"===e.transform?e=>Array.from(n(e)).map((e=>e.toLowerCase())):"uppercase"===e.transform?e=>Array.from(n(e)).map((e=>e.toUpperCase())):n}}(e,t,t.str,t.toStringArray);case"int":return(t,i,n)=>ew(e,t,t.int,t.toIntArray);case"float":return(t,i,n)=>ew(e,t,t.float,t.toFloatArray);case"list":throw new Error("Use createListColumn instead.");case"tensor":throw new Error("Use createTensorColumn instead.")}}function ew(e,t,i,n){return{schema:e,__array:t.__array,isDefined:t.isDefined,rowCount:t.rowCount,value:i,valueKind:t.valueKind,areValuesEqual:t.areValuesEqual,toArray:n}}function tw(e,t,i){const n=e.separator,r=e.itemParse,s=t.getField(i),a=s?e=>s.str(e).split(n).map((e=>r(e.trim()))).filter((e=>!!e)):e=>[];return{schema:e,__array:void 0,isDefined:!!s,rowCount:t.rowCount,value:a,valueKind:s?s.valueKind:()=>1,areValuesEqual:(e,t)=>function(e,t){const i=e.length;if(i!==t.length)return!1;for(let n=0;nkv(t.rowCount,a,e)}}function iw(e,t,i){const n=e.space,r=t.fieldNames.includes(`${i}[0]`)||t.fieldNames.includes(`${i}[0][0]`)||t.fieldNames.includes(`${i}[0][0][0]`),s=r?0:1,a=t.fieldNames.includes(`${i}_1`)||t.fieldNames.includes(`${i}_11`)||t.fieldNames.includes(`${i}_111`)?"underscore":"brackets",o=function(e,t,i,n){const r=i?0:1;switch(t){case 1:return"brackets"===n?t=>`${e}[${t+r}]`:t=>`${e}_${t+r}`;case 2:return"brackets"===n?(t,i)=>`${e}[${t+r}][${i+r}]`:(t,i)=>`${e}_${t+r}${i+r}`;case 3:return"brackets"===n?(t,i,n)=>`${e}[${t+r}][${i+r}][${n+r}]`:(t,i,n)=>`${e}_${t+r}${i+r}${n+r}`;default:throw new Error("Tensors with rank > 3 or rank 0 are currently not supported.")}}(i,n.rank,r,a),l=t.getField(o(s,s,s))||Jv.Undefined(t.rowCount,e),c=e=>function(e,t,i,n){const r=t.create();if(1===t.rank){const s=t.dimensions[0];for(let a=0;a 3 or rank 0 are currently not supported.");{const s=t.dimensions[0],a=t.dimensions[1],o=t.dimensions[2];for(let l=0;lQv.areEqualExact(c(e),c(t)),toArray:e=>kv(t.rowCount,c,e)}}!function(e){function t(e){return e.replace(".","_").replace(/\[/,"_").replace(/(\[|\])/g,"")}e.canonical=t,e.equal=function(e,i){return t(e)===t(i)},e.create=function(e,i,n=!1){const r=`${e}${i?`.${i}`:""}`;return n?t(r):r}}(Zx||(Zx={}));class nw{constructor(e,t,i){this._isDefined=i;const n=Object.keys(t);this._rowCount=e.rowCount,this._columns=n,this._schema=t;const r=Object.create(null);for(const i of n)Object.defineProperty(this,i,{get:function(){if(r[i])return r[i];const n=t[i];if("list"===n.valueType)r[i]=tw(n,e,i);else if("tensor"===n.valueType)r[i]=iw(n,e,i);else{const t=Jx(n),s=e.getField(i);r[i]=s?t(s,e,i):Jv.Undefined(e.rowCount,n)}return r[i]},enumerable:!0,configurable:!1})}}function rw(e,t,i,n){const r=Zx.create(t,e),s=Zx.canonical(r);if(s in i)return i[s];if(n&&r in n)for(const e of n[r]){const t=Zx.canonical(e);if(t in i)return i[t]}}function sw(e,t,i,n){let r=i.categories[e];if(n){const s=function(e){const t=Object.create(null);for(const i of Object.keys(e.categories))for(const n of e.categories[i].fieldNames)t[Zx.create(i,n,!0)]=e.categories[i].getField(n);return t}(i),a=Object.create(null),o=[];let l=0;for(const i of Object.keys(t)){const t=rw(i,e,s,n);t&&(a[i]=t,o.push(i),l=t.rowCount)}r={rowCount:l,name:e,fieldNames:[...o],getField:e=>a[e]}}return new nw(r||Ob.empty(e),t,!!r)}var aw=Jv.Schema;const ow=aw.str,lw=aw.int,cw=aw.float,uw=aw.coord,hw=aw.Aliased,dw=aw.Matrix,fw=aw.Vector,mw=aw.lstr,pw=aw.List,gw={atom_site:{auth_asym_id:ow,auth_atom_id:ow,auth_comp_id:ow,auth_seq_id:lw,B_iso_or_equiv:cw,Cartn_x:uw,Cartn_y:uw,Cartn_z:uw,group_PDB:hw(ow),id:lw,label_alt_id:ow,label_asym_id:ow,label_atom_id:ow,label_comp_id:ow,label_entity_id:ow,label_seq_id:lw,occupancy:cw,type_symbol:ow,pdbx_PDB_ins_code:ow,pdbx_PDB_model_num:lw,pdbx_formal_charge:lw,pdbx_label_index:lw,pdbx_sifts_xref_db_name:ow,pdbx_sifts_xref_db_acc:ow,pdbx_sifts_xref_db_num:ow,pdbx_sifts_xref_db_res:ow,ihm_model_id:lw},atom_site_anisotrop:{id:lw,type_symbol:ow,U:dw(3,3),U_esd:dw(3,3),pdbx_auth_seq_id:ow,pdbx_auth_asym_id:ow,pdbx_auth_atom_id:ow,pdbx_auth_comp_id:ow,pdbx_label_seq_id:lw,pdbx_label_alt_id:ow,pdbx_label_asym_id:ow,pdbx_label_atom_id:ow,pdbx_label_comp_id:ow,pdbx_PDB_ins_code:ow},atom_sites:{entry_id:ow,fract_transf_matrix:dw(3,3),fract_transf_vector:fw(3)},audit_author:{name:ow,pdbx_ordinal:lw,identifier_ORCID:ow},audit_conform:{dict_location:ow,dict_name:ow,dict_version:ow},cell:{angle_alpha:cw,angle_beta:cw,angle_gamma:cw,entry_id:ow,length_a:cw,length_b:cw,length_c:cw,Z_PDB:lw,pdbx_unique_axis:ow},chem_comp:{formula:ow,formula_weight:cw,id:ow,mon_nstd_flag:hw(mw),name:ow,type:hw(mw),pdbx_synonyms:pw(";",(e=>e))},chem_comp_bond:{atom_id_1:ow,atom_id_2:ow,comp_id:ow,value_order:hw(mw),pdbx_ordinal:lw,pdbx_stereo_config:hw(mw),pdbx_aromatic_flag:hw(mw)},citation:{book_publisher:ow,country:ow,id:ow,journal_abbrev:ow,journal_id_ASTM:ow,journal_id_CSD:ow,journal_id_ISSN:ow,journal_volume:ow,page_first:ow,page_last:ow,title:ow,year:lw,pdbx_database_id_DOI:ow,pdbx_database_id_PubMed:lw},citation_author:{citation_id:ow,name:ow,ordinal:lw},database_2:{database_id:hw(mw),database_code:ow},entity:{details:ow,formula_weight:cw,id:ow,src_method:hw(mw),type:hw(mw),pdbx_description:pw(",",(e=>e)),pdbx_number_of_molecules:lw,pdbx_mutation:ow,pdbx_fragment:ow,pdbx_ec:pw(",",(e=>e))},entity_poly:{entity_id:ow,nstd_linkage:hw(mw),nstd_monomer:hw(mw),type:hw(ow),pdbx_strand_id:pw(",",(e=>e)),pdbx_seq_one_letter_code:ow,pdbx_seq_one_letter_code_can:ow,pdbx_target_identifier:ow},entity_poly_seq:{entity_id:ow,hetero:hw(mw),mon_id:ow,num:lw},entry:{id:ow},exptl:{entry_id:ow,method:hw(ow)},software:{classification:ow,date:ow,description:ow,name:ow,type:hw(mw),version:ow,pdbx_ordinal:lw},struct:{entry_id:ow,title:ow,pdbx_descriptor:ow},struct_asym:{details:ow,entity_id:ow,id:ow,pdbx_modified:ow,pdbx_blank_PDB_chainid_flag:hw(ow)},struct_conf:{beg_label_asym_id:ow,beg_label_comp_id:ow,beg_label_seq_id:lw,beg_auth_asym_id:ow,beg_auth_comp_id:ow,beg_auth_seq_id:lw,conf_type_id:hw(mw),details:ow,end_label_asym_id:ow,end_label_comp_id:ow,end_label_seq_id:lw,end_auth_asym_id:ow,end_auth_comp_id:ow,end_auth_seq_id:lw,id:ow,pdbx_beg_PDB_ins_code:ow,pdbx_end_PDB_ins_code:ow,pdbx_PDB_helix_class:ow,pdbx_PDB_helix_length:lw,pdbx_PDB_helix_id:ow},struct_conn:{conn_type_id:hw(mw),details:ow,id:ow,ptnr1_label_asym_id:ow,ptnr1_label_atom_id:ow,ptnr1_label_comp_id:ow,ptnr1_label_seq_id:lw,ptnr1_auth_asym_id:ow,ptnr1_auth_comp_id:ow,ptnr1_auth_seq_id:lw,ptnr1_symmetry:ow,ptnr2_label_asym_id:ow,ptnr2_label_atom_id:ow,ptnr2_label_comp_id:ow,ptnr2_label_seq_id:lw,ptnr2_auth_asym_id:ow,ptnr2_auth_comp_id:ow,ptnr2_auth_seq_id:lw,ptnr2_symmetry:ow,pdbx_ptnr1_PDB_ins_code:ow,pdbx_ptnr1_label_alt_id:ow,pdbx_ptnr1_standard_comp_id:ow,pdbx_ptnr2_PDB_ins_code:ow,pdbx_ptnr2_label_alt_id:ow,pdbx_ptnr3_PDB_ins_code:ow,pdbx_ptnr3_label_alt_id:ow,pdbx_ptnr3_label_asym_id:ow,pdbx_ptnr3_label_atom_id:ow,pdbx_ptnr3_label_comp_id:ow,pdbx_ptnr3_label_seq_id:lw,pdbx_PDB_id:ow,pdbx_dist_value:cw,pdbx_value_order:hw(mw)},struct_conn_type:{criteria:ow,id:hw(mw),reference:ow},struct_keywords:{entry_id:ow,text:pw(",",(e=>e)),pdbx_keywords:ow},struct_ncs_oper:{code:hw(ow),details:ow,id:lw,matrix:dw(3,3),vector:fw(3)},struct_sheet_range:{beg_label_asym_id:ow,beg_label_comp_id:ow,beg_label_seq_id:lw,end_label_asym_id:ow,end_label_comp_id:ow,end_label_seq_id:lw,beg_auth_asym_id:ow,beg_auth_comp_id:ow,beg_auth_seq_id:lw,end_auth_asym_id:ow,end_auth_comp_id:ow,end_auth_seq_id:lw,id:ow,sheet_id:ow,pdbx_beg_PDB_ins_code:ow,pdbx_end_PDB_ins_code:ow},struct_site:{details:ow,id:ow,pdbx_num_residues:lw,pdbx_evidence_code:ow,pdbx_auth_asym_id:ow,pdbx_auth_comp_id:ow,pdbx_auth_seq_id:ow,pdbx_auth_ins_code:ow},struct_site_gen:{details:ow,id:ow,label_alt_id:ow,label_asym_id:ow,label_atom_id:ow,label_comp_id:ow,label_seq_id:lw,auth_asym_id:ow,auth_comp_id:ow,auth_seq_id:ow,site_id:ow,symmetry:ow,pdbx_auth_ins_code:ow,pdbx_num_res:lw},symmetry:{entry_id:ow,cell_setting:hw(mw),Int_Tables_number:lw,space_group_name_Hall:ow,"space_group_name_H-M":ow},pdbx_database_status:{status_code:hw(ow),status_code_sf:hw(ow),status_code_mr:hw(ow),entry_id:ow,recvd_initial_deposition_date:ow,SG_entry:hw(mw),deposit_site:hw(ow),process_site:hw(ow),status_code_cs:hw(ow),methods_development_category:hw(ow),pdb_format_compatible:hw(mw)},pdbx_nonpoly_scheme:{asym_id:ow,entity_id:ow,mon_id:ow,pdb_strand_id:ow,ndb_seq_num:ow,pdb_seq_num:ow,auth_seq_num:ow,pdb_mon_id:ow,auth_mon_id:ow,pdb_ins_code:ow},pdbx_database_related:{db_name:ow,details:ow,db_id:ow,content_type:hw(ow)},pdbx_entity_nonpoly:{entity_id:ow,comp_id:ow,name:ow},pdbx_chem_comp_synonyms:{name:ow,comp_id:ow,provenance:hw(ow)},pdbx_chem_comp_identifier:{comp_id:ow,identifier:ow,type:hw(ow),program:ow,program_version:ow},pdbx_unobs_or_zero_occ_residues:{id:lw,polymer_flag:hw(mw),occupancy_flag:hw(lw),PDB_model_num:lw,auth_asym_id:ow,auth_comp_id:ow,auth_seq_id:ow,PDB_ins_code:ow,label_asym_id:ow,label_comp_id:ow,label_seq_id:lw},pdbx_struct_mod_residue:{id:lw,auth_asym_id:ow,auth_comp_id:ow,auth_seq_id:lw,PDB_ins_code:ow,label_asym_id:ow,label_comp_id:ow,label_seq_id:lw,parent_comp_id:ow,details:ow},pdbx_struct_oper_list:{id:ow,type:hw(ow),name:ow,symmetry_operation:ow,matrix:dw(3,3),vector:fw(3)},pdbx_struct_assembly:{method_details:ow,oligomeric_details:ow,oligomeric_count:lw,details:ow,id:ow},pdbx_struct_assembly_gen:{asym_id_list:pw(",",(e=>e)),assembly_id:ow,oper_expression:ow},pdbx_reference_entity_list:{prd_id:ow,ref_entity_id:ow,type:hw(mw),details:ow,component_id:lw},pdbx_reference_entity_link:{link_id:lw,prd_id:ow,details:ow,ref_entity_id_1:ow,ref_entity_id_2:ow,entity_seq_num_1:lw,entity_seq_num_2:lw,comp_id_1:ow,comp_id_2:ow,atom_id_1:ow,atom_id_2:ow,value_order:hw(mw),component_1:lw,component_2:lw,link_class:hw(ow)},pdbx_reference_entity_poly_link:{link_id:lw,prd_id:ow,ref_entity_id:ow,component_id:lw,entity_seq_num_1:lw,entity_seq_num_2:lw,comp_id_1:ow,comp_id_2:ow,atom_id_1:ow,atom_id_2:ow,value_order:hw(mw)},pdbx_molecule:{prd_id:ow,instance_id:lw,asym_id:ow},pdbx_molecule_features:{prd_id:ow,class:hw(mw),type:hw(mw),name:ow,details:ow},entity_src_nat:{entity_id:ow,pdbx_organism_scientific:ow,pdbx_plasmid_name:ow,pdbx_src_id:lw,pdbx_beg_seq_num:lw,pdbx_end_seq_num:lw},entity_src_gen:{entity_id:ow,pdbx_gene_src_gene:pw(",",(e=>e)),pdbx_gene_src_scientific_name:ow,plasmid_name:ow,pdbx_src_id:lw,pdbx_beg_seq_num:lw,pdbx_end_seq_num:lw},pdbx_entity_src_syn:{organism_scientific:ow,entity_id:ow,pdbx_src_id:lw,pdbx_beg_seq_num:lw,pdbx_end_seq_num:lw},pdbx_entity_branch_descriptor:{entity_id:ow,descriptor:ow,type:hw(mw),program:ow,program_version:ow,ordinal:lw},pdbx_entity_instance_feature:{details:ow,feature_type:hw(ow),auth_asym_id:ow,asym_id:ow,auth_seq_num:ow,seq_num:lw,comp_id:ow,auth_comp_id:ow,ordinal:lw},pdbx_entity_branch_list:{entity_id:ow,hetero:hw(mw),comp_id:ow,num:lw},pdbx_entity_branch_link:{link_id:lw,details:ow,entity_id:ow,entity_branch_list_num_1:lw,entity_branch_list_num_2:lw,comp_id_1:ow,comp_id_2:ow,atom_id_1:ow,leaving_atom_id_1:ow,atom_stereo_config_1:hw(mw),atom_id_2:ow,leaving_atom_id_2:ow,atom_stereo_config_2:hw(mw),value_order:hw(mw)},pdbx_entity_branch:{entity_id:ow,type:hw(ow)},pdbx_branch_scheme:{entity_id:ow,hetero:hw(mw),asym_id:ow,mon_id:ow,num:lw,pdb_asym_id:ow,pdb_seq_num:ow,pdb_mon_id:ow,auth_asym_id:ow,auth_seq_num:ow,auth_mon_id:ow},pdbx_chem_comp_related:{comp_id:ow,related_comp_id:ow,relationship_type:hw(ow),details:ow},ihm_starting_model_details:{starting_model_id:ow,entity_id:ow,entity_description:ow,asym_id:ow,entity_poly_segment_id:lw,starting_model_source:hw(ow),starting_model_auth_asym_id:ow,starting_model_sequence_offset:lw,dataset_list_id:lw},ihm_starting_comparative_models:{id:lw,starting_model_id:ow,starting_model_auth_asym_id:ow,starting_model_seq_id_begin:lw,starting_model_seq_id_end:lw,template_auth_asym_id:ow,template_seq_id_begin:lw,template_seq_id_end:lw,template_sequence_identity:cw,template_sequence_identity_denominator:hw(lw),template_dataset_list_id:lw,alignment_file_id:lw},ihm_starting_model_seq_dif:{id:lw,entity_id:ow,asym_id:ow,seq_id:lw,comp_id:ow,starting_model_id:ow,db_asym_id:ow,db_seq_id:lw,db_comp_id:ow,details:ow},ihm_model_representation:{id:lw,name:ow,details:ow},ihm_model_representation_details:{id:lw,representation_id:lw,entity_poly_segment_id:lw,entity_id:ow,entity_description:ow,entity_asym_id:ow,model_object_primitive:hw(ow),starting_model_id:ow,model_mode:hw(ow),model_granularity:hw(ow),model_object_count:lw},ihm_struct_assembly_details:{id:lw,assembly_id:lw,parent_assembly_id:lw,entity_description:ow,entity_id:ow,asym_id:ow,entity_poly_segment_id:lw},ihm_struct_assembly:{id:lw,name:ow,description:ow},ihm_modeling_protocol:{id:lw,num_steps:lw,protocol_name:ow},ihm_modeling_protocol_details:{id:lw,protocol_id:lw,step_id:lw,struct_assembly_id:lw,dataset_group_id:lw,struct_assembly_description:ow,step_name:ow,step_method:ow,num_models_begin:lw,num_models_end:lw,multi_scale_flag:hw(mw),multi_state_flag:hw(mw),ordered_flag:hw(mw),script_file_id:lw,software_id:lw},ihm_multi_state_modeling:{state_id:lw,state_group_id:lw,population_fraction:cw,population_fraction_sd:cw,state_type:ow,state_name:ow,experiment_type:hw(ow),details:ow},ihm_modeling_post_process:{id:lw,protocol_id:lw,analysis_id:lw,step_id:lw,type:hw(ow),feature:hw(ow),num_models_begin:lw,num_models_end:lw},ihm_ensemble_info:{ensemble_id:lw,ensemble_name:ow,post_process_id:lw,model_group_id:lw,ensemble_clustering_method:hw(ow),ensemble_clustering_feature:hw(ow),num_ensemble_models:lw,num_ensemble_models_deposited:lw,ensemble_precision_value:cw,ensemble_file_id:lw},ihm_model_list:{model_id:lw,model_name:ow,assembly_id:lw,protocol_id:lw,representation_id:lw},ihm_model_group:{id:lw,name:ow,details:ow},ihm_model_group_link:{model_id:lw,group_id:lw},ihm_model_representative:{id:lw,model_group_id:lw,model_id:lw,selection_criteria:hw(ow)},ihm_dataset_list:{id:lw,data_type:hw(ow),database_hosted:hw(mw)},ihm_dataset_group:{id:lw,name:ow,application:hw(ow),details:ow},ihm_dataset_group_link:{dataset_list_id:lw,group_id:lw},ihm_related_datasets:{dataset_list_id_derived:lw,dataset_list_id_primary:lw},ihm_dataset_related_db_reference:{id:lw,dataset_list_id:lw,db_name:hw(ow),accession_code:ow,version:ow,details:ow},ihm_external_reference_info:{reference_id:lw,reference_provider:ow,reference_type:hw(ow),reference:ow,refers_to:hw(ow),associated_url:ow},ihm_external_files:{id:lw,reference_id:lw,file_path:ow,content_type:hw(ow),file_size_bytes:cw,details:ow},ihm_dataset_external_reference:{id:lw,dataset_list_id:lw,file_id:lw},ihm_localization_density_files:{id:lw,file_id:lw,ensemble_id:lw,entity_id:ow,entity_poly_segment_id:lw,asym_id:ow},ihm_predicted_contact_restraint:{id:lw,group_id:lw,entity_id_1:ow,entity_id_2:ow,asym_id_1:ow,asym_id_2:ow,comp_id_1:ow,comp_id_2:ow,seq_id_1:lw,seq_id_2:lw,rep_atom_1:hw(ow),rep_atom_2:hw(ow),distance_lower_limit:cw,distance_upper_limit:cw,probability:cw,restraint_type:hw(ow),model_granularity:hw(ow),dataset_list_id:lw,software_id:lw},ihm_cross_link_list:{id:lw,group_id:lw,entity_description_1:ow,entity_description_2:ow,entity_id_1:ow,entity_id_2:ow,comp_id_1:ow,comp_id_2:ow,seq_id_1:lw,seq_id_2:lw,linker_type:hw(ow),dataset_list_id:lw},ihm_cross_link_restraint:{id:lw,group_id:lw,entity_id_1:ow,entity_id_2:ow,asym_id_1:ow,asym_id_2:ow,comp_id_1:ow,comp_id_2:ow,seq_id_1:lw,seq_id_2:lw,atom_id_1:ow,atom_id_2:ow,restraint_type:hw(ow),conditional_crosslink_flag:hw(ow),model_granularity:hw(ow),distance_threshold:cw,psi:cw,sigma_1:cw,sigma_2:cw},ihm_cross_link_result_parameters:{id:lw,restraint_id:lw,model_id:lw,psi:cw,sigma_1:cw,sigma_2:cw},ihm_2dem_class_average_restraint:{id:lw,dataset_list_id:lw,number_raw_micrographs:lw,pixel_size_width:cw,pixel_size_height:cw,image_resolution:cw,image_segment_flag:hw(mw),number_of_projections:lw,struct_assembly_id:lw,details:ow},ihm_2dem_class_average_fitting:{id:lw,restraint_id:lw,model_id:lw,cross_correlation_coefficient:cw,rot_matrix:dw(3,3),tr_vector:fw(3)},ihm_3dem_restraint:{id:lw,dataset_list_id:lw,model_id:lw,struct_assembly_id:lw,fitting_method:ow,number_of_gaussians:lw,cross_correlation_coefficient:cw},ihm_sas_restraint:{id:lw,dataset_list_id:lw,model_id:lw,struct_assembly_id:lw,profile_segment_flag:hw(mw),fitting_atom_type:ow,fitting_method:ow,fitting_state:hw(ow),radius_of_gyration:cw,chi_value:cw,details:ow},ihm_starting_model_coord:{ordinal_id:lw,starting_model_id:ow,group_PDB:hw(ow),id:lw,type_symbol:ow,entity_id:ow,atom_id:ow,comp_id:ow,seq_id:lw,asym_id:ow,Cartn_x:cw,Cartn_y:cw,Cartn_z:cw,B_iso_or_equiv:cw},ihm_sphere_obj_site:{id:lw,entity_id:ow,seq_id_begin:lw,seq_id_end:lw,asym_id:ow,Cartn_x:cw,Cartn_y:cw,Cartn_z:cw,object_radius:cw,rmsf:cw,model_id:lw},ihm_gaussian_obj_site:{id:lw,entity_id:ow,seq_id_begin:lw,seq_id_end:lw,asym_id:ow,mean_Cartn_x:cw,mean_Cartn_y:cw,mean_Cartn_z:cw,weight:cw,covariance_matrix:dw(3,3),model_id:lw},ihm_gaussian_obj_ensemble:{id:lw,entity_id:ow,seq_id_begin:lw,seq_id_end:lw,asym_id:ow,mean_Cartn_x:cw,mean_Cartn_y:cw,mean_Cartn_z:cw,weight:cw,covariance_matrix:dw(3,3),ensemble_id:lw},ihm_feature_list:{feature_id:lw,feature_type:hw(ow),entity_type:hw(ow)},ihm_poly_residue_feature:{ordinal_id:lw,feature_id:lw,entity_id:ow,asym_id:ow,comp_id_begin:ow,comp_id_end:ow,seq_id_begin:lw,seq_id_end:lw},ihm_derived_distance_restraint:{id:lw,group_id:lw,feature_id_1:lw,feature_id_2:lw,group_conditionality:hw(ow),random_exclusion_fraction:cw,distance_upper_limit:cw,restraint_type:hw(ow),dataset_list_id:lw},ma_model_list:{ordinal_id:lw,model_id:lw,model_group_id:lw,model_name:ow,model_group_name:ow,model_type:hw(ow),data_id:lw},ma_target_entity:{entity_id:ow,data_id:lw,origin:hw(ow)},ma_target_entity_instance:{asym_id:ow,entity_id:ow,details:ow},ma_target_ref_db_details:{target_entity_id:ow,db_name:hw(ow),db_code:ow,db_accession:ow,seq_db_isoform:ow,seq_db_align_begin:ow,seq_db_align_end:ow,ncbi_taxonomy_id:ow,organism_scientific:ow},ma_data:{id:lw,content_type:hw(ow),content_type_other_details:ow,name:ow},ma_software_group:{ordinal_id:lw,group_id:lw,software_id:lw},ma_qa_metric:{id:lw,name:ow,type:hw(ow),mode:hw(ow),software_group_id:lw},ma_qa_metric_global:{ordinal_id:lw,model_id:lw,metric_id:lw,metric_value:cw},ma_qa_metric_local:{ordinal_id:lw,model_id:lw,label_asym_id:ow,label_seq_id:lw,label_comp_id:ow,metric_id:lw,metric_value:cw}};var _w=Jv.Schema;const yw=_w.str,vw=_w.float,bw=_w.List,xw=_w.lstr,ww=_w.Aliased,Sw=_w.int,Mw=_w.coord,Aw={chem_comp:{formula:yw,formula_weight:vw,id:yw,mon_nstd_parent_comp_id:bw(",",(e=>e)),name:yw,one_letter_code:yw,three_letter_code:yw,type:ww(xw),pdbx_synonyms:bw(";",(e=>e)),pdbx_type:yw,pdbx_ambiguous_flag:yw,pdbx_replaced_by:yw,pdbx_replaces:yw,pdbx_formal_charge:Sw,pdbx_model_coordinates_details:yw,pdbx_model_coordinates_db_code:yw,pdbx_ideal_coordinates_details:yw,pdbx_ideal_coordinates_missing_flag:ww(xw),pdbx_model_coordinates_missing_flag:ww(xw),pdbx_initial_date:yw,pdbx_modified_date:yw,pdbx_release_status:ww(yw),pdbx_processing_site:ww(yw)},chem_comp_atom:{alt_atom_id:yw,atom_id:yw,charge:Sw,model_Cartn_x:Mw,model_Cartn_y:Mw,model_Cartn_z:Mw,comp_id:yw,type_symbol:yw,pdbx_align:Sw,pdbx_ordinal:Sw,pdbx_model_Cartn_x_ideal:Mw,pdbx_model_Cartn_y_ideal:Mw,pdbx_model_Cartn_z_ideal:Mw,pdbx_stereo_config:ww(xw),pdbx_aromatic_flag:ww(xw),pdbx_leaving_atom_flag:ww(xw)},chem_comp_bond:{atom_id_1:yw,atom_id_2:yw,comp_id:yw,value_order:ww(xw),pdbx_ordinal:Sw,pdbx_stereo_config:ww(xw),pdbx_aromatic_flag:ww(xw)},pdbx_chem_comp_descriptor:{comp_id:yw,descriptor:yw,type:ww(xw),program:yw,program_version:yw},pdbx_chem_comp_identifier:{comp_id:yw,identifier:yw,type:ww(yw),program:yw,program_version:yw}};var Cw=Jv.Schema;const Tw=Cw.str,Pw=Cw.float,Ew=Cw.lstr,Iw=Cw.Aliased,Dw=Cw.int,Rw={pdbx_reference_molecule:{prd_id:Tw,formula_weight:Pw,formula:Tw,type:Iw(Ew),type_evidence_code:Tw,class:Iw(Ew),class_evidence_code:Tw,name:Tw,represent_as:Iw(Ew),chem_comp_id:Tw,compound_details:Tw,description:Tw,representative_PDB_id_code:Tw,release_status:Iw(Ew),replaces:Tw,replaced_by:Tw},pdbx_reference_entity_list:{prd_id:Tw,ref_entity_id:Tw,type:Iw(Ew),details:Tw,component_id:Dw},pdbx_reference_entity_nonpoly:{prd_id:Tw,ref_entity_id:Tw,name:Tw,chem_comp_id:Tw},pdbx_reference_entity_link:{link_id:Dw,prd_id:Tw,details:Tw,ref_entity_id_1:Tw,ref_entity_id_2:Tw,entity_seq_num_1:Dw,entity_seq_num_2:Dw,comp_id_1:Tw,comp_id_2:Tw,atom_id_1:Tw,atom_id_2:Tw,value_order:Iw(Ew),component_1:Dw,component_2:Dw,link_class:Iw(Tw)},pdbx_reference_entity_poly_link:{link_id:Dw,prd_id:Tw,ref_entity_id:Tw,component_id:Dw,entity_seq_num_1:Dw,entity_seq_num_2:Dw,comp_id_1:Tw,comp_id_2:Tw,atom_id_1:Tw,atom_id_2:Tw,value_order:Iw(Ew)},pdbx_reference_entity_poly:{prd_id:Tw,ref_entity_id:Tw,type:Iw(Tw),db_code:Tw,db_name:Tw},pdbx_reference_entity_poly_seq:{prd_id:Tw,ref_entity_id:Tw,mon_id:Tw,parent_mon_id:Tw,num:Dw,observed:Iw(Ew),hetero:Iw(Ew)},pdbx_reference_entity_sequence:{prd_id:Tw,ref_entity_id:Tw,type:Iw(Tw),NRP_flag:Iw(Tw),one_letter_codes:Tw},pdbx_reference_entity_src_nat:{prd_id:Tw,ref_entity_id:Tw,ordinal:Dw,organism_scientific:Tw,taxid:Tw,db_code:Tw,db_name:Tw},pdbx_prd_audit:{prd_id:Tw,date:Tw,processing_site:Iw(Tw),action_type:Iw(Tw)}};var Lw=Jv.Schema;const kw=Lw.str,Ow={datablock:{id:kw,description:kw},dictionary:{title:kw,datablock_id:kw,version:kw},dictionary_history:{version:kw,update:kw,revision:kw},sub_category:{id:kw,description:kw},category_group_list:{id:kw,parent_id:kw,description:kw},item_type_list:{code:kw,primitive_code:kw,construct:kw,detail:kw},item_units_list:{code:kw,detail:kw},item_units_conversion:{from_code:kw,to_code:kw,operator:kw,factor:Lw.float}};var Nw=Jv.Schema;const Fw=Nw.str,Bw=Nw.int,zw=Nw.float,Uw=Nw.Aliased,Vw=Nw.Vector;Uw(Fw),Uw(Fw),Uw(Fw),Uw(Fw),Vw(3),Vw(3);const $w={volume_data_3d_info:{name:Fw,axis_order:Vw(3,Bw),origin:Vw(3),dimensions:Vw(3),sample_rate:Bw,sample_count:Vw(3,Bw),spacegroup_number:Bw,spacegroup_cell_size:Vw(3),spacegroup_cell_angles:Vw(3),mean_source:zw,mean_sampled:zw,sigma_source:zw,sigma_sampled:zw,min_source:zw,min_sampled:zw,max_source:zw,max_sampled:zw},volume_data_3d:{values:zw}};var Gw=Jv.Schema;const Hw=Gw.float,jw=Gw.int,Ww=Gw.str,qw={cell:{angle_alpha:Hw,angle_beta:Hw,angle_gamma:Hw,formula_units_z:jw,length_a:Hw,length_b:Hw,length_c:Hw,volume:Hw},chemical:{melting_point:Hw,name_common:Ww,name_systematic:Ww},chemical_formula:{moiety:Ww,sum:Ww,weight:Hw},space_group:{crystal_system:Ww,it_number:jw,"name_h-m_full":Ww},space_group_symop:{operation_xyz:Ww},geom_bond:{atom_site_label_1:Ww,atom_site_label_2:Ww,distance:Hw,publ_flag:Ww,site_symmetry_1:Ww,site_symmetry_2:Ww,valence:Hw},audit:{block_doi:Ww},database_code:{cod:Ww,csd:Ww,depnum_ccdc_archive:Ww,depnum_ccdc_fiz:Ww,icsd:Ww,mdf:Ww,nbs:Ww},atom_site:{adp_type:Ww,calc_flag:Ww,disorder_assembly:Ww,disorder_group:Ww,fract_x:Hw,fract_y:Hw,fract_z:Hw,label:Ww,occupancy:Hw,refinement_flags:Ww,site_symmetry_multiplicity:jw,type_symbol:Ww,u_iso_or_equiv:Hw},atom_site_aniso:{label:Ww,u_11:Hw,u:(0,Gw.Matrix)(3,3),u_12:Hw,u_13:Hw,u_22:Hw,u_23:Hw,u_33:Hw},atom_type:{description:Ww,symbol:Ww},atom_type_scat:{dispersion_imag:Hw,dispersion_real:Hw,source:Ww}},Xw={"cell.formula_units_z":["cell_formula_units_Z"],"space_group.it_number":["space_group_IT_number","symmetry_Int_Tables_number"],"space_group.name_h-m_full":["symmetry_space_group_name_H-M"],"space_group_symop.operation_xyz":["symmetry_equiv_pos_as_xyz"],"geom_bond.atom_site_label_1":["geom_bond_atom_site_id_1"],"geom_bond.atom_site_label_2":["geom_bond_atom_site_id_2"],"geom_bond.distance":["geom_bond_dist"],"audit.block_doi":["audit_block_DOI"],"database_code.cod":["database_code_COD"],"database_code.csd":["database_code_CSD"],"database_code.depnum_ccdc_archive":["database_code_depnum_CCDC_archive"],"database_code.depnum_ccdc_fiz":["database_code_depnum_CCDC_fiz"],"database_code.icsd":["database_code_ICSD"],"database_code.mdf":["database_code_MDF"],"database_code.nbs":["database_code_NBS"],"atom_site.adp_type":["atom_site_ADP_type","atom_site_thermal_displace_type"],"atom_site.label":["atom_site_id"],"atom_site.site_symmetry_multiplicity":["atom_site_symmetry_multiplicity"],"atom_site.u_iso_or_equiv":["atom_site_U_iso_or_equiv"],"atom_site_aniso.label":["atom_site_anisotrop_id"],"atom_site_aniso.u_11":["atom_site_aniso_U_11","atom_site_anisotrop_U_11"],"atom_site_aniso.u_12":["atom_site_aniso_U_12","atom_site_anisotrop_U_12"],"atom_site_aniso.u_13":["atom_site_aniso_U_13","atom_site_anisotrop_U_13"],"atom_site_aniso.u_22":["atom_site_aniso_U_22","atom_site_anisotrop_U_22"],"atom_site_aniso.u_23":["atom_site_aniso_U_23","atom_site_anisotrop_U_23"],"atom_site_aniso.u_33":["atom_site_aniso_U_33","atom_site_anisotrop_U_33"]};const Yw=Jv.Schema.int,Kw={volume_data_3d_info:$w.volume_data_3d_info,segmentation_data_table:{set_id:Yw,segment_id:Yw},segmentation_data_3d:{values:Yw}},Zw={parse:e=>"string"==typeof e?Ax(e):Kx(e),parseText:Ax,parseBinary:Kx,toDatabaseCollection:function(e,t,i){const n={};for(const r of t.blocks)n[r.header]=Qx(e,r,i);return n},toDatabase:Qx,schema:{mmCIF:e=>Qx(gw,e),CCD:e=>Qx(Aw,e),BIRD:e=>Qx(Rw,e),dic:e=>Qx(Ow,e),cifCore:e=>Qx(qw,e,Xw),densityServer:e=>Qx($w,e),segmentation:e=>Qx(Kw,e)}};class Qw{constructor(e,t){var i=t||{};this.streamer=e,this.name=uo(i.name,""),this.path=uo(i.path,"")}get type(){return""}get __objName(){return""}get isBinary(){return!1}get isJson(){return!1}get isXml(){return!1}parse(){return this.streamer.read().then((()=>Lg(this,void 0,void 0,(function*(){return yield this._beforeParse(),yield this._parse(),yield this._afterParse(),this[this.__objName]}))))}_parse(){}_beforeParse(){}_afterParse(){e.Debug&&Fl.log(this[this.__objName])}}class Jw extends Qw{constructor(e,t){var i=t||{};super(e,i),this.firstModelOnly=uo(i.firstModelOnly,!1),this.asTrajectory=uo(i.asTrajectory,!1),this.cAlphaOnly=uo(i.cAlphaOnly,!1),this.structure=new vp(this.name,this.path),this.structureBuilder=new Om(this.structure)}get type(){return"structure"}get __objName(){return"structure"}}class eS{constructor(e,t,i="",n,r=[]){this.structure=e,this.index=t,this.description=i,this.entityType=function(e){switch(e=e.toLowerCase()){case"polymer":return 1;case"non-polymer":return 2;case"macrolide":return 3;case"water":return 4;default:return 0}}(n||""),this.chainIndexList=r,r.forEach((function(i){e.chainStore.entityIndex[i]=t}))}get type(){return function(e){switch(e){case 1:return"polymer";case 2:return"non-polymer";case 3:return"macrolide";case 4:return"water";default:return}}(this.entityType)}getEntityType(){return this.entityType}isPolymer(){return 1===this.entityType}isNonPolymer(){return 2===this.entityType}isMacrolide(){return 3===this.entityType}isWater(){return 4===this.entityType}eachChain(e){const t=this.structure.getChainProxy();this.chainIndexList.forEach((function(i){t.index=i,e(t)}))}}const tS={a:1,b:1,c:1,alpha:90,beta:90,gamma:90,spacegroup:"P 1"};class iS{constructor(e=tS){this.cartToFrac=new qt,this.fracToCart=new qt,this.a=e.a,this.b=e.b,this.c=e.c,this.alpha=e.alpha,this.beta=e.beta,this.gamma=e.gamma,this.spacegroup=e.spacegroup;const t=Ro(this.alpha),i=Ro(this.beta),n=Ro(this.gamma),r=Math.cos(t),s=Math.cos(i),a=Math.cos(n),o=Math.sin(i),l=Math.sin(n);if(this.volume=this.a*this.b*this.c*Math.sqrt(1-r*r-s*s-a*a+2*r*s*a),void 0===e.cartToFrac){const e=this.a*this.b*l/this.volume,t=(s*a-r)/(o*l);this.fracToCart.set(this.a,0,0,0,this.b*a,this.b*l,0,0,this.c*s,-this.c*o*t,1/e,0,0,0,0,1).transpose(),this.cartToFrac.copy(this.fracToCart).invert()}else this.cartToFrac.copy(e.cartToFrac),this.fracToCart.copy(this.cartToFrac).invert()}getPosition(e){const t=new Float32Array(24);if(e.unitcell){const i=e.unitcell,n=e.center.clone().applyMatrix4(i.cartToFrac).floor(),r=new _t;let s=0;const a=function(e,a,o){r.set(e,a,o).add(n).applyMatrix4(i.fracToCart).toArray(t,s),s+=3};a(0,0,0),a(1,0,0),a(0,1,0),a(0,0,1),a(1,1,0),a(1,0,1),a(0,1,1),a(1,1,1)}return t}getCenter(e){return function(e,t=new _t){const i=e.length;for(let n=0;n0)continue;let e,i,n,r,o,g=0;if(s){if(r=M.split(aS),g=10===r.length?1:0,R=r[2],m&&"CA"!==R)continue;e=parseFloat(r[6-g]),i=parseFloat(r[7-g]),n=parseFloat(r[8-g])}else{if(R=M.substr(12,4).trim(),m&&"CA"!==R)continue;e=parseFloat(M.substr(30,8)),i=parseFloat(M.substr(38,8)),n=parseFloat(M.substr(46,8))}if(f){const t=3*y;if(_[t+0]=e,_[t+1]=i,_[t+2]=n,y+=1,v)continue}s?(C=parseInt(r[1]),o="",L="H"===M[0],T=g?"":r[4],P=parseInt(r[5-g]),D="",E=r[3],O="",I=1):(C=parseInt(M.substr(6,5),u),c&&99999===C&&(u=16),L="H"===M[0],T=M[21].trim(),P=parseInt(M.substr(22,4),h),c&&9999===P&&(h=16),D=M[26].trim(),E=M.substr(17,4).trim()||"MOL",k=parseFloat(M.substr(60,6)),O=M[16].trim(),I=parseFloat(M.substr(54,6)),t||(a?(o=M.substr(76,3).trim(),o in cd&&(o=cd[o])):(o=M.substr(76,2).trim(),T||(T=M.substr(72,4).trim())),N=parseInt((M.substr(79,1)+M.substr(78,1)).trim()))),he.growIfFull(),he.atomTypeId[me]=ue.add(R,o),he.x[me]=e,he.y[me]=i,he.z[me]=n,he.serial[me]=C,he.altloc[me]=O.charCodeAt(0),he.occupancy[me]=isNaN(I)?0:I,s?(he.partialCharge[me]=parseFloat(r[9-g]),he.radius[me]=parseFloat(r[10-g])):(he.bfactor[me]=isNaN(k)?0:k,a&&(he.partialCharge[me]=parseFloat(M.substr(70,6))),isFinite(N)&&(he.formalCharge||he.addField("formalCharge",1,"int8"),he.formalCharge[me]=N));const b=oS(P,T,D);!L||K[b]||rS.includes(E)?ee||te===T||(Q+=1,J=Q.toString()):te===T&&ne===E&&(nd.includes(E)||ie===P&&re===D)||(Q+=1,J=Q.toString(),ie=P,ne=E,re=D),l.addAtom(pe,T,J,E,P,L,void 0,D),G[C]=me,me+=1,ee=!1,te=T}else if("CONECT"===A){const e=G[parseInt(M.substr(6,5))],t=[11,16,21,26],i={};if(void 0===e)continue;for(let n=0;n<4;++n){let r=parseInt(M.substr(t[n],5));if(!Number.isNaN(r)&&(r=G[r],void 0!==r))if(e{var i;return[null===(i=r.get(e))||void 0===i?void 0:i.atomname,t]}))),a=[],o=[],l=[];let c,u;for(let e=0;e{var y;const v=l.getField(m),b=l.getField(p),x=l.getField(g),w=_*a;for(let l=0;ll*l)return s.growIfFull(),s.atomTypeId[b]=s.atomTypeId[e],s.x[b]=_.x,s.y[b]=_.y,s.z[b]=_.z,s.occupancy[b]=s.occupancy[e],s.serial[b]=b,s.altloc[b]="A".charCodeAt(0),i.addAtom(0,"","","HET",1,!0),void(b+=1)}}}))}}(D,w,S),S.finalize(),w.finalizeAtoms(),Vm(w),w.finalizeBonds();else{const E={},I={},R=w.atomMap,L=w.atomStore,k=D.categories.atom_site;let O=k.rowCount;const N=k.getField("pdbx_PDB_model_num");if(!(null===(t=null==N?void 0:N.areValuesEqual(0,O-1))||void 0===t||t)&&(A||M)){const e=N.int(0);for(let t=0;te){O=t;break}}w.chemCompMap=new cS(w);const F=D.categories.chem_comp;let B=F.getField("id");const z=F.getField("type");for(let e=0;e{const n=e.getField(t);return n?n.toFloatArray({array:Float32Array,start:0,end:i}):new Float32Array(i)};L.resize(O),L.x=U(k,"Cartn_x",O),L.y=U(k,"Cartn_y",O),L.z=U(k,"Cartn_z",O),L.serial=k.getField("id").toIntArray({start:0,end:O}),L.bfactor=U(k,"B_iso_or_equiv",O),L.occupancy=U(k,"occupancy",O);const V=k.getField("label_alt_id");(null==V?void 0:V.isDefined)&&(L.altloc=Uint8Array.from(V.toStringArray(),(e=>e.charCodeAt(0))));const $=k.getField("label_atom_id"),G=k.getField("type_symbol");B=k.getField("label_comp_id");const H=null!==(i=k.getField("auth_seq_id"))&&void 0!==i?i:k.getField("label_seq_id"),j=k.getField("pdbx_PDB_ins_code"),W=k.getField("auth_asym_id"),q=k.getField("label_asym_id"),X=k.getField("group_PDB"),Y=k.getField("label_entity_id");for(let e=0;e0){const[e,t]=c.split("(").filter((e=>!!e)),i=s(e),r=s(t);Object.keys(i).forEach((function(e){Object.keys(r).forEach((function(t){const s=new qt;s.multiplyMatrices(i[e],r[t]),n[e+"x"+t]=s}))}))}else n=s(c);const u=[];for(let e in n)u.push(n[e]);let h=""+t;/^(0|[1-9][0-9]*)$/.test(h)&&(h="BU"+h);const d=l.str(e).split(",").map((e=>i[e]));void 0===r[h]&&(r[h]=new Lm(h)),r[h].addPart(u,d)}}if(e.struct_ncs_oper){const t=e.struct_ncs_oper,i="NCS";r[i]=new Lm(i);const n=r[i].addPart(),s=t.getField("code"),a=t.getField("matrix[1][1]"),o=t.getField("matrix[1][2]"),l=t.getField("matrix[1][3]"),c=t.getField("matrix[2][1]"),u=t.getField("matrix[2][2]"),h=t.getField("matrix[2][3]"),d=t.getField("matrix[3][1]"),f=t.getField("matrix[3][2]"),m=t.getField("matrix[3][3]"),p=t.getField("vector[1]"),g=t.getField("vector[2]"),_=t.getField("vector[3]");for(let e=0;ea&&([s,a]=[a,s],[T,D]=[D,T]),0!==s&&0!==a)for(let e=0;ev)continue}d=T.substr(5,5).trim(),f=parseInt(T.substr(0,5)),m=parseInt(T.substr(15,5)),x.growIfFull(),x.atomTypeId[w]=b.add(h),x.x[w]=I,x.y[w]=D,x.z[w]=R,x.serial[w]=m,r.addAtom(S,"","",d,f,!1,"l"),w+=1}}}(0,e.length,e)})),r.finalize(),n.finalizeAtoms(),Um(n),Vm(n),n.finalizeBonds(),Fm(n),e.Debug&&Fl.timeEnd("GroParser._parse "+this.name)}});var pS=["mmtfVersion","mmtfProducer","unitCell","spaceGroup","structureId","title","depositionDate","releaseDate","experimentalMethods","resolution","rFree","rWork","bioAssemblyList","ncsOperatorList","entityList","groupList","numBonds","numAtoms","numGroups","numChains","numModels","groupsPerChain","chainsPerModel"].concat(["xCoordList","yCoordList","zCoordList","groupIdList","groupTypeList","chainIdList","bFactorList","atomIdList","altLocList","occupancyList","secStructList","insCodeList","sequenceIndexList","chainNameList","bondAtomList","bondOrderList"]);function gS(e,t,i){return t?new e(t.buffer,t.byteOffset,t.byteLength/(i||1)):void 0}function _S(e){return gS(DataView,e)}function yS(e){return gS(Int8Array,e)}function vS(e){return gS(Int32Array,e,4)}function bS(e,t){var i=e.length/2;t||(t=new Int16Array(i));for(var n=0,r=0;ns&&++o;t=new Int32Array(o)}for(i=0,n=0;ir){for(var s=[],a=0;a0&&(a.biomolDict[e]=t)}const k=o.unitCell;k&&Array.isArray(k)&&k[0]?a.unitcell=new iS({a:k[0],b:k[1],c:k[2],alpha:k[3],beta:k[4],gamma:k[5],spacegroup:o.spaceGroup}):a.unitcell=void 0,jm(a,!0),Hm(a,!0),a.finalizeAtoms(),a.finalizeBonds(),Wm(a),e.Debug&&Fl.timeEnd("MmtfParser._parse "+this.name)}});const RS=/\s+/,LS={1:1,2:2,3:3,am:1,ar:1,du:1,un:1,nc:0};jl.add("mol2",class extends Jw{get type(){return"mol2"}_parse(){e.Debug&&Fl.time("Mol2Parser._parse "+this.name);const t=this.structure,i=this.structureBuilder,n=this.firstModelOnly,r=this.asTrajectory,s=t.frames;let a,o,l=!1;const c=t.atomMap,u=t.atomStore;u.resize(Math.round(this.streamer.data.length/60)),u.addField("partialCharge",1,"float32");let h=0,d=0,f=0,m=-1,p=0,g=0;const _=t.getAtomProxy(),y=t.getAtomProxy();this.streamer.eachChunkOfLines((function(e){!function(e,v,b){for(let x=e;xMOLECULE"===e?(g=1,d=0,++m):"@ATOM"===e?(g=2,f=u.count,r&&(o=0,a=new Float32Array(3*p),s.push(a),m>0&&(l=!0))):g="@BOND"===e?3:0;else if(1===g){if(0===d)t.title=e,t.id=e;else if(1===d){const t=e.split(RS);p=parseInt(t[0])}++d}else if(2===g){const t=e.split(RS);if(n&&m>0)continue;const s=parseFloat(t[2]),d=parseFloat(t[3]),f=parseFloat(t[4]);if(r){const e=3*o;if(a[e+0]=s,a[e+1]=d,a[e+2]=f,o+=1,l)continue}const p=t[0],g=t[1],_=t[5].split(".")[0],y=t[6]?parseInt(t[6]):1,v=t[7]?t[7]:"",b=t[8]?parseFloat(t[8]):0;u.growIfFull(),u.atomTypeId[h]=c.add(g,_),u.x[h]=s,u.y[h]=d,u.z[h]=f,u.serial[h]=+p,u.partialCharge[h]=b,i.addAtom(m,"","",v,y,!0),h+=1}else if(3===g){if(n&&m>0)continue;if(r&&m>0)continue;const i=e.split(RS);_.index=parseInt(i[1])-1+f,y.index=parseInt(i[2])-1+f;const s=LS[i[3]];t.bondStore.addBond(_,y,s)}}}(0,e.length,e)})),i.finalize(),t.finalizeAtoms(),Um(t),Hm(t,!0),jm(t,!0),t.finalizeBonds(),Km(t),Fm(t),e.Debug&&Fl.timeEnd("Mol2Parser._parse "+this.name)}});jl.add("pdbqt",class extends lS{get type(){return"pdbqt"}});jl.add("pqr",class extends lS{get type(){return"pqr"}});const kS=/> +<(.+)>/;class OS extends Jw{get type(){return"sdf"}_parse(){e.Debug&&Fl.time("SdfParser._parse "+this.name);const t=this.structure,i=this.structureBuilder,n=this.firstModelOnly,r=this.asTrajectory,s=this.streamer.peekLines(2);t.id=s[0].trim(),t.title=s[1].trim();const a=t.frames;let o,l,c=!1;const u=t.atomMap,h=t.atomStore;h.resize(Math.round(this.streamer.data.length/50)),h.addField("formalCharge",1,"int8");const d=t.getAtomProxy(),f=t.getAtomProxy();let m=0,p=0,g=0,_=0;const y=[];let v,b,x,w,S,M,A,C,T,P,E,I,D,R,L=!1,k={};t.extraData.sdf=y;let O=!1,N=!1,F=!1,B=[],z=[];const U=new Map;this.streamer.eachChunkOfLines((function(e){!function(e,s,V){for(let $=e;$-1,O?U.clear():(b=parseInt(e.substr(0,3)),x=parseInt(e.substr(3,3)),w=4,S=w+b,M=S,A=M+x,r&&(l=0,o=new Float32Array(3*b),a.push(o),g>0&&(c=!0)));else if(O&&"COUNTS"===B[0])b=parseInt(B[1]),r&&(l=0,o=new Float32Array(3*b),a.push(o),g>0&&(c=!0));else if(O&&2==B.length)"ATOM"===B[1]?"BEGIN"===B[0]?N=!0:"END"===B[0]&&(N=!1):"BOND"===B[1]&&("BEGIN"===B[0]?F=!0:"END"===B[0]&&(F=!1));else if(N||!O&&p>=w&&p0)continue;let t=0;if(O){if(C=parseFloat(B[2]),T=parseFloat(B[3]),P=parseFloat(B[4]),I=B[1],D=parseInt(B[0]),U.set(D,m),E=I+D,B.length>6){let e=B.slice(6).find((e=>0===e.indexOf("CHG=")));e&&(t=parseInt(e.substring(4)))}}else C=parseFloat(e.substr(0,10)),T=parseFloat(e.substr(10,10)),P=parseFloat(e.substr(20,10)),I=e.substr(31,3).trim(),E=I+(m-_+1);if(r){const e=3*l;if(o[e+0]=C,o[e+1]=T,o[e+2]=P,l+=1,c)continue}h.growIfFull(),h.atomTypeId[m]=u.add(E,I),h.x[m]=C,h.y[m]=T,h.z[m]=P,h.serial[m]=O?D:m,h.formalCharge[m]=t,i.addAtom(g,"","","HET",1,!0),m+=1}else if(F||!O&&p>=M&&p0)continue;if(r&&g>0)continue;O?(d.index=U.get(parseInt(B[2])),f.index=U.get(parseInt(B[3])),R=parseInt(B[1])):(d.index=parseInt(e.substr(0,3))-1+_,f.index=parseInt(e.substr(3,3))-1+_,R=parseInt(e.substr(6,3))),t.bondStore.addBond(d,f,R)}else if("M CHG"===e.substr(0,6)){const t=parseInt(e.substr(6,3));for(let i=0,n=10;i"===e.charAt(0)&&(v=e.match(kS))?(L=v[1],k[L]=[]):!1!==L&&e&&k[L].push(e);++p}}}(0,e.length,e)})),i.finalize(),t.finalizeAtoms(),t.finalizeBonds(),Km(t),e.Debug&&Fl.timeEnd("SdfParser._parse "+this.name)}_postProcess(){Km(this.structure)}}jl.add("sdf",OS),jl.add("sd",OS),jl.add("mol",OS);function NS(e,t,i){return parseInt(e.substr(t,i).trim())}class FS extends Jw{get type(){return"prmtop"}_parse(){e.Debug&&Fl.time("PrmtopParser._parse "+this.name);const t=this.structure,i=this.structureBuilder,n=t.atomMap,r=t.atomStore;r.addField("partialCharge",1,"float32"),r.addField("radius",1,"float32");const s=[],a={},o=["NATOM","NTYPES","NBONH","MBONA","NTHETH","MTHETA","NPHIH","MPHIA","NHPARM","NPARM","NNB","NRES","NBONA","NTHETA","NPHIA","NUMBND","NUMANG","NPTRA","NATYP","NPHB","IFPERT","NBPER","NGPER","NDPER","MBPER","MGPER","MDPER","IFBOX","NMXRS","IFCAP","NUMEXTRA","NCOPY"];let l,c,u,h,d;o.forEach((e=>{a[e]=0}));let f,m,p,g,_,y=new Uint8Array(0);this.streamer.eachChunkOfLines((function(e){!function(e,t,i){for(let n=e;n0)return void Fl.error("dcd format with fixed atoms unsupported, aborting");const p=a.NATOM,g=4*p;for(let e=0,n=a.NSET;e=1&&(n.timeOffset=(a.ISTART-1)*n.deltaTime),e.Debug&&Fl.timeEnd("DcdParser._parse "+this.name)}});const WS={BYTE:1,CHAR:2,SHORT:3,INT:4,FLOAT:5,DOUBLE:6};function qS(e){switch(Number(e)){case WS.BYTE:return"byte";case WS.CHAR:return"char";case WS.SHORT:return"short";case WS.INT:return"int";case WS.FLOAT:return"float";case WS.DOUBLE:return"double";default:return"undefined"}}function XS(e){switch(Number(e)){case WS.BYTE:case WS.CHAR:return 1;case WS.SHORT:return 2;case WS.INT:case WS.FLOAT:return 4;case WS.DOUBLE:return 8;default:return-1}}function YS(e){switch(String(e)){case"byte":return WS.BYTE;case"char":return WS.CHAR;case"short":return WS.SHORT;case"int":return WS.INT;case"float":return WS.FLOAT;case"double":return WS.DOUBLE;default:return-1}}function KS(e,t){if(1!==e){const i=new Array(e);for(let n=0;n6,"non valid type "+u);const h=e.readUint32();let d=e.readUint32();2===i&&(GS(d>0,"offsets larger than 4GB not supported"),d=e.readUint32()),l[0]===t&&(s+=h),r[n]={name:a,dimensions:l,attributes:c,type:qS(u),size:h,offset:d,record:l[0]===t}}}return{variables:r,recordStep:s}}(e,n.recordId,t);return i.variables=r.variables,i.recordDimension.recordStep=r.recordStep,i}function nM(e){let t;const i=e.readUint32();if(i===QS)return GS(e.readUint32()!==QS,"wrong empty tag for list of attributes"),[];{GS(i!==tM,"wrong tag for list of attributes");const n=e.readUint32();t=new Array(n);for(let i=0;i6,"non valid type "+r);const s=e.readUint32(),a=ZS(e,r,s);HS(e),t[i]={name:n,type:qS(r),value:a}}}return t}class rM{constructor(e){const t=new uc(e);t.setBigEndian(),GS("CDF"!==t.readChars(3),"should start with CDF");const i=t.readByte();GS(i>2,"unknown version"),this.header=iM(t,i),this.buffer=t}get version(){return 1===this.header.version?"classic format":"64-bit offset format"}get recordDimension(){return this.header.recordDimension}get dimensions(){return this.header.dimensions}get globalAttributes(){return this.header.globalAttributes}get variables(){return this.header.variables}hasDataVariable(e){return-1!==this.header.variables.findIndex((function(t){return t.name===e}))}getDataVariable(e){let t;return t="string"==typeof e?this.header.variables.find((function(t){return t.name===e})):e,GS(void 0===t,"variable not found"),this.buffer.seek(t.offset),t.record?function(e,t,i){const n=YS(t.type),r=t.size?t.size/XS(n):1,s=i.length,a=new Array(s),o=i.recordStep;for(let t=0;t=1&&(i.timeOffset=s[0]),s.length>=2&&(i.deltaTime=s[1]-s[0]),e.Debug&&Fl.timeEnd("NctrajParser._parse "+this.name)}}jl.add("nctraj",sM),jl.add("ncdf",sM),jl.add("nc",sM);jl.add("trr",class extends $S{get type(){return"trr"}get isBinary(){return!0}_parse(){e.Debug&&Fl.time("TrrParser._parse "+this.name);const t=Mo(this.streamer.data),i=new DataView(t),n=this.frames,r=n.coordinates,s=n.boxes,a=n.times;let o=0;for(;;){o+=8;const e=i.getInt32(o);o+=4,o+=e;const n=i.getInt32(o+8),l=i.getInt32(o+12),c=i.getInt32(o+16),u=i.getInt32(o+28),h=i.getInt32(o+32),d=i.getInt32(o+36),f=i.getInt32(o+40);o+=52;const m=n/9,p=3*f;if(8===m?a.push(i.getFloat64(o)):a.push(i.getFloat32(o)),o+=2*m,n){const e=new Float32Array(9);if(8===m)for(let t=0;t<9;++t)e[t]=10*i.getFloat64(o),o+=8;else for(let t=0;t<9;++t)e[t]=10*i.getFloat32(o),o+=4;s.push(e)}if(o+=l,o+=c,u){let e;if(8===m){e=new Float32Array(p);for(let t=0;t>8&65280|t>>24&255}e=new Float32Array(t,o,p);for(let t=0;t=t.byteLength)break}a.length>=1&&(n.timeOffset=a[0]),a.length>=2&&(n.deltaTime=a[1]-a[0]),e.Debug&&Fl.timeEnd("TrrParser._parse "+this.name)}});const aM=new Uint32Array([0,0,0,0,0,0,0,0,0,8,10,12,16,20,25,32,40,50,64,80,101,128,161,203,256,322,406,512,645,812,1024,1290,1625,2048,2580,3250,4096,5060,6501,8192,10321,13003,16384,20642,26007,32768,41285,52015,65536,82570,104031,131072,165140,208063,262144,330280,416127,524287,660561,832255,1048576,1321122,1664510,2097152,2642245,3329021,4194304,5284491,6658042,8388607,10568983,13316085,16777216]);function oM(e){let t=1,i=0;for(;e>=t&&i<32;)i++,t<<=1;return i}const lM=new Uint8Array(32);function cM(e,t){let i=1,n=0;lM[0]=1;for(let n=0;n>=8;for(;0!==r;)lM[e++]=255&r,r>>=8;i=e}let r=1;for(i--;lM[i]>=r;)n++,r*=2;return n+8*i}function uM(e,t,i,n){const r=(1<=8;)a=a<<8|t[o++],l|=a>>s<0&&(s>s&(1<8;)hM[o++]=uM(e,t,8,a),n-=8;n>0&&(hM[o++]=uM(e,t,n,a));for(let e=i-1;e>0;e--){let t=0;for(let i=o-1;i>=0;i--){t=t<<8|hM[i];const n=t/r[e]|0;hM[i]=n,t-=n*r[e]}s[e]=t}s[0]=hM[0]|hM[1]<<8|hM[2]<<16|hM[3]<<24}jl.add("xtc",class extends $S{get type(){return"xtc"}get isBinary(){return!0}_parse(){e.Debug&&Fl.time("XtcParser._parse "+this.name);const t=Mo(this.streamer.data),i=new DataView(t),n=this.frames,r=n.coordinates,s=n.boxes,a=n.times,o=new Int32Array(6),l=new Int32Array(3),c=new Int32Array(3),u=new Uint32Array(3),h=new Float32Array(3),d=new Float32Array(3);let f=0;const m=new Int32Array(3),p=new Uint32Array(m.buffer);for(;;){let e;const n=i.getInt32(f+4);f+=12;const g=3*n;a.push(i.getFloat32(f)),f+=4;const _=new Float32Array(9);for(let e=0;e<9;++e)_[e]=10*i.getFloat32(f),f+=4;if(s.push(_),n<=9){e=new Float32Array(n);for(let t=0;t16777215?(c[0]=oM(l[0]),c[1]=oM(l[1]),c[2]=oM(l[2]),a=0):a=cM(3,l);let _=i.getInt32(f);f+=4;let y=_-1;y=9>y?9:y;let v=aM[y]/2|0,b=aM[_]/2|0;u[0]=u[1]=u[2]=aM[_];let x=4*Math.ceil(i.getInt32(f)/4);f+=4;const w=1/s;let S=0,M=0;const A=new Uint8Array(t,f);for(h[0]=h[1]=h[2]=0;M0){h[0]=h[1]=h[2]=0;for(let t=0;t9?aM[_-1]/2|0:0):t>0&&(v=b,b=aM[_]/2|0),u[0]=u[1]=u[2]=aM[_],0===u[0]||0===u[1]||0===u[2])return void console.error("(xdrfile error) Undefined error.")}f+=x}for(let t=0;t=t.byteLength)break}a.length>=1&&(n.timeOffset=a[0]),a.length>=2&&(n.deltaTime=a[1]-a[0]),e.Debug&&Fl.timeEnd("XtcParser._parse "+this.name)}});class fM extends Qw{constructor(e,t){const i=t||{};super(e,i),this.volume=new Df(this.name,this.path),this.voxelSize=uo(i.voxelSize,1)}get type(){return"volume"}get __objName(){return"volume"}_afterParse(){this.volume.setMatrix(this.getMatrix()),super._afterParse()}getMatrix(){return new qt}}const mM=/\s+/,pM=/-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g,gM=.529177210859;class _M extends fM{get type(){return"cube"}_parse(){e.Debug&&Fl.time("CubeParser._parse "+this.name);const t=this.volume,i=this.streamer.peekLines(6),n={},r=gM*this.voxelSize;function s(e,t){var n=i[e].trim().split(mM)[t];return parseFloat(n)}n.atomCount=Math.abs(s(2,0)),n.originX=s(2,1)*gM,n.originY=s(2,2)*gM,n.originZ=s(2,3)*gM,n.NVX=s(3,0),n.NVY=s(4,0),n.NVZ=s(5,0),n.basisX=new _t(s(3,1),s(3,2),s(3,3)).multiplyScalar(r),n.basisY=new _t(s(4,1),s(4,2),s(4,3)).multiplyScalar(r),n.basisZ=new _t(s(5,1),s(5,2),s(5,3)).multiplyScalar(r);const a=new Float32Array(n.NVX*n.NVY*n.NVZ);let o=0,l=0;const c=s(2,0)>0?0:1;this.streamer.eachChunkOfLines((function(e){!function(e,t,i){for(let r=e;r=n.atomCount+6+c){const t=e.match(pM);for(let e=0,i=t.length;e>8&255}i.xStart=a[0],i.yStart=a[1],i.zStart=a[2],i.xExtent=a[3],i.yExtent=a[4],i.zExtent=a[5],i.xRate=a[6],i.yRate=a[7],i.zRate=a[8];const e=1/a[17],t=e*this.voxelSize;i.xlen=a[9]*t,i.ylen=a[10]*t,i.zlen=a[11]*t,i.alpha=a[12]*e,i.beta=a[13]*e,i.gamma=a[14]*e,n=a[15]/100,r=a[16],i.gamma=a[14]*e}t.header=i,e.Debug&&Fl.log(i,n,r);const c=new Float32Array(i.xExtent*i.yExtent*i.zExtent);let u=512;const h=Math.ceil(i.xExtent/8),d=Math.ceil(i.yExtent/8),f=Math.ceil(i.zExtent/8);for(var m=0;ms){const e=i[n].trim();if(""!==e){const t=e.split(vM);for(let e=0,i=t.length;e=s&&(p-s)%f!=0&&m=0?i-1:i+t/3)},parseNormalIndex:function(e,t){var i=parseInt(e,10);return 3*(i>=0?i-1:i+t/3)},addVertex:function(e,t,i){var n=this.vertices,r=this.object.geometry.vertices;r.push(n[e+0]),r.push(n[e+1]),r.push(n[e+2]),r.push(n[t+0]),r.push(n[t+1]),r.push(n[t+2]),r.push(n[i+0]),r.push(n[i+1]),r.push(n[i+2])},addVertexLine:function(e){var t=this.vertices,i=this.object.geometry.vertices;i.push(t[e+0]),i.push(t[e+1]),i.push(t[e+2])},addNormal:function(e,t,i){var n=this.normals,r=this.object.geometry.normals;r.push(n[e+0]),r.push(n[e+1]),r.push(n[e+2]),r.push(n[t+0]),r.push(n[t+1]),r.push(n[t+2]),r.push(n[i+0]),r.push(n[i+1]),r.push(n[i+2])},addFace:function(e,t,i,n,r,s,a,o){var l,c=this.vertices.length,u=this.parseVertexIndex(e,c),h=this.parseVertexIndex(t,c),d=this.parseVertexIndex(i,c);if(void 0===n?this.addVertex(u,h,d):(l=this.parseVertexIndex(n,c),this.addVertex(u,h,l),this.addVertex(h,d,l)),void 0!==r){var f=this.normals.length;u=this.parseNormalIndex(r,f),h=r===s?u:this.parseNormalIndex(s,f),d=r===a?u:this.parseNormalIndex(a,f),void 0===n?this.addNormal(u,h,d):(l=this.parseNormalIndex(o,f),this.addNormal(u,h,l),this.addNormal(h,d,l))}},addLineGeometry:function(e){this.object.geometry.type="Line";for(var t=this.vertices.length,i=0,n=e.length;i0?v.setAttribute("normal",new $i(new Float32Array(y.normals),3)):v.computeVertexNormals(),_.push(v)}}return _}};jl.add("obj",class extends FM{get type(){return"obj"}getLoader(){return new BM}});const zM=["int8","char","uint8","uchar","int16","short","uint16","ushort","int32","int","uint32","uint","float32","float","float64","double"];function UM(e){if(function(e){return zM.includes(e)}(e))return e;throw new Error(`Unsupported data type: ${e}`)}function VM(e){if("object"!=typeof e||null===e)throw new Error("Expected element to be an object");if("string"!=typeof e.name)throw new Error("Expected element.name to be a string");if("number"!=typeof e.count)throw new Error("Expected element.count to be a number");if(!Array.isArray(e.properties))throw new Error("Expected element.properties to be an array")}function $M(e,t,i){switch(t){case"int8":case"char":return{read:t=>e.getInt8(t),size:1};case"uint8":case"uchar":return{read:t=>e.getUint8(t),size:1};case"int16":case"short":return{read:t=>e.getInt16(t,i),size:2};case"uint16":case"ushort":return{read:t=>e.getUint16(t,i),size:2};case"int32":case"int":return{read:t=>e.getInt32(t,i),size:4};case"uint32":case"uint":return{read:t=>e.getUint32(t,i),size:4};case"float32":case"float":return{read:t=>e.getFloat32(t,i),size:4};case"float64":case"double":return{read:t=>e.getFloat64(t,i),size:8};default:throw new Error(`Unsupported data type: ${t}`)}}function GM(e,t){const i={};let n=0;for(let r=0;r0&&t.setIndex(e.indices),t.setAttribute("position",new ji(e.vertices,3)),e.normals.length>0&&t.setAttribute("normal",new ji(e.normals,3)),e.uvs.length>0&&t.setAttribute("uv",new ji(e.uvs,2)),e.colors.length>0&&t.setAttribute("color",new ji(e.colors,3)),(e.faceVertexUvs.length>0||e.faceVertexColors.length>0)&&(t=t.toNonIndexed(),e.faceVertexUvs.length>0&&t.setAttribute("uv",new ji(e.faceVertexUvs,2)),e.faceVertexColors.length>0&&t.setAttribute("color",new ji(e.faceVertexColors,3)));for(const i of Object.keys(this.customPropertyMapping))e[i].length>0&&t.setAttribute(i,new ji(e[i],this.customPropertyMapping[i].length));return t.computeBoundingSphere(),t}makeBinaryProperties(e,t,i){const n=[];for(let r=0,s=e.length;re.name));function i(e){for(let i=0,n=e.length;i=this.arr.length}next(){return this.arr[this.i++]}}jl.add("ply",class extends FM{get type(){return"ply"}getLoader(){return new HM}});jl.add("csv",class extends Qw{constructor(e,t){const i=t||{};super(e,i),this.delimiter=uo(i.delimiter,","),this.comment=uo(i.comment,"#"),this.columnNames=uo(i.columnNames,!1),this.table={name:this.name,path:this.path,columnNames:[],data:[]}}get type(){return"csv"}get __objName(){return"table"}_parse(){const e=this.table.data,t=new RegExp("\\s*"+this.delimiter+"\\s*");let i=0;this.streamer.eachChunkOfLines((n=>{const r=n.length;for(let s=0;s/g,""),{declaration:t(),root:i()};function t(){if(!r(/^<\?xml\s*/))return;const e={attributes:{}};for(;!s()&&!a("?>");){const t=n();if(!t)return e;e.attributes[t.name]=t.value}return r(/\?>\s*/),e}function i(){const e=r(QM);if(!e)return;const t={name:e[1],attributes:{},children:[]};for(;!(s()||a(">")||a("?>")||a("/>"));){const e=n();if(!e)return t;t.attributes[e.name]=e.value}if(r(/^\s*\/>\s*/))return t;let o;for(r(/\??>\s*/),t.content=function(){const e=r(JM);return e?e[1]:""}();o=i();)t.children.push(o);return r(/^<\/[\w-:.]+>\s*/),t}function n(){const e=r(eA);var t;if(e)return{name:e[1],value:(t=e[2],t.replace(ZM,""))}}function r(t){const i=e.match(t);if(i)return e=e.slice(i[0].length),i}function s(){return 0===e.length}function a(t){return 0===e.indexOf(t)}}class iA extends Qw{constructor(e,t){const i=t||{};super(e,i),this.useDomParser=uo(i.useDomParser,!1),this.xml={name:this.name,path:this.path,data:{}}}get type(){return"xml"}get __objName(){return"xml"}get isXml(){return!0}__xmlParser(e){return tA(e)}__domParser(e){return(new window.DOMParser).parseFromString(e,"text/xml")}_parse(){e.Debug&&Fl.time("XmlParser._parse "+this.name),this.useDomParser?this.streamer.data instanceof Document?this.xml.data=this.streamer.data:this.xml.data=this.__domParser(this.streamer.asText()):this.xml.data=this.__xmlParser(this.streamer.asText()),e.Debug&&Fl.timeEnd("XmlParser._parse "+this.name)}}function nA(e,t){const i=e.getNamedItem(t);return null!==i?i.value:""}function rA(e,t,i=!1){const n=nA(e,"icode").trim(),r=nA(e,"chain").trim(),s=nA(e,"altcode");let a=nA(e,"resnum");return n&&(a+="^"+n),r&&(a+=":"+r),t&&(a+="."+t),i&&s.trim()&&(a+="%"+s),a+="/"+(parseInt(nA(e,"model"))-1),a}function sA(e){const t=nA(e,"chain").trim();let i=`[${nA(e,"rescode")}]${nA(e,"resnum")}`;return t&&(i+=`:${t}`),i}function aA(e,t,i){void 0===e[t]?e[t]=i:e[t]|=i}function oA(e,t){return null!==e&&e.value===t}function lA(e,t,i){let n=0;const r=t.getElementsByTagName("clash");for(let t=0,i=r.length;t0&&(n+=1);t.getElementsByTagName("bond-outlier").length>0&&(n+=1);return t.getElementsByTagName("plane-outlier").length>0&&(n+=1),oA(i.getNamedItem("rota"),"OUTLIER")&&(n+=1),oA(i.getNamedItem("rama"),"OUTLIER")&&(n+=1),oA(i.getNamedItem("RNApucker"),"outlier")&&(n+=1),n}jl.add("xml",iA);class cA{constructor(e,t){this.name=e,this.path=t,this.rsrzDict={},this.rsccDict={},this.rciDict={},this.clashDict={},this.clashArray=[],this.geoDict={},this.geoAtomDict={},this.atomDict={},this.clashSele="NONE"}get type(){return"validation"}fromXml(t){e.Debug&&Fl.time("Validation.fromXml");const i=this.rsrzDict,n=this.rsccDict,r=this.rciDict,s=this.clashDict,a=this.clashArray,o=this.geoDict,l=this.geoAtomDict,c=this.atomDict,u=t.getElementsByTagName("Entry");if(1===u.length){const e=u[0].getElementsByTagName("chemical_shift_list");if(1===e.length){const t=e[0].getElementsByTagName("random_coil_index");for(let e=0,i=t.length;e0&&(o[n]=e)}else{const e=t.getElementsByTagName("clash"),i=t.getElementsByTagName("mog-bond-outlier"),r=t.getElementsByTagName("mog-angle-outlier");if(i.length>0||r.length>0||e.length>0){const t={};l[n]=t;for(let i=0,n=e.length;i>>16&65535,a=0;0!==i;){i-=a=i>2e3?2e3:i;do{s=s+(r=r+t[n++]|0)|0}while(--a);r%=65521,s%=65521}return r|s<<16}jl.add("validation",class extends iA{constructor(e,t){super(e,t||{}),this.useDomParser=!0,this.validation=new cA(this.name,this.path)}get __objName(){return"validation"}get isXml(){return!0}_parse(){super._parse(),e.Debug&&Fl.time("ValidationParser._parse "+this.name),this.validation.fromXml(this.xml.data),e.Debug&&Fl.timeEnd("ValidationParser._parse "+this.name)}});var fA=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();function mA(e,t,i,n){var r=fA,s=n+i;e^=-1;for(var a=n;a>>8^r[255&(e^t[a])];return~e}var pA=30,gA=12;function _A(e,t){var i,n,r,s,a,o,l,c,u,h,d,f,m,p,g,_,y,v,b,x,w,S,M,A,C;i=e.state,n=e.next_in,A=e.input,r=n+(e.avail_in-5),s=e.next_out,C=e.output,a=s-(t-e.avail_out),o=s+(e.avail_out-257),l=i.dmax,c=i.wsize,u=i.whave,h=i.wnext,d=i.window,f=i.hold,m=i.bits,p=i.lencode,g=i.distcode,_=(1<>>=b=v>>>24,m-=b,0===(b=v>>>16&255))C[s++]=65535&v;else{if(!(16&b)){if(64&b){if(32&b){i.mode=gA;break e}e.msg="invalid literal/length code",i.mode=pA;break e}v=p[(65535&v)+(f&(1<>>=b,m-=b),m<15&&(f+=A[n++]<>>=b=v>>>24,m-=b,16&(b=v>>>16&255)){if(w=65535&v,m<(b&=15)&&(f+=A[n++]<l){e.msg="invalid distance too far back",i.mode=pA;break e}if(f>>>=b,m-=b,w>(b=s-a)){if((b=w-b)>u&&i.sane){e.msg="invalid distance too far back",i.mode=pA;break e}if(S=0,M=d,0===h){if(S+=c-b,b2;)C[s++]=M[S++],C[s++]=M[S++],C[s++]=M[S++],x-=3;x&&(C[s++]=M[S++],x>1&&(C[s++]=M[S++]))}else{S=s-w;do{C[s++]=C[S++],C[s++]=C[S++],C[s++]=C[S++],x-=3}while(x>2);x&&(C[s++]=C[S++],x>1&&(C[s++]=C[S++]))}break}if(64&b){e.msg="invalid distance code",i.mode=pA;break e}v=g[(65535&v)+(f&(1<>3,f&=(1<<(m-=x<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n=1&&0===I[x];x--);if(w>x&&(w=x),0===x)return r[s++]=20971520,r[s++]=20971520,o.bits=1,0;for(b=1;b0&&(e===xA||1!==x))return-1;for(D[1]=0,y=1;yvA||e===SA&&C>bA)return 1;for(;;){m=y-M,a[v]f?(p=R[L+a[v]],g=P[E+a[v]]):(p=96,g=0),l=1<>M)+(c-=l)]=m<<24|p<<16|g}while(0!==c);for(l=1<>=1;if(0!==l?(T&=l-1,T+=l):T=0,v++,0==--I[y]){if(y===x)break;y=t[i+a[v]]}if(y>w&&(T&h)!==u){for(0===M&&(M=w),d+=b,A=1<<(S=y-M);S+MvA||e===SA&&C>bA)return 1;r[u=T&h]=w<<24|S<<16|d-s}}return 0!==T&&(r[d+T]=y-M<<24|64<<16),o.bits=w,0}var EA=1,IA=2,DA=0,RA=-2,LA=1,kA=12,OA=30,NA=852,FA=592;function BA(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function zA(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function UA(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,function(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=LA,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(NA),t.distcode=t.distdyn=new Int32Array(FA),t.sane=1,t.back=-1,DA):RA}(e)):RA}function VA(e,t){var i,n;return e?(n=new zA,e.state=n,n.window=null,i=function(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?RA:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,UA(e))):RA}(e,t),i!==DA&&(e.state=null),i):RA}var $A,GA,HA=!0;function jA(e){if(HA){var t;for($A=new Int32Array(512),GA=new Int32Array(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(PA(EA,e.lens,0,288,$A,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;PA(IA,e.lens,0,32,GA,0,e.work,{bits:5}),HA=!1}e.lencode=$A,e.lenbits=9,e.distcode=GA,e.distbits=5}function WA(e,t,i,n){var r,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(hA(s.window,t,i-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((r=s.wsize-s.wnext)>n&&(r=n),hA(s.window,t,i-n,r,s.wnext),(n-=r)?(hA(s.window,t,i-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,i.check=mA(i.check,T,2,0),c=0,u=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",i.mode=OA;break}if(8!=(15&c)){e.msg="unknown compression method",i.mode=OA;break}if(u-=4,w=8+(15&(c>>>=4)),0===i.wbits)i.wbits=w;else if(w>i.wbits){e.msg="invalid window size",i.mode=OA;break}i.dmax=1<>8&1),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=mA(i.check,T,2,0)),c=0,u=0,i.mode=3;case 3:for(;u<32;){if(0===o)break e;o--,c+=n[s++]<>>8&255,T[2]=c>>>16&255,T[3]=c>>>24&255,i.check=mA(i.check,T,4,0)),c=0,u=0,i.mode=4;case 4:for(;u<16;){if(0===o)break e;o--,c+=n[s++]<>8),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=mA(i.check,T,2,0)),c=0,u=0,i.mode=5;case 5:if(1024&i.flags){for(;u<16;){if(0===o)break e;o--,c+=n[s++]<>>8&255,i.check=mA(i.check,T,2,0)),c=0,u=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&((f=i.length)>o&&(f=o),f&&(i.head&&(w=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),hA(i.head.extra,n,s,f,w)),512&i.flags&&(i.check=mA(i.check,n,f,s)),o-=f,s+=f,i.length-=f),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===o)break e;f=0;do{w=n[s+f++],i.head&&w&&i.length<65536&&(i.head.name+=String.fromCharCode(w))}while(w&&f>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=kA;break;case 10:for(;u<32;){if(0===o)break e;o--,c+=n[s++]<>>=7&u,u-=7&u,i.mode=27;break}for(;u<3;){if(0===o)break e;o--,c+=n[s++]<>>=1)){case 0:i.mode=14;break;case 1:if(jA(i),i.mode=20,6===t){c>>>=2,u-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=OA}c>>>=2,u-=2;break;case 14:for(c>>>=7&u,u-=7&u;u<32;){if(0===o)break e;o--,c+=n[s++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=OA;break}if(i.length=65535&c,c=0,u=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(f=i.length){if(f>o&&(f=o),f>l&&(f=l),0===f)break e;hA(r,n,s,f,a),o-=f,s+=f,l-=f,a+=f,i.length-=f;break}i.mode=kA;break;case 17:for(;u<14;){if(0===o)break e;o--,c+=n[s++]<>>=5,u-=5,i.ndist=1+(31&c),c>>>=5,u-=5,i.ncode=4+(15&c),c>>>=4,u-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=OA;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,u-=3}for(;i.have<19;)i.lens[P[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,M={bits:i.lenbits},S=PA(0,i.lens,0,19,i.lencode,0,i.work,M),i.lenbits=M.bits,S){e.msg="invalid code lengths set",i.mode=OA;break}i.have=0,i.mode=19;case 19:for(;i.have>>16&255,y=65535&C,!((g=C>>>24)<=u);){if(0===o)break e;o--,c+=n[s++]<>>=g,u-=g,i.lens[i.have++]=y;else{if(16===y){for(A=g+2;u>>=g,u-=g,0===i.have){e.msg="invalid bit length repeat",i.mode=OA;break}w=i.lens[i.have-1],f=3+(3&c),c>>>=2,u-=2}else if(17===y){for(A=g+3;u>>=g)),c>>>=3,u-=3}else{for(A=g+7;u>>=g)),c>>>=7,u-=7}if(i.have+f>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=OA;break}for(;f--;)i.lens[i.have++]=w}}if(i.mode===OA)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=OA;break}if(i.lenbits=9,M={bits:i.lenbits},S=PA(EA,i.lens,0,i.nlen,i.lencode,0,i.work,M),i.lenbits=M.bits,S){e.msg="invalid literal/lengths set",i.mode=OA;break}if(i.distbits=6,i.distcode=i.distdyn,M={bits:i.distbits},S=PA(IA,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,M),i.distbits=M.bits,S){e.msg="invalid distances set",i.mode=OA;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(o>=6&&l>=258){e.next_out=a,e.avail_out=l,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=u,_A(e,d),a=e.next_out,r=e.output,l=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,c=i.hold,u=i.bits,i.mode===kA&&(i.back=-1);break}for(i.back=0;_=(C=i.lencode[c&(1<>>16&255,y=65535&C,!((g=C>>>24)<=u);){if(0===o)break e;o--,c+=n[s++]<>v)])>>>16&255,y=65535&C,!(v+(g=C>>>24)<=u);){if(0===o)break e;o--,c+=n[s++]<>>=v,u-=v,i.back+=v}if(c>>>=g,u-=g,i.back+=g,i.length=y,0===_){i.mode=26;break}if(32&_){i.back=-1,i.mode=kA;break}if(64&_){e.msg="invalid literal/length code",i.mode=OA;break}i.extra=15&_,i.mode=22;case 22:if(i.extra){for(A=i.extra;u>>=i.extra,u-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;_=(C=i.distcode[c&(1<>>16&255,y=65535&C,!((g=C>>>24)<=u);){if(0===o)break e;o--,c+=n[s++]<>v)])>>>16&255,y=65535&C,!(v+(g=C>>>24)<=u);){if(0===o)break e;o--,c+=n[s++]<>>=v,u-=v,i.back+=v}if(c>>>=g,u-=g,i.back+=g,64&_){e.msg="invalid distance code",i.mode=OA;break}i.offset=y,i.extra=15&_,i.mode=24;case 24:if(i.extra){for(A=i.extra;u>>=i.extra,u-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=OA;break}i.mode=25;case 25:if(0===l)break e;if(f=d-l,i.offset>f){if((f=i.offset-f)>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=OA;break}f>i.wnext?(f-=i.wnext,m=i.wsize-f):m=i.wnext-f,f>i.length&&(f=i.length),p=i.window}else p=r,m=a-i.offset,f=i.length;f>l&&(f=l),l-=f,i.length-=f;do{r[a++]=p[m++]}while(--f);0===i.length&&(i.mode=21);break;case 26:if(0===l)break e;r[a++]=i.length,l--,i.mode=21;break;case 27:if(i.wrap){for(;u<32;){if(0===o)break e;o--,c|=n[s++]<=252?6:QA>=248?5:QA>=240?4:QA>=224?3:QA>=192?2:1;function JA(e){var t,i,n,r,s,a=e.length,o=0;for(r=0;r>>6,t[s++]=128|63&i):i<65536?(t[s++]=224|i>>>12,t[s++]=128|i>>>6&63,t[s++]=128|63&i):(t[s++]=240|i>>>18,t[s++]=128|i>>>12&63,t[s++]=128|i>>>6&63,t[s++]=128|63&i);return t}function eC(e,t){var i,n,r,s,a=t||e.length,o=new Array(2*a);for(n=0,i=0;i4)o[n++]=65533,i+=s-1;else{for(r&=2===s?31:3===s?15:7;s>1&&i1?o[n++]=65533:r<65536?o[n++]=r:(r-=65536,o[n++]=55296|r>>10&1023,o[n++]=56320|1023&r)}return function(e,t){if(t<65537&&(e.subarray&&KA||!e.subarray&&YA))return String.fromCharCode.apply(null,uA(e,t));for(var i="",n=0;ne.length&&(t=e.length),i=t-1;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+ZA[e[i]]>t?i:t}ZA[254]=ZA[254]=1;var iC=0,nC={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};function rC(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}function sC(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}var aC=Object.prototype.toString;function oC(e){if(!(this instanceof oC))return new oC(e);this.options=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(var n in i)i.hasOwnProperty(n)&&(e[n]=i[n])}}return e}({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(15&t.windowBits||(t.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new rC,this.strm.avail_out=0;var i,n,r,s=VA(this.strm,t.windowBits);if(s!==iC)throw new Error(nC[s]);this.header=new sC,i=this.strm,n=this.header,i&&i.state&&2&(r=i.state).wrap&&(r.head=n,n.done=!1)}oC.prototype.push=function(e,t){var i,n,r,s,a,o,l=this.strm,c=this.options.chunkSize,u=this.options.dictionary,h=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?4:0,"string"==typeof e?l.input=function(e){for(var t=new Uint8Array(e.length),i=0,n=t.length;i0||0===l.avail_out)&&1!==i);return 1===i&&(n=4),4===n?(i=function(e){if(!e||!e.state)return RA;var t=e.state;return t.window&&(t.window=null),e.state=null,DA}(this.strm),this.onEnd(i),this.ended=!0,i===iC):2!==n||(this.onEnd(iC),l.avail_out=0,!0)},oC.prototype.onData=function(e){this.chunks.push(e)},oC.prototype.onEnd=function(e){e===iC&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=function(e){var t,i,n,r,s,a;for(n=0,t=0,i=e.length;t-1?t.name:t.name.substring(0,4);return!["pdb","cif"].includes(t.ext)||!1!==t.compressed&&"gz"!==t.compressed?("mmtf"===t.ext&&(Fl.warn("MMTF files distribution has been discontinued by RCSB PDB as of July 2024.\n Defaulting to bcif format instead. See https://www.rcsb.org/news/65a1af31c76ca3abcc925d0c for the deprecation notice"),t.base.endsWith(".bb")&&Fl.warn("Backbone only files are not available from RCSB PDB anymore."),t.ext=""),t.ext?Fl.warn("unsupported ext",t.ext):Fl.warn('mmCif files available from RCSB PDB lack connectivity information.\n Consider using PDBe as the data provider for using "Updated mmCif files" that contain residues connectivity records.'),cC+"//models.rcsb.org/"+i+".bcif.gz"):cC+"//files.rcsb.org/download/"+t.path}getExt(e){const t=rc(e).ext;return t||"bcif"}});const uC="//www.ebi.ac.uk/pdbe/entry-files/download/";Gl.add("pdbe",new class extends lC{getUrl(e){const t=rc(e);let i,n=t.name.indexOf("_")>-1?t.name:t.name.substring(0,4);switch(t.ext){case"cif":i=uC+n+"_updated.cif";break;case"pdb":case"ent":n.startsWith("pdb")||(n="pdb"+n),i=uC+n+".ent";break;case"bcif":i=uC+t.path;break;case"":i=uC+n+".bcif";break;default:Fl.warn("unsupported ext",t.ext),i=uC+n+".bcif"}return"https://"+i}getExt(e){const t=rc(e).ext;return t||"bcif"}});const hC="//pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/",dC="/SDF?record_type=3d";Gl.add("pubchem",new class extends lC{getUrl(e){const t=rc(e),i=t.name;let n;return t.ext&&"sdf"!==t.ext?(Fl.warn("unsupported ext",t.ext),n=hC+i+dC):n=hC+i+dC,function(){const e=window.location.protocol;return null===e.match(/http(s)?:/gi)?"http:":e}()+n}getExt(e){const t=rc(e).ext;return t||"sdf"}});class fC extends lC{getUrl(e){return e}getExt(e){return rc(e).ext}}Gl.add("ftp",new fC),Gl.add("http",new fC),Gl.add("https",new fC);const mC="//alphafold.ebi.ac.uk/files/AF-",pC="-F1-model_v4.pdb";Gl.add("alphafold",new class extends lC{getUrl(e){const t=rc(e),i=t.name;let n;return t.ext&&"pdb"!==t.ext?(Fl.warn("unsupported AF ext",t.ext),n=mC+i+pC):n=mC+i+pC,"https://"+n}getExt(e){const t=rc(e).ext;return t||"pdb"}});const gC=/^((http|https|ftp):)*\/\//;function _C(e,t){return{type:"integer",max:e,min:t}}function yC(e,t,i){return{type:"number",precision:e,max:t,min:i}}function vC(e,t,i){return{type:"range",step:e,max:t,min:i}}function bC(...e){return{type:"select",options:e.reduce(((e,t)=>Object.assign(Object.assign({},e),{[t]:t})),{})}}const xC={backgroundColor:{type:"color"},quality:bC("auto","low","medium","high"),sampleLevel:vC(1,5,-1),impostor:{type:"boolean"},workerDefault:{type:"boolean"},rotateSpeed:yC(1,10,0),zoomSpeed:yC(1,10,0),panSpeed:yC(1,10,0),clipNear:vC(1,100,0),clipFar:vC(1,100,0),clipDist:_C(200,0),clipMode:bC("scene","camera"),clipScale:bC("relative","absolute"),fogNear:vC(1,100,0),fogFar:vC(1,100,0),cameraType:bC("perspective","orthographic","stereo"),cameraEyeSep:yC(3,1,.01),cameraFov:vC(1,120,15),lightColor:{type:"color"},lightIntensity:yC(2,10,0),ambientColor:{type:"color"},ambientIntensity:yC(2,10,0),hoverTimeout:_C(1e4,-1),tooltip:{type:"boolean"},mousePreset:bC(...Object.keys(Wf))};e.AngleRepresentation=k_,e.ArrowBuffer=rv,e.Assembly=Lm,e.AxesRepresentation=Y_,e.BackboneRepresentation=Z_,e.BallAndStickRepresentation=K_,e.BaseRepresentation=Q_,e.Box3=bt,e.BoxBuffer=cv,e.BufferRepresentation=Mp,e.CartoonRepresentation=sy,e.Collection=rg,e.Color=Oi,e.Colormaker=qo,e.ColormakerRegistry=$l,e.Component=ng,e.ComponentCollection=Tg,e.ConeBuffer=tv,e.ContactRepresentation=ay,e.Counter=hc,e.CylinderBuffer=X_,e.DatasourceRegistry=Gl,e.DecompressorRegistry=ql,e.DihedralHistogramRepresentation=uy,e.DihedralRepresentation=oy,e.DistanceRepresentation=dy,e.EllipsoidBuffer=pv,e.Euler=ni,e.Frames=lg,e.HelixorientRepresentation=gy,e.HyperballRepresentation=Ay,e.Kdtree=Pm,e.KeyActions=Yf,e.LabelRepresentation=Ty,e.LeftMouseButton=1,e.LicoriceRepresentation=_y,e.LineRepresentation=Ey,e.Matrix3=He,e.Matrix4=qt,e.MdsrvDatasource=class extends lC{constructor(e=""){super(),this.baseUrl=e}getListing(e=""){let t=`${this.baseUrl}dir/${e}`;return"/"!==t[t.length-1]&&(t+="/"),ac(t,{ext:"json"}).then((t=>({path:e,data:t.data})))}getUrl(e){const t=rc(e);return`${this.baseUrl}file/${t.path}${t.query}`}getCountUrl(e){const t=rc(e);return`${this.baseUrl}traj/numframes/${t.path}${t.query}`}getFrameUrl(e,t){const i=rc(e);return`${this.baseUrl}traj/frame/${t}/${i.path}${i.query}`}getFrameParams(e,t){return`atomIndices=${t.join(";")}`}getPathUrl(e,t){const i=rc(e);return`${this.baseUrl}traj/path/${t}/${i.path}${i.query}`}getExt(e){return rc(e).ext}},e.MeasurementDefaultParams=Bl,e.MeshBuffer=Bf,e.MiddleMouseButton=2,e.MolecularSurface=ky,e.MolecularSurfaceRepresentation=Oy,e.MouseActions=jf,e.OctahedronBuffer=bv,e.ParserRegistry=jl,e.PdbWriter=class extends lc{constructor(e,t){super(),this.mimeType="text/plain",this.defaultName="structure",this.defaultExt="pdb";const i=Object.assign({},t);this.renumberSerial=uo(i.renumberSerial,!0),this.remarks=function(e){return Array.isArray(e)?e:[e]}(uo(i.remarks,[])),this.structure=e,this._records=[]}_writeRecords(){this._records.length=0,this._writeTitle(),this._writeRemarks(),this._writeAtoms()}_writeTitle(){this._records.push(oc.sprintf("TITLE %-74s",this.structure.name))}_writeRemarks(){this.remarks.forEach((e=>{this._records.push(oc.sprintf("REMARK %-73s",e))})),this.structure.trajectory&&(this._records.push(oc.sprintf("REMARK %-73s","Trajectory '"+this.structure.trajectory.name+"'")),this._records.push(oc.sprintf("REMARK %-73s",`Frame ${this.structure.trajectory.frame}`)))}_writeAtoms(){let e=1,t=1,i=" ",n=" ";const r=this.structure.modelStore.count>1;this.structure.eachModel((s=>{r&&this._records.push(oc.sprintf("MODEL %4d%-66s",t++,"")),s.eachAtom((t=>{const r=t.hetero?"HETATM%5d %-4s %3s %1s%4d %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%1s%1s":"ATOM %5d %-4s %3s %1s%4d %8.3f%8.3f%8.3f%6.2f%6.2f %4s%2s%1s%1s",s=this.renumberSerial?e:t.serial;let a=t.atomname;(1===a.length||a.length<4&&1===t.element.length&&a[0]===t.element)&&(a=" "+a),t.formalCharge?(i=Math.abs(t.formalCharge).toPrecision(1),n=t.formalCharge>0?"+":"-"):(i=" ",n=" "),this._records.push(oc.sprintf(r,s,a,t.resname,uo(t.chainname," "),t.resno,t.x,t.y,t.z,uo(t.occupancy,1),uo(t.bfactor,0),"",uo(t.element,""),i,n)),e+=1}),this.structure.getSelection()),r&&this._records.push(oc.sprintf("%-80s","ENDMDL"))})),this._records.push(oc.sprintf("%-80s","END"))}getString(){return console.warn("PdbWriter.getString() is deprecated, use .getData instead"),this.getData()}getData(){return this._writeRecords(),this._records.join("\n")}},e.PickingProxy=mu,e.Plane=On,e.PointBuffer=Up,e.PointRepresentation=Ny,e.Quaternion=gt,e.Queue=Ou,e.RepresentationCollection=sg,e.RepresentationElement=Jp,e.RepresentationRegistry=Hl,e.RibbonRepresentation=Uy,e.RightMouseButton=3,e.RocketRepresentation=Vy,e.RopeRepresentation=$y,e.ScriptExtensions=Ul,e.SdfWriter=class extends lc{constructor(e){super(),this.mimeType="text/plain",this.defaultName="structure",this.defaultExt="sdf",this.structure=e,this._records=[]}get idString(){return this.structure.id}get titleString(){return" "+this.structure.title}get countsString(){return oc.sprintf("%3i%3i 0 0 0 0 0 0 0 0999 V2000",this.structure.atomCount,this.structure.bondCount)}get chargeLines(){const e=[];this.structure.eachAtom((t=>{null!=t.formalCharge&&0!==t.formalCharge&&e.push([t.index,t.formalCharge])}));const t=[];for(let i=0;i{this._records.push(this.formatAtom(e))})),this.structure.eachBond((e=>{this._records.push(this.formatBond(e))})),this.chargeLines.forEach((e=>{this._records.push(e)})),this._records.push("M END")}_writeFooter(){this._records.push("$$$$")}getData(){return this._writeRecords(),this._records.join("\n")}},e.Selection=wl,e.Shape=Sp,e.ShapeComponent=Dg,e.Signal=Yo.Signal,e.SpacefillRepresentation=Gy,e.SpatialHash=Ch,e.SphereBuffer=Np,e.Stage=class{constructor(e,t={}){this.signals={parametersChanged:new Yo.Signal,fullscreenChanged:new Yo.Signal,componentAdded:new Yo.Signal,componentRemoved:new Yo.Signal,clicked:new Yo.Signal,hovered:new Yo.Signal},this.tasks=new hc,this.compList=[],this.defaultFileParams={},this.logList=[],this.viewer=new Qc(e),this.viewer.renderer&&(this.tooltip=document.createElement("div"),Object.assign(this.tooltip.style,{display:"none",position:"fixed",zIndex:"1000000",pointerEvents:"none",backgroundColor:"rgba( 0, 0, 0, 0.6 )",color:"lightgrey",padding:"8px",fontFamily:"sans-serif"}),this.viewer.container.appendChild(this.tooltip),this.mouseObserver=new eu(this.viewer.renderer.domElement),this.viewerControls=new Mu(this),this.trackballControls=new du(this),this.pickingControls=new pu(this),this.animationControls=new ku(this),this.mouseControls=new Xf(this),this.keyControls=new Zf(this),this.pickingBehavior=new Qf(this),this.mouseBehavior=new Jf(this),this.animationBehavior=new em(this),this.keyBehavior=new im(this),this.spinAnimation=this.animationControls.spin([0,1,0],.005),this.spinAnimation.pause(!0),this.rockAnimation=this.animationControls.rock([0,1,0],.005),this.rockAnimation.pause(!0),this.parameters=ho(t,Ig),this.setParameters(this.parameters),this.viewer.animate())}setParameters(e={}){fo(this.parameters,e);const t=e,i=this.parameters,n=this.viewer,r=this.trackballControls;return void 0!==t.quality&&this.setQuality(i.quality),void 0!==t.impostor&&this.setImpostor(i.impostor),void 0!==t.rotateSpeed&&(r.rotateSpeed=i.rotateSpeed),void 0!==t.zoomSpeed&&(r.zoomSpeed=i.zoomSpeed),void 0!==t.panSpeed&&(r.panSpeed=i.panSpeed),void 0!==t.mousePreset&&this.mouseControls.preset(i.mousePreset),this.mouseObserver.setParameters({hoverTimeout:i.hoverTimeout}),n.setClip(i.clipNear,i.clipFar,i.clipDist,i.clipMode,i.clipScale),n.setFog(void 0,i.fogNear,i.fogFar),n.setCamera(i.cameraType,i.cameraFov,i.cameraEyeSep),n.setSampling(i.sampleLevel),n.setBackground(i.backgroundColor),n.setLight(i.lightColor,i.lightIntensity,i.ambientColor,i.ambientIntensity),this.signals.parametersChanged.dispatch(this.getParameters()),this}log(e){console.log("STAGE LOG",e),this.logList.push(e)}getParameters(){return Object.assign({},this.parameters)}defaultFileRepresentation(t){if(t instanceof Mg){let i,n,r;t.setSelection("/0");const s=t.structure;if(s.biomolDict.BU1){const e=s.biomolDict.BU1;i=e.getAtomCount(s),n=e.getResidueCount(s),r=e.getInstanceCount(),t.setDefaultAssembly("BU1")}else i=s.getModelProxy(0).atomCount,n=s.getModelProxy(0).residueCount,r=1;let a=i;Rl&&(a*=4);const o=s.atomStore.count/s.residueStore.count<2;o&&(a*=10);let l="chainname",c="RdYlBu",u=!1;if(1===s.getChainnameCount(new wl("polymer and /0"))&&(l="residueindex",c="Spectral",u=!0),e.Debug&&console.log(a,i,r,o),n/r<4)t.addRepresentation("ball+stick",{colorScheme:"element",radiusScale:2,aspectRatio:1.5,bondScale:.3,bondSpacing:.75,quality:"auto"});else if(r>5&&a>15e3||a>7e5){let e=Math.min(2,Math.max(.1,6e3/(a/r)));o&&(e=Math.min(e,.5)),t.addRepresentation("surface",{colorScheme:l,colorScale:c,colorReverse:u,sele:"polymer",surfaceType:"av",probeRadius:1.4,scaleFactor:e,useWorker:!1})}else a>25e4?t.addRepresentation("backbone",{colorScheme:l,colorScale:c,colorReverse:u,lineOnly:!0}):a>1e5?t.addRepresentation("backbone",{colorScheme:l,colorScale:c,colorReverse:u,quality:"low",disableImpostor:!0,radiusScale:2}):a>8e4?t.addRepresentation("backbone",{colorScheme:l,colorScale:c,colorReverse:u,radiusScale:2}):(t.addRepresentation("cartoon",{colorScheme:l,colorScale:c,colorReverse:u,radiusScale:.7,aspectRatio:5,quality:"auto"}),a<5e4&&t.addRepresentation("base",{colorScheme:l,colorScale:c,colorReverse:u,quality:"auto"}),t.addRepresentation("ball+stick",{sele:"ligand",colorScheme:"element",radiusScale:2,aspectRatio:1.5,bondScale:.3,bondSpacing:.75,quality:"auto"}));t.structure.frames.length&&t.addTrajectory()}else(t instanceof Ag||t instanceof Cg)&&t.addRepresentation("surface");this.tasks.onZeroOnce(this.autoView,this)}loadFile(e,t={}){const i=Object.assign({},this.defaultFileParams,t),n=rc(e).name;this.tasks.increment(),this.log(`loading file '${n}'`);const r=uo(i.ext,rc(e).ext);let s;return s=jl.isTrajectory(r)?Promise.reject(new Error(`loadFile: ext '${r}' is a trajectory and must be loaded into a structure component`)):ac(e,i),s.then((e=>{this.log(`loaded '${n}'`);const t=this.addComponentFromObject(e,i);return i.defaultRepresentation&&this.defaultFileRepresentation(t),this.tasks.decrement(),t}),(e=>{this.tasks.decrement();const t=`error loading file: '${e}'`;throw this.log(t),t}))}loadScript(e){const t=rc(e).name;return this.log(`loading script '${t}'`),ac(e).then((e=>{this.tasks.increment(),this.log(`running script '${t}'`),e.run(this).then((()=>{this.tasks.decrement(),this.log(`finished script '${t}'`)})),this.log(`called script '${t}'`)}),(e=>{this.tasks.decrement();const i=`errored script '${t}' "${e}"`;throw this.log(i),i}))}addComponent(e){e?(this.compList.push(e),this.signals.componentAdded.dispatch(e)):Fl.warn("Stage.addComponent: no component given")}addComponentFromObject(e,t={}){const i=Xl.get(e.type);if(i){const n=new i(this,e,t);return this.addComponent(n),n}Fl.warn("no component for object type",e.type)}removeComponent(e){const t=this.compList.indexOf(e);-1!==t&&(this.compList.splice(t,1),e.dispose(),this.signals.componentRemoved.dispatch(e))}removeAllComponents(){this.compList.slice().forEach((e=>this.removeComponent(e)))}handleResize(){this.viewer.handleResize()}setSize(e,t){const i=this.viewer.container;i!==document.body&&(void 0!==e&&(i.style.width=e),void 0!==t&&(i.style.height=t),this.handleResize())}toggleFullscreen(e){if(!(document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled||document.msFullscreenEnabled))return void Fl.log("fullscreen mode (currently) not possible");const t=this;function i(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function n(){if(!i()&&t.lastFullscreenElement){const e=t.lastFullscreenElement;e.style.width=e.dataset.normalWidth||"",e.style.height=e.dataset.normalHeight||"",document.removeEventListener("fullscreenchange",n),document.removeEventListener("mozfullscreenchange",n),document.removeEventListener("webkitfullscreenchange",n),document.removeEventListener("MSFullscreenChange",n),t.handleResize(),t.signals.fullscreenChanged.dispatch(!1)}}e=e||this.viewer.container,this.lastFullscreenElement=e,i()?document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen():(e.dataset.normalWidth=e.style.width||"",e.dataset.normalHeight=e.style.height||"",e.style.width=window.screen.width+"px",e.style.height=window.screen.height+"px",e.requestFullscreen?e.requestFullscreen():e.msRequestFullscreen?e.msRequestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen&&e.webkitRequestFullscreen(),document.addEventListener("fullscreenchange",n),document.addEventListener("mozfullscreenchange",n),document.addEventListener("webkitfullscreenchange",n),document.addEventListener("MSFullscreenChange",n),this.handleResize(),this.signals.fullscreenChanged.dispatch(!0),setTimeout((function(){t.handleResize()}),100))}setSpin(e){e?(this.spinAnimation.resume(!0),this.rockAnimation.pause(!0)):this.spinAnimation.pause(!0)}setRock(e){e?(this.rockAnimation.resume(!0),this.spinAnimation.pause(!0)):this.rockAnimation.pause(!0)}toggleSpin(){this.setSpin(this.spinAnimation.paused)}toggleRock(){this.setRock(this.rockAnimation.paused)}getFocus(){const e=this.parameters;if("scene"!==e.clipMode)return 0;let t=e.clipNear;return"absolute"===e.clipScale&&(t=this.viewer.absoluteToRelative(t)),2*t}setFocus(e){if("scene"!==this.parameters.clipMode)return;let t,i,n,r;"relative"===this.parameters.clipScale?(t=No(e/2,0,49.9),i=100-t,n=50,r=function(e){return No(e,0,100)}(2*i-50)):(t=this.viewer.relativeToAbsolute(e/2),i=t,n=0,r=2*i),this.setParameters({clipNear:t,clipFar:i,fogNear:n,fogFar:r})}getZoomForBox(e){const t=e.getSize(Eg),i=Math.max(t.x,t.y,t.z),n=Math.min(t.x,t.y,t.z);let r=i+Math.sqrt(n);const s=Ro(this.viewer.perspectiveCamera.fov),a=this.viewer.width,o=this.viewer.height,l=o{this.tasks.onZeroOnce((()=>{this.tasks.increment(),this.viewer.makeImage(e).then((e=>{this.tasks.decrement(),t(e)})).catch((e=>{this.tasks.decrement(),i(e)}))}))}))}setImpostor(e){this.parameters.impostor=e;const t=["spacefill","ball+stick","licorice","hyperball","backbone","rocket","helixorient","contact","distance","dot"];this.eachRepresentation((function(i){if(!t.includes(i.getType()))return;const n=i.getParameters();n.disableImpostor=!e,i.build(n)}))}setQuality(e){this.parameters.quality=e;const t=["tube","cartoon","ribbon","trace","rope"],i=["spacefill","ball+stick","licorice","hyperball","backbone","rocket","helixorient","contact","distance","dot"];this.eachRepresentation((function(n){const r=n.getParameters();if(!t.includes(n.getType())){if(!i.includes(n.getType()))return;if(!r.disableImpostor)return void(n.repr.quality=e)}r.quality=e,n.build(r)}))}eachComponent(e,t){this.compList.slice().forEach((i=>{void 0!==t&&t!==i.type||e(i)}))}eachRepresentation(e,t){this.eachComponent((i=>{i.reprList.slice().forEach((n=>{void 0!==t&&t!==n.getType()||e(n,i)}))}))}getComponentsByName(e){const t=[];return this.eachComponent((i=>{(void 0===e||Pg(e,i))&&t.push(i)})),new Tg(t)}getComponentsByObject(e){const t=[];return this.eachComponent((i=>{i.object===e&&t.push(i)})),new Tg(t)}getRepresentationsByName(e){const t=[];return this.eachRepresentation(((i,n)=>{(void 0===e||Pg(e,i))&&t.push(i)})),new sg(t)}measureClear(){this.eachComponent((e=>e.measureClear()),"structure")}measureUpdate(){this.eachComponent((e=>e.measureUpdate()),"structure")}dispose(){this.tasks.dispose(),this.viewer.dispose(),this.mouseObserver.dispose()}},e.StaticDatasource=class extends lC{constructor(e=""){super(),this.baseUrl=e}getUrl(e){const t=rc(e);let i=this.baseUrl+t.path;return gC.test(this.baseUrl)||(i=function(e){const t=window.location,i=t.pathname,n=i.substring(0,i.lastIndexOf("/")+1);return t.origin+n+e}(i)),i}getExt(e){return rc(e).ext}},e.StlWriter=class extends lc{constructor(e){super(),this.mimeType="application/vnd.ms-pki.stl",this.defaultName="surface",this.defaultExt="stl",this.surface=e}getData(){const e=this.surface.index.length/3,t=new uc(2*e+3*e*4*4+80+4);t.skip(80),t.writeUint32(e);const i=new _t,n=new _t,r=new _t,s=new _t;for(let a=0;a{e.eachAtom((e=>{s.growIfFull(),s.atomTypeId[l]=a.add(e.atomname,e.element),s.x[l]=e.x,s.y[l]=e.y,s.z[l]=e.z,s.serial[l]=e.serial,s.formalCharge[l]=e.formalCharge,s.partialCharge[l]=e.partialCharge,s.altloc[l]=e.altloc,s.occupancy[l]=e.occupancy,s.bfactor[l]=e.bfactor,r.addAtom(e.modelIndex+u,e.chainname,e.chainid,e.resname,e.resno,1===e.hetero,e.sstruc,e.inscode),o[e.index+c]=l,l+=1})),c+=e.atomStore.count,u+=e.modelStore.count}));const h=n.bondStore,d=n.getAtomProxy(),f=n.getAtomProxy();return c=0,i.forEach((e=>{e.eachBond((e=>{d.index=o[e.atomIndex1+c],f.index=o[e.atomIndex2+c],h.addBond(d,f,e.bondOrder)})),c+=e.atomStore.count})),r.finalize(),jm(n,!0),Hm(n,!0),n.finalizeAtoms(),n.finalizeBonds(),Km(n),e.Debug&&Fl.timeEnd("concatStructures"),n},e.download=go,e.flatten=function e(t,i){i=uo(i,[]);for(let n=0;nt?(a&&(clearTimeout(a),a=null),o=c,s=e.apply(n,r),a||(n=r=null)):a||!1===i.trailing||(a=setTimeout(l,u)),s}},e.uniqueArray=bo,Object.defineProperty(e,"__esModule",{value:!0})})); +//# sourceMappingURL=ngl.js.map diff --git a/webui/frontend/src/app/advanced/page.tsx b/webui/frontend/src/app/advanced/page.tsx new file mode 100644 index 0000000..3bfba06 --- /dev/null +++ b/webui/frontend/src/app/advanced/page.tsx @@ -0,0 +1,145 @@ +"use client"; + +import React from "react"; +import Link from "next/link"; +import { useAppContext } from "../../context/AppContext"; +import Field from "../../components/Field"; +import QuenchingEditor from "../../components/QuenchingEditor"; +import { + MAX_PARALLEL_TRAJECTORIES, + parallelTrajectories as normalizeParallelTrajectories, +} from "../../lib/projectHelpers"; + +export default function AdvancedPage() { + const { + autoSimulate, + catalog, + project, + renderSparsity, + saveParameter, + savedProject, + setAutoSimulate, + setRenderSparsity, + setSurfaceRendering, + structure, + surfaceRendering, + updateProject, + } = useAppContext(); + const parallelTrajectories = normalizeParallelTrajectories(project.parallel_trajectories); + const savedParallelTrajectories = normalizeParallelTrajectories(savedProject.parallel_trajectories); + + return ( +
+
+
+

Amino-acid specific quenching

+
+
+ +
+
+ +
+
+

Simulation Configuration

+
+
+ + + + + CB is moved to the side-chain centre of mass and side-chain atoms are dropped, so every + quenching centre collapses onto that pseudo-atom and the accessible volume grows. A + modelling choice, not a speed-up. + + + updateProject("parallel_trajectories", normalizeParallelTrajectories(value))} + parameterId="parallel_trajectories" + catalog={catalog} + onSave={() => saveParameter("parallel_trajectories")} + isDirty={parallelTrajectories !== savedParallelTrajectories} + /> +
+
+ +
+
+

Visualization Configuration

+
+
+ + + setRenderSparsity(Math.max(1, Math.floor(value || 1)))} + /> +
+
+ +
+
+

Structure Information

+
+
+ {structure ? ( + + + + + + + + + + + + + + + + + + + +
Filename{structure.filename}
Local Path{structure.path}
Total Chains{structure.chains.length}
Total Atoms{structure.atom_count}
+ ) : ( +

+ No active structure loaded. Upload one here to view metadata. +

+ )} +
+
+
+ ); +} diff --git a/webui/frontend/src/app/favicon.ico b/webui/frontend/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..59d6bf8d8b8b8b423da4d5d53504da6f04d29c37 GIT binary patch literal 3180 zcmZ`*c{r49`+mm0ym?iG-eL@uC1yxt8{3eG$yOl|#>iwD%V3awDY8?Pnvk(&-^rGx zH*0pXrm>baW8c0}{d(WycYNRT9QS=)&vl;XwcPhV4*-CuFBl9Q?ZB-+0N@k=0HM0q zuO4GL%|dmLX=!4ghkA0Knz=qDl`z1=KJ`n${>3AVT$-0MJ7$Ku7gJ)ODJ=0Dv|b z1kh6LQExyp&2JQ(O#6?2M9c}XT%*$3us4kGMksALG|pb!!U|`J5hvI?9uWWpL5}L$ zWAGMWg1w!CiyT1#@`E8q^^d|(2>1sDZ>sU6eSQpi2n}#Q{^XH7fZm{8L46IF%B-&jufR~uwSD8kNj7q@&8o* z3;Cr)K##`#*Z4or_D7U@xQZ+Y=Lq<7@x^(g;p~g{q+lYlIhm2`i?h(x z0tkbel?1mj2QoxWxv0}B*0^^2X*s1P>m&`sN))lz%X+3}d2DxSzs76Xefclo;3Hk# z8}Bk~+zq`OQX-bzhQk~)Bk?i-EptTbhIWUOrTf(pVIu?8+BdcFqZrU=#W&^2K^cjO z! zO6o!WU%l&31$FqJ9*Y(P(f7uk2J&TMcFfY#7+Q04hALk8?0h$FJPvukl4+r>Ib=n& zkK<8x1v;dpxzcSnrTcHJ-)Uu?pmFSvJUh6-zQX2jBPc)zZpCv2eAIEA-CG|ETbxtWUEA6K0yxUjag|4j$$jd0O}Kc zeYe(NYHzYS{gI*8DtMidv%S*WBg2vq2{Jrp2vbeMKHhactrd~5C@ZFwb zqvK&ViFDbdt=(1Bt^tOG=Gv(D#&8q(4K(1LKoMZdOp!)q!g|&{9NY-teosC7aa4gRyJBQ<-Cxx3S z6CbtC03D^J9*oEoq}v|hc15|nI$etrdX;#5EZpOH!=%0veSt6S1}nY&A3#doiOdj24<#Y$+{qKHGK8JH&3W%Y={_-S62CN zt|oha59gXttRw_~zaRSkSFP=;fnF*@_8`Q3#O&~*uh)35c|4f{&KL61$i zdxxYQ?vnE(=vDb0zgx9ePCbSe_1yX1VH#hnOCZV5J3lXIjMmKrX`*AqR9Kh(LBghijOtDR^^3jqx!>gf~(aY%` zz7h%NIQRN$`NJ0W{e67jgZ0iD)N7Byw9!Zs$nxc%K$k;jQz}Ig%x_T6LLe1iu(tL& z@HQTXe@gKy%x2kmD6k~`7D*qy`7n$k1sf;J!MhiIprWF0?g~|}aUJ||CH9+Tdg*q1 z2r3=gQP{i~Pg2fTgmZ^;nJ1Cfc*hT$P-uZ!&l>8 zxqQ5=e^@eJCSAU@!pROTuljV*WrB@Eq{!>B>(mgl+d>m_TPL*Yt6g1beBJP6Uglhl zIA^74dYc#R^({%Fq91L$ZM-@tkF@7i^k|!=16JHxRim}j%uwH8uuq7Q+~C<6OrUI~ zVgXnnqE2$*wSYp*YnnNQV-dB+Z=Ywcgq4!zZ~uu}v|T2C6%&{BKSB5t9ea{T%Ejbn zp=N<8zr+BHyJQIZI5lEh88GuV?=)HM$|`@!W>2~2uPAmRQj3f; zS#o&2A(OA_1rf?&OP$ip=biakL%|BU2F=XsOTW` zJG8XCUe0P1G<{RxoqHJ9!&z2We3|2Kr=e6yPhVJ*AYq8p?xTs?YMTO>PHSz?!a`br@$#~0-uS`1 z9q*uqmewJ`NAo3Lp+>%ygdAef6nuPlHBYFrtXLkdK zn|D)c<_Z?iA{>;ZNIs2b65q2D(pk;IniS0S(64E<;l?4vsNLE~56%y1@4axwwaaDW1+;_9Acmts{cStJY}VyXL>zUXd@}HlP6}; zZs@Re0C7I00W0Ej9<$OA<2C(2WEICf(T%G{pMWt8?X`9QPSKtHKzGT(cp zxms5c9%7CdEy?=g_aR=ePqF6$y_7-m>5q7ERN@rK>>5Xk(UT#c^3*=jF#Mfc(T#6J z7O$F_6iJf|!Y6p@Kcl#kSRZn@ksI=(4JK84;E{edv^2-u6gCUS{~9o;6L)h BnK=Le literal 0 HcmV?d00001 diff --git a/webui/frontend/src/app/globals.css b/webui/frontend/src/app/globals.css new file mode 100644 index 0000000..ae67e62 --- /dev/null +++ b/webui/frontend/src/app/globals.css @@ -0,0 +1,2294 @@ +:root { + color-scheme: light; + --bg: #eef1f4; + --surface: #ffffff; + --surface-2: #f5f7f9; + --surface-3: #eaeef1; + --line: #dde3e8; + --line-strong: #b4c0c8; + --ink: #101820; + --ink-2: #35434d; + --muted: #64757f; + --accent: #00706b; + --accent-soft: #d8ece9; + --accent-2: #c9502c; + --ok: #12704c; + --error: #b02440; + --busy: #8a6200; + --green: #2f7d4f; + --red: #b02440; + + --radius-sm: 6px; + --radius: 10px; + --radius-lg: 14px; + --shadow-sm: 0 1px 2px rgba(16, 24, 32, 0.06); + --shadow: 0 1px 3px rgba(16, 24, 32, 0.08), 0 8px 24px -12px rgba(16, 24, 32, 0.18); + --focus: 0 0 0 3px color-mix(in srgb, var(--accent) 28%, transparent); + --font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace; +} + +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + --bg: #0e1417; + --surface: #161d22; + --surface-2: #1b242a; + --surface-3: #212c33; + --line: #2b3841; + --line-strong: #3f515c; + --ink: #e7edf1; + --ink-2: #c2ced6; + --muted: #90a2ad; + --accent: #4fbcb2; + --accent-soft: #16332f; + --accent-2: #e8825f; + --ok: #4fbe8c; + --error: #f0788e; + --busy: #e0b552; + --green: #4fbe8c; + --red: #f0788e; + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4); + --shadow: 0 1px 3px rgba(0, 0, 0, 0.45), 0 8px 24px -12px rgba(0, 0, 0, 0.7); + } +} + +/* The theme toggle stamps data-theme on the root; it must win either way. */ +:root[data-theme="light"] { + color-scheme: light; + --bg: #eef1f4; + --surface: #ffffff; + --surface-2: #f5f7f9; + --surface-3: #eaeef1; + --line: #dde3e8; + --line-strong: #b4c0c8; + --ink: #101820; + --ink-2: #35434d; + --muted: #64757f; + --accent: #00706b; + --accent-soft: #d8ece9; + --accent-2: #c9502c; + --ok: #12704c; + --error: #b02440; + --busy: #8a6200; + --green: #2f7d4f; + --red: #b02440; +} + +:root[data-theme="dark"] { + color-scheme: dark; + --bg: #0e1417; + --surface: #161d22; + --surface-2: #1b242a; + --surface-3: #212c33; + --line: #2b3841; + --line-strong: #3f515c; + --ink: #e7edf1; + --ink-2: #c2ced6; + --muted: #90a2ad; + --accent: #4fbcb2; + --accent-soft: #16332f; + --accent-2: #e8825f; + --ok: #4fbe8c; + --error: #f0788e; + --busy: #e0b552; + --green: #4fbe8c; + --red: #f0788e; +} + +* { + box-sizing: border-box; +} + +html, +body { + margin: 0; + min-height: 100%; + background: var(--bg); + color: var(--ink); + font-family: "Aptos", "Segoe UI", "Helvetica Neue", sans-serif; + font-size: 14px; + letter-spacing: 0; +} + +button, +input, +select, +textarea { + font: inherit; +} + +button { + min-height: 26px; + border: 1px solid var(--line-strong); + border-radius: 6px; + background: var(--surface); + color: var(--ink); + padding: 0 8px; + cursor: pointer; +} + +button:hover:not(:disabled) { + border-color: var(--accent); +} + +button:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +button.primary { + background: var(--accent); + border-color: var(--accent); + color: white; +} + +input, +select, +textarea { + width: 100%; + border: 1px solid var(--line); + border-radius: 6px; + background: white; + color: var(--ink); + min-height: 26px; + padding: 3px 6px; +} + +textarea { + resize: vertical; +} + +.app-shell { + height: 100vh; + min-height: 0; + display: flex; + flex-direction: column; + overflow: hidden; + padding: 12px; +} + +.topbar { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: flex-start; + margin-bottom: 8px; +} + +.topbar-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.cite-btn { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 30px; + border: 1px solid var(--line-strong); + border-radius: 6px; + background: var(--surface); + color: var(--ink); + padding: 0 10px; + cursor: pointer; + text-decoration: none; + font-size: 13px; + font-weight: 500; + transition: all 0.2s ease; +} + +.cite-btn:hover { + border-color: var(--accent); + color: var(--accent); + background: #f0f7f7; +} + +.brand-container { + display: flex; + align-items: center; + gap: 12px; +} + +.brand-logo { + height: 38px; + width: auto; + object-fit: contain; +} + +.topbar h1 { + margin: 0; + font-size: 22px; + line-height: 1; +} + +.topbar p { + margin: 4px 0 0; + color: var(--muted); + font-size: 12px; +} + +.status { + min-width: 260px; + max-width: 520px; + border: 1px solid var(--line); + border-radius: 6px; + background: var(--surface); + padding: 5px 8px; + color: var(--muted); + font-size: 13px; +} + +.status.ok { + color: var(--ok); + border-color: #9ccbb8; +} + +.status.error { + color: var(--error); + border-color: #d69aaa; +} + +.status.busy { + color: var(--busy); + border-color: #d9c37d; +} + +.workflow { + display: flex; + gap: 8px; + flex-wrap: wrap; + align-items: center; + padding: 8px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + margin-bottom: 12px; +} + +.main-grid { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + align-items: start; + flex: 1; + min-height: 0; + overflow: hidden; +} + +.control-panel, +.viewer-card, +.result-card, +.metrics { + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); +} + +.control-panel { + overflow: auto; + min-height: 0; +} + +.panel-tabs { + display: grid; + grid-template-columns: 1fr 1fr; + border-bottom: 1px solid var(--line); +} + +.panel-tabs button { + border: 0; + border-radius: 0; + background: var(--surface-2); +} + +.panel-tabs button.active { + background: white; + color: var(--accent); + box-shadow: inset 0 -2px 0 var(--accent); +} + +.panel-section { + padding: 7px 9px; + border-bottom: 1px solid var(--line); +} + +.panel-section:last-child { + border-bottom: 0; +} + +.setup-columns { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 14px; + padding: 6px 12px 12px; +} + +.setup-column { + display: flex; + flex-direction: column; + gap: 4px; +} + +.setup-column:not(:last-child) { + border-right: 1px solid var(--line); + padding-right: 14px; +} + +.setup-column .panel-section { + padding: 8px 0; +} + +.panel-section h2 { + margin: 0 0 4px; + font-size: 12px; + text-transform: uppercase; + color: var(--muted); +} + +.panel-section.compact { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4px 6px; +} + +.panel-section.compact h2 { + grid-column: 1 / -1; + margin-bottom: 0; +} + +.field, +.wide-field { + display: grid; + gap: 2px; + margin-bottom: 4px; +} + +.field span, +.wide-field span, +.check-field { + color: var(--muted); + font-size: 11px; +} + +.structure-stats { + display: grid; + gap: 2px; + border: 1px solid var(--line); + border-radius: 6px; + background: var(--surface-2); + padding: 4px 6px; +} + +.structure-stats span { + color: var(--muted); + font-size: 11px; +} + +.pdb-id-form { + display: flex; + gap: 4px; + align-items: center; +} + +.pdb-id-form input { + width: 76px; + text-transform: uppercase; +} + +.check-field { + display: flex; + gap: 6px; + align-items: center; + margin-top: 4px; +} + +.check-field input { + width: auto; +} + +.json-panel { + padding: 8px; +} + +.json-panel textarea { + min-height: 320px; + font-family: "SFMono-Regular", Consolas, monospace; + font-size: 12px; + margin-bottom: 6px; +} + +.workbench { + display: grid; + gap: 12px; + min-height: 0; + overflow: auto; +} + +.card-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 8px; + padding: 6px 10px; + border-bottom: 1px solid var(--line); +} + +.card-header h2 { + margin: 0; + font-size: 15px; +} + +.card-header p { + margin: 2px 0 0; + color: var(--muted); + font-size: 11px; +} + +.card-header > span { + color: var(--muted); + white-space: nowrap; + font-size: 12px; +} + +.protein-viewer-panel { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + min-width: 0; + min-height: 0; + flex: 1; +} + +.protein-viewer { + position: relative; + min-height: 260px; + background: #f1f4f5; + overflow: hidden; +} + +.ngl-stage { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.fallback-stage { + position: absolute; + inset: 0; + z-index: 1; + display: block; + width: 100%; + height: 100%; + background: #f8fafb; +} + +.viewer-placeholder { + position: absolute; + inset: 0; + z-index: 2; + display: grid; + place-items: center; + color: var(--muted); +} + +.viewer-badge { + position: absolute; + left: 12px; + bottom: 12px; + z-index: 2; + background: rgba(255, 255, 255, 0.88); + border: 1px solid var(--line); + border-radius: 6px; + padding: 6px 8px; + color: var(--muted); + font-size: 12px; +} + +.sequence-viewer { + display: flex; + gap: 12px; + min-width: 0; + overflow-x: auto; + overflow-y: hidden; + padding: 6px 10px; + border-bottom: 1px solid var(--line); + background: var(--surface); +} + +.sequence-chain { + display: grid; + grid-template-columns: auto minmax(0, max-content); + align-items: center; + gap: 5px; + min-width: max-content; +} + +.sequence-chain-label { + color: var(--muted); + font-size: 10px; + font-weight: 600; + white-space: nowrap; +} + +.sequence-residue-row { + display: flex; + gap: 0; + overflow: visible; + padding: 0; + font-family: "SFMono-Regular", Consolas, "Courier New", monospace; +} + +.sequence-residue { + position: relative; + display: grid; + width: 15px; + min-width: 15px; + height: 23px; + align-items: center; + justify-items: center; + padding: 5px 0 0; + border: 0; + border-radius: 0; + background: transparent; + color: var(--ink); + cursor: pointer; + font-family: inherit; +} + +.sequence-residue:hover { + color: var(--accent); + background: transparent; + text-decoration: underline; + text-underline-offset: 3px; +} + +.sequence-residue.selected { + color: #a71919; + background: transparent; + box-shadow: inset 0 -2px 0 #d62728; +} + +.sequence-residue-number { + position: absolute; + top: -1px; + left: 50%; + transform: translateX(-50%); + font-size: 10px; + line-height: 1; + color: var(--muted); + font-family: inherit; +} + +.sequence-residue-letter { + font-size: 13px; + line-height: 1; + font-weight: 700; + font-family: inherit; +} + +.result-row { + display: grid; + grid-template-columns: minmax(0, 1fr) 220px; + gap: 12px; +} + +.simulation-summary-row { + grid-template-columns: minmax(0, 1fr) minmax(220px, 300px); + align-items: stretch; +} + +.simulation-summary-row .result-card, +.simulation-summary-row .metrics { + overflow: hidden; +} + +.simulation-summary-row .plot-card { + min-height: 320px; +} + +.simulation-summary-row .decay-plot { + height: 320px; +} + +.simulation-page { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 12px; + min-height: 0; + min-width: 0; +} + +.simulation-primary { + display: flex; + flex-direction: column; + gap: 12px; + min-height: 0; + min-width: 0; + overflow: visible; +} + +.simulation-chart-grid { + display: grid; + grid-template-columns: repeat(2, minmax(320px, 1fr)); + gap: 10px; + min-width: 0; +} + +.simulation-chart-grid .result-card { + display: flex; + flex-direction: column; + overflow: hidden; +} + +.aa-residence-card { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + min-height: 0; + min-width: 0; + overflow: hidden; +} + +.aa-residence-table-scroll { + min-height: 0; + max-height: 520px; + overflow: auto; +} + +.aa-residence-table-scroll .scan-results-table { + min-width: 980px; +} + +.plot-card { + min-height: 260px; +} + +.empty-state { + min-height: 260px; + display: grid; + place-content: center; + gap: 6px; + text-align: center; + color: var(--muted); +} + +.decay-plot { + width: 100%; + height: 260px; + display: block; +} + +.decay-plot line { + stroke: #d7dee2; + stroke-dasharray: 2 3; +} + +.donor-line, +.fret-line { + fill: none; + stroke-width: 2; +} + +.donor-line { + stroke: var(--accent-2); +} + +.fret-line { + stroke: #1c68b3; +} + +.decay-plot text { + fill: var(--muted); + font-size: 12px; +} + +.axis-label { + transform: rotate(-90deg); + transform-origin: 14px 160px; +} + +.metrics { + padding: 8px 10px; + display: grid; + gap: 6px; + align-content: start; +} + +.metrics-title { + margin: -8px -10px 2px; + padding: 8px 10px; + border-bottom: 1px solid var(--line); + color: var(--ink); + font-size: 14px; + font-weight: 600; +} + +.metric { + display: grid; + gap: 1px; + border-bottom: 1px solid var(--line); + padding-bottom: 6px; +} + +.metric:last-child { + border-bottom: 0; + padding-bottom: 0; +} + +.metric span { + color: var(--muted); + font-size: 11px; +} + +.metric strong { + font-size: 16px; +} + +.advanced-settings-page { + display: grid; + gap: 12px; + min-width: 0; +} + +.advanced-settings-card { + overflow: hidden; +} + +.advanced-settings-body { + display: grid; + gap: 18px; + max-width: 560px; + padding: 16px; +} + +.structure-info-table { + width: min(100%, 720px); + border-collapse: collapse; + font-size: 13px; +} + +.structure-info-table tr { + border-bottom: 1px solid var(--line); +} + +.structure-info-table tr:last-child { + border-bottom: 0; +} + +.structure-info-table td { + padding: 8px 0; +} + +.structure-info-table td:first-child { + font-weight: 700; +} + +.structure-info-table td:last-child { + text-align: right; +} + +.monospace-cell { + font-family: "SFMono-Regular", Consolas, monospace; + overflow-wrap: anywhere; +} + +.advanced-empty-copy { + margin: 0; + color: var(--muted); + font-size: 13px; +} + +.advanced-empty-copy a { + color: var(--accent); +} + +@media (max-width: 1024px) { + .setup-columns { + grid-template-columns: repeat(2, 1fr); + gap: 16px; + } + .setup-column { + border-right: none !important; + padding-right: 0 !important; + } +} + +@media (max-width: 980px) { + .main-grid, + .result-row, + .simulation-page, + .simulation-chart-grid { + grid-template-columns: 1fr; + } + + .simulation-page { + height: auto; + } + + .simulation-primary, + .aa-residence-card { + overflow: visible; + } + + .aa-residence-table-scroll { + max-height: 520px; + } + + .app-shell { + height: auto; + min-height: 100vh; + overflow: auto; + } + + .main-grid { + flex: none; + min-height: auto; + overflow: visible; + } + + .control-panel { + overflow: visible; + } + + .viewer-card { + min-height: 0; + } + + .protein-viewer-panel { + min-height: 420px; + } + + .protein-viewer { + height: 360px; + min-height: 360px; + } + + .topbar { + display: grid; + } + + .status { + min-width: 0; + max-width: none; + } +} + +@media (max-width: 768px) { + .setup-columns { + grid-template-columns: 1fr; + } +} + +.result-tabs { + display: flex; + gap: 8px; + margin-bottom: 12px; + border-bottom: 1px solid var(--line); + padding-bottom: 8px; +} + +.result-tabs button { + border: 1px solid transparent; + background: transparent; + padding: 6px 12px; + font-weight: 500; + color: var(--muted); + border-radius: 4px; +} + +.result-tabs button:hover:not(:disabled) { + border-color: var(--line); +} + +.result-tabs button.active { + background: var(--surface-2); + color: var(--accent); + border-color: var(--line); + box-shadow: inset 0 -2px 0 var(--accent); +} + +.result-trajectory-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; +} + +.trajectory-line { + fill: none; + stroke: #8b5cf6; /* Violet */ + stroke-width: 1.5; +} + +.autocorr-line { + fill: none; + stroke: #10b981; /* Emerald/Green */ + stroke-width: 2; +} + +@media (max-width: 980px) { + .result-trajectory-row { + grid-template-columns: 1fr; + } +} + +/* HelpBadge and Tooltip styles */ +.help-badge-container { + display: inline-flex; + position: relative; + align-items: center; +} + +.help-badge { + display: inline-flex; + width: 14px; + height: 14px; + align-items: center; + justify-content: center; + border-radius: 50%; + border: 1px solid var(--line-strong); + background: var(--surface); + color: var(--muted); + font-size: 10px; + font-weight: bold; + cursor: help; + margin-left: 6px; + transition: all 0.2s ease; + user-select: none; +} + +.help-badge:hover, +.help-badge:focus { + border-color: var(--accent); + background: #f0f7f7; + color: var(--accent); + outline: none; +} + +.help-tooltip { + position: fixed; + z-index: 10000; + width: 280px; + padding: 10px 12px; + background: var(--surface); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); + font-size: 12px; + line-height: 1.4; + color: var(--ink); + pointer-events: none; + text-align: left; +} + +.help-tooltip-title { + font-size: 10px; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--accent); + margin-bottom: 4px; +} + +.help-tooltip-unit { + font-size: 10px; + font-weight: bold; + text-transform: uppercase; + color: var(--muted); + margin-top: 6px; +} + +.footer-citation { + margin-top: 16px; + padding: 12px 10px 8px; + border-top: 1px solid var(--line); + text-align: center; + color: var(--muted); + font-size: 12px; + line-height: 1.5; +} + +.footer-citation p { + margin: 0; +} + +.footer-citation a { + color: var(--accent); + text-decoration: none; + font-weight: 500; + transition: color 0.2s ease; +} + +.footer-citation a:hover { + color: var(--accent-2); + text-decoration: underline; +} + +/* Amino-acid interaction table */ +.interaction-table-container { + margin-top: 6px; + border: 1px solid var(--line); + border-radius: 6px; + overflow: hidden; + background: white; +} + +.interaction-table { + width: 100%; + border-collapse: collapse; + font-size: 12px; +} + +.interaction-table th { + background: var(--surface-2); + color: var(--muted); + font-weight: 500; + text-align: left; + padding: 4px 6px; + border-bottom: 1px solid var(--line); +} + +.interaction-table td { + padding: 3px 5px; + border-bottom: 1px solid var(--line); +} + +.interaction-table tr:last-child td { + border-bottom: none; +} + +.interaction-table input { + border: none; + background: transparent; + padding: 2px 4px; + font-size: 11px; + border-radius: 4px; + width: 100%; +} + +.interaction-table input:focus { + background: var(--surface-2); + outline: 1px solid var(--accent); +} + +/* Sidebar Toggle Switch Header */ +.sidebar-header-toggle { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 12px; + border-bottom: 1px solid var(--line); + background: var(--surface-2); +} + +.sidebar-header-toggle h2 { + margin: 0; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--muted); +} + +/* Toggle Switch Styling */ +.toggle-switch { + display: inline-flex; + align-items: center; + gap: 8px; + cursor: pointer; + user-select: none; +} + +.toggle-label { + font-size: 12px; + font-weight: 500; + color: var(--muted); +} + +.switch { + position: relative; + display: inline-block; + width: 36px; + height: 20px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--line-strong); + transition: 0.2s; + border-radius: 20px; +} + +.slider:before { + position: absolute; + content: ""; + height: 14px; + width: 14px; + left: 3px; + bottom: 3px; + background-color: white; + transition: 0.2s; + border-radius: 50%; +} + +input:checked + .slider { + background-color: var(--accent); +} + +input:checked + .slider:before { + transform: translateX(16px); +} + +/* JSON Mode Panel */ +.json-panel { + padding: 10px; + display: flex; + flex-direction: column; + gap: 8px; +} + +.json-panel textarea { + min-height: 360px; + font-family: "SFMono-Regular", Consolas, monospace; + font-size: 12px; + border: 1px solid var(--line); + border-radius: 6px; + padding: 8px; + resize: vertical; + width: 100%; + line-height: 1.4; +} + +.json-panel button { + align-self: flex-end; + background: var(--accent); + color: white; + border: none; + font-weight: 500; +} + +.json-panel button:hover { + background: #005652; +} + +/* Simulation Results Section (below 3D viewer) */ +.results-section { + margin-top: 10px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + overflow: hidden; +} + +.results-header { + padding: 8px 12px; + border-bottom: 1px solid var(--line); + background: var(--surface-2); +} + +.results-header h2 { + margin: 0; + font-size: 14px; + font-weight: 600; + color: var(--ink); +} + +.results-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 10px; + padding: 10px; +} + +.results-grid .result-card { + display: flex; + flex-direction: column; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + overflow: hidden; +} + +.results-layout { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + padding: 12px; +} + +.results-left, +.results-right { + display: flex; + flex-direction: column; + gap: 12px; +} + +.results-left .result-card { + flex: 1; + display: flex; + flex-direction: column; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + overflow: hidden; +} + +.results-left .decay-plot { + height: 420px; +} + +.results-right .result-card { + display: flex; + flex-direction: column; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + overflow: hidden; +} + +@media (max-width: 980px) { + .results-layout { + grid-template-columns: 1fr; + } +} + +.empty-results-state { + padding: 48px 16px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 8px; + color: var(--muted); + background: var(--surface-2); +} + +.empty-results-state strong { + font-size: 14px; + color: var(--ink); +} + +.empty-results-state span { + font-size: 12px; +} + +/* Workflow & Tab Container styling */ +.workflow-tab-container { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 8px; + padding: 6px 10px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); + margin-bottom: 8px; +} + +.app-tabs { + display: flex; + gap: 4px; + background: var(--surface-2); + padding: 3px; + border-radius: 6px; + border: 1px solid var(--line); +} + +.tab-btn { + padding: 4px 10px; + font-size: 12px; + font-weight: 600; + border: 1px solid transparent; + background: transparent; + border-radius: 4px; + color: var(--muted); + cursor: pointer; + transition: all 0.15s ease; +} + +.tab-btn:hover { + color: var(--ink); +} + +.tab-btn.active { + background: var(--surface); + color: var(--accent); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.02); + border: 1px solid var(--line); +} + +.global-actions { + display: flex; + gap: 8px; +} + +.clear-btn { + background: var(--surface); + border: 1px solid var(--line-strong); + color: var(--muted); + transition: all 0.2s ease; +} + +.clear-btn:hover:not(:disabled) { + border-color: var(--accent-2); + color: var(--accent-2); + background: #fdf5f2; +} + + +/* Vertical Stack Setup */ +.setup-vertical-stack { + display: flex; + flex-direction: column; +} + +.setup-vertical-stack .panel-section { + padding: 7px 9px; + border-bottom: 1px solid var(--line); +} + +.setup-vertical-stack .panel-section:last-child { + border-bottom: none; +} + +/* Desktop Split Layout overrides */ +@media (min-width: 1024px) { + .main-grid { + grid-template-columns: 320px 1fr !important; + gap: 12px !important; + align-items: stretch !important; + } + + .workbench > div { + height: 100%; + } + + .viewer-card { + height: 100%; + display: flex; + flex-direction: column; + min-height: 0; + } + + .protein-viewer { + height: auto !important; + flex: 1; + min-height: 0; + } +} + +@media (min-width: 1024px) and (max-width: 1499px) { + .workbench > .simulation-page { + height: auto; + } +} + +@media (min-width: 1500px) { + .workbench > .simulation-page { + grid-template-columns: minmax(0, 1fr) minmax(360px, 520px); + height: 100%; + } + + .simulation-primary { + overflow: auto; + } + + .aa-residence-table-scroll { + max-height: none; + } +} + +/* Header Dye Selector & Control Styling */ +.header-select-group { + display: flex; + align-items: center; + gap: 6px; + background: var(--surface); + border: 1px solid var(--line); + border-radius: 6px; + padding: 2px 8px; + min-height: 30px; +} + +.header-label { + font-size: 12px; + font-weight: 600; + color: var(--muted); + white-space: nowrap; +} + +.header-select { + border: none; + background: transparent; + padding: 0; + font-size: 13px; + font-weight: 500; + width: auto; + min-width: 100px; + cursor: pointer; + outline: none; + color: var(--ink); +} + +.header-select:focus { + outline: none; +} + +/* Citation Modal Styles */ +.citation-modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(2px); + display: grid; + place-items: center; + z-index: 20000; + animation: fadeIn 0.18s ease-out; +} + +.citation-modal { + background: var(--surface); + border: 1px solid var(--line); + border-radius: 8px; + width: 90%; + max-width: 500px; + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.15), 0 10px 10px -5px rgba(0, 0, 0, 0.1); + animation: scaleUp 0.18s cubic-bezier(0.16, 1, 0.3, 1); + overflow: hidden; +} + +.citation-modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 14px; + border-bottom: 1px solid var(--line); + background: var(--surface-2); +} + +.citation-modal-header h2 { + margin: 0; + font-size: 14px; + font-weight: 600; + color: var(--ink); +} + +.citation-modal-header .close-btn { + background: transparent; + border: none; + font-size: 20px; + padding: 0 4px; + min-height: auto; + color: var(--muted); + cursor: pointer; +} + +.citation-modal-header .close-btn:hover { + color: var(--ink); +} + +.citation-modal-body { + padding: 14px; +} + +.citation-modal-body p { + margin: 0 0 8px; + color: var(--ink); +} + +.citation-text { + margin: 0 0 12px; + padding: 8px 10px; + background: var(--surface-2); + border-left: 3px solid var(--accent); + font-size: 13px; + line-height: 1.45; + color: var(--ink); + font-style: normal; +} + +.citation-modal-actions { + display: flex; + gap: 8px; + justify-content: flex-end; +} + +.primary-btn-link { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 30px; + border: 1px solid var(--accent); + background: var(--accent); + color: white; + border-radius: 6px; + padding: 0 12px; + font-size: 13px; + font-weight: 500; + text-decoration: none; + cursor: pointer; + transition: opacity 0.2s; +} + +.primary-btn-link:hover { + opacity: 0.9; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes scaleUp { + from { transform: scale(0.96); opacity: 0; } + to { transform: scale(1); opacity: 1; } +} + +/* Scan tab CSS */ +.scan-residues-selection { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 10px; +} + +.scan-selection-actions { + display: flex; + gap: 8px; +} + +.scan-selection-actions button { + flex: 1; + padding: 4px 8px; + font-size: 11px; + min-height: 24px; + background: var(--surface-2); + border: 1px solid var(--line); + color: var(--ink); + cursor: pointer; + border-radius: 4px; + transition: background 0.15s; +} + +.scan-selection-actions button:hover { + background: var(--line); +} + +.scan-residues-list { + max-height: 200px; + overflow-y: auto; + border: 1px solid var(--line); + border-radius: 6px; + background: var(--surface-2); + padding: 6px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.scan-residue-item { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 6px; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + color: var(--ink); +} + +.scan-residue-item:hover { + background: var(--line); +} + +.scan-residue-item input[type="checkbox"] { + width: 14px; + height: 14px; + cursor: pointer; +} + +.scan-table-container { + overflow-x: auto; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--surface); +} + +.scan-results-table { + width: 100%; + border-collapse: collapse; + font-size: 13px; + text-align: left; +} + +.scan-results-table th, +.scan-results-table td { + padding: 5px 6px; + border-bottom: 1px solid var(--line); + font-size: 11.5px; +} + +.scan-results-table th { + background: var(--surface-2); + font-weight: 600; + color: var(--muted); + font-size: 10.5px; + text-transform: uppercase; + letter-spacing: 0.05em; + user-select: none; +} + +.scan-results-table th.sortable { + cursor: pointer; +} + +.scan-results-table th.sortable:hover { + background: var(--surface-3); + color: var(--text); +} + +.sort-icon { + margin-left: 4px; + font-size: 10px; + display: inline-block; + vertical-align: middle; +} + +.scan-results-table tr:hover { + background: var(--surface-2); +} + +.status-badge { + display: inline-flex; + align-items: center; + padding: 1px 5px; + border-radius: 10px; + font-size: 10px; + font-weight: 500; +} + +.status-badge.success { + background: rgba(16, 185, 129, 0.15); + color: #10b981; + border: 1px solid rgba(16, 185, 129, 0.2); +} + +.status-badge.failed { + background: rgba(239, 68, 68, 0.15); + color: #ef4444; + border: 1px solid rgba(239, 68, 68, 0.2); +} + +.column-filter-input, +.column-filter-select { + width: 100%; + padding: 2px 4px; + font-size: 10px; + border: 1px solid var(--line); + border-radius: 4px; + background: var(--surface-3); + color: var(--text); + box-sizing: border-box; +} + + + +.filter-row th { + padding: 4px 6px; + background: var(--surface-2); +} + +/* ========================================================================== + Modernization layer + Loaded last so it refines the base rules above without rewriting them. + ========================================================================== */ + +html, +body { + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + overflow-x: hidden; +} + +/* --- controls ------------------------------------------------------------ */ + +button { + border-radius: var(--radius-sm); + font-weight: 500; + transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease; +} + +button:hover:not(:disabled) { + background: var(--surface-2); + border-color: var(--accent); +} + +button.primary { + box-shadow: var(--shadow-sm); +} + +button.primary:hover:not(:disabled) { + background: color-mix(in srgb, var(--accent) 88%, black); + border-color: color-mix(in srgb, var(--accent) 88%, black); + color: #fff; +} + +input, +select, +textarea { + background: var(--surface); + color: var(--ink); + border-radius: var(--radius-sm); + transition: border-color 0.15s ease, box-shadow 0.15s ease; +} + +input:focus-visible, +select:focus-visible, +textarea:focus-visible, +button:focus-visible, +a:focus-visible { + outline: none; + border-color: var(--accent); + box-shadow: var(--focus); +} + +input[type="number"] { + font-variant-numeric: tabular-nums; +} + +/* --- surfaces ------------------------------------------------------------ */ + +.control-panel, +.viewer-card, +.result-card, +.metrics { + border-radius: var(--radius); + box-shadow: var(--shadow-sm); + border-color: var(--line); +} + +.topbar { + background: var(--surface); + border-bottom: 1px solid var(--line); +} + +.card-header { + align-items: baseline; + gap: 10px; +} + +.card-subtitle { + color: var(--muted); + font-size: 12px; +} + +.panel-note { + margin: 0 0 8px; + color: var(--muted); + font-size: 12px; + line-height: 1.45; +} + +.pill { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 2px 8px; + border-radius: 999px; + background: var(--surface-3); + color: var(--ink-2); + font-size: 11px; + font-weight: 500; + white-space: nowrap; +} + +.pill-accent { + background: var(--accent-soft); + color: var(--accent); +} + +.pill-warn { + background: color-mix(in srgb, var(--accent-2) 16%, transparent); + color: var(--accent-2); +} + +.muted { + color: var(--muted); +} + +.hint { + display: block; + color: var(--muted); + font-size: 11px; + line-height: 1.4; +} + +/* --- charts -------------------------------------------------------------- */ + +.chart { + width: 100%; + height: auto; + display: block; +} + +.chart-grid line { + stroke: var(--line); + stroke-width: 1; + stroke-dasharray: 2 4; +} + +.chart-axis line { + stroke: var(--line-strong); + stroke-width: 1; +} + +.chart-ticks text { + fill: var(--muted); + font-size: 11px; + font-variant-numeric: tabular-nums; +} + +.chart-axis-label { + fill: var(--ink-2); + font-size: 12px; + font-weight: 500; +} + +.donor-line, +.fret-line, +.trajectory-line, +.autocorr-line { + fill: none; + stroke-width: 1.6; + stroke-linejoin: round; + stroke-linecap: round; + vector-effect: non-scaling-stroke; +} + +.donor-line { + stroke: var(--accent); +} + +.fret-line { + stroke: var(--green); +} + +.trajectory-line { + stroke: var(--accent-2); + stroke-width: 1.2; +} + +.autocorr-line { + stroke: var(--accent); +} + +/* --- quenching breakdown ------------------------------------------------- */ + +.quench-breakdown { + display: flex; + flex-direction: column; + gap: 8px; + padding: 14px 16px 16px; +} + +.quench-bar-row { + display: grid; + grid-template-columns: 46px minmax(80px, 1fr) 52px auto; + align-items: center; + gap: 10px; +} + +.quench-bar-track { + height: 10px; + border-radius: 999px; + background: var(--surface-3); + overflow: hidden; +} + +.quench-bar-fill { + height: 100%; + border-radius: 999px; + background: linear-gradient(90deg, var(--accent), color-mix(in srgb, var(--accent) 55%, var(--accent-2))); + transition: width 0.25s ease; +} + +.quench-bar-value { + text-align: right; + font-variant-numeric: tabular-nums; + font-weight: 600; + font-size: 12px; +} + +.quench-bar-detail { + color: var(--muted); + font-size: 11px; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} + +.residue-code { + display: inline-block; + font-family: var(--font-mono); + font-size: 12px; + font-weight: 600; + letter-spacing: 0.02em; +} + +/* --- quenching editor ---------------------------------------------------- */ + +.quench-editor-card .advanced-settings-body { + padding: 0; +} + +.quench-editor { + display: flex; + flex-direction: column; + gap: 14px; + padding: 14px 16px 18px; +} + +.quench-editor-intro p { + margin: 0 0 10px; + color: var(--ink-2); + font-size: 13px; + line-height: 1.55; + max-width: 70ch; +} + +.quench-editor-stats { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.quench-editor-toolbar { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + justify-content: space-between; +} + +.quench-editor-actions { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.segmented { + display: inline-flex; + padding: 2px; + border: 1px solid var(--line); + border-radius: 999px; + background: var(--surface-2); +} + +.segmented button { + border: none; + background: transparent; + border-radius: 999px; + padding: 2px 12px; + min-height: 24px; + color: var(--muted); + font-size: 12px; +} + +.segmented button.active { + background: var(--surface); + color: var(--ink); + box-shadow: var(--shadow-sm); +} + +.quench-table-wrap { + overflow-x: auto; + border: 1px solid var(--line); + border-radius: var(--radius); +} + +.quench-table { + width: 100%; + min-width: 640px; + border-collapse: collapse; + font-size: 13px; +} + +.quench-table thead th { + position: sticky; + top: 0; + z-index: 1; + background: var(--surface-2); + border-bottom: 1px solid var(--line); + padding: 8px 10px; + text-align: left; + font-size: 11px; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--muted); + white-space: nowrap; +} + +.quench-table .unit { + font-weight: 400; + text-transform: none; + letter-spacing: 0; +} + +.quench-table tbody th, +.quench-table tbody td { + padding: 6px 10px; + border-bottom: 1px solid var(--line); + vertical-align: middle; + text-align: left; +} + +.quench-table tbody tr:last-child th, +.quench-table tbody tr:last-child td { + border-bottom: none; +} + +.quench-table tbody tr.is-quenching { + background: color-mix(in srgb, var(--accent-soft) 55%, transparent); +} + +.quench-table tbody tr.is-dirty th::after { + content: "•"; + margin-left: 6px; + color: var(--accent-2); +} + +.quench-table tbody th { + font-weight: 500; + white-space: nowrap; +} + +.residue-name { + display: block; + color: var(--muted); + font-size: 11px; +} + +.quench-table input[type="number"] { + width: 100%; + max-width: 110px; +} + +.atom-summary { + display: inline-flex; + align-items: center; + gap: 6px; + min-height: 24px; + padding: 2px 8px; + border: 1px dashed var(--line-strong); + background: transparent; + font-size: 12px; + color: var(--ink-2); + text-align: left; +} + +.atom-moiety { + font-style: italic; +} + +.atom-count { + color: var(--muted); + font-size: 11px; + white-space: nowrap; +} + +.quench-atom-row td { + background: var(--surface-2); +} + +.quench-atom-editor { + display: flex; + flex-direction: column; + gap: 4px; + font-size: 12px; + color: var(--ink-2); +} + +.quench-atom-editor input { + font-family: var(--font-mono); + text-transform: uppercase; +} + +.quench-atom-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-top: 6px; +} + +.quench-fallback { + max-width: 460px; +} + +.quench-summary-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.quench-summary-list li { + display: grid; + grid-template-columns: 44px 1fr auto; + align-items: center; + gap: 8px; + padding: 4px 8px; + border-radius: var(--radius-sm); + background: var(--surface-3); + font-size: 12px; + font-variant-numeric: tabular-nums; +} + +/* --- tables -------------------------------------------------------------- */ + +.scan-results-table th, +.scan-results-table td { + font-variant-numeric: tabular-nums; +} + +.scan-results-table thead th { + position: sticky; + top: 0; + z-index: 1; + background: var(--surface-2); + white-space: nowrap; +} + +.scan-results-table tbody tr.is-quenching { + background: color-mix(in srgb, var(--accent-soft) 45%, transparent); +} + +/* --- responsive ---------------------------------------------------------- */ + +@media (max-width: 1100px) { + .quench-editor-toolbar { + align-items: flex-start; + flex-direction: column; + } +} + +@media (max-width: 760px) { + .quench-bar-row { + grid-template-columns: 42px 1fr 48px; + } + + .quench-bar-detail { + grid-column: 1 / -1; + white-space: normal; + } + + .topbar, + .workflow-tab-container { + flex-direction: column; + align-items: stretch; + gap: 10px; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + } +} + +/* Primary buttons use a light accent in dark mode, so the label must go dark. */ +@media (prefers-color-scheme: dark) { + button.primary, + button.primary:hover:not(:disabled) { + color: #0e1417; + } +} + +:root[data-theme="dark"] button.primary, +:root[data-theme="dark"] button.primary:hover:not(:disabled) { + color: #0e1417; +} + +:root[data-theme="light"] button.primary, +:root[data-theme="light"] button.primary:hover:not(:disabled) { + color: #ffffff; +} + +/* Let charts use the full height of their card instead of leaving dead space. */ +.plot-card { + display: flex; + flex-direction: column; + min-height: 0; +} + +.plot-card .chart { + flex: 1; + min-height: 200px; + height: 100%; +} + +.simulation-chart-grid .plot-card .chart { + min-height: 220px; +} + +.quencher-cell { + display: inline-flex; + align-items: center; + gap: 6px; + white-space: nowrap; +} + +/* Viewer legend: names the colours the 3D view uses, which were previously + unexplained (magenta spheres in particular). */ +.viewer-legend { + position: absolute; + left: 12px; + bottom: 12px; + margin: 0; + padding: 6px 10px; + list-style: none; + display: flex; + flex-direction: column; + gap: 4px; + font-size: 11px; + line-height: 1.4; + color: var(--muted, #555); + background: rgba(255, 255, 255, 0.86); + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 6px; + pointer-events: none; +} + +.viewer-legend li { + display: flex; + align-items: center; + gap: 6px; +} + +.legend-swatch { + width: 10px; + height: 10px; + border-radius: 50%; + flex: 0 0 auto; +} + +.legend-quencher { background: magenta; } +.legend-site { background: #ffd400; } +.legend-surface { background: rgba(140, 140, 140, 0.55); } diff --git a/webui/frontend/src/app/icon.png b/webui/frontend/src/app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..585d65de75b9bf50e9b5cab9db9dcb8a420925b4 GIT binary patch literal 197753 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%0D&F1f+8D7BJJ<^Iir`lx_$RJ~> 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�jfmt3~GvT6L1 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 HGYtAa=ym^Z literal 0 HcmV?d00001 diff --git a/webui/frontend/src/app/labeling/page.tsx b/webui/frontend/src/app/labeling/page.tsx new file mode 100644 index 0000000..15ad567 --- /dev/null +++ b/webui/frontend/src/app/labeling/page.tsx @@ -0,0 +1,26 @@ +"use client"; + +import React from "react"; +import { useAppContext } from "../../context/AppContext"; +import ProteinViewer from "../../components/ProteinViewer"; + +export default function LabelingPage() { + const { structure, project, result, surfaceRendering, renderSparsity, onSequenceResidueSelect } = useAppContext(); + + return ( +

+ ); +} diff --git a/webui/frontend/src/app/layout.tsx b/webui/frontend/src/app/layout.tsx new file mode 100644 index 0000000..4971231 --- /dev/null +++ b/webui/frontend/src/app/layout.tsx @@ -0,0 +1,26 @@ +import "./globals.css"; +import type { ReactNode } from "react"; +import Script from "next/script"; +import { AppProvider } from "../context/AppContext"; +import { AppLayout } from "../components/AppLayout"; + +export const metadata = { + title: "Quenching Estimator", + description: "QuEst protein quenching simulation workbench", +}; + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + + {children} + +

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