From 256771c3840a8d02930697b49bbb1539c94661a7 Mon Sep 17 00:00:00 2001 From: ShengLong <452591453@qq.com> Date: Wed, 29 Apr 2026 18:41:39 +0800 Subject: [PATCH 1/3] 1 --- .claude/agents/check.md | 122 -- .claude/agents/debug.md | 106 -- .claude/agents/dispatch.md | 213 --- .claude/agents/implement.md | 95 -- .claude/agents/plan.md | 396 ------ .claude/agents/research.md | 120 -- .claude/commands/trellis/before-dev.md | 29 - .claude/commands/trellis/brainstorm.md | 487 ------- .claude/commands/trellis/break-loop.md | 125 -- .claude/commands/trellis/check-cross-layer.md | 153 -- .claude/commands/trellis/check.md | 25 - .claude/commands/trellis/create-command.md | 154 -- .claude/commands/trellis/finish-work.md | 153 -- .claude/commands/trellis/integrate-skill.md | 219 --- .claude/commands/trellis/onboard.md | 358 ----- .claude/commands/trellis/parallel.md | 192 --- .claude/commands/trellis/record-session.md | 62 - .claude/commands/trellis/start.md | 393 ------ .claude/commands/trellis/update-spec.md | 354 ----- .claude/hooks/inject-subagent-context.py | 803 ----------- .claude/hooks/ralph-loop.py | 396 ------ .claude/hooks/session-start.py | 414 ------ .claude/hooks/statusline.py | 218 --- .claude/settings.json | 75 - .gitignore | 1 + .trellis/.gitignore | 29 - .trellis/.template-hashes.json | 109 -- .trellis/.version | 1 - .trellis/config.yaml | 53 - .trellis/scripts/__init__.py | 5 - .trellis/scripts/add_session.py | 521 ------- .trellis/scripts/common/__init__.py | 84 -- .trellis/scripts/common/cli_adapter.py | 753 ---------- .trellis/scripts/common/config.py | 264 ---- .trellis/scripts/common/developer.py | 190 --- .trellis/scripts/common/git.py | 31 - .trellis/scripts/common/git_context.py | 78 - .trellis/scripts/common/io.py | 37 - .trellis/scripts/common/log.py | 45 - .trellis/scripts/common/packages_context.py | 238 ---- .trellis/scripts/common/paths.py | 444 ------ .trellis/scripts/common/phase.py | 254 ---- .trellis/scripts/common/registry.py | 335 ----- .trellis/scripts/common/session_context.py | 562 -------- .trellis/scripts/common/task_context.py | 410 ------ .trellis/scripts/common/task_queue.py | 188 --- .trellis/scripts/common/task_store.py | 536 ------- .trellis/scripts/common/task_utils.py | 274 ---- .trellis/scripts/common/tasks.py | 109 -- .trellis/scripts/common/types.py | 112 -- .trellis/scripts/common/worktree.py | 305 ---- .trellis/scripts/create_bootstrap.py | 298 ---- .trellis/scripts/get_context.py | 16 - .trellis/scripts/get_developer.py | 26 - .trellis/scripts/hooks/linear_sync.py | 243 ---- .trellis/scripts/init_developer.py | 51 - .trellis/scripts/multi_agent/__init__.py | 5 - .trellis/scripts/multi_agent/_bootstrap.py | 17 - .trellis/scripts/multi_agent/cleanup.py | 398 ------ .trellis/scripts/multi_agent/create_pr.py | 620 -------- .trellis/scripts/multi_agent/plan.py | 213 --- .trellis/scripts/multi_agent/start.py | 539 ------- .trellis/scripts/multi_agent/status.py | 76 - .../scripts/multi_agent/status_display.py | 542 ------- .../scripts/multi_agent/status_monitor.py | 225 --- .trellis/scripts/task.py | 445 ------ .trellis/spec/backend/database-guidelines.md | 51 - .trellis/spec/backend/directory-structure.md | 54 - .trellis/spec/backend/error-handling.md | 51 - .trellis/spec/backend/index.md | 38 - .trellis/spec/backend/logging-guidelines.md | 51 - .trellis/spec/backend/quality-guidelines.md | 51 - .../spec/frontend/component-guidelines.md | 59 - .trellis/spec/frontend/directory-structure.md | 54 - .trellis/spec/frontend/hook-guidelines.md | 51 - .trellis/spec/frontend/index.md | 39 - .trellis/spec/frontend/quality-guidelines.md | 51 - .trellis/spec/frontend/state-management.md | 51 - .trellis/spec/frontend/type-safety.md | 51 - .../spec/guides/code-reuse-thinking-guide.md | 105 -- .../spec/guides/cross-layer-thinking-guide.md | 94 -- .trellis/spec/guides/index.md | 79 -- .trellis/tasks/00-bootstrap-guidelines/prd.md | 113 -- .../tasks/00-bootstrap-guidelines/task.json | 35 - .trellis/workflow.md | 416 ------ .trellis/workspace/ShengLong/index.md | 40 - .trellis/workspace/ShengLong/journal-1.md | 7 - .trellis/workspace/index.md | 125 -- .trellis/worktree.yaml | 47 - admin/src/api/patient.ts | 27 + admin/src/components/chat-dialog/index.vue | 4 + .../reception/components/NoteTimeline.vue | 116 ++ admin/src/views/patient/reception/index.vue | 1250 +++++++++++++++++ admin/src/views/tcm/diagnosis/edit.vue | 19 + admin/tsconfig.tsbuildinfo | 2 +- .../doctor/AppointmentController.php | 43 + .../logic/doctor/AppointmentLogic.php | 263 ++++ .../adminapi/logic/doctor/DoctorNoteLogic.php | 121 ++ .../validate/doctor/AppointmentValidate.php | 30 + server/app/common/model/doctor/DoctorNote.php | 17 + .../1.9.20260421/add_doctor_note_table.sql | 16 + .../add_patient_reception_menu.sql | 23 + ui-project/untitled.pen | 1011 +++++++++++++ 103 files changed, 2942 insertions(+), 17057 deletions(-) delete mode 100644 .claude/agents/check.md delete mode 100644 .claude/agents/debug.md delete mode 100644 .claude/agents/dispatch.md delete mode 100644 .claude/agents/implement.md delete mode 100644 .claude/agents/plan.md delete mode 100644 .claude/agents/research.md delete mode 100644 .claude/commands/trellis/before-dev.md delete mode 100644 .claude/commands/trellis/brainstorm.md delete mode 100644 .claude/commands/trellis/break-loop.md delete mode 100644 .claude/commands/trellis/check-cross-layer.md delete mode 100644 .claude/commands/trellis/check.md delete mode 100644 .claude/commands/trellis/create-command.md delete mode 100644 .claude/commands/trellis/finish-work.md delete mode 100644 .claude/commands/trellis/integrate-skill.md delete mode 100644 .claude/commands/trellis/onboard.md delete mode 100644 .claude/commands/trellis/parallel.md delete mode 100644 .claude/commands/trellis/record-session.md delete mode 100644 .claude/commands/trellis/start.md delete mode 100644 .claude/commands/trellis/update-spec.md delete mode 100644 .claude/hooks/inject-subagent-context.py delete mode 100644 .claude/hooks/ralph-loop.py delete mode 100644 .claude/hooks/session-start.py delete mode 100644 .claude/hooks/statusline.py delete mode 100644 .claude/settings.json delete mode 100644 .trellis/.gitignore delete mode 100644 .trellis/.template-hashes.json delete mode 100644 .trellis/.version delete mode 100644 .trellis/config.yaml delete mode 100755 .trellis/scripts/__init__.py delete mode 100755 .trellis/scripts/add_session.py delete mode 100755 .trellis/scripts/common/__init__.py delete mode 100755 .trellis/scripts/common/cli_adapter.py delete mode 100755 .trellis/scripts/common/config.py delete mode 100755 .trellis/scripts/common/developer.py delete mode 100755 .trellis/scripts/common/git.py delete mode 100755 .trellis/scripts/common/git_context.py delete mode 100755 .trellis/scripts/common/io.py delete mode 100755 .trellis/scripts/common/log.py delete mode 100755 .trellis/scripts/common/packages_context.py delete mode 100755 .trellis/scripts/common/paths.py delete mode 100755 .trellis/scripts/common/phase.py delete mode 100755 .trellis/scripts/common/registry.py delete mode 100755 .trellis/scripts/common/session_context.py delete mode 100755 .trellis/scripts/common/task_context.py delete mode 100755 .trellis/scripts/common/task_queue.py delete mode 100755 .trellis/scripts/common/task_store.py delete mode 100755 .trellis/scripts/common/task_utils.py delete mode 100755 .trellis/scripts/common/tasks.py delete mode 100755 .trellis/scripts/common/types.py delete mode 100755 .trellis/scripts/common/worktree.py delete mode 100755 .trellis/scripts/create_bootstrap.py delete mode 100755 .trellis/scripts/get_context.py delete mode 100755 .trellis/scripts/get_developer.py delete mode 100755 .trellis/scripts/hooks/linear_sync.py delete mode 100755 .trellis/scripts/init_developer.py delete mode 100755 .trellis/scripts/multi_agent/__init__.py delete mode 100755 .trellis/scripts/multi_agent/_bootstrap.py delete mode 100755 .trellis/scripts/multi_agent/cleanup.py delete mode 100755 .trellis/scripts/multi_agent/create_pr.py delete mode 100755 .trellis/scripts/multi_agent/plan.py delete mode 100755 .trellis/scripts/multi_agent/start.py delete mode 100755 .trellis/scripts/multi_agent/status.py delete mode 100755 .trellis/scripts/multi_agent/status_display.py delete mode 100755 .trellis/scripts/multi_agent/status_monitor.py delete mode 100755 .trellis/scripts/task.py delete mode 100644 .trellis/spec/backend/database-guidelines.md delete mode 100644 .trellis/spec/backend/directory-structure.md delete mode 100644 .trellis/spec/backend/error-handling.md delete mode 100644 .trellis/spec/backend/index.md delete mode 100644 .trellis/spec/backend/logging-guidelines.md delete mode 100644 .trellis/spec/backend/quality-guidelines.md delete mode 100644 .trellis/spec/frontend/component-guidelines.md delete mode 100644 .trellis/spec/frontend/directory-structure.md delete mode 100644 .trellis/spec/frontend/hook-guidelines.md delete mode 100644 .trellis/spec/frontend/index.md delete mode 100644 .trellis/spec/frontend/quality-guidelines.md delete mode 100644 .trellis/spec/frontend/state-management.md delete mode 100644 .trellis/spec/frontend/type-safety.md delete mode 100644 .trellis/spec/guides/code-reuse-thinking-guide.md delete mode 100644 .trellis/spec/guides/cross-layer-thinking-guide.md delete mode 100644 .trellis/spec/guides/index.md delete mode 100644 .trellis/tasks/00-bootstrap-guidelines/prd.md delete mode 100644 .trellis/tasks/00-bootstrap-guidelines/task.json delete mode 100644 .trellis/workflow.md delete mode 100644 .trellis/workspace/ShengLong/index.md delete mode 100644 .trellis/workspace/ShengLong/journal-1.md delete mode 100644 .trellis/workspace/index.md delete mode 100644 .trellis/worktree.yaml create mode 100644 admin/src/api/patient.ts create mode 100644 admin/src/views/patient/reception/components/NoteTimeline.vue create mode 100644 admin/src/views/patient/reception/index.vue create mode 100644 server/app/adminapi/logic/doctor/DoctorNoteLogic.php create mode 100644 server/app/common/model/doctor/DoctorNote.php create mode 100644 server/sql/1.9.20260421/add_doctor_note_table.sql create mode 100644 server/sql/1.9.20260421/add_patient_reception_menu.sql create mode 100644 ui-project/untitled.pen diff --git a/.claude/agents/check.md b/.claude/agents/check.md deleted file mode 100644 index 071aec4e..00000000 --- a/.claude/agents/check.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -name: check -description: | - Code quality check expert. Reviews code changes against specs and self-fixes issues. -tools: Read, Write, Edit, Bash, Glob, Grep, mcp__exa__web_search_exa, mcp__exa__get_code_context_exa -model: opus ---- -# Check Agent - -You are the Check Agent in the Trellis workflow. - -## Context - -Before checking, read: -- `.trellis/spec/` - Development guidelines -- Pre-commit checklist for quality standards - -## Core Responsibilities - -1. **Get code changes** - Use git diff to get uncommitted code -2. **Check against specs** - Verify code follows guidelines -3. **Self-fix** - Fix issues yourself, not just report them -4. **Run verification** - typecheck and lint - -## Important - -**Fix issues yourself**, don't just report them. - -You have write and edit tools, you can modify code directly. - ---- - -## Workflow - -### Step 1: Get Changes - -```bash -git diff --name-only # List changed files -git diff # View specific changes -``` - -### Step 2: Check Against Specs - -Read relevant specs in `.trellis/spec/` to check code: - -- Does it follow directory structure conventions -- Does it follow naming conventions -- Does it follow code patterns -- Are there missing types -- Are there potential bugs - -### Step 3: Self-Fix - -After finding issues: - -1. Fix the issue directly (use edit tool) -2. Record what was fixed -3. Continue checking other issues - -### Step 4: Run Verification - -Run project's lint and typecheck commands to verify changes. - -If failed, fix issues and re-run. - ---- - -## Completion Markers (Ralph Loop) - -**CRITICAL**: You are in a loop controlled by the Ralph Loop system. -The loop will NOT stop until you output ALL required completion markers. - -Completion markers are generated from `check.jsonl` in the task directory. -Each entry's `reason` field becomes a marker: `{REASON}_FINISH` - -For example, if check.jsonl contains: -```json -{"file": "...", "reason": "TypeCheck"} -{"file": "...", "reason": "Lint"} -{"file": "...", "reason": "CodeReview"} -``` - -You MUST output these markers when each check passes: -- `TYPECHECK_FINISH` - After typecheck passes -- `LINT_FINISH` - After lint passes -- `CODEREVIEW_FINISH` - After code review passes - -If check.jsonl doesn't exist or has no reasons, output: `ALL_CHECKS_FINISH` - -**The loop will block you from stopping until all markers are present in your output.** - ---- - -## Report Format - -```markdown -## Self-Check Complete - -### Files Checked - -- src/components/Feature.tsx -- src/hooks/useFeature.ts - -### Issues Found and Fixed - -1. `:` - -2. `:` - - -### Issues Not Fixed - -(If there are issues that cannot be self-fixed, list them here with reasons) - -### Verification Results - -- TypeCheck: Passed TYPECHECK_FINISH -- Lint: Passed LINT_FINISH - -### Summary - -Checked X files, found Y issues, all fixed. -ALL_CHECKS_FINISH -``` diff --git a/.claude/agents/debug.md b/.claude/agents/debug.md deleted file mode 100644 index 0108d99f..00000000 --- a/.claude/agents/debug.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -name: debug -description: | - Issue fixing expert. Understands issues, fixes against specs, and verifies fixes. Precise fixes only. -tools: Read, Write, Edit, Bash, Glob, Grep, mcp__exa__web_search_exa, mcp__exa__get_code_context_exa -model: opus ---- -# Debug Agent - -You are the Debug Agent in the Trellis workflow. - -## Context - -Before debugging, read: -- `.trellis/spec/` - Development guidelines -- Error messages or issue descriptions provided - -## Core Responsibilities - -1. **Understand issues** - Analyze error messages or reported issues -2. **Fix against specs** - Fix issues following dev specs -3. **Verify fixes** - Run typecheck to ensure no new issues -4. **Report results** - Report fix status - ---- - -## Workflow - -### Step 1: Understand Issues - -Parse the issue, categorize by priority: - -- `[P1]` - Must fix (blocking) -- `[P2]` - Should fix (important) -- `[P3]` - Optional fix (nice to have) - -### Step 2: Research if Needed - -If you need additional info: - -```bash -# Check knowledge base -ls .trellis/big-question/ -``` - -### Step 3: Fix One by One - -For each issue: - -1. Locate the exact position -2. Fix following specs -3. Run typecheck to verify - -### Step 4: Verify - -Run project's lint and typecheck commands to verify fixes. - -If fix introduces new issues: - -1. Revert the fix -2. Use a more complete solution -3. Re-verify - ---- - -## Report Format - -```markdown -## Fix Report - -### Issues Fixed - -1. `[P1]` `:` - -2. `[P2]` `:` - - -### Issues Not Fixed - -- `:` - - -### Verification - -- TypeCheck: Pass -- Lint: Pass - -### Summary - -Fixed X/Y issues. Z issues require discussion. -``` - ---- - -## Guidelines - -### DO - -- Precise fixes for reported issues -- Follow specs -- Verify each fix - -### DON'T - -- Don't refactor surrounding code -- Don't add new features -- Don't modify unrelated files -- Don't use non-null assertion (`x!` operator) -- Don't execute git commit diff --git a/.claude/agents/dispatch.md b/.claude/agents/dispatch.md deleted file mode 100644 index 2bec15c7..00000000 --- a/.claude/agents/dispatch.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -name: dispatch -description: | - Multi-Agent Pipeline main dispatcher. Pure dispatcher. Only responsible for calling subagents and scripts in phase order. -tools: Read, Bash, mcp__exa__web_search_exa, mcp__exa__get_code_context_exa -model: opus ---- -# Dispatch Agent - -You are the Dispatch Agent in the Multi-Agent Pipeline (pure dispatcher). - -## Working Directory Convention - -Current Task is specified by `.trellis/.current-task` file, content is the relative path to task directory. - -Task directory path format: `.trellis/tasks/{MM}-{DD}-{name}/` - -This directory contains all context files for the current task: - -- `task.json` - Task configuration -- `prd.md` - Requirements document -- `info.md` - Technical design (optional) -- `implement.jsonl` - Implement context -- `check.jsonl` - Check context -- `debug.jsonl` - Debug context - -## Core Principles - -1. **You are a pure dispatcher** - Only responsible for calling subagents and scripts in order -2. **You don't read specs/requirements** - Hook will auto-inject all context to subagents -3. **You don't need resume** - Hook injects complete context on each subagent call -4. **You only need simple commands** - Tell subagent "start working" is enough - ---- - -## Startup Flow - -### Step 1: Determine Current Task Directory - -Read `.trellis/.current-task` to get current task directory path: - -```bash -TASK_DIR=$(cat .trellis/.current-task) -# e.g.: .trellis/tasks/02-03-my-feature -``` - -### Step 2: Read Task Configuration - -```bash -cat ${TASK_DIR}/task.json -``` - -Get the `next_action` array, which defines the list of phases to execute. - -### Step 3: Execute in Phase Order - -Execute each step in `phase` order. - -> **Note**: You do NOT need to manually update `current_phase`. The Hook automatically updates it when you call Task with a subagent. - ---- - -## Phase Handling - -> Hook will auto-inject all specs, requirements, and technical design to subagent context. -> Dispatch only needs to issue simple call commands. - -### action: "implement" - -``` -Task( - subagent_type: "implement", - prompt: "Implement the feature described in prd.md in the task directory", - model: "opus", - run_in_background: true -) -``` - -Hook will auto-inject: - -- All spec files from implement.jsonl -- Requirements document (prd.md) -- Technical design (info.md) - -Implement receives complete context and autonomously: read → understand → implement. - -### action: "check" - -``` -Task( - subagent_type: "check", - prompt: "Check code changes, fix issues yourself", - model: "opus", - run_in_background: true -) -``` - -Hook will auto-inject: - -- finish-work.md -- check-cross-layer.md -- check.md -- All spec files from check.jsonl - -### action: "debug" - -``` -Task( - subagent_type: "debug", - prompt: "Fix the issues described in the task context", - model: "opus", - run_in_background: true -) -``` - -Hook will auto-inject: - -- All spec files from debug.jsonl -- Error context if available - -### action: "finish" - -``` -Task( - subagent_type: "check", - prompt: "[finish] Execute final completion check before PR", - model: "opus", - run_in_background: true -) -``` - -**Important**: The `[finish]` marker in prompt triggers different context injection: -- finish-work.md checklist -- update-spec.md (spec update process and templates) -- prd.md for verifying requirements are met - -The finish agent actively updates spec docs when it detects new patterns or contracts in the changes. This is different from regular "check" which has full specs for self-fix loop. - -### action: "create-pr" - -This action creates a Pull Request from the feature branch. Run it via Bash: - -```bash -python3 ./.trellis/scripts/multi_agent/create_pr.py -``` - -This will: -1. Stage and commit all changes (excluding workspace) -2. Push to origin -3. Create a Draft PR using `gh pr create` -4. Update task.json with status="review", pr_url, and current_phase - -**Note**: This is the only action that performs git commit, as it's the final step after all implementation and checks are complete. - ---- - -## Calling Subagents - -### Basic Pattern - -``` -task_id = Task( - subagent_type: "implement", // or "check", "debug" - prompt: "Simple task description", - model: "opus", - run_in_background: true -) - -// Poll for completion -for i in 1..N: - result = TaskOutput(task_id, block=true, timeout=300000) - if result.status == "completed": - break -``` - -### Timeout Settings - -| Phase | Max Time | Poll Count | -|-------|----------|------------| -| implement | 30 min | 6 times | -| check | 15 min | 3 times | -| debug | 20 min | 4 times | - ---- - -## Error Handling - -### Timeout - -If a subagent times out, notify the user and ask for guidance: - -``` -"Subagent {phase} timed out after {time}. Options: -1. Retry the same phase -2. Skip to next phase -3. Abort the pipeline" -``` - -### Subagent Failure - -If a subagent reports failure, read the output and decide: - -- If recoverable: call debug agent to fix -- If not recoverable: notify user and ask for guidance - ---- - -## Key Constraints - -1. **Do not read spec/requirement files directly** - Let Hook inject to subagents -2. **Only commit via create-pr action** - Use `multi_agent/create_pr.py` at the end of pipeline -3. **All subagents should use opus model for complex tasks** -4. **Keep dispatch logic simple** - Complex logic belongs in subagents diff --git a/.claude/agents/implement.md b/.claude/agents/implement.md deleted file mode 100644 index 62442b0a..00000000 --- a/.claude/agents/implement.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -name: implement -description: | - Code implementation expert. Understands specs and requirements, then implements features. No git commit allowed. -tools: Read, Write, Edit, Bash, Glob, Grep, mcp__exa__web_search_exa, mcp__exa__get_code_context_exa -model: opus ---- -# Implement Agent - -You are the Implement Agent in the Trellis workflow. - -## Context - -Before implementing, read: -- `.trellis/workflow.md` - Project workflow -- `.trellis/spec/` - Development guidelines -- Task `prd.md` - Requirements document -- Task `info.md` - Technical design (if exists) - -## Core Responsibilities - -1. **Understand specs** - Read relevant spec files in `.trellis/spec/` -2. **Understand requirements** - Read prd.md and info.md -3. **Implement features** - Write code following specs and design -4. **Self-check** - Ensure code quality -5. **Report results** - Report completion status - -## Forbidden Operations - -**Do NOT execute these git commands:** - -- `git commit` -- `git push` -- `git merge` - ---- - -## Workflow - -### 1. Understand Specs - -Read relevant specs based on task type: - -- Spec layers: `.trellis/spec///` -- Shared guides: `.trellis/spec/guides/` - -### 2. Understand Requirements - -Read the task's prd.md and info.md: - -- What are the core requirements -- Key points of technical design -- Which files to modify/create - -### 3. Implement Features - -- Write code following specs and technical design -- Follow existing code patterns -- Only do what's required, no over-engineering - -### 4. Verify - -Run project's lint and typecheck commands to verify changes. - ---- - -## Report Format - -```markdown -## Implementation Complete - -### Files Modified - -- `src/components/Feature.tsx` - New component -- `src/hooks/useFeature.ts` - New hook - -### Implementation Summary - -1. Created Feature component... -2. Added useFeature hook... - -### Verification Results - -- Lint: Passed -- TypeCheck: Passed -``` - ---- - -## Code Standards - -- Follow existing code patterns -- Don't add unnecessary abstractions -- Only do what's required, no over-engineering -- Keep code readable diff --git a/.claude/agents/plan.md b/.claude/agents/plan.md deleted file mode 100644 index 5c0d0be9..00000000 --- a/.claude/agents/plan.md +++ /dev/null @@ -1,396 +0,0 @@ ---- -name: plan -description: | - Multi-Agent Pipeline planner. Analyzes requirements and produces a fully configured task directory ready for dispatch. -tools: Read, Bash, Glob, Grep, Task -model: opus ---- -# Plan Agent - -You are the Plan Agent in the Multi-Agent Pipeline. - -**Your job**: Evaluate requirements and, if valid, transform them into a fully configured task directory. - -**You have the power to reject** - If a requirement is unclear, incomplete, unreasonable, or potentially harmful, you MUST refuse to proceed and clean up. - ---- - -## Step 0: Evaluate Requirement (CRITICAL) - -Before doing ANY work, evaluate the requirement: - -``` -PLAN_REQUIREMENT = -``` - -### Reject If: - -1. **Unclear or Vague** - - "Make it better" / "Fix the bugs" / "Improve performance" - - No specific outcome defined - - Cannot determine what "done" looks like - -2. **Incomplete Information** - - Missing critical details to implement - - References unknown systems or files - - Depends on decisions not yet made - -3. **Out of Scope for This Project** - - Requirement doesn't match the project's purpose - - Requires changes to external systems - - Not technically feasible with current architecture - -4. **Potentially Harmful** - - Security vulnerabilities (intentional backdoors, data exfiltration) - - Destructive operations without clear justification - - Circumventing access controls - -5. **Too Large / Should Be Split** - - Multiple unrelated features bundled together - - Would require touching too many systems - - Cannot be completed in a reasonable scope - -### If Rejecting: - -1. **Update task.json status to "rejected"**: - ```bash - jq '.status = "rejected"' "$PLAN_TASK_DIR/task.json" > "$PLAN_TASK_DIR/task.json.tmp" \ - && mv "$PLAN_TASK_DIR/task.json.tmp" "$PLAN_TASK_DIR/task.json" - ``` - -2. **Write rejection reason to a file** (so user can see it): - ```bash - cat > "$PLAN_TASK_DIR/REJECTED.md" << 'EOF' - # Plan Rejected - - ## Reason - - - ## Details - - - ## Suggestions - - - - - - ## To Retry - - 1. Delete this directory: - rm -rf $PLAN_TASK_DIR - - 2. Run with revised requirement: - python3 ./.trellis/scripts/multi_agent/plan.py --name "" --type "" --requirement "" - EOF - ``` - -3. **Print summary to stdout** (will be captured in .plan-log): - ``` - === PLAN REJECTED === - - Reason: - Details: - - See: $PLAN_TASK_DIR/REJECTED.md - ``` - -4. **Exit immediately** - Do not proceed to Step 1. - -**The task directory is kept** with: -- `task.json` (status: "rejected") -- `REJECTED.md` (full explanation) -- `.plan-log` (execution log) - -This allows the user to review why it was rejected. - -### If Accepting: - -Continue to Step 1. The requirement is: -- Clear and specific -- Has a defined outcome -- Is technically feasible -- Is appropriately scoped - ---- - -## Input - -You receive input via environment variables (set by plan.py): - -```bash -PLAN_TASK_NAME # Task name (e.g., "user-auth") -PLAN_DEV_TYPE # Development type: backend | frontend | fullstack -PLAN_REQUIREMENT # Requirement description from user -PLAN_TASK_DIR # Pre-created task directory path -``` - -Read them at startup: - -```bash -echo "Task: $PLAN_TASK_NAME" -echo "Type: $PLAN_DEV_TYPE" -echo "Requirement: $PLAN_REQUIREMENT" -echo "Directory: $PLAN_TASK_DIR" -``` - -## Output (if accepted) - -A complete task directory containing: - -``` -${PLAN_TASK_DIR}/ -├── task.json # Updated with branch, scope, dev_type -├── prd.md # Requirements document -├── implement.jsonl # Implement phase context -├── check.jsonl # Check phase context -└── debug.jsonl # Debug phase context -``` - ---- - -## Workflow (After Acceptance) - -### Step 1: Initialize Context Files - -```bash -python3 ./.trellis/scripts/task.py init-context "$PLAN_TASK_DIR" "$PLAN_DEV_TYPE" -``` - -This creates base jsonl files with standard specs for the dev type. - -### Step 2: Analyze Codebase with Research Agent - -Call research agent to find relevant specs and code patterns: - -``` -Task( - subagent_type: "research", - prompt: "Analyze what specs and code patterns are needed for this task. - -Task: ${PLAN_REQUIREMENT} -Dev Type: ${PLAN_DEV_TYPE} - -Instructions: -1. Search .trellis/spec/ for relevant spec files -2. Search the codebase for related modules and patterns -3. Identify files that should be added to jsonl context - -Output format (use exactly this format): - -## implement.jsonl -- path: , reason: -- path: , reason: - -## check.jsonl -- path: , reason: - -## debug.jsonl -- path: , reason: - -## Suggested Scope - - -## Technical Notes -", - model: "opus" -) -``` - -### Step 3: Add Context Entries - -Parse research agent output and add entries to jsonl files: - -```bash -# For each entry in implement.jsonl section: -python3 ./.trellis/scripts/task.py add-context "$PLAN_TASK_DIR" implement "" "" - -# For each entry in check.jsonl section: -python3 ./.trellis/scripts/task.py add-context "$PLAN_TASK_DIR" check "" "" - -# For each entry in debug.jsonl section: -python3 ./.trellis/scripts/task.py add-context "$PLAN_TASK_DIR" debug "" "" -``` - -### Step 4: Write prd.md - -Create the requirements document: - -```bash -cat > "$PLAN_TASK_DIR/prd.md" << 'EOF' -# Task: ${PLAN_TASK_NAME} - -## Overview -[Brief description of what this feature does] - -## Requirements -- [Requirement 1] -- [Requirement 2] -- ... - -## Acceptance Criteria -- [ ] [Criterion 1] -- [ ] [Criterion 2] -- ... - -## Technical Notes -[Any technical considerations from research agent] - -## Out of Scope -- [What this feature does NOT include] -EOF -``` - -**Guidelines for prd.md**: -- Be specific and actionable -- Include acceptance criteria that can be verified -- Add technical notes from research agent -- Define what's out of scope to prevent scope creep - -### Step 5: Configure Task Metadata - -```bash -# Set branch name -python3 ./.trellis/scripts/task.py set-branch "$PLAN_TASK_DIR" "feature/${PLAN_TASK_NAME}" - -# Set scope (from research agent suggestion) -python3 ./.trellis/scripts/task.py set-scope "$PLAN_TASK_DIR" "" - -# Update dev_type in task.json -jq --arg type "$PLAN_DEV_TYPE" '.dev_type = $type' \ - "$PLAN_TASK_DIR/task.json" > "$PLAN_TASK_DIR/task.json.tmp" \ - && mv "$PLAN_TASK_DIR/task.json.tmp" "$PLAN_TASK_DIR/task.json" -``` - -### Step 6: Validate Configuration - -```bash -python3 ./.trellis/scripts/task.py validate "$PLAN_TASK_DIR" -``` - -If validation fails, fix the invalid paths and re-validate. - -### Step 7: Output Summary - -Print a summary for the caller: - -```bash -echo "=== Plan Complete ===" -echo "Task Directory: $PLAN_TASK_DIR" -echo "" -echo "Files created:" -ls -la "$PLAN_TASK_DIR" -echo "" -echo "Context summary:" -python3 ./.trellis/scripts/task.py list-context "$PLAN_TASK_DIR" -echo "" -echo "Ready for: python3 ./.trellis/scripts/multi_agent/start.py $PLAN_TASK_DIR" -``` - ---- - -## Key Principles - -1. **Reject early, reject clearly** - Don't waste time on bad requirements -2. **Research before configure** - Always call research agent to understand the codebase -3. **Validate all paths** - Every file in jsonl must exist -4. **Be specific in prd.md** - Vague requirements lead to wrong implementations -5. **Include acceptance criteria** - Check agent needs to verify something concrete -6. **Set appropriate scope** - This affects commit message format - ---- - -## Error Handling - -### Research Agent Returns No Results - -If research agent finds no relevant specs: -- Use only the base specs from init-context -- Add a note in prd.md that this is a new area without existing patterns - -### Path Not Found - -If add-context fails because path doesn't exist: -- Skip that entry -- Log a warning -- Continue with other entries - -### Validation Fails - -If final validation fails: -- Read the error output -- Remove invalid entries from jsonl files -- Re-validate - ---- - -## Examples - -### Example: Accepted Requirement - -``` -Input: - PLAN_TASK_NAME = "add-rate-limiting" - PLAN_DEV_TYPE = "backend" - PLAN_REQUIREMENT = "Add rate limiting to API endpoints using a sliding window algorithm. Limit to 100 requests per minute per IP. Return 429 status when exceeded." - -Result: ACCEPTED - Clear, specific, has defined behavior - -Output: - .trellis/tasks/02-03-add-rate-limiting/ - ├── task.json # branch: feature/add-rate-limiting, scope: api - ├── prd.md # Detailed requirements with acceptance criteria - ├── implement.jsonl # Backend specs + existing middleware patterns - ├── check.jsonl # Quality guidelines + API testing specs - └── debug.jsonl # Error handling specs -``` - -### Example: Rejected - Vague Requirement - -``` -Input: - PLAN_REQUIREMENT = "Make the API faster" - -Result: REJECTED - -=== PLAN REJECTED === - -Reason: Unclear or Vague - -Details: -"Make the API faster" does not specify: -- Which endpoints need optimization -- Current performance baseline -- Target performance metrics -- Acceptable trade-offs (memory, complexity) - -Suggestions: -- Identify specific slow endpoints with response times -- Define target latency (e.g., "GET /users should respond in <100ms") -- Specify if caching, query optimization, or architecture changes are acceptable -``` - -### Example: Rejected - Too Large - -``` -Input: - PLAN_REQUIREMENT = "Add user authentication, authorization, password reset, 2FA, OAuth integration, and audit logging" - -Result: REJECTED - -=== PLAN REJECTED === - -Reason: Too Large / Should Be Split - -Details: -This requirement bundles 6 distinct features that should be implemented separately: -1. User authentication (login/logout) -2. Authorization (roles/permissions) -3. Password reset flow -4. Two-factor authentication -5. OAuth integration -6. Audit logging - -Suggestions: -- Start with basic authentication first -- Create separate features for each capability -- Consider dependencies (auth before authz, etc.) -``` diff --git a/.claude/agents/research.md b/.claude/agents/research.md deleted file mode 100644 index 659d59c6..00000000 --- a/.claude/agents/research.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -name: research -description: | - Code and tech search expert. Pure research, no code modifications. Finds files, patterns, and tech solutions. -tools: Read, Glob, Grep, mcp__exa__web_search_exa, mcp__exa__get_code_context_exa, Skill, mcp__chrome-devtools__* -model: opus ---- -# Research Agent - -You are the Research Agent in the Trellis workflow. - -## Core Principle - -**You do one thing: find and explain information.** - -You are a documenter, not a reviewer. Your job is to help get the information needed. - ---- - -## Core Responsibilities - -### 1. Internal Search (Project Code) - -| Search Type | Goal | Tools | -|-------------|------|-------| -| **WHERE** | Locate files/components | Glob, Grep | -| **HOW** | Understand code logic | Read, Grep | -| **PATTERN** | Discover existing patterns | Grep, Read | - -### 2. External Search (Tech Solutions) - -Use web search for best practices and code examples. - ---- - -## Strict Boundaries - -### Only Allowed - -- Describe **what exists** -- Describe **where it is** -- Describe **how it works** -- Describe **how components interact** - -### Forbidden (unless explicitly asked) - -- Suggest improvements -- Criticize implementation -- Recommend refactoring -- Modify any files -- Execute git commands - ---- - -## Workflow - -### Step 1: Understand Search Request - -Analyze the query, determine: - -- Search type (internal/external/mixed) -- Search scope (global/specific directory) -- Expected output (file list/code patterns/tech solutions) - -### Step 2: Execute Search - -Execute multiple independent searches in parallel for efficiency. - -### Step 3: Organize Results - -Output structured results in report format. - ---- - -## Report Format - -```markdown -## Search Results - -### Query - -{original query} - -### Files Found - -| File Path | Description | -|-----------|-------------| -| `src/services/xxx.ts` | Main implementation | -| `src/types/xxx.ts` | Type definitions | - -### Code Pattern Analysis - -{Describe discovered patterns, cite specific files and line numbers} - -### Related Spec Documents - -- `.trellis/spec/xxx.md` - {description} - -### Not Found - -{If some content was not found, explain} -``` - ---- - -## Guidelines - -### DO - -- Provide specific file paths and line numbers -- Quote actual code snippets -- Distinguish "definitely found" and "possibly related" -- Explain search scope and limitations - -### DON'T - -- Don't guess uncertain info -- Don't omit important search results -- Don't add improvement suggestions in report (unless explicitly asked) -- Don't modify any files diff --git a/.claude/commands/trellis/before-dev.md b/.claude/commands/trellis/before-dev.md deleted file mode 100644 index d0807655..00000000 --- a/.claude/commands/trellis/before-dev.md +++ /dev/null @@ -1,29 +0,0 @@ -Read the relevant development guidelines before starting your task. - -Execute these steps: - -1. **Discover packages and their spec layers**: - ```bash - python3 ./.trellis/scripts/get_context.py --mode packages - ``` - -2. **Identify which specs apply** to your task based on: - - Which package you're modifying (e.g., `cli/`, `docs-site/`) - - What type of work (backend, frontend, unit-test, docs, etc.) - -3. **Read the spec index** for each relevant module: - ```bash - cat .trellis/spec///index.md - ``` - Follow the **"Pre-Development Checklist"** section in the index. - -4. **Read the specific guideline files** listed in the Pre-Development Checklist that are relevant to your task. The index is NOT the goal — it points you to the actual guideline files (e.g., `error-handling.md`, `conventions.md`, `mock-strategies.md`). Read those files to understand the coding standards and patterns. - -5. **Always read shared guides**: - ```bash - cat .trellis/spec/guides/index.md - ``` - -6. Understand the coding standards and patterns you need to follow, then proceed with your development plan. - -This step is **mandatory** before writing any code. diff --git a/.claude/commands/trellis/brainstorm.md b/.claude/commands/trellis/brainstorm.md deleted file mode 100644 index bc2b8afe..00000000 --- a/.claude/commands/trellis/brainstorm.md +++ /dev/null @@ -1,487 +0,0 @@ -# Brainstorm - Requirements Discovery (AI Coding Enhanced) - -Guide AI through collaborative requirements discovery **before implementation**, optimized for AI coding workflows: - -* **Task-first** (capture ideas immediately) -* **Action-before-asking** (reduce low-value questions) -* **Research-first** for technical choices (avoid asking users to invent options) -* **Diverge → Converge** (expand thinking, then lock MVP) - ---- - -## When to Use - -Triggered from `/trellis:start` when the user describes a development task, especially when: - -* requirements are unclear or evolving -* there are multiple valid implementation paths -* trade-offs matter (UX, reliability, maintainability, cost, performance) -* the user might not know the best options up front - ---- - -## Core Principles (Non-negotiable) - -1. **Task-first (capture early)** - Always ensure a task exists at the start so the user's ideas are recorded immediately. - -2. **Action before asking** - If you can derive the answer from repo code, docs, configs, conventions, or quick research — do that first. - -3. **One question per message** - Never overwhelm the user with a list of questions. Ask one, update PRD, repeat. - -4. **Prefer concrete options** - For preference/decision questions, present 2–3 feasible, specific approaches with trade-offs. - -5. **Research-first for technical choices** - If the decision depends on industry conventions / similar tools / established patterns, do research first, then propose options. - -6. **Diverge → Converge** - After initial understanding, proactively consider future evolution, related scenarios, and failure/edge cases — then converge to an MVP with explicit out-of-scope. - -7. **No meta questions** - Do not ask "should I search?" or "can you paste the code so I can continue?" - If you need information: search/inspect. If blocked: ask the minimal blocking question. - ---- - -## Step 0: Ensure Task Exists (ALWAYS) - -Before any Q&A, ensure a task exists. If none exists, create one immediately. - -* Use a **temporary working title** derived from the user's message. -* It's OK if the title is imperfect — refine later in PRD. - -```bash -TASK_DIR=$(python3 ./.trellis/scripts/task.py create "brainstorm: " --slug ) -``` - -Create/seed `prd.md` immediately with what you know: - -```markdown -# brainstorm: - -## Goal - - - -## What I already know - -* -* - -## Assumptions (temporary) - -* - -## Open Questions - -* - -## Requirements (evolving) - -* - -## Acceptance Criteria (evolving) - -* [ ] - -## Definition of Done (team quality bar) - -* Tests added/updated (unit/integration where appropriate) -* Lint / typecheck / CI green -* Docs/notes updated if behavior changes -* Rollout/rollback considered if risky - -## Out of Scope (explicit) - -* - -## Technical Notes - -* -* -``` - ---- - -## Step 1: Auto-Context (DO THIS BEFORE ASKING QUESTIONS) - -Before asking questions like "what does the code look like?", gather context yourself: - -### Repo inspection checklist - -* Identify likely modules/files impacted -* Locate existing patterns (similar features, conventions, error handling style) -* Check configs, scripts, existing command definitions -* Note any constraints (runtime, dependency policy, build tooling) - -### Documentation checklist - -* Look for existing PRDs/specs/templates -* Look for command usage examples, README, ADRs if any - -Write findings into PRD: - -* Add to `What I already know` -* Add constraints/links to `Technical Notes` - ---- - -## Step 2: Classify Complexity (still useful, not gating task creation) - -| Complexity | Criteria | Action | -| ------------ | ------------------------------------------------------ | ------------------------------------------- | -| **Trivial** | Single-line fix, typo, obvious change | Skip brainstorm, implement directly | -| **Simple** | Clear goal, 1–2 files, scope well-defined | Ask 1 confirm question, then implement | -| **Moderate** | Multiple files, some ambiguity | Light brainstorm (2–3 high-value questions) | -| **Complex** | Vague goal, architectural choices, multiple approaches | Full brainstorm | - -> Note: Task already exists from Step 0. Classification only affects depth of brainstorming. - ---- - -## Step 3: Question Gate (Ask ONLY high-value questions) - -Before asking ANY question, run the following gate: - -### Gate A — Can I derive this without the user? - -If answer is available via: - -* repo inspection (code/config) -* docs/specs/conventions -* quick market/OSS research - -→ **Do not ask.** Fetch it, summarize, update PRD. - -### Gate B — Is this a meta/lazy question? - -Examples: - -* "Should I search?" -* "Can you paste the code so I can proceed?" -* "What does the code look like?" (when repo is available) - -→ **Do not ask.** Take action. - -### Gate C — What type of question is it? - -* **Blocking**: cannot proceed without user input -* **Preference**: multiple valid choices, depends on product/UX/risk preference -* **Derivable**: should be answered by inspection/research - -→ Only ask **Blocking** or **Preference**. - ---- - -## Step 4: Research-first Mode (Mandatory for technical choices) - -### Trigger conditions (any → research-first) - -* The task involves selecting an approach, library, protocol, framework, template system, plugin mechanism, or CLI UX convention -* The user asks for "best practice", "how others do it", "recommendation" -* The user can't reasonably enumerate options - -### Research steps - -1. Identify 2–4 comparable tools/patterns -2. Summarize common conventions and why they exist -3. Map conventions onto our repo constraints -4. Produce **2–3 feasible approaches** for our project - -### Research output format (PRD) - -Add a section in PRD (either within Technical Notes or as its own): - -```markdown -## Research Notes - -### What similar tools do - -* ... -* ... - -### Constraints from our repo/project - -* ... - -### Feasible approaches here - -**Approach A: ** (Recommended) - -* How it works: -* Pros: -* Cons: - -**Approach B: ** - -* How it works: -* Pros: -* Cons: - -**Approach C: ** (optional) - -* ... -``` - -Then ask **one** preference question: - -* "Which approach do you prefer: A / B / C (or other)?" - ---- - -## Step 5: Expansion Sweep (DIVERGE) — Required after initial understanding - -After you can summarize the goal, proactively broaden thinking before converging. - -### Expansion categories (keep to 1–2 bullets each) - -1. **Future evolution** - - * What might this feature become in 1–3 months? - * What extension points are worth preserving now? - -2. **Related scenarios** - - * What adjacent commands/flows should remain consistent with this? - * Are there parity expectations (create vs update, import vs export, etc.)? - -3. **Failure & edge cases** - - * Conflicts, offline/network failure, retries, idempotency, compatibility, rollback - * Input validation, security boundaries, permission checks - -### Expansion message template (to user) - -```markdown -I understand you want to implement: . - -Before diving into design, let me quickly diverge to consider three categories (to avoid rework later): - -1. Future evolution: <1–2 bullets> -2. Related scenarios: <1–2 bullets> -3. Failure/edge cases: <1–2 bullets> - -For this MVP, which would you like to include (or none)? - -1. Current requirement only (minimal viable) -2. Add (reserve for future extension) -3. Add (improve robustness/consistency) -4. Other: describe your preference -``` - -Then update PRD: - -* What's in MVP → `Requirements` -* What's excluded → `Out of Scope` - ---- - -## Step 6: Q&A Loop (CONVERGE) - -### Rules - -* One question per message -* Prefer multiple-choice when possible -* After each user answer: - - * Update PRD immediately - * Move answered items from `Open Questions` → `Requirements` - * Update `Acceptance Criteria` with testable checkboxes - * Clarify `Out of Scope` - -### Question priority (recommended) - -1. **MVP scope boundary** (what is included/excluded) -2. **Preference decisions** (after presenting concrete options) -3. **Failure/edge behavior** (only for MVP-critical paths) -4. **Success metrics & Acceptance Criteria** (what proves it works) - -### Preferred question format (multiple choice) - -```markdown -For , which approach do you prefer? - -1. **Option A** — -2. **Option B** — -3. **Option C** — -4. **Other** — describe your preference -``` - ---- - -## Step 7: Propose Approaches + Record Decisions (Complex tasks) - -After requirements are clear enough, propose 2–3 approaches (if not already done via research-first): - -```markdown -Based on current information, here are 2–3 feasible approaches: - -**Approach A: ** (Recommended) - -* How: -* Pros: -* Cons: - -**Approach B: ** - -* How: -* Pros: -* Cons: - -Which direction do you prefer? -``` - -Record the outcome in PRD as an ADR-lite section: - -```markdown -## Decision (ADR-lite) - -**Context**: Why this decision was needed -**Decision**: Which approach was chosen -**Consequences**: Trade-offs, risks, potential future improvements -``` - ---- - -## Step 8: Final Confirmation + Implementation Plan - -When open questions are resolved, confirm complete requirements with a structured summary: - -### Final confirmation format - -```markdown -Here's my understanding of the complete requirements: - -**Goal**: - -**Requirements**: - -* ... -* ... - -**Acceptance Criteria**: - -* [ ] ... -* [ ] ... - -**Definition of Done**: - -* ... - -**Out of Scope**: - -* ... - -**Technical Approach**: - - -**Implementation Plan (small PRs)**: - -* PR1: -* PR2: -* PR3: - -Does this look correct? If yes, I'll proceed with implementation. -``` - -### Subtask Decomposition (Complex Tasks) - -For complex tasks with multiple independent work items, create subtasks: - -```bash -# Create child tasks -CHILD1=$(python3 ./.trellis/scripts/task.py create "Child task 1" --slug child1 --parent "$TASK_DIR") -CHILD2=$(python3 ./.trellis/scripts/task.py create "Child task 2" --slug child2 --parent "$TASK_DIR") - -# Or link existing tasks -python3 ./.trellis/scripts/task.py add-subtask "$TASK_DIR" "$CHILD_DIR" -``` - ---- - -## PRD Target Structure (final) - -`prd.md` should converge to: - -```markdown -# - -## Goal - - - -## Requirements - -* ... - -## Acceptance Criteria - -* [ ] ... - -## Definition of Done - -* ... - -## Technical Approach - - - -## Decision (ADR-lite) - -Context / Decision / Consequences - -## Out of Scope - -* ... - -## Technical Notes - - -``` - ---- - -## Anti-Patterns (Hard Avoid) - -* Asking user for code/context that can be derived from repo -* Asking user to choose an approach before presenting concrete options -* Meta questions about whether to research -* Staying narrowly on the initial request without considering evolution/edges -* Letting brainstorming drift without updating PRD - ---- - -## Integration with Start Workflow - -After brainstorm completes (Step 8 confirmation approved), the flow continues to the Task Workflow's **Phase 2: Prepare for Implementation**: - -```text -Brainstorm - Step 0: Create task directory + seed PRD - Step 1–7: Discover requirements, research, converge - Step 8: Final confirmation → user approves - ↓ -Task Workflow Phase 2 (Prepare for Implementation) - Code-Spec Depth Check (if applicable) - → Research codebase (based on confirmed PRD) - → Configure code-spec context (jsonl files) - → Activate task - ↓ -Task Workflow Phase 3 (Execute) - Implement → Check → Complete -``` - -The task directory and PRD already exist from brainstorm, so Phase 1 of the Task Workflow is skipped entirely. - ---- - -## Related Commands - -| Command | When to Use | -|---------|-------------| -| `/trellis:start` | Entry point that triggers brainstorm | -| `/trellis:finish-work` | After implementation is complete | -| `/trellis:update-spec` | If new patterns emerge during work | diff --git a/.claude/commands/trellis/break-loop.md b/.claude/commands/trellis/break-loop.md deleted file mode 100644 index 99057513..00000000 --- a/.claude/commands/trellis/break-loop.md +++ /dev/null @@ -1,125 +0,0 @@ -# Break the Loop - Deep Bug Analysis - -When debug is complete, use this command for deep analysis to break the "fix bug -> forget -> repeat" cycle. - ---- - -## Analysis Framework - -Analyze the bug you just fixed from these 5 dimensions: - -### 1. Root Cause Category - -Which category does this bug belong to? - -| Category | Characteristics | Example | -|----------|-----------------|---------| -| **A. Missing Spec** | No documentation on how to do it | New feature without checklist | -| **B. Cross-Layer Contract** | Interface between layers unclear | API returns different format than expected | -| **C. Change Propagation Failure** | Changed one place, missed others | Changed function signature, missed call sites | -| **D. Test Coverage Gap** | Unit test passes, integration fails | Works alone, breaks when combined | -| **E. Implicit Assumption** | Code relies on undocumented assumption | Timestamp seconds vs milliseconds | - -### 2. Why Fixes Failed (if applicable) - -If you tried multiple fixes before succeeding, analyze each failure: - -- **Surface Fix**: Fixed symptom, not root cause -- **Incomplete Scope**: Found root cause, didn't cover all cases -- **Tool Limitation**: grep missed it, type check wasn't strict -- **Mental Model**: Kept looking in same layer, didn't think cross-layer - -### 3. Prevention Mechanisms - -What mechanisms would prevent this from happening again? - -| Type | Description | Example | -|------|-------------|---------| -| **Documentation** | Write it down so people know | Update thinking guide | -| **Architecture** | Make the error impossible structurally | Type-safe wrappers | -| **Compile-time** | TypeScript strict, no any | Signature change causes compile error | -| **Runtime** | Monitoring, alerts, scans | Detect orphan entities | -| **Test Coverage** | E2E tests, integration tests | Verify full flow | -| **Code Review** | Checklist, PR template | "Did you check X?" | - -### 4. Systematic Expansion - -What broader problems does this bug reveal? - -- **Similar Issues**: Where else might this problem exist? -- **Design Flaw**: Is there a fundamental architecture issue? -- **Process Flaw**: Is there a development process improvement? -- **Knowledge Gap**: Is the team missing some understanding? - -### 5. Knowledge Capture - -Solidify insights into the system: - -- [ ] Update `.trellis/spec/guides/` thinking guides -- [ ] Update `.trellis/spec/backend/` or `frontend/` docs -- [ ] Create issue record (if applicable) -- [ ] Create feature ticket for root fix -- [ ] Update check commands if needed - ---- - -## Output Format - -Please output analysis in this format: - -```markdown -## Bug Analysis: [Short Description] - -### 1. Root Cause Category -- **Category**: [A/B/C/D/E] - [Category Name] -- **Specific Cause**: [Detailed description] - -### 2. Why Fixes Failed (if applicable) -1. [First attempt]: [Why it failed] -2. [Second attempt]: [Why it failed] -... - -### 3. Prevention Mechanisms -| Priority | Mechanism | Specific Action | Status | -|----------|-----------|-----------------|--------| -| P0 | ... | ... | TODO/DONE | - -### 4. Systematic Expansion -- **Similar Issues**: [List places with similar problems] -- **Design Improvement**: [Architecture-level suggestions] -- **Process Improvement**: [Development process suggestions] - -### 5. Knowledge Capture -- [ ] [Documents to update / tickets to create] -``` - ---- - -## Core Philosophy - -> **The value of debugging is not in fixing the bug, but in making this class of bugs never happen again.** - -Three levels of insight: -1. **Tactical**: How to fix THIS bug -2. **Strategic**: How to prevent THIS CLASS of bugs -3. **Philosophical**: How to expand thinking patterns - -30 minutes of analysis saves 30 hours of future debugging. - ---- - -## After Analysis: Immediate Actions - -**IMPORTANT**: After completing the analysis above, you MUST immediately: - -1. **Update spec/guides** - Don't just list TODOs, actually update the relevant files: - - If it's a cross-platform issue → update `cross-platform-thinking-guide.md` - - If it's a cross-layer issue → update `cross-layer-thinking-guide.md` - - If it's a code reuse issue → update `code-reuse-thinking-guide.md` - - If it's domain-specific → update `backend/*.md` or `frontend/*.md` - -2. **Sync templates** - After updating `.trellis/spec/`, sync to `src/templates/markdown/spec/` - -3. **Commit the spec updates** - This is the primary output, not just the analysis text - -> **The analysis is worthless if it stays in chat. The value is in the updated specs.** diff --git a/.claude/commands/trellis/check-cross-layer.md b/.claude/commands/trellis/check-cross-layer.md deleted file mode 100644 index 591d39b5..00000000 --- a/.claude/commands/trellis/check-cross-layer.md +++ /dev/null @@ -1,153 +0,0 @@ -# Cross-Layer Check - -Check if your changes considered all dimensions. Most bugs come from "didn't think of it", not lack of technical skill. - -> **Note**: This is a **post-implementation** safety net. Ideally, read the [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) **before** writing code. - ---- - -## Related Documents - -| Document | Purpose | Timing | -|----------|---------|--------| -| [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) | Questions before coding | **Before** writing code | -| [Code Reuse Thinking Guide](.trellis/spec/guides/code-reuse-thinking-guide.md) | Pattern recognition | During implementation | -| **`/trellis:check-cross-layer`** (this) | Verification check | **After** implementation | - ---- - -## Execution Steps - -### 1. Identify Change Scope - -```bash -git status -git diff --name-only -``` - -### 2. Select Applicable Check Dimensions - -Based on your change type, execute relevant checks below: - ---- - -## Dimension A: Cross-Layer Data Flow (Required when 3+ layers) - -**Trigger**: Changes involve 3 or more layers - -| Layer | Common Locations | -|-------|------------------| -| API/Routes | `routes/`, `api/`, `handlers/`, `controllers/` | -| Service/Business Logic | `services/`, `lib/`, `core/`, `domain/` | -| Database/Storage | `db/`, `models/`, `repositories/`, `schema/` | -| UI/Presentation | `components/`, `views/`, `templates/`, `pages/` | -| Utility | `utils/`, `helpers/`, `common/` | - -**Checklist**: -- [ ] Read flow: Database -> Service -> API -> UI -- [ ] Write flow: UI -> API -> Service -> Database -- [ ] Types/schemas correctly passed between layers? -- [ ] Errors properly propagated to caller? -- [ ] Loading/pending states handled at each layer? - -**Detailed Guide**: `.trellis/spec/guides/cross-layer-thinking-guide.md` - ---- - -## Dimension B: Code Reuse (Required when modifying constants/config) - -**Trigger**: -- Modifying UI constants (label, icon, color) -- Modifying any hardcoded value -- Seeing similar code in multiple places -- Creating a new utility/helper function -- Just finished batch modifications across files - -**Checklist**: -- [ ] Search first: How many places define this value? - ```bash - # Search in source files (adjust extensions for your project) - grep -r "value-to-change" src/ - ``` -- [ ] If 2+ places define same value -> Should extract to shared constant -- [ ] After modification, all usage sites updated? -- [ ] If creating utility: Does similar utility already exist? - -**Detailed Guide**: `.trellis/spec/guides/code-reuse-thinking-guide.md` - ---- - -## Dimension B2: New Utility Functions - -**Trigger**: About to create a new utility/helper function - -**Checklist**: -- [ ] Search for existing similar utilities first - ```bash - grep -r "functionNamePattern" src/ - ``` -- [ ] If similar exists, can you extend it instead? -- [ ] If creating new, is it in the right location (shared vs domain-specific)? - ---- - -## Dimension B3: After Batch Modifications - -**Trigger**: Just modified similar patterns in multiple files - -**Checklist**: -- [ ] Did you check ALL files with similar patterns? - ```bash - grep -r "patternYouChanged" src/ - ``` -- [ ] Any files missed that should also be updated? -- [ ] Should this pattern be abstracted to prevent future duplication? - ---- - -## Dimension C: Import/Dependency Paths (Required when creating new files) - -**Trigger**: Creating new source files - -**Checklist**: -- [ ] Using correct import paths (relative vs absolute)? -- [ ] No circular dependencies? -- [ ] Consistent with project's module organization? - ---- - -## Dimension D: Same-Layer Consistency - -**Trigger**: -- Modifying display logic or formatting -- Same domain concept used in multiple places - -**Checklist**: -- [ ] Search for other places using same concept - ```bash - grep -r "ConceptName" src/ - ``` -- [ ] Are these usages consistent? -- [ ] Should they share configuration/constants? - ---- - -## Common Issues Quick Reference - -| Issue | Root Cause | Prevention | -|-------|------------|------------| -| Changed one place, missed others | Didn't search impact scope | `grep` before changing | -| Data lost at some layer | Didn't check data flow | Trace data source to destination | -| Type/schema mismatch | Cross-layer types inconsistent | Use shared type definitions | -| UI/output inconsistent | Same concept in multiple places | Extract shared constants | -| Similar utility exists | Didn't search first | Search before creating | -| Batch fix incomplete | Didn't verify all occurrences | grep after fixing | - ---- - -## Output - -Report: -1. Which dimensions your changes involve -2. Check results for each dimension -3. Issues found and fix suggestions diff --git a/.claude/commands/trellis/check.md b/.claude/commands/trellis/check.md deleted file mode 100644 index 8e3e272e..00000000 --- a/.claude/commands/trellis/check.md +++ /dev/null @@ -1,25 +0,0 @@ -Check if the code you just wrote follows the development guidelines. - -Execute these steps: - -1. **Identify changed files**: - ```bash - git diff --name-only HEAD - ``` - -2. **Determine which spec modules apply** based on the changed file paths: - ```bash - python3 ./.trellis/scripts/get_context.py --mode packages - ``` - -3. **Read the spec index** for each relevant module: - ```bash - cat .trellis/spec///index.md - ``` - Follow the **"Quality Check"** section in the index. - -4. **Read the specific guideline files** referenced in the Quality Check section (e.g., `quality-guidelines.md`, `conventions.md`). The index is NOT the goal — it points you to the actual guideline files. Read those files and review your code against them. - -5. **Run lint and typecheck** for the affected package. - -6. **Report any violations** and fix them if found. diff --git a/.claude/commands/trellis/create-command.md b/.claude/commands/trellis/create-command.md deleted file mode 100644 index 42397f43..00000000 --- a/.claude/commands/trellis/create-command.md +++ /dev/null @@ -1,154 +0,0 @@ -# Create New Slash Command - -Create a new slash command in both `.cursor/commands/` (with `trellis-` prefix) and `.claude/commands/trellis/` directories based on user requirements. - -## Usage - -``` -/trellis:create-command -``` - -**Example**: -``` -/trellis:create-command review-pr Check PR code changes against project guidelines -``` - -## Execution Steps - -### 1. Parse Input - -Extract from user input: -- **Command name**: Use kebab-case (e.g., `review-pr`) -- **Description**: What the command should accomplish - -### 2. Analyze Requirements - -Determine command type based on description: -- **Initialization**: Read docs, establish context -- **Pre-development**: Read guidelines, check dependencies -- **Code check**: Validate code quality and guideline compliance -- **Recording**: Record progress, questions, structure changes -- **Generation**: Generate docs, code templates - -### 3. Generate Command Content - -Based on command type, generate appropriate content: - -**Simple command** (1-3 lines): -```markdown -Concise instruction describing what to do -``` - -**Complex command** (with steps): -```markdown -# Command Title - -Command description - -## Steps - -### 1. First Step -Specific action - -### 2. Second Step -Specific action - -## Output Format (if needed) - -Template -``` - -### 4. Create Files - -Create in both directories: -- `.cursor/commands/trellis-.md` -- `.claude/commands/trellis/.md` - -### 5. Confirm Creation - -Output result: -``` -[OK] Created Slash Command: / - -File paths: -- .cursor/commands/trellis-.md -- .claude/commands/trellis/.md - -Usage: -/trellis: - -Description: - -``` - -## Command Content Guidelines - -### [OK] Good command content - -1. **Clear and concise**: Immediately understandable -2. **Executable**: AI can follow steps directly -3. **Well-scoped**: Clear boundaries of what to do and not do -4. **Has output**: Specifies expected output format (if needed) - -### [X] Avoid - -1. **Too vague**: e.g., "optimize code" -2. **Too complex**: Single command should not exceed 100 lines -3. **Duplicate functionality**: Check if similar command exists first - -## Naming Conventions - -| Command Type | Prefix | Example | -|--------------|--------|---------| -| Session Start | `start` | `start` | -| Pre-development | `before-` | `before-dev` | -| Check | `check-` | `check` | -| Record | `record-` | `record-session` | -| Generate | `generate-` | `generate-api-doc` | -| Update | `update-` | `update-changelog` | -| Other | Verb-first | `review-code`, `sync-data` | - -## Example - -### Input -``` -/trellis:create-command review-pr Check PR code changes against project guidelines -``` - -### Generated Command Content -```markdown -# PR Code Review - -Check current PR code changes against project guidelines. - -## Steps - -### 1. Get Changed Files -```bash -git diff main...HEAD --name-only -``` - -### 2. Categorized Review - -**Frontend files** (`apps/web/`): -- Reference `.trellis/spec/frontend/index.md` - -**Backend files** (`packages/api/`): -- Reference `.trellis/spec/backend/index.md` - -### 3. Output Review Report - -Format: - -## PR Review Report - -### Changed Files -- [file list] - -### Check Results -- [OK] Passed items -- [X] Issues found - -### Suggestions -- [improvement suggestions] -``` diff --git a/.claude/commands/trellis/finish-work.md b/.claude/commands/trellis/finish-work.md deleted file mode 100644 index 9daea672..00000000 --- a/.claude/commands/trellis/finish-work.md +++ /dev/null @@ -1,153 +0,0 @@ -# Finish Work - Pre-Commit Checklist - -Before submitting or committing, use this checklist to ensure work completeness. - -**Timing**: After code is written and tested, before commit - ---- - -## Checklist - -### 1. Code Quality - -```bash -# Must pass -pnpm lint -pnpm type-check -pnpm test -``` - -- [ ] `pnpm lint` passes with 0 errors? -- [ ] `pnpm type-check` passes with no type errors? -- [ ] Tests pass? -- [ ] No `console.log` statements (use logger)? -- [ ] No non-null assertions (the `x!` operator)? -- [ ] No `any` types? - -### 1.5. Test Coverage - -Check if your change needs new or updated tests (see `.trellis/spec/unit-test/conventions.md`): - -- [ ] New pure function → unit test added? -- [ ] Bug fix → regression test added in `test/regression.test.ts`? -- [ ] Changed init/update behavior → integration test added/updated? -- [ ] No logic change (text/data only) → no test needed - -### 2. Code-Spec Sync - -**Code-Spec Docs**: -- [ ] Does `.trellis/spec/backend/` need updates? - - New patterns, new modules, new conventions -- [ ] Does `.trellis/spec/frontend/` need updates? - - New components, new hooks, new patterns -- [ ] Does `.trellis/spec/guides/` need updates? - - New cross-layer flows, lessons from bugs - -**Key Question**: -> "If I fixed a bug or discovered something non-obvious, should I document it so future me (or others) won't hit the same issue?" - -If YES -> Update the relevant code-spec doc. - -### 2.5. Code-Spec Hard Block (Infra/Cross-Layer) - -If this change touches infra or cross-layer contracts, this is a blocking checklist: - -- [ ] Spec content is executable (real signatures/contracts), not principle-only text -- [ ] Includes file path + command/API name + payload field names -- [ ] Includes validation and error matrix -- [ ] Includes Good/Base/Bad cases -- [ ] Includes required tests and assertion points - -**Block Rule**: -In pipeline mode, the finish agent will automatically detect and execute spec updates when gaps are found. -If running this checklist manually, ensure spec sync is complete before committing — run `/trellis:update-spec` if needed. - -### 3. API Changes - -If you modified API endpoints: - -- [ ] Input schema updated? -- [ ] Output schema updated? -- [ ] API documentation updated? -- [ ] Client code updated to match? - -### 4. Database Changes - -If you modified database schema: - -- [ ] Migration file created? -- [ ] Schema file updated? -- [ ] Related queries updated? -- [ ] Seed data updated (if applicable)? - -### 5. Cross-Layer Verification - -If the change spans multiple layers: - -- [ ] Data flows correctly through all layers? -- [ ] Error handling works at each boundary? -- [ ] Types are consistent across layers? -- [ ] Loading states handled? - -### 6. Manual Testing - -- [ ] Feature works in browser/app? -- [ ] Edge cases tested? -- [ ] Error states tested? -- [ ] Works after page refresh? - ---- - -## Quick Check Flow - -```bash -# 1. Code checks -pnpm lint && pnpm type-check - -# 2. View changes -git status -git diff --name-only - -# 3. Based on changed files, check relevant items above -``` - ---- - -## Common Oversights - -| Oversight | Consequence | Check | -|-----------|-------------|-------| -| Code-spec docs not updated | Others don't know the change | Check .trellis/spec/ | -| Spec text is abstract only | Easy regressions in infra/cross-layer changes | Require signature/contract/matrix/cases/tests | -| Migration not created | Schema out of sync | Check db/migrations/ | -| Types not synced | Runtime errors | Check shared types | -| Tests not updated | False confidence | Run full test suite | -| Console.log left in | Noisy production logs | Search for console.log | - ---- - -## Relationship to Other Commands - -``` -Development Flow: - Write code -> Test -> /trellis:finish-work -> git commit -> /trellis:record-session - | | - Ensure completeness Record progress - -Debug Flow: - Hit bug -> Fix -> /trellis:break-loop -> Knowledge capture - | - Deep analysis -``` - -- `/trellis:finish-work` - Check work completeness (this command) -- `/trellis:record-session` - Record session and commits -- `/trellis:break-loop` - Deep analysis after debugging - ---- - -## Core Principle - -> **Delivery includes not just code, but also documentation, verification, and knowledge capture.** - -Complete work = Code + Docs + Tests + Verification diff --git a/.claude/commands/trellis/integrate-skill.md b/.claude/commands/trellis/integrate-skill.md deleted file mode 100644 index cacafd5a..00000000 --- a/.claude/commands/trellis/integrate-skill.md +++ /dev/null @@ -1,219 +0,0 @@ -# Integrate Claude Skill into Project Guidelines - -Adapt and integrate a Claude global skill into your project's development guidelines (not directly into project code). - -## Usage - -``` -/trellis:integrate-skill -``` - -**Examples**: -``` -/trellis:integrate-skill frontend-design -/trellis:integrate-skill mcp-builder -``` - -## Core Principle - -> [!] **Important**: The goal of skill integration is to update **development guidelines**, not to generate project code directly. -> -> - Guidelines content -> Write to `.trellis/spec/{target}/doc.md` -> - Code examples -> Place in `.trellis/spec/{target}/examples/skills//` -> - Example files -> Use `.template` suffix (e.g., `component.tsx.template`) to avoid IDE errors -> -> Where `{target}` is `frontend` or `backend`, determined by skill type. - -## Execution Steps - -### 1. Read Skill Content - -```bash -openskills read -``` - -If the skill doesn't exist, prompt user to check available skills: -```bash -# Available skills are listed in AGENTS.md under -``` - -### 2. Determine Integration Target - -Based on skill type, determine which guidelines to update: - -| Skill Category | Integration Target | -|----------------|-------------------| -| UI/Frontend (`frontend-design`, `web-artifacts-builder`) | `.trellis/spec/frontend/` | -| Backend/API (`mcp-builder`) | `.trellis/spec/backend/` | -| Documentation (`doc-coauthoring`, `docx`, `pdf`) | `.trellis/` or create dedicated guidelines | -| Testing (`webapp-testing`) | `.trellis/spec/frontend/` (E2E) | - -### 3. Analyze Skill Content - -Extract from the skill: -- **Core concepts**: How the skill works and key concepts -- **Best practices**: Recommended approaches -- **Code patterns**: Reusable code templates -- **Caveats**: Common issues and solutions - -### 4. Execute Integration - -#### 4.1 Update Guidelines Document - -Add a new section to the corresponding `doc.md`: - -```markdown -@@@section:skill- -## # Integration Guide - -### Overview -[Core functionality and use cases of the skill] - -### Project Adaptation -[How to use this skill in the current project] - -### Usage Steps -1. [Step 1] -2. [Step 2] - -### Caveats -- [Project-specific constraints] -- [Differences from default behavior] - -### Reference Examples -See `examples/skills//` - -@@@/section:skill- -``` - -#### 4.2 Create Examples Directory (if code examples exist) - -```bash -# Directory structure ({target} = frontend or backend) -.trellis/spec/{target}/ -|-- doc.md # Add skill-related section -|-- index.md # Update index -+-- examples/ - +-- skills/ - +-- / - |-- README.md # Example documentation - |-- example-1.ts.template # Code example (use .template suffix) - +-- example-2.tsx.template -``` - -**File naming conventions**: -- Code files: `..template` (e.g., `component.tsx.template`) -- Config files: `.config.template` (e.g., `tailwind.config.template`) -- Documentation: `README.md` (normal suffix) - -#### 4.3 Update Index File - -Add to the Quick Navigation table in `index.md`: - -```markdown -| |
| `skill-` | -``` - -### 5. Generate Integration Report - ---- - -## Skill Integration Report: `` - -### # Overview -- **Skill description**: [Functionality description] -- **Integration target**: `.trellis/spec/{target}/` - -### # Tech Stack Compatibility - -| Skill Requirement | Project Status | Compatibility | -|-------------------|----------------|---------------| -| [Tech 1] | [Project tech] | [OK]/[!]/[X] | - -### # Integration Locations - -| Type | Path | -|------|------| -| Guidelines doc | `.trellis/spec/{target}/doc.md` (section: `skill-`) | -| Code examples | `.trellis/spec/{target}/examples/skills//` | -| Index update | `.trellis/spec/{target}/index.md` | - -> `{target}` = `frontend` or `backend` - -### # Dependencies (if needed) - -```bash -# Install required dependencies (adjust for your package manager) -npm install -# or -pnpm add -# or -yarn add -``` - -### [OK] Completed Changes - -- [ ] Added `@@@section:skill-` section to `doc.md` -- [ ] Added index entry to `index.md` -- [ ] Created example files in `examples/skills//` -- [ ] Example files use `.template` suffix - -### # Related Guidelines - -- [Existing related section IDs] - ---- - -## 6. Optional: Create Usage Command - -If this skill is frequently used, create a shortcut command: - -```bash -/trellis:create-command use- Use skill following project guidelines -``` - -## Common Skill Integration Reference - -| Skill | Integration Target | Examples Directory | -|-------|-------------------|-------------------| -| `frontend-design` | `frontend` | `examples/skills/frontend-design/` | -| `mcp-builder` | `backend` | `examples/skills/mcp-builder/` | -| `webapp-testing` | `frontend` | `examples/skills/webapp-testing/` | -| `doc-coauthoring` | `.trellis/` | N/A (documentation workflow only) | - -## Example: Integrating `mcp-builder` Skill - -### Directory Structure - -``` -.trellis/spec/backend/ -|-- doc.md # Add MCP section -|-- index.md # Add index entry -+-- examples/ - +-- skills/ - +-- mcp-builder/ - |-- README.md - |-- server.ts.template - |-- tools.ts.template - +-- types.ts.template -``` - -### New Section in doc.md - -```markdown -@@@section:skill-mcp-builder -## # MCP Server Development Guide - -### Overview -Create LLM-callable tool services using MCP (Model Context Protocol). - -### Project Adaptation -- Place services in a dedicated directory -- Follow existing TypeScript and type definition conventions -- Use project's logging system - -### Reference Examples -See `examples/skills/mcp-builder/` - -@@@/section:skill-mcp-builder -``` diff --git a/.claude/commands/trellis/onboard.md b/.claude/commands/trellis/onboard.md deleted file mode 100644 index 2d4dabf8..00000000 --- a/.claude/commands/trellis/onboard.md +++ /dev/null @@ -1,358 +0,0 @@ -You are a senior developer onboarding a new team member to this project's AI-assisted workflow system. - -YOUR ROLE: Be a mentor and teacher. Don't just list steps - EXPLAIN the underlying principles, why each command exists, what problem it solves at a fundamental level. - -## CRITICAL INSTRUCTION - YOU MUST COMPLETE ALL SECTIONS - -This onboarding has THREE equally important parts: - -**PART 1: Core Concepts** (Sections: CORE PHILOSOPHY, SYSTEM STRUCTURE, COMMAND DEEP DIVE) -- Explain WHY this workflow exists -- Explain WHAT each command does and WHY - -**PART 2: Real-World Examples** (Section: REAL-WORLD WORKFLOW EXAMPLES) -- Walk through ALL 5 examples in detail -- For EACH step in EACH example, explain: - - PRINCIPLE: Why this step exists - - WHAT HAPPENS: What the command actually does - - IF SKIPPED: What goes wrong without it - -**PART 3: Customize Your Development Guidelines** (Section: CUSTOMIZE YOUR DEVELOPMENT GUIDELINES) -- Check if project guidelines are still empty templates -- If empty, guide the developer to fill them with project-specific content -- Explain the customization workflow - -DO NOT skip any part. All three parts are essential: -- Part 1 teaches the concepts -- Part 2 shows how concepts work in practice -- Part 3 ensures the project has proper guidelines for AI to follow - -After completing ALL THREE parts, ask the developer about their first task. - ---- - -## CORE PHILOSOPHY: Why This Workflow Exists - -AI-assisted development has three fundamental challenges: - -### Challenge 1: AI Has No Memory - -Every AI session starts with a blank slate. Unlike human engineers who accumulate project knowledge over weeks/months, AI forgets everything when a session ends. - -**The Problem**: Without memory, AI asks the same questions repeatedly, makes the same mistakes, and can't build on previous work. - -**The Solution**: The `.trellis/workspace/` system captures what happened in each session - what was done, what was learned, what problems were solved. The `/trellis:start` command reads this history at session start, giving AI "artificial memory." - -### Challenge 2: AI Has Generic Knowledge, Not Project-Specific Knowledge - -AI models are trained on millions of codebases - they know general patterns for React, TypeScript, databases, etc. But they don't know YOUR project's conventions. - -**The Problem**: AI writes code that "works" but doesn't match your project's style. It uses patterns that conflict with existing code. It makes decisions that violate unwritten team rules. - -**The Solution**: The `.trellis/spec/` directory contains project-specific guidelines. The `/before-*-dev` commands inject this specialized knowledge into AI context before coding starts. - -### Challenge 3: AI Context Window Is Limited - -Even after injecting guidelines, AI has limited context window. As conversation grows, earlier context (including guidelines) gets pushed out or becomes less influential. - -**The Problem**: AI starts following guidelines, but as the session progresses and context fills up, it "forgets" the rules and reverts to generic patterns. - -**The Solution**: The `/check-*` commands re-verify code against guidelines AFTER writing, catching drift that occurred during development. The `/trellis:finish-work` command does a final holistic review. - ---- - -## SYSTEM STRUCTURE - -``` -.trellis/ -|-- .developer # Your identity (gitignored) -|-- workflow.md # Complete workflow documentation -|-- workspace/ # "AI Memory" - session history -| |-- index.md # All developers' progress -| +-- {developer}/ # Per-developer directory -| |-- index.md # Personal progress index -| +-- journal-N.md # Session records (max 2000 lines) -|-- tasks/ # Task tracking (unified) -| +-- {MM}-{DD}-{slug}/ # Task directory -| |-- task.json # Task metadata -| +-- prd.md # Requirements doc -|-- spec/ # "AI Training Data" - project knowledge -| |-- frontend/ # Frontend conventions -| |-- backend/ # Backend conventions -| +-- guides/ # Thinking patterns -+-- scripts/ # Automation tools -``` - -### Understanding spec/ subdirectories - -**frontend/** - Single-layer frontend knowledge: -- Component patterns (how to write components in THIS project) -- State management rules (Redux? Zustand? Context?) -- Styling conventions (CSS modules? Tailwind? Styled-components?) -- Hook patterns (custom hooks, data fetching) - -**backend/** - Single-layer backend knowledge: -- API design patterns (REST? GraphQL? tRPC?) -- Database conventions (query patterns, migrations) -- Error handling standards -- Logging and monitoring rules - -**guides/** - Cross-layer thinking guides: -- Code reuse thinking guide -- Cross-layer thinking guide -- Pre-implementation checklists - ---- - -## COMMAND DEEP DIVE - -### /trellis:start - Restore AI Memory - -**WHY IT EXISTS**: -When a human engineer joins a project, they spend days/weeks learning: What is this project? What's been built? What's in progress? What's the current state? - -AI needs the same onboarding - but compressed into seconds at session start. - -**WHAT IT ACTUALLY DOES**: -1. Reads developer identity (who am I in this project?) -2. Checks git status (what branch? uncommitted changes?) -3. Reads recent session history from `workspace/` (what happened before?) -4. Identifies active features (what's in progress?) -5. Understands current project state before making any changes - -**WHY THIS MATTERS**: -- Without /trellis:start: AI is blind. It might work on wrong branch, conflict with others' work, or redo already-completed work. -- With /trellis:start: AI knows project context, can continue where previous session left off, avoids conflicts. - ---- - -### /trellis:before-dev - Inject Specialized Knowledge - -**WHY IT EXISTS**: -AI models have "pre-trained knowledge" - general patterns from millions of codebases. But YOUR project has specific conventions that differ from generic patterns. - -**WHAT IT ACTUALLY DOES**: -1. Discovers spec layers via `get_context.py --mode packages` and reads relevant guidelines -2. Loads project-specific patterns into AI's working context: - - Component naming conventions - - State management patterns - - Database query patterns - - Error handling standards - -**WHY THIS MATTERS**: -- Without before-dev: AI writes generic code that doesn't match project style. -- With before-dev: AI writes code that looks like the rest of the codebase. - ---- - -### /trellis:check - Combat Context Drift - -**WHY IT EXISTS**: -AI context window has limited capacity. As conversation progresses, guidelines injected at session start become less influential. This causes "context drift." - -**WHAT IT ACTUALLY DOES**: -1. Re-reads the guidelines that were injected earlier -2. Compares written code against those guidelines -3. Runs type checker and linter -4. Identifies violations and suggests fixes - -**WHY THIS MATTERS**: -- Without check-*: Context drift goes unnoticed, code quality degrades. -- With check-*: Drift is caught and corrected before commit. - ---- - -### /trellis:check-cross-layer - Multi-Dimension Verification - -**WHY IT EXISTS**: -Most bugs don't come from lack of technical skill - they come from "didn't think of it": -- Changed a constant in one place, missed 5 other places -- Modified database schema, forgot to update the API layer -- Created a utility function, but similar one already exists - -**WHAT IT ACTUALLY DOES**: -1. Identifies which dimensions your change involves -2. For each dimension, runs targeted checks: - - Cross-layer data flow - - Code reuse analysis - - Import path validation - - Consistency checks - ---- - -### /trellis:finish-work - Holistic Pre-Commit Review - -**WHY IT EXISTS**: -The `/check-*` commands focus on code quality within a single layer. But real changes often have cross-cutting concerns. - -**WHAT IT ACTUALLY DOES**: -1. Reviews all changes holistically -2. Checks cross-layer consistency -3. Identifies broader impacts -4. Checks if new patterns should be documented - ---- - -### /trellis:record-session - Persist Memory for Future - -**WHY IT EXISTS**: -All the context AI built during this session will be lost when session ends. The next session's `/trellis:start` needs this information. - -**WHAT IT ACTUALLY DOES**: -1. Records session summary to `workspace/{developer}/journal-N.md` -2. Captures what was done, learned, and what's remaining -3. Updates index files for quick lookup - ---- - -## REAL-WORLD WORKFLOW EXAMPLES - -### Example 1: Bug Fix Session - -**[1/8] /trellis:start** - AI needs project context before touching code -**[2/8] python3 ./.trellis/scripts/task.py create "Fix bug" --slug fix-bug** - Track work for future reference -**[3/8] /trellis:before-dev** - Inject project-specific development guidelines -**[4/8] Investigate and fix the bug** - Actual development work -**[5/8] /trellis:check** - Re-verify code against guidelines -**[6/8] /trellis:finish-work** - Holistic cross-layer review -**[7/8] Human tests and commits** - Human validates before code enters repo -**[8/8] /trellis:record-session** - Persist memory for future sessions - -### Example 2: Planning Session (No Code) - -**[1/4] /trellis:start** - Context needed even for non-coding work -**[2/4] python3 ./.trellis/scripts/task.py create "Planning task" --slug planning-task** - Planning is valuable work -**[3/4] Review docs, create subtask list** - Actual planning work -**[4/4] /trellis:record-session (with --summary)** - Planning decisions must be recorded - -### Example 3: Code Review Fixes - -**[1/6] /trellis:start** - Resume context from previous session -**[2/6] /trellis:before-dev** - Re-inject guidelines before fixes -**[3/6] Fix each CR issue** - Address feedback with guidelines in context -**[4/6] /trellis:check** - Verify fixes did not introduce new issues -**[5/6] /trellis:finish-work** - Document lessons from CR -**[6/6] Human commits, then /trellis:record-session** - Preserve CR lessons - -### Example 4: Large Refactoring - -**[1/5] /trellis:start** - Clear baseline before major changes -**[2/5] Plan phases** - Break into verifiable chunks -**[3/5] Execute phase by phase with /trellis:check after each** - Incremental verification -**[4/5] /trellis:finish-work** - Check if new patterns should be documented -**[5/5] Record with multiple commit hashes** - Link all commits to one feature - -### Example 5: Debug Session - -**[1/6] /trellis:start** - See if this bug was investigated before -**[2/6] /trellis:before-dev** - Guidelines might document known gotchas -**[3/6] Investigation** - Actual debugging work -**[4/6] /trellis:check** - Verify debug changes do not break other things -**[5/6] /trellis:finish-work** - Debug findings might need documentation -**[6/6] Human commits, then /trellis:record-session** - Debug knowledge is valuable - ---- - -## KEY RULES TO EMPHASIZE - -1. **AI NEVER commits** - Human tests and approves. AI prepares, human validates. -2. **Guidelines before code** - /before-dev command injects project knowledge. -3. **Check after code** - /check-* commands catch context drift. -4. **Record everything** - /trellis:record-session persists memory. - ---- - -# PART 3: Customize Your Development Guidelines - -After explaining Part 1 and Part 2, check if the project's development guidelines need customization. - -## Step 1: Check Current Guidelines Status - -Check if `.trellis/spec/` contains empty templates or customized guidelines: - -```bash -# Check if files are still empty templates (look for placeholder text) -grep -l "To be filled by the team" .trellis/spec/backend/*.md 2>/dev/null | wc -l -grep -l "To be filled by the team" .trellis/spec/frontend/*.md 2>/dev/null | wc -l -``` - -## Step 2: Determine Situation - -**Situation A: First-time setup (empty templates)** - -If guidelines are empty templates (contain "To be filled by the team"), this is the first time using Trellis in this project. - -Explain to the developer: - -"I see that the development guidelines in `.trellis/spec/` are still empty templates. This is normal for a new Trellis setup! - -The templates contain placeholder text that needs to be replaced with YOUR project's actual conventions. Without this, `/before-*-dev` commands won't provide useful guidance. - -**Your first task should be to fill in these guidelines:** - -1. Look at your existing codebase -2. Identify the patterns and conventions already in use -3. Document them in the guideline files - -For example, for `.trellis/spec/backend/database-guidelines.md`: -- What ORM/query library does your project use? -- How are migrations managed? -- What naming conventions for tables/columns? - -Would you like me to help you analyze your codebase and fill in these guidelines?" - -**Situation B: Guidelines already customized** - -If guidelines have real content (no "To be filled" placeholders), this is an existing setup. - -Explain to the developer: - -"Great! Your team has already customized the development guidelines. You can start using `/before-*-dev` commands right away. - -I recommend reading through `.trellis/spec/` to familiarize yourself with the team's coding standards." - -## Step 3: Help Fill Guidelines (If Empty) - -If the developer wants help filling guidelines, create a feature to track this: - -```bash -python3 ./.trellis/scripts/task.py create "Fill spec guidelines" --slug fill-spec-guidelines -``` - -Then systematically analyze the codebase and fill each guideline file: - -1. **Analyze the codebase** - Look at existing code patterns -2. **Document conventions** - Write what you observe, not ideals -3. **Include examples** - Reference actual files in the project -4. **List forbidden patterns** - Document anti-patterns the team avoids - -Work through one file at a time: -- `backend/directory-structure.md` -- `backend/database-guidelines.md` -- `backend/error-handling.md` -- `backend/quality-guidelines.md` -- `backend/logging-guidelines.md` -- `frontend/directory-structure.md` -- `frontend/component-guidelines.md` -- `frontend/hook-guidelines.md` -- `frontend/state-management.md` -- `frontend/quality-guidelines.md` -- `frontend/type-safety.md` - ---- - -## Completing the Onboard Session - -After covering all three parts, summarize: - -"You're now onboarded to the Trellis workflow system! Here's what we covered: -- Part 1: Core concepts (why this workflow exists) -- Part 2: Real-world examples (how to apply the workflow) -- Part 3: Guidelines status (empty templates need filling / already customized) - -**Next steps** (tell user): -1. Run `/trellis:record-session` to record this onboard session -2. [If guidelines empty] Start filling in `.trellis/spec/` guidelines -3. [If guidelines ready] Start your first development task - -What would you like to do first?" diff --git a/.claude/commands/trellis/parallel.md b/.claude/commands/trellis/parallel.md deleted file mode 100644 index 0be6dc69..00000000 --- a/.claude/commands/trellis/parallel.md +++ /dev/null @@ -1,192 +0,0 @@ -# Multi-Agent Pipeline Orchestrator - -You are the Multi-Agent Pipeline Orchestrator Agent, running in the main repository, responsible for collaborating with users to manage parallel development tasks. - -## Role Definition - -- **You are in the main repository**, not in a worktree -- **You don't write code directly** - code work is done by agents in worktrees -- **You are responsible for planning and dispatching**: discuss requirements, create plans, configure context, start worktree agents -- **Delegate complex analysis to research agent**: finding specs, analyzing code structure - ---- - -## Operation Types - -Operations in this document are categorized as: - -| Marker | Meaning | Executor | -|--------|---------|----------| -| `[AI]` | Bash scripts or Task calls executed by AI | You (AI) | -| `[USER]` | Slash commands executed by user | User | - ---- - -## Startup Flow - -### Step 1: Understand Trellis Workflow `[AI]` - -First, read the workflow guide to understand the development process: - -```bash -cat .trellis/workflow.md # Development process, conventions, and quick start guide -``` - -### Step 2: Get Current Status `[AI]` - -```bash -python3 ./.trellis/scripts/get_context.py -``` - -### Step 3: Read Project Guidelines `[AI]` - -```bash -python3 ./.trellis/scripts/get_context.py --mode packages # Discover available spec layers -cat .trellis/spec/guides/index.md # Thinking guides -``` - -### Step 4: Ask User for Requirements - -Ask the user: - -1. What feature to develop? -2. Which modules are involved? -3. Development type? (backend / frontend / fullstack) - ---- - -## Planning: Choose Your Approach - -Based on requirement complexity, choose one of these approaches: - -### Option A: Plan Agent (Recommended for complex features) `[AI]` - -Use when: -- Requirements need analysis and validation -- Multiple modules or cross-layer changes -- Unclear scope that needs research - -```bash -python3 ./.trellis/scripts/multi_agent/plan.py \ - --name "" \ - --type "" \ - --requirement "" -``` - -Plan Agent will: -1. Evaluate requirement validity (may reject if unclear/too large) -2. Call research agent to analyze codebase -3. Create and configure task directory -4. Write prd.md with acceptance criteria -5. Output ready-to-use task directory - -After plan.py completes, start the worktree agent: - -```bash -python3 ./.trellis/scripts/multi_agent/start.py "$TASK_DIR" -``` - -### Option B: Manual Configuration (For simple/clear features) `[AI]` - -Use when: -- Requirements are already clear and specific -- You know exactly which files are involved -- Simple, well-scoped changes - -#### Step 1: Create Task Directory - -```bash -# title is task description, --slug for task directory name -TASK_DIR=$(python3 ./.trellis/scripts/task.py create "" --slug <task-name>) -``` - -#### Step 2: Configure Task - -```bash -# Initialize jsonl context files -python3 ./.trellis/scripts/task.py init-context "$TASK_DIR" <dev_type> - -# Set branch and scope -python3 ./.trellis/scripts/task.py set-branch "$TASK_DIR" feature/<name> -python3 ./.trellis/scripts/task.py set-scope "$TASK_DIR" <scope> -``` - -#### Step 3: Add Context (optional: use research agent) - -```bash -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<path>" "<reason>" -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" check "<path>" "<reason>" -``` - -#### Step 4: Create prd.md - -```bash -cat > "$TASK_DIR/prd.md" << 'EOF' -# Feature: <name> - -## Requirements -- ... - -## Acceptance Criteria -- ... -EOF -``` - -#### Step 5: Validate and Start - -```bash -python3 ./.trellis/scripts/task.py validate "$TASK_DIR" -python3 ./.trellis/scripts/multi_agent/start.py "$TASK_DIR" -``` - ---- - -## After Starting: Report Status - -Tell the user the agent has started and provide monitoring commands. - ---- - -## User Available Commands `[USER]` - -The following slash commands are for users (not AI): - -| Command | Description | -|---------|-------------| -| `/trellis:parallel` | Start Multi-Agent Pipeline (this command) | -| `/trellis:start` | Start normal development mode (single process) | -| `/trellis:record-session` | Record session progress | -| `/trellis:finish-work` | Pre-completion checklist | - ---- - -## Monitoring Commands (for user reference) - -Tell the user they can use these commands to monitor: - -```bash -python3 ./.trellis/scripts/multi_agent/status.py # Overview -python3 ./.trellis/scripts/multi_agent/status.py --log <name> # View log -python3 ./.trellis/scripts/multi_agent/status.py --watch <name> # Real-time monitoring -python3 ./.trellis/scripts/multi_agent/cleanup.py <branch> # Cleanup worktree -``` - ---- - -## Pipeline Phases - -The dispatch agent in worktree will automatically execute: - -1. implement → Implement feature -2. check → Check code quality -3. finish → Final verification -4. create-pr → Create PR - ---- - -## Core Rules - -- **Don't write code directly** - delegate to agents in worktree -- **Don't execute git commit** - agent does it via create-pr action -- **Delegate complex analysis to research** - finding specs, analyzing code structure -- **All sub agents use opus model** - ensure output quality diff --git a/.claude/commands/trellis/record-session.md b/.claude/commands/trellis/record-session.md deleted file mode 100644 index 8bea4f9b..00000000 --- a/.claude/commands/trellis/record-session.md +++ /dev/null @@ -1,62 +0,0 @@ -[!] **Prerequisite**: This command should only be used AFTER the human has tested and committed the code. - -**Do NOT run `git commit` directly** — the scripts below handle their own commits for `.trellis/` metadata. You only need to read git history (`git log`, `git status`, `git diff`) and run the Python scripts. - ---- - -## Record Work Progress - -### Step 1: Get Context & Check Tasks - -```bash -python3 ./.trellis/scripts/get_context.py --mode record -``` - -[!] Archive tasks whose work is **actually done** — judge by work status, not the `status` field in task.json: -- Code committed? → Archive it (don't wait for PR) -- All acceptance criteria met? → Archive it -- Don't skip archiving just because `status` still says `planning` or `in_progress` - -```bash -python3 ./.trellis/scripts/task.py archive <task-name> -``` - -### Step 2: One-Click Add Session - -```bash -# Method 1: Simple parameters -python3 ./.trellis/scripts/add_session.py \ - --title "Session Title" \ - --commit "hash1,hash2" \ - --summary "Brief summary of what was done" - -# Method 2: Pass detailed content via stdin -cat << 'EOF' | python3 ./.trellis/scripts/add_session.py --stdin --title "Title" --commit "hash" -| Feature | Description | -|---------|-------------| -| New API | Added user authentication endpoint | -| Frontend | Updated login form | - -**Updated Files**: -- `packages/api/modules/auth/router.ts` -- `apps/web/modules/auth/components/login-form.tsx` -EOF -``` - -**Auto-completes**: -- [OK] Appends session to journal-N.md -- [OK] Auto-detects line count, creates new file if >2000 lines -- [OK] Auto-detects Branch context (`--branch` override; otherwise Branch = task.json -> current git branch; missing values are omitted gracefully) -- [OK] Updates index.md (Total Sessions +1, Last Active, line stats, history) -- [OK] Auto-commits .trellis/workspace and .trellis/tasks changes - ---- - -## Script Command Reference - -| Command | Purpose | -|---------|---------| -| `python3 ./.trellis/scripts/get_context.py --mode record` | Get context for record-session | -| `python3 ./.trellis/scripts/add_session.py --title "..." --commit "..."` | **One-click add session (recommended, branch auto-complete)** | -| `python3 ./.trellis/scripts/task.py archive <name>` | Archive completed task (auto-commits) | -| `python3 ./.trellis/scripts/task.py list` | List active tasks | diff --git a/.claude/commands/trellis/start.md b/.claude/commands/trellis/start.md deleted file mode 100644 index 1815359d..00000000 --- a/.claude/commands/trellis/start.md +++ /dev/null @@ -1,393 +0,0 @@ -# Start Session - -Initialize your AI development session and begin working on tasks. - ---- - -## Operation Types - -| Marker | Meaning | Executor | -|--------|---------|----------| -| `[AI]` | Bash scripts or Task calls executed by AI | You (AI) | -| `[USER]` | Slash commands executed by user | User | - ---- - -## Initialization `[AI]` - -### Step 1: Understand Development Workflow - -First, read the workflow guide to understand the development process: - -```bash -cat .trellis/workflow.md -``` - -**Follow the instructions in workflow.md** - it contains: -- Core principles (Read Before Write, Follow Standards, etc.) -- File system structure -- Development process -- Best practices - -### Step 2: Get Current Context - -```bash -python3 ./.trellis/scripts/get_context.py -``` - -This shows: developer identity, git status, current task (if any), active tasks. - -### Step 3: Read Guidelines Index - -```bash -python3 ./.trellis/scripts/get_context.py --mode packages -``` - -This shows available packages and their spec layers. Read the relevant spec indexes: - -```bash -cat .trellis/spec/<package>/<layer>/index.md # Package-specific guidelines -cat .trellis/spec/guides/index.md # Thinking guides (always read) -``` - -> **Important**: The index files are navigation — they list the actual guideline files (e.g., `error-handling.md`, `conventions.md`, `mock-strategies.md`). -> At this step, just read the indexes to understand what's available. -> When you start actual development, you MUST go back and read the specific guideline files relevant to your task, as listed in the index's Pre-Development Checklist. - -### Step 4: Report and Ask - -Report what you learned and ask: "What would you like to work on?" - ---- - -## Task Classification - -When user describes a task, classify it: - -| Type | Criteria | Workflow | -|------|----------|----------| -| **Question** | User asks about code, architecture, or how something works | Answer directly | -| **Trivial Fix** | Typo fix, comment update, single-line change | Direct Edit | -| **Simple Task** | Clear goal, 1-2 files, well-defined scope | Quick confirm → Implement | -| **Complex Task** | Vague goal, multiple files, architectural decisions | **Brainstorm → Task Workflow** | - -### Classification Signals - -**Trivial/Simple indicators:** -- User specifies exact file and change -- "Fix the typo in X" -- "Add field Y to component Z" -- Clear acceptance criteria already stated - -**Complex indicators:** -- "I want to add a feature for..." -- "Can you help me improve..." -- Mentions multiple areas or systems -- No clear implementation path -- User seems unsure about approach - -### Decision Rule - -> **If in doubt, use Brainstorm + Task Workflow.** -> -> Task Workflow ensures code-spec context is injected to agents, resulting in higher quality code. -> The overhead is minimal, but the benefit is significant. - ---- - -## Question / Trivial Fix - -For questions or trivial fixes, work directly: - -1. Answer question or make the fix -2. If code was changed, remind user to run `/trellis:finish-work` - ---- - -## Simple Task - -For simple, well-defined tasks: - -1. Quick confirm: "I understand you want to [goal]. Shall I proceed?" -2. If no, clarify and confirm again -3. **If yes: execute ALL steps below without stopping. Do NOT ask for additional confirmation between steps.** - - Create task directory (Phase 1 Path B, Step 2) - - Write PRD (Step 3) - - Research codebase (Phase 2, Step 5) - - Configure context (Step 6) - - Activate task (Step 7) - - Implement (Phase 3, Step 8) - - Check quality (Step 9) - - Complete (Step 10) - ---- - -## Complex Task - Brainstorm First - -For complex or vague tasks, **automatically start the brainstorm process** — do NOT skip directly to implementation. - -See `/trellis:brainstorm` for the full process. Summary: - -1. **Acknowledge and classify** - State your understanding -2. **Create task directory** - Track evolving requirements in `prd.md` -3. **Ask questions one at a time** - Update PRD after each answer -4. **Propose approaches** - For architectural decisions -5. **Confirm final requirements** - Get explicit approval -6. **Proceed to Task Workflow** - With clear requirements in PRD - -> **Subtask Decomposition**: If brainstorm reveals multiple independent work items, -> consider creating subtasks using `--parent` flag or `add-subtask` command. -> See `/trellis:brainstorm` Step 8 for details. - -### Key Brainstorm Principles - -| Principle | Description | -|-----------|-------------| -| **One question at a time** | Never overwhelm with multiple questions | -| **Update PRD immediately** | After each answer, update the document | -| **Prefer multiple choice** | Easier for users to answer | -| **YAGNI** | Challenge unnecessary complexity | - ---- - -## Task Workflow (Development Tasks) - -**Why this workflow?** -- Research Agent analyzes what code-spec files are needed -- Code-spec files are configured in jsonl files -- Implement Agent receives code-spec context via Hook injection -- Check Agent verifies against code-spec requirements -- Result: Code that follows project conventions automatically - -### Overview: Two Entry Points - -``` -From Brainstorm (Complex Task): - PRD confirmed → Research → Configure Context → Activate → Implement → Check → Complete - -From Simple Task: - Confirm → Create Task → Write PRD → Research → Configure Context → Activate → Implement → Check → Complete -``` - -**Key principle: Research happens AFTER requirements are clear (PRD exists).** - ---- - -### Phase 1: Establish Requirements - -#### Path A: From Brainstorm (skip to Phase 2) - -PRD and task directory already exist from brainstorm. Skip directly to Phase 2. - -#### Path B: From Simple Task - -**Step 1: Confirm Understanding** `[AI]` - -Quick confirm: -- What is the goal? -- What type of development? (frontend / backend / fullstack) -- Any specific requirements or constraints? - -**Step 2: Create Task Directory** `[AI]` - -```bash -TASK_DIR=$(python3 ./.trellis/scripts/task.py create "<title>" --slug <name>) -``` - -**Step 3: Write PRD** `[AI]` - -Create `prd.md` in the task directory with: - -```markdown -# <Task Title> - -## Goal -<What we're trying to achieve> - -## Requirements -- <Requirement 1> -- <Requirement 2> - -## Acceptance Criteria -- [ ] <Criterion 1> -- [ ] <Criterion 2> - -## Technical Notes -<Any technical decisions or constraints> -``` - ---- - -### Phase 2: Prepare for Implementation (shared) - -> Both paths converge here. PRD and task directory must exist before proceeding. - -**Step 4: Code-Spec Depth Check** `[AI]` - -If the task touches infra or cross-layer contracts, do not start implementation until code-spec depth is defined. - -Trigger this requirement when the change includes any of: -- New or changed command/API signatures -- Database schema or migration changes -- Infra integrations (storage, queue, cache, secrets, env contracts) -- Cross-layer payload transformations - -Must-have before proceeding: -- [ ] Target code-spec files to update are identified -- [ ] Concrete contract is defined (signature, fields, env keys) -- [ ] Validation and error matrix is defined -- [ ] At least one Good/Base/Bad case is defined - -**Step 5: Research the Codebase** `[AI]` - -Based on the confirmed PRD, call Research Agent to find relevant specs and patterns: - -``` -Task( - subagent_type: "research", - prompt: "Analyze the codebase for this task: - - Task: <goal from PRD> - Type: <frontend/backend/fullstack> - - Please find: - 1. Relevant code-spec files in .trellis/spec/ - 2. Existing code patterns to follow (find 2-3 examples) - 3. Files that will likely need modification - - Output: - ## Relevant Code-Specs - - <path>: <why it's relevant> - - ## Code Patterns Found - - <pattern>: <example file path> - - ## Files to Modify - - <path>: <what change>", - model: "opus" -) -``` - -**Step 6: Configure Context** `[AI]` - -Initialize default context: - -```bash -python3 ./.trellis/scripts/task.py init-context "$TASK_DIR" <type> -# type: backend | frontend | fullstack -``` - -Add code-spec files found by Research Agent: - -```bash -# For each relevant code-spec and code pattern: -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<path>" "<reason>" -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" check "<path>" "<reason>" -``` - -**Step 7: Activate Task** `[AI]` - -```bash -python3 ./.trellis/scripts/task.py start "$TASK_DIR" -``` - -This sets `.current-task` so hooks can inject context. - ---- - -### Phase 3: Execute (shared) - -**Step 8: Implement** `[AI]` - -Call Implement Agent (code-spec context is auto-injected by hook): - -``` -Task( - subagent_type: "implement", - prompt: "Implement the task described in prd.md. - - Follow all code-spec files that have been injected into your context. - Run lint and typecheck before finishing.", - model: "opus" -) -``` - -**Step 9: Check Quality** `[AI]` - -Call Check Agent (code-spec context is auto-injected by hook): - -``` -Task( - subagent_type: "check", - prompt: "Review all code changes against the code-spec requirements. - - Fix any issues you find directly. - Ensure lint and typecheck pass.", - model: "opus" -) -``` - -**Step 10: Complete** `[AI]` - -1. Verify lint and typecheck pass -2. Report what was implemented -3. Remind user to: - - Test the changes - - Commit when ready - - Run `/trellis:record-session` to record this session - ---- - -## Continuing Existing Task - -If `get_context.py` shows a current task: - -1. Read the task's `prd.md` to understand the goal -2. Check `task.json` for current status and phase -3. Ask user: "Continue working on <task-name>?" - -If yes, resume from the appropriate step (usually Step 7 or 8). - ---- - -## Commands Reference - -### User Commands `[USER]` - -| Command | When to Use | -|---------|-------------| -| `/trellis:start` | Begin a session (this command) | -| `/trellis:brainstorm` | Clarify vague requirements (called from start) | -| `/trellis:parallel` | Complex tasks needing isolated worktree | -| `/trellis:finish-work` | Before committing changes | -| `/trellis:record-session` | After completing a task | - -### AI Scripts `[AI]` - -| Script | Purpose | -|--------|---------| -| `python3 ./.trellis/scripts/get_context.py` | Get session context | -| `python3 ./.trellis/scripts/task.py create` | Create task directory | -| `python3 ./.trellis/scripts/task.py init-context` | Initialize jsonl files | -| `python3 ./.trellis/scripts/task.py add-context` | Add code-spec/context file to jsonl | -| `python3 ./.trellis/scripts/task.py start` | Set current task | -| `python3 ./.trellis/scripts/task.py finish` | Clear current task | -| `python3 ./.trellis/scripts/task.py archive` | Archive completed task | - -### Sub Agents `[AI]` - -| Agent | Purpose | Hook Injection | -|-------|---------|----------------| -| research | Analyze codebase | No (reads directly) | -| implement | Write code | Yes (implement.jsonl) | -| check | Review & fix | Yes (check.jsonl) | -| debug | Fix specific issues | Yes (debug.jsonl) | - ---- - -## Key Principle - -> **Code-spec context is injected, not remembered.** -> -> The Task Workflow ensures agents receive relevant code-spec context automatically. -> This is more reliable than hoping the AI "remembers" conventions. diff --git a/.claude/commands/trellis/update-spec.md b/.claude/commands/trellis/update-spec.md deleted file mode 100644 index 3f0b2e77..00000000 --- a/.claude/commands/trellis/update-spec.md +++ /dev/null @@ -1,354 +0,0 @@ -# Update Code-Spec - Capture Executable Contracts - -When you learn something valuable (from debugging, implementing, or discussion), use this command to update the relevant code-spec documents. - -**Timing**: After completing a task, fixing a bug, or discovering a new pattern - ---- - -## Code-Spec First Rule (CRITICAL) - -In this project, "spec" for implementation work means **code-spec**: -- Executable contracts (not principle-only text) -- Concrete signatures, payload fields, env keys, and boundary behavior -- Testable validation/error behavior - -If the change touches infra or cross-layer contracts, code-spec depth is mandatory. - -### Mandatory Triggers - -Apply code-spec depth when the change includes any of: -- New/changed command or API signature -- Cross-layer request/response contract change -- Database schema/migration change -- Infra integration (storage, queue, cache, secrets, env wiring) - -### Mandatory Output (7 Sections) - -For triggered tasks, include all sections below: -1. Scope / Trigger -2. Signatures (command/API/DB) -3. Contracts (request/response/env) -4. Validation & Error Matrix -5. Good/Base/Bad Cases -6. Tests Required (with assertion points) -7. Wrong vs Correct (at least one pair) - ---- - -## When to Update Code-Specs - -| Trigger | Example | Target Spec | -|---------|---------|-------------| -| **Implemented a feature** | Added template download with giget | Relevant `backend/` or `frontend/` file | -| **Made a design decision** | Used type field + mapping table for extensibility | Relevant code-spec + "Design Decisions" section | -| **Fixed a bug** | Found a subtle issue with error handling | `backend/error-handling.md` | -| **Discovered a pattern** | Found a better way to structure code | Relevant `backend/` or `frontend/` file | -| **Hit a gotcha** | Learned that X must be done before Y | Relevant code-spec + "Common Mistakes" section | -| **Established a convention** | Team agreed on naming pattern | `quality-guidelines.md` | -| **New thinking trigger** | "Don't forget to check X before doing Y" | `guides/*.md` (as a checklist item, not detailed rules) | - -**Key Insight**: Code-spec updates are NOT just for problems. Every feature implementation contains design decisions and contracts that future AI/developers need to execute safely. - ---- - -## Spec Structure Overview - -``` -.trellis/spec/ -├── backend/ # Backend coding standards -│ ├── index.md # Overview and links -│ └── *.md # Topic-specific guidelines -├── frontend/ # Frontend coding standards -│ ├── index.md # Overview and links -│ └── *.md # Topic-specific guidelines -└── guides/ # Thinking checklists (NOT coding specs!) - ├── index.md # Guide index - └── *.md # Topic-specific guides -``` - -### CRITICAL: Code-Spec vs Guide - Know the Difference - -| Type | Location | Purpose | Content Style | -|------|----------|---------|---------------| -| **Code-Spec** | `backend/*.md`, `frontend/*.md` | Tell AI "how to implement safely" | Signatures, contracts, matrices, cases, test points | -| **Guide** | `guides/*.md` | Help AI "what to think about" | Checklists, questions, pointers to specs | - -**Decision Rule**: Ask yourself: - -- "This is **how to write** the code" → Put in `backend/` or `frontend/` -- "This is **what to consider** before writing" → Put in `guides/` - -**Example**: - -| Learning | Wrong Location | Correct Location | -|----------|----------------|------------------| -| "Use `reconfigure()` not `TextIOWrapper` for Windows stdout" | ❌ `guides/cross-platform-thinking-guide.md` | ✅ `backend/script-conventions.md` | -| "Remember to check encoding when writing cross-platform code" | ❌ `backend/script-conventions.md` | ✅ `guides/cross-platform-thinking-guide.md` | - -**Guides should be short checklists that point to specs**, not duplicate the detailed rules. - ---- - -## Update Process - -### Step 1: Identify What You Learned - -Answer these questions: - -1. **What did you learn?** (Be specific) -2. **Why is it important?** (What problem does it prevent?) -3. **Where does it belong?** (Which spec file?) - -### Step 2: Classify the Update Type - -| Type | Description | Action | -|------|-------------|--------| -| **Design Decision** | Why we chose approach X over Y | Add to "Design Decisions" section | -| **Project Convention** | How we do X in this project | Add to relevant section with examples | -| **New Pattern** | A reusable approach discovered | Add to "Patterns" section | -| **Forbidden Pattern** | Something that causes problems | Add to "Anti-patterns" or "Don't" section | -| **Common Mistake** | Easy-to-make error | Add to "Common Mistakes" section | -| **Convention** | Agreed-upon standard | Add to relevant section | -| **Gotcha** | Non-obvious behavior | Add warning callout | - -### Step 3: Read the Target Code-Spec - -Before editing, read the current code-spec to: -- Understand existing structure -- Avoid duplicating content -- Find the right section for your update - -```bash -cat .trellis/spec/<category>/<file>.md -``` - -### Step 4: Make the Update - -Follow these principles: - -1. **Be Specific**: Include concrete examples, not just abstract rules -2. **Explain Why**: State the problem this prevents -3. **Show Contracts**: Add signatures, payload fields, and error behavior -4. **Show Code**: Add code snippets for key patterns -5. **Keep it Short**: One concept per section - -### Step 5: Update the Index (if needed) - -If you added a new section or the code-spec status changed, update the category's `index.md`. - ---- - -## Update Templates - -### Mandatory Template for Infra/Cross-Layer Work - -```markdown -## Scenario: <name> - -### 1. Scope / Trigger -- Trigger: <why this requires code-spec depth> - -### 2. Signatures -- Backend command/API/DB signature(s) - -### 3. Contracts -- Request fields (name, type, constraints) -- Response fields (name, type, constraints) -- Environment keys (required/optional) - -### 4. Validation & Error Matrix -- <condition> -> <error> - -### 5. Good/Base/Bad Cases -- Good: ... -- Base: ... -- Bad: ... - -### 6. Tests Required -- Unit/Integration/E2E with assertion points - -### 7. Wrong vs Correct -#### Wrong -... -#### Correct -... -``` - -### Adding a Design Decision - -```markdown -### Design Decision: [Decision Name] - -**Context**: What problem were we solving? - -**Options Considered**: -1. Option A - brief description -2. Option B - brief description - -**Decision**: We chose Option X because... - -**Example**: -\`\`\`typescript -// How it's implemented -code example -\`\`\` - -**Extensibility**: How to extend this in the future... -``` - -### Adding a Project Convention - -```markdown -### Convention: [Convention Name] - -**What**: Brief description of the convention. - -**Why**: Why we do it this way in this project. - -**Example**: -\`\`\`typescript -// How to follow this convention -code example -\`\`\` - -**Related**: Links to related conventions or specs. -``` - -### Adding a New Pattern - -```markdown -### Pattern Name - -**Problem**: What problem does this solve? - -**Solution**: Brief description of the approach. - -**Example**: -\`\`\` -// Good -code example - -// Bad -code example -\`\`\` - -**Why**: Explanation of why this works better. -``` - -### Adding a Forbidden Pattern - -```markdown -### Don't: Pattern Name - -**Problem**: -\`\`\` -// Don't do this -bad code example -\`\`\` - -**Why it's bad**: Explanation of the issue. - -**Instead**: -\`\`\` -// Do this instead -good code example -\`\`\` -``` - -### Adding a Common Mistake - -```markdown -### Common Mistake: Description - -**Symptom**: What goes wrong - -**Cause**: Why this happens - -**Fix**: How to correct it - -**Prevention**: How to avoid it in the future -``` - -### Adding a Gotcha - -```markdown -> **Warning**: Brief description of the non-obvious behavior. -> -> Details about when this happens and how to handle it. -``` - ---- - -## Interactive Mode - -If you're unsure what to update, answer these prompts: - -1. **What did you just finish?** - - [ ] Fixed a bug - - [ ] Implemented a feature - - [ ] Refactored code - - [ ] Had a discussion about approach - -2. **What did you learn or decide?** - - Design decision (why X over Y) - - Project convention (how we do X) - - Non-obvious behavior (gotcha) - - Better approach (pattern) - -3. **Would future AI/developers need to know this?** - - To understand how the code works → Yes, update spec - - To maintain or extend the feature → Yes, update spec - - To avoid repeating mistakes → Yes, update spec - - Purely one-off implementation detail → Maybe skip - -4. **Which area does it relate to?** - - [ ] Backend code - - [ ] Frontend code - - [ ] Cross-layer data flow - - [ ] Code organization/reuse - - [ ] Quality/testing - ---- - -## Quality Checklist - -Before finishing your code-spec update: - -- [ ] Is the content specific and actionable? -- [ ] Did you include a code example? -- [ ] Did you explain WHY, not just WHAT? -- [ ] Did you include executable signatures/contracts? -- [ ] Did you include validation and error matrix? -- [ ] Did you include Good/Base/Bad cases? -- [ ] Did you include required tests with assertion points? -- [ ] Is it in the right code-spec file? -- [ ] Does it duplicate existing content? -- [ ] Would a new team member understand it? - ---- - -## Relationship to Other Commands - -``` -Development Flow: - Learn something → /trellis:update-spec → Knowledge captured - ↑ ↓ - /trellis:break-loop ←──────────────────── Future sessions benefit - (deep bug analysis) -``` - -- `/trellis:break-loop` - Analyzes bugs deeply, often reveals spec updates needed -- `/trellis:update-spec` - Actually makes the updates (this command) -- `/trellis:finish-work` - Reminds you to check if specs need updates - ---- - -## Core Philosophy - -> **Code-specs are living documents. Every debugging session, every "aha moment" is an opportunity to make the implementation contract clearer.** - -The goal is **institutional memory**: -- What one person learns, everyone benefits from -- What AI learns in one session, persists to future sessions -- Mistakes become documented guardrails diff --git a/.claude/hooks/inject-subagent-context.py b/.claude/hooks/inject-subagent-context.py deleted file mode 100644 index f89b4c7c..00000000 --- a/.claude/hooks/inject-subagent-context.py +++ /dev/null @@ -1,803 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Multi-Agent Pipeline Context Injection Hook - -Core Design Philosophy: -- Dispatch becomes a pure dispatcher, only responsible for "calling subagents" -- Hook is responsible for injecting all context, subagent works autonomously with complete info -- Each agent has a dedicated jsonl file defining its context -- No resume needed, no segmentation, behavior controlled by code not prompt - -Trigger: PreToolUse (before Task tool call) - -Context Source: .trellis/.current-task points to task directory -- implement.jsonl - Implement agent dedicated context -- check.jsonl - Check agent dedicated context -- debug.jsonl - Debug agent dedicated context -- research.jsonl - Research agent dedicated context (optional, usually not needed) -- cr.jsonl - Code review dedicated context -- prd.md - Requirements document -- info.md - Technical design -- codex-review-output.txt - Code Review results -""" - -# IMPORTANT: Suppress all warnings FIRST -import warnings -warnings.filterwarnings("ignore") - -import json -import os -import sys -from pathlib import Path - -# IMPORTANT: Force stdout to use UTF-8 on Windows -# This fixes UnicodeEncodeError when outputting non-ASCII characters -if sys.platform == "win32": - import io as _io - if hasattr(sys.stdout, "reconfigure"): - sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr] - elif hasattr(sys.stdout, "detach"): - sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr] - -# ============================================================================= -# Path Constants (change here to rename directories) -# ============================================================================= - -DIR_WORKFLOW = ".trellis" -DIR_WORKSPACE = "workspace" -DIR_TASKS = "tasks" -DIR_SPEC = "spec" -FILE_CURRENT_TASK = ".current-task" -FILE_TASK_JSON = "task.json" - -# Agents that don't update phase (can be called at any time) -AGENTS_NO_PHASE_UPDATE = {"debug", "research"} - -# ============================================================================= -# Subagent Constants (change here to rename subagent types) -# ============================================================================= - -AGENT_IMPLEMENT = "implement" -AGENT_CHECK = "check" -AGENT_DEBUG = "debug" -AGENT_RESEARCH = "research" - -# Agents that require a task directory -AGENTS_REQUIRE_TASK = (AGENT_IMPLEMENT, AGENT_CHECK, AGENT_DEBUG) -# All supported agents -AGENTS_ALL = (AGENT_IMPLEMENT, AGENT_CHECK, AGENT_DEBUG, AGENT_RESEARCH) - - -def find_repo_root(start_path: str) -> str | None: - """ - Find git repo root from start_path upwards - - Returns: - Repo root path, or None if not found - """ - current = Path(start_path).resolve() - while current != current.parent: - if (current / ".git").exists(): - return str(current) - current = current.parent - return None - - -def get_current_task(repo_root: str) -> str | None: - """ - Read current task directory path from .trellis/.current-task - - Returns: - Task directory relative path (relative to repo_root) - None if not set - """ - current_task_file = os.path.join(repo_root, DIR_WORKFLOW, FILE_CURRENT_TASK) - if not os.path.exists(current_task_file): - return None - - try: - with open(current_task_file, "r", encoding="utf-8") as f: - content = f.read().strip() - if not content: - return None - normalized = content.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - if normalized.startswith("tasks/"): - normalized = f".trellis/{normalized}" - return normalized - except Exception: - return None - - -def update_current_phase(repo_root: str, task_dir: str, subagent_type: str) -> None: - """ - Update current_phase in task.json based on subagent_type. - - This ensures phase tracking is always accurate, regardless of whether - dispatch agent remembers to update it. - - Logic: - - Read next_action array from task.json - - Find the next phase whose action matches subagent_type - - Only move forward, never backward - - Some agents (debug, research) don't update phase - """ - if subagent_type in AGENTS_NO_PHASE_UPDATE: - return - - task_json_path = os.path.join(repo_root, task_dir, FILE_TASK_JSON) - if not os.path.exists(task_json_path): - return - - try: - with open(task_json_path, "r", encoding="utf-8") as f: - task_data = json.load(f) - - current_phase = task_data.get("current_phase", 0) - next_actions = task_data.get("next_action", []) - - # Map action names to subagent types - # "implement" -> "implement", "check" -> "check", "finish" -> "check" - action_to_agent = { - "implement": "implement", - "check": "check", - "finish": "check", # finish uses check agent - } - - # Find the next phase that matches this subagent_type - new_phase = None - for action in next_actions: - phase_num = action.get("phase", 0) - action_name = action.get("action", "") - expected_agent = action_to_agent.get(action_name) - - # Only consider phases after current_phase - if phase_num > current_phase and expected_agent == subagent_type: - new_phase = phase_num - break - - if new_phase is not None: - task_data["current_phase"] = new_phase - - with open(task_json_path, "w", encoding="utf-8") as f: - json.dump(task_data, f, indent=2, ensure_ascii=False) - except Exception: - # Don't fail the hook if phase update fails - pass - - -def read_file_content(base_path: str, file_path: str) -> str | None: - """Read file content, return None if file doesn't exist""" - full_path = os.path.join(base_path, file_path) - if os.path.exists(full_path) and os.path.isfile(full_path): - try: - with open(full_path, "r", encoding="utf-8") as f: - return f.read() - except Exception: - return None - return None - - -def read_directory_contents( - base_path: str, dir_path: str, max_files: int = 20 -) -> list[tuple[str, str]]: - """ - Read all .md files in a directory - - Args: - base_path: Base path (usually repo_root) - dir_path: Directory relative path - max_files: Max files to read (prevent huge directories) - - Returns: - [(file_path, content), ...] - """ - full_path = os.path.join(base_path, dir_path) - if not os.path.exists(full_path) or not os.path.isdir(full_path): - return [] - - results = [] - try: - # Only read .md files, sorted by filename - md_files = sorted( - [ - f - for f in os.listdir(full_path) - if f.endswith(".md") and os.path.isfile(os.path.join(full_path, f)) - ] - ) - - for filename in md_files[:max_files]: - file_full_path = os.path.join(full_path, filename) - relative_path = os.path.join(dir_path, filename) - try: - with open(file_full_path, "r", encoding="utf-8") as f: - content = f.read() - results.append((relative_path, content)) - except Exception: - continue - except Exception: - pass - - return results - - -def read_jsonl_entries(base_path: str, jsonl_path: str) -> list[tuple[str, str]]: - """ - Read all file/directory contents referenced in jsonl file - - Schema: - {"file": "path/to/file.md", "reason": "..."} - {"file": "path/to/dir/", "type": "directory", "reason": "..."} - - Returns: - [(path, content), ...] - """ - full_path = os.path.join(base_path, jsonl_path) - if not os.path.exists(full_path): - return [] - - results = [] - try: - with open(full_path, "r", encoding="utf-8") as f: - for line in f: - line = line.strip() - if not line: - continue - try: - item = json.loads(line) - file_path = item.get("file") or item.get("path") - entry_type = item.get("type", "file") - - if not file_path: - continue - - if entry_type == "directory": - # Read all .md files in directory - dir_contents = read_directory_contents(base_path, file_path) - results.extend(dir_contents) - else: - # Read single file - content = read_file_content(base_path, file_path) - if content: - results.append((file_path, content)) - except json.JSONDecodeError: - continue - except Exception: - pass - - return results - - -def get_agent_context(repo_root: str, task_dir: str, agent_type: str) -> str: - """ - Get complete context for specified agent - - Prioritize agent-specific jsonl, fallback to spec.jsonl if not exists - """ - context_parts = [] - - # 1. Try agent-specific jsonl - agent_jsonl = f"{task_dir}/{agent_type}.jsonl" - agent_entries = read_jsonl_entries(repo_root, agent_jsonl) - - # 2. If agent-specific jsonl doesn't exist or empty, fallback to spec.jsonl - if not agent_entries: - agent_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl") - - # 3. Add all files from jsonl - for file_path, content in agent_entries: - context_parts.append(f"=== {file_path} ===\n{content}") - - return "\n\n".join(context_parts) - - -def get_implement_context(repo_root: str, task_dir: str) -> str: - """ - Complete context for Implement Agent - - Read order: - 1. All files in implement.jsonl (dev specs) - 2. prd.md (requirements) - 3. info.md (technical design) - """ - context_parts = [] - - # 1. Read implement.jsonl (or fallback to spec.jsonl) - base_context = get_agent_context(repo_root, task_dir, "implement") - if base_context: - context_parts.append(base_context) - - # 2. Requirements document - prd_content = read_file_content(repo_root, f"{task_dir}/prd.md") - if prd_content: - context_parts.append(f"=== {task_dir}/prd.md (Requirements) ===\n{prd_content}") - - # 3. Technical design - info_content = read_file_content(repo_root, f"{task_dir}/info.md") - if info_content: - context_parts.append( - f"=== {task_dir}/info.md (Technical Design) ===\n{info_content}" - ) - - return "\n\n".join(context_parts) - - -def get_check_context(repo_root: str, task_dir: str) -> str: - """ - Complete context for Check Agent - - Read order: - 1. All files in check.jsonl (check specs + dev specs) - 2. prd.md (for understanding task intent) - """ - context_parts = [] - - # 1. Read check.jsonl (or fallback to spec.jsonl + hardcoded check files) - check_entries = read_jsonl_entries(repo_root, f"{task_dir}/check.jsonl") - - if check_entries: - for file_path, content in check_entries: - context_parts.append(f"=== {file_path} ===\n{content}") - else: - # Fallback: use hardcoded check files + spec.jsonl - check_files = [ - (".claude/commands/trellis/finish-work.md", "Finish work checklist"), - (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"), - (".claude/commands/trellis/check.md", "Code quality check spec"), - ] - for file_path, description in check_files: - content = read_file_content(repo_root, file_path) - if content: - context_parts.append(f"=== {file_path} ({description}) ===\n{content}") - - # Add spec.jsonl - spec_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl") - for file_path, content in spec_entries: - context_parts.append(f"=== {file_path} (Dev spec) ===\n{content}") - - # 2. Requirements document (for understanding task intent) - prd_content = read_file_content(repo_root, f"{task_dir}/prd.md") - if prd_content: - context_parts.append( - f"=== {task_dir}/prd.md (Requirements - for understanding intent) ===\n{prd_content}" - ) - - return "\n\n".join(context_parts) - - -def get_finish_context(repo_root: str, task_dir: str) -> str: - """ - Complete context for Finish phase (final check before PR) - - Read order: - 1. All files in finish.jsonl (if exists) - 2. Fallback to finish-work.md only (lightweight final check) - 3. update-spec.md (for active spec sync) - 4. prd.md (for verifying requirements are met) - """ - context_parts = [] - - # 1. Try finish.jsonl first - finish_entries = read_jsonl_entries(repo_root, f"{task_dir}/finish.jsonl") - - if finish_entries: - for file_path, content in finish_entries: - context_parts.append(f"=== {file_path} ===\n{content}") - else: - # Fallback: only finish-work.md (lightweight) - finish_work = read_file_content( - repo_root, ".claude/commands/trellis/finish-work.md" - ) - if finish_work: - context_parts.append( - f"=== .claude/commands/trellis/finish-work.md (Finish checklist) ===\n{finish_work}" - ) - - # 2. Spec update process (for active spec sync) - update_spec = read_file_content( - repo_root, ".claude/commands/trellis/update-spec.md" - ) - if update_spec: - context_parts.append( - f"=== .claude/commands/trellis/update-spec.md (Spec update process) ===\n{update_spec}" - ) - - # 3. Requirements document (for verifying requirements are met) - prd_content = read_file_content(repo_root, f"{task_dir}/prd.md") - if prd_content: - context_parts.append( - f"=== {task_dir}/prd.md (Requirements - verify all met) ===\n{prd_content}" - ) - - return "\n\n".join(context_parts) - - -def get_debug_context(repo_root: str, task_dir: str) -> str: - """ - Complete context for Debug Agent - - Read order: - 1. All files in debug.jsonl (specs needed for fixing) - 2. codex-review-output.txt (Codex Review results) - """ - context_parts = [] - - # 1. Read debug.jsonl (or fallback to spec.jsonl + hardcoded check files) - debug_entries = read_jsonl_entries(repo_root, f"{task_dir}/debug.jsonl") - - if debug_entries: - for file_path, content in debug_entries: - context_parts.append(f"=== {file_path} ===\n{content}") - else: - # Fallback: use spec.jsonl + hardcoded check files - spec_entries = read_jsonl_entries(repo_root, f"{task_dir}/spec.jsonl") - for file_path, content in spec_entries: - context_parts.append(f"=== {file_path} (Dev spec) ===\n{content}") - - check_files = [ - (".claude/commands/trellis/check.md", "Code quality check spec"), - (".claude/commands/trellis/check-cross-layer.md", "Cross-layer check spec"), - ] - for file_path, description in check_files: - content = read_file_content(repo_root, file_path) - if content: - context_parts.append(f"=== {file_path} ({description}) ===\n{content}") - - # 2. Codex review output (if exists) - codex_output = read_file_content(repo_root, f"{task_dir}/codex-review-output.txt") - if codex_output: - context_parts.append( - f"=== {task_dir}/codex-review-output.txt (Codex Review Results) ===\n{codex_output}" - ) - - return "\n\n".join(context_parts) - - -def build_implement_prompt(original_prompt: str, context: str) -> str: - """Build complete prompt for Implement""" - return f"""# Implement Agent Task - -You are the Implement Agent in the Multi-Agent Pipeline. - -## Your Context - -All the information you need has been prepared for you: - -{context} - ---- - -## Your Task - -{original_prompt} - ---- - -## Workflow - -1. **Understand specs** - All dev specs are injected above, understand them -2. **Understand requirements** - Read requirements document and technical design -3. **Implement feature** - Implement following specs and design -4. **Self-check** - Ensure code quality against check specs - -## Important Constraints - -- Do NOT execute git commit, only code modifications -- Follow all dev specs injected above -- Report list of modified/created files when done""" - - -def build_check_prompt(original_prompt: str, context: str) -> str: - """Build complete prompt for Check""" - return f"""# Check Agent Task - -You are the Check Agent in the Multi-Agent Pipeline (code and cross-layer checker). - -## Your Context - -All check specs and dev specs you need: - -{context} - ---- - -## Your Task - -{original_prompt} - ---- - -## Workflow - -1. **Get changes** - Run `git diff --name-only` and `git diff` to get code changes -2. **Check against specs** - Check item by item against specs above -3. **Self-fix** - Fix issues directly, don't just report -4. **Run verification** - Run project's lint and typecheck commands - -## Important Constraints - -- Fix issues yourself, don't just report -- Must execute complete checklist in check specs -- Pay special attention to impact radius analysis (L1-L5)""" - - -def build_finish_prompt(original_prompt: str, context: str) -> str: - """Build complete prompt for Finish (final check before PR)""" - return f"""# Finish Agent Task - -You are performing the final check before creating a PR. - -## Your Context - -Finish checklist and requirements: - -{context} - ---- - -## Your Task - -{original_prompt} - ---- - -## Workflow - -1. **Review changes** - Run `git diff --name-only` to see all changed files -2. **Verify requirements** - Check each requirement in prd.md is implemented -3. **Spec sync** - Analyze whether changes introduce new patterns, contracts, or conventions - - If new pattern/convention found: read target spec file → update it → update index.md if needed - - If infra/cross-layer change: follow the 7-section mandatory template from update-spec.md - - If pure code fix with no new patterns: skip this step -4. **Run final checks** - Execute lint and typecheck -5. **Confirm ready** - Ensure code is ready for PR - -## Important Constraints - -- You MAY update spec files when gaps are detected (use update-spec.md as guide) -- MUST read the target spec file BEFORE editing (avoid duplicating existing content) -- Do NOT update specs for trivial changes (typos, formatting, obvious fixes) -- If critical CODE issues found, report them clearly (fix specs, not code) -- Verify all acceptance criteria in prd.md are met""" - - -def build_debug_prompt(original_prompt: str, context: str) -> str: - """Build complete prompt for Debug""" - return f"""# Debug Agent Task - -You are the Debug Agent in the Multi-Agent Pipeline (issue fixer). - -## Your Context - -Dev specs and Codex Review results: - -{context} - ---- - -## Your Task - -{original_prompt} - ---- - -## Workflow - -1. **Understand issues** - Analyze issues pointed out in Codex Review -2. **Locate code** - Find positions that need fixing -3. **Fix against specs** - Fix issues following dev specs -4. **Verify fixes** - Run typecheck to ensure no new issues - -## Important Constraints - -- Do NOT execute git commit, only code modifications -- Run typecheck after each fix to verify -- Report which issues were fixed and which files were modified""" - - -def get_research_context(repo_root: str, task_dir: str | None) -> str: - """ - Context for Research Agent - - Research doesn't need much preset context, only needs: - 1. Project structure overview (where spec directories are) - 2. Optional research.jsonl (if there are specific search needs) - """ - context_parts = [] - - # 1. Project structure overview (dynamically discover spec directories) - spec_path = f"{DIR_WORKFLOW}/{DIR_SPEC}" - spec_root = Path(repo_root) / DIR_WORKFLOW / DIR_SPEC - - # Build spec tree dynamically - tree_lines = [f"{spec_path}/"] - if spec_root.is_dir(): - pkg_dirs = sorted(d for d in spec_root.iterdir() if d.is_dir()) - for i, pkg_dir in enumerate(pkg_dirs): - is_last = i == len(pkg_dirs) - 1 - prefix = "└── " if is_last else "├── " - layers = sorted(d.name for d in pkg_dir.iterdir() if d.is_dir()) - layer_info = f" ({', '.join(layers)})" if layers else "" - tree_lines.append(f"{prefix}{pkg_dir.name}/{layer_info}") - - spec_tree = "\n".join(tree_lines) - - project_structure = f"""## Project Spec Directory Structure - -``` -{spec_tree} -``` - -To get structured package info, run: `python3 ./{DIR_WORKFLOW}/scripts/get_context.py --mode packages` - -## Search Tips - -- Spec files: `{spec_path}/**/*.md` -- Code search: Use Glob and Grep tools -- Tech solutions: Use mcp__exa__web_search_exa or mcp__exa__get_code_context_exa""" - - context_parts.append(project_structure) - - # 2. If task directory exists, try reading research.jsonl (optional) - if task_dir: - research_entries = read_jsonl_entries(repo_root, f"{task_dir}/research.jsonl") - if research_entries: - context_parts.append( - "\n## Additional Search Context (from research.jsonl)\n" - ) - for file_path, content in research_entries: - context_parts.append(f"=== {file_path} ===\n{content}") - - return "\n\n".join(context_parts) - - -def build_research_prompt(original_prompt: str, context: str) -> str: - """Build complete prompt for Research""" - return f"""# Research Agent Task - -You are the Research Agent in the Multi-Agent Pipeline (search researcher). - -## Core Principle - -**You do one thing: find and explain information.** - -You are a documenter, not a reviewer. - -## Project Info - -{context} - ---- - -## Your Task - -{original_prompt} - ---- - -## Workflow - -1. **Understand query** - Determine search type (internal/external) and scope -2. **Plan search** - List search steps for complex queries -3. **Execute search** - Execute multiple independent searches in parallel -4. **Organize results** - Output structured report - -## Search Tools - -| Tool | Purpose | -|------|---------| -| Glob | Search by filename pattern | -| Grep | Search by content | -| Read | Read file content | -| mcp__exa__web_search_exa | External web search | -| mcp__exa__get_code_context_exa | External code/doc search | - -## Strict Boundaries - -**Only allowed**: Describe what exists, where it is, how it works - -**Forbidden** (unless explicitly asked): -- Suggest improvements -- Criticize implementation -- Recommend refactoring -- Modify any files - -## Report Format - -Provide structured search results including: -- List of files found (with paths) -- Code pattern analysis (if applicable) -- Related spec documents -- External references (if any)""" - - -def main(): - try: - input_data = json.load(sys.stdin) - except json.JSONDecodeError: - sys.exit(0) - - tool_name = input_data.get("tool_name", "") - - if tool_name not in ("Task", "Agent"): - sys.exit(0) - - tool_input = input_data.get("tool_input", {}) - subagent_type = tool_input.get("subagent_type", "") - original_prompt = tool_input.get("prompt", "") - cwd = input_data.get("cwd", os.getcwd()) - - # Only handle subagent types we care about - if subagent_type not in AGENTS_ALL: - sys.exit(0) - - # Find repo root - repo_root = find_repo_root(cwd) - if not repo_root: - sys.exit(0) - - # Get current task directory (research doesn't require it) - task_dir = get_current_task(repo_root) - - # implement/check/debug need task directory - if subagent_type in AGENTS_REQUIRE_TASK: - if not task_dir: - sys.exit(0) - # Check if task directory exists - task_dir_full = os.path.join(repo_root, task_dir) - if not os.path.exists(task_dir_full): - sys.exit(0) - - # Update current_phase in task.json (system-level enforcement) - update_current_phase(repo_root, task_dir, subagent_type) - - # Check for [finish] marker in prompt (check agent with finish context) - is_finish_phase = "[finish]" in original_prompt.lower() - - # Get context and build prompt based on subagent type - if subagent_type == AGENT_IMPLEMENT: - assert task_dir is not None # validated above - context = get_implement_context(repo_root, task_dir) - new_prompt = build_implement_prompt(original_prompt, context) - elif subagent_type == AGENT_CHECK: - assert task_dir is not None # validated above - if is_finish_phase: - # Finish phase: use finish context (lighter, focused on final verification) - context = get_finish_context(repo_root, task_dir) - new_prompt = build_finish_prompt(original_prompt, context) - else: - # Regular check phase: use check context (full specs for self-fix loop) - context = get_check_context(repo_root, task_dir) - new_prompt = build_check_prompt(original_prompt, context) - elif subagent_type == AGENT_DEBUG: - assert task_dir is not None # validated above - context = get_debug_context(repo_root, task_dir) - new_prompt = build_debug_prompt(original_prompt, context) - elif subagent_type == AGENT_RESEARCH: - # Research can work without task directory - context = get_research_context(repo_root, task_dir) - new_prompt = build_research_prompt(original_prompt, context) - else: - sys.exit(0) - - if not context: - sys.exit(0) - - # Return updated input with correct Claude Code PreToolUse format - output = { - "hookSpecificOutput": { - "hookEventName": "PreToolUse", - "permissionDecision": "allow", - "updatedInput": {**tool_input, "prompt": new_prompt}, - } - } - - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - - -if __name__ == "__main__": - main() diff --git a/.claude/hooks/ralph-loop.py b/.claude/hooks/ralph-loop.py deleted file mode 100644 index 3f903610..00000000 --- a/.claude/hooks/ralph-loop.py +++ /dev/null @@ -1,396 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Ralph Loop - SubagentStop Hook for Check Agent Loop Control - -Based on the Ralph Wiggum technique for autonomous agent loops. -Uses completion promises to control when the check agent can stop. - -Mechanism: -- Intercepts when check subagent tries to stop (SubagentStop event) -- If verify commands configured in worktree.yaml, runs them to verify -- Otherwise, reads check.jsonl to get dynamic completion markers ({reason}_FINISH) -- Blocks stopping until verification passes or all markers found -- Has max iterations as safety limit - -State file: .trellis/.ralph-state.json -- Tracks current iteration count per session -- Resets when task changes -""" - -# IMPORTANT: Suppress all warnings FIRST -import warnings -warnings.filterwarnings("ignore") - -import json -import os -import subprocess -import sys -from datetime import datetime -from pathlib import Path - -# IMPORTANT: Force stdout to use UTF-8 on Windows -# This fixes UnicodeEncodeError when outputting non-ASCII characters -if sys.platform == "win32": - import io as _io - if hasattr(sys.stdout, "reconfigure"): - sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr] - elif hasattr(sys.stdout, "detach"): - sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr] - -# ============================================================================= -# Configuration -# ============================================================================= - -MAX_ITERATIONS = 5 # Safety limit to prevent infinite loops -STATE_TIMEOUT_MINUTES = 30 # Reset state if older than this -STATE_FILE = ".trellis/.ralph-state.json" -WORKTREE_YAML = ".trellis/worktree.yaml" -DIR_WORKFLOW = ".trellis" -FILE_CURRENT_TASK = ".current-task" - -# Only control loop for check agent -TARGET_AGENT = "check" - - -def find_repo_root(start_path: str) -> str | None: - """Find git repo root from start_path upwards""" - current = Path(start_path).resolve() - while current != current.parent: - if (current / ".git").exists(): - return str(current) - current = current.parent - return None - - -def get_current_task(repo_root: str) -> str | None: - """Read current task directory path""" - current_task_file = os.path.join(repo_root, DIR_WORKFLOW, FILE_CURRENT_TASK) - if not os.path.exists(current_task_file): - return None - - try: - with open(current_task_file, "r", encoding="utf-8") as f: - content = f.read().strip() - if not content: - return None - normalized = content.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - if normalized.startswith("tasks/"): - normalized = f".trellis/{normalized}" - return normalized - except Exception: - return None - - -def get_verify_commands(repo_root: str) -> list[str]: - """ - Read verify commands from worktree.yaml. - - Returns list of commands to run, or empty list if not configured. - Uses simple YAML parsing without external dependencies. - """ - yaml_path = os.path.join(repo_root, WORKTREE_YAML) - if not os.path.exists(yaml_path): - return [] - - try: - with open(yaml_path, "r", encoding="utf-8") as f: - content = f.read() - - # Simple YAML parsing for verify section - # Look for "verify:" followed by list items - lines = content.split("\n") - in_verify_section = False - commands = [] - - for line in lines: - stripped = line.strip() - - # Check for section start - if stripped.startswith("verify:"): - in_verify_section = True - continue - - # Check for new section (not indented, ends with :) - if ( - not line.startswith(" ") - and not line.startswith("\t") - and stripped.endswith(":") - and stripped != "" - ): - in_verify_section = False - continue - - # If in verify section, look for list items - if in_verify_section: - # Skip comments and empty lines - if stripped.startswith("#") or stripped == "": - continue - # Parse list item (- command) - if stripped.startswith("- "): - cmd = stripped[2:].strip() - if cmd: - commands.append(cmd) - - return commands - except Exception: - return [] - - -def run_verify_commands(repo_root: str, commands: list[str]) -> tuple[bool, str]: - """ - Run verify commands and return (success, message). - - All commands must pass for success. - """ - for cmd in commands: - try: - result = subprocess.run( - cmd, - shell=True, - cwd=repo_root, - capture_output=True, - timeout=120, # 2 minute timeout per command - ) - if result.returncode != 0: - stderr = result.stderr.decode("utf-8", errors="replace") - stdout = result.stdout.decode("utf-8", errors="replace") - error_output = stderr or stdout - # Truncate long output - if len(error_output) > 500: - error_output = error_output[:500] + "..." - return False, f"Command failed: {cmd}\n{error_output}" - except subprocess.TimeoutExpired: - return False, f"Command timed out: {cmd}" - except Exception as e: - return False, f"Command error: {cmd} - {str(e)}" - - return True, "All verify commands passed" - - -def get_completion_markers(repo_root: str, task_dir: str) -> list[str]: - """ - Read check.jsonl and generate completion markers from reasons. - - Each entry's "reason" field becomes {REASON}_FINISH marker. - Example: {"file": "...", "reason": "TypeCheck"} -> "TYPECHECK_FINISH" - """ - check_jsonl_path = os.path.join(repo_root, task_dir, "check.jsonl") - markers = [] - - if not os.path.exists(check_jsonl_path): - # Fallback: if no check.jsonl, use default marker - return ["ALL_CHECKS_FINISH"] - - try: - with open(check_jsonl_path, "r", encoding="utf-8") as f: - for line in f: - line = line.strip() - if not line: - continue - try: - item = json.loads(line) - reason = item.get("reason", "") - if reason: - # Convert to uppercase and add _FINISH suffix - marker = f"{reason.upper().replace(' ', '_')}_FINISH" - if marker not in markers: - markers.append(marker) - except json.JSONDecodeError: - continue - except Exception: - pass - - # If no markers found, use default - if not markers: - markers = ["ALL_CHECKS_FINISH"] - - return markers - - -def load_state(repo_root: str) -> dict: - """Load Ralph Loop state from file""" - state_path = os.path.join(repo_root, STATE_FILE) - if not os.path.exists(state_path): - return {"task": None, "iteration": 0, "started_at": None} - - try: - with open(state_path, "r", encoding="utf-8") as f: - return json.load(f) - except Exception: - return {"task": None, "iteration": 0, "started_at": None} - - -def save_state(repo_root: str, state: dict) -> None: - """Save Ralph Loop state to file""" - state_path = os.path.join(repo_root, STATE_FILE) - try: - # Ensure directory exists - os.makedirs(os.path.dirname(state_path), exist_ok=True) - with open(state_path, "w", encoding="utf-8") as f: - json.dump(state, f, indent=2, ensure_ascii=False) - except Exception: - pass - - -def check_completion(agent_output: str, markers: list[str]) -> tuple[bool, list[str]]: - """ - Check if all completion markers are present in agent output. - - Returns: - (all_complete, missing_markers) - """ - missing = [] - for marker in markers: - if marker not in agent_output: - missing.append(marker) - - return len(missing) == 0, missing - - -def main(): - try: - input_data = json.load(sys.stdin) - except json.JSONDecodeError: - # If can't parse input, allow stop - sys.exit(0) - - # Get event info - hook_event = input_data.get("hook_event_name", "") - - # Only handle SubagentStop event - if hook_event != "SubagentStop": - sys.exit(0) - - # Get subagent info - # Field names per Claude Code SubagentStop event schema: - # agent_type, last_assistant_message, agent_id, agent_transcript_path, cwd - # The event does NOT carry a `prompt` field, so finish-phase detection - # based on a `[finish]` marker in the user prompt is no longer possible - # here; finish-phase skip logic should be reintroduced via task.json - # state (e.g. current_phase) in a follow-up. - agent_type = input_data.get("agent_type", "") - last_assistant_message = input_data.get("last_assistant_message", "") - cwd = input_data.get("cwd", os.getcwd()) - - # Only control check agent - if agent_type != TARGET_AGENT: - sys.exit(0) - - # Find repo root - repo_root = find_repo_root(cwd) - if not repo_root: - sys.exit(0) - - # Get current task - task_dir = get_current_task(repo_root) - if not task_dir: - sys.exit(0) - - # Load state - state = load_state(repo_root) - - # Reset state if task changed or state is too old - should_reset = False - if state.get("task") != task_dir: - should_reset = True - elif state.get("started_at"): - try: - started = datetime.fromisoformat(state["started_at"]) - if (datetime.now() - started).total_seconds() > STATE_TIMEOUT_MINUTES * 60: - should_reset = True - except (ValueError, TypeError): - should_reset = True - - if should_reset: - state = { - "task": task_dir, - "iteration": 0, - "started_at": datetime.now().isoformat(), - } - - # Increment iteration - state["iteration"] = state.get("iteration", 0) + 1 - current_iteration = state["iteration"] - - # Save state - save_state(repo_root, state) - - # Safety check: max iterations - if current_iteration >= MAX_ITERATIONS: - # Allow stop, reset state for next run - state["iteration"] = 0 - save_state(repo_root, state) - output = { - "decision": "allow", - "reason": f"Max iterations ({MAX_ITERATIONS}) reached. Stopping to prevent infinite loop.", - } - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - - # Check if verify commands are configured - verify_commands = get_verify_commands(repo_root) - - if verify_commands: - # Use programmatic verification - passed, message = run_verify_commands(repo_root, verify_commands) - - if passed: - # All verify commands passed, allow stop - state["iteration"] = 0 - save_state(repo_root, state) - output = { - "decision": "allow", - "reason": "All verify commands passed. Check phase complete.", - } - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - else: - # Verification failed, block stop - output = { - "decision": "block", - "reason": f"Iteration {current_iteration}/{MAX_ITERATIONS}. Verification failed:\n{message}\n\nPlease fix the issues and try again.", - } - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - else: - # No verify commands, fall back to completion markers - markers = get_completion_markers(repo_root, task_dir) - all_complete, missing = check_completion(last_assistant_message, markers) - - if all_complete: - # All checks complete, allow stop - state["iteration"] = 0 - save_state(repo_root, state) - output = { - "decision": "allow", - "reason": "All completion markers found. Check phase complete.", - } - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - else: - # Missing markers, block stop and continue - output = { - "decision": "block", - "reason": f"""Iteration {current_iteration}/{MAX_ITERATIONS}. Missing completion markers: {", ".join(missing)}. - -IMPORTANT: You must ACTUALLY run the checks, not just output the markers. -- Did you run lint? What was the output? -- Did you run typecheck? What was the output? -- Did they actually pass with zero errors? - -Only output a marker (e.g., LINT_FINISH) AFTER: -1. You have executed the corresponding command -2. The command completed with zero errors -3. You have shown the command output in your response - -Do NOT output markers just to escape the loop. The loop exists to ensure quality.""", - } - print(json.dumps(output, ensure_ascii=False)) - sys.exit(0) - - -if __name__ == "__main__": - main() diff --git a/.claude/hooks/session-start.py b/.claude/hooks/session-start.py deleted file mode 100644 index 37e920df..00000000 --- a/.claude/hooks/session-start.py +++ /dev/null @@ -1,414 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Session Start Hook - Inject structured context -""" - -# IMPORTANT: Suppress all warnings FIRST -import warnings -warnings.filterwarnings("ignore") - -import json -import os -import subprocess -import sys -from io import StringIO -from pathlib import Path - -# IMPORTANT: Force stdout to use UTF-8 on Windows -# This fixes UnicodeEncodeError when outputting non-ASCII characters -if sys.platform == "win32": - import io as _io - if hasattr(sys.stdout, "reconfigure"): - sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr] - elif hasattr(sys.stdout, "detach"): - sys.stdout = _io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8", errors="replace") # type: ignore[union-attr] - - -def should_skip_injection() -> bool: - return ( - os.environ.get("CLAUDE_NON_INTERACTIVE") == "1" - or os.environ.get("OPENCODE_NON_INTERACTIVE") == "1" - ) - - -def read_file(path: Path, fallback: str = "") -> str: - try: - return path.read_text(encoding="utf-8") - except (FileNotFoundError, PermissionError): - return fallback - - -def run_script(script_path: Path) -> str: - try: - if script_path.suffix == ".py": - # Add PYTHONIOENCODING to force UTF-8 in subprocess - env = os.environ.copy() - env["PYTHONIOENCODING"] = "utf-8" - cmd = [sys.executable, "-W", "ignore", str(script_path)] - else: - env = os.environ - cmd = [str(script_path)] - - result = subprocess.run( - cmd, - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - timeout=5, - cwd=script_path.parent.parent.parent, - env=env, - ) - return result.stdout if result.returncode == 0 else "No context available" - except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError): - return "No context available" - - -def _normalize_task_ref(task_ref: str) -> str: - normalized = task_ref.strip() - if not normalized: - return "" - - path_obj = Path(normalized) - if path_obj.is_absolute(): - return str(path_obj) - - normalized = normalized.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - - if normalized.startswith("tasks/"): - return f".trellis/{normalized}" - - return normalized - - -def _resolve_task_dir(trellis_dir: Path, task_ref: str) -> Path: - normalized = _normalize_task_ref(task_ref) - path_obj = Path(normalized) - if path_obj.is_absolute(): - return path_obj - if normalized.startswith(".trellis/"): - return trellis_dir.parent / path_obj - return trellis_dir / "tasks" / path_obj - - -def _get_task_status(trellis_dir: Path) -> str: - """Check current task status and return structured status string.""" - current_task_file = trellis_dir / ".current-task" - if not current_task_file.is_file(): - return "Status: NO ACTIVE TASK\nNext: Describe what you want to work on" - - task_ref = _normalize_task_ref(current_task_file.read_text(encoding="utf-8").strip()) - if not task_ref: - return "Status: NO ACTIVE TASK\nNext: Describe what you want to work on" - - # Resolve task directory - task_dir = _resolve_task_dir(trellis_dir, task_ref) - if not task_dir.is_dir(): - return f"Status: STALE POINTER\nTask: {task_ref}\nNext: Task directory not found. Run: python3 ./.trellis/scripts/task.py finish" - - # Read task.json - task_json_path = task_dir / "task.json" - task_data = {} - if task_json_path.is_file(): - try: - task_data = json.loads(task_json_path.read_text(encoding="utf-8")) - except (json.JSONDecodeError, PermissionError): - pass - - task_title = task_data.get("title", task_ref) - task_status = task_data.get("status", "unknown") - - if task_status == "completed": - return f"Status: COMPLETED\nTask: {task_title}\nNext: Archive with `python3 ./.trellis/scripts/task.py archive {task_dir.name}` or start a new task" - - # Check if context is configured (jsonl files exist and non-empty) - has_context = False - for jsonl_name in ("implement.jsonl", "check.jsonl", "spec.jsonl"): - jsonl_path = task_dir / jsonl_name - if jsonl_path.is_file() and jsonl_path.stat().st_size > 0: - has_context = True - break - - has_prd = (task_dir / "prd.md").is_file() - - if not has_prd: - return f"Status: NOT READY\nTask: {task_title}\nMissing: prd.md not created\nNext: Write PRD, then research → init-context → start" - - if not has_context: - return f"Status: NOT READY\nTask: {task_title}\nMissing: Context not configured (no jsonl files)\nNext: Complete Phase 2 (research → init-context → start) before implementing" - - return f"Status: READY\nTask: {task_title}\nNext: Continue with implement or check" - - -def _load_trellis_config(trellis_dir: Path) -> tuple: - """Load Trellis config for session-start decisions. - - Returns: - (is_mono, packages_dict, spec_scope, task_pkg, default_pkg) - """ - scripts_dir = trellis_dir / "scripts" - if str(scripts_dir) not in sys.path: - sys.path.insert(0, str(scripts_dir)) - - try: - from common.config import get_default_package, get_packages, get_spec_scope, is_monorepo # type: ignore[import-not-found] - from common.paths import get_current_task # type: ignore[import-not-found] - - repo_root = trellis_dir.parent - is_mono = is_monorepo(repo_root) - packages = get_packages(repo_root) or {} - scope = get_spec_scope(repo_root) - - # Get active task's package - task_pkg = None - current = get_current_task(repo_root) - if current: - task_json = repo_root / current / "task.json" - if task_json.is_file(): - try: - data = json.loads(task_json.read_text(encoding="utf-8")) - if isinstance(data, dict): - tp = data.get("package") - if isinstance(tp, str) and tp: - task_pkg = tp - except (json.JSONDecodeError, OSError): - pass - - default_pkg = get_default_package(repo_root) - return is_mono, packages, scope, task_pkg, default_pkg - except Exception: - return False, {}, None, None, None - - -def _check_legacy_spec(trellis_dir: Path, is_mono: bool, packages: dict) -> str | None: - """Check for legacy spec directory structure in monorepo. - - Returns warning message if legacy structure detected, None otherwise. - """ - if not is_mono or not packages: - return None - - spec_dir = trellis_dir / "spec" - if not spec_dir.is_dir(): - return None - - # Check for legacy flat spec dirs (spec/backend/, spec/frontend/ with index.md) - has_legacy = False - for legacy_name in ("backend", "frontend"): - legacy_dir = spec_dir / legacy_name - if legacy_dir.is_dir() and (legacy_dir / "index.md").is_file(): - has_legacy = True - break - - if not has_legacy: - return None - - # Check which packages are missing spec/<pkg>/ directory - missing = [ - name for name in sorted(packages.keys()) - if not (spec_dir / name).is_dir() - ] - - if not missing: - return None # All packages have spec dirs - - if len(missing) == len(packages): - return ( - f"[!] Legacy spec structure detected: found `spec/backend/` or `spec/frontend/` " - f"but no package-scoped `spec/<package>/` directories.\n" - f"Monorepo packages: {', '.join(sorted(packages.keys()))}\n" - f"Please reorganize: `spec/backend/` -> `spec/<package>/backend/`" - ) - return ( - f"[!] Partial spec migration detected: packages {', '.join(missing)} " - f"still missing `spec/<pkg>/` directory.\n" - f"Please complete migration for all packages." - ) - - -def _resolve_spec_scope( - is_mono: bool, - packages: dict, - scope, - task_pkg: str | None, - default_pkg: str | None, -) -> set | None: - """Resolve which packages should have their specs injected. - - Returns: - Set of package names to include, or None for full scan. - """ - if not is_mono or not packages: - return None # Single-repo: full scan - - if scope is None: - return None # No scope configured: full scan - - if isinstance(scope, str) and scope == "active_task": - if task_pkg and task_pkg in packages: - return {task_pkg} - if default_pkg and default_pkg in packages: - return {default_pkg} - return None # Fallback to full scan - - if isinstance(scope, list): - valid = set() - for entry in scope: - if entry in packages: - valid.add(entry) - else: - print( - f"Warning: spec_scope contains unknown package: {entry}, ignoring", - file=sys.stderr, - ) - - if valid: - # Warn if active task is out of scope - if task_pkg and task_pkg not in valid: - print( - f"Warning: active task package '{task_pkg}' is out of configured spec_scope", - file=sys.stderr, - ) - return valid - - # All entries invalid: fallback chain - print( - "Warning: all spec_scope entries invalid, falling back to task/default/full", - file=sys.stderr, - ) - if task_pkg and task_pkg in packages: - return {task_pkg} - if default_pkg and default_pkg in packages: - return {default_pkg} - return None # Full scan - - return None # Unknown scope type: full scan - - -def _build_workflow_toc(workflow_path: Path) -> str: - """Build a compact section index for workflow.md (lazy-load the full file on demand). - - Replaces full-file injection to keep additionalContext payload small. - The full file is accessible via: Read tool on .trellis/workflow.md - """ - content = read_file(workflow_path) - if not content: - return "No workflow.md found" - - toc_lines = [ - "# Development Workflow — Section Index", - "Full guide: .trellis/workflow.md (read on demand)", - "", - ] - for line in content.splitlines(): - if line.startswith("## "): - toc_lines.append(line) - - toc_lines += [ - "", - "To read a section: use the Read tool on .trellis/workflow.md", - ] - return "\n".join(toc_lines) - - -def main(): - if should_skip_injection(): - sys.exit(0) - - project_dir = Path(os.environ.get("CLAUDE_PROJECT_DIR", ".")).resolve() - trellis_dir = project_dir / ".trellis" - - # Load config for scope filtering and legacy detection - is_mono, packages, scope_config, task_pkg, default_pkg = _load_trellis_config(trellis_dir) - allowed_pkgs = _resolve_spec_scope(is_mono, packages, scope_config, task_pkg, default_pkg) - - output = StringIO() - - output.write("""<session-context> -You are starting a new session in a Trellis-managed project. -Read and follow all instructions below carefully. -</session-context> - -""") - - # Legacy migration warning - legacy_warning = _check_legacy_spec(trellis_dir, is_mono, packages) - if legacy_warning: - output.write(f"<migration-warning>\n{legacy_warning}\n</migration-warning>\n\n") - - output.write("<current-state>\n") - context_script = trellis_dir / "scripts" / "get_context.py" - output.write(run_script(context_script)) - output.write("\n</current-state>\n\n") - - output.write("<workflow>\n") - output.write(_build_workflow_toc(trellis_dir / "workflow.md")) - output.write("\n</workflow>\n\n") - - output.write("<guidelines>\n") - output.write("**Note**: The guidelines below are index files — they list available guideline documents and their locations.\n") - output.write("During actual development, you MUST read the specific guideline files listed in each index's Pre-Development Checklist.\n\n") - - spec_dir = trellis_dir / "spec" - if spec_dir.is_dir(): - for sub in sorted(spec_dir.iterdir()): - if not sub.is_dir() or sub.name.startswith("."): - continue - - # Always include guides/ regardless of scope - if sub.name == "guides": - index_file = sub / "index.md" - if index_file.is_file(): - output.write(f"## {sub.name}\n") - output.write(read_file(index_file)) - output.write("\n\n") - continue - - index_file = sub / "index.md" - if index_file.is_file(): - # Flat spec dir (single-repo layer like spec/backend/) - output.write(f"## {sub.name}\n") - output.write(read_file(index_file)) - output.write("\n\n") - else: - # Nested package dirs (monorepo: spec/<pkg>/<layer>/index.md) - # Apply scope filter - if allowed_pkgs is not None and sub.name not in allowed_pkgs: - continue - for nested in sorted(sub.iterdir()): - if not nested.is_dir(): - continue - nested_index = nested / "index.md" - if nested_index.is_file(): - output.write(f"## {sub.name}/{nested.name}\n") - output.write(read_file(nested_index)) - output.write("\n\n") - - output.write("</guidelines>\n\n") - - # Check task status and inject structured tag - task_status = _get_task_status(trellis_dir) - output.write(f"<task-status>\n{task_status}\n</task-status>\n\n") - - output.write("""<ready> -Context loaded. Workflow index, project state, and guidelines are already injected above — do NOT re-read them. -Wait for the user's first message, then handle it following the workflow guide. -If there is an active task, ask whether to continue it. -</ready>""") - - result = { - "hookSpecificOutput": { - "hookEventName": "SessionStart", - "additionalContext": output.getvalue(), - } - } - - # Output JSON - stdout is already configured for UTF-8 - print(json.dumps(result, ensure_ascii=False), flush=True) - - -if __name__ == "__main__": - main() diff --git a/.claude/hooks/statusline.py b/.claude/hooks/statusline.py deleted file mode 100644 index a91ef1ce..00000000 --- a/.claude/hooks/statusline.py +++ /dev/null @@ -1,218 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Trellis StatusLine — project-level status display for Claude Code. - -Reads Claude Code session JSON from stdin + Trellis task data from filesystem. -Outputs 1-2 lines: - With active task: [P1] Task title (status) + info line - Without task: info line only -Info line: model · ctx% · branch · duration · developer · tasks · rate limits -""" -from __future__ import annotations - -import io -import json -import re -import subprocess -import sys -from pathlib import Path - -# Fix: Windows Python defaults to GBK encoding, which corrupts UTF-8 -# characters like the middle dot (·). Wrap stdout/stderr with UTF-8. -if sys.platform == "win32": - sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding="utf-8") - sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding="utf-8") - - -def _read_text(path: Path) -> str: - try: - return path.read_text(encoding="utf-8").strip() - except (FileNotFoundError, PermissionError, OSError): - return "" - - -def _read_json(path: Path) -> dict: - text = _read_text(path) - if not text: - return {} - try: - return json.loads(text) - except (json.JSONDecodeError, ValueError): - return {} - - -def _normalize_task_ref(task_ref: str) -> str: - normalized = task_ref.strip() - if not normalized: - return "" - - path_obj = Path(normalized) - if path_obj.is_absolute(): - return str(path_obj) - - normalized = normalized.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - - if normalized.startswith("tasks/"): - return f".trellis/{normalized}" - - return normalized - - -def _resolve_task_dir(trellis_dir: Path, task_ref: str) -> Path: - normalized = _normalize_task_ref(task_ref) - path_obj = Path(normalized) - if path_obj.is_absolute(): - return path_obj - if normalized.startswith(".trellis/"): - return trellis_dir.parent / path_obj - return trellis_dir / "tasks" / path_obj - - -def _find_trellis_dir() -> Path | None: - """Walk up from cwd to find .trellis/ directory.""" - current = Path.cwd() - for parent in [current, *current.parents]: - candidate = parent / ".trellis" - if candidate.is_dir(): - return candidate - return None - - -def _get_current_task(trellis_dir: Path) -> dict | None: - """Load current task info. Returns dict with title/status/priority or None.""" - task_ref = _normalize_task_ref(_read_text(trellis_dir / ".current-task")) - if not task_ref: - return None - - # Resolve task directory - task_path = _resolve_task_dir(trellis_dir, task_ref) - task_data = _read_json(task_path / "task.json") - if not task_data: - return None - - return { - "title": task_data.get("title") or task_data.get("name") or "unknown", - "status": task_data.get("status", "unknown"), - "priority": task_data.get("priority", "P2"), - } - - -def _count_active_tasks(trellis_dir: Path) -> int: - """Count non-archived task directories with valid task.json.""" - tasks_dir = trellis_dir / "tasks" - if not tasks_dir.is_dir(): - return 0 - count = 0 - for d in tasks_dir.iterdir(): - if d.is_dir() and d.name != "archive" and (d / "task.json").is_file(): - count += 1 - return count - - -def _get_developer(trellis_dir: Path) -> str: - content = _read_text(trellis_dir / ".developer") - if not content: - return "unknown" - for line in content.splitlines(): - if line.startswith("name="): - return line[5:].strip() - return content.splitlines()[0].strip() or "unknown" - - -def _get_git_branch() -> str: - try: - result = subprocess.run( - ["git", "branch", "--show-current"], - capture_output=True, text=True, timeout=3, - ) - return result.stdout.strip() if result.returncode == 0 else "" - except (FileNotFoundError, subprocess.TimeoutExpired): - return "" - - -def _format_ctx_size(size: int) -> str: - if size >= 1_000_000: - return f"{size // 1_000_000}M" - if size >= 1_000: - return f"{size // 1_000}K" - return str(size) - - -def _format_duration(ms: int) -> str: - secs = ms // 1000 - hours, remainder = divmod(secs, 3600) - mins = remainder // 60 - if hours > 0: - return f"{hours}h{mins}m" - return f"{mins}m" - - -def main() -> None: - # Read Claude Code session JSON from stdin - try: - cc_data = json.loads(sys.stdin.read()) - except (json.JSONDecodeError, ValueError): - cc_data = {} - - trellis_dir = _find_trellis_dir() - SEP = " \033[90m·\033[0m " - - # --- Trellis data --- - task = _get_current_task(trellis_dir) if trellis_dir else None - dev = _get_developer(trellis_dir) if trellis_dir else "" - task_count = _count_active_tasks(trellis_dir) if trellis_dir else 0 - - # --- CC session data --- - model = cc_data.get("model", {}).get("display_name", "?") - ctx_pct = int(cc_data.get("context_window", {}).get("used_percentage") or 0) - ctx_size = _format_ctx_size(cc_data.get("context_window", {}).get("context_window_size") or 0) - duration = _format_duration(cc_data.get("cost", {}).get("total_duration_ms") or 0) - branch = _get_git_branch() - - # Avoid "Opus 4.6 (1M context) (1M)" - if re.search(r"\d+[KMG]\b", model, re.IGNORECASE): - model_label = model - else: - model_label = f"{model} ({ctx_size})" - - # Context % with color - if ctx_pct >= 90: - ctx_color = "\033[31m" - elif ctx_pct >= 70: - ctx_color = "\033[33m" - else: - ctx_color = "\033[32m" - - # Build info line: model · ctx · branch · duration · dev · tasks [· rate limits] - parts = [ - model_label, - f"ctx {ctx_color}{ctx_pct}%\033[0m", - ] - if branch: - parts.append(f"\033[35m{branch}\033[0m") - parts.append(duration) - if dev: - parts.append(f"\033[32m{dev}\033[0m") - if task_count: - parts.append(f"{task_count} task(s)") - - five_hr = cc_data.get("rate_limits", {}).get("five_hour", {}).get("used_percentage") - if five_hr is not None: - parts.append(f"5h {int(five_hr)}%") - seven_day = cc_data.get("rate_limits", {}).get("seven_day", {}).get("used_percentage") - if seven_day is not None: - parts.append(f"7d {int(seven_day)}%") - - info_line = SEP.join(parts) - - # Output: task line (only if active) + info line - if task: - print(f"\033[36m[{task['priority']}]\033[0m {task['title']} \033[33m({task['status']})\033[0m") - print(info_line) - - -if __name__ == "__main__": - main() diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index 1e1f9904..00000000 --- a/.claude/settings.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "statusLine": { - "type": "command", - "command": "python3 .claude/hooks/statusline.py" - }, - "hooks": { - "SessionStart": [ - { - "matcher": "startup", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/session-start.py", - "timeout": 10 - } - ] - }, - { - "matcher": "clear", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/session-start.py", - "timeout": 10 - } - ] - }, - { - "matcher": "compact", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/session-start.py", - "timeout": 10 - } - ] - } - ], - "PreToolUse": [ - { - "matcher": "Task", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/inject-subagent-context.py", - "timeout": 30 - } - ] - }, - { - "matcher": "Agent", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/inject-subagent-context.py", - "timeout": 30 - } - ] - } - ], - "SubagentStop": [ - { - "matcher": "check", - "hooks": [ - { - "type": "command", - "command": "python3 .claude/hooks/ralph-loop.py", - "timeout": 10 - } - ] - } - ] - }, - "enabledPlugins": {} -} diff --git a/.gitignore b/.gitignore index eb4024b9..92e8eff2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ bin-release/ /.idea /.codex-tasks /.trellis +/.claude diff --git a/.trellis/.gitignore b/.trellis/.gitignore deleted file mode 100644 index 46135ba0..00000000 --- a/.trellis/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# Developer identity (local only) -.developer - -# Current task pointer (each dev works on different task) -.current-task - -# Ralph Loop state file -.ralph-state.json - -# Agent runtime files -.agents/ -.agent-log -.session-id - -# Task directory runtime files -.plan-log - -# Atomic update temp files -*.tmp - -# Update backup directories -.backup-* - -# Conflict resolution temp files -*.new - -# Python cache -**/__pycache__/ -**/*.pyc diff --git a/.trellis/.template-hashes.json b/.trellis/.template-hashes.json deleted file mode 100644 index 92c63283..00000000 --- a/.trellis/.template-hashes.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - ".trellis/config.yaml": "cb5216826e1091bfa0d4ebae257d6f43fa60ca2bafbf3d9a6489b2c1a51a99df", - ".trellis/scripts/__init__.py": "1242be5b972094c2e141aecbe81a4efd478f6534e3d5e28306374e6a18fcf46c", - ".trellis/scripts/add_session.py": "a97a6c88ff7def8045a5dffa5c698a823392d7f73c1641e8a0c08db0168bd913", - ".trellis/scripts/common/__init__.py": "a8afa14ebe662723f96e4f5757c15359d76adf4cb5c52327c94dbe854bd1ab01", - ".trellis/scripts/common/cli_adapter.py": "d9bc50508918c5a2e17ce48384de5e1d9f7c2e32b0d57019d1bec973728d445f", - ".trellis/scripts/common/config.py": "1244bccc9d3e1e1c304f914ea913f2f4a0b6d54571e6845633d586c2139a07bf", - ".trellis/scripts/common/developer.py": "f5f833123abe68890171b4da825a324216d24913f6b5ad9245afc556424ffd7b", - ".trellis/scripts/common/git.py": "e14817be7de122d3a106f509c2825aeb9669d962ba73ba241642d2931cfdf1d6", - ".trellis/scripts/common/git_context.py": "5a01f7209c4a85ec768c88e2cb2a02a40ff279ea26139a390d16bf7576efce9f", - ".trellis/scripts/common/io.py": "6480b181f2bc505323b28ed7a66963d7b7edc96251e83b4c8e7a45907cc721c8", - ".trellis/scripts/common/log.py": "471df6895cfac80f995edebbf9974f6b7440634b7a688f28b8331c868bc0f3cf", - ".trellis/scripts/common/packages_context.py": "efe158d7c99c2268851d0216fbb08de22836e418a8dbeb73575b8cc249eed7b7", - ".trellis/scripts/common/paths.py": "36f72bdc09e4f0db53250346a4744ff3699c634ea71380eed5b467095f3d946b", - ".trellis/scripts/common/phase.py": "412b7096ef0e48b8a95a79060121a586e0d9d44f1b350d6ed818c6f84330bb01", - ".trellis/scripts/common/registry.py": "e1f4480ec264734eb4ef6867edc42fce2e2535045e5cff835fb81e0443d673e6", - ".trellis/scripts/common/session_context.py": "2389eff1a66b172783fcb714a79385114d9b29746133a3e0db732c3b5cb23898", - ".trellis/scripts/common/task_context.py": "8aad7107a7f86e7ddc381a7358364a6176c61d619ee2094cb698c24a0d5ab214", - ".trellis/scripts/common/task_queue.py": "0be61f713462b1fe4574927c82fc4704e678afe72dcb9813543aedf2f9e9e0c5", - ".trellis/scripts/common/task_store.py": "79e6257a0bedfd854fbfb5bdb3898a81181bcd700bc03ae3a970a032f7793610", - ".trellis/scripts/common/task_utils.py": "f5ef4af87ba3e11d8b19630c0c96d009de1811fc9be56c2027a9c96e21ed103e", - ".trellis/scripts/common/tasks.py": "eeefae693dadec54c8945394e288e90ed1e8f79545dfb2d4934a431496f5229d", - ".trellis/scripts/common/types.py": "d623ada858d3cb55093c5c95c9ce182b99b5865b7441742297542fad3b21cc06", - ".trellis/scripts/common/worktree.py": "434880e02dfa2e92f0c717ed2a28e4cdee681ea10c329a2438d533bdbc612408", - ".trellis/scripts/create_bootstrap.py": "33b40df671ba7828fd8d3ba8c019823a8b03e938797b1cae218c55d6c7ebe57a", - ".trellis/scripts/get_context.py": "ca5bf9e90bdb1d75d3de182b95f820f9d108ab28793d29097b24fd71315adcf5", - ".trellis/scripts/get_developer.py": "84c27076323c3e0f2c9c8ed16e8aa865e225d902a187c37e20ee1a46e7142d8f", - ".trellis/scripts/hooks/linear_sync.py": "e09cc4ce4699aada908808718698f33f705a3edf55c4dcf8f777ad892f80ca79", - ".trellis/scripts/init_developer.py": "f9e6c0d882406e81c8cd6b1c5abb204b0befc0069ff89cf650cd536a80f8c60e", - ".trellis/scripts/multi_agent/__init__.py": "af6fceb4d9a64da04be03ba0f5a6daf71066503eca832b8b58d8a7d4b2844fa4", - ".trellis/scripts/multi_agent/_bootstrap.py": "4d0c06e41ba17e33172974783719731551607400de0c751c13414fed9d0c8c30", - ".trellis/scripts/multi_agent/cleanup.py": "046ad29aa533e41d8952bf02c2dcfcdab2755002222d92455d194ef97a6e82e2", - ".trellis/scripts/multi_agent/create_pr.py": "03018c0c50a45758c28da5751afea1822be0acffe9053587cdf9d514a83ae27e", - ".trellis/scripts/multi_agent/plan.py": "011481ad0024a91f6a9e16535c6f5c4c7ba8eb311c46428104f1aeea7fc934e7", - ".trellis/scripts/multi_agent/start.py": "01e7f81fac53078a24a9fda50dc3000c2cee49179e05b8f7284747eebec1a543", - ".trellis/scripts/multi_agent/status.py": "06b3d2c5a9f7bea884962ace3b25113a3b01bf50dc12ad2f473e4f0c914fff7e", - ".trellis/scripts/multi_agent/status_display.py": "d432446644b07dcbea7fd3aeba1d31ae42a9c664e91eebbdab503fbb698bccac", - ".trellis/scripts/multi_agent/status_monitor.py": "11ba35180a568aa4d14ccaee81cc213ff3d5ab83025f264ac57ca70385f11f4c", - ".trellis/scripts/task.py": "77cd33a8c58803cd7dbe64bb9c045d6c93c1fa1453bed1e286d6f62bc329607e", - ".trellis/workflow.md": "892242e83f53194f49f7326ed9b50a7fc72ff810cd316c4d03ea8e7f11f5bbbd", - ".trellis/worktree.yaml": "c57de79e40d5f748f099625ed4a17d5f0afbf25cac598aced0b3c964e7b7c226", - ".claude/agents/check.md": "7c7400e7ea8bf3f3f879bfa028fd5b4d41673e0150d44c52292161ba33612812", - ".claude/agents/debug.md": "94be0b1cfbae4c64caee4775ef504f43acfcd4a80427a26d6f680ceaddcbee24", - ".claude/agents/dispatch.md": "90446e5b2bce1bc416856eb728361e21452ada9fb1cd05b1b29cd1a660f34c38", - ".claude/agents/implement.md": "f506be6291311a9846104e55c46659746027c70e841cb04dda89b4069ad6722d", - ".claude/agents/plan.md": "d796f689b8b8945d1809679d0c74475f419325b30f36ef0c59b7fae73386e90b", - ".claude/agents/research.md": "086ae23120151b3591089a4de20fd54e6ae2b89038f5903ee9a52269cd7ded6a", - ".claude/commands/trellis/before-dev.md": "dd926596f3139c12d42469fb5147ac90724e3a7baca5591384f4f4bbdd530b54", - ".claude/commands/trellis/brainstorm.md": "7c7731eda092275a5d87f2569a69584f3c39b544a126a76e727a1e9d250c4a65", - ".claude/commands/trellis/break-loop.md": "ba4dd4022dde1e4bbcfc1cc99e6a118e51b9db95bd962d88f1c29d0c9c433112", - ".claude/commands/trellis/check-cross-layer.md": "b9ab24515ead84330d6634f6ad912ca3547db3a36139d62c5688161824097d60", - ".claude/commands/trellis/check.md": "8b0d20b425b6030d13ac5aa0c876c5ec97cf7aca9b050f574f07f281ad25bd06", - ".claude/commands/trellis/create-command.md": "9faa6e68e28ecaa4077dc651eee2a656ef4f4d090da865c891b4b07194a53b90", - ".claude/commands/trellis/finish-work.md": "cc92cad9e94ce1cc4f29e3de16a640db7e9176e3ecfc9c19a566153671ca2168", - ".claude/commands/trellis/integrate-skill.md": "3940442485341832257c595ddfb45582e2d60e5a4716f2bd15b7bce0498b130a", - ".claude/commands/trellis/onboard.md": "cf9591fcddc412ff80772bf441c8d94d7724e6713fdf38a04a3348ab8949e64e", - ".claude/commands/trellis/parallel.md": "d2b76e732e625d3d843f97bed96ab5c4b2308aad4b64a93fa1f85553f567e256", - ".claude/commands/trellis/record-session.md": "33b5626fcf03a57578f46133b2a14c6bbe19c4ef29652af3f828f24f448f5926", - ".claude/commands/trellis/start.md": "34ecead84912a4338575f8648a9d449f89dfb4d4725416c889dac03586f98800", - ".claude/commands/trellis/update-spec.md": "ff4d5a0405a763e61936f5b9df175fd25ea20ec5c20fa999855020ab78a919b6", - ".claude/hooks/inject-subagent-context.py": "581f61369c29534513e5505e61f507beac339cb1720dc656b58f0584503b2452", - ".claude/hooks/ralph-loop.py": "df864b971ea5faf5801a88f013f230c92d458f52f64731a91f02cd78d7b932c3", - ".claude/hooks/session-start.py": "dfa553082095b75f2d714be42fbf46f651235df63caba9eb50d7b84306d486e3", - ".claude/hooks/statusline.py": "c92c0020a0c60308437b66f024a244303e708519c97089cf654ceddc144f7435", - ".claude/settings.json": "f468342f1ebfef18dbbde0a2528366b32ec154befca880e0c8b29fefdcccb1bf", - ".cursor/commands/trellis-before-dev.md": "dd926596f3139c12d42469fb5147ac90724e3a7baca5591384f4f4bbdd530b54", - ".cursor/commands/trellis-brainstorm.md": "cd0cc2f346b16b289ebcd7a35c402db53fb8c7c9653a5679ad3dc065c200e300", - ".cursor/commands/trellis-break-loop.md": "24d07ac0ac1873cb7adf5228c597e58a58125d80fc1e8d2eb5d6948c43761566", - ".cursor/commands/trellis-check-cross-layer.md": "a79fe38f29f84a4524a70987e9fecfca569430df476082bff9dde31596ca3951", - ".cursor/commands/trellis-check.md": "8b0d20b425b6030d13ac5aa0c876c5ec97cf7aca9b050f574f07f281ad25bd06", - ".cursor/commands/trellis-create-command.md": "6147b410be59a00b886162ee0785f4bb020998ef8f9fa2bbc68ed5deea20f36c", - ".cursor/commands/trellis-finish-work.md": "582e968ada1b2b6124baf19a0e89ba1e5617330f4a1318e8d3334698e40fce67", - ".cursor/commands/trellis-integrate-skill.md": "bb15144c308939abfd41cb008da71088910b6ec432c763ab4c0762dd6f0819e8", - ".cursor/commands/trellis-onboard.md": "420fe6681008e36017e77d1ebcd5db8cba8b966ddc53363aea942b9fefb21892", - ".cursor/commands/trellis-record-session.md": "33b5626fcf03a57578f46133b2a14c6bbe19c4ef29652af3f828f24f448f5926", - ".cursor/commands/trellis-start.md": "f03c7c1fde78c60ac8604938f1af7b2b54ef3cb4caf200d88edbbc8fc8d58c8f", - ".cursor/commands/trellis-update-spec.md": "714ce498567304c679d4b541e13cc670ce1cfc34c2abeb6d7e7d0f7196a52eff", - ".cursor/skills/ui-ux-pro-max/SKILL.md": "6cec1c00e1d890a41a2a600814bc765b6e264d9800742a1e3dff0441da9016c8", - ".cursor/skills/ui-ux-pro-max/data/charts.csv": "77d32cf4d9e78f80795baf391e1cc8f9ee137351aab29ca682938ec9d8ebe7e4", - ".cursor/skills/ui-ux-pro-max/data/colors.csv": "19a74a1fe858f92dc9213553bb6b8326b7f32dc6bfc0857668e2b4da32322f8a", - ".cursor/skills/ui-ux-pro-max/data/icons.csv": "351fe61ba45b8146c66de6ea7d67297654639d79a94f537b4d0bad570058c28f", - ".cursor/skills/ui-ux-pro-max/data/landing.csv": "51021dbadc40b0305c42f80c270eb515420440afe9f3482dfd048dc2475dbfbd", - ".cursor/skills/ui-ux-pro-max/data/products.csv": "6f9c9be6fdb53a415af273dac6221e87a418d1600da2ee39f974b997e880050e", - ".cursor/skills/ui-ux-pro-max/data/react-performance.csv": "904c8afcda229629545912dde0e8ac37503757131f0169f80b016f1f58c4fd3f", - ".cursor/skills/ui-ux-pro-max/data/stacks/astro.csv": "ad18dae3ab6d148d37d144592df80dc1825b6c9e86d9d2d68fdda77434206a37", - ".cursor/skills/ui-ux-pro-max/data/stacks/flutter.csv": "fe36d404c799781e8ba6e9a8179b45799ed5126a545528550cd2eb0f2346e8c5", - ".cursor/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv": "7aef38e75c53559470afcfa91580a9917ca8b7dbf8b92110389e23e93703ac52", - ".cursor/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv": "6c8fd4b0391c342c12b0af15610cd5becbeccaef0bbe8dcfc01d928c3195d93e", - ".cursor/skills/ui-ux-pro-max/data/stacks/nextjs.csv": "e828ccc04843742f52f545a068e8a9ab0d2b97c0e771f7e93bf0cef74da05554", - ".cursor/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv": "05d6e74501b2b6a636faed32450622759f49a5bcafad971f5f4e7eba0eb7be71", - ".cursor/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv": "f7a3f2d9542856d00199f85c6c023b7c284cc698e2e6e12d61afce2edacb24d6", - ".cursor/skills/ui-ux-pro-max/data/stacks/react-native.csv": "077aefc81d194895ecf7936b3ed298b978e36961f183e3a275f8acda19b5f621", - ".cursor/skills/ui-ux-pro-max/data/stacks/react.csv": "e5624ab41d33427d88e41d07581ce4eca59b37b36ab72a6ad43a9c8e2d0a1c72", - ".cursor/skills/ui-ux-pro-max/data/stacks/shadcn.csv": "395c2e415ef6f48a474acccdc8eb2c7258a6ed751a5037ba171a2d8823e02ded", - ".cursor/skills/ui-ux-pro-max/data/stacks/svelte.csv": "71af52d64f266c88070b91dbbaa900c2f8074b6baae9f35eaea6ba9cec6fd803", - ".cursor/skills/ui-ux-pro-max/data/stacks/swiftui.csv": "c9c2d2510f8e66281a2514e8dd0125a6b653b9ef53a71281b5e7dfe003d5b569", - ".cursor/skills/ui-ux-pro-max/data/stacks/vue.csv": "c2724915d3c11cd67263f25896cff721f787a0fdd8326002d31e9f5806dfd8f8", - ".cursor/skills/ui-ux-pro-max/data/styles.csv": "663ac9775e6f5b874b32d930fa0951591c45e39cde8ac7033278f42a0881c037", - ".cursor/skills/ui-ux-pro-max/data/typography.csv": "64695e05ac335ba534aff396c4ba9241c642f80ea53b424251d2669b71c4772b", - ".cursor/skills/ui-ux-pro-max/data/ui-reasoning.csv": "58fc52fff69f62709f8c7dd460de6f6693699ea820f24287f3301a427c2b554e", - ".cursor/skills/ui-ux-pro-max/data/ux-guidelines.csv": "e01943c433b2cad3040f19389b3b0455673758a569b7a927b5bedf65c989cb96", - ".cursor/skills/ui-ux-pro-max/data/web-interface.csv": "10bfc24e09a6a15db8309e6ef9b6881e1d4af97dffb7c99418aefb8e30df7d54", - ".cursor/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc": "dd1b4c8c8160ef7a62527c315f9a01dfa7a40e1548c0369f4be7225dfd21f327", - ".cursor/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc": "6f4beb2252825300dbebb31dab4d670c40c2595e2e201885b37ce30736664893", - ".cursor/skills/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc": "90787c012e77c120fc62b3a0e739c454af6d2245831c65cb80e15b4a8d4c1ac7", - ".cursor/skills/ui-ux-pro-max/scripts/core.py": "5459d1f04eea03dfb913742d0c03edc5065ac67f6227e4807fa87699662588cb", - ".cursor/skills/ui-ux-pro-max/scripts/design_system.py": "4da1d341f3c7749df51b51db4a543a48a427c3c746eb0e9882a1ab86acf3bb54", - ".cursor/skills/ui-ux-pro-max/scripts/search.py": "e924de555714fe612398d36f30c1d2514339a881d68a018fdbdc0b5589330de3" -} \ No newline at end of file diff --git a/.trellis/.version b/.trellis/.version deleted file mode 100644 index 60a2d3e9..00000000 --- a/.trellis/.version +++ /dev/null @@ -1 +0,0 @@ -0.4.0 \ No newline at end of file diff --git a/.trellis/config.yaml b/.trellis/config.yaml deleted file mode 100644 index 17c7d59d..00000000 --- a/.trellis/config.yaml +++ /dev/null @@ -1,53 +0,0 @@ -# Trellis Configuration -# Project-level settings for the Trellis workflow system -# -# All values have sensible defaults. Only override what you need. - -#------------------------------------------------------------------------------- -# Session Recording -#------------------------------------------------------------------------------- - -# Commit message used when auto-committing journal/index changes -# after running add_session.py -session_commit_message: "chore: record journal" - -# Maximum lines per journal file before rotating to a new one -max_journal_lines: 2000 - -#------------------------------------------------------------------------------- -# Task Lifecycle Hooks -#------------------------------------------------------------------------------- - -# Shell commands to run after task lifecycle events. -# Each hook receives TASK_JSON_PATH environment variable pointing to task.json. -# Hook failures print a warning but do not block the main operation. -# -# hooks: -# after_create: -# - "echo 'Task created'" -# after_start: -# - "echo 'Task started'" -# after_finish: -# - "echo 'Task finished'" -# after_archive: -# - "echo 'Task archived'" - -#------------------------------------------------------------------------------- -# Monorepo / Packages -#------------------------------------------------------------------------------- - -# Declare packages for monorepo projects. -# Trellis auto-detects workspaces during `trellis init`, but you can also -# configure them manually here. -# -# packages: -# frontend: -# path: packages/frontend -# backend: -# path: packages/backend -# docs: -# path: docs-site -# type: submodule - -# Default package used when --package is not specified. -# default_package: frontend diff --git a/.trellis/scripts/__init__.py b/.trellis/scripts/__init__.py deleted file mode 100755 index 815a1374..00000000 --- a/.trellis/scripts/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -Trellis Python Scripts - -This module provides Python implementations of Trellis workflow scripts. -""" diff --git a/.trellis/scripts/add_session.py b/.trellis/scripts/add_session.py deleted file mode 100755 index be2c0056..00000000 --- a/.trellis/scripts/add_session.py +++ /dev/null @@ -1,521 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Add a new session to journal file and update index.md. - -Usage: - python3 add_session.py --title "Title" --commit "hash" --summary "Summary" [--package cli] - python3 add_session.py --title "Title" --branch "feat/my-branch" - - # Pipe detailed content via stdin (use --stdin to opt in): - cat << 'EOF' | python3 add_session.py --stdin --title "Title" --summary "Summary" - <session content here> - EOF - -Branch resolution order: - 1. --branch CLI arg (explicit) - 2. task.json branch field (from active task) - 3. git branch --show-current (auto-detect) - 4. None (omitted gracefully) -""" - -from __future__ import annotations - -import argparse -import re -import subprocess -import sys -from datetime import datetime -from pathlib import Path - -from common.paths import ( - FILE_JOURNAL_PREFIX, - get_repo_root, - get_current_task, - get_developer, - get_workspace_dir, -) -from common.developer import ensure_developer -from common.git import run_git -from common.tasks import load_task -from common.config import ( - get_packages, - get_session_commit_message, - get_max_journal_lines, - is_monorepo, - resolve_package, - validate_package, -) - - -# ============================================================================= -# Helper Functions -# ============================================================================= - -def get_latest_journal_info(dev_dir: Path) -> tuple[Path | None, int, int]: - """Get latest journal file info. - - Returns: - Tuple of (file_path, file_number, line_count). - """ - latest_file: Path | None = None - latest_num = -1 - - for f in dev_dir.glob(f"{FILE_JOURNAL_PREFIX}*.md"): - if not f.is_file(): - continue - - match = re.search(r"(\d+)$", f.stem) - if match: - num = int(match.group(1)) - if num > latest_num: - latest_num = num - latest_file = f - - if latest_file: - lines = len(latest_file.read_text(encoding="utf-8").splitlines()) - return latest_file, latest_num, lines - - return None, 0, 0 - - -def get_current_session(index_file: Path) -> int: - """Get current session number from index.md.""" - if not index_file.is_file(): - return 0 - - content = index_file.read_text(encoding="utf-8") - for line in content.splitlines(): - if "Total Sessions" in line: - match = re.search(r":\s*(\d+)", line) - if match: - return int(match.group(1)) - return 0 - - -def _extract_journal_num(filename: str) -> int: - """Extract journal number from filename for sorting.""" - match = re.search(r"(\d+)", filename) - return int(match.group(1)) if match else 0 - - -def count_journal_files(dev_dir: Path, active_num: int) -> str: - """Count journal files and return table rows.""" - active_file = f"{FILE_JOURNAL_PREFIX}{active_num}.md" - result_lines = [] - - files = sorted( - [f for f in dev_dir.glob(f"{FILE_JOURNAL_PREFIX}*.md") if f.is_file()], - key=lambda f: _extract_journal_num(f.stem), - reverse=True - ) - - for f in files: - filename = f.name - lines = len(f.read_text(encoding="utf-8").splitlines()) - status = "Active" if filename == active_file else "Archived" - result_lines.append(f"| `{filename}` | ~{lines} | {status} |") - - return "\n".join(result_lines) - - -def create_new_journal_file( - dev_dir: Path, num: int, developer: str, today: str, max_lines: int = 2000, -) -> Path: - """Create a new journal file.""" - prev_num = num - 1 - new_file = dev_dir / f"{FILE_JOURNAL_PREFIX}{num}.md" - - content = f"""# Journal - {developer} (Part {num}) - -> Continuation from `{FILE_JOURNAL_PREFIX}{prev_num}.md` (archived at ~{max_lines} lines) -> Started: {today} - ---- - -""" - new_file.write_text(content, encoding="utf-8") - return new_file - - -def generate_session_content( - session_num: int, - title: str, - commit: str, - summary: str, - extra_content: str, - today: str, - package: str | None = None, - branch: str | None = None, -) -> str: - """Generate session content.""" - if commit and commit != "-": - commit_table = """| Hash | Message | -|------|---------|""" - for c in commit.split(","): - c = c.strip() - commit_table += f"\n| `{c}` | (see git log) |" - else: - commit_table = "(No commits - planning session)" - - package_line = f"\n**Package**: {package}" if package else "" - branch_line = f"\n**Branch**: `{branch}`" if branch else "" - - return f""" - -## Session {session_num}: {title} - -**Date**: {today} -**Task**: {title}{package_line}{branch_line} - -### Summary - -{summary} - -### Main Changes - -{extra_content} - -### Git Commits - -{commit_table} - -### Testing - -- [OK] (Add test results) - -### Status - -[OK] **Completed** - -### Next Steps - -- None - task complete -""" - - -def update_index( - index_file: Path, - dev_dir: Path, - title: str, - commit: str, - new_session: int, - active_file: str, - today: str, - branch: str | None = None, -) -> bool: - """Update index.md with new session info.""" - # Format commit for display - commit_display = "-" - if commit and commit != "-": - commit_display = re.sub(r"([a-f0-9]{7,})", r"`\1`", commit.replace(",", ", ")) - - # Get file number from active_file name - match = re.search(r"(\d+)", active_file) - active_num = int(match.group(1)) if match else 0 - files_table = count_journal_files(dev_dir, active_num) - - print(f"Updating index.md for session {new_session}...") - print(f" Title: {title}") - print(f" Commit: {commit_display}") - print(f" Active File: {active_file}") - print() - - content = index_file.read_text(encoding="utf-8") - - if "@@@auto:current-status" not in content: - print("Error: Markers not found in index.md. Please ensure markers exist.", file=sys.stderr) - return False - - # Process sections - lines = content.splitlines() - new_lines = [] - - in_current_status = False - in_active_documents = False - in_session_history = False - header_written = False - - for line in lines: - if "@@@auto:current-status" in line: - new_lines.append(line) - in_current_status = True - new_lines.append(f"- **Active File**: `{active_file}`") - new_lines.append(f"- **Total Sessions**: {new_session}") - new_lines.append(f"- **Last Active**: {today}") - continue - - if "@@@/auto:current-status" in line: - in_current_status = False - new_lines.append(line) - continue - - if "@@@auto:active-documents" in line: - new_lines.append(line) - in_active_documents = True - new_lines.append("| File | Lines | Status |") - new_lines.append("|------|-------|--------|") - new_lines.append(files_table) - continue - - if "@@@/auto:active-documents" in line: - in_active_documents = False - new_lines.append(line) - continue - - if "@@@auto:session-history" in line: - new_lines.append(line) - in_session_history = True - header_written = False - continue - - if "@@@/auto:session-history" in line: - in_session_history = False - new_lines.append(line) - continue - - if in_current_status: - continue - - if in_active_documents: - continue - - if in_session_history: - # Migrate old 4/6-column headers to 5-column Branch-only history. - if re.match( - r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*Branch\s*\|\s*Base Branch\s*\|\s*$", - line, - ): - new_lines.append("| # | Date | Title | Commits | Branch |") - continue - if re.match(r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*Branch\s*\|\s*$", line): - new_lines.append("| # | Date | Title | Commits | Branch |") - continue - if re.match(r"^\|\s*#\s*\|\s*Date\s*\|\s*Title\s*\|\s*Commits\s*\|\s*$", line): - new_lines.append("| # | Date | Title | Commits | Branch |") - continue - if re.match(r"^\|[-| ]+\|\s*$", line) and not header_written: - new_lines.append("|---|------|-------|---------|--------|") - new_lines.append(f"| {new_session} | {today} | {title} | {commit_display} | `{branch or '-'}` |") - header_written = True - continue - new_lines.append(line) - continue - - new_lines.append(line) - - index_file.write_text("\n".join(new_lines), encoding="utf-8") - print("[OK] Updated index.md successfully!") - return True - - -# ============================================================================= -# Main Function -# ============================================================================= - -def _auto_commit_workspace(repo_root: Path) -> None: - """Stage .trellis/workspace and .trellis/tasks, then commit with a configured message.""" - commit_msg = get_session_commit_message(repo_root) - add_result = subprocess.run( - ["git", "add", "-A", ".trellis/workspace", ".trellis/tasks"], - cwd=repo_root, - capture_output=True, - text=True, - ) - if add_result.returncode != 0: - print(f"[WARN] git add failed (exit {add_result.returncode}): {add_result.stderr.strip()}", file=sys.stderr) - print("[WARN] Please commit .trellis/ changes manually: git add .trellis && git commit", file=sys.stderr) - return - # Check if there are staged changes - result = subprocess.run( - ["git", "diff", "--cached", "--quiet", "--", ".trellis/workspace", ".trellis/tasks"], - cwd=repo_root, - ) - if result.returncode == 0: - print("[OK] No workspace changes to commit.", file=sys.stderr) - return - commit_result = subprocess.run( - ["git", "commit", "-m", commit_msg], - cwd=repo_root, - capture_output=True, - text=True, - ) - if commit_result.returncode == 0: - print(f"[OK] Auto-committed: {commit_msg}", file=sys.stderr) - else: - print(f"[WARN] Auto-commit failed: {commit_result.stderr.strip()}", file=sys.stderr) - - -def add_session( - title: str, - commit: str = "-", - summary: str = "(Add summary)", - extra_content: str = "(Add details)", - auto_commit: bool = True, - package: str | None = None, - branch: str | None = None, -) -> int: - """Add a new session.""" - repo_root = get_repo_root() - ensure_developer(repo_root) - - developer = get_developer(repo_root) - if not developer: - print("Error: Developer not initialized", file=sys.stderr) - return 1 - - dev_dir = get_workspace_dir(repo_root) - if not dev_dir: - print("Error: Workspace directory not found", file=sys.stderr) - return 1 - - max_lines = get_max_journal_lines(repo_root) - - index_file = dev_dir / "index.md" - today = datetime.now().strftime("%Y-%m-%d") - - journal_file, current_num, current_lines = get_latest_journal_info(dev_dir) - current_session = get_current_session(index_file) - new_session = current_session + 1 - - session_content = generate_session_content( - new_session, title, commit, summary, extra_content, today, package, - branch, - ) - content_lines = len(session_content.splitlines()) - - print("========================================", file=sys.stderr) - print("ADD SESSION", file=sys.stderr) - print("========================================", file=sys.stderr) - print("", file=sys.stderr) - print(f"Session: {new_session}", file=sys.stderr) - print(f"Title: {title}", file=sys.stderr) - print(f"Commit: {commit}", file=sys.stderr) - print("", file=sys.stderr) - print(f"Current journal file: {FILE_JOURNAL_PREFIX}{current_num}.md", file=sys.stderr) - print(f"Current lines: {current_lines}", file=sys.stderr) - print(f"New content lines: {content_lines}", file=sys.stderr) - print(f"Total after append: {current_lines + content_lines}", file=sys.stderr) - print("", file=sys.stderr) - - target_file = journal_file - target_num = current_num - - if current_lines + content_lines > max_lines: - target_num = current_num + 1 - print(f"[!] Exceeds {max_lines} lines, creating {FILE_JOURNAL_PREFIX}{target_num}.md", file=sys.stderr) - target_file = create_new_journal_file(dev_dir, target_num, developer, today, max_lines) - print(f"Created: {target_file}", file=sys.stderr) - - # Append session content - if target_file: - with target_file.open("a", encoding="utf-8") as f: - f.write(session_content) - print(f"[OK] Appended session to {target_file.name}", file=sys.stderr) - - print("", file=sys.stderr) - - # Update index.md - active_file = f"{FILE_JOURNAL_PREFIX}{target_num}.md" - if not update_index( - index_file, - dev_dir, - title, - commit, - new_session, - active_file, - today, - branch, - ): - return 1 - - print("", file=sys.stderr) - print("========================================", file=sys.stderr) - print(f"[OK] Session {new_session} added successfully!", file=sys.stderr) - print("========================================", file=sys.stderr) - print("", file=sys.stderr) - print("Files updated:", file=sys.stderr) - print(f" - {target_file.name if target_file else 'journal'}", file=sys.stderr) - print(" - index.md", file=sys.stderr) - - # Auto-commit workspace changes - if auto_commit: - print("", file=sys.stderr) - _auto_commit_workspace(repo_root) - - return 0 - - -# ============================================================================= -# Main Entry -# ============================================================================= - -def main() -> int: - """CLI entry point.""" - parser = argparse.ArgumentParser( - description="Add a new session to journal file and update index.md" - ) - parser.add_argument("--title", required=True, help="Session title") - parser.add_argument("--commit", default="-", help="Comma-separated commit hashes") - parser.add_argument("--summary", default="(Add summary)", help="Brief summary") - parser.add_argument("--content-file", help="Path to file with detailed content") - parser.add_argument("--package", help="Package name tag (e.g., cli, docs-site)") - parser.add_argument("--branch", help="Branch name (auto-detected if omitted)") - parser.add_argument("--no-commit", action="store_true", - help="Skip auto-commit of workspace changes") - parser.add_argument("--stdin", action="store_true", - help="Read extra content from stdin (explicit opt-in)") - - args = parser.parse_args() - - extra_content = "(Add details)" - if args.content_file: - content_path = Path(args.content_file) - if content_path.is_file(): - extra_content = content_path.read_text(encoding="utf-8") - elif args.stdin: - extra_content = sys.stdin.read() - - # Load active task once — shared by package and branch resolution - repo_root = get_repo_root() - current = get_current_task(repo_root) - task_data = load_task(repo_root / current) if current else None - - package = args.package - if package: - # CLI source: fail-fast in monorepo, ignore in single-repo - if not is_monorepo(repo_root): - print("Warning: --package ignored in single-repo project", file=sys.stderr) - package = None - elif not validate_package(package, repo_root): - packages = get_packages(repo_root) - available = ", ".join(sorted(packages.keys())) if packages else "(none)" - print(f"Error: unknown package '{package}'. Available: {available}", file=sys.stderr) - return 1 - else: - # Inferred: active task's task.json.package → default_package → None - task_package = task_data.package if task_data else None - package = resolve_package(task_package, repo_root) - - # Resolve branch: CLI → task.json → git auto-detect → None - branch = args.branch - - if not branch: - if task_data and task_data.raw.get("branch"): - branch = task_data.raw["branch"] - else: - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - detected = branch_out.strip() - if detected: - branch = detected - - return add_session( - args.title, args.commit, args.summary, extra_content, - auto_commit=not args.no_commit, - package=package, - branch=branch, - ) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/common/__init__.py b/.trellis/scripts/common/__init__.py deleted file mode 100755 index 6c3431e0..00000000 --- a/.trellis/scripts/common/__init__.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Common utilities for Trellis workflow scripts. - -This module provides shared functionality used by other Trellis scripts. -""" - -import io -import sys - -# ============================================================================= -# Windows Encoding Fix (MUST be at top, before any other output) -# ============================================================================= -# On Windows, stdout defaults to the system code page (often GBK/CP936). -# This causes UnicodeEncodeError when printing non-ASCII characters. -# -# Any script that imports from common will automatically get this fix. -# ============================================================================= - - -def _configure_stream(stream: object) -> object: - """Configure a stream for UTF-8 encoding on Windows.""" - # Try reconfigure() first (Python 3.7+, more reliable) - if hasattr(stream, "reconfigure"): - stream.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr] - return stream - # Fallback: detach and rewrap with TextIOWrapper - elif hasattr(stream, "detach"): - return io.TextIOWrapper( - stream.detach(), # type: ignore[union-attr] - encoding="utf-8", - errors="replace", - ) - return stream - - -if sys.platform == "win32": - sys.stdout = _configure_stream(sys.stdout) # type: ignore[assignment] - sys.stderr = _configure_stream(sys.stderr) # type: ignore[assignment] - sys.stdin = _configure_stream(sys.stdin) # type: ignore[assignment] - - -def configure_encoding() -> None: - """ - Configure stdout/stderr/stdin for UTF-8 encoding on Windows. - - This is automatically called when importing from common, - but can be called manually for scripts that don't import common. - - Safe to call multiple times. - """ - global sys - if sys.platform == "win32": - sys.stdout = _configure_stream(sys.stdout) # type: ignore[assignment] - sys.stderr = _configure_stream(sys.stderr) # type: ignore[assignment] - sys.stdin = _configure_stream(sys.stdin) # type: ignore[assignment] - - -from .paths import ( - DIR_WORKFLOW, - DIR_WORKSPACE, - DIR_TASKS, - DIR_ARCHIVE, - DIR_SPEC, - DIR_SCRIPTS, - FILE_DEVELOPER, - FILE_CURRENT_TASK, - FILE_TASK_JSON, - FILE_JOURNAL_PREFIX, - get_repo_root, - get_developer, - check_developer, - get_tasks_dir, - get_workspace_dir, - get_active_journal_file, - count_lines, - get_current_task, - get_current_task_abs, - normalize_task_ref, - resolve_task_ref, - set_current_task, - clear_current_task, - has_current_task, - generate_task_date_prefix, -) diff --git a/.trellis/scripts/common/cli_adapter.py b/.trellis/scripts/common/cli_adapter.py deleted file mode 100755 index 12b29308..00000000 --- a/.trellis/scripts/common/cli_adapter.py +++ /dev/null @@ -1,753 +0,0 @@ -""" -CLI Adapter for Multi-Platform Support. - -Abstracts differences between Claude Code, OpenCode, Cursor, iFlow, Codex, Kilo, Kiro Code, Gemini CLI, Antigravity, Windsurf, Qoder, CodeBuddy, GitHub Copilot, and Factory Droid interfaces. - -Supported platforms: -- claude: Claude Code (default) -- opencode: OpenCode -- cursor: Cursor IDE -- iflow: iFlow CLI -- codex: Codex CLI (skills-based) -- kilo: Kilo CLI -- kiro: Kiro Code (skills-based) -- gemini: Gemini CLI -- antigravity: Antigravity (workflow-based) -- windsurf: Windsurf (workflow-based) -- qoder: Qoder -- codebuddy: CodeBuddy -- copilot: GitHub Copilot (VS Code) -- droid: Factory Droid (commands-based) - -Usage: - from common.cli_adapter import CLIAdapter - - adapter = CLIAdapter("opencode") - cmd = adapter.build_run_command( - agent="dispatch", - session_id="abc123", - prompt="Start the pipeline" - ) -""" - -from __future__ import annotations - -from dataclasses import dataclass -from pathlib import Path -from typing import ClassVar, Literal - -Platform = Literal[ - "claude", - "opencode", - "cursor", - "iflow", - "codex", - "kilo", - "kiro", - "gemini", - "antigravity", - "windsurf", - "qoder", - "codebuddy", - "copilot", - "droid", -] - - -@dataclass -class CLIAdapter: - """Adapter for different AI coding CLI tools.""" - - platform: Platform - - # ========================================================================= - # Agent Name Mapping - # ========================================================================= - - # OpenCode has built-in agents that cannot be overridden - # See: https://github.com/sst/opencode/issues/4271 - # Note: Class-level constant, not a dataclass field - _AGENT_NAME_MAP: ClassVar[dict[Platform, dict[str, str]]] = { - "claude": {}, # No mapping needed - "opencode": { - "plan": "trellis-plan", # 'plan' is built-in in OpenCode - }, - } - - def get_agent_name(self, agent: str) -> str: - """Get platform-specific agent name. - - Args: - agent: Original agent name (e.g., 'plan', 'dispatch') - - Returns: - Platform-specific agent name (e.g., 'trellis-plan' for OpenCode) - """ - mapping = self._AGENT_NAME_MAP.get(self.platform, {}) - return mapping.get(agent, agent) - - # ========================================================================= - # Agent Path - # ========================================================================= - - @property - def config_dir_name(self) -> str: - """Get platform-specific config directory name. - - Returns: - Directory name ('.claude', '.opencode', '.cursor', '.iflow', '.codex', '.kilocode', '.kiro', '.gemini', '.agent', '.windsurf', '.qoder', or '.codebuddy') - """ - if self.platform == "opencode": - return ".opencode" - elif self.platform == "cursor": - return ".cursor" - elif self.platform == "iflow": - return ".iflow" - elif self.platform == "codex": - return ".codex" - elif self.platform == "kilo": - return ".kilocode" - elif self.platform == "kiro": - return ".kiro" - elif self.platform == "gemini": - return ".gemini" - elif self.platform == "antigravity": - return ".agent" - elif self.platform == "windsurf": - return ".windsurf" - elif self.platform == "qoder": - return ".qoder" - elif self.platform == "codebuddy": - return ".codebuddy" - elif self.platform == "copilot": - return ".github/copilot" - elif self.platform == "droid": - return ".factory" - else: - return ".claude" - - def get_config_dir(self, project_root: Path) -> Path: - """Get platform-specific config directory. - - Args: - project_root: Project root directory - - Returns: - Path to config directory (.claude, .opencode, .cursor, .iflow, .codex, .kilocode, .kiro, .gemini, .agent, .windsurf, .qoder, or .codebuddy) - """ - return project_root / self.config_dir_name - - def get_agent_path(self, agent: str, project_root: Path) -> Path: - """Get path to agent definition file. - - Args: - agent: Agent name (original, before mapping) - project_root: Project root directory - - Returns: - Path to agent definition file (.md for most platforms, .toml for Codex) - """ - mapped_name = self.get_agent_name(agent) - if self.platform == "codex": - return self.get_config_dir(project_root) / "agents" / f"{mapped_name}.toml" - return self.get_config_dir(project_root) / "agents" / f"{mapped_name}.md" - - def get_commands_path(self, project_root: Path, *parts: str) -> Path: - """Get path to commands directory or specific command file. - - Args: - project_root: Project root directory - *parts: Additional path parts (e.g., 'trellis', 'finish-work.md') - - Returns: - Path to commands directory or file - - Note: - Cursor uses prefix naming: .cursor/commands/trellis-<name>.md - Antigravity uses workflow directory: .agent/workflows/<name>.md - Windsurf uses workflow directory: .windsurf/workflows/trellis-<name>.md - Copilot uses prompt files: .github/prompts/<name>.prompt.md - Claude/OpenCode use subdirectory: .claude/commands/trellis/<name>.md - """ - if self.platform == "windsurf": - workflow_dir = self.get_config_dir(project_root) / "workflows" - if not parts: - return workflow_dir - if len(parts) >= 2 and parts[0] == "trellis": - filename = parts[-1] - return workflow_dir / f"trellis-{filename}" - return workflow_dir / Path(*parts) - - if self.platform in ("antigravity", "kilo"): - workflow_dir = self.get_config_dir(project_root) / "workflows" - if not parts: - return workflow_dir - if len(parts) >= 2 and parts[0] == "trellis": - filename = parts[-1] - return workflow_dir / filename - return workflow_dir / Path(*parts) - - if self.platform == "copilot": - prompts_dir = project_root / ".github" / "prompts" - if not parts: - return prompts_dir - if len(parts) >= 2 and parts[0] == "trellis": - filename = parts[-1] - if filename.endswith(".md"): - filename = filename[:-3] - return prompts_dir / f"{filename}.prompt.md" - return prompts_dir / Path(*parts) - - if not parts: - return self.get_config_dir(project_root) / "commands" - - # Cursor uses prefix naming instead of subdirectory - if self.platform == "cursor" and len(parts) >= 2 and parts[0] == "trellis": - # Convert trellis/<name>.md to trellis-<name>.md - filename = parts[-1] - return ( - self.get_config_dir(project_root) / "commands" / f"trellis-{filename}" - ) - - return self.get_config_dir(project_root) / "commands" / Path(*parts) - - def get_trellis_command_path(self, name: str) -> str: - """Get relative path to a trellis command file. - - Args: - name: Command name without extension (e.g., 'finish-work', 'check') - - Returns: - Relative path string for use in JSONL entries - - Note: - Cursor: .cursor/commands/trellis-<name>.md - Codex: .agents/skills/<name>/SKILL.md - Kiro: .kiro/skills/<name>/SKILL.md - Gemini: .gemini/commands/trellis/<name>.toml - Antigravity: .agent/workflows/<name>.md - Windsurf: .windsurf/workflows/trellis-<name>.md - Others: .{platform}/commands/trellis/<name>.md - """ - if self.platform == "cursor": - return f".cursor/commands/trellis-{name}.md" - elif self.platform == "codex": - return f".agents/skills/{name}/SKILL.md" - elif self.platform == "kiro": - return f".kiro/skills/{name}/SKILL.md" - elif self.platform == "gemini": - return f".gemini/commands/trellis/{name}.toml" - elif self.platform == "antigravity": - return f".agent/workflows/{name}.md" - elif self.platform == "windsurf": - return f".windsurf/workflows/trellis-{name}.md" - elif self.platform == "kilo": - return f".kilocode/workflows/{name}.md" - elif self.platform == "copilot": - return f".github/prompts/{name}.prompt.md" - elif self.platform == "droid": - return f".factory/commands/trellis/{name}.md" - else: - return f"{self.config_dir_name}/commands/trellis/{name}.md" - - # ========================================================================= - # Environment Variables - # ========================================================================= - - def get_non_interactive_env(self) -> dict[str, str]: - """Get environment variables for non-interactive mode. - - Returns: - Dict of environment variables to set - """ - if self.platform == "opencode": - return {"OPENCODE_NON_INTERACTIVE": "1"} - elif self.platform == "iflow": - return {"IFLOW_NON_INTERACTIVE": "1"} - elif self.platform == "codex": - return {"CODEX_NON_INTERACTIVE": "1"} - elif self.platform == "kiro": - return {"KIRO_NON_INTERACTIVE": "1"} - elif self.platform == "gemini": - return {} # Gemini CLI doesn't have a non-interactive env var - elif self.platform == "antigravity": - return {} - elif self.platform == "windsurf": - return {} - elif self.platform == "qoder": - return {} - elif self.platform == "codebuddy": - return {} - elif self.platform == "copilot": - return {} - elif self.platform == "droid": - return {} - else: - return {"CLAUDE_NON_INTERACTIVE": "1"} - - # ========================================================================= - # CLI Command Building - # ========================================================================= - - def build_run_command( - self, - agent: str, - prompt: str, - session_id: str | None = None, - skip_permissions: bool = True, - verbose: bool = True, - json_output: bool = True, - ) -> list[str]: - """Build CLI command for running an agent. - - Args: - agent: Agent name (will be mapped if needed) - prompt: Prompt to send to the agent - session_id: Optional session ID (Claude Code only for creation) - skip_permissions: Whether to skip permission prompts - verbose: Whether to enable verbose output - json_output: Whether to use JSON output format - - Returns: - List of command arguments - """ - mapped_agent = self.get_agent_name(agent) - - if self.platform == "opencode": - cmd = ["opencode", "run"] - cmd.extend(["--agent", mapped_agent]) - - # Note: OpenCode 'run' mode is non-interactive by default - # No equivalent to Claude Code's --dangerously-skip-permissions - # See: https://github.com/anomalyco/opencode/issues/9070 - - if json_output: - cmd.extend(["--format", "json"]) - - if verbose: - cmd.extend(["--log-level", "DEBUG", "--print-logs"]) - - # Note: OpenCode doesn't support --session-id on creation - # Session ID must be extracted from logs after startup - - cmd.append(prompt) - - elif self.platform == "iflow": - cmd = ["iflow", "-y", "-p"] - cmd.append(f"${mapped_agent} {prompt}") - elif self.platform == "codex": - cmd = ["codex", "exec"] - cmd.append(prompt) - elif self.platform == "kiro": - cmd = ["kiro", "run", prompt] - elif self.platform == "gemini": - cmd = ["gemini"] - cmd.append(prompt) - elif self.platform == "antigravity": - raise ValueError( - "Antigravity workflows are UI slash commands; CLI agent run is not supported." - ) - elif self.platform == "windsurf": - raise ValueError( - "Windsurf workflows are UI slash commands; CLI agent run is not supported." - ) - elif self.platform == "qoder": - cmd = ["qodercli", "-p", prompt] - elif self.platform == "codebuddy": - raise ValueError( - "CodeBuddy does not support non-interactive mode (no CLI agent)" - ) - elif self.platform == "copilot": - raise ValueError( - "GitHub Copilot is IDE-only; CLI agent run is not supported." - ) - elif self.platform == "droid": - raise ValueError( - "Factory Droid CLI agent run is not yet integrated with Trellis multi-agent." - ) - - else: # claude - cmd = ["claude", "-p"] - cmd.extend(["--agent", mapped_agent]) - - if session_id: - cmd.extend(["--session-id", session_id]) - - if skip_permissions: - cmd.append("--dangerously-skip-permissions") - - if json_output: - cmd.extend(["--output-format", "stream-json"]) - - if verbose: - cmd.append("--verbose") - - cmd.append(prompt) - - return cmd - - def build_resume_command(self, session_id: str) -> list[str]: - """Build CLI command for resuming a session. - - Args: - session_id: Session ID to resume (ignored for iFlow) - - Returns: - List of command arguments - """ - if self.platform == "opencode": - return ["opencode", "run", "--session", session_id] - elif self.platform == "iflow": - # iFlow uses -c to continue most recent conversation - # session_id is ignored as iFlow doesn't support session IDs - return ["iflow", "-c"] - elif self.platform == "codex": - return ["codex", "resume", session_id] - elif self.platform == "kiro": - return ["kiro", "resume", session_id] - elif self.platform == "gemini": - return ["gemini", "--resume", session_id] - elif self.platform == "antigravity": - raise ValueError( - "Antigravity workflows are UI slash commands; CLI resume is not supported." - ) - elif self.platform == "windsurf": - raise ValueError( - "Windsurf workflows are UI slash commands; CLI resume is not supported." - ) - elif self.platform == "qoder": - return ["qodercli", "--resume", session_id] - elif self.platform == "codebuddy": - raise ValueError( - "CodeBuddy does not support non-interactive mode (no CLI agent)" - ) - elif self.platform == "copilot": - raise ValueError( - "GitHub Copilot is IDE-only; CLI resume is not supported." - ) - elif self.platform == "droid": - raise ValueError( - "Factory Droid CLI resume is not yet integrated with Trellis multi-agent." - ) - else: - return ["claude", "--resume", session_id] - - def get_resume_command_str(self, session_id: str, cwd: str | None = None) -> str: - """Get human-readable resume command string. - - Args: - session_id: Session ID to resume - cwd: Optional working directory to cd into - - Returns: - Command string for display - """ - cmd = self.build_resume_command(session_id) - cmd_str = " ".join(cmd) - - if cwd: - return f"cd {cwd} && {cmd_str}" - return cmd_str - - # ========================================================================= - # Platform Detection Helpers - # ========================================================================= - - @property - def is_opencode(self) -> bool: - """Check if platform is OpenCode.""" - return self.platform == "opencode" - - @property - def is_claude(self) -> bool: - """Check if platform is Claude Code.""" - return self.platform == "claude" - - @property - def is_cursor(self) -> bool: - """Check if platform is Cursor.""" - return self.platform == "cursor" - - @property - def is_iflow(self) -> bool: - """Check if platform is iFlow CLI.""" - return self.platform == "iflow" - - @property - def cli_name(self) -> str: - """Get CLI executable name. - - Note: Cursor doesn't have a CLI tool, returns None-like value. - """ - if self.is_opencode: - return "opencode" - elif self.is_cursor: - return "cursor" # Note: Cursor is IDE-only, no CLI - elif self.platform == "iflow": - return "iflow" - elif self.platform == "kiro": - return "kiro" - elif self.platform == "gemini": - return "gemini" - elif self.platform == "antigravity": - return "agy" - elif self.platform == "windsurf": - return "windsurf" - elif self.platform == "qoder": - return "qodercli" - elif self.platform == "codebuddy": - return "codebuddy" - elif self.platform == "copilot": - return "copilot" - elif self.platform == "droid": - return "droid" - else: - return "claude" - - @property - def supports_cli_agents(self) -> bool: - """Check if platform supports running agents via CLI. - - Claude Code, OpenCode, iFlow, and Codex support CLI agent execution. - Cursor is IDE-only and doesn't support CLI agents. - """ - return self.platform in ("claude", "opencode", "iflow", "codex") - - @property - def requires_agent_definition_file(self) -> bool: - """Check if platform requires an agent definition file (.md/.toml) to run. - - Claude Code, OpenCode, iFlow: require agent .md files (--agent flag). - Codex: auto-discovers agents from .codex/agents/*.toml, no --agent flag. - """ - return self.platform in ("claude", "opencode", "iflow") - - # ========================================================================= - # Session ID Handling - # ========================================================================= - - @property - def supports_session_id_on_create(self) -> bool: - """Check if platform supports specifying session ID on creation. - - Claude Code: Yes (--session-id) - OpenCode: No (auto-generated, extract from logs) - iFlow: No (no session ID support) - """ - return self.platform == "claude" - - def extract_session_id_from_log(self, log_content: str) -> str | None: - """Extract session ID from log output (OpenCode only). - - OpenCode generates session IDs in format: ses_xxx - - Args: - log_content: Log file content - - Returns: - Session ID if found, None otherwise - """ - import re - - # OpenCode session ID pattern - match = re.search(r"ses_[a-zA-Z0-9]+", log_content) - if match: - return match.group(0) - return None - - -# ============================================================================= -# Factory Function -# ============================================================================= - - -def get_cli_adapter(platform: str = "claude") -> CLIAdapter: - """Get CLI adapter for the specified platform. - - Args: - platform: Platform name ('claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', 'gemini', 'antigravity', 'windsurf', 'qoder', or 'codebuddy') - - Returns: - CLIAdapter instance - - Raises: - ValueError: If platform is not supported - """ - if platform not in ( - "claude", - "opencode", - "cursor", - "iflow", - "codex", - "kilo", - "kiro", - "gemini", - "antigravity", - "windsurf", - "qoder", - "codebuddy", - "copilot", - "droid", - ): - raise ValueError( - f"Unsupported platform: {platform} (must be 'claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', 'gemini', 'antigravity', 'windsurf', 'qoder', 'codebuddy', 'copilot', or 'droid')" - ) - - return CLIAdapter(platform=platform) # type: ignore - - -_ALL_PLATFORM_CONFIG_DIRS = ( - ".claude", - ".cursor", - ".iflow", - ".opencode", - ".agents", - ".codex", - ".kilocode", - ".kiro", - ".gemini", - ".agent", - ".windsurf", - ".qoder", - ".codebuddy", - ".github/copilot", - ".factory", -) -"""All platform config directory names (used by detect_platform exclusion checks).""" - - -def _has_other_platform_dir(project_root: Path, exclude: set[str]) -> bool: - """Check if any platform config dir exists besides those in *exclude*.""" - return any( - (project_root / d).is_dir() - for d in _ALL_PLATFORM_CONFIG_DIRS - if d not in exclude - ) - - -def detect_platform(project_root: Path) -> Platform: - """Auto-detect platform based on existing config directories. - - Detection order: - 1. TRELLIS_PLATFORM environment variable (if set) - 2. .opencode directory exists → opencode - 3. .iflow directory exists → iflow - 4. .cursor directory exists (without .claude) → cursor - 5. .codex exists and no other platform dirs → codex - 6. .kilocode directory exists → kilo - 7. .kiro/skills exists and no other platform dirs → kiro - 8. .gemini directory exists → gemini - 9. .agent/workflows exists and no other platform dirs → antigravity - 10. .windsurf/workflows exists and no other platform dirs → windsurf - 11. .codebuddy directory exists → codebuddy - 12. .qoder directory exists → qoder - 13. Default → claude - - Args: - project_root: Project root directory - - Returns: - Detected platform ('claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', 'gemini', 'antigravity', 'windsurf', 'qoder', 'codebuddy', or default 'claude') - """ - import os - - # Check environment variable first - env_platform = os.environ.get("TRELLIS_PLATFORM", "").lower() - if env_platform in ( - "claude", - "opencode", - "cursor", - "iflow", - "codex", - "kilo", - "kiro", - "gemini", - "antigravity", - "windsurf", - "qoder", - "codebuddy", - "copilot", - "droid", - ): - return env_platform # type: ignore - - # Check for .opencode directory (OpenCode-specific) - if (project_root / ".opencode").is_dir(): - return "opencode" - - # Check for .iflow directory (iFlow-specific) - if (project_root / ".iflow").is_dir(): - return "iflow" - - # Check for .cursor directory (Cursor-specific) - # Only detect as cursor if .claude doesn't exist (to avoid confusion) - if (project_root / ".cursor").is_dir() and not (project_root / ".claude").is_dir(): - return "cursor" - - # Check for .gemini directory (Gemini CLI-specific) - if (project_root / ".gemini").is_dir(): - return "gemini" - - # Check for .codex directory (Codex-specific) - # .agents/skills/ alone does NOT trigger codex detection (it's a shared standard) - if (project_root / ".codex").is_dir() and not _has_other_platform_dir( - project_root, {".codex", ".agents"} - ): - return "codex" - - # Check for .kilocode directory (Kilo-specific) - if (project_root / ".kilocode").is_dir(): - return "kilo" - - # Check for Kiro skills directory only when no other platform config exists - if (project_root / ".kiro" / "skills").is_dir() and not _has_other_platform_dir( - project_root, {".kiro"} - ): - return "kiro" - - # Check for Antigravity workflow directory only when no other platform config exists - if ( - project_root / ".agent" / "workflows" - ).is_dir() and not _has_other_platform_dir( - project_root, {".agent", ".gemini"} - ): - return "antigravity" - - # Check for Windsurf workflow directory only when no other platform config exists - if ( - project_root / ".windsurf" / "workflows" - ).is_dir() and not _has_other_platform_dir( - project_root, {".windsurf"} - ): - return "windsurf" - - # Check for .codebuddy directory (CodeBuddy-specific) - if (project_root / ".codebuddy").is_dir(): - return "codebuddy" - - # Check for .qoder directory (Qoder-specific) - if (project_root / ".qoder").is_dir(): - return "qoder" - - # Check for .github/copilot directory (GitHub Copilot-specific) - if (project_root / ".github" / "copilot").is_dir(): - return "copilot" - - # Check for .factory directory (Factory Droid-specific) - if (project_root / ".factory").is_dir(): - return "droid" - - return "claude" - - -def get_cli_adapter_auto(project_root: Path) -> CLIAdapter: - """Get CLI adapter with auto-detected platform. - - Args: - project_root: Project root directory - - Returns: - CLIAdapter instance for detected platform - """ - platform = detect_platform(project_root) - return CLIAdapter(platform=platform) diff --git a/.trellis/scripts/common/config.py b/.trellis/scripts/common/config.py deleted file mode 100755 index ea1bdc36..00000000 --- a/.trellis/scripts/common/config.py +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/env python3 -""" -Trellis configuration reader. - -Reads settings from .trellis/config.yaml with sensible defaults. -""" - -from __future__ import annotations - -import sys -from pathlib import Path - -from .paths import DIR_WORKFLOW, get_repo_root -from .worktree import parse_simple_yaml - - -# Defaults -DEFAULT_SESSION_COMMIT_MESSAGE = "chore: record journal" -DEFAULT_MAX_JOURNAL_LINES = 2000 - -CONFIG_FILE = "config.yaml" - - -def _is_true_config_value(value: object) -> bool: - """Return True when a config value represents an enabled flag.""" - if isinstance(value, bool): - return value - if isinstance(value, str): - return value.strip().lower() == "true" - return False - - -def _get_config_path(repo_root: Path | None = None) -> Path: - """Get path to config.yaml.""" - root = repo_root or get_repo_root() - return root / DIR_WORKFLOW / CONFIG_FILE - - -def _load_config(repo_root: Path | None = None) -> dict: - """Load and parse config.yaml. Returns empty dict on any error.""" - config_file = _get_config_path(repo_root) - try: - content = config_file.read_text(encoding="utf-8") - return parse_simple_yaml(content) - except (OSError, IOError): - return {} - - -def get_session_commit_message(repo_root: Path | None = None) -> str: - """Get the commit message for auto-committing session records.""" - config = _load_config(repo_root) - return config.get("session_commit_message", DEFAULT_SESSION_COMMIT_MESSAGE) - - -def get_max_journal_lines(repo_root: Path | None = None) -> int: - """Get the maximum lines per journal file.""" - config = _load_config(repo_root) - value = config.get("max_journal_lines", DEFAULT_MAX_JOURNAL_LINES) - try: - return int(value) - except (ValueError, TypeError): - return DEFAULT_MAX_JOURNAL_LINES - - -def get_hooks(event: str, repo_root: Path | None = None) -> list[str]: - """Get hook commands for a lifecycle event. - - Args: - event: Event name (e.g. "after_create", "after_archive"). - repo_root: Repository root path. - - Returns: - List of shell commands to execute, empty if none configured. - """ - config = _load_config(repo_root) - hooks = config.get("hooks") - if not isinstance(hooks, dict): - return [] - commands = hooks.get(event) - if isinstance(commands, list): - return [str(c) for c in commands] - return [] - - -# ============================================================================= -# Monorepo / Packages -# ============================================================================= - - -def get_packages(repo_root: Path | None = None) -> dict[str, dict] | None: - """Get monorepo package declarations. - - Returns: - Dict mapping package name to its config (path, type, etc.), - or None if not configured (single-repo mode). - - Example return: - {"cli": {"path": "packages/cli"}, "docs-site": {"path": "docs-site", "type": "submodule"}} - """ - config = _load_config(repo_root) - packages = config.get("packages") - if not isinstance(packages, dict): - return None - # Ensure each value is a dict (filter out scalar entries) - filtered = {k: v for k, v in packages.items() if isinstance(v, dict)} - if not filtered: - return None - return filtered - - -def get_default_package(repo_root: Path | None = None) -> str | None: - """Get the default package name from config. - - Returns: - Package name string, or None if not configured. - """ - config = _load_config(repo_root) - value = config.get("default_package") - return str(value) if value else None - - -def get_submodule_packages(repo_root: Path | None = None) -> dict[str, str]: - """Get packages that are git submodules. - - Returns: - Dict mapping package name to its path for submodule-type packages. - Empty dict if none configured. - - Example return: - {"docs-site": "docs-site"} - """ - packages = get_packages(repo_root) - if packages is None: - return {} - return { - name: cfg.get("path", name) - for name, cfg in packages.items() - if cfg.get("type") == "submodule" - } - - -def get_git_packages(repo_root: Path | None = None) -> dict[str, str]: - """Get packages that have their own independent git repository. - - These are sub-directories with their own .git (not submodules), - marked with ``git: true`` in config.yaml. - - Returns: - Dict mapping package name to its path for git-repo packages. - Empty dict if none configured. - - Example config:: - - packages: - backend: - path: iqs - git: true - - Example return:: - - {"backend": "iqs"} - """ - packages = get_packages(repo_root) - if packages is None: - return {} - return { - name: cfg.get("path", name) - for name, cfg in packages.items() - if _is_true_config_value(cfg.get("git")) - } - - -def is_monorepo(repo_root: Path | None = None) -> bool: - """Check if the project is configured as a monorepo (has packages in config).""" - return get_packages(repo_root) is not None - - -def get_spec_base(package: str | None = None, repo_root: Path | None = None) -> str: - """Get the spec directory base path relative to .trellis/. - - Single-repo: returns "spec" - Monorepo with package: returns "spec/<package>" - Monorepo without package: returns "spec" (caller should specify package) - """ - if package and is_monorepo(repo_root): - return f"spec/{package}" - return "spec" - - -def validate_package(package: str, repo_root: Path | None = None) -> bool: - """Check if a package name is valid in this project. - - Single-repo (no packages configured): always returns True. - Monorepo: returns True only if package exists in config.yaml packages. - """ - packages = get_packages(repo_root) - if packages is None: - return True # Single-repo, no validation needed - return package in packages - - -def resolve_package( - task_package: str | None = None, - repo_root: Path | None = None, -) -> str | None: - """Resolve package from inferred sources with validation. - - Checks in order: task_package → default_package. - Invalid inferred values print a warning to stderr and are skipped. - - Returns: - Resolved package name, or None if no valid package found. - - Note: - CLI --package should be validated separately by the caller - (fail-fast with available packages list on error). - """ - packages = get_packages(repo_root) - if packages is None: - return None # Single-repo, no package needed - - # Try task_package (guard against non-string values from malformed JSON) - if task_package and isinstance(task_package, str): - if task_package in packages: - return task_package - print( - f"Warning: task.json package '{task_package}' not found in config, skipping", - file=sys.stderr, - ) - - # Try default_package - default = get_default_package(repo_root) - if default: - if default in packages: - return default - print( - f"Warning: default_package '{default}' not found in config, skipping", - file=sys.stderr, - ) - - return None - - -def get_spec_scope(repo_root: Path | None = None) -> list[str] | str | None: - """Get session.spec_scope configuration. - - Returns: - list[str]: Package names to include in spec scanning. - str: "active_task" to use current task's package. - None: No scope configured (scan all packages). - """ - config = _load_config(repo_root) - session = config.get("session") - if not isinstance(session, dict): - return None - - scope = session.get("spec_scope") - if scope is None: - return None - if isinstance(scope, str): - return scope # e.g. "active_task" - if isinstance(scope, list): - return [str(s) for s in scope] - return None diff --git a/.trellis/scripts/common/developer.py b/.trellis/scripts/common/developer.py deleted file mode 100755 index c203a316..00000000 --- a/.trellis/scripts/common/developer.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -""" -Developer management utilities. - -Provides: - init_developer - Initialize developer - ensure_developer - Ensure developer is initialized (exit if not) - show_developer_info - Show developer information -""" - -from __future__ import annotations - -import sys -from datetime import datetime -from pathlib import Path - -from .paths import ( - DIR_WORKFLOW, - DIR_WORKSPACE, - DIR_TASKS, - FILE_DEVELOPER, - FILE_JOURNAL_PREFIX, - get_repo_root, - get_developer, - check_developer, -) - - -# ============================================================================= -# Developer Initialization -# ============================================================================= - -def init_developer(name: str, repo_root: Path | None = None) -> bool: - """Initialize developer. - - Creates: - - .trellis/.developer file with developer info - - .trellis/workspace/<name>/ directory structure - - Initial journal file and index.md - - Args: - name: Developer name. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True on success, False on error. - """ - if not name: - print("Error: developer name is required", file=sys.stderr) - return False - - if repo_root is None: - repo_root = get_repo_root() - - dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER - workspace_dir = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / name - - # Create .developer file - initialized_at = datetime.now().isoformat() - try: - dev_file.write_text( - f"name={name}\ninitialized_at={initialized_at}\n", - encoding="utf-8" - ) - except (OSError, IOError) as e: - print(f"Error: Failed to create .developer file: {e}", file=sys.stderr) - return False - - # Create workspace directory structure - try: - workspace_dir.mkdir(parents=True, exist_ok=True) - except (OSError, IOError) as e: - print(f"Error: Failed to create workspace directory: {e}", file=sys.stderr) - return False - - # Create initial journal file - journal_file = workspace_dir / f"{FILE_JOURNAL_PREFIX}1.md" - if not journal_file.exists(): - today = datetime.now().strftime("%Y-%m-%d") - journal_content = f"""# Journal - {name} (Part 1) - -> AI development session journal -> Started: {today} - ---- - -""" - try: - journal_file.write_text(journal_content, encoding="utf-8") - except (OSError, IOError) as e: - print(f"Error: Failed to create journal file: {e}", file=sys.stderr) - return False - - # Create index.md with markers for auto-update - index_file = workspace_dir / "index.md" - if not index_file.exists(): - index_content = f"""# Workspace Index - {name} - -> Journal tracking for AI development sessions. - ---- - -## Current Status - -<!-- @@@auto:current-status --> -- **Active File**: `journal-1.md` -- **Total Sessions**: 0 -- **Last Active**: - -<!-- @@@/auto:current-status --> - ---- - -## Active Documents - -<!-- @@@auto:active-documents --> -| File | Lines | Status | -|------|-------|--------| -| `journal-1.md` | ~0 | Active | -<!-- @@@/auto:active-documents --> - ---- - -## Session History - -<!-- @@@auto:session-history --> -| # | Date | Title | Commits | Branch | -|---|------|-------|---------|--------| -<!-- @@@/auto:session-history --> - ---- - -## Notes - -- Sessions are appended to journal files -- New journal file created when current exceeds 2000 lines -- Use `add_session.py` to record sessions -""" - try: - index_file.write_text(index_content, encoding="utf-8") - except (OSError, IOError) as e: - print(f"Error: Failed to create index.md: {e}", file=sys.stderr) - return False - - print(f"Developer initialized: {name}") - print(f" .developer file: {dev_file}") - print(f" Workspace dir: {workspace_dir}") - - return True - - -def ensure_developer(repo_root: Path | None = None) -> None: - """Ensure developer is initialized, exit if not. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - """ - if repo_root is None: - repo_root = get_repo_root() - - if not check_developer(repo_root): - print("Error: Developer not initialized.", file=sys.stderr) - print(f"Run: python3 ./{DIR_WORKFLOW}/scripts/init_developer.py <your-name>", file=sys.stderr) - sys.exit(1) - - -def show_developer_info(repo_root: Path | None = None) -> None: - """Show developer information. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - """ - if repo_root is None: - repo_root = get_repo_root() - - developer = get_developer(repo_root) - - if not developer: - print("Developer: (not initialized)") - else: - print(f"Developer: {developer}") - print(f"Workspace: {DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/") - print(f"Tasks: {DIR_WORKFLOW}/{DIR_TASKS}/") - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - show_developer_info() diff --git a/.trellis/scripts/common/git.py b/.trellis/scripts/common/git.py deleted file mode 100755 index c4bf29f5..00000000 --- a/.trellis/scripts/common/git.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Git command execution utility. - -Single source of truth for running git commands across all Trellis scripts. -""" - -from __future__ import annotations - -import subprocess -from pathlib import Path - - -def run_git(args: list[str], cwd: Path | None = None) -> tuple[int, str, str]: - """Run a git command and return (returncode, stdout, stderr). - - Uses UTF-8 encoding with -c i18n.logOutputEncoding=UTF-8 to ensure - consistent output across all platforms (Windows, macOS, Linux). - """ - try: - git_args = ["git", "-c", "i18n.logOutputEncoding=UTF-8"] + args - result = subprocess.run( - git_args, - cwd=cwd, - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - return result.returncode, result.stdout, result.stderr - except Exception as e: - return 1, "", str(e) diff --git a/.trellis/scripts/common/git_context.py b/.trellis/scripts/common/git_context.py deleted file mode 100755 index 397c6d21..00000000 --- a/.trellis/scripts/common/git_context.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Git and Session Context utilities. - -Entry shim — delegates to session_context and packages_context. - -Provides: - output_json - Output context in JSON format - output_text - Output context in text format -""" - -from __future__ import annotations - -import json - -from .git import run_git -from .session_context import ( - get_context_json, - get_context_text, - get_context_record_json, - get_context_text_record, - output_json, - output_text, -) -from .packages_context import ( - get_context_packages_text, - get_context_packages_json, -) - -# Backward-compatible alias — external modules import this name -_run_git_command = run_git - - -# ============================================================================= -# Main Entry -# ============================================================================= - -def main() -> None: - """CLI entry point.""" - import argparse - - parser = argparse.ArgumentParser(description="Get Session Context for AI Agent") - parser.add_argument( - "--json", - "-j", - action="store_true", - help="Output in JSON format (works with any --mode)", - ) - parser.add_argument( - "--mode", - "-m", - choices=["default", "record", "packages"], - default="default", - help="Output mode: default (full context), record (for record-session), packages (package info only)", - ) - - args = parser.parse_args() - - if args.mode == "record": - if args.json: - print(json.dumps(get_context_record_json(), indent=2, ensure_ascii=False)) - else: - print(get_context_text_record()) - elif args.mode == "packages": - if args.json: - print(json.dumps(get_context_packages_json(), indent=2, ensure_ascii=False)) - else: - print(get_context_packages_text()) - else: - if args.json: - output_json() - else: - output_text() - - -if __name__ == "__main__": - main() diff --git a/.trellis/scripts/common/io.py b/.trellis/scripts/common/io.py deleted file mode 100755 index 44288f41..00000000 --- a/.trellis/scripts/common/io.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -JSON file I/O utilities. - -Provides read_json and write_json as the single source of truth -for JSON file operations across all Trellis scripts. -""" - -from __future__ import annotations - -import json -from pathlib import Path - - -def read_json(path: Path) -> dict | None: - """Read and parse a JSON file. - - Returns None if the file doesn't exist, is invalid JSON, or can't be read. - """ - try: - return json.loads(path.read_text(encoding="utf-8")) - except (FileNotFoundError, json.JSONDecodeError, OSError): - return None - - -def write_json(path: Path, data: dict) -> bool: - """Write dict to JSON file with pretty formatting. - - Returns True on success, False on error. - """ - try: - path.write_text( - json.dumps(data, indent=2, ensure_ascii=False), - encoding="utf-8", - ) - return True - except (OSError, IOError): - return False diff --git a/.trellis/scripts/common/log.py b/.trellis/scripts/common/log.py deleted file mode 100755 index 839c643b..00000000 --- a/.trellis/scripts/common/log.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Terminal output utilities: colors and structured logging. - -Single source of truth for Colors and log_* functions -used across all Trellis scripts. -""" - -from __future__ import annotations - - -class Colors: - """ANSI color codes for terminal output.""" - - RED = "\033[0;31m" - GREEN = "\033[0;32m" - YELLOW = "\033[1;33m" - BLUE = "\033[0;34m" - CYAN = "\033[0;36m" - DIM = "\033[2m" - NC = "\033[0m" # No Color / Reset - - -def colored(text: str, color: str) -> str: - """Apply ANSI color to text.""" - return f"{color}{text}{Colors.NC}" - - -def log_info(msg: str) -> None: - """Print info-level message with [INFO] prefix.""" - print(f"{Colors.BLUE}[INFO]{Colors.NC} {msg}") - - -def log_success(msg: str) -> None: - """Print success message with [SUCCESS] prefix.""" - print(f"{Colors.GREEN}[SUCCESS]{Colors.NC} {msg}") - - -def log_warn(msg: str) -> None: - """Print warning message with [WARN] prefix.""" - print(f"{Colors.YELLOW}[WARN]{Colors.NC} {msg}") - - -def log_error(msg: str) -> None: - """Print error message with [ERROR] prefix.""" - print(f"{Colors.RED}[ERROR]{Colors.NC} {msg}") diff --git a/.trellis/scripts/common/packages_context.py b/.trellis/scripts/common/packages_context.py deleted file mode 100755 index e7d4e8c1..00000000 --- a/.trellis/scripts/common/packages_context.py +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/env python3 -""" -Package discovery and context output. - -Provides: - get_packages_info - Get structured package info - get_packages_section - Build PACKAGES text section - get_context_packages_text - Full packages text output (--mode packages) - get_context_packages_json - Full packages JSON output (--mode packages --json) -""" - -from __future__ import annotations - -from pathlib import Path - -from .config import _is_true_config_value, get_default_package, get_packages, get_spec_scope -from .paths import ( - DIR_SPEC, - DIR_WORKFLOW, - get_current_task, - get_repo_root, -) -from .tasks import load_task - - -# ============================================================================= -# Internal Helpers -# ============================================================================= - -def _scan_spec_layers(spec_dir: Path, package: str | None = None) -> list[str]: - """Scan spec directory for available layers (subdirectories). - - For monorepo: scans spec/<package>/ - For single-repo: scans spec/ - """ - target = spec_dir / package if package else spec_dir - if not target.is_dir(): - return [] - return sorted( - d.name for d in target.iterdir() if d.is_dir() and d.name != "guides" - ) - - -def _get_active_task_package(repo_root: Path) -> str | None: - """Get the package field from the active task's task.json.""" - current = get_current_task(repo_root) - if not current: - return None - ct = load_task(repo_root / current) - return ct.package if ct and ct.package else None - - -def _resolve_scope_set( - packages: dict, - spec_scope, - task_pkg: str | None, - default_pkg: str | None, -) -> set | None: - """Resolve spec_scope to a set of allowed package names, or None for full scan.""" - if not packages: - return None - - if spec_scope is None: - return None - - if isinstance(spec_scope, str) and spec_scope == "active_task": - if task_pkg and task_pkg in packages: - return {task_pkg} - if default_pkg and default_pkg in packages: - return {default_pkg} - return None - - if isinstance(spec_scope, list): - valid = {e for e in spec_scope if e in packages} - if valid: - return valid - # All invalid: fallback - if task_pkg and task_pkg in packages: - return {task_pkg} - if default_pkg and default_pkg in packages: - return {default_pkg} - return None - - return None - - -# ============================================================================= -# Public Functions -# ============================================================================= - -def get_packages_info(repo_root: Path) -> list[dict]: - """Get structured package info for monorepo projects. - - Returns list of dicts with keys: name, path, type, default, specLayers, - isSubmodule, isGitRepo. - Returns empty list for single-repo projects. - """ - packages = get_packages(repo_root) - if not packages: - return [] - - default_pkg = get_default_package(repo_root) - spec_dir = repo_root / DIR_WORKFLOW / DIR_SPEC - result = [] - - for pkg_name, pkg_config in packages.items(): - pkg_path = pkg_config.get("path", pkg_name) if isinstance(pkg_config, dict) else str(pkg_config) - pkg_type = pkg_config.get("type", "local") if isinstance(pkg_config, dict) else "local" - pkg_git = pkg_config.get("git", False) if isinstance(pkg_config, dict) else False - layers = _scan_spec_layers(spec_dir, pkg_name) - - result.append({ - "name": pkg_name, - "path": pkg_path, - "type": pkg_type, - "default": pkg_name == default_pkg, - "specLayers": layers, - "isSubmodule": pkg_type == "submodule", - "isGitRepo": _is_true_config_value(pkg_git), - }) - - return result - - -def get_packages_section(repo_root: Path) -> str: - """Build the PACKAGES section for text output.""" - spec_dir = repo_root / DIR_WORKFLOW / DIR_SPEC - pkg_info = get_packages_info(repo_root) - - lines: list[str] = [] - lines.append("## PACKAGES") - - if not pkg_info: - lines.append("(single-repo mode)") - layers = _scan_spec_layers(spec_dir) - if layers: - lines.append(f"Spec layers: {', '.join(layers)}") - return "\n".join(lines) - - default_pkg = get_default_package(repo_root) - - for pkg in pkg_info: - layers_str = f" [{', '.join(pkg['specLayers'])}]" if pkg["specLayers"] else "" - submodule_tag = " (submodule)" if pkg["isSubmodule"] else "" - git_repo_tag = " (git repo)" if pkg["isGitRepo"] else "" - default_tag = " *" if pkg["default"] else "" - lines.append( - f"- {pkg['name']:<16} {pkg['path']:<20}{layers_str}{submodule_tag}{git_repo_tag}{default_tag}" - ) - - if default_pkg: - lines.append(f"Default package: {default_pkg}") - - return "\n".join(lines) - - -def get_context_packages_text(repo_root: Path | None = None) -> str: - """Get packages context as formatted text (for --mode packages).""" - if repo_root is None: - repo_root = get_repo_root() - - pkg_info = get_packages_info(repo_root) - lines: list[str] = [] - - if not pkg_info: - spec_dir = repo_root / DIR_WORKFLOW / DIR_SPEC - lines.append("Single-repo project (no packages configured)") - lines.append("") - layers = _scan_spec_layers(spec_dir) - if layers: - lines.append(f"Spec layers: {', '.join(layers)}") - return "\n".join(lines) - - # Resolve scope for annotations - packages_dict = get_packages(repo_root) or {} - default_pkg = get_default_package(repo_root) - spec_scope = get_spec_scope(repo_root) - task_pkg = _get_active_task_package(repo_root) - scope_set = _resolve_scope_set(packages_dict, spec_scope, task_pkg, default_pkg) - - lines.append("## PACKAGES") - lines.append("") - for pkg in pkg_info: - default_tag = " (default)" if pkg["default"] else "" - type_tag = f" [{pkg['type']}]" if pkg["type"] != "local" else "" - git_tag = " [git repo]" if pkg["isGitRepo"] else "" - - # Scope annotation - scope_tag = "" - if scope_set is not None and pkg["name"] not in scope_set: - scope_tag = " (out of scope)" - - lines.append(f"### {pkg['name']}{default_tag}{type_tag}{git_tag}{scope_tag}") - lines.append(f"Path: {pkg['path']}") - if pkg["specLayers"]: - lines.append(f"Spec layers: {', '.join(pkg['specLayers'])}") - for layer in pkg["specLayers"]: - lines.append(f" - .trellis/spec/{pkg['name']}/{layer}/index.md") - else: - lines.append("Spec: not configured") - lines.append("") - - # Also show shared guides - guides_dir = repo_root / DIR_WORKFLOW / DIR_SPEC / "guides" - if guides_dir.is_dir(): - lines.append("### Shared Guides (always included)") - lines.append("Path: .trellis/spec/guides/index.md") - lines.append("") - - return "\n".join(lines) - - -def get_context_packages_json(repo_root: Path | None = None) -> dict: - """Get packages context as a dictionary (for --mode packages --json).""" - if repo_root is None: - repo_root = get_repo_root() - - pkg_info = get_packages_info(repo_root) - - if not pkg_info: - spec_dir = repo_root / DIR_WORKFLOW / DIR_SPEC - layers = _scan_spec_layers(spec_dir) - return { - "mode": "single-repo", - "specLayers": layers, - } - - default_pkg = get_default_package(repo_root) - spec_scope = get_spec_scope(repo_root) - task_pkg = _get_active_task_package(repo_root) - - return { - "mode": "monorepo", - "packages": pkg_info, - "defaultPackage": default_pkg, - "specScope": spec_scope, - "activeTaskPackage": task_pkg, - } diff --git a/.trellis/scripts/common/paths.py b/.trellis/scripts/common/paths.py deleted file mode 100755 index 7a28a3da..00000000 --- a/.trellis/scripts/common/paths.py +++ /dev/null @@ -1,444 +0,0 @@ -#!/usr/bin/env python3 -""" -Common path utilities for Trellis workflow. - -Provides: - get_repo_root - Get repository root directory - get_developer - Get developer name - get_workspace_dir - Get developer workspace directory - get_tasks_dir - Get tasks directory - get_active_journal_file - Get current journal file -""" - -from __future__ import annotations - -import re -from datetime import datetime -from pathlib import Path - - -# ============================================================================= -# Path Constants (change here to rename directories) -# ============================================================================= - -# Directory names -DIR_WORKFLOW = ".trellis" -DIR_WORKSPACE = "workspace" -DIR_TASKS = "tasks" -DIR_ARCHIVE = "archive" -DIR_SPEC = "spec" -DIR_SCRIPTS = "scripts" - -# File names -FILE_DEVELOPER = ".developer" -FILE_CURRENT_TASK = ".current-task" -FILE_TASK_JSON = "task.json" -FILE_JOURNAL_PREFIX = "journal-" - - -# ============================================================================= -# Repository Root -# ============================================================================= - -def get_repo_root(start_path: Path | None = None) -> Path: - """Find the nearest directory containing .trellis/ folder. - - This handles nested git repos correctly (e.g., test project inside another repo). - - Args: - start_path: Starting directory to search from. Defaults to current directory. - - Returns: - Path to repository root, or current directory if no .trellis/ found. - """ - current = (start_path or Path.cwd()).resolve() - - while current != current.parent: - if (current / DIR_WORKFLOW).is_dir(): - return current - current = current.parent - - # Fallback to current directory if no .trellis/ found - return Path.cwd().resolve() - - -# ============================================================================= -# Developer -# ============================================================================= - -def get_developer(repo_root: Path | None = None) -> str | None: - """Get developer name from .developer file. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Developer name or None if not initialized. - """ - if repo_root is None: - repo_root = get_repo_root() - - dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER - - if not dev_file.is_file(): - return None - - try: - content = dev_file.read_text(encoding="utf-8") - for line in content.splitlines(): - if line.startswith("name="): - return line.split("=", 1)[1].strip() - except (OSError, IOError): - pass - - return None - - -def check_developer(repo_root: Path | None = None) -> bool: - """Check if developer is initialized. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True if developer is initialized. - """ - return get_developer(repo_root) is not None - - -# ============================================================================= -# Tasks Directory -# ============================================================================= - -def get_tasks_dir(repo_root: Path | None = None) -> Path: - """Get tasks directory path. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to tasks directory. - """ - if repo_root is None: - repo_root = get_repo_root() - return repo_root / DIR_WORKFLOW / DIR_TASKS - - -# ============================================================================= -# Workspace Directory -# ============================================================================= - -def get_workspace_dir(repo_root: Path | None = None) -> Path | None: - """Get developer workspace directory. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to workspace directory or None if developer not set. - """ - if repo_root is None: - repo_root = get_repo_root() - - developer = get_developer(repo_root) - if developer: - return repo_root / DIR_WORKFLOW / DIR_WORKSPACE / developer - return None - - -# ============================================================================= -# Journal File -# ============================================================================= - -def get_active_journal_file(repo_root: Path | None = None) -> Path | None: - """Get the current active journal file. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to active journal file or None if not found. - """ - if repo_root is None: - repo_root = get_repo_root() - - workspace_dir = get_workspace_dir(repo_root) - if workspace_dir is None or not workspace_dir.is_dir(): - return None - - latest: Path | None = None - highest = 0 - - for f in workspace_dir.glob(f"{FILE_JOURNAL_PREFIX}*.md"): - if not f.is_file(): - continue - - # Extract number from filename - name = f.stem # e.g., "journal-1" - match = re.search(r"(\d+)$", name) - if match: - num = int(match.group(1)) - if num > highest: - highest = num - latest = f - - return latest - - -def count_lines(file_path: Path) -> int: - """Count lines in a file. - - Args: - file_path: Path to file. - - Returns: - Number of lines, or 0 if file doesn't exist. - """ - if not file_path.is_file(): - return 0 - - try: - return len(file_path.read_text(encoding="utf-8").splitlines()) - except (OSError, IOError): - return 0 - - -# ============================================================================= -# Current Task Management -# ============================================================================= - -def _get_current_task_file(repo_root: Path | None = None) -> Path: - """Get .current-task file path. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to .current-task file. - """ - if repo_root is None: - repo_root = get_repo_root() - return repo_root / DIR_WORKFLOW / FILE_CURRENT_TASK - - -def normalize_task_ref(task_ref: str) -> str: - """Normalize a task ref for stable storage in .current-task. - - Stored refs should prefer repo-relative POSIX paths like - `.trellis/tasks/03-27-my-task`, even on Windows. Absolute paths are preserved - unless they can later be converted back to repo-relative form by callers. - """ - normalized = task_ref.strip() - if not normalized: - return "" - - path_obj = Path(normalized) - if path_obj.is_absolute(): - return str(path_obj) - - normalized = normalized.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - - if normalized.startswith(f"{DIR_TASKS}/"): - return f"{DIR_WORKFLOW}/{normalized}" - - return normalized - - -def resolve_task_ref(task_ref: str, repo_root: Path | None = None) -> Path | None: - """Resolve a task ref from .current-task to an absolute task directory path.""" - if repo_root is None: - repo_root = get_repo_root() - - normalized = normalize_task_ref(task_ref) - if not normalized: - return None - - path_obj = Path(normalized) - if path_obj.is_absolute(): - return path_obj - - if normalized.startswith(f"{DIR_WORKFLOW}/"): - return repo_root / path_obj - - return repo_root / DIR_WORKFLOW / DIR_TASKS / path_obj - - -def get_current_task(repo_root: Path | None = None) -> str | None: - """Get current task directory path (relative to repo_root). - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Relative path to current task directory or None. - """ - current_file = _get_current_task_file(repo_root) - - if not current_file.is_file(): - return None - - try: - content = current_file.read_text(encoding="utf-8").strip() - return normalize_task_ref(content) if content else None - except (OSError, IOError): - return None - - -def get_current_task_abs(repo_root: Path | None = None) -> Path | None: - """Get current task directory absolute path. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Absolute path to current task directory or None. - """ - if repo_root is None: - repo_root = get_repo_root() - - relative = get_current_task(repo_root) - if relative: - return resolve_task_ref(relative, repo_root) - return None - - -def set_current_task(task_path: str, repo_root: Path | None = None) -> bool: - """Set current task. - - Args: - task_path: Task directory path (relative to repo_root). - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True on success, False on error. - """ - if repo_root is None: - repo_root = get_repo_root() - - normalized = normalize_task_ref(task_path) - if not normalized: - return False - - # Verify task directory exists - full_path = resolve_task_ref(normalized, repo_root) - if full_path is None or not full_path.is_dir(): - return False - - try: - normalized = full_path.relative_to(repo_root).as_posix() - except ValueError: - normalized = str(full_path) - - current_file = _get_current_task_file(repo_root) - - try: - current_file.write_text(normalized, encoding="utf-8") - return True - except (OSError, IOError): - return False - - -def clear_current_task(repo_root: Path | None = None) -> bool: - """Clear current task. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True on success. - """ - current_file = _get_current_task_file(repo_root) - - try: - if current_file.is_file(): - current_file.unlink() - return True - except (OSError, IOError): - return False - - -def has_current_task(repo_root: Path | None = None) -> bool: - """Check if has current task. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True if current task is set. - """ - return get_current_task(repo_root) is not None - - -# ============================================================================= -# Task ID Generation -# ============================================================================= - -def generate_task_date_prefix() -> str: - """Generate task ID based on date (MM-DD format). - - Returns: - Date prefix string (e.g., "01-21"). - """ - return datetime.now().strftime("%m-%d") - - -# ============================================================================= -# Monorepo / Package Paths -# ============================================================================= - - -def get_spec_dir(package: str | None = None, repo_root: Path | None = None) -> Path: - """Get the spec directory path. - - Single-repo: .trellis/spec - Monorepo with package: .trellis/spec/<package> - - Uses lazy import to avoid circular dependency with config.py. - """ - if repo_root is None: - repo_root = get_repo_root() - - from .config import get_spec_base - - base = get_spec_base(package, repo_root) - return repo_root / DIR_WORKFLOW / base - - -def get_package_path(package: str, repo_root: Path | None = None) -> Path | None: - """Get a package's source directory absolute path from config. - - Returns: - Absolute path to the package directory, or None if not found. - """ - if repo_root is None: - repo_root = get_repo_root() - - from .config import get_packages - - packages = get_packages(repo_root) - if not packages or package not in packages: - return None - - info = packages[package] - if isinstance(info, dict): - rel_path = info.get("path", package) - else: - rel_path = str(info) - - return repo_root / rel_path - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - repo = get_repo_root() - print(f"Repository root: {repo}") - print(f"Developer: {get_developer(repo)}") - print(f"Tasks dir: {get_tasks_dir(repo)}") - print(f"Workspace dir: {get_workspace_dir(repo)}") - print(f"Journal file: {get_active_journal_file(repo)}") - print(f"Current task: {get_current_task(repo)}") diff --git a/.trellis/scripts/common/phase.py b/.trellis/scripts/common/phase.py deleted file mode 100755 index cf7670e1..00000000 --- a/.trellis/scripts/common/phase.py +++ /dev/null @@ -1,254 +0,0 @@ -#!/usr/bin/env python3 -""" -Phase Management Utilities. - -Centralized phase tracking for multi-agent pipeline. - -Provides: - get_current_phase - Returns current phase number - get_total_phases - Returns total phase count - get_phase_action - Returns action name for phase - get_phase_info - Returns "N/M (action)" format - set_phase - Sets current_phase - advance_phase - Advances to next phase - get_phase_for_action - Returns phase number for action - map_subagent_to_action - Map subagent type to action name - is_phase_completed - Check if phase is completed - is_current_action - Check if at specific action -""" - -from __future__ import annotations - -from pathlib import Path - -from .io import read_json, write_json - - -# ============================================================================= -# Internal Helpers (operate on pre-loaded data dict) -# ============================================================================= - -def _total_phases(data: dict) -> int: - """Get total phases from pre-loaded data.""" - next_action = data.get("next_action", []) - return len(next_action) if isinstance(next_action, list) else 0 - - -def _phase_action(data: dict, phase: int) -> str: - """Get action name for a phase from pre-loaded data.""" - next_action = data.get("next_action", []) - if isinstance(next_action, list): - for item in next_action: - if isinstance(item, dict) and item.get("phase") == phase: - return item.get("action", "unknown") - return "unknown" - - -def _phase_for_action(data: dict, action: str) -> int: - """Get phase number for an action name from pre-loaded data.""" - next_action = data.get("next_action", []) - if isinstance(next_action, list): - for item in next_action: - if isinstance(item, dict) and item.get("action") == action: - return item.get("phase", 0) - return 0 - - -# ============================================================================= -# Phase Functions -# ============================================================================= - -def get_current_phase(task_json: Path) -> int: - """Get current phase number. - - Args: - task_json: Path to task.json file. - - Returns: - Current phase number, or 0 if not found. - """ - data = read_json(task_json) - if not data: - return 0 - return data.get("current_phase", 0) or 0 - - -def get_total_phases(task_json: Path) -> int: - """Get total number of phases. - - Args: - task_json: Path to task.json file. - - Returns: - Total phase count, or 0 if not found. - """ - data = read_json(task_json) - if not data: - return 0 - return _total_phases(data) - - -def get_phase_action(task_json: Path, phase: int) -> str: - """Get action name for a specific phase. - - Args: - task_json: Path to task.json file. - phase: Phase number. - - Returns: - Action name, or "unknown" if not found. - """ - data = read_json(task_json) - if not data: - return "unknown" - return _phase_action(data, phase) - - -def get_phase_info(task_json: Path) -> str: - """Get formatted phase info: "N/M (action)". - - Args: - task_json: Path to task.json file. - - Returns: - Formatted string like "1/4 (implement)". - """ - data = read_json(task_json) - if not data: - return "N/A" - - current_phase = data.get("current_phase", 0) or 0 - total = _total_phases(data) - action_name = _phase_action(data, current_phase) - - if current_phase == 0 or current_phase is None: - return f"0/{total} (pending)" - else: - return f"{current_phase}/{total} ({action_name})" - - -def set_phase(task_json: Path, phase: int) -> bool: - """Set current phase to a specific value. - - Args: - task_json: Path to task.json file. - phase: Phase number to set. - - Returns: - True on success, False on error. - """ - data = read_json(task_json) - if not data: - return False - - data["current_phase"] = phase - return write_json(task_json, data) - - -def advance_phase(task_json: Path) -> bool: - """Advance to next phase. - - Args: - task_json: Path to task.json file. - - Returns: - True on success, False on error or at final phase. - """ - data = read_json(task_json) - if not data: - return False - - current = data.get("current_phase", 0) or 0 - total = _total_phases(data) - next_phase = current + 1 - - if next_phase > total: - return False # Already at final phase - - data["current_phase"] = next_phase - return write_json(task_json, data) - - -def get_phase_for_action(task_json: Path, action: str) -> int: - """Get phase number for a specific action name. - - Args: - task_json: Path to task.json file. - action: Action name. - - Returns: - Phase number, or 0 if not found. - """ - data = read_json(task_json) - if not data: - return 0 - return _phase_for_action(data, action) - - -def map_subagent_to_action(subagent_type: str) -> str: - """Map subagent type to action name. - - Used by hooks to determine which action a subagent corresponds to. - - Args: - subagent_type: Subagent type string. - - Returns: - Corresponding action name. - """ - mapping = { - "implement": "implement", - "check": "check", - "debug": "debug", - "research": "research", - } - return mapping.get(subagent_type, subagent_type) - - -def is_phase_completed(task_json: Path, phase: int) -> bool: - """Check if a phase is completed (current_phase > phase). - - Args: - task_json: Path to task.json file. - phase: Phase number to check. - - Returns: - True if phase is completed. - """ - current = get_current_phase(task_json) - return current > phase - - -def is_current_action(task_json: Path, action: str) -> bool: - """Check if we're at a specific action. - - Args: - task_json: Path to task.json file. - action: Action name to check. - - Returns: - True if current phase matches the action. - """ - data = read_json(task_json) - if not data: - return False - current = data.get("current_phase", 0) or 0 - action_phase = _phase_for_action(data, action) - return current == action_phase - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - import sys - - if len(sys.argv) > 1: - path = Path(sys.argv[1]) - print(f"Task JSON: {path}") - print(f"Phase info: {get_phase_info(path)}") - print(f"Current phase: {get_current_phase(path)}") - print(f"Total phases: {get_total_phases(path)}") - else: - print("Usage: python3 phase.py <task.json>") diff --git a/.trellis/scripts/common/registry.py b/.trellis/scripts/common/registry.py deleted file mode 100755 index 73e523d9..00000000 --- a/.trellis/scripts/common/registry.py +++ /dev/null @@ -1,335 +0,0 @@ -#!/usr/bin/env python3 -""" -Registry utility functions for multi-agent pipeline. - -Provides: - registry_get_file - Get registry file path - registry_get_agent_by_id - Find agent by ID - registry_get_agent_by_worktree - Find agent by worktree path - registry_get_task_dir - Get task dir for a worktree - registry_remove_by_id - Remove agent by ID - registry_remove_by_worktree - Remove agent by worktree path - registry_add_agent - Add agent to registry - registry_search_agent - Search agent by ID or task_dir - registry_list_agents - List all agents -""" - -from __future__ import annotations - -from datetime import datetime -from pathlib import Path - -from .io import read_json, write_json -from .paths import get_repo_root -from .worktree import get_agents_dir - - -# ============================================================================= -# Internal Helpers -# ============================================================================= - -def _load_registry( - repo_root: Path | None = None, -) -> tuple[Path | None, dict | None]: - """Load registry file and data in one step. - - Returns: - (registry_file_path, data_dict) — either may be None. - """ - if repo_root is None: - repo_root = get_repo_root() - - registry_file = registry_get_file(repo_root) - if not registry_file or not registry_file.is_file(): - return registry_file, None - - data = read_json(registry_file) - return registry_file, data - - -# ============================================================================= -# Registry File Access -# ============================================================================= - -def registry_get_file(repo_root: Path | None = None) -> Path | None: - """Get registry file path. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to registry.json, or None if agents dir not found. - """ - if repo_root is None: - repo_root = get_repo_root() - - agents_dir = get_agents_dir(repo_root) - if agents_dir: - return agents_dir / "registry.json" - return None - - -def _ensure_registry(repo_root: Path | None = None) -> Path | None: - """Ensure registry file exists with valid structure. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to registry file, or None if cannot create. - """ - if repo_root is None: - repo_root = get_repo_root() - - registry_file = registry_get_file(repo_root) - if not registry_file: - return None - - agents_dir = registry_file.parent - - try: - agents_dir.mkdir(parents=True, exist_ok=True) - - if not registry_file.exists(): - write_json(registry_file, {"agents": []}) - - return registry_file - except (OSError, IOError): - return None - - -# ============================================================================= -# Agent Lookup -# ============================================================================= - -def registry_get_agent_by_id( - agent_id: str, - repo_root: Path | None = None -) -> dict | None: - """Get agent by ID. - - Args: - agent_id: Agent ID. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Agent dict, or None if not found. - """ - _, data = _load_registry(repo_root) - if not data: - return None - - for agent in data.get("agents", []): - if agent.get("id") == agent_id: - return agent - - return None - - -def registry_get_agent_by_worktree( - worktree_path: str, - repo_root: Path | None = None -) -> dict | None: - """Get agent by worktree path. - - Args: - worktree_path: Worktree path. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Agent dict, or None if not found. - """ - _, data = _load_registry(repo_root) - if not data: - return None - - for agent in data.get("agents", []): - if agent.get("worktree_path") == worktree_path: - return agent - - return None - - -def registry_search_agent( - search: str, - repo_root: Path | None = None -) -> dict | None: - """Search agent by ID or task_dir containing search term. - - Args: - search: Search term. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - First matching agent dict, or None if not found. - """ - _, data = _load_registry(repo_root) - if not data: - return None - - for agent in data.get("agents", []): - # Exact ID match - if agent.get("id") == search: - return agent - # Partial match on task_dir - task_dir = agent.get("task_dir", "") - if search in task_dir: - return agent - - return None - - -def registry_get_task_dir( - worktree_path: str, - repo_root: Path | None = None -) -> str | None: - """Get task directory for a worktree. - - Args: - worktree_path: Worktree path. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Task directory path, or None if not found. - """ - _, data = _load_registry(repo_root) - if not data: - return None - - for agent in data.get("agents", []): - if agent.get("worktree_path") == worktree_path: - return agent.get("task_dir") - - return None - - -# ============================================================================= -# Agent Modification -# ============================================================================= - -def registry_remove_by_id(agent_id: str, repo_root: Path | None = None) -> bool: - """Remove agent by ID. - - Args: - agent_id: Agent ID. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True on success. - """ - registry_file, data = _load_registry(repo_root) - if not registry_file or not data: - return True # Nothing to remove - - agents = data.get("agents", []) - data["agents"] = [a for a in agents if a.get("id") != agent_id] - - return write_json(registry_file, data) - - -def registry_remove_by_worktree( - worktree_path: str, - repo_root: Path | None = None -) -> bool: - """Remove agent by worktree path. - - Args: - worktree_path: Worktree path. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True on success. - """ - registry_file, data = _load_registry(repo_root) - if not registry_file or not data: - return True # Nothing to remove - - agents = data.get("agents", []) - data["agents"] = [a for a in agents if a.get("worktree_path") != worktree_path] - - return write_json(registry_file, data) - - -def registry_add_agent( - agent_id: str, - worktree_path: str, - pid: int, - task_dir: str, - repo_root: Path | None = None, - platform: str = "claude", -) -> bool: - """Add agent to registry (replaces if same ID exists). - - Args: - agent_id: Agent ID. - worktree_path: Worktree path. - pid: Process ID. - task_dir: Task directory path. - repo_root: Repository root path. Defaults to auto-detected. - platform: Platform used (e.g., 'claude', 'opencode', 'codex', 'kiro', 'antigravity'). Defaults to 'claude'. - - Returns: - True on success. - """ - if repo_root is None: - repo_root = get_repo_root() - - registry_file = _ensure_registry(repo_root) - if not registry_file: - return False - - data = read_json(registry_file) - if not data: - data = {"agents": []} - - # Remove existing agent with same ID - agents = data.get("agents", []) - agents = [a for a in agents if a.get("id") != agent_id] - - # Create new agent record - started_at = datetime.now().isoformat() - new_agent = { - "id": agent_id, - "worktree_path": worktree_path, - "pid": pid, - "started_at": started_at, - "task_dir": task_dir, - "platform": platform, - } - - agents.append(new_agent) - data["agents"] = agents - - return write_json(registry_file, data) - - -def registry_list_agents(repo_root: Path | None = None) -> list[dict]: - """List all agents. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of agent dicts. - """ - _, data = _load_registry(repo_root) - if not data: - return [] - - return data.get("agents", []) - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - import json as json_mod - - repo = get_repo_root() - print(f"Repository root: {repo}") - print(f"Registry file: {registry_get_file(repo)}") - print() - print("Agents:") - agents = registry_list_agents(repo) - print(json_mod.dumps(agents, indent=2)) diff --git a/.trellis/scripts/common/session_context.py b/.trellis/scripts/common/session_context.py deleted file mode 100755 index 52c6a4a3..00000000 --- a/.trellis/scripts/common/session_context.py +++ /dev/null @@ -1,562 +0,0 @@ -#!/usr/bin/env python3 -""" -Session context generation (default + record modes). - -Provides: - get_context_json - JSON output for default mode - get_context_text - Text output for default mode - get_context_record_json - JSON for record mode - get_context_text_record - Text for record mode - output_json - Print JSON - output_text - Print text -""" - -from __future__ import annotations - -import json -from pathlib import Path - -from .config import get_git_packages -from .git import run_git -from .packages_context import get_packages_section -from .tasks import iter_active_tasks, load_task, get_all_statuses, children_progress -from .paths import ( - DIR_SCRIPTS, - DIR_SPEC, - DIR_TASKS, - DIR_WORKFLOW, - DIR_WORKSPACE, - count_lines, - get_active_journal_file, - get_current_task, - get_developer, - get_repo_root, - get_tasks_dir, -) - - -# ============================================================================= -# Helpers -# ============================================================================= - -def _collect_package_git_info(repo_root: Path) -> list[dict]: - """Collect git status and recent commits for packages with independent git repos. - - Only packages marked with ``git: true`` in config.yaml are included. - - Returns: - List of dicts with keys: name, path, branch, isClean, - uncommittedChanges, recentCommits. - Empty list if no git-repo packages are configured. - """ - git_pkgs = get_git_packages(repo_root) - if not git_pkgs: - return [] - - result = [] - for pkg_name, pkg_path in git_pkgs.items(): - pkg_dir = repo_root / pkg_path - if not (pkg_dir / ".git").exists(): - continue - - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=pkg_dir) - branch = branch_out.strip() or "unknown" - - _, status_out, _ = run_git(["status", "--porcelain"], cwd=pkg_dir) - changes = len([l for l in status_out.splitlines() if l.strip()]) - - _, log_out, _ = run_git(["log", "--oneline", "-5"], cwd=pkg_dir) - commits = [] - for line in log_out.splitlines(): - if line.strip(): - parts = line.split(" ", 1) - if len(parts) >= 2: - commits.append({"hash": parts[0], "message": parts[1]}) - elif len(parts) == 1: - commits.append({"hash": parts[0], "message": ""}) - - result.append({ - "name": pkg_name, - "path": pkg_path, - "branch": branch, - "isClean": changes == 0, - "uncommittedChanges": changes, - "recentCommits": commits, - }) - - return result - - -def _append_package_git_context(lines: list[str], package_git_info: list[dict]) -> None: - """Append Git status and recent commits for package repositories.""" - for pkg in package_git_info: - lines.append(f"## GIT STATUS ({pkg['name']}: {pkg['path']})") - lines.append(f"Branch: {pkg['branch']}") - if pkg["isClean"]: - lines.append("Working directory: Clean") - else: - lines.append( - f"Working directory: {pkg['uncommittedChanges']} uncommitted change(s)" - ) - lines.append("") - lines.append(f"## RECENT COMMITS ({pkg['name']}: {pkg['path']})") - if pkg["recentCommits"]: - for commit in pkg["recentCommits"]: - lines.append(f"{commit['hash']} {commit['message']}") - else: - lines.append("(no commits)") - lines.append("") - - -# ============================================================================= -# JSON Output -# ============================================================================= - -def get_context_json(repo_root: Path | None = None) -> dict: - """Get context as a dictionary. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Context dictionary. - """ - if repo_root is None: - repo_root = get_repo_root() - - developer = get_developer(repo_root) - tasks_dir = get_tasks_dir(repo_root) - journal_file = get_active_journal_file(repo_root) - - journal_lines = 0 - journal_relative = "" - if journal_file and developer: - journal_lines = count_lines(journal_file) - journal_relative = ( - f"{DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/{journal_file.name}" - ) - - # Git info - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - branch = branch_out.strip() or "unknown" - - _, status_out, _ = run_git(["status", "--porcelain"], cwd=repo_root) - git_status_count = len([line for line in status_out.splitlines() if line.strip()]) - is_clean = git_status_count == 0 - - # Recent commits - _, log_out, _ = run_git(["log", "--oneline", "-5"], cwd=repo_root) - commits = [] - for line in log_out.splitlines(): - if line.strip(): - parts = line.split(" ", 1) - if len(parts) >= 2: - commits.append({"hash": parts[0], "message": parts[1]}) - elif len(parts) == 1: - commits.append({"hash": parts[0], "message": ""}) - - # Tasks - tasks = [ - { - "dir": t.dir_name, - "name": t.name, - "status": t.status, - "children": list(t.children), - "parent": t.parent, - } - for t in iter_active_tasks(tasks_dir) - ] - - # Package git repos (independent sub-repositories) - pkg_git_info = _collect_package_git_info(repo_root) - - result = { - "developer": developer or "", - "git": { - "branch": branch, - "isClean": is_clean, - "uncommittedChanges": git_status_count, - "recentCommits": commits, - }, - "tasks": { - "active": tasks, - "directory": f"{DIR_WORKFLOW}/{DIR_TASKS}", - }, - "journal": { - "file": journal_relative, - "lines": journal_lines, - "nearLimit": journal_lines > 1800, - }, - } - - if pkg_git_info: - result["packageGit"] = pkg_git_info - - return result - - -def output_json(repo_root: Path | None = None) -> None: - """Output context in JSON format. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - """ - context = get_context_json(repo_root) - print(json.dumps(context, indent=2, ensure_ascii=False)) - - -# ============================================================================= -# Text Output -# ============================================================================= - -def get_context_text(repo_root: Path | None = None) -> str: - """Get context as formatted text. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Formatted text output. - """ - if repo_root is None: - repo_root = get_repo_root() - - lines = [] - lines.append("========================================") - lines.append("SESSION CONTEXT") - lines.append("========================================") - lines.append("") - - developer = get_developer(repo_root) - - # Developer section - lines.append("## DEVELOPER") - if not developer: - lines.append( - f"ERROR: Not initialized. Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <name>" - ) - return "\n".join(lines) - - lines.append(f"Name: {developer}") - lines.append("") - - # Git status - lines.append("## GIT STATUS") - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - branch = branch_out.strip() or "unknown" - lines.append(f"Branch: {branch}") - - _, status_out, _ = run_git(["status", "--porcelain"], cwd=repo_root) - status_lines = [line for line in status_out.splitlines() if line.strip()] - status_count = len(status_lines) - - if status_count == 0: - lines.append("Working directory: Clean") - else: - lines.append(f"Working directory: {status_count} uncommitted change(s)") - lines.append("") - lines.append("Changes:") - _, short_out, _ = run_git(["status", "--short"], cwd=repo_root) - for line in short_out.splitlines()[:10]: - lines.append(line) - lines.append("") - - # Recent commits - lines.append("## RECENT COMMITS") - _, log_out, _ = run_git(["log", "--oneline", "-5"], cwd=repo_root) - if log_out.strip(): - for line in log_out.splitlines(): - lines.append(line) - else: - lines.append("(no commits)") - lines.append("") - - # Package git repos — independent sub-repositories - _append_package_git_context(lines, _collect_package_git_info(repo_root)) - - # Current task - lines.append("## CURRENT TASK") - current_task = get_current_task(repo_root) - if current_task: - current_task_dir = repo_root / current_task - lines.append(f"Path: {current_task}") - - ct = load_task(current_task_dir) - if ct: - lines.append(f"Name: {ct.name}") - lines.append(f"Status: {ct.status}") - lines.append(f"Created: {ct.raw.get('createdAt', 'unknown')}") - if ct.description: - lines.append(f"Description: {ct.description}") - - # Check for prd.md - prd_file = current_task_dir / "prd.md" - if prd_file.is_file(): - lines.append("") - lines.append("[!] This task has prd.md - read it for task details") - else: - lines.append("(none)") - lines.append("") - - # Active tasks - lines.append("## ACTIVE TASKS") - tasks_dir = get_tasks_dir(repo_root) - task_count = 0 - - # Collect all task data for hierarchy display - all_tasks = {t.dir_name: t for t in iter_active_tasks(tasks_dir)} - all_statuses = {name: t.status for name, t in all_tasks.items()} - - def _print_task_tree(name: str, indent: int = 0) -> None: - nonlocal task_count - t = all_tasks[name] - progress = children_progress(t.children, all_statuses) - prefix = " " * indent - lines.append(f"{prefix}- {name}/ ({t.status}){progress} @{t.assignee or '-'}") - task_count += 1 - for child in t.children: - if child in all_tasks: - _print_task_tree(child, indent + 1) - - for dir_name in sorted(all_tasks.keys()): - if not all_tasks[dir_name].parent: - _print_task_tree(dir_name) - - if task_count == 0: - lines.append("(no active tasks)") - lines.append(f"Total: {task_count} active task(s)") - lines.append("") - - # My tasks - lines.append("## MY TASKS (Assigned to me)") - my_task_count = 0 - - for t in all_tasks.values(): - if t.assignee == developer and t.status != "done": - progress = children_progress(t.children, all_statuses) - lines.append(f"- [{t.priority}] {t.title} ({t.status}){progress}") - my_task_count += 1 - - if my_task_count == 0: - lines.append("(no tasks assigned to you)") - lines.append("") - - # Journal file - lines.append("## JOURNAL FILE") - journal_file = get_active_journal_file(repo_root) - if journal_file: - journal_lines = count_lines(journal_file) - relative = f"{DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/{journal_file.name}" - lines.append(f"Active file: {relative}") - lines.append(f"Line count: {journal_lines} / 2000") - if journal_lines > 1800: - lines.append("[!] WARNING: Approaching 2000 line limit!") - else: - lines.append("No journal file found") - lines.append("") - - # Packages - packages_text = get_packages_section(repo_root) - if packages_text: - lines.append(packages_text) - lines.append("") - - # Paths - lines.append("## PATHS") - lines.append(f"Workspace: {DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/") - lines.append(f"Tasks: {DIR_WORKFLOW}/{DIR_TASKS}/") - lines.append(f"Spec: {DIR_WORKFLOW}/{DIR_SPEC}/") - lines.append("") - - lines.append("========================================") - - return "\n".join(lines) - - -# ============================================================================= -# Record Mode -# ============================================================================= - -def get_context_record_json(repo_root: Path | None = None) -> dict: - """Get record-mode context as a dictionary. - - Focused on: my active tasks, git status, current task. - """ - if repo_root is None: - repo_root = get_repo_root() - - developer = get_developer(repo_root) - tasks_dir = get_tasks_dir(repo_root) - - # Git info - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - branch = branch_out.strip() or "unknown" - - _, status_out, _ = run_git(["status", "--porcelain"], cwd=repo_root) - git_status_count = len([line for line in status_out.splitlines() if line.strip()]) - - _, log_out, _ = run_git(["log", "--oneline", "-5"], cwd=repo_root) - commits = [] - for line in log_out.splitlines(): - if line.strip(): - parts = line.split(" ", 1) - if len(parts) >= 2: - commits.append({"hash": parts[0], "message": parts[1]}) - - # My tasks (single pass — collect statuses and filter by assignee) - all_tasks_list = list(iter_active_tasks(tasks_dir)) - all_statuses = {t.dir_name: t.status for t in all_tasks_list} - - my_tasks = [] - for t in all_tasks_list: - if t.assignee == developer: - done = sum( - 1 for c in t.children - if all_statuses.get(c) in ("completed", "done") - ) - my_tasks.append({ - "dir": t.dir_name, - "title": t.title, - "status": t.status, - "priority": t.priority, - "children": list(t.children), - "childrenDone": done, - "parent": t.parent, - "meta": t.meta, - }) - - # Current task - current_task_info = None - current_task = get_current_task(repo_root) - if current_task: - ct = load_task(repo_root / current_task) - if ct: - current_task_info = { - "path": current_task, - "name": ct.name, - "status": ct.status, - } - - # Package git repos - pkg_git_info = _collect_package_git_info(repo_root) - - result = { - "developer": developer or "", - "git": { - "branch": branch, - "isClean": git_status_count == 0, - "uncommittedChanges": git_status_count, - "recentCommits": commits, - }, - "myTasks": my_tasks, - "currentTask": current_task_info, - } - - if pkg_git_info: - result["packageGit"] = pkg_git_info - - return result - - -def get_context_text_record(repo_root: Path | None = None) -> str: - """Get context as formatted text for record-session mode. - - Focused output: MY ACTIVE TASKS first (with [!!!] emphasis), - then GIT STATUS, RECENT COMMITS, CURRENT TASK. - """ - if repo_root is None: - repo_root = get_repo_root() - - lines: list[str] = [] - lines.append("========================================") - lines.append("SESSION CONTEXT (RECORD MODE)") - lines.append("========================================") - lines.append("") - - developer = get_developer(repo_root) - if not developer: - lines.append( - f"ERROR: Not initialized. Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <name>" - ) - return "\n".join(lines) - - # MY ACTIVE TASKS — first and prominent - lines.append(f"## [!!!] MY ACTIVE TASKS (Assigned to {developer})") - lines.append("[!] Review whether any should be archived before recording this session.") - lines.append("") - - tasks_dir = get_tasks_dir(repo_root) - my_task_count = 0 - - # Single pass — collect all tasks and filter by assignee - all_statuses = get_all_statuses(tasks_dir) - - for t in iter_active_tasks(tasks_dir): - if t.assignee == developer: - progress = children_progress(t.children, all_statuses) - lines.append(f"- [{t.priority}] {t.title} ({t.status}){progress} — {t.dir_name}") - my_task_count += 1 - - if my_task_count == 0: - lines.append("(no active tasks assigned to you)") - lines.append("") - - # GIT STATUS - lines.append("## GIT STATUS") - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - branch = branch_out.strip() or "unknown" - lines.append(f"Branch: {branch}") - - _, status_out, _ = run_git(["status", "--porcelain"], cwd=repo_root) - status_lines = [line for line in status_out.splitlines() if line.strip()] - status_count = len(status_lines) - - if status_count == 0: - lines.append("Working directory: Clean") - else: - lines.append(f"Working directory: {status_count} uncommitted change(s)") - lines.append("") - lines.append("Changes:") - _, short_out, _ = run_git(["status", "--short"], cwd=repo_root) - for line in short_out.splitlines()[:10]: - lines.append(line) - lines.append("") - - # RECENT COMMITS - lines.append("## RECENT COMMITS") - _, log_out, _ = run_git(["log", "--oneline", "-5"], cwd=repo_root) - if log_out.strip(): - for line in log_out.splitlines(): - lines.append(line) - else: - lines.append("(no commits)") - lines.append("") - - # Package git repos — independent sub-repositories - _append_package_git_context(lines, _collect_package_git_info(repo_root)) - - # CURRENT TASK - lines.append("## CURRENT TASK") - current_task = get_current_task(repo_root) - if current_task: - lines.append(f"Path: {current_task}") - ct = load_task(repo_root / current_task) - if ct: - lines.append(f"Name: {ct.name}") - lines.append(f"Status: {ct.status}") - else: - lines.append("(none)") - lines.append("") - - lines.append("========================================") - - return "\n".join(lines) - - -def output_text(repo_root: Path | None = None) -> None: - """Output context in text format. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - """ - print(get_context_text(repo_root)) diff --git a/.trellis/scripts/common/task_context.py b/.trellis/scripts/common/task_context.py deleted file mode 100755 index 283c139c..00000000 --- a/.trellis/scripts/common/task_context.py +++ /dev/null @@ -1,410 +0,0 @@ -#!/usr/bin/env python3 -""" -Task JSONL context management. - -Provides: - cmd_init_context - Initialize JSONL context files for a task - cmd_add_context - Add entry to JSONL context file - cmd_validate - Validate JSONL context files - cmd_list_context - List JSONL context entries -""" - -from __future__ import annotations - -import argparse -import json -import sys -from pathlib import Path - -from .cli_adapter import get_cli_adapter_auto -from .config import ( - get_packages, - is_monorepo, - resolve_package, - validate_package, -) -from .io import read_json, write_json -from .log import Colors, colored -from .paths import ( - DIR_SPEC, - DIR_WORKFLOW, - FILE_TASK_JSON, - get_repo_root, -) -from .task_utils import resolve_task_dir - - -# ============================================================================= -# JSONL Default Content Generators -# ============================================================================= - -def get_implement_base() -> list[dict]: - """Get base implement context entries.""" - return [ - {"file": f"{DIR_WORKFLOW}/workflow.md", "reason": "Project workflow and conventions"}, - ] - - -def get_implement_backend(package: str | None = None) -> list[dict]: - """Get backend implement context entries.""" - spec_base = f"{DIR_SPEC}/{package}" if package else DIR_SPEC - return [ - {"file": f"{DIR_WORKFLOW}/{spec_base}/backend/index.md", "reason": "Backend development guide"}, - ] - - -def get_implement_frontend(package: str | None = None) -> list[dict]: - """Get frontend implement context entries.""" - spec_base = f"{DIR_SPEC}/{package}" if package else DIR_SPEC - return [ - {"file": f"{DIR_WORKFLOW}/{spec_base}/frontend/index.md", "reason": "Frontend development guide"}, - ] - - -def get_check_context(repo_root: Path) -> list[dict]: - """Get check context entries.""" - adapter = get_cli_adapter_auto(repo_root) - - entries = [ - {"file": adapter.get_trellis_command_path("finish-work"), "reason": "Finish work checklist"}, - {"file": adapter.get_trellis_command_path("check"), "reason": "Code quality check spec"}, - ] - - return entries - - -def get_debug_context(repo_root: Path) -> list[dict]: - """Get debug context entries.""" - adapter = get_cli_adapter_auto(repo_root) - - entries: list[dict] = [ - {"file": adapter.get_trellis_command_path("check"), "reason": "Code quality check spec"}, - ] - - return entries - - -def _write_jsonl(path: Path, entries: list[dict]) -> None: - """Write entries to JSONL file.""" - lines = [json.dumps(entry, ensure_ascii=False) for entry in entries] - path.write_text("\n".join(lines) + "\n", encoding="utf-8") - - -# ============================================================================= -# Command: init-context -# ============================================================================= - -def cmd_init_context(args: argparse.Namespace) -> int: - """Initialize JSONL context files for a task.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - dev_type = args.type - - if not dev_type: - print(colored("Error: Missing arguments", Colors.RED)) - print("Usage: python3 task.py init-context <task-dir> <dev_type>") - print(" dev_type: backend | frontend | fullstack | test | docs") - return 1 - - if not target_dir.is_dir(): - print(colored(f"Error: Directory not found: {target_dir}", Colors.RED)) - return 1 - - # Resolve package: --package CLI → task.json.package → default_package - cli_package: str | None = getattr(args, "package", None) - package: str | None = None - if not is_monorepo(repo_root): - # Single-repo: ignore --package, no package prefix - if cli_package: - print(colored("Warning: --package ignored in single-repo project", Colors.YELLOW), file=sys.stderr) - elif cli_package: - if not validate_package(cli_package, repo_root): - packages = get_packages(repo_root) - available = ", ".join(sorted(packages.keys())) if packages else "(none)" - print(colored(f"Error: unknown package '{cli_package}'. Available: {available}", Colors.RED), file=sys.stderr) - return 1 - package = cli_package - else: - # Read task.json.package as inferred source - task_json_path = target_dir / FILE_TASK_JSON - task_pkg_value = None - if task_json_path.is_file(): - task_data = read_json(task_json_path) - if isinstance(task_data, dict): - task_pkg_value = task_data.get("package") - # Only pass string values to resolve_package (guard against malformed JSON) - task_package = task_pkg_value if isinstance(task_pkg_value, str) else None - package = resolve_package(task_package=task_package, repo_root=repo_root) - - # Monorepo fallback prohibition - if package is None: - packages = get_packages(repo_root) - available = ", ".join(sorted(packages.keys())) if packages else "(none)" - print(colored( - f"Error: monorepo project requires --package (or set default_package in config.yaml). Available: {available}", - Colors.RED, - ), file=sys.stderr) - return 1 - - print(colored("=== Initializing Agent Context Files ===", Colors.BLUE)) - print(f"Target dir: {target_dir}") - print(f"Dev type: {dev_type}") - if package: - print(f"Package: {package}") - print() - - # implement.jsonl - print(colored("Creating implement.jsonl...", Colors.CYAN)) - implement_entries = get_implement_base() - if dev_type in ("backend", "test"): - implement_entries.extend(get_implement_backend(package)) - elif dev_type == "frontend": - implement_entries.extend(get_implement_frontend(package)) - elif dev_type == "fullstack": - implement_entries.extend(get_implement_backend(package)) - implement_entries.extend(get_implement_frontend(package)) - - implement_file = target_dir / "implement.jsonl" - _write_jsonl(implement_file, implement_entries) - print(f" {colored('✓', Colors.GREEN)} {len(implement_entries)} entries") - - # check.jsonl - print(colored("Creating check.jsonl...", Colors.CYAN)) - check_entries = get_check_context(repo_root) - check_file = target_dir / "check.jsonl" - _write_jsonl(check_file, check_entries) - print(f" {colored('✓', Colors.GREEN)} {len(check_entries)} entries") - - # debug.jsonl - print(colored("Creating debug.jsonl...", Colors.CYAN)) - debug_entries = get_debug_context(repo_root) - debug_file = target_dir / "debug.jsonl" - _write_jsonl(debug_file, debug_entries) - print(f" {colored('✓', Colors.GREEN)} {len(debug_entries)} entries") - - # Update task.json dev_type and package - task_json_path = target_dir / FILE_TASK_JSON - if task_json_path.is_file(): - task_data = read_json(task_json_path) - if isinstance(task_data, dict): - task_data["dev_type"] = dev_type - task_data["package"] = package # Always sync to match resolved value - write_json(task_json_path, task_data) - - print() - print(colored("✓ All context files created", Colors.GREEN)) - print() - - # Show what was auto-injected - all_injected = [e["file"] for e in implement_entries] - print(colored("Auto-injected (defaults only):", Colors.YELLOW)) - for f in all_injected: - print(f" - {f}") - print() - - # Scan spec directory for available spec files the AI should consider - spec_base = repo_root / DIR_WORKFLOW / DIR_SPEC - if package: - spec_base = spec_base / package - available_specs: list[str] = [] - if spec_base.is_dir(): - for md_file in sorted(spec_base.rglob("*.md")): - rel = str(md_file.relative_to(repo_root)) - if rel not in all_injected: - available_specs.append(rel) - - if available_specs: - print(colored("Available spec files (not yet injected):", Colors.BLUE)) - for spec in available_specs: - print(f" - {spec}") - print() - - print(colored("Next steps:", Colors.BLUE)) - print(" 1. Review the spec files above and add relevant ones for your task:") - print(f" python3 task.py add-context <dir> implement <spec-path> \"<reason>\"") - print(" 2. Set as current: python3 task.py start <dir>") - - return 0 - - -# ============================================================================= -# Command: add-context -# ============================================================================= - -def cmd_add_context(args: argparse.Namespace) -> int: - """Add entry to JSONL context file.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - - jsonl_name = args.file - path = args.path - reason = args.reason or "Added manually" - - if not target_dir.is_dir(): - print(colored(f"Error: Directory not found: {target_dir}", Colors.RED)) - return 1 - - # Support shorthand - if not jsonl_name.endswith(".jsonl"): - jsonl_name = f"{jsonl_name}.jsonl" - - jsonl_file = target_dir / jsonl_name - full_path = repo_root / path - - entry_type = "file" - if full_path.is_dir(): - entry_type = "directory" - if not path.endswith("/"): - path = f"{path}/" - elif not full_path.is_file(): - print(colored(f"Error: Path not found: {path}", Colors.RED)) - return 1 - - # Check if already exists - if jsonl_file.is_file(): - content = jsonl_file.read_text(encoding="utf-8") - if f'"{path}"' in content: - print(colored(f"Warning: Entry already exists for {path}", Colors.YELLOW)) - return 0 - - # Add entry - entry: dict - if entry_type == "directory": - entry = {"file": path, "type": "directory", "reason": reason} - else: - entry = {"file": path, "reason": reason} - - with jsonl_file.open("a", encoding="utf-8") as f: - f.write(json.dumps(entry, ensure_ascii=False) + "\n") - - print(colored(f"Added {entry_type}: {path}", Colors.GREEN)) - return 0 - - -# ============================================================================= -# Command: validate -# ============================================================================= - -def cmd_validate(args: argparse.Namespace) -> int: - """Validate JSONL context files.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - - if not target_dir.is_dir(): - print(colored("Error: task directory required", Colors.RED)) - return 1 - - print(colored("=== Validating Context Files ===", Colors.BLUE)) - print(f"Target dir: {target_dir}") - print() - - total_errors = 0 - for jsonl_name in ["implement.jsonl", "check.jsonl", "debug.jsonl"]: - jsonl_file = target_dir / jsonl_name - errors = _validate_jsonl(jsonl_file, repo_root) - total_errors += errors - - print() - if total_errors == 0: - print(colored("✓ All validations passed", Colors.GREEN)) - return 0 - else: - print(colored(f"✗ Validation failed ({total_errors} errors)", Colors.RED)) - return 1 - - -def _validate_jsonl(jsonl_file: Path, repo_root: Path) -> int: - """Validate a single JSONL file.""" - file_name = jsonl_file.name - errors = 0 - - if not jsonl_file.is_file(): - print(f" {colored(f'{file_name}: not found (skipped)', Colors.YELLOW)}") - return 0 - - line_num = 0 - for line in jsonl_file.read_text(encoding="utf-8").splitlines(): - line_num += 1 - if not line.strip(): - continue - - try: - data = json.loads(line) - except json.JSONDecodeError: - print(f" {colored(f'{file_name}:{line_num}: Invalid JSON', Colors.RED)}") - errors += 1 - continue - - file_path = data.get("file") - entry_type = data.get("type", "file") - - if not file_path: - print(f" {colored(f'{file_name}:{line_num}: Missing file field', Colors.RED)}") - errors += 1 - continue - - full_path = repo_root / file_path - if entry_type == "directory": - if not full_path.is_dir(): - print(f" {colored(f'{file_name}:{line_num}: Directory not found: {file_path}', Colors.RED)}") - errors += 1 - else: - if not full_path.is_file(): - print(f" {colored(f'{file_name}:{line_num}: File not found: {file_path}', Colors.RED)}") - errors += 1 - - if errors == 0: - print(f" {colored(f'{file_name}: ✓ ({line_num} entries)', Colors.GREEN)}") - else: - print(f" {colored(f'{file_name}: ✗ ({errors} errors)', Colors.RED)}") - - return errors - - -# ============================================================================= -# Command: list-context -# ============================================================================= - -def cmd_list_context(args: argparse.Namespace) -> int: - """List JSONL context entries.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - - if not target_dir.is_dir(): - print(colored("Error: task directory required", Colors.RED)) - return 1 - - print(colored("=== Context Files ===", Colors.BLUE)) - print() - - for jsonl_name in ["implement.jsonl", "check.jsonl", "debug.jsonl"]: - jsonl_file = target_dir / jsonl_name - if not jsonl_file.is_file(): - continue - - print(colored(f"[{jsonl_name}]", Colors.CYAN)) - - count = 0 - for line in jsonl_file.read_text(encoding="utf-8").splitlines(): - if not line.strip(): - continue - - try: - data = json.loads(line) - except json.JSONDecodeError: - continue - - count += 1 - file_path = data.get("file", "?") - entry_type = data.get("type", "file") - reason = data.get("reason", "-") - - if entry_type == "directory": - print(f" {colored(f'{count}.', Colors.GREEN)} [DIR] {file_path}") - else: - print(f" {colored(f'{count}.', Colors.GREEN)} {file_path}") - print(f" {colored('→', Colors.YELLOW)} {reason}") - - print() - - return 0 diff --git a/.trellis/scripts/common/task_queue.py b/.trellis/scripts/common/task_queue.py deleted file mode 100755 index f7485e2e..00000000 --- a/.trellis/scripts/common/task_queue.py +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env python3 -""" -Task queue utility functions. - -Provides: - list_tasks_by_status - List tasks by status - list_pending_tasks - List tasks with pending status - list_tasks_by_assignee - List tasks by assignee - list_my_tasks - List tasks assigned to current developer - get_task_stats - Get P0/P1/P2/P3 counts -""" - -from __future__ import annotations - -from pathlib import Path - -from .paths import ( - get_repo_root, - get_developer, - get_tasks_dir, -) -from .tasks import iter_active_tasks - - -# ============================================================================= -# Internal helper -# ============================================================================= - -def _task_to_dict(t) -> dict: - """Convert TaskInfo to the dict format callers expect.""" - return { - "priority": t.priority, - "id": t.raw.get("id", ""), - "title": t.title, - "status": t.status, - "assignee": t.assignee or "-", - "dir": t.dir_name, - "children": list(t.children), - "parent": t.parent, - } - - -# ============================================================================= -# Public Functions -# ============================================================================= - -def list_tasks_by_status( - filter_status: str | None = None, - repo_root: Path | None = None -) -> list[dict]: - """List tasks by status. - - Args: - filter_status: Optional status filter. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of task info dicts with keys: priority, id, title, status, assignee. - """ - if repo_root is None: - repo_root = get_repo_root() - - tasks_dir = get_tasks_dir(repo_root) - results = [] - - for t in iter_active_tasks(tasks_dir): - if filter_status and t.status != filter_status: - continue - results.append(_task_to_dict(t)) - - return results - - -def list_pending_tasks(repo_root: Path | None = None) -> list[dict]: - """List pending tasks. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of task info dicts. - """ - return list_tasks_by_status("planning", repo_root) - - -def list_tasks_by_assignee( - assignee: str, - filter_status: str | None = None, - repo_root: Path | None = None -) -> list[dict]: - """List tasks assigned to a specific developer. - - Args: - assignee: Developer name. - filter_status: Optional status filter. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of task info dicts. - """ - if repo_root is None: - repo_root = get_repo_root() - - tasks_dir = get_tasks_dir(repo_root) - results = [] - - for t in iter_active_tasks(tasks_dir): - if (t.assignee or "-") != assignee: - continue - if filter_status and t.status != filter_status: - continue - results.append(_task_to_dict(t)) - - return results - - -def list_my_tasks( - filter_status: str | None = None, - repo_root: Path | None = None -) -> list[dict]: - """List tasks assigned to current developer. - - Args: - filter_status: Optional status filter. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of task info dicts. - - Raises: - ValueError: If developer not set. - """ - if repo_root is None: - repo_root = get_repo_root() - - developer = get_developer(repo_root) - if not developer: - raise ValueError("Developer not set") - - return list_tasks_by_assignee(developer, filter_status, repo_root) - - -def get_task_stats(repo_root: Path | None = None) -> dict[str, int]: - """Get task statistics. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Dict with keys: P0, P1, P2, P3, Total. - """ - if repo_root is None: - repo_root = get_repo_root() - - tasks_dir = get_tasks_dir(repo_root) - stats = {"P0": 0, "P1": 0, "P2": 0, "P3": 0, "Total": 0} - - for t in iter_active_tasks(tasks_dir): - if t.priority in stats: - stats[t.priority] += 1 - stats["Total"] += 1 - - return stats - - -def format_task_stats(stats: dict[str, int]) -> str: - """Format task stats as string. - - Args: - stats: Stats dict from get_task_stats. - - Returns: - Formatted string like "P0:0 P1:1 P2:2 P3:0 Total:3". - """ - return f"P0:{stats['P0']} P1:{stats['P1']} P2:{stats['P2']} P3:{stats['P3']} Total:{stats['Total']}" - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - stats = get_task_stats() - print(format_task_stats(stats)) - print() - print("Pending tasks:") - for task in list_pending_tasks(): - print(f" {task['priority']}|{task['id']}|{task['title']}|{task['status']}|{task['assignee']}") diff --git a/.trellis/scripts/common/task_store.py b/.trellis/scripts/common/task_store.py deleted file mode 100755 index 94ac7e53..00000000 --- a/.trellis/scripts/common/task_store.py +++ /dev/null @@ -1,536 +0,0 @@ -#!/usr/bin/env python3 -""" -Task CRUD operations. - -Provides: - ensure_tasks_dir - Ensure tasks directory exists - cmd_create - Create a new task - cmd_archive - Archive completed task - cmd_set_branch - Set git branch for task - cmd_set_base_branch - Set PR target branch - cmd_set_scope - Set scope for PR title - cmd_add_subtask - Link child task to parent - cmd_remove_subtask - Unlink child task from parent -""" - -from __future__ import annotations - -import argparse -import re -import sys -from datetime import datetime -from pathlib import Path - -from .config import ( - get_packages, - is_monorepo, - resolve_package, - validate_package, -) -from .git import run_git -from .io import read_json, write_json -from .log import Colors, colored -from .paths import ( - DIR_ARCHIVE, - DIR_TASKS, - DIR_WORKFLOW, - FILE_TASK_JSON, - clear_current_task, - generate_task_date_prefix, - get_current_task, - get_developer, - get_repo_root, - get_tasks_dir, -) -from .task_utils import ( - archive_task_complete, - find_task_by_name, - resolve_task_dir, - run_task_hooks, -) - - -# ============================================================================= -# Helper Functions -# ============================================================================= - -def _slugify(title: str) -> str: - """Convert title to slug (only works with ASCII).""" - result = title.lower() - result = re.sub(r"[^a-z0-9]", "-", result) - result = re.sub(r"-+", "-", result) - result = result.strip("-") - return result - - -def ensure_tasks_dir(repo_root: Path) -> Path: - """Ensure tasks directory exists.""" - tasks_dir = get_tasks_dir(repo_root) - archive_dir = tasks_dir / "archive" - - if not tasks_dir.exists(): - tasks_dir.mkdir(parents=True) - print(colored(f"Created tasks directory: {tasks_dir}", Colors.GREEN), file=sys.stderr) - - if not archive_dir.exists(): - archive_dir.mkdir(parents=True) - - return tasks_dir - - -# ============================================================================= -# Command: create -# ============================================================================= - -def cmd_create(args: argparse.Namespace) -> int: - """Create a new task.""" - repo_root = get_repo_root() - - if not args.title: - print(colored("Error: title is required", Colors.RED), file=sys.stderr) - return 1 - - # Validate --package (CLI source: fail-fast) - package: str | None = getattr(args, "package", None) - if not is_monorepo(repo_root): - # Single-repo: ignore --package, no package prefix - if package: - print(colored(f"Warning: --package ignored in single-repo project", Colors.YELLOW), file=sys.stderr) - package = None - elif package: - if not validate_package(package, repo_root): - packages = get_packages(repo_root) - available = ", ".join(sorted(packages.keys())) if packages else "(none)" - print(colored(f"Error: unknown package '{package}'. Available: {available}", Colors.RED), file=sys.stderr) - return 1 - else: - # Inferred: default_package → None (no task.json yet for create) - package = resolve_package(repo_root=repo_root) - - # Default assignee to current developer - assignee = args.assignee - if not assignee: - assignee = get_developer(repo_root) - if not assignee: - print(colored("Error: No developer set. Run init_developer.py first or use --assignee", Colors.RED), file=sys.stderr) - return 1 - - ensure_tasks_dir(repo_root) - - # Get current developer as creator - creator = get_developer(repo_root) or assignee - - # Generate slug if not provided - slug = args.slug or _slugify(args.title) - if not slug: - print(colored("Error: could not generate slug from title", Colors.RED), file=sys.stderr) - return 1 - - # Create task directory with MM-DD-slug format - tasks_dir = get_tasks_dir(repo_root) - date_prefix = generate_task_date_prefix() - dir_name = f"{date_prefix}-{slug}" - task_dir = tasks_dir / dir_name - task_json_path = task_dir / FILE_TASK_JSON - - if task_dir.exists(): - print(colored(f"Warning: Task directory already exists: {dir_name}", Colors.YELLOW), file=sys.stderr) - else: - task_dir.mkdir(parents=True) - - today = datetime.now().strftime("%Y-%m-%d") - - # Record current branch as base_branch (PR target) - _, branch_out, _ = run_git(["branch", "--show-current"], cwd=repo_root) - current_branch = branch_out.strip() or "main" - - task_data = { - "id": slug, - "name": slug, - "title": args.title, - "description": args.description or "", - "status": "planning", - "dev_type": None, - "scope": None, - "package": package, - "priority": args.priority, - "creator": creator, - "assignee": assignee, - "createdAt": today, - "completedAt": None, - "branch": None, - "base_branch": current_branch, - "worktree_path": None, - "current_phase": 0, - "next_action": [ - {"phase": 1, "action": "brainstorm"}, - {"phase": 2, "action": "research"}, - {"phase": 3, "action": "implement"}, - {"phase": 4, "action": "check"}, - {"phase": 5, "action": "update-spec"}, - {"phase": 6, "action": "record-session"}, - ], - "commit": None, - "pr_url": None, - "subtasks": [], - "children": [], - "parent": None, - "relatedFiles": [], - "notes": "", - "meta": {}, - } - - write_json(task_json_path, task_data) - - # Handle --parent: establish bidirectional link - if args.parent: - parent_dir = resolve_task_dir(args.parent, repo_root) - parent_json_path = parent_dir / FILE_TASK_JSON - if not parent_json_path.is_file(): - print(colored(f"Warning: Parent task.json not found: {args.parent}", Colors.YELLOW), file=sys.stderr) - else: - parent_data = read_json(parent_json_path) - if parent_data: - # Add child to parent's children list - parent_children = parent_data.get("children", []) - if dir_name not in parent_children: - parent_children.append(dir_name) - parent_data["children"] = parent_children - write_json(parent_json_path, parent_data) - - # Set parent in child's task.json - task_data["parent"] = parent_dir.name - write_json(task_json_path, task_data) - - print(colored(f"Linked as child of: {parent_dir.name}", Colors.GREEN), file=sys.stderr) - - print(colored(f"Created task: {dir_name}", Colors.GREEN), file=sys.stderr) - print("", file=sys.stderr) - print(colored("Next steps:", Colors.BLUE), file=sys.stderr) - print(" 1. Create prd.md with requirements", file=sys.stderr) - print(" 2. Run: python3 task.py init-context <dir> <dev_type>", file=sys.stderr) - print(" 3. Run: python3 task.py start <dir>", file=sys.stderr) - print("", file=sys.stderr) - - # Output relative path for script chaining - print(f"{DIR_WORKFLOW}/{DIR_TASKS}/{dir_name}") - - run_task_hooks("after_create", task_json_path, repo_root) - return 0 - - -# ============================================================================= -# Command: archive -# ============================================================================= - -def cmd_archive(args: argparse.Namespace) -> int: - """Archive completed task.""" - repo_root = get_repo_root() - task_name = args.name - - if not task_name: - print(colored("Error: Task name is required", Colors.RED), file=sys.stderr) - return 1 - - tasks_dir = get_tasks_dir(repo_root) - - # Find task directory - task_dir = find_task_by_name(task_name, tasks_dir) - - if not task_dir or not task_dir.is_dir(): - print(colored(f"Error: Task not found: {task_name}", Colors.RED), file=sys.stderr) - print("Active tasks:", file=sys.stderr) - # Import lazily to avoid circular dependency - from .tasks import iter_active_tasks - for t in iter_active_tasks(tasks_dir): - print(f" - {t.dir_name}/", file=sys.stderr) - return 1 - - dir_name = task_dir.name - task_json_path = task_dir / FILE_TASK_JSON - - # Update status before archiving - today = datetime.now().strftime("%Y-%m-%d") - if task_json_path.is_file(): - data = read_json(task_json_path) - if data: - data["status"] = "completed" - data["completedAt"] = today - write_json(task_json_path, data) - - # Handle subtask relationships on archive - task_parent = data.get("parent") - task_children = data.get("children", []) - - # If this is a child, remove from parent's children list - if task_parent: - parent_dir = find_task_by_name(task_parent, tasks_dir) - if parent_dir: - parent_json = parent_dir / FILE_TASK_JSON - if parent_json.is_file(): - parent_data = read_json(parent_json) - if parent_data: - parent_children = parent_data.get("children", []) - if dir_name in parent_children: - parent_children.remove(dir_name) - parent_data["children"] = parent_children - write_json(parent_json, parent_data) - - # If this is a parent, clear parent field in all children - if task_children: - for child_name in task_children: - child_dir_path = find_task_by_name(child_name, tasks_dir) - if child_dir_path: - child_json = child_dir_path / FILE_TASK_JSON - if child_json.is_file(): - child_data = read_json(child_json) - if child_data: - child_data["parent"] = None - write_json(child_json, child_data) - - # Clear if current task - current = get_current_task(repo_root) - if current and dir_name in current: - clear_current_task(repo_root) - - # Archive - result = archive_task_complete(task_dir, repo_root) - if "archived_to" in result: - archive_dest = Path(result["archived_to"]) - year_month = archive_dest.parent.name - print(colored(f"Archived: {dir_name} -> archive/{year_month}/", Colors.GREEN), file=sys.stderr) - - # Auto-commit unless --no-commit - if not getattr(args, "no_commit", False): - _auto_commit_archive(dir_name, repo_root) - - # Return the archive path - print(f"{DIR_WORKFLOW}/{DIR_TASKS}/{DIR_ARCHIVE}/{year_month}/{dir_name}") - - # Run hooks with the archived path - archived_json = archive_dest / FILE_TASK_JSON - run_task_hooks("after_archive", archived_json, repo_root) - return 0 - - return 1 - - -def _auto_commit_archive(task_name: str, repo_root: Path) -> None: - """Stage .trellis/tasks/ changes and commit after archive.""" - tasks_rel = f"{DIR_WORKFLOW}/{DIR_TASKS}" - run_git(["add", "-A", tasks_rel], cwd=repo_root) - - # Check if there are staged changes - rc, _, _ = run_git( - ["diff", "--cached", "--quiet", "--", tasks_rel], cwd=repo_root - ) - if rc == 0: - print("[OK] No task changes to commit.", file=sys.stderr) - return - - commit_msg = f"chore(task): archive {task_name}" - rc, _, err = run_git(["commit", "-m", commit_msg], cwd=repo_root) - if rc == 0: - print(f"[OK] Auto-committed: {commit_msg}", file=sys.stderr) - else: - print(f"[WARN] Auto-commit failed: {err.strip()}", file=sys.stderr) - - -# ============================================================================= -# Command: add-subtask -# ============================================================================= - -def cmd_add_subtask(args: argparse.Namespace) -> int: - """Link a child task to a parent task.""" - repo_root = get_repo_root() - - parent_dir = resolve_task_dir(args.parent_dir, repo_root) - child_dir = resolve_task_dir(args.child_dir, repo_root) - - parent_json_path = parent_dir / FILE_TASK_JSON - child_json_path = child_dir / FILE_TASK_JSON - - if not parent_json_path.is_file(): - print(colored(f"Error: Parent task.json not found: {args.parent_dir}", Colors.RED), file=sys.stderr) - return 1 - - if not child_json_path.is_file(): - print(colored(f"Error: Child task.json not found: {args.child_dir}", Colors.RED), file=sys.stderr) - return 1 - - parent_data = read_json(parent_json_path) - child_data = read_json(child_json_path) - - if not parent_data or not child_data: - print(colored("Error: Failed to read task.json", Colors.RED), file=sys.stderr) - return 1 - - # Check if child already has a parent - existing_parent = child_data.get("parent") - if existing_parent: - print(colored(f"Error: Child task already has a parent: {existing_parent}", Colors.RED), file=sys.stderr) - return 1 - - # Add child to parent's children list - parent_children = parent_data.get("children", []) - child_dir_name = child_dir.name - if child_dir_name not in parent_children: - parent_children.append(child_dir_name) - parent_data["children"] = parent_children - - # Set parent in child's task.json - child_data["parent"] = parent_dir.name - - # Write both - write_json(parent_json_path, parent_data) - write_json(child_json_path, child_data) - - print(colored(f"Linked: {child_dir.name} -> {parent_dir.name}", Colors.GREEN), file=sys.stderr) - return 0 - - -# ============================================================================= -# Command: remove-subtask -# ============================================================================= - -def cmd_remove_subtask(args: argparse.Namespace) -> int: - """Unlink a child task from a parent task.""" - repo_root = get_repo_root() - - parent_dir = resolve_task_dir(args.parent_dir, repo_root) - child_dir = resolve_task_dir(args.child_dir, repo_root) - - parent_json_path = parent_dir / FILE_TASK_JSON - child_json_path = child_dir / FILE_TASK_JSON - - if not parent_json_path.is_file(): - print(colored(f"Error: Parent task.json not found: {args.parent_dir}", Colors.RED), file=sys.stderr) - return 1 - - if not child_json_path.is_file(): - print(colored(f"Error: Child task.json not found: {args.child_dir}", Colors.RED), file=sys.stderr) - return 1 - - parent_data = read_json(parent_json_path) - child_data = read_json(child_json_path) - - if not parent_data or not child_data: - print(colored("Error: Failed to read task.json", Colors.RED), file=sys.stderr) - return 1 - - # Remove child from parent's children list - parent_children = parent_data.get("children", []) - child_dir_name = child_dir.name - if child_dir_name in parent_children: - parent_children.remove(child_dir_name) - parent_data["children"] = parent_children - - # Clear parent in child's task.json - child_data["parent"] = None - - # Write both - write_json(parent_json_path, parent_data) - write_json(child_json_path, child_data) - - print(colored(f"Unlinked: {child_dir.name} from {parent_dir.name}", Colors.GREEN), file=sys.stderr) - return 0 - - -# ============================================================================= -# Command: set-branch -# ============================================================================= - -def cmd_set_branch(args: argparse.Namespace) -> int: - """Set git branch for task.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - branch = args.branch - - if not branch: - print(colored("Error: Missing arguments", Colors.RED)) - print("Usage: python3 task.py set-branch <task-dir> <branch-name>") - return 1 - - task_json = target_dir / FILE_TASK_JSON - if not task_json.is_file(): - print(colored(f"Error: task.json not found at {target_dir}", Colors.RED)) - return 1 - - data = read_json(task_json) - if not data: - return 1 - - data["branch"] = branch - write_json(task_json, data) - - print(colored(f"✓ Branch set to: {branch}", Colors.GREEN)) - print() - print(colored("Now you can start the multi-agent pipeline:", Colors.BLUE)) - print(f" python3 ./.trellis/scripts/multi_agent/start.py {args.dir}") - return 0 - - -# ============================================================================= -# Command: set-base-branch -# ============================================================================= - -def cmd_set_base_branch(args: argparse.Namespace) -> int: - """Set the base branch (PR target) for task.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - base_branch = args.base_branch - - if not base_branch: - print(colored("Error: Missing arguments", Colors.RED)) - print("Usage: python3 task.py set-base-branch <task-dir> <base-branch>") - print("Example: python3 task.py set-base-branch <dir> develop") - print() - print("This sets the target branch for PR (the branch your feature will merge into).") - return 1 - - task_json = target_dir / FILE_TASK_JSON - if not task_json.is_file(): - print(colored(f"Error: task.json not found at {target_dir}", Colors.RED)) - return 1 - - data = read_json(task_json) - if not data: - return 1 - - data["base_branch"] = base_branch - write_json(task_json, data) - - print(colored(f"✓ Base branch set to: {base_branch}", Colors.GREEN)) - print(f" PR will target: {base_branch}") - return 0 - - -# ============================================================================= -# Command: set-scope -# ============================================================================= - -def cmd_set_scope(args: argparse.Namespace) -> int: - """Set scope for PR title.""" - repo_root = get_repo_root() - target_dir = resolve_task_dir(args.dir, repo_root) - scope = args.scope - - if not scope: - print(colored("Error: Missing arguments", Colors.RED)) - print("Usage: python3 task.py set-scope <task-dir> <scope>") - return 1 - - task_json = target_dir / FILE_TASK_JSON - if not task_json.is_file(): - print(colored(f"Error: task.json not found at {target_dir}", Colors.RED)) - return 1 - - data = read_json(task_json) - if not data: - return 1 - - data["scope"] = scope - write_json(task_json, data) - - print(colored(f"✓ Scope set to: {scope}", Colors.GREEN)) - return 0 diff --git a/.trellis/scripts/common/task_utils.py b/.trellis/scripts/common/task_utils.py deleted file mode 100755 index 62c215e3..00000000 --- a/.trellis/scripts/common/task_utils.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python3 -""" -Task utility functions. - -Provides: - is_safe_task_path - Validate task path is safe to operate on - find_task_by_name - Find task directory by name - resolve_task_dir - Resolve task directory from name, relative, or absolute path - archive_task_dir - Archive task to monthly directory - run_task_hooks - Run lifecycle hooks for task events -""" - -from __future__ import annotations - -import shutil -import sys -from datetime import datetime -from pathlib import Path - -from .paths import get_repo_root, get_tasks_dir - - -# ============================================================================= -# Path Safety -# ============================================================================= - -def is_safe_task_path(task_path: str, repo_root: Path | None = None) -> bool: - """Check if a relative task path is safe to operate on. - - Args: - task_path: Task path (relative to repo_root). - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - True if safe, False if dangerous. - """ - if repo_root is None: - repo_root = get_repo_root() - - normalized = task_path.replace("\\", "/") - - # Check empty or null - if not normalized or normalized == "null": - print("Error: empty or null task path", file=sys.stderr) - return False - - # Reject absolute paths - if Path(task_path).is_absolute(): - print(f"Error: absolute path not allowed: {task_path}", file=sys.stderr) - return False - - # Reject ".", "..", paths starting with "./" or "../", or containing ".." - if normalized in (".", "..") or normalized.startswith("./") or normalized.startswith("../") or ".." in normalized: - print(f"Error: path traversal not allowed: {task_path}", file=sys.stderr) - return False - - # Final check: ensure resolved path is not the repo root - abs_path = repo_root / Path(normalized) - if abs_path.exists(): - try: - resolved = abs_path.resolve() - root_resolved = repo_root.resolve() - if resolved == root_resolved: - print(f"Error: path resolves to repo root: {task_path}", file=sys.stderr) - return False - except (OSError, IOError): - pass - - return True - - -# ============================================================================= -# Task Lookup -# ============================================================================= - -def find_task_by_name(task_name: str, tasks_dir: Path) -> Path | None: - """Find task directory by name (exact or suffix match). - - Args: - task_name: Task name to find. - tasks_dir: Tasks directory path. - - Returns: - Absolute path to task directory, or None if not found. - """ - if not task_name or not tasks_dir or not tasks_dir.is_dir(): - return None - - # Try exact match first - exact_match = tasks_dir / task_name - if exact_match.is_dir(): - return exact_match - - # Try suffix match (e.g., "my-task" matches "01-21-my-task") - for d in tasks_dir.iterdir(): - if d.is_dir() and d.name.endswith(f"-{task_name}"): - return d - - return None - - -# ============================================================================= -# Archive Operations -# ============================================================================= - -def archive_task_dir(task_dir_abs: Path, repo_root: Path | None = None) -> Path | None: - """Archive a task directory to archive/{YYYY-MM}/. - - Args: - task_dir_abs: Absolute path to task directory. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Path to archived directory, or None on error. - """ - if not task_dir_abs.is_dir(): - print(f"Error: task directory not found: {task_dir_abs}", file=sys.stderr) - return None - - # Get tasks directory (parent of the task) - tasks_dir = task_dir_abs.parent - archive_dir = tasks_dir / "archive" - year_month = datetime.now().strftime("%Y-%m") - month_dir = archive_dir / year_month - - # Create archive directory - try: - month_dir.mkdir(parents=True, exist_ok=True) - except (OSError, IOError) as e: - print(f"Error: Failed to create archive directory: {e}", file=sys.stderr) - return None - - # Move task to archive - task_name = task_dir_abs.name - dest = month_dir / task_name - - try: - shutil.move(str(task_dir_abs), str(dest)) - except (OSError, IOError, shutil.Error) as e: - print(f"Error: Failed to move task to archive: {e}", file=sys.stderr) - return None - - return dest - - -def archive_task_complete( - task_dir_abs: Path, - repo_root: Path | None = None -) -> dict[str, str]: - """Complete archive workflow: archive directory. - - Args: - task_dir_abs: Absolute path to task directory. - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Dict with archive result info. - """ - if not task_dir_abs.is_dir(): - print(f"Error: task directory not found: {task_dir_abs}", file=sys.stderr) - return {} - - archive_dest = archive_task_dir(task_dir_abs, repo_root) - if archive_dest: - return {"archived_to": str(archive_dest)} - - return {} - - -# ============================================================================= -# Task Directory Resolution -# ============================================================================= - -def resolve_task_dir(target_dir: str, repo_root: Path) -> Path: - """Resolve task directory to absolute path. - - Supports: - - Absolute path: /path/to/task - - Relative path: .trellis/tasks/01-31-my-task - - Task name: my-task (uses find_task_by_name for lookup) - - Args: - target_dir: Task directory specification. - repo_root: Repository root path. - - Returns: - Resolved absolute path. - """ - if not target_dir: - return Path() - - normalized = target_dir.replace("\\", "/") - while normalized.startswith("./"): - normalized = normalized[2:] - - # Absolute path - if Path(target_dir).is_absolute(): - return Path(target_dir) - - # Relative path (contains path separator or starts with .trellis) - if "/" in normalized or normalized.startswith(".trellis"): - return repo_root / Path(normalized) - - # Task name - try to find in tasks directory - tasks_dir = get_tasks_dir(repo_root) - found = find_task_by_name(target_dir, tasks_dir) - if found: - return found - - # Fallback to treating as relative path - return repo_root / Path(normalized) - - -# ============================================================================= -# Lifecycle Hooks -# ============================================================================= - -def run_task_hooks(event: str, task_json_path: Path, repo_root: Path) -> None: - """Run lifecycle hooks for a task event. - - Args: - event: Event name (e.g. "after_create"). - task_json_path: Absolute path to the task's task.json. - repo_root: Repository root for cwd and config lookup. - """ - import os - import subprocess - - from .config import get_hooks - from .log import Colors, colored - - commands = get_hooks(event, repo_root) - if not commands: - return - - env = {**os.environ, "TASK_JSON_PATH": str(task_json_path)} - - for cmd in commands: - try: - result = subprocess.run( - cmd, - shell=True, - cwd=repo_root, - env=env, - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - if result.returncode != 0: - print( - colored(f"[WARN] Hook failed ({event}): {cmd}", Colors.YELLOW), - file=sys.stderr, - ) - if result.stderr.strip(): - print(f" {result.stderr.strip()}", file=sys.stderr) - except Exception as e: - print( - colored(f"[WARN] Hook error ({event}): {cmd} — {e}", Colors.YELLOW), - file=sys.stderr, - ) - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - repo = get_repo_root() - tasks = get_tasks_dir(repo) - - print(f"Tasks dir: {tasks}") - print(f"is_safe_task_path('.trellis/tasks/test'): {is_safe_task_path('.trellis/tasks/test', repo)}") - print(f"is_safe_task_path('../test'): {is_safe_task_path('../test', repo)}") diff --git a/.trellis/scripts/common/tasks.py b/.trellis/scripts/common/tasks.py deleted file mode 100755 index 47d78c27..00000000 --- a/.trellis/scripts/common/tasks.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -Task data access layer. - -Single source of truth for loading and iterating task directories. -Replaces scattered task.json parsing across 9+ files. - -Provides: - load_task — Load a single task by directory path - iter_active_tasks — Iterate all non-archived tasks (sorted) - get_all_statuses — Get {dir_name: status} map for children progress -""" - -from __future__ import annotations - -from collections.abc import Iterator -from pathlib import Path - -from .io import read_json -from .paths import FILE_TASK_JSON -from .types import TaskInfo - - -def load_task(task_dir: Path) -> TaskInfo | None: - """Load task from a directory containing task.json. - - Args: - task_dir: Absolute path to the task directory. - - Returns: - TaskInfo if task.json exists and is valid, None otherwise. - """ - task_json = task_dir / FILE_TASK_JSON - if not task_json.is_file(): - return None - - data = read_json(task_json) - if not data: - return None - - return TaskInfo( - dir_name=task_dir.name, - directory=task_dir, - title=data.get("title") or data.get("name") or "unknown", - status=data.get("status", "unknown"), - assignee=data.get("assignee", ""), - priority=data.get("priority", "P2"), - children=tuple(data.get("children", [])), - parent=data.get("parent"), - package=data.get("package"), - raw=data, - ) - - -def iter_active_tasks(tasks_dir: Path) -> Iterator[TaskInfo]: - """Iterate all active (non-archived) tasks, sorted by directory name. - - Skips the "archive" directory and directories without valid task.json. - - Args: - tasks_dir: Path to the tasks directory. - - Yields: - TaskInfo for each valid task. - """ - if not tasks_dir.is_dir(): - return - - for d in sorted(tasks_dir.iterdir()): - if not d.is_dir() or d.name == "archive": - continue - info = load_task(d) - if info is not None: - yield info - - -def get_all_statuses(tasks_dir: Path) -> dict[str, str]: - """Get a {dir_name: status} mapping for all active tasks. - - Useful for computing children progress without loading full TaskInfo. - - Args: - tasks_dir: Path to the tasks directory. - - Returns: - Dict mapping directory names to status strings. - """ - return {t.dir_name: t.status for t in iter_active_tasks(tasks_dir)} - - -def children_progress( - children: tuple[str, ...] | list[str], - all_statuses: dict[str, str], -) -> str: - """Format children progress string like " [2/3 done]". - - Args: - children: List of child directory names. - all_statuses: Status map from get_all_statuses(). - - Returns: - Formatted string, or "" if no children. - """ - if not children: - return "" - done = sum( - 1 for c in children - if all_statuses.get(c) in ("completed", "done") - ) - return f" [{done}/{len(children)} done]" diff --git a/.trellis/scripts/common/types.py b/.trellis/scripts/common/types.py deleted file mode 100755 index f78b7dfe..00000000 --- a/.trellis/scripts/common/types.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -Core type definitions for Trellis task data. - -Provides: - TaskData — TypedDict for task.json shape (read-path type hints only) - TaskInfo — Frozen dataclass for loaded task (the public API type) - AgentRecord — TypedDict for registry.json agent entries -""" - -from __future__ import annotations - -from dataclasses import dataclass -from pathlib import Path -from typing import TypedDict - - -# ============================================================================= -# task.json shape (TypedDict — used only for read-path type hints) -# ============================================================================= - -class TaskData(TypedDict, total=False): - """Shape of task.json on disk. - - Used only for type annotations when reading task.json. - Writes must use the original dict to avoid losing unknown fields. - """ - - id: str - name: str - title: str - description: str - status: str - dev_type: str - scope: str | None - package: str | None - priority: str - creator: str - assignee: str - createdAt: str - completedAt: str | None - branch: str | None - base_branch: str | None - worktree_path: str | None - current_phase: int - next_action: list[dict] - commit: str | None - pr_url: str | None - subtasks: list[str] - children: list[str] - parent: str | None - relatedFiles: list[str] - notes: str - meta: dict - - -# ============================================================================= -# Loaded task object (frozen dataclass — the public API type) -# ============================================================================= - -@dataclass(frozen=True) -class TaskInfo: - """Immutable view of a loaded task. - - Created by load_task() / iter_active_tasks(). - Contains the commonly accessed fields; the original dict - is preserved in `raw` for write-back and uncommon field access. - """ - - dir_name: str - directory: Path - title: str - status: str - assignee: str - priority: str - children: tuple[str, ...] - parent: str | None - package: str | None - raw: dict # original dict — use for writes and uncommon fields - - @property - def name(self) -> str: - """Task name (id or name field).""" - return self.raw.get("name") or self.raw.get("id") or self.dir_name - - @property - def description(self) -> str: - return self.raw.get("description", "") - - @property - def branch(self) -> str | None: - return self.raw.get("branch") - - @property - def meta(self) -> dict: - return self.raw.get("meta", {}) - - -# ============================================================================= -# registry.json agent entry -# ============================================================================= - -class AgentRecord(TypedDict, total=False): - """Shape of an agent entry in registry.json.""" - - id: str - pid: int - task_dir: str - worktree_path: str - branch: str - platform: str - started_at: str - status: str diff --git a/.trellis/scripts/common/worktree.py b/.trellis/scripts/common/worktree.py deleted file mode 100755 index f9aa4baa..00000000 --- a/.trellis/scripts/common/worktree.py +++ /dev/null @@ -1,305 +0,0 @@ -#!/usr/bin/env python3 -""" -Worktree utilities for Multi-Agent Pipeline. - -Provides: - get_worktree_config - Get worktree.yaml path - get_worktree_base_dir - Get worktree storage directory - get_worktree_copy_files - Get files to copy list - get_worktree_post_create_hooks - Get post-create hooks - get_agents_dir - Get agents registry directory -""" - -from __future__ import annotations - -from pathlib import Path - -from .paths import ( - DIR_WORKFLOW, - get_repo_root, - get_workspace_dir, -) - - -# ============================================================================= -# YAML Simple Parser (no dependencies) -# ============================================================================= - - -def _unquote(s: str) -> str: - """Remove exactly one layer of matching surrounding quotes. - - Unlike str.strip('"'), this only removes the outermost pair, - preserving any nested quotes inside the value. - - Examples: - _unquote('"hello"') -> 'hello' - _unquote("'hello'") -> 'hello' - _unquote('"echo \\'hi\\'"') -> "echo 'hi'" - _unquote('hello') -> 'hello' - _unquote('"hello\\'') -> '"hello\\'' (mismatched, unchanged) - """ - if len(s) >= 2 and s[0] == s[-1] and s[0] in ('"', "'"): - return s[1:-1] - return s - - -def parse_simple_yaml(content: str) -> dict: - """Parse simple YAML with nested dict support (no dependencies). - - Supports: - - key: value (string) - - key: (followed by list items) - - item1 - - item2 - - key: (followed by nested dict) - nested_key: value - nested_key2: - - item - - Uses indentation to detect nesting (2+ spaces deeper = child). - - Args: - content: YAML content string. - - Returns: - Parsed dict (values can be str, list[str], or dict). - """ - lines = content.splitlines() - result: dict = {} - _parse_yaml_block(lines, 0, 0, result) - return result - - -def _parse_yaml_block( - lines: list[str], start: int, min_indent: int, target: dict -) -> int: - """Parse a YAML block into target dict, returning next line index.""" - i = start - current_list: list | None = None - - while i < len(lines): - line = lines[i] - stripped = line.strip() - - # Skip empty lines and comments - if not stripped or stripped.startswith("#"): - i += 1 - continue - - # Calculate indentation - indent = len(line) - len(line.lstrip()) - - # If dedented past our block, we're done - if indent < min_indent: - break - - if stripped.startswith("- "): - if current_list is not None: - current_list.append(_unquote(stripped[2:].strip())) - i += 1 - elif ":" in stripped: - key, _, value = stripped.partition(":") - key = key.strip() - value = _unquote(value.strip()) - current_list = None - - if value: - # key: value - target[key] = value - i += 1 - else: - # key: (no value) — peek ahead to determine list vs nested dict - next_i, next_line = _next_content_line(lines, i + 1) - if next_i >= len(lines): - target[key] = {} - i = next_i - elif next_line.strip().startswith("- "): - # It's a list - current_list = [] - target[key] = current_list - i += 1 - else: - next_indent = len(next_line) - len(next_line.lstrip()) - if next_indent > indent: - # It's a nested dict - nested: dict = {} - target[key] = nested - i = _parse_yaml_block(lines, i + 1, next_indent, nested) - else: - # Empty value, same or less indent follows - target[key] = {} - i += 1 - else: - i += 1 - - return i - - -def _next_content_line(lines: list[str], start: int) -> tuple[int, str]: - """Find the next non-empty, non-comment line.""" - i = start - while i < len(lines): - stripped = lines[i].strip() - if stripped and not stripped.startswith("#"): - return i, lines[i] - i += 1 - return i, "" - - -def _yaml_get_value(config_file: Path, key: str) -> str | None: - """Read simple value from worktree.yaml. - - Args: - config_file: Path to config file. - key: Key to read. - - Returns: - Value string or None. - """ - try: - content = config_file.read_text(encoding="utf-8") - data = parse_simple_yaml(content) - value = data.get(key) - if isinstance(value, str): - return value - except (OSError, IOError): - pass - return None - - -def _yaml_get_list(config_file: Path, section: str) -> list[str]: - """Read list from worktree.yaml. - - Args: - config_file: Path to config file. - section: Section name. - - Returns: - List of items. - """ - try: - content = config_file.read_text(encoding="utf-8") - data = parse_simple_yaml(content) - value = data.get(section) - if isinstance(value, list): - return [str(item) for item in value] - except (OSError, IOError): - pass - return [] - - -# ============================================================================= -# Worktree Configuration -# ============================================================================= - -# Worktree config file relative path (relative to repo root) -WORKTREE_CONFIG_PATH = f"{DIR_WORKFLOW}/worktree.yaml" - - -def get_worktree_config(repo_root: Path | None = None) -> Path: - """Get worktree.yaml config file path. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Absolute path to config file. - """ - if repo_root is None: - repo_root = get_repo_root() - return repo_root / WORKTREE_CONFIG_PATH - - -def get_worktree_base_dir(repo_root: Path | None = None) -> Path: - """Get worktree base directory. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Absolute path to worktree base directory. - """ - if repo_root is None: - repo_root = get_repo_root() - - config = get_worktree_config(repo_root) - worktree_dir = _yaml_get_value(config, "worktree_dir") - - # Default value - if not worktree_dir: - worktree_dir = "../worktrees" - - # Handle relative path - if worktree_dir.startswith("../") or worktree_dir.startswith("./"): - # Relative to repo_root - return repo_root / worktree_dir - else: - # Absolute path - return Path(worktree_dir) - - -def get_worktree_copy_files(repo_root: Path | None = None) -> list[str]: - """Get files to copy list. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of file paths to copy. - """ - if repo_root is None: - repo_root = get_repo_root() - config = get_worktree_config(repo_root) - return _yaml_get_list(config, "copy") - - -def get_worktree_post_create_hooks(repo_root: Path | None = None) -> list[str]: - """Get post_create hooks. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - List of commands to run. - """ - if repo_root is None: - repo_root = get_repo_root() - config = get_worktree_config(repo_root) - return _yaml_get_list(config, "post_create") - - -# ============================================================================= -# Agents Registry -# ============================================================================= - -def get_agents_dir(repo_root: Path | None = None) -> Path | None: - """Get agents directory for current developer. - - Args: - repo_root: Repository root path. Defaults to auto-detected. - - Returns: - Absolute path to agents directory, or None if no workspace. - """ - if repo_root is None: - repo_root = get_repo_root() - - workspace_dir = get_workspace_dir(repo_root) - if workspace_dir: - return workspace_dir / ".agents" - return None - - -# ============================================================================= -# Main Entry (for testing) -# ============================================================================= - -if __name__ == "__main__": - repo = get_repo_root() - print(f"Repository root: {repo}") - print(f"Worktree config: {get_worktree_config(repo)}") - print(f"Worktree base dir: {get_worktree_base_dir(repo)}") - print(f"Copy files: {get_worktree_copy_files(repo)}") - print(f"Post create hooks: {get_worktree_post_create_hooks(repo)}") - print(f"Agents dir: {get_agents_dir(repo)}") diff --git a/.trellis/scripts/create_bootstrap.py b/.trellis/scripts/create_bootstrap.py deleted file mode 100755 index b295b7d3..00000000 --- a/.trellis/scripts/create_bootstrap.py +++ /dev/null @@ -1,298 +0,0 @@ -#!/usr/bin/env python3 -""" -Create Bootstrap Task for First-Time Setup. - -Creates a guided task to help users fill in project guidelines -after initializing Trellis for the first time. - -Usage: - python3 create_bootstrap.py [project-type] - -Arguments: - project-type: frontend | backend | fullstack (default: fullstack) - -Prerequisites: - - .trellis/.developer must exist (run init_developer.py first) - -Creates: - .trellis/tasks/00-bootstrap-guidelines/ - - task.json # Task metadata - - prd.md # Task description and guidance -""" - -from __future__ import annotations - -import json -import sys -from datetime import datetime -from pathlib import Path - -from common.paths import ( - DIR_WORKFLOW, - DIR_SCRIPTS, - DIR_TASKS, - get_repo_root, - get_developer, - get_tasks_dir, - set_current_task, -) -from common.config import get_spec_base, resolve_package - - -# ============================================================================= -# Constants -# ============================================================================= - -TASK_NAME = "00-bootstrap-guidelines" - - -# ============================================================================= -# PRD Content -# ============================================================================= - -def write_prd_header() -> str: - """Write PRD header section.""" - return """# Bootstrap: Fill Project Development Guidelines - -## Purpose - -Welcome to Trellis! This is your first task. - -AI agents use `.trellis/spec/` to understand YOUR project's coding conventions. -**Starting from scratch = AI writes generic code that doesn't match your project style.** - -Filling these guidelines is a one-time setup that pays off for every future AI session. - ---- - -## Your Task - -Fill in the guideline files based on your **existing codebase**. -""" - - -def write_prd_backend_section(spec_base: str) -> str: - """Write PRD backend section.""" - return f""" - -### Backend Guidelines - -| File | What to Document | -|------|------------------| -| `.trellis/{spec_base}/backend/directory-structure.md` | Where different file types go (routes, services, utils) | -| `.trellis/{spec_base}/backend/database-guidelines.md` | ORM, migrations, query patterns, naming conventions | -| `.trellis/{spec_base}/backend/error-handling.md` | How errors are caught, logged, and returned | -| `.trellis/{spec_base}/backend/logging-guidelines.md` | Log levels, format, what to log | -| `.trellis/{spec_base}/backend/quality-guidelines.md` | Code review standards, testing requirements | -""" - - -def write_prd_frontend_section(spec_base: str) -> str: - """Write PRD frontend section.""" - return f""" - -### Frontend Guidelines - -| File | What to Document | -|------|------------------| -| `.trellis/{spec_base}/frontend/directory-structure.md` | Component/page/hook organization | -| `.trellis/{spec_base}/frontend/component-guidelines.md` | Component patterns, props conventions | -| `.trellis/{spec_base}/frontend/hook-guidelines.md` | Custom hook naming, patterns | -| `.trellis/{spec_base}/frontend/state-management.md` | State library, patterns, what goes where | -| `.trellis/{spec_base}/frontend/type-safety.md` | TypeScript conventions, type organization | -| `.trellis/{spec_base}/frontend/quality-guidelines.md` | Linting, testing, accessibility | -""" - - -def write_prd_footer() -> str: - """Write PRD footer section.""" - return """ - -### Thinking Guides (Optional) - -The `.trellis/spec/guides/` directory contains thinking guides that are already -filled with general best practices. You can customize them for your project if needed. - ---- - -## How to Fill Guidelines - -### Principle: Document Reality, Not Ideals - -Write what your codebase **actually does**, not what you wish it did. -AI needs to match existing patterns, not introduce new ones. - -### Steps - -1. **Look at existing code** - Find 2-3 examples of each pattern -2. **Document the pattern** - Describe what you see -3. **Include file paths** - Reference real files as examples -4. **List anti-patterns** - What does your team avoid? - ---- - -## Tips for Using AI - -Ask AI to help analyze your codebase: - -- "Look at my codebase and document the patterns you see" -- "Analyze my code structure and summarize the conventions" -- "Find error handling patterns and document them" - -The AI will read your code and help you document it. - ---- - -## Completion Checklist - -- [ ] Guidelines filled for your project type -- [ ] At least 2-3 real code examples in each guideline -- [ ] Anti-patterns documented - -When done: - -```bash -python3 ./.trellis/scripts/task.py finish -python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines -``` - ---- - -## Why This Matters - -After completing this task: - -1. AI will write code that matches your project style -2. Relevant `/trellis:before-*-dev` commands will inject real context -3. `/trellis:check-*` commands will validate against your actual standards -4. Future developers (human or AI) will onboard faster -""" - - -def write_prd(task_dir: Path, project_type: str, spec_base: str) -> None: - """Write prd.md file.""" - content = write_prd_header() - - if project_type == "frontend": - content += write_prd_frontend_section(spec_base) - elif project_type == "backend": - content += write_prd_backend_section(spec_base) - else: # fullstack - content += write_prd_backend_section(spec_base) - content += write_prd_frontend_section(spec_base) - - content += write_prd_footer() - - prd_file = task_dir / "prd.md" - prd_file.write_text(content, encoding="utf-8") - - -# ============================================================================= -# Task JSON -# ============================================================================= - -def write_task_json(task_dir: Path, developer: str, project_type: str, spec_base: str) -> None: - """Write task.json file.""" - today = datetime.now().strftime("%Y-%m-%d") - - # Generate subtasks and related files based on project type - if project_type == "frontend": - subtasks = [ - {"name": "Fill frontend guidelines", "status": "pending"}, - {"name": "Add code examples", "status": "pending"}, - ] - related_files = [f".trellis/{spec_base}/frontend/"] - elif project_type == "backend": - subtasks = [ - {"name": "Fill backend guidelines", "status": "pending"}, - {"name": "Add code examples", "status": "pending"}, - ] - related_files = [f".trellis/{spec_base}/backend/"] - else: # fullstack - subtasks = [ - {"name": "Fill backend guidelines", "status": "pending"}, - {"name": "Fill frontend guidelines", "status": "pending"}, - {"name": "Add code examples", "status": "pending"}, - ] - related_files = [f".trellis/{spec_base}/backend/", f".trellis/{spec_base}/frontend/"] - - task_data = { - "id": TASK_NAME, - "name": "Bootstrap Guidelines", - "description": "Fill in project development guidelines for AI agents", - "status": "in_progress", - "dev_type": "docs", - "priority": "P1", - "creator": developer, - "assignee": developer, - "createdAt": today, - "completedAt": None, - "commit": None, - "subtasks": subtasks, - "children": [], - "parent": None, - "relatedFiles": related_files, - "notes": f"First-time setup task created by trellis init ({project_type} project)", - "meta": {}, - } - - task_json = task_dir / "task.json" - task_json.write_text(json.dumps(task_data, indent=2, ensure_ascii=False), encoding="utf-8") - - -# ============================================================================= -# Main -# ============================================================================= - -def main() -> int: - """Main entry point.""" - # Parse project type argument - project_type = "fullstack" - if len(sys.argv) > 1: - project_type = sys.argv[1] - - # Validate project type - if project_type not in ("frontend", "backend", "fullstack"): - print(f"Unknown project type: {project_type}, defaulting to fullstack") - project_type = "fullstack" - - repo_root = get_repo_root() - developer = get_developer(repo_root) - - # Check developer initialized - if not developer: - print("Error: Developer not initialized") - print(f"Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <your-name>") - return 1 - - # Resolve spec base path (monorepo: spec/<package>, single-repo: spec) - package = resolve_package(repo_root=repo_root) - spec_base = get_spec_base(package, repo_root) - - tasks_dir = get_tasks_dir(repo_root) - task_dir = tasks_dir / TASK_NAME - relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{TASK_NAME}" - - # Check if already exists - if task_dir.exists(): - print(f"Bootstrap task already exists: {relative_path}") - return 0 - - # Create task directory - task_dir.mkdir(parents=True, exist_ok=True) - - # Write files - write_task_json(task_dir, developer, project_type, spec_base) - write_prd(task_dir, project_type, spec_base) - - # Set as current task - set_current_task(relative_path, repo_root) - - # Silent output - init command handles user-facing messages - # Only output the task path for programmatic use - print(relative_path) - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/get_context.py b/.trellis/scripts/get_context.py deleted file mode 100755 index bc634631..00000000 --- a/.trellis/scripts/get_context.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python3 -""" -Get Session Context for AI Agent. - -Usage: - python3 get_context.py Output context in text format - python3 get_context.py --json Output context in JSON format -""" - -from __future__ import annotations - -from common.git_context import main - - -if __name__ == "__main__": - main() diff --git a/.trellis/scripts/get_developer.py b/.trellis/scripts/get_developer.py deleted file mode 100755 index f8a89ebf..00000000 --- a/.trellis/scripts/get_developer.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python3 -""" -Get current developer name. - -This is a wrapper that uses common/paths.py -""" - -from __future__ import annotations - -import sys - -from common.paths import get_developer - - -def main() -> None: - """CLI entry point.""" - developer = get_developer() - if developer: - print(developer) - else: - print("Developer not initialized", file=sys.stderr) - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/.trellis/scripts/hooks/linear_sync.py b/.trellis/scripts/hooks/linear_sync.py deleted file mode 100755 index 5659fde9..00000000 --- a/.trellis/scripts/hooks/linear_sync.py +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env python3 -"""Linear sync hook for Trellis task lifecycle. - -Syncs task events to Linear via the `linearis` CLI. - -Usage (called automatically by task.py hooks): - python3 .trellis/scripts/hooks/linear_sync.py create - python3 .trellis/scripts/hooks/linear_sync.py start - python3 .trellis/scripts/hooks/linear_sync.py archive - -Manual usage: - TASK_JSON_PATH=.trellis/tasks/<name>/task.json python3 .trellis/scripts/hooks/linear_sync.py sync - -Environment: - TASK_JSON_PATH - Absolute path to task.json (set by task.py) - -Configuration: - .trellis/hooks.local.json - Local config (gitignored), example: - { - "linear": { - "team": "TEAM_KEY", - "project": "Project Name", - "assignees": { - "dev-name": "linear-user-id" - } - } - } -""" - -from __future__ import annotations - -import json -import os -import subprocess -import sys -from pathlib import Path - -# ─── Configuration ──────────────────────────────────────────────────────────── - -# Trellis priority → Linear priority (1=Urgent, 2=High, 3=Medium, 4=Low) -PRIORITY_MAP = {"P0": 1, "P1": 2, "P2": 3, "P3": 4} - -# Linear status names (must match your team's workflow) -STATUS_IN_PROGRESS = "In Progress" -STATUS_DONE = "Done" - - -def _load_config() -> dict: - """Load local hook config from .trellis/hooks.local.json.""" - task_json_path = os.environ.get("TASK_JSON_PATH", "") - if task_json_path: - # Walk up from task.json to find .trellis/ - trellis_dir = Path(task_json_path).parent.parent.parent - else: - trellis_dir = Path(".trellis") - - config_path = trellis_dir / "hooks.local.json" - try: - with open(config_path, encoding="utf-8") as f: - return json.load(f) - except (OSError, json.JSONDecodeError): - return {} - - -CONFIG = _load_config() -LINEAR_CFG = CONFIG.get("linear", {}) - -TEAM = LINEAR_CFG.get("team", "") -PROJECT = LINEAR_CFG.get("project", "") -ASSIGNEE_MAP = LINEAR_CFG.get("assignees", {}) - -# ─── Helpers ────────────────────────────────────────────────────────────────── - - -def _read_task() -> tuple[dict, str]: - path = os.environ.get("TASK_JSON_PATH", "") - if not path: - print("TASK_JSON_PATH not set", file=sys.stderr) - sys.exit(1) - with open(path, encoding="utf-8") as f: - return json.load(f), path - - -def _write_task(data: dict, path: str) -> None: - with open(path, "w", encoding="utf-8") as f: - json.dump(data, f, indent=2, ensure_ascii=False) - f.write("\n") - - -def _linearis(*args: str) -> dict | None: - result = subprocess.run( - ["linearis", *args], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - if result.returncode != 0: - print(f"linearis error: {result.stderr.strip()}", file=sys.stderr) - sys.exit(1) - stdout = result.stdout.strip() - if stdout: - return json.loads(stdout) - return None - - -def _get_linear_issue(task: dict) -> str | None: - meta = task.get("meta") - if isinstance(meta, dict): - return meta.get("linear_issue") - return None - - -# ─── Actions ────────────────────────────────────────────────────────────────── - - -def cmd_create() -> None: - if not TEAM: - print("No linear.team configured in hooks.local.json", file=sys.stderr) - sys.exit(1) - - task, path = _read_task() - - # Skip if already linked - if _get_linear_issue(task): - print(f"Already linked: {_get_linear_issue(task)}") - return - - title = task.get("title") or task.get("name") or "Untitled" - args = ["issues", "create", title, "--team", TEAM] - - # Map priority - priority = PRIORITY_MAP.get(task.get("priority", ""), 0) - if priority: - args.extend(["-p", str(priority)]) - - # Set project - if PROJECT: - args.extend(["--project", PROJECT]) - - # Assign to Linear user - assignee = task.get("assignee", "") - linear_user_id = ASSIGNEE_MAP.get(assignee) - if linear_user_id: - args.extend(["--assignee", linear_user_id]) - - # Link to parent's Linear issue if available - parent_issue = _resolve_parent_linear_issue(task) - if parent_issue: - args.extend(["--parent-ticket", parent_issue]) - - result = _linearis(*args) - if result and "identifier" in result: - if not isinstance(task.get("meta"), dict): - task["meta"] = {} - task["meta"]["linear_issue"] = result["identifier"] - _write_task(task, path) - print(f"Created Linear issue: {result['identifier']}") - - -def cmd_start() -> None: - task, _ = _read_task() - issue = _get_linear_issue(task) - if not issue: - return - _linearis("issues", "update", issue, "-s", STATUS_IN_PROGRESS) - print(f"Updated {issue} -> {STATUS_IN_PROGRESS}") - cmd_sync() - - -def cmd_archive() -> None: - task, _ = _read_task() - issue = _get_linear_issue(task) - if not issue: - return - _linearis("issues", "update", issue, "-s", STATUS_DONE) - print(f"Updated {issue} -> {STATUS_DONE}") - - -def cmd_sync() -> None: - """Sync prd.md content to Linear issue description.""" - task, _ = _read_task() - issue = _get_linear_issue(task) - if not issue: - print("No linear_issue in meta, run create first", file=sys.stderr) - sys.exit(1) - - # Find prd.md next to task.json - task_json_path = os.environ.get("TASK_JSON_PATH", "") - prd_path = Path(task_json_path).parent / "prd.md" - if not prd_path.is_file(): - print(f"No prd.md found at {prd_path}", file=sys.stderr) - sys.exit(1) - - description = prd_path.read_text(encoding="utf-8").strip() - _linearis("issues", "update", issue, "-d", description) - print(f"Synced prd.md to {issue} description") - - -# ─── Parent Issue Resolution ───────────────────────────────────────────────── - - -def _resolve_parent_linear_issue(task: dict) -> str | None: - """Find parent task's Linear issue identifier.""" - parent_name = task.get("parent") - if not parent_name: - return None - - task_json_path = os.environ.get("TASK_JSON_PATH", "") - if not task_json_path: - return None - - current_task_dir = Path(task_json_path).parent - tasks_dir = current_task_dir.parent - parent_json = tasks_dir / parent_name / "task.json" - - if parent_json.exists(): - try: - with open(parent_json, encoding="utf-8") as f: - parent_task = json.load(f) - return _get_linear_issue(parent_task) - except (json.JSONDecodeError, OSError): - pass - return None - - -# ─── Main ───────────────────────────────────────────────────────────────────── - -if __name__ == "__main__": - action = sys.argv[1] if len(sys.argv) > 1 else "" - actions = { - "create": cmd_create, - "start": cmd_start, - "archive": cmd_archive, - "sync": cmd_sync, - } - fn = actions.get(action) - if fn: - fn() - else: - print(f"Unknown action: {action}", file=sys.stderr) - print(f"Valid actions: {', '.join(actions)}", file=sys.stderr) - sys.exit(1) diff --git a/.trellis/scripts/init_developer.py b/.trellis/scripts/init_developer.py deleted file mode 100755 index 9fb53f5c..00000000 --- a/.trellis/scripts/init_developer.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 -""" -Initialize developer for workflow. - -Usage: - python3 init_developer.py <developer-name> - -This creates: - - .trellis/.developer file with developer info - - .trellis/workspace/<name>/ directory structure -""" - -from __future__ import annotations - -import sys - -from common.paths import ( - DIR_WORKFLOW, - FILE_DEVELOPER, - get_developer, -) -from common.developer import init_developer - - -def main() -> None: - """CLI entry point.""" - if len(sys.argv) < 2: - print(f"Usage: {sys.argv[0]} <developer-name>") - print() - print("Example:") - print(f" {sys.argv[0]} john") - sys.exit(1) - - name = sys.argv[1] - - # Check if already initialized - existing = get_developer() - if existing: - print(f"Developer already initialized: {existing}") - print() - print(f"To reinitialize, remove {DIR_WORKFLOW}/{FILE_DEVELOPER} first") - sys.exit(0) - - if init_developer(name): - sys.exit(0) - else: - sys.exit(1) - - -if __name__ == "__main__": - main() diff --git a/.trellis/scripts/multi_agent/__init__.py b/.trellis/scripts/multi_agent/__init__.py deleted file mode 100755 index c7c7e7dd..00000000 --- a/.trellis/scripts/multi_agent/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -Multi-Agent Pipeline Scripts. - -This module provides orchestration for multi-agent workflows. -""" diff --git a/.trellis/scripts/multi_agent/_bootstrap.py b/.trellis/scripts/multi_agent/_bootstrap.py deleted file mode 100755 index bba60614..00000000 --- a/.trellis/scripts/multi_agent/_bootstrap.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Bootstrap path setup for multi_agent scripts. - -Import this module before importing from common/: - - import _bootstrap # noqa: F401 - -This adds the parent scripts/ directory to sys.path so that -`from common.xxx import yyy` works when running scripts directly -via `python3 .trellis/scripts/multi_agent/some_script.py`. -""" - -import sys -from pathlib import Path - -_scripts_dir = str(Path(__file__).resolve().parent.parent) -if _scripts_dir not in sys.path: - sys.path.insert(0, _scripts_dir) diff --git a/.trellis/scripts/multi_agent/cleanup.py b/.trellis/scripts/multi_agent/cleanup.py deleted file mode 100755 index 0ed2588c..00000000 --- a/.trellis/scripts/multi_agent/cleanup.py +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Cleanup Worktree. - -Usage: - python3 cleanup.py <branch-name> Remove specific worktree - python3 cleanup.py --list List all worktrees - python3 cleanup.py --merged Remove merged worktrees - python3 cleanup.py --all Remove all worktrees (with confirmation) - -Options: - -y, --yes Skip confirmation prompts - --keep-branch Don't delete the git branch - -This script: -1. Archives task directory to archive/{YYYY-MM}/ -2. Removes agent from registry -3. Removes git worktree -4. Optionally deletes git branch -""" - -from __future__ import annotations - -import argparse -import json -import shutil -import subprocess -import sys -from pathlib import Path - -import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path - -from common.git import run_git -from common.log import Colors, log_info, log_success, log_warn, log_error -from common.paths import FILE_TASK_JSON, get_repo_root -from common.registry import ( - registry_get_file, - registry_get_task_dir, - registry_remove_by_id, - registry_remove_by_worktree, - registry_search_agent, -) -from common.task_utils import ( - archive_task_complete, - is_safe_task_path, -) - -# Colors, log_info, log_success, log_warn, log_error -# are now imported from common.log above. - - -def confirm(prompt: str, skip_confirm: bool) -> bool: - """Ask for confirmation.""" - if skip_confirm: - return True - - if not sys.stdin.isatty(): - log_error("Non-interactive mode detected. Use -y to skip confirmation.") - return False - - response = input(f"{prompt} [y/N] ") - return response.lower() in ("y", "yes") - - -def _warn_submodule_prs(task_dir_abs: Path) -> None: - """Print reminders for any open submodule PRs found in task.json.""" - task_json = task_dir_abs / FILE_TASK_JSON - if not task_json.is_file(): - return - - try: - task_data = json.loads(task_json.read_text(encoding="utf-8")) - except (json.JSONDecodeError, OSError): - return - - submodule_prs = task_data.get("submodule_prs") - if not isinstance(submodule_prs, dict) or not submodule_prs: - return - - for name, url in submodule_prs.items(): - log_warn(f"Submodule PR still open: {name} -> {url}") - log_info("Remember to close/merge submodule PRs before cleanup") - - -# ============================================================================= -# Commands -# ============================================================================= - - -def cmd_list(repo_root: Path) -> int: - """List worktrees.""" - print(f"{Colors.BLUE}=== Git Worktrees ==={Colors.NC}") - print() - - subprocess.run(["git", "worktree", "list"], cwd=repo_root) - print() - - # Show registry info - registry_file = registry_get_file(repo_root) - if registry_file and registry_file.is_file(): - print(f"{Colors.BLUE}=== Registered Agents ==={Colors.NC}") - print() - - data = json.loads(registry_file.read_text(encoding="utf-8")) - agents = data.get("agents", []) - - if agents: - for agent in agents: - print( - f" {agent.get('id', '?')}: PID={agent.get('pid', '?')} [{agent.get('worktree_path', '?')}]" - ) - else: - print(" (none)") - print() - - return 0 - - -def archive_task(worktree_path: str, repo_root: Path) -> None: - """Archive task directory.""" - task_dir = registry_get_task_dir(worktree_path, repo_root) - - if not task_dir or not is_safe_task_path(task_dir, repo_root): - return - - task_dir_abs = repo_root / task_dir - if not task_dir_abs.is_dir(): - return - - result = archive_task_complete(task_dir_abs, repo_root) - if "archived_to" in result: - dest = Path(result["archived_to"]) - log_success(f"Archived task: {dest.name} -> archive/{dest.parent.name}/") - - -def cleanup_registry_only(search: str, repo_root: Path, skip_confirm: bool) -> int: - """Cleanup from registry only (no worktree).""" - agent_info = registry_search_agent(search, repo_root) - - if not agent_info: - log_error(f"No agent found in registry matching: {search}") - return 1 - - agent_id = agent_info.get("id", "?") - task_dir = agent_info.get("task_dir", "?") - - print() - print(f"{Colors.BLUE}=== Cleanup Agent (no worktree) ==={Colors.NC}") - print(f" Agent ID: {agent_id}") - print(f" Task Dir: {task_dir}") - print() - - if not confirm("Archive task and remove from registry?", skip_confirm): - log_info("Aborted") - return 0 - - # Check for submodule PRs and archive task directory - if task_dir and is_safe_task_path(task_dir, repo_root): - task_dir_abs = repo_root / task_dir - if task_dir_abs.is_dir(): - _warn_submodule_prs(task_dir_abs) - result = archive_task_complete(task_dir_abs, repo_root) - if "archived_to" in result: - dest = Path(result["archived_to"]) - log_success( - f"Archived task: {dest.name} -> archive/{dest.parent.name}/" - ) - else: - log_warn("Invalid task_dir in registry, skipping archive") - - # Remove from registry - registry_remove_by_id(agent_id, repo_root) - log_success(f"Removed from registry: {agent_id}") - - log_success("Cleanup complete") - return 0 - - -def cleanup_worktree( - branch: str, repo_root: Path, skip_confirm: bool, keep_branch: bool -) -> int: - """Cleanup single worktree.""" - # Find worktree path for branch - _, worktree_list, _ = run_git( - ["worktree", "list", "--porcelain"], cwd=repo_root - ) - - worktree_path = None - current_worktree = None - - for line in worktree_list.splitlines(): - if line.startswith("worktree "): - current_worktree = line[9:] # Remove "worktree " prefix - elif line.startswith("branch refs/heads/"): - current_branch = line[18:] # Remove "branch refs/heads/" prefix - if current_branch == branch: - worktree_path = current_worktree - break - - if not worktree_path: - # No worktree found, try to cleanup from registry only - log_warn(f"No worktree found for: {branch}") - log_info("Trying to cleanup from registry...") - return cleanup_registry_only(branch, repo_root, skip_confirm) - - print() - print(f"{Colors.BLUE}=== Cleanup Worktree ==={Colors.NC}") - print(f" Branch: {branch}") - print(f" Worktree: {worktree_path}") - print() - - if not confirm("Remove this worktree?", skip_confirm): - log_info("Aborted") - return 0 - - # 1. Archive task (and check for submodule PRs) - task_dir = registry_get_task_dir(worktree_path, repo_root) - if task_dir and is_safe_task_path(task_dir, repo_root): - task_dir_abs_for_warn = repo_root / task_dir - if task_dir_abs_for_warn.is_dir(): - _warn_submodule_prs(task_dir_abs_for_warn) - archive_task(worktree_path, repo_root) - - # 2. Remove from registry - registry_remove_by_worktree(worktree_path, repo_root) - log_info("Removed from registry") - - # 3. Remove worktree - log_info("Removing worktree...") - ret, _, _ = run_git( - ["worktree", "remove", worktree_path, "--force"], cwd=repo_root - ) - if ret != 0: - # Try removing directory manually - try: - shutil.rmtree(worktree_path) - except Exception as e: - log_error(f"Failed to remove worktree: {e}") - - log_success("Worktree removed") - - # 4. Delete branch (optional) - if not keep_branch: - log_info("Deleting branch...") - ret, _, _ = run_git(["branch", "-D", branch], cwd=repo_root) - if ret != 0: - log_warn("Could not delete branch (may be checked out elsewhere)") - - log_success(f"Cleanup complete for: {branch}") - return 0 - - -def cmd_merged(repo_root: Path, skip_confirm: bool, keep_branch: bool) -> int: - """Cleanup merged worktrees.""" - # Get main branch - _, head_out, _ = run_git( - ["symbolic-ref", "refs/remotes/origin/HEAD"], cwd=repo_root - ) - main_branch = head_out.strip().replace("refs/remotes/origin/", "") or "main" - - print(f"{Colors.BLUE}=== Finding Merged Worktrees ==={Colors.NC}") - print() - - # Get merged branches - _, merged_out, _ = run_git( - ["branch", "--merged", main_branch], cwd=repo_root - ) - merged_branches = [] - for line in merged_out.splitlines(): - branch = line.strip().lstrip("* ") - if branch and branch != main_branch: - merged_branches.append(branch) - - if not merged_branches: - log_info("No merged branches found") - return 0 - - # Get worktree list - _, worktree_list, _ = run_git(["worktree", "list"], cwd=repo_root) - - worktree_branches = [] - for branch in merged_branches: - if f"[{branch}]" in worktree_list: - worktree_branches.append(branch) - print(f" - {branch}") - - if not worktree_branches: - log_info("No merged worktrees found") - return 0 - - print() - if not confirm("Remove these merged worktrees?", skip_confirm): - log_info("Aborted") - return 0 - - for branch in worktree_branches: - cleanup_worktree(branch, repo_root, True, keep_branch) - - return 0 - - -def cmd_all(repo_root: Path, skip_confirm: bool, keep_branch: bool) -> int: - """Cleanup all worktrees.""" - print(f"{Colors.BLUE}=== All Worktrees ==={Colors.NC}") - print() - - # Get worktree list - _, worktree_list, _ = run_git( - ["worktree", "list", "--porcelain"], cwd=repo_root - ) - - worktrees = [] - main_worktree = str(repo_root.resolve()) - - for line in worktree_list.splitlines(): - if line.startswith("worktree "): - wt = line[9:] - if wt != main_worktree: - worktrees.append(wt) - - if not worktrees: - log_info("No worktrees to remove") - return 0 - - for wt in worktrees: - print(f" - {wt}") - - print() - print(f"{Colors.RED}WARNING: This will remove ALL worktrees!{Colors.NC}") - - if not confirm("Are you sure?", skip_confirm): - log_info("Aborted") - return 0 - - # Get branch for each worktree - for wt in worktrees: - # Find branch name from worktree list - _, wt_list, _ = run_git(["worktree", "list"], cwd=repo_root) - for line in wt_list.splitlines(): - if wt in line: - # Extract branch from [branch] format - import re - - match = re.search(r"\[([^\]]+)\]", line) - if match: - branch = match.group(1) - cleanup_worktree(branch, repo_root, True, keep_branch) - break - - return 0 - - -# ============================================================================= -# Main -# ============================================================================= - - -def main() -> int: - """Main entry point.""" - parser = argparse.ArgumentParser( - description="Multi-Agent Pipeline: Cleanup Worktree" - ) - parser.add_argument("branch", nargs="?", help="Branch name to cleanup") - parser.add_argument("-y", "--yes", action="store_true", help="Skip confirmation") - parser.add_argument( - "--keep-branch", action="store_true", help="Don't delete git branch" - ) - parser.add_argument("--list", action="store_true", help="List all worktrees") - parser.add_argument("--merged", action="store_true", help="Remove merged worktrees") - parser.add_argument("--all", action="store_true", help="Remove all worktrees") - - args = parser.parse_args() - repo_root = get_repo_root() - - if args.list: - return cmd_list(repo_root) - elif args.merged: - return cmd_merged(repo_root, args.yes, args.keep_branch) - elif args.all: - return cmd_all(repo_root, args.yes, args.keep_branch) - elif args.branch: - return cleanup_worktree(args.branch, repo_root, args.yes, args.keep_branch) - else: - print("""Usage: - python3 cleanup.py <branch-name> Remove specific worktree - python3 cleanup.py --list List all worktrees - python3 cleanup.py --merged Remove merged worktrees - python3 cleanup.py --all Remove all worktrees - -Options: - -y, --yes Skip confirmation - --keep-branch Don't delete git branch -""") - return 1 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/multi_agent/create_pr.py b/.trellis/scripts/multi_agent/create_pr.py deleted file mode 100755 index 0028548b..00000000 --- a/.trellis/scripts/multi_agent/create_pr.py +++ /dev/null @@ -1,620 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Create PR. - -Usage: - python3 create_pr.py [task-dir] [--dry-run] - -This script: -1. Handles submodule changes (commit, push, PR) if any submodules are configured -2. Stages and commits all main-repo changes (excluding workspace/) -3. Pushes to origin -4. Creates a Draft PR using `gh pr create` -5. Updates task.json with status="completed", pr_url, submodule_prs, and current_phase - -Note: This is the only action that performs git commit, as it's the final -step after all implementation and checks are complete. -""" - -from __future__ import annotations - -import argparse -import subprocess -import sys -from pathlib import Path - -import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path - -from common.config import get_submodule_packages -from common.git import run_git -from common.io import read_json, write_json -from common.log import Colors -from common.paths import ( - DIR_WORKFLOW, - FILE_TASK_JSON, - get_current_task, - get_repo_root, -) -from common.phase import get_phase_for_action - -# Colors, read_json, write_json -# are now imported from common.log and common.io above. - - -# ============================================================================= -# Submodule PR Helpers -# ============================================================================= - -# Warning message prepended to main PR body when submodule PRs exist -_SUBMODULE_SQUASH_WARNING_MARKER = ( - "Merge submodule PR(s) first. If squash-merged, update submodule ref after merge." -) - - -def _get_submodule_default_branch(submodule_abs: Path) -> str: - """Get the default branch of a submodule repository. - - Uses `git symbolic-ref refs/remotes/origin/HEAD` for portability - (no grep, no English-dependent output). - - Returns: - Default branch name (e.g. "main"), falls back to "main" on failure. - """ - ret, out, _ = run_git( - ["symbolic-ref", "refs/remotes/origin/HEAD"], cwd=submodule_abs - ) - if ret == 0 and out.strip(): - # Output: "refs/remotes/origin/main" -> "main" - ref = out.strip() - prefix = "refs/remotes/origin/" - if ref.startswith(prefix): - return ref[len(prefix):] - return "main" - - -def _process_submodule_changes( - repo_root: Path, - current_branch: str, - commit_prefix: str, - scope: str, - task_name: str, - task_data: dict, - task_json: Path, - dry_run: bool, -) -> tuple[dict[str, str], list[str], bool]: - """Process submodule changes: commit, push, create PRs. - - Returns: - Tuple of (submodule_prs dict, changed_submodule_paths list, success bool). - On failure, submodule_prs contains URLs persisted so far. - """ - submodule_packages = get_submodule_packages(repo_root) - if not submodule_packages: - return {}, [], True - - # Load existing submodule_prs for incremental merge - raw_prs = task_data.get("submodule_prs") - submodule_prs: dict[str, str] = dict(raw_prs) if isinstance(raw_prs, dict) else {} - - # Detect which submodules have changes - changed: list[tuple[str, str]] = [] # (name, path) - for pkg_name, pkg_path in submodule_packages.items(): - sub_abs = repo_root / pkg_path - if not sub_abs.is_dir(): - continue - - ret, status_out, _ = run_git( - ["status", "--porcelain"], cwd=sub_abs - ) - if ret != 0: - continue - if status_out.strip(): - changed.append((pkg_name, pkg_path)) - - if not changed: - return submodule_prs, [], True - - # Determine submodule branch name: <repo-dir-name>/<main-branch> - repo_dir_name = repo_root.name - sub_branch = f"{repo_dir_name}/{current_branch}" - - print(f"\n{Colors.BLUE}=== Submodule Changes Detected ==={Colors.NC}") - for pkg_name, pkg_path in changed: - print(f" - {pkg_name} ({pkg_path})") - print() - - changed_paths: list[str] = [] - - for pkg_name, pkg_path in changed: - sub_abs = repo_root / pkg_path - sub_base = _get_submodule_default_branch(sub_abs) - sub_commit_msg = f"{commit_prefix}({scope}): {task_name}" - - print(f"{Colors.YELLOW}Processing submodule: {pkg_name} ({pkg_path}){Colors.NC}") - print(f" Submodule base branch: {sub_base}") - print(f" Submodule branch: {sub_branch}") - - if dry_run: - print(f" [DRY-RUN] Would checkout branch: {sub_branch}") - print(f" [DRY-RUN] Would commit: {sub_commit_msg}") - print(f" [DRY-RUN] Would push to: origin/{sub_branch}") - print(f" [DRY-RUN] Would create PR: {sub_branch} -> {sub_base}") - submodule_prs[pkg_name] = "https://github.com/example/repo/pull/DRY-RUN" - changed_paths.append(pkg_path) - continue - - # --- Checkout or create branch in submodule --- - ret, _, _ = run_git( - ["show-ref", "--verify", "--quiet", f"refs/heads/{sub_branch}"], - cwd=sub_abs, - ) - if ret == 0: - # Branch exists, checkout - ret, _, err = run_git( - ["checkout", sub_branch], cwd=sub_abs - ) - if ret != 0: - print(f"{Colors.RED}Failed to checkout branch in {pkg_name}: {err}{Colors.NC}") - return submodule_prs, changed_paths, False - - # Check for divergence (reuse risk) - ret_anc, _, _ = run_git( - ["merge-base", "--is-ancestor", sub_base, sub_branch], - cwd=sub_abs, - ) - if ret_anc != 0: - print( - f" {Colors.YELLOW}[WARN] submodule branch has diverged history, " - f"consider recreating{Colors.NC}" - ) - else: - # Create new branch - ret, _, err = run_git( - ["checkout", "-b", sub_branch], cwd=sub_abs - ) - if ret != 0: - print(f"{Colors.RED}Failed to create branch in {pkg_name}: {err}{Colors.NC}") - return submodule_prs, changed_paths, False - - # --- Stage and commit --- - run_git(["add", "-A"], cwd=sub_abs) - - ret, _, _ = run_git(["diff", "--cached", "--quiet"], cwd=sub_abs) - if ret != 0: - # Has staged changes - ret, _, err = run_git( - ["commit", "-m", sub_commit_msg], cwd=sub_abs - ) - if ret != 0: - print(f"{Colors.RED}Failed to commit in {pkg_name}: {err}{Colors.NC}") - return submodule_prs, changed_paths, False - print(f" {Colors.GREEN}Committed in {pkg_name}{Colors.NC}") - else: - print(f" No staged changes in {pkg_name}, skipping commit") - - # --- Push --- - ret, _, err = run_git( - ["push", "-u", "origin", sub_branch], cwd=sub_abs - ) - if ret != 0: - print(f"{Colors.RED}Failed to push {pkg_name}: {err}{Colors.NC}") - return submodule_prs, changed_paths, False - print(f" {Colors.GREEN}Pushed {pkg_name} to origin/{sub_branch}{Colors.NC}") - - # --- Create or reuse PR --- - result = subprocess.run( - [ - "gh", "pr", "list", - "--head", sub_branch, - "--base", sub_base, - "--json", "url", - "--jq", ".[0].url", - ], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - cwd=str(sub_abs), - ) - existing_sub_pr = result.stdout.strip() - - if existing_sub_pr: - print(f" {Colors.YELLOW}PR already exists: {existing_sub_pr}{Colors.NC}") - sub_pr_url = existing_sub_pr - else: - result = subprocess.run( - [ - "gh", "pr", "create", - "--draft", - "--base", sub_base, - "--title", f"{commit_prefix}({scope}): {task_name} [{pkg_name}]", - "--body", f"Submodule changes for {task_name}", - ], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - cwd=str(sub_abs), - ) - if result.returncode != 0: - print( - f"{Colors.RED}Failed to create PR for {pkg_name}: " - f"{result.stderr}{Colors.NC}" - ) - return submodule_prs, changed_paths, False - - sub_pr_url = result.stdout.strip() - print(f" {Colors.GREEN}PR created for {pkg_name}: {sub_pr_url}{Colors.NC}") - - # Persist immediately (incremental, supports re-entry) - submodule_prs[pkg_name] = sub_pr_url - task_data["submodule_prs"] = submodule_prs - write_json(task_json, task_data) - - changed_paths.append(pkg_path) - - return submodule_prs, changed_paths, True - - -def _build_submodule_warning(submodule_prs: dict[str, str]) -> str: - """Build the squash-merge warning block for the main PR body.""" - pr_lines = "\n".join(f"> - {name}: {url}" for name, url in submodule_prs.items()) - return ( - f"> {_SUBMODULE_SQUASH_WARNING_MARKER}\n" - f">\n" - f"> Submodule PRs:\n" - f"{pr_lines}\n" - f"\n---\n\n" - ) - - -def _ensure_submodule_warning_on_existing_pr( - submodule_prs: dict[str, str], - dry_run: bool, -) -> None: - """Read-modify-write: add squash warning to existing PR if missing.""" - if dry_run: - print("[DRY-RUN] Would check/add submodule warning to existing PR") - return - - # Read current PR body - result = subprocess.run( - [ - "gh", "pr", "view", - "--json", "body", - "--jq", ".body", - ], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - if result.returncode != 0: - return - - current_body = result.stdout.strip() - if _SUBMODULE_SQUASH_WARNING_MARKER in current_body: - return # Warning already present - - # Prepend warning to existing body - warning = _build_submodule_warning(submodule_prs) - new_body = warning + current_body - - subprocess.run( - ["gh", "pr", "edit", "--body", new_body], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - print(f" {Colors.GREEN}Added submodule merge warning to existing PR{Colors.NC}") - - -# ============================================================================= -# Main -# ============================================================================= - - -def main() -> int: - """Main entry point.""" - parser = argparse.ArgumentParser(description="Multi-Agent Pipeline: Create PR") - parser.add_argument("dir", nargs="?", help="Task directory") - parser.add_argument( - "--dry-run", action="store_true", help="Show what would be done" - ) - - args = parser.parse_args() - repo_root = get_repo_root() - - # ============================================================================= - # Get Task Directory - # ============================================================================= - target_dir = args.dir - if not target_dir: - # Try to get from .current-task - current_task = get_current_task(repo_root) - if current_task: - target_dir = current_task - - if not target_dir: - print( - f"{Colors.RED}Error: No task directory specified and no current task set{Colors.NC}" - ) - print("Usage: python3 create_pr.py [task-dir] [--dry-run]") - return 1 - - # Support relative paths - if not target_dir.startswith("/"): - target_dir_path = repo_root / target_dir - else: - target_dir_path = Path(target_dir) - - task_json = target_dir_path / FILE_TASK_JSON - if not task_json.is_file(): - print(f"{Colors.RED}Error: task.json not found at {target_dir_path}{Colors.NC}") - return 1 - - # ============================================================================= - # Main - # ============================================================================= - print(f"{Colors.BLUE}=== Create PR ==={Colors.NC}") - if args.dry_run: - print( - f"{Colors.YELLOW}[DRY-RUN MODE] No actual changes will be made{Colors.NC}" - ) - print() - - # Read task config - task_data = read_json(task_json) - if not task_data: - print(f"{Colors.RED}Error: Failed to read task.json{Colors.NC}") - return 1 - - task_name = task_data.get("name", "") - base_branch = task_data.get("base_branch", "main") - scope = task_data.get("scope", "core") - dev_type = task_data.get("dev_type", "feature") - - # Map dev_type to commit prefix - prefix_map = { - "feature": "feat", - "frontend": "feat", - "backend": "feat", - "fullstack": "feat", - "bugfix": "fix", - "fix": "fix", - "refactor": "refactor", - "docs": "docs", - "test": "test", - } - commit_prefix = prefix_map.get(dev_type, "feat") - - print(f"Task: {task_name}") - print(f"Base branch: {base_branch}") - print(f"Scope: {scope}") - print(f"Commit prefix: {commit_prefix}") - print() - - # Get current branch - _, branch_out, _ = run_git(["branch", "--show-current"]) - current_branch = branch_out.strip() - print(f"Current branch: {current_branch}") - - # ============================================================================= - # Submodule PR Flow (runs BEFORE main repo staging) - # ============================================================================= - submodule_prs, changed_submodule_paths, sub_success = _process_submodule_changes( - repo_root=repo_root, - current_branch=current_branch, - commit_prefix=commit_prefix, - scope=scope, - task_name=task_name, - task_data=task_data, - task_json=task_json, - dry_run=args.dry_run, - ) - - if not sub_success: - print( - f"\n{Colors.RED}Submodule PR flow failed. " - f"Skipping main repo commit/PR.{Colors.NC}" - ) - print("Already-created submodule PRs have been saved to task.json.") - return 1 - - # ============================================================================= - # Main Repo: Stage, Commit, Push, PR - # ============================================================================= - - # Check for changes - print(f"{Colors.YELLOW}Checking for changes...{Colors.NC}") - - # Stage changes - run_git(["add", "-A"]) - - # Exclude workspace and temp files - run_git(["reset", f"{DIR_WORKFLOW}/workspace/"]) - run_git(["reset", ".agent-log", ".session-id"]) - - # If submodules changed, ensure their ref updates are staged - for sub_path in changed_submodule_paths: - run_git(["add", sub_path]) - - # Check if there are staged changes - ret, _, _ = run_git(["diff", "--cached", "--quiet"]) - has_staged_changes = ret != 0 - - if not has_staged_changes: - print(f"{Colors.YELLOW}No staged changes to commit{Colors.NC}") - - # Check for unpushed commits - ret, log_out, _ = run_git( - ["log", f"origin/{current_branch}..HEAD", "--oneline"] - ) - unpushed = len([line for line in log_out.splitlines() if line.strip()]) - - if unpushed == 0: - if args.dry_run: - run_git(["reset", "HEAD"]) - print(f"{Colors.RED}No changes to create PR{Colors.NC}") - return 1 - - print(f"Found {unpushed} unpushed commit(s)") - else: - # Commit changes - print(f"{Colors.YELLOW}Committing changes...{Colors.NC}") - commit_msg = f"{commit_prefix}({scope}): {task_name}" - - if args.dry_run: - print(f"[DRY-RUN] Would commit with message: {commit_msg}") - print("[DRY-RUN] Staged files:") - _, staged_out, _ = run_git(["diff", "--cached", "--name-only"]) - for line in staged_out.splitlines(): - print(f" - {line}") - else: - run_git(["commit", "-m", commit_msg]) - print(f"{Colors.GREEN}Committed: {commit_msg}{Colors.NC}") - - # Push to remote - print(f"{Colors.YELLOW}Pushing to remote...{Colors.NC}") - if args.dry_run: - print(f"[DRY-RUN] Would push to: origin/{current_branch}") - else: - ret, _, err = run_git(["push", "-u", "origin", current_branch]) - if ret != 0: - print(f"{Colors.RED}Failed to push: {err}{Colors.NC}") - return 1 - print(f"{Colors.GREEN}Pushed to origin/{current_branch}{Colors.NC}") - - # Create PR - print(f"{Colors.YELLOW}Creating PR...{Colors.NC}") - pr_title = f"{commit_prefix}({scope}): {task_name}" - pr_url = "" - - # Build PR body with optional submodule warning - has_submodule_prs = bool(submodule_prs) - - if args.dry_run: - print("[DRY-RUN] Would create PR:") - print(f" Title: {pr_title}") - print(f" Base: {base_branch}") - print(f" Head: {current_branch}") - prd_file = target_dir_path / "prd.md" - if prd_file.is_file(): - print(" Body: (from prd.md)") - if has_submodule_prs: - print(" Body includes submodule merge warning") - pr_url = "https://github.com/example/repo/pull/DRY-RUN" - else: - # Check if PR already exists - result = subprocess.run( - [ - "gh", - "pr", - "list", - "--head", - current_branch, - "--base", - base_branch, - "--json", - "url", - "--jq", - ".[0].url", - ], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - existing_pr = result.stdout.strip() - - if existing_pr: - print(f"{Colors.YELLOW}PR already exists: {existing_pr}{Colors.NC}") - pr_url = existing_pr - - # Read-modify-write: add submodule warning if missing - if has_submodule_prs: - _ensure_submodule_warning_on_existing_pr( - submodule_prs, args.dry_run - ) - else: - # Read PRD as PR body - pr_body = "" - prd_file = target_dir_path / "prd.md" - if prd_file.is_file(): - pr_body = prd_file.read_text(encoding="utf-8") - - # Prepend submodule warning if applicable - if has_submodule_prs: - pr_body = _build_submodule_warning(submodule_prs) + pr_body - - # Create PR - result = subprocess.run( - [ - "gh", - "pr", - "create", - "--draft", - "--base", - base_branch, - "--title", - pr_title, - "--body", - pr_body, - ], - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - - if result.returncode != 0: - print(f"{Colors.RED}Failed to create PR: {result.stderr}{Colors.NC}") - return 1 - - pr_url = result.stdout.strip() - print(f"{Colors.GREEN}PR created: {pr_url}{Colors.NC}") - - # Update task.json - print(f"{Colors.YELLOW}Updating task status...{Colors.NC}") - if args.dry_run: - print("[DRY-RUN] Would update task.json:") - print(" status: completed") - print(f" pr_url: {pr_url}") - if has_submodule_prs: - print(f" submodule_prs: {submodule_prs}") - print(" current_phase: (set to create-pr phase)") - else: - # Get the phase number for create-pr action - create_pr_phase = get_phase_for_action(task_json, "create-pr") - if not create_pr_phase: - create_pr_phase = 4 # Default fallback - - task_data["status"] = "completed" - task_data["pr_url"] = pr_url - task_data["current_phase"] = create_pr_phase - if has_submodule_prs: - task_data["submodule_prs"] = submodule_prs - - write_json(task_json, task_data) - print( - f"{Colors.GREEN}Task status updated to 'completed', phase {create_pr_phase}{Colors.NC}" - ) - - # In dry-run, reset the staging area - if args.dry_run: - run_git(["reset", "HEAD"]) - - print() - print(f"{Colors.GREEN}=== PR Created Successfully ==={Colors.NC}") - print(f"PR URL: {pr_url}") - if has_submodule_prs: - print("Submodule PRs:") - for name, url in submodule_prs.items(): - print(f" - {name}: {url}") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/multi_agent/plan.py b/.trellis/scripts/multi_agent/plan.py deleted file mode 100755 index 7a76ba8d..00000000 --- a/.trellis/scripts/multi_agent/plan.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Plan Agent Launcher. - -Usage: python3 plan.py --name <task-name> --type <dev-type> --requirement "<requirement>" - -This script: -1. Creates task directory -2. Starts Plan Agent in background -3. Plan Agent produces fully configured task directory - -After completion, use start.py to launch the Dispatch Agent. - -Prerequisites: - - agents/plan.md must exist (in .claude/, .cursor/, .iflow/, or .opencode/) - - Developer must be initialized -""" - -from __future__ import annotations - -import argparse -import os -import subprocess -import sys -from pathlib import Path - -import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path - -from common.cli_adapter import get_cli_adapter -from common.log import Colors, log_info, log_success, log_error -from common.paths import get_repo_root -from common.developer import ensure_developer - - -# ============================================================================= -# Constants -# ============================================================================= - -DEFAULT_PLATFORM = "claude" - - -# ============================================================================= -# Main -# ============================================================================= - -def main() -> int: - """Main entry point.""" - parser = argparse.ArgumentParser( - description="Multi-Agent Pipeline: Plan Agent Launcher" - ) - parser.add_argument("--name", "-n", required=True, help="Task name (e.g., user-auth)") - parser.add_argument("--type", "-t", required=True, help="Dev type: backend|frontend|fullstack") - parser.add_argument("--requirement", "-r", required=True, help="Requirement description") - parser.add_argument( - "--platform", "-p", - choices=["claude", "cursor", "iflow", "opencode", "codex", "qoder"], - default=DEFAULT_PLATFORM, - help="Platform to use (default: claude)" - ) - - args = parser.parse_args() - - task_name = args.name - dev_type = args.type - requirement = args.requirement - platform = args.platform - - # Initialize CLI adapter - adapter = get_cli_adapter(platform) - - # Validate dev type - if dev_type not in ("backend", "frontend", "fullstack"): - log_error(f"Invalid dev type: {dev_type} (must be: backend, frontend, fullstack)") - return 1 - - project_root = get_repo_root() - - # Check plan agent exists (path varies by platform) - if adapter.requires_agent_definition_file: - plan_md = adapter.get_agent_path("plan", project_root) - if not plan_md.is_file(): - log_error(f"Agent definition not found at {plan_md}") - log_info(f"Platform: {platform}") - return 1 - - ensure_developer(project_root) - - # ============================================================================= - # Step 1: Create Task Directory - # ============================================================================= - print() - print(f"{Colors.BLUE}=== Multi-Agent Pipeline: Plan ==={Colors.NC}") - log_info(f"Task: {task_name}") - log_info(f"Type: {dev_type}") - log_info(f"Requirement: {requirement}") - print() - - log_info("Step 1: Creating task directory...") - - # Import task module to create task - from task import cmd_create - import argparse as ap - - # Create task using task.py's create command - create_args = ap.Namespace( - title=requirement, - slug=task_name, - assignee=None, - priority="P2", - description="" - ) - - # Capture stdout to get task dir - import io - from contextlib import redirect_stdout - - stdout_capture = io.StringIO() - with redirect_stdout(stdout_capture): - ret = cmd_create(create_args) - - if ret != 0: - log_error("Failed to create task directory") - return 1 - - task_dir = stdout_capture.getvalue().strip().split("\n")[-1] - task_dir_abs = project_root / task_dir - - log_success(f"Task directory: {task_dir}") - - # ============================================================================= - # Step 2: Prepare and Start Plan Agent - # ============================================================================= - log_info("Step 2: Starting Plan Agent in background...") - - log_file = task_dir_abs / ".plan-log" - log_file.touch() - - # Get proxy environment variables - https_proxy = os.environ.get("https_proxy", "") - http_proxy = os.environ.get("http_proxy", "") - all_proxy = os.environ.get("all_proxy", "") - - # Start agent in background (cross-platform, no shell script needed) - env = os.environ.copy() - env["PLAN_TASK_NAME"] = task_name - env["PLAN_DEV_TYPE"] = dev_type - env["PLAN_TASK_DIR"] = task_dir - env["PLAN_REQUIREMENT"] = requirement - env["https_proxy"] = https_proxy - env["http_proxy"] = http_proxy - env["all_proxy"] = all_proxy - - # Clear nested-session detection so the new CLI process can start - env.pop("CLAUDECODE", None) - - # Set non-interactive env var based on platform - env.update(adapter.get_non_interactive_env()) - - # Build CLI command using adapter - cli_cmd = adapter.build_run_command( - agent="plan", # Will be mapped to "trellis-plan" for OpenCode - prompt=f"Start planning for task: {task_name}", - skip_permissions=True, - verbose=True, - json_output=True, - ) - - with log_file.open("w") as log_f: - # Use shell=False for cross-platform compatibility - # creationflags for Windows, start_new_session for Unix - popen_kwargs = { - "stdout": log_f, - "stderr": subprocess.STDOUT, - "cwd": str(project_root), - "env": env, - } - if sys.platform == "win32": - popen_kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP - else: - popen_kwargs["start_new_session"] = True - - process = subprocess.Popen(cli_cmd, **popen_kwargs) - agent_pid = process.pid - - log_success(f"Plan Agent started (PID: {agent_pid})") - - # ============================================================================= - # Summary - # ============================================================================= - print() - print(f"{Colors.GREEN}=== Plan Agent Running ==={Colors.NC}") - print() - print(f" Task: {task_name}") - print(f" Type: {dev_type}") - print(f" Dir: {task_dir}") - print(f" Log: {log_file}") - print(f" PID: {agent_pid}") - print() - print(f"{Colors.YELLOW}To monitor:{Colors.NC}") - print(f" tail -f {log_file}") - print() - print(f"{Colors.YELLOW}To check status:{Colors.NC}") - print(f" ps -p {agent_pid}") - print(f" ls -la {task_dir}") - print() - print(f"{Colors.YELLOW}After completion, run:{Colors.NC}") - print(f" python3 ./.trellis/scripts/multi_agent/start.py {task_dir}") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/multi_agent/start.py b/.trellis/scripts/multi_agent/start.py deleted file mode 100755 index 83985cc2..00000000 --- a/.trellis/scripts/multi_agent/start.py +++ /dev/null @@ -1,539 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Start Worktree Agent. - -Usage: python3 start.py <task-dir> -Example: python3 start.py .trellis/tasks/01-21-my-task - -This script: -1. Creates worktree (if not exists) with dependency install -2. Copies environment files (from worktree.yaml config) -3. Sets .current-task in worktree -4. Starts claude agent in background -5. Registers agent to registry.json - -Prerequisites: - - task.json must exist with 'branch' field - - agents/dispatch.md must exist (in .claude/, .cursor/, .iflow/, or .opencode/) - -Configuration: .trellis/worktree.yaml -""" - -from __future__ import annotations - -import os -import shutil -import subprocess -import sys -import uuid -from pathlib import Path - -import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path - -from common.cli_adapter import get_cli_adapter -from common.git import run_git -from common.io import read_json, write_json -from common.log import Colors, log_info, log_success, log_warn, log_error -from common.paths import ( - DIR_WORKFLOW, - FILE_CURRENT_TASK, - FILE_TASK_JSON, - get_repo_root, -) -from common.registry import ( - registry_add_agent, - registry_get_file, -) -from common.config import ( - get_default_package, - get_packages, - get_submodule_packages, - validate_package, -) -from common.worktree import ( - get_worktree_base_dir, - get_worktree_config, - get_worktree_copy_files, - get_worktree_post_create_hooks, -) - -# Colors, log_info, log_success, log_warn, log_error, read_json, write_json -# are now imported from common.log and common.io above. - - -# ============================================================================= -# Constants -# ============================================================================= - -DEFAULT_PLATFORM = "claude" - - -# ============================================================================= -# Submodule Init -# ============================================================================= - - -def _init_submodules_for_task( - task_data: dict, worktree_path: str, project_root: Path -) -> None: - """Initialize submodules in worktree based on task's target package. - - Resolves the target package from task_data.package -> default_package -> None. - Only initializes submodule-type packages. Idempotent: skips already-initialized - submodules to avoid detaching HEAD on in-progress work. - """ - # Skip if not a monorepo (no packages configured) - if get_packages(project_root) is None: - return - - # Resolve package: task.package -> default_package -> None - task_package = task_data.get("package") - package = None - - if task_package and isinstance(task_package, str): - if validate_package(task_package, project_root): - package = task_package - else: - log_warn( - f"package '{task_package}' not found in config.yaml, " - "skipping submodule init" - ) - return - else: - # Fallback to default_package - default_pkg = get_default_package(project_root) - if default_pkg: - if validate_package(default_pkg, project_root): - package = default_pkg - else: - log_warn( - f"package '{default_pkg}' not found in config.yaml, " - "skipping submodule init" - ) - return - - if not package: - log_warn("no package specified, skipping submodule init") - return - - # Check if this package is a submodule - submodule_packages = get_submodule_packages(project_root) - if package not in submodule_packages: - log_info(f"Package '{package}' is not a submodule, skipping submodule init") - return - - submodule_path = submodule_packages[package] - log_info(f"Checking submodule status for '{package}' ({submodule_path})...") - - # Run git submodule status in worktree directory - ret, status_out, status_err = run_git( - ["submodule", "status", submodule_path], cwd=Path(worktree_path) - ) - - if ret != 0: - log_warn( - f"git submodule status failed for '{submodule_path}': {status_err.strip()}, " - "skipping submodule init" - ) - return - - # Parse the prefix character from submodule status output - # Format: "<prefix><sha1> <path> (<describe>)" - # Prefix: '-' (uninitialized), ' ' (normal), '+' (commit mismatch), 'U' (conflict) - status_line = status_out.rstrip("\n\r") - if not status_line: - log_warn(f"Empty submodule status for '{submodule_path}', skipping") - return - - prefix = status_line[0] - - if prefix == "-": - # Uninitialized: run git submodule update --init - log_info(f"Initializing submodule '{submodule_path}'...") - ret, _, err = run_git( - ["submodule", "update", "--init", submodule_path], - cwd=Path(worktree_path), - ) - if ret != 0: - log_warn(f"Failed to initialize submodule '{submodule_path}': {err.strip()}") - else: - log_success(f"Submodule '{submodule_path}' initialized") - elif prefix == " ": - log_info(f"Submodule '{submodule_path}' already initialized, skipping") - elif prefix == "+": - log_warn( - f"submodule {submodule_path} has local changes, skipping update" - ) - elif prefix == "U": - log_warn( - f"submodule {submodule_path} has conflicts, skipping" - ) - else: - log_warn( - f"Unknown submodule status prefix '{prefix}' for '{submodule_path}', skipping" - ) - - -# ============================================================================= -# Main -# ============================================================================= - - -def main() -> int: - """Main entry point.""" - import argparse - - parser = argparse.ArgumentParser(description="Multi-Agent Pipeline: Start Worktree Agent") - parser.add_argument("task_dir", help="Task directory path") - parser.add_argument( - "--platform", "-p", - choices=["claude", "cursor", "iflow", "opencode", "codex", "qoder"], - default=DEFAULT_PLATFORM, - help="Platform to use (default: claude)" - ) - - args = parser.parse_args() - task_dir_arg = args.task_dir - platform = args.platform - - # Initialize CLI adapter - adapter = get_cli_adapter(platform) - - project_root = get_repo_root() - - # Normalize paths - task_dir_path = Path(task_dir_arg) - if task_dir_path.is_absolute(): - task_dir_abs = task_dir_path - else: - task_dir_abs = project_root / task_dir_path - - try: - task_dir_relative = task_dir_abs.relative_to(project_root).as_posix() - except ValueError: - task_dir_relative = str(task_dir_abs) - - task_json_path = task_dir_abs / FILE_TASK_JSON - - # ============================================================================= - # Validation - # ============================================================================= - if not task_json_path.is_file(): - log_error(f"task.json not found at {task_json_path}") - return 1 - - if adapter.requires_agent_definition_file: - dispatch_md = adapter.get_agent_path("dispatch", project_root) - if not dispatch_md.is_file(): - log_error(f"Agent definition not found at {dispatch_md}") - log_info(f"Platform: {platform}") - return 1 - - config_file = get_worktree_config(project_root) - if not config_file.is_file(): - log_error(f"worktree.yaml not found at {config_file}") - return 1 - - # ============================================================================= - # Read Task Config - # ============================================================================= - print() - print(f"{Colors.BLUE}=== Multi-Agent Pipeline: Start ==={Colors.NC}") - log_info(f"Task: {task_dir_abs}") - - task_data = read_json(task_json_path) - if not task_data: - log_error("Failed to read task.json") - return 1 - - branch = task_data.get("branch") - task_name = task_data.get("name") - task_status = task_data.get("status") - worktree_path = task_data.get("worktree_path") - - # Check if task was rejected - if task_status == "rejected": - log_error("Task was rejected by Plan Agent") - rejected_file = task_dir_abs / "REJECTED.md" - if rejected_file.is_file(): - print() - print(f"{Colors.YELLOW}Rejection reason:{Colors.NC}") - print(rejected_file.read_text(encoding="utf-8")) - print() - log_info( - "To retry, delete this directory and run plan.py again with revised requirements" - ) - return 1 - - # Check if prd.md exists (plan completed successfully) - prd_file = task_dir_abs / "prd.md" - if not prd_file.is_file(): - log_error("prd.md not found - Plan Agent may not have completed") - log_info(f"Check plan log: {task_dir_abs}/.plan-log") - return 1 - - if not branch: - log_error("branch field not set in task.json") - log_info("Please set branch field first, e.g.:") - log_info( - " jq '.branch = \"task/my-task\"' task.json > tmp && mv tmp task.json" - ) - return 1 - - log_info(f"Branch: {branch}") - log_info(f"Name: {task_name}") - - # ============================================================================= - # Step 1: Create Worktree (if not exists) - # ============================================================================= - if not worktree_path or not Path(worktree_path).is_dir(): - log_info("Step 1: Creating worktree...") - - # Record current branch as base_branch (PR target) - _, base_branch_out, _ = run_git( - ["branch", "--show-current"], cwd=project_root - ) - base_branch = base_branch_out.strip() - log_info(f"Base branch (PR target): {base_branch}") - - # Calculate worktree path - worktree_base = get_worktree_base_dir(project_root) - worktree_base.mkdir(parents=True, exist_ok=True) - worktree_base = worktree_base.resolve() - worktree_path_obj = worktree_base / branch - worktree_path = str(worktree_path_obj) - - # Create parent directory - worktree_path_obj.parent.mkdir(parents=True, exist_ok=True) - - # Create branch if not exists - ret, _, _ = run_git( - ["show-ref", "--verify", "--quiet", f"refs/heads/{branch}"], - cwd=project_root, - ) - if ret == 0: - log_info("Branch exists, checking out...") - ret, _, err = run_git( - ["worktree", "add", worktree_path, branch], cwd=project_root - ) - else: - log_info(f"Creating new branch: {branch}") - ret, _, err = run_git( - ["worktree", "add", "-b", branch, worktree_path], cwd=project_root - ) - - if ret != 0: - log_error(f"Failed to create worktree: {err}") - return 1 - - log_success(f"Worktree created: {worktree_path}") - - # Update task.json with worktree_path and base_branch - task_data["worktree_path"] = worktree_path - task_data["base_branch"] = base_branch - write_json(task_json_path, task_data) - - # ----- Copy environment files ----- - log_info("Copying environment files...") - copy_list = get_worktree_copy_files(project_root) - copy_count = 0 - - for item in copy_list: - if not item: - continue - - source = project_root / item - target = Path(worktree_path) / item - - if source.is_file(): - target.parent.mkdir(parents=True, exist_ok=True) - shutil.copy2(str(source), str(target)) - copy_count += 1 - - if copy_count > 0: - log_success(f"Copied {copy_count} file(s)") - - # ----- Copy task directory (may not be committed yet) ----- - log_info("Copying task directory...") - task_target_dir = Path(worktree_path) / task_dir_relative - task_target_dir.parent.mkdir(parents=True, exist_ok=True) - if task_target_dir.exists(): - shutil.rmtree(str(task_target_dir)) - shutil.copytree(str(task_dir_abs), str(task_target_dir)) - log_success("Task directory copied to worktree") - - # ----- Initialize submodules (before hooks, so hooks can use submodule content) ----- - _init_submodules_for_task(task_data, worktree_path, project_root) - - # ----- Run post_create hooks ----- - log_info("Running post_create hooks...") - post_create = get_worktree_post_create_hooks(project_root) - hook_count = 0 - - for cmd in post_create: - if not cmd: - continue - - log_info(f" Running: {cmd}") - ret = subprocess.run(cmd, shell=True, cwd=worktree_path) - if ret.returncode != 0: - log_error(f"Hook failed: {cmd}") - return 1 - hook_count += 1 - - if hook_count > 0: - log_success(f"Ran {hook_count} hook(s)") - else: - log_info(f"Step 1: Using existing worktree: {worktree_path}") - - # ----- Initialize submodules (idempotent, for reused worktrees) ----- - _init_submodules_for_task(task_data, worktree_path, project_root) - - # ============================================================================= - # Step 2: Set .current-task in Worktree - # ============================================================================= - log_info("Step 2: Setting current task in worktree...") - - worktree_workflow_dir = Path(worktree_path) / DIR_WORKFLOW - worktree_workflow_dir.mkdir(parents=True, exist_ok=True) - - current_task_file = worktree_workflow_dir / FILE_CURRENT_TASK - current_task_file.write_text(task_dir_relative, encoding="utf-8") - log_success(f"Current task set: {task_dir_relative}") - - # ============================================================================= - # Step 3: Prepare and Start Claude Agent - # ============================================================================= - log_info(f"Step 3: Starting {adapter.cli_name} agent...") - - # Update task status - task_data["status"] = "in_progress" - write_json(task_json_path, task_data) - - log_file = Path(worktree_path) / ".agent-log" - session_id_file = Path(worktree_path) / ".session-id" - - log_file.touch() - - # Generate session ID for resume support (Claude Code only) - # OpenCode generates its own session ID, we'll extract it from logs later - if adapter.supports_session_id_on_create: - session_id = str(uuid.uuid4()).lower() - session_id_file.write_text(session_id, encoding="utf-8") - log_info(f"Session ID: {session_id}") - else: - session_id = None # Will be extracted from logs after startup - log_info("Session ID will be extracted from logs after startup") - - # Get proxy environment variables - https_proxy = os.environ.get("https_proxy", "") - http_proxy = os.environ.get("http_proxy", "") - all_proxy = os.environ.get("all_proxy", "") - - # Start agent in background (cross-platform, no shell script needed) - env = os.environ.copy() - env["https_proxy"] = https_proxy - env["http_proxy"] = http_proxy - env["all_proxy"] = all_proxy - - # Clear nested-session detection so the new CLI process can start - # (when this script runs inside a Claude Code session, CLAUDECODE=1 is inherited) - env.pop("CLAUDECODE", None) - - # Set non-interactive env var based on platform - env.update(adapter.get_non_interactive_env()) - - # Build CLI command using adapter - # Note: Use explicit prompt to avoid confusion with CI/CD pipelines - # Also remind the model to follow its agent definition for better cross-model compatibility - cli_cmd = adapter.build_run_command( - agent="dispatch", - prompt="Follow your agent instructions to execute the task workflow. Start by reading .trellis/.current-task to get the task directory, then execute each action in task.json next_action array in order.", - session_id=session_id if adapter.supports_session_id_on_create else None, - skip_permissions=True, - verbose=True, - json_output=True, - ) - - with log_file.open("w") as log_f: - # Use shell=False for cross-platform compatibility - # creationflags for Windows, start_new_session for Unix - popen_kwargs = { - "stdout": log_f, - "stderr": subprocess.STDOUT, - "cwd": worktree_path, - "env": env, - } - if sys.platform == "win32": - popen_kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP - else: - popen_kwargs["start_new_session"] = True - - process = subprocess.Popen(cli_cmd, **popen_kwargs) - agent_pid = process.pid - - log_success(f"Agent started with PID: {agent_pid}") - - # For OpenCode: extract session ID from logs after startup - if not adapter.supports_session_id_on_create: - import time - log_info("Waiting for session ID from logs...") - # Wait a bit for the log to have session ID - for _ in range(10): # Try for up to 5 seconds - time.sleep(0.5) - try: - log_content = log_file.read_text(encoding="utf-8", errors="replace") - session_id = adapter.extract_session_id_from_log(log_content) - if session_id: - session_id_file.write_text(session_id, encoding="utf-8") - log_success(f"Session ID extracted: {session_id}") - break - except Exception: - pass - else: - log_warn("Could not extract session ID from logs") - session_id = "unknown" - - # ============================================================================= - # Step 4: Register to Registry (in main repo, not worktree) - # ============================================================================= - log_info("Step 4: Registering agent to registry...") - - # Generate agent ID - task_id = task_data.get("id") - if not task_id: - task_id = branch.replace("/", "-") - - registry_add_agent( - task_id, worktree_path, agent_pid, task_dir_relative, project_root, platform - ) - - log_success(f"Agent registered: {task_id}") - - # ============================================================================= - # Summary - # ============================================================================= - print() - print(f"{Colors.GREEN}=== Agent Started ==={Colors.NC}") - print() - print(f" ID: {task_id}") - print(f" PID: {agent_pid}") - print(f" Session: {session_id}") - print(f" Worktree: {worktree_path}") - print(f" Task: {task_dir_relative}") - print(f" Log: {log_file}") - print(f" Registry: {registry_get_file(project_root)}") - print() - print(f"{Colors.YELLOW}To monitor:{Colors.NC} tail -f {log_file}") - print(f"{Colors.YELLOW}To stop:{Colors.NC} kill {agent_pid}") - if session_id and session_id != "unknown": - resume_cmd = adapter.get_resume_command_str(session_id, cwd=worktree_path) - print(f"{Colors.YELLOW}To resume:{Colors.NC} {resume_cmd}") - else: - print(f"{Colors.YELLOW}To resume:{Colors.NC} (session ID not available)") - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/multi_agent/status.py b/.trellis/scripts/multi_agent/status.py deleted file mode 100755 index cba7890e..00000000 --- a/.trellis/scripts/multi_agent/status.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Status Monitor. - -Usage: - python3 status.py Show summary of all tasks (default) - python3 status.py -a <assignee> Filter tasks by assignee - python3 status.py --list List all worktrees and agents - python3 status.py --detail <task> Detailed task status - python3 status.py --watch <task> Watch agent log in real-time - python3 status.py --log <task> Show recent log entries - python3 status.py --registry Show agent registry - -Entry shim — delegates to status_display and status_monitor. -""" - -from __future__ import annotations - -import argparse -import sys - -import _bootstrap # noqa: F401 — adds parent scripts/ dir to sys.path - -from common.paths import get_repo_root - -from .status_display import ( - cmd_detail, - cmd_help, - cmd_list, - cmd_registry, - cmd_summary, -) -from .status_monitor import cmd_log, cmd_watch - - -# ============================================================================= -# Main -# ============================================================================= - -def main() -> int: - """Main entry point.""" - parser = argparse.ArgumentParser(description="Multi-Agent Pipeline: Status Monitor") - parser.add_argument("-a", "--assignee", help="Filter by assignee") - parser.add_argument( - "--list", action="store_true", help="List all worktrees and agents" - ) - parser.add_argument("--detail", metavar="TASK", help="Detailed task status") - parser.add_argument("--progress", metavar="TASK", help="Quick progress view") - parser.add_argument("--watch", metavar="TASK", help="Watch agent log") - parser.add_argument("--log", metavar="TASK", help="Show recent log entries") - parser.add_argument("--registry", action="store_true", help="Show agent registry") - parser.add_argument("target", nargs="?", help="Target task") - - args = parser.parse_args() - repo_root = get_repo_root() - - if args.list: - return cmd_list(repo_root) - elif args.detail: - return cmd_detail(args.detail, repo_root) - elif args.progress: - return cmd_detail(args.progress, repo_root) # Similar to detail - elif args.watch: - return cmd_watch(args.watch, repo_root) - elif args.log: - return cmd_log(args.log, repo_root) - elif args.registry: - return cmd_registry(repo_root) - elif args.target: - return cmd_detail(args.target, repo_root) - else: - return cmd_summary(repo_root, args.assignee) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/scripts/multi_agent/status_display.py b/.trellis/scripts/multi_agent/status_display.py deleted file mode 100755 index 6b15d861..00000000 --- a/.trellis/scripts/multi_agent/status_display.py +++ /dev/null @@ -1,542 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Status display and formatting. - -Provides: - cmd_help - Show help text - cmd_list - List worktrees and agents - cmd_summary - Summary of all tasks with agent status - cmd_detail - Detailed single-agent status - cmd_registry - Dump agent registry - -Also exports shared utilities used by status_monitor: - is_running, find_agent, get_registry_file, calc_elapsed, count_modified_files -""" - -from __future__ import annotations - -import json -import os -import subprocess -from datetime import datetime -from pathlib import Path - -from common.cli_adapter import get_cli_adapter -from common.io import read_json -from common.log import Colors -from common.developer import ensure_developer -from common.paths import ( - get_repo_root, - get_tasks_dir, -) -from common.phase import get_phase_info -from common.task_queue import format_task_stats, get_task_stats -from common.tasks import iter_active_tasks -from common.worktree import get_agents_dir - - -# ============================================================================= -# Shared Utilities -# ============================================================================= - -def is_running(pid: int | str | None) -> bool: - """Check if PID is running.""" - if not pid: - return False - try: - pid_int = int(pid) - os.kill(pid_int, 0) - return True - except (ProcessLookupError, ValueError, PermissionError, TypeError): - return False - - -def status_color(status: str) -> str: - """Get status color.""" - colors = { - "completed": Colors.GREEN, - "in_progress": Colors.BLUE, - "planning": Colors.YELLOW, - } - return colors.get(status, Colors.DIM) - - -def get_registry_file(repo_root: Path) -> Path | None: - """Get registry file path.""" - agents_dir = get_agents_dir(repo_root) - if agents_dir: - return agents_dir / "registry.json" - return None - - -def find_agent(search: str, repo_root: Path) -> dict | None: - """Find agent by task name or ID.""" - registry_file = get_registry_file(repo_root) - if not registry_file or not registry_file.is_file(): - return None - - data = read_json(registry_file) - if not data: - return None - - for agent in data.get("agents", []): - # Exact ID match - if agent.get("id") == search: - return agent - # Partial match on task_dir - task_dir = agent.get("task_dir", "") - if search in task_dir: - return agent - - return None - - -def calc_elapsed(started: str | None) -> str: - """Calculate elapsed time from ISO timestamp.""" - if not started: - return "N/A" - - try: - # Parse ISO format - if "+" in started: - started = started.split("+")[0] - if "T" in started: - start_dt = datetime.fromisoformat(started) - else: - return "N/A" - - now = datetime.now() - elapsed = (now - start_dt).total_seconds() - - if elapsed < 60: - return f"{int(elapsed)}s" - elif elapsed < 3600: - mins = int(elapsed // 60) - secs = int(elapsed % 60) - return f"{mins}m {secs}s" - else: - hours = int(elapsed // 3600) - mins = int((elapsed % 3600) // 60) - return f"{hours}h {mins}m" - except (ValueError, TypeError): - return "N/A" - - -def count_modified_files(worktree: str) -> int: - """Count modified files in worktree.""" - if not Path(worktree).is_dir(): - return 0 - - try: - result = subprocess.run( - ["git", "status", "--short"], - cwd=worktree, - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - return len([line for line in result.stdout.splitlines() if line.strip()]) - except Exception: - return 0 - - -# ============================================================================= -# Commands -# ============================================================================= - -def cmd_help() -> int: - """Show help.""" - print("""Multi-Agent Pipeline: Status Monitor - -Usage: - python3 status.py Show summary of all tasks - python3 status.py -a <assignee> Filter tasks by assignee - python3 status.py --list List all worktrees and agents - python3 status.py --detail <task> Detailed task status - python3 status.py --progress <task> Quick progress view with recent activity - python3 status.py --watch <task> Watch agent log in real-time - python3 status.py --log <task> Show recent log entries - python3 status.py --registry Show agent registry - -Examples: - python3 status.py -a taosu - python3 status.py --detail my-task - python3 status.py --progress my-task - python3 status.py --watch 01-16-worktree-support - python3 status.py --log worktree-support -""") - return 0 - - -def cmd_list(repo_root: Path) -> int: - """List worktrees and agents.""" - print(f"{Colors.BLUE}=== Git Worktrees ==={Colors.NC}") - print() - - subprocess.run(["git", "worktree", "list"], cwd=repo_root) - print() - - print(f"{Colors.BLUE}=== Registered Agents ==={Colors.NC}") - print() - - registry_file = get_registry_file(repo_root) - if not registry_file or not registry_file.is_file(): - print(" (no registry found)") - return 0 - - data = read_json(registry_file) - if not data or not data.get("agents"): - print(" (no agents registered)") - return 0 - - for agent in data["agents"]: - agent_id = agent.get("id", "?") - pid = agent.get("pid") - wt = agent.get("worktree_path", "?") - started = agent.get("started_at", "?") - - if is_running(pid): - status_icon = f"{Colors.GREEN}●{Colors.NC}" - else: - status_icon = f"{Colors.RED}○{Colors.NC}" - - print(f" {status_icon} {agent_id} (PID: {pid})") - print(f" {Colors.DIM}Worktree: {wt}{Colors.NC}") - print(f" {Colors.DIM}Started: {started}{Colors.NC}") - print() - - return 0 - - -def cmd_summary(repo_root: Path, filter_assignee: str | None = None) -> int: - """Show summary of all tasks.""" - # Import lazily to avoid circular import at module level - from .status_monitor import get_last_tool, get_last_message - - ensure_developer(repo_root) - - tasks_dir = get_tasks_dir(repo_root) - if not tasks_dir.is_dir(): - print("No tasks directory found") - return 0 - - registry_file = get_registry_file(repo_root) - - # Count running agents - running_count = 0 - total_agents = 0 - - if registry_file and registry_file.is_file(): - data = read_json(registry_file) - if data: - agents = data.get("agents", []) - total_agents = len(agents) - for agent in agents: - if is_running(agent.get("pid")): - running_count += 1 - - # Task queue stats - task_stats = get_task_stats(repo_root) - - print(f"{Colors.BLUE}=== Multi-Agent Status ==={Colors.NC}") - print( - f" Agents: {Colors.GREEN}{running_count}{Colors.NC} running / {total_agents} registered" - ) - print(f" Tasks: {format_task_stats(task_stats)}") - print() - - # Process tasks - running_tasks = [] - stopped_tasks = [] - regular_tasks = [] - - registry_data = ( - read_json(registry_file) - if registry_file and registry_file.is_file() - else None - ) - - for t in iter_active_tasks(tasks_dir): - name = t.dir_name - status = t.status - assignee = t.assignee or "unassigned" - priority = t.priority - - # Filter by assignee - if filter_assignee and assignee != filter_assignee: - continue - - # Check agent status - agent_info = None - if registry_data: - for agent in registry_data.get("agents", []): - if name in agent.get("task_dir", ""): - agent_info = agent - break - - if agent_info: - pid = agent_info.get("pid") - worktree = agent_info.get("worktree_path", "") - started = agent_info.get("started_at") - agent_platform = agent_info.get("platform", "claude") - - if is_running(pid): - # Running agent - task_dir_rel = agent_info.get("task_dir", "") - worktree_task_json = Path(worktree) / task_dir_rel / "task.json" - phase_source = t.directory / "task.json" - if worktree_task_json.is_file(): - phase_source = worktree_task_json - - phase_info_str = get_phase_info(phase_source) - elapsed = calc_elapsed(started) - modified = count_modified_files(worktree) - - worktree_data = read_json(phase_source) - branch = worktree_data.get("branch", "N/A") if worktree_data else "N/A" - - log_file = Path(worktree) / ".agent-log" - last_tool = get_last_tool(log_file, platform=agent_platform) - - running_tasks.append( - { - "name": name, - "priority": priority, - "assignee": assignee, - "phase_info": phase_info_str, - "elapsed": elapsed, - "branch": branch, - "modified": modified, - "last_tool": last_tool, - "pid": pid, - } - ) - else: - # Stopped agent - task_dir_rel = agent_info.get("task_dir", "") - worktree_task_json = Path(worktree) / task_dir_rel / "task.json" - worktree_status = "unknown" - - if worktree_task_json.is_file(): - wt_data = read_json(worktree_task_json) - if wt_data: - worktree_status = wt_data.get("status", "unknown") - - session_id_file = Path(worktree) / ".session-id" - log_file = Path(worktree) / ".agent-log" - - stopped_tasks.append( - { - "name": name, - "worktree": worktree, - "status": worktree_status, - "session_id_file": session_id_file, - "log_file": log_file, - "platform": agent_info.get("platform", "claude"), - } - ) - else: - # Regular task - regular_tasks.append( - { - "name": name, - "status": status, - "priority": priority, - "assignee": assignee, - } - ) - - # Output running agents - if running_tasks: - print(f"{Colors.CYAN}Running Agents:{Colors.NC}") - for t in running_tasks: - priority_color = ( - Colors.RED - if t["priority"] == "P0" - else (Colors.YELLOW if t["priority"] == "P1" else Colors.BLUE) - ) - print( - f"{Colors.GREEN}▶{Colors.NC} {Colors.CYAN}{t['name']}{Colors.NC} {Colors.GREEN}[running]{Colors.NC} {priority_color}[{t['priority']}]{Colors.NC} @{t['assignee']}" - ) - print(f" Phase: {t['phase_info']}") - print(f" Elapsed: {t['elapsed']}") - print(f" Branch: {Colors.DIM}{t['branch']}{Colors.NC}") - print(f" Modified: {t['modified']} file(s)") - if t["last_tool"]: - print(f" Activity: {Colors.YELLOW}{t['last_tool']}{Colors.NC}") - print(f" PID: {Colors.DIM}{t['pid']}{Colors.NC}") - print() - - # Output stopped agents - if stopped_tasks: - print(f"{Colors.RED}Stopped Agents:{Colors.NC}") - for t in stopped_tasks: - if t["status"] == "completed": - print( - f"{Colors.GREEN}✓{Colors.NC} {t['name']} {Colors.GREEN}[completed]{Colors.NC}" - ) - else: - if t["session_id_file"].is_file(): - session_id = ( - t["session_id_file"].read_text(encoding="utf-8").strip() - ) - last_msg = get_last_message(t["log_file"], 150, platform=t.get("platform", "claude")) - print( - f"{Colors.RED}○{Colors.NC} {t['name']} {Colors.RED}[stopped]{Colors.NC}" - ) - if last_msg: - print(f'{Colors.DIM}"{last_msg}"{Colors.NC}') - # Use CLI adapter for platform-specific resume command - adapter = get_cli_adapter(t.get("platform", "claude")) - resume_cmd = adapter.get_resume_command_str(session_id, cwd=t["worktree"]) - print(f"{Colors.YELLOW}{resume_cmd}{Colors.NC}") - else: - print( - f"{Colors.RED}○{Colors.NC} {t['name']} {Colors.RED}[stopped]{Colors.NC} {Colors.DIM}(no session-id){Colors.NC}" - ) - print() - - # Separator - if (running_tasks or stopped_tasks) and regular_tasks: - print(f"{Colors.DIM}───────────────────────────────────────{Colors.NC}") - print() - - # Output regular tasks grouped by assignee - if regular_tasks: - # Sort by assignee, priority, status - regular_tasks.sort( - key=lambda x: ( - x["assignee"], - {"P0": 0, "P1": 1, "P2": 2, "P3": 3}.get(x["priority"], 2), - {"in_progress": 0, "planning": 1, "completed": 2}.get(x["status"], 1), - ) - ) - - current_assignee = None - for t in regular_tasks: - if t["assignee"] != current_assignee: - if current_assignee is not None: - print() - print(f"{Colors.CYAN}@{t['assignee']}:{Colors.NC}") - current_assignee = t["assignee"] - - color = status_color(t["status"]) - priority_color = ( - Colors.RED - if t["priority"] == "P0" - else (Colors.YELLOW if t["priority"] == "P1" else Colors.BLUE) - ) - print( - f" {color}●{Colors.NC} {t['name']} ({t['status']}) {priority_color}[{t['priority']}]{Colors.NC}" - ) - - if running_tasks: - print() - print(f"{Colors.DIM}─────────────────────────────────────{Colors.NC}") - print(f"{Colors.DIM}Use --progress <name> for quick activity view{Colors.NC}") - print(f"{Colors.DIM}Use --detail <name> for more info{Colors.NC}") - - print() - return 0 - - -def cmd_detail(target: str, repo_root: Path) -> int: - """Show detailed task status.""" - agent = find_agent(target, repo_root) - if not agent: - print(f"Agent not found: {target}") - return 1 - - agent_id = agent.get("id", "?") - pid = agent.get("pid") - worktree = agent.get("worktree_path", "?") - task_dir = agent.get("task_dir", "?") - started = agent.get("started_at", "?") - platform = agent.get("platform", "claude") - - # Check for session-id - session_id = "" - session_id_file = Path(worktree) / ".session-id" - if session_id_file.is_file(): - session_id = session_id_file.read_text(encoding="utf-8").strip() - - print(f"{Colors.BLUE}=== Agent Detail: {agent_id} ==={Colors.NC}") - print() - print(f" ID: {agent_id}") - print(f" PID: {pid}") - print(f" Session: {session_id or 'N/A'}") - print(f" Worktree: {worktree}") - print(f" Task Dir: {task_dir}") - print(f" Started: {started}") - print() - - # Status - if is_running(pid): - print(f" Status: {Colors.GREEN}Running{Colors.NC}") - else: - print(f" Status: {Colors.RED}Stopped{Colors.NC}") - if session_id: - print() - # Use CLI adapter for platform-specific resume command - adapter = get_cli_adapter(platform) - resume_cmd = adapter.get_resume_command_str(session_id, cwd=worktree) - print(f" {Colors.YELLOW}Resume:{Colors.NC} {resume_cmd}") - - # Task info - task_json = repo_root / task_dir / "task.json" - if task_json.is_file(): - print() - print(f"{Colors.BLUE}=== Task Info ==={Colors.NC}") - print() - data = read_json(task_json) - if data: - print(f" Status: {data.get('status', 'unknown')}") - print(f" Branch: {data.get('branch', 'N/A')}") - print(f" Base Branch: {data.get('base_branch', 'N/A')}") - - # Git changes - if Path(worktree).is_dir(): - print() - print(f"{Colors.BLUE}=== Git Changes ==={Colors.NC}") - print() - - result = subprocess.run( - ["git", "status", "--short"], - cwd=worktree, - capture_output=True, - text=True, - encoding="utf-8", - errors="replace", - ) - changes = result.stdout.strip() - if changes: - for line in changes.splitlines()[:10]: - print(f" {line}") - total = len(changes.splitlines()) - if total > 10: - print(f" ... and {total - 10} more") - else: - print(" (no changes)") - - print() - return 0 - - -def cmd_registry(repo_root: Path) -> int: - """Show agent registry.""" - registry_file = get_registry_file(repo_root) - - print(f"{Colors.BLUE}=== Agent Registry ==={Colors.NC}") - print() - print(f"File: {registry_file}") - print() - - if registry_file and registry_file.is_file(): - data = read_json(registry_file) - if data: - print(json.dumps(data, indent=2)) - else: - print("(registry not found)") - - return 0 diff --git a/.trellis/scripts/multi_agent/status_monitor.py b/.trellis/scripts/multi_agent/status_monitor.py deleted file mode 100755 index d92087f4..00000000 --- a/.trellis/scripts/multi_agent/status_monitor.py +++ /dev/null @@ -1,225 +0,0 @@ -#!/usr/bin/env python3 -""" -Multi-Agent Pipeline: Process monitoring and log parsing. - -Provides: - tail_follow - Follow a file like 'tail -f' - get_last_tool - Get last tool call from agent log - get_last_message - Get last assistant text from agent log - cmd_watch - Watch agent log in real-time - cmd_log - Show recent log entries -""" - -from __future__ import annotations - -import json -import time -from pathlib import Path - -from common.log import Colors - -from .status_display import find_agent - - -# ============================================================================= -# Log Parsing -# ============================================================================= - -def tail_follow(file_path: Path) -> None: - """Follow a file like 'tail -f', cross-platform compatible.""" - with open(file_path, "r", encoding="utf-8", errors="replace") as f: - # Seek to end of file - f.seek(0, 2) - - while True: - line = f.readline() - if line: - print(line, end="", flush=True) - else: - time.sleep(0.1) - - -def get_last_tool(log_file: Path, platform: str = "claude") -> str | None: - """Get the last tool call from agent log. - - Supports both Claude Code and OpenCode log formats. - - Claude Code format: - {"type": "assistant", "message": {"content": [{"type": "tool_use", "name": "Read"}]}} - - OpenCode format: - {"type": "tool_use", "tool": "bash", "state": {"status": "completed"}} - """ - if not log_file.is_file(): - return None - - try: - lines = log_file.read_text(encoding="utf-8").splitlines() - for line in reversed(lines[-100:]): - try: - data = json.loads(line) - - if platform == "opencode": - # OpenCode format: {"type": "tool_use", "tool": "bash", ...} - if data.get("type") == "tool_use": - return data.get("tool") - else: - # Claude Code format: {"type": "assistant", "message": {"content": [...]}} - if data.get("type") == "assistant": - content = data.get("message", {}).get("content", []) - for item in content: - if item.get("type") == "tool_use": - return item.get("name") - except json.JSONDecodeError: - continue - except Exception: - pass - return None - - -def get_last_message(log_file: Path, max_len: int = 100, platform: str = "claude") -> str | None: - """Get the last assistant text from agent log. - - Supports both Claude Code and OpenCode log formats. - - Claude Code format: - {"type": "assistant", "message": {"content": [{"type": "text", "text": "..."}]}} - - OpenCode format: - {"type": "text", "text": "..."} - """ - if not log_file.is_file(): - return None - - try: - lines = log_file.read_text(encoding="utf-8").splitlines() - for line in reversed(lines[-100:]): - try: - data = json.loads(line) - - if platform == "opencode": - # OpenCode format: {"type": "text", "text": "..."} - if data.get("type") == "text": - text = data.get("text", "") - if text: - return text[:max_len] - else: - # Claude Code format: {"type": "assistant", "message": {"content": [...]}} - if data.get("type") == "assistant": - content = data.get("message", {}).get("content", []) - for item in content: - if item.get("type") == "text": - text = item.get("text", "") - if text: - return text[:max_len] - except json.JSONDecodeError: - continue - except Exception: - pass - return None - - -# ============================================================================= -# Commands -# ============================================================================= - -def cmd_watch(target: str, repo_root: Path) -> int: - """Watch agent log in real-time.""" - agent = find_agent(target, repo_root) - if not agent: - print(f"Agent not found: {target}") - return 1 - - worktree = agent.get("worktree_path", "") - log_file = Path(worktree) / ".agent-log" - - if not log_file.is_file(): - print(f"Log file not found: {log_file}") - return 1 - - print(f"{Colors.BLUE}Watching:{Colors.NC} {log_file}") - print(f"{Colors.DIM}Press Ctrl+C to stop{Colors.NC}") - print() - - try: - tail_follow(log_file) - except KeyboardInterrupt: - print() # Clean newline after Ctrl+C - return 0 - - -def cmd_log(target: str, repo_root: Path) -> int: - """Show recent log entries.""" - agent = find_agent(target, repo_root) - if not agent: - print(f"Agent not found: {target}") - return 1 - - worktree = agent.get("worktree_path", "") - platform = agent.get("platform", "claude") - log_file = Path(worktree) / ".agent-log" - - if not log_file.is_file(): - print(f"Log file not found: {log_file}") - return 1 - - print(f"{Colors.BLUE}=== Recent Log: {target} ==={Colors.NC}") - print(f"{Colors.DIM}Platform: {platform}{Colors.NC}") - print() - - lines = log_file.read_text(encoding="utf-8").splitlines() - for line in lines[-50:]: - try: - data = json.loads(line) - msg_type = data.get("type", "") - - if platform == "opencode": - # OpenCode format - if msg_type == "text": - text = data.get("text", "") - if text: - display = text[:300] - if len(text) > 300: - display += "..." - print(f"{Colors.BLUE}[TEXT]{Colors.NC} {display}") - elif msg_type == "tool_use": - tool_name = data.get("tool", "unknown") - status = data.get("state", {}).get("status", "") - print(f"{Colors.YELLOW}[TOOL]{Colors.NC} {tool_name} ({status})") - elif msg_type == "step_start": - print(f"{Colors.CYAN}[STEP]{Colors.NC} Start") - elif msg_type == "step_finish": - reason = data.get("reason", "") - print(f"{Colors.CYAN}[STEP]{Colors.NC} Finish ({reason})") - elif msg_type == "error": - error_msg = data.get("message", "") - print(f"{Colors.RED}[ERROR]{Colors.NC} {error_msg}") - else: - # Claude Code format - if msg_type == "system": - subtype = data.get("subtype", "") - print(f"{Colors.CYAN}[SYSTEM]{Colors.NC} {subtype}") - elif msg_type == "user": - content = data.get("message", {}).get("content", "") - if content: - print(f"{Colors.GREEN}[USER]{Colors.NC} {content[:200]}") - elif msg_type == "assistant": - content = data.get("message", {}).get("content", []) - if content: - item = content[0] - text = item.get("text") - tool = item.get("name") - if text: - display = text[:300] - if len(text) > 300: - display += "..." - print(f"{Colors.BLUE}[ASSISTANT]{Colors.NC} {display}") - elif tool: - print(f"{Colors.YELLOW}[TOOL]{Colors.NC} {tool}") - elif msg_type == "result": - tool_name = data.get("tool", "unknown") - print(f"{Colors.DIM}[RESULT]{Colors.NC} {tool_name} completed") - except json.JSONDecodeError: - continue - - return 0 diff --git a/.trellis/scripts/task.py b/.trellis/scripts/task.py deleted file mode 100755 index e207b61a..00000000 --- a/.trellis/scripts/task.py +++ /dev/null @@ -1,445 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Task Management Script for Multi-Agent Pipeline. - -Usage: - python3 task.py create "<title>" [--slug <name>] [--assignee <dev>] [--priority P0|P1|P2|P3] [--parent <dir>] [--package <pkg>] - python3 task.py init-context <dir> <type> [--package <pkg>] # Initialize jsonl files - python3 task.py add-context <dir> <file> <path> [reason] # Add jsonl entry - python3 task.py validate <dir> # Validate jsonl files - python3 task.py list-context <dir> # List jsonl entries - python3 task.py start <dir> # Set as current task - python3 task.py finish # Clear current task - python3 task.py set-branch <dir> <branch> # Set git branch - python3 task.py set-base-branch <dir> <branch> # Set PR target branch - python3 task.py set-scope <dir> <scope> # Set scope for PR title - python3 task.py create-pr [dir] [--dry-run] # Create PR from task - python3 task.py archive <task-name> # Archive completed task - python3 task.py list # List active tasks - python3 task.py list-archive [month] # List archived tasks - python3 task.py add-subtask <parent-dir> <child-dir> # Link child to parent - python3 task.py remove-subtask <parent-dir> <child-dir> # Unlink child from parent -""" - -from __future__ import annotations - -import argparse -import sys -from pathlib import Path - -from common.log import Colors, colored -from common.paths import ( - DIR_WORKFLOW, - DIR_TASKS, - FILE_TASK_JSON, - get_repo_root, - get_developer, - get_tasks_dir, - get_current_task, - set_current_task, - clear_current_task, -) -from common.task_utils import resolve_task_dir, run_task_hooks -from common.tasks import iter_active_tasks, children_progress - -# Import command handlers from split modules (also re-exports for plan.py compatibility) -from common.task_store import ( - cmd_create, - cmd_archive, - cmd_set_branch, - cmd_set_base_branch, - cmd_set_scope, - cmd_add_subtask, - cmd_remove_subtask, -) -from common.task_context import ( - cmd_init_context, - cmd_add_context, - cmd_validate, - cmd_list_context, -) - - -# ============================================================================= -# Command: start / finish -# ============================================================================= - -def cmd_start(args: argparse.Namespace) -> int: - """Set current task.""" - repo_root = get_repo_root() - task_input = args.dir - - if not task_input: - print(colored("Error: task directory or name required", Colors.RED)) - return 1 - - # Resolve task directory (supports task name, relative path, or absolute path) - full_path = resolve_task_dir(task_input, repo_root) - - if not full_path.is_dir(): - print(colored(f"Error: Task not found: {task_input}", Colors.RED)) - print("Hint: Use task name (e.g., 'my-task') or full path (e.g., '.trellis/tasks/01-31-my-task')") - return 1 - - # Convert to relative path for storage - try: - task_dir = full_path.relative_to(repo_root).as_posix() - except ValueError: - task_dir = str(full_path) - - if set_current_task(task_dir, repo_root): - print(colored(f"✓ Current task set to: {task_dir}", Colors.GREEN)) - print() - print(colored("The hook will now inject context from this task's jsonl files.", Colors.BLUE)) - - task_json_path = full_path / FILE_TASK_JSON - run_task_hooks("after_start", task_json_path, repo_root) - return 0 - else: - print(colored("Error: Failed to set current task", Colors.RED)) - return 1 - - -def cmd_finish(args: argparse.Namespace) -> int: - """Clear current task.""" - repo_root = get_repo_root() - current = get_current_task(repo_root) - - if not current: - print(colored("No current task set", Colors.YELLOW)) - return 0 - - # Resolve task.json path before clearing - task_json_path = repo_root / current / FILE_TASK_JSON - - clear_current_task(repo_root) - print(colored(f"✓ Cleared current task (was: {current})", Colors.GREEN)) - - if task_json_path.is_file(): - run_task_hooks("after_finish", task_json_path, repo_root) - return 0 - - -# ============================================================================= -# Command: list -# ============================================================================= - -def cmd_list(args: argparse.Namespace) -> int: - """List active tasks.""" - repo_root = get_repo_root() - tasks_dir = get_tasks_dir(repo_root) - current_task = get_current_task(repo_root) - developer = get_developer(repo_root) - filter_mine = args.mine - filter_status = args.status - - if filter_mine: - if not developer: - print(colored("Error: No developer set. Run init_developer.py first", Colors.RED), file=sys.stderr) - return 1 - print(colored(f"My tasks (assignee: {developer}):", Colors.BLUE)) - else: - print(colored("All active tasks:", Colors.BLUE)) - print() - - # Single pass: collect all tasks via shared iterator - all_tasks = {t.dir_name: t for t in iter_active_tasks(tasks_dir)} - all_statuses = {name: t.status for name, t in all_tasks.items()} - - # Display tasks hierarchically - count = 0 - - def _print_task(dir_name: str, indent: int = 0) -> None: - nonlocal count - t = all_tasks[dir_name] - - # Apply --mine filter - if filter_mine and (t.assignee or "-") != developer: - return - - # Apply --status filter - if filter_status and t.status != filter_status: - return - - relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{dir_name}" - marker = "" - if relative_path == current_task: - marker = f" {colored('<- current', Colors.GREEN)}" - - # Children progress - progress = children_progress(t.children, all_statuses) - - # Package tag - pkg_tag = f" @{t.package}" if t.package else "" - - prefix = " " * indent + " - " - - if filter_mine: - print(f"{prefix}{dir_name}/ ({t.status}){pkg_tag}{progress}{marker}") - else: - print(f"{prefix}{dir_name}/ ({t.status}){pkg_tag}{progress} [{colored(t.assignee or '-', Colors.CYAN)}]{marker}") - count += 1 - - # Print children indented - for child_name in t.children: - if child_name in all_tasks: - _print_task(child_name, indent + 1) - - # Display only top-level tasks (those without a parent) - for dir_name in sorted(all_tasks.keys()): - if not all_tasks[dir_name].parent: - _print_task(dir_name) - - if count == 0: - if filter_mine: - print(" (no tasks assigned to you)") - else: - print(" (no active tasks)") - - print() - print(f"Total: {count} task(s)") - return 0 - - -# ============================================================================= -# Command: list-archive -# ============================================================================= - -def cmd_list_archive(args: argparse.Namespace) -> int: - """List archived tasks.""" - repo_root = get_repo_root() - tasks_dir = get_tasks_dir(repo_root) - archive_dir = tasks_dir / "archive" - month = args.month - - print(colored("Archived tasks:", Colors.BLUE)) - print() - - if month: - month_dir = archive_dir / month - if month_dir.is_dir(): - print(f"[{month}]") - for d in sorted(month_dir.iterdir()): - if d.is_dir(): - print(f" - {d.name}/") - else: - print(f" No archives for {month}") - else: - if archive_dir.is_dir(): - for month_dir in sorted(archive_dir.iterdir()): - if month_dir.is_dir(): - month_name = month_dir.name - count = sum(1 for d in month_dir.iterdir() if d.is_dir()) - print(f"[{month_name}] - {count} task(s)") - - return 0 - - -# ============================================================================= -# Command: create-pr (delegates to multi-agent script) -# ============================================================================= - -def cmd_create_pr(args: argparse.Namespace) -> int: - """Create PR from task - delegates to multi_agent/create_pr.py.""" - import subprocess - script_dir = Path(__file__).parent - create_pr_script = script_dir / "multi_agent" / "create_pr.py" - - cmd = [sys.executable, str(create_pr_script)] - if args.dir: - cmd.append(args.dir) - if args.dry_run: - cmd.append("--dry-run") - - result = subprocess.run(cmd) - return result.returncode - - -# ============================================================================= -# Help -# ============================================================================= - -def show_usage() -> None: - """Show usage help.""" - print("""Task Management Script for Multi-Agent Pipeline - -Usage: - python3 task.py create <title> Create new task directory - python3 task.py create <title> --package <pkg> Create task for a specific package - python3 task.py create <title> --parent <dir> Create task as child of parent - python3 task.py init-context <dir> <dev_type> Initialize jsonl files - python3 task.py init-context <dir> <type> --package <pkg> With explicit package - python3 task.py add-context <dir> <jsonl> <path> [reason] Add entry to jsonl - python3 task.py validate <dir> Validate jsonl files - python3 task.py list-context <dir> List jsonl entries - python3 task.py start <dir> Set as current task - python3 task.py finish Clear current task - python3 task.py set-branch <dir> <branch> Set git branch for multi-agent - python3 task.py set-scope <dir> <scope> Set scope for PR title - python3 task.py create-pr [dir] [--dry-run] Create PR from task - python3 task.py archive <task-name> Archive completed task - python3 task.py add-subtask <parent> <child> Link child task to parent - python3 task.py remove-subtask <parent> <child> Unlink child from parent - python3 task.py list [--mine] [--status <status>] List tasks - python3 task.py list-archive [YYYY-MM] List archived tasks - -Arguments: - dev_type: backend | frontend | fullstack | test | docs - -Monorepo options: - --package <pkg> Package name (validated against config.yaml packages) - -List options: - --mine, -m Show only tasks assigned to current developer - --status, -s <s> Filter by status (planning, in_progress, review, completed) - -Examples: - python3 task.py create "Add login feature" --slug add-login - python3 task.py create "Add login feature" --slug add-login --package cli - python3 task.py create "Child task" --slug child --parent .trellis/tasks/01-21-parent - python3 task.py init-context .trellis/tasks/01-21-add-login backend - python3 task.py init-context .trellis/tasks/01-21-add-login backend --package cli - python3 task.py add-context <dir> implement .trellis/spec/cli/backend/auth.md "Auth guidelines" - python3 task.py set-branch <dir> task/add-login - python3 task.py start .trellis/tasks/01-21-add-login - python3 task.py create-pr # Uses current task - python3 task.py create-pr <dir> --dry-run # Preview without changes - python3 task.py finish - python3 task.py archive add-login - python3 task.py add-subtask parent-task child-task # Link existing tasks - python3 task.py remove-subtask parent-task child-task - python3 task.py list # List all active tasks - python3 task.py list --mine # List my tasks only - python3 task.py list --mine --status in_progress # List my in-progress tasks -""") - - -# ============================================================================= -# Main Entry -# ============================================================================= - -def main() -> int: - """CLI entry point.""" - parser = argparse.ArgumentParser( - description="Task Management Script for Multi-Agent Pipeline", - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - subparsers = parser.add_subparsers(dest="command", help="Commands") - - # create - p_create = subparsers.add_parser("create", help="Create new task") - p_create.add_argument("title", help="Task title") - p_create.add_argument("--slug", "-s", help="Task slug") - p_create.add_argument("--assignee", "-a", help="Assignee developer") - p_create.add_argument("--priority", "-p", default="P2", help="Priority (P0-P3)") - p_create.add_argument("--description", "-d", help="Task description") - p_create.add_argument("--parent", help="Parent task directory (establishes subtask link)") - p_create.add_argument("--package", help="Package name for monorepo projects") - - # init-context - p_init = subparsers.add_parser("init-context", help="Initialize context files") - p_init.add_argument("dir", help="Task directory") - p_init.add_argument("type", help="Dev type: backend|frontend|fullstack|test|docs") - p_init.add_argument("--package", help="Package name for monorepo projects") - - # add-context - p_add = subparsers.add_parser("add-context", help="Add context entry") - p_add.add_argument("dir", help="Task directory") - p_add.add_argument("file", help="JSONL file (implement|check|debug)") - p_add.add_argument("path", help="File path to add") - p_add.add_argument("reason", nargs="?", help="Reason for adding") - - # validate - p_validate = subparsers.add_parser("validate", help="Validate context files") - p_validate.add_argument("dir", help="Task directory") - - # list-context - p_listctx = subparsers.add_parser("list-context", help="List context entries") - p_listctx.add_argument("dir", help="Task directory") - - # start - p_start = subparsers.add_parser("start", help="Set current task") - p_start.add_argument("dir", help="Task directory") - - # finish - subparsers.add_parser("finish", help="Clear current task") - - # set-branch - p_branch = subparsers.add_parser("set-branch", help="Set git branch") - p_branch.add_argument("dir", help="Task directory") - p_branch.add_argument("branch", help="Branch name") - - # set-base-branch - p_base = subparsers.add_parser("set-base-branch", help="Set PR target branch") - p_base.add_argument("dir", help="Task directory") - p_base.add_argument("base_branch", help="Base branch name (PR target)") - - # set-scope - p_scope = subparsers.add_parser("set-scope", help="Set scope") - p_scope.add_argument("dir", help="Task directory") - p_scope.add_argument("scope", help="Scope name") - - # create-pr - p_pr = subparsers.add_parser("create-pr", help="Create PR") - p_pr.add_argument("dir", nargs="?", help="Task directory") - p_pr.add_argument("--dry-run", action="store_true", help="Dry run mode") - - # archive - p_archive = subparsers.add_parser("archive", help="Archive task") - p_archive.add_argument("name", help="Task name") - p_archive.add_argument("--no-commit", action="store_true", help="Skip auto git commit after archive") - - # list - p_list = subparsers.add_parser("list", help="List tasks") - p_list.add_argument("--mine", "-m", action="store_true", help="My tasks only") - p_list.add_argument("--status", "-s", help="Filter by status") - - # add-subtask - p_addsub = subparsers.add_parser("add-subtask", help="Link child task to parent") - p_addsub.add_argument("parent_dir", help="Parent task directory") - p_addsub.add_argument("child_dir", help="Child task directory") - - # remove-subtask - p_rmsub = subparsers.add_parser("remove-subtask", help="Unlink child task from parent") - p_rmsub.add_argument("parent_dir", help="Parent task directory") - p_rmsub.add_argument("child_dir", help="Child task directory") - - # list-archive - p_listarch = subparsers.add_parser("list-archive", help="List archived tasks") - p_listarch.add_argument("month", nargs="?", help="Month (YYYY-MM)") - - args = parser.parse_args() - - if not args.command: - show_usage() - return 1 - - commands = { - "create": cmd_create, - "init-context": cmd_init_context, - "add-context": cmd_add_context, - "validate": cmd_validate, - "list-context": cmd_list_context, - "start": cmd_start, - "finish": cmd_finish, - "set-branch": cmd_set_branch, - "set-base-branch": cmd_set_base_branch, - "set-scope": cmd_set_scope, - "create-pr": cmd_create_pr, - "archive": cmd_archive, - "add-subtask": cmd_add_subtask, - "remove-subtask": cmd_remove_subtask, - "list": cmd_list, - "list-archive": cmd_list_archive, - } - - if args.command in commands: - return commands[args.command](args) - else: - show_usage() - return 1 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.trellis/spec/backend/database-guidelines.md b/.trellis/spec/backend/database-guidelines.md deleted file mode 100644 index b61aa784..00000000 --- a/.trellis/spec/backend/database-guidelines.md +++ /dev/null @@ -1,51 +0,0 @@ -# Database Guidelines - -> Database patterns and conventions for this project. - ---- - -## Overview - -<!-- -Document your project's database conventions here. - -Questions to answer: -- What ORM/query library do you use? -- How are migrations managed? -- What are the naming conventions for tables/columns? -- How do you handle transactions? ---> - -(To be filled by the team) - ---- - -## Query Patterns - -<!-- How should queries be written? Batch operations? --> - -(To be filled by the team) - ---- - -## Migrations - -<!-- How to create and run migrations --> - -(To be filled by the team) - ---- - -## Naming Conventions - -<!-- Table names, column names, index names --> - -(To be filled by the team) - ---- - -## Common Mistakes - -<!-- Database-related mistakes your team has made --> - -(To be filled by the team) diff --git a/.trellis/spec/backend/directory-structure.md b/.trellis/spec/backend/directory-structure.md deleted file mode 100644 index 9bb253df..00000000 --- a/.trellis/spec/backend/directory-structure.md +++ /dev/null @@ -1,54 +0,0 @@ -# Directory Structure - -> How backend code is organized in this project. - ---- - -## Overview - -<!-- -Document your project's backend directory structure here. - -Questions to answer: -- How are modules/packages organized? -- Where does business logic live? -- Where are API endpoints defined? -- How are utilities and helpers organized? ---> - -(To be filled by the team) - ---- - -## Directory Layout - -``` -<!-- Replace with your actual structure --> -src/ -├── ... -└── ... -``` - ---- - -## Module Organization - -<!-- How should new features/modules be organized? --> - -(To be filled by the team) - ---- - -## Naming Conventions - -<!-- File and folder naming rules --> - -(To be filled by the team) - ---- - -## Examples - -<!-- Link to well-organized modules as examples --> - -(To be filled by the team) diff --git a/.trellis/spec/backend/error-handling.md b/.trellis/spec/backend/error-handling.md deleted file mode 100644 index bcd55337..00000000 --- a/.trellis/spec/backend/error-handling.md +++ /dev/null @@ -1,51 +0,0 @@ -# Error Handling - -> How errors are handled in this project. - ---- - -## Overview - -<!-- -Document your project's error handling conventions here. - -Questions to answer: -- What error types do you define? -- How are errors propagated? -- How are errors logged? -- How are errors returned to clients? ---> - -(To be filled by the team) - ---- - -## Error Types - -<!-- Custom error classes/types --> - -(To be filled by the team) - ---- - -## Error Handling Patterns - -<!-- Try-catch patterns, error propagation --> - -(To be filled by the team) - ---- - -## API Error Responses - -<!-- Standard error response format --> - -(To be filled by the team) - ---- - -## Common Mistakes - -<!-- Error handling mistakes your team has made --> - -(To be filled by the team) diff --git a/.trellis/spec/backend/index.md b/.trellis/spec/backend/index.md deleted file mode 100644 index 1c0b4c42..00000000 --- a/.trellis/spec/backend/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# Backend Development Guidelines - -> Best practices for backend development in this project. - ---- - -## Overview - -This directory contains guidelines for backend development. Fill in each file with your project's specific conventions. - ---- - -## Guidelines Index - -| Guide | Description | Status | -|-------|-------------|--------| -| [Directory Structure](./directory-structure.md) | Module organization and file layout | To fill | -| [Database Guidelines](./database-guidelines.md) | ORM patterns, queries, migrations | To fill | -| [Error Handling](./error-handling.md) | Error types, handling strategies | To fill | -| [Quality Guidelines](./quality-guidelines.md) | Code standards, forbidden patterns | To fill | -| [Logging Guidelines](./logging-guidelines.md) | Structured logging, log levels | To fill | - ---- - -## How to Fill These Guidelines - -For each guideline file: - -1. Document your project's **actual conventions** (not ideals) -2. Include **code examples** from your codebase -3. List **forbidden patterns** and why -4. Add **common mistakes** your team has made - -The goal is to help AI assistants and new team members understand how YOUR project works. - ---- - -**Language**: All documentation should be written in **English**. diff --git a/.trellis/spec/backend/logging-guidelines.md b/.trellis/spec/backend/logging-guidelines.md deleted file mode 100644 index bb930df8..00000000 --- a/.trellis/spec/backend/logging-guidelines.md +++ /dev/null @@ -1,51 +0,0 @@ -# Logging Guidelines - -> How logging is done in this project. - ---- - -## Overview - -<!-- -Document your project's logging conventions here. - -Questions to answer: -- What logging library do you use? -- What are the log levels and when to use each? -- What should be logged? -- What should NOT be logged (PII, secrets)? ---> - -(To be filled by the team) - ---- - -## Log Levels - -<!-- When to use each level: debug, info, warn, error --> - -(To be filled by the team) - ---- - -## Structured Logging - -<!-- Log format, required fields --> - -(To be filled by the team) - ---- - -## What to Log - -<!-- Important events to log --> - -(To be filled by the team) - ---- - -## What NOT to Log - -<!-- Sensitive data, PII, secrets --> - -(To be filled by the team) diff --git a/.trellis/spec/backend/quality-guidelines.md b/.trellis/spec/backend/quality-guidelines.md deleted file mode 100644 index c1e1065a..00000000 --- a/.trellis/spec/backend/quality-guidelines.md +++ /dev/null @@ -1,51 +0,0 @@ -# Quality Guidelines - -> Code quality standards for backend development. - ---- - -## Overview - -<!-- -Document your project's quality standards here. - -Questions to answer: -- What patterns are forbidden? -- What linting rules do you enforce? -- What are your testing requirements? -- What code review standards apply? ---> - -(To be filled by the team) - ---- - -## Forbidden Patterns - -<!-- Patterns that should never be used and why --> - -(To be filled by the team) - ---- - -## Required Patterns - -<!-- Patterns that must always be used --> - -(To be filled by the team) - ---- - -## Testing Requirements - -<!-- What level of testing is expected --> - -(To be filled by the team) - ---- - -## Code Review Checklist - -<!-- What reviewers should check --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/component-guidelines.md b/.trellis/spec/frontend/component-guidelines.md deleted file mode 100644 index 6836c3fb..00000000 --- a/.trellis/spec/frontend/component-guidelines.md +++ /dev/null @@ -1,59 +0,0 @@ -# Component Guidelines - -> How components are built in this project. - ---- - -## Overview - -<!-- -Document your project's component conventions here. - -Questions to answer: -- What component patterns do you use? -- How are props defined? -- How do you handle composition? -- What accessibility standards apply? ---> - -(To be filled by the team) - ---- - -## Component Structure - -<!-- Standard structure of a component file --> - -(To be filled by the team) - ---- - -## Props Conventions - -<!-- How props should be defined and typed --> - -(To be filled by the team) - ---- - -## Styling Patterns - -<!-- How styles are applied (CSS modules, styled-components, Tailwind, etc.) --> - -(To be filled by the team) - ---- - -## Accessibility - -<!-- A11y requirements and patterns --> - -(To be filled by the team) - ---- - -## Common Mistakes - -<!-- Component-related mistakes your team has made --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/directory-structure.md b/.trellis/spec/frontend/directory-structure.md deleted file mode 100644 index 1eb57d16..00000000 --- a/.trellis/spec/frontend/directory-structure.md +++ /dev/null @@ -1,54 +0,0 @@ -# Directory Structure - -> How frontend code is organized in this project. - ---- - -## Overview - -<!-- -Document your project's frontend directory structure here. - -Questions to answer: -- Where do components live? -- How are features/modules organized? -- Where are shared utilities? -- How are assets organized? ---> - -(To be filled by the team) - ---- - -## Directory Layout - -``` -<!-- Replace with your actual structure --> -src/ -├── ... -└── ... -``` - ---- - -## Module Organization - -<!-- How should new features be organized? --> - -(To be filled by the team) - ---- - -## Naming Conventions - -<!-- File and folder naming rules --> - -(To be filled by the team) - ---- - -## Examples - -<!-- Link to well-organized modules as examples --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/hook-guidelines.md b/.trellis/spec/frontend/hook-guidelines.md deleted file mode 100644 index 60c6bb6a..00000000 --- a/.trellis/spec/frontend/hook-guidelines.md +++ /dev/null @@ -1,51 +0,0 @@ -# Hook Guidelines - -> How hooks are used in this project. - ---- - -## Overview - -<!-- -Document your project's hook conventions here. - -Questions to answer: -- What custom hooks do you have? -- How do you handle data fetching? -- What are the naming conventions? -- How do you share stateful logic? ---> - -(To be filled by the team) - ---- - -## Custom Hook Patterns - -<!-- How to create and structure custom hooks --> - -(To be filled by the team) - ---- - -## Data Fetching - -<!-- How data fetching is handled (React Query, SWR, etc.) --> - -(To be filled by the team) - ---- - -## Naming Conventions - -<!-- Hook naming rules (use*, etc.) --> - -(To be filled by the team) - ---- - -## Common Mistakes - -<!-- Hook-related mistakes your team has made --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/index.md b/.trellis/spec/frontend/index.md deleted file mode 100644 index a5e51b8b..00000000 --- a/.trellis/spec/frontend/index.md +++ /dev/null @@ -1,39 +0,0 @@ -# Frontend Development Guidelines - -> Best practices for frontend development in this project. - ---- - -## Overview - -This directory contains guidelines for frontend development. Fill in each file with your project's specific conventions. - ---- - -## Guidelines Index - -| Guide | Description | Status | -|-------|-------------|--------| -| [Directory Structure](./directory-structure.md) | Module organization and file layout | To fill | -| [Component Guidelines](./component-guidelines.md) | Component patterns, props, composition | To fill | -| [Hook Guidelines](./hook-guidelines.md) | Custom hooks, data fetching patterns | To fill | -| [State Management](./state-management.md) | Local state, global state, server state | To fill | -| [Quality Guidelines](./quality-guidelines.md) | Code standards, forbidden patterns | To fill | -| [Type Safety](./type-safety.md) | Type patterns, validation | To fill | - ---- - -## How to Fill These Guidelines - -For each guideline file: - -1. Document your project's **actual conventions** (not ideals) -2. Include **code examples** from your codebase -3. List **forbidden patterns** and why -4. Add **common mistakes** your team has made - -The goal is to help AI assistants and new team members understand how YOUR project works. - ---- - -**Language**: All documentation should be written in **English**. diff --git a/.trellis/spec/frontend/quality-guidelines.md b/.trellis/spec/frontend/quality-guidelines.md deleted file mode 100644 index 05a14112..00000000 --- a/.trellis/spec/frontend/quality-guidelines.md +++ /dev/null @@ -1,51 +0,0 @@ -# Quality Guidelines - -> Code quality standards for frontend development. - ---- - -## Overview - -<!-- -Document your project's quality standards here. - -Questions to answer: -- What patterns are forbidden? -- What linting rules do you enforce? -- What are your testing requirements? -- What code review standards apply? ---> - -(To be filled by the team) - ---- - -## Forbidden Patterns - -<!-- Patterns that should never be used and why --> - -(To be filled by the team) - ---- - -## Required Patterns - -<!-- Patterns that must always be used --> - -(To be filled by the team) - ---- - -## Testing Requirements - -<!-- What level of testing is expected --> - -(To be filled by the team) - ---- - -## Code Review Checklist - -<!-- What reviewers should check --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/state-management.md b/.trellis/spec/frontend/state-management.md deleted file mode 100644 index b4fc9662..00000000 --- a/.trellis/spec/frontend/state-management.md +++ /dev/null @@ -1,51 +0,0 @@ -# State Management - -> How state is managed in this project. - ---- - -## Overview - -<!-- -Document your project's state management conventions here. - -Questions to answer: -- What state management solution do you use? -- How is local vs global state decided? -- How do you handle server state? -- What are the patterns for derived state? ---> - -(To be filled by the team) - ---- - -## State Categories - -<!-- Local state, global state, server state, URL state --> - -(To be filled by the team) - ---- - -## When to Use Global State - -<!-- Criteria for promoting state to global --> - -(To be filled by the team) - ---- - -## Server State - -<!-- How server data is cached and synchronized --> - -(To be filled by the team) - ---- - -## Common Mistakes - -<!-- State management mistakes your team has made --> - -(To be filled by the team) diff --git a/.trellis/spec/frontend/type-safety.md b/.trellis/spec/frontend/type-safety.md deleted file mode 100644 index 1b1b19e0..00000000 --- a/.trellis/spec/frontend/type-safety.md +++ /dev/null @@ -1,51 +0,0 @@ -# Type Safety - -> Type safety patterns in this project. - ---- - -## Overview - -<!-- -Document your project's type safety conventions here. - -Questions to answer: -- What type system do you use? -- How are types organized? -- What validation library do you use? -- How do you handle type inference? ---> - -(To be filled by the team) - ---- - -## Type Organization - -<!-- Where types are defined, shared types vs local types --> - -(To be filled by the team) - ---- - -## Validation - -<!-- Runtime validation patterns (Zod, Yup, io-ts, etc.) --> - -(To be filled by the team) - ---- - -## Common Patterns - -<!-- Type utilities, generics, type guards --> - -(To be filled by the team) - ---- - -## Forbidden Patterns - -<!-- any, type assertions, etc. --> - -(To be filled by the team) diff --git a/.trellis/spec/guides/code-reuse-thinking-guide.md b/.trellis/spec/guides/code-reuse-thinking-guide.md deleted file mode 100644 index f9d5f99b..00000000 --- a/.trellis/spec/guides/code-reuse-thinking-guide.md +++ /dev/null @@ -1,105 +0,0 @@ -# Code Reuse Thinking Guide - -> **Purpose**: Stop and think before creating new code - does it already exist? - ---- - -## The Problem - -**Duplicated code is the #1 source of inconsistency bugs.** - -When you copy-paste or rewrite existing logic: -- Bug fixes don't propagate -- Behavior diverges over time -- Codebase becomes harder to understand - ---- - -## Before Writing New Code - -### Step 1: Search First - -```bash -# Search for similar function names -grep -r "functionName" . - -# Search for similar logic -grep -r "keyword" . -``` - -### Step 2: Ask These Questions - -| Question | If Yes... | -|----------|-----------| -| Does a similar function exist? | Use or extend it | -| Is this pattern used elsewhere? | Follow the existing pattern | -| Could this be a shared utility? | Create it in the right place | -| Am I copying code from another file? | **STOP** - extract to shared | - ---- - -## Common Duplication Patterns - -### Pattern 1: Copy-Paste Functions - -**Bad**: Copying a validation function to another file - -**Good**: Extract to shared utilities, import where needed - -### Pattern 2: Similar Components - -**Bad**: Creating a new component that's 80% similar to existing - -**Good**: Extend existing component with props/variants - -### Pattern 3: Repeated Constants - -**Bad**: Defining the same constant in multiple files - -**Good**: Single source of truth, import everywhere - ---- - -## When to Abstract - -**Abstract when**: -- Same code appears 3+ times -- Logic is complex enough to have bugs -- Multiple people might need this - -**Don't abstract when**: -- Only used once -- Trivial one-liner -- Abstraction would be more complex than duplication - ---- - -## After Batch Modifications - -When you've made similar changes to multiple files: - -1. **Review**: Did you catch all instances? -2. **Search**: Run grep to find any missed -3. **Consider**: Should this be abstracted? - ---- - -## Gotcha: Asymmetric Mechanisms Producing Same Output - -**Problem**: When two different mechanisms must produce the same file set (e.g., recursive directory copy for init vs. manual `files.set()` for update), structural changes (renaming, moving, adding subdirectories) only propagate through the automatic mechanism. The manual one silently drifts. - -**Symptom**: Init works perfectly, but update creates files at wrong paths or misses files entirely. - -**Prevention checklist**: -- [ ] When migrating directory structures, search for ALL code paths that reference the old structure -- [ ] If one path is auto-derived (glob/copy) and another is manually listed, the manual one needs updating -- [ ] Add a regression test that compares outputs from both mechanisms - ---- - -## Checklist Before Commit - -- [ ] Searched for existing similar code -- [ ] No copy-pasted logic that should be shared -- [ ] Constants defined in one place -- [ ] Similar patterns follow same structure diff --git a/.trellis/spec/guides/cross-layer-thinking-guide.md b/.trellis/spec/guides/cross-layer-thinking-guide.md deleted file mode 100644 index 2d1dee39..00000000 --- a/.trellis/spec/guides/cross-layer-thinking-guide.md +++ /dev/null @@ -1,94 +0,0 @@ -# Cross-Layer Thinking Guide - -> **Purpose**: Think through data flow across layers before implementing. - ---- - -## The Problem - -**Most bugs happen at layer boundaries**, not within layers. - -Common cross-layer bugs: -- API returns format A, frontend expects format B -- Database stores X, service transforms to Y, but loses data -- Multiple layers implement the same logic differently - ---- - -## Before Implementing Cross-Layer Features - -### Step 1: Map the Data Flow - -Draw out how data moves: - -``` -Source → Transform → Store → Retrieve → Transform → Display -``` - -For each arrow, ask: -- What format is the data in? -- What could go wrong? -- Who is responsible for validation? - -### Step 2: Identify Boundaries - -| Boundary | Common Issues | -|----------|---------------| -| API ↔ Service | Type mismatches, missing fields | -| Service ↔ Database | Format conversions, null handling | -| Backend ↔ Frontend | Serialization, date formats | -| Component ↔ Component | Props shape changes | - -### Step 3: Define Contracts - -For each boundary: -- What is the exact input format? -- What is the exact output format? -- What errors can occur? - ---- - -## Common Cross-Layer Mistakes - -### Mistake 1: Implicit Format Assumptions - -**Bad**: Assuming date format without checking - -**Good**: Explicit format conversion at boundaries - -### Mistake 2: Scattered Validation - -**Bad**: Validating the same thing in multiple layers - -**Good**: Validate once at the entry point - -### Mistake 3: Leaky Abstractions - -**Bad**: Component knows about database schema - -**Good**: Each layer only knows its neighbors - ---- - -## Checklist for Cross-Layer Features - -Before implementation: -- [ ] Mapped the complete data flow -- [ ] Identified all layer boundaries -- [ ] Defined format at each boundary -- [ ] Decided where validation happens - -After implementation: -- [ ] Tested with edge cases (null, empty, invalid) -- [ ] Verified error handling at each boundary -- [ ] Checked data survives round-trip - ---- - -## When to Create Flow Documentation - -Create detailed flow docs when: -- Feature spans 3+ layers -- Multiple teams are involved -- Data format is complex -- Feature has caused bugs before diff --git a/.trellis/spec/guides/index.md b/.trellis/spec/guides/index.md deleted file mode 100644 index 147c79bd..00000000 --- a/.trellis/spec/guides/index.md +++ /dev/null @@ -1,79 +0,0 @@ -# Thinking Guides - -> **Purpose**: Expand your thinking to catch things you might not have considered. - ---- - -## Why Thinking Guides? - -**Most bugs and tech debt come from "didn't think of that"**, not from lack of skill: - -- Didn't think about what happens at layer boundaries → cross-layer bugs -- Didn't think about code patterns repeating → duplicated code everywhere -- Didn't think about edge cases → runtime errors -- Didn't think about future maintainers → unreadable code - -These guides help you **ask the right questions before coding**. - ---- - -## Available Guides - -| Guide | Purpose | When to Use | -|-------|---------|-------------| -| [Code Reuse Thinking Guide](./code-reuse-thinking-guide.md) | Identify patterns and reduce duplication | When you notice repeated patterns | -| [Cross-Layer Thinking Guide](./cross-layer-thinking-guide.md) | Think through data flow across layers | Features spanning multiple layers | - ---- - -## Quick Reference: Thinking Triggers - -### When to Think About Cross-Layer Issues - -- [ ] Feature touches 3+ layers (API, Service, Component, Database) -- [ ] Data format changes between layers -- [ ] Multiple consumers need the same data -- [ ] You're not sure where to put some logic - -→ Read [Cross-Layer Thinking Guide](./cross-layer-thinking-guide.md) - -### When to Think About Code Reuse - -- [ ] You're writing similar code to something that exists -- [ ] You see the same pattern repeated 3+ times -- [ ] You're adding a new field to multiple places -- [ ] **You're modifying any constant or config** -- [ ] **You're creating a new utility/helper function** ← Search first! - -→ Read [Code Reuse Thinking Guide](./code-reuse-thinking-guide.md) - ---- - -## Pre-Modification Rule (CRITICAL) - -> **Before changing ANY value, ALWAYS search first!** - -```bash -# Search for the value you're about to change -grep -r "value_to_change" . -``` - -This single habit prevents most "forgot to update X" bugs. - ---- - -## How to Use This Directory - -1. **Before coding**: Skim the relevant thinking guide -2. **During coding**: If something feels repetitive or complex, check the guides -3. **After bugs**: Add new insights to the relevant guide (learn from mistakes) - ---- - -## Contributing - -Found a new "didn't think of that" moment? Add it to the relevant guide. - ---- - -**Core Principle**: 30 minutes of thinking saves 3 hours of debugging. diff --git a/.trellis/tasks/00-bootstrap-guidelines/prd.md b/.trellis/tasks/00-bootstrap-guidelines/prd.md deleted file mode 100644 index f1dec075..00000000 --- a/.trellis/tasks/00-bootstrap-guidelines/prd.md +++ /dev/null @@ -1,113 +0,0 @@ -# Bootstrap: Fill Project Development Guidelines - -## Purpose - -Welcome to Trellis! This is your first task. - -AI agents use `.trellis/spec/` to understand YOUR project's coding conventions. -**Starting from scratch = AI writes generic code that doesn't match your project style.** - -Filling these guidelines is a one-time setup that pays off for every future AI session. - ---- - -## Your Task - -Fill in the guideline files based on your **existing codebase**. - - -### Backend Guidelines - -| File | What to Document | -|------|------------------| -| `.trellis/spec/backend/directory-structure.md` | Where different file types go (routes, services, utils) | -| `.trellis/spec/backend/database-guidelines.md` | ORM, migrations, query patterns, naming conventions | -| `.trellis/spec/backend/error-handling.md` | How errors are caught, logged, and returned | -| `.trellis/spec/backend/logging-guidelines.md` | Log levels, format, what to log | -| `.trellis/spec/backend/quality-guidelines.md` | Code review standards, testing requirements | - - -### Frontend Guidelines - -| File | What to Document | -|------|------------------| -| `.trellis/spec/frontend/directory-structure.md` | Component/page/hook organization | -| `.trellis/spec/frontend/component-guidelines.md` | Component patterns, props conventions | -| `.trellis/spec/frontend/hook-guidelines.md` | Custom hook naming, patterns | -| `.trellis/spec/frontend/state-management.md` | State library, patterns, what goes where | -| `.trellis/spec/frontend/type-safety.md` | TypeScript conventions, type organization | -| `.trellis/spec/frontend/quality-guidelines.md` | Linting, testing, accessibility | - - -### Thinking Guides (Optional) - -The `.trellis/spec/guides/` directory contains thinking guides that are already -filled with general best practices. You can customize them for your project if needed. - ---- - -## How to Fill Guidelines - -### Step 0: Import from Existing Specs (Recommended) - -Many projects already have coding conventions documented. **Check these first** before writing from scratch: - -| File / Directory | Tool | -|------|------| -| `CLAUDE.md` / `CLAUDE.local.md` | Claude Code | -| `AGENTS.md` | Codex / Claude Code / agent-compatible tools | -| `.cursorrules` | Cursor | -| `.cursor/rules/*.mdc` | Cursor (rules directory) | -| `.windsurfrules` | Windsurf | -| `.clinerules` | Cline | -| `.roomodes` | Roo Code | -| `.github/copilot-instructions.md` | GitHub Copilot | -| `.vscode/settings.json` → `github.copilot.chat.codeGeneration.instructions` | VS Code Copilot | -| `CONVENTIONS.md` / `.aider.conf.yml` | aider | -| `CONTRIBUTING.md` | General project conventions | -| `.editorconfig` | Editor formatting rules | - -If any of these exist, read them first and extract the relevant coding conventions into the corresponding `.trellis/spec/` files. This saves significant effort compared to writing everything from scratch. - -### Step 1: Analyze the Codebase - -Ask AI to help discover patterns from actual code: - -- "Read all existing config files (CLAUDE.md, .cursorrules, etc.) and extract coding conventions into .trellis/spec/" -- "Analyze my codebase and document the patterns you see" -- "Find error handling / component / API patterns and document them" - -### Step 2: Document Reality, Not Ideals - -Write what your codebase **actually does**, not what you wish it did. -AI needs to match existing patterns, not introduce new ones. - -- **Look at existing code** - Find 2-3 examples of each pattern -- **Include file paths** - Reference real files as examples -- **List anti-patterns** - What does your team avoid? - ---- - -## Completion Checklist - -- [ ] Guidelines filled for your project type -- [ ] At least 2-3 real code examples in each guideline -- [ ] Anti-patterns documented - -When done: - -```bash -python3 ./.trellis/scripts/task.py finish -python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines -``` - ---- - -## Why This Matters - -After completing this task: - -1. AI will write code that matches your project style -2. Relevant `/trellis:before-*-dev` commands will inject real context -3. `/trellis:check-*` commands will validate against your actual standards -4. Future developers (human or AI) will onboard faster diff --git a/.trellis/tasks/00-bootstrap-guidelines/task.json b/.trellis/tasks/00-bootstrap-guidelines/task.json deleted file mode 100644 index dc140659..00000000 --- a/.trellis/tasks/00-bootstrap-guidelines/task.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "id": "00-bootstrap-guidelines", - "name": "Bootstrap Guidelines", - "description": "Fill in project development guidelines for AI agents", - "status": "in_progress", - "dev_type": "docs", - "priority": "P1", - "creator": "ShengLong", - "assignee": "ShengLong", - "createdAt": "2026-04-20", - "completedAt": null, - "commit": null, - "subtasks": [ - { - "name": "Fill backend guidelines", - "status": "pending" - }, - { - "name": "Fill frontend guidelines", - "status": "pending" - }, - { - "name": "Add code examples", - "status": "pending" - } - ], - "children": [], - "parent": null, - "relatedFiles": [ - ".trellis/spec/backend/", - ".trellis/spec/frontend/" - ], - "notes": "First-time setup task created by trellis init (fullstack project)", - "meta": {} -} \ No newline at end of file diff --git a/.trellis/workflow.md b/.trellis/workflow.md deleted file mode 100644 index 28239e81..00000000 --- a/.trellis/workflow.md +++ /dev/null @@ -1,416 +0,0 @@ -# Development Workflow - -> Based on [Effective Harnesses for Long-Running Agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) - ---- - -## Table of Contents - -1. [Quick Start (Do This First)](#quick-start-do-this-first) -2. [Workflow Overview](#workflow-overview) -3. [Session Start Process](#session-start-process) -4. [Development Process](#development-process) -5. [Session End](#session-end) -6. [File Descriptions](#file-descriptions) -7. [Best Practices](#best-practices) - ---- - -## Quick Start (Do This First) - -### Step 0: Initialize Developer Identity (First Time Only) - -> **Multi-developer support**: Each developer/Agent needs to initialize their identity first - -```bash -# Check if already initialized -python3 ./.trellis/scripts/get_developer.py - -# If not initialized, run: -python3 ./.trellis/scripts/init_developer.py <your-name> -# Example: python3 ./.trellis/scripts/init_developer.py cursor-agent -``` - -This creates: -- `.trellis/.developer` - Your identity file (gitignored, not committed) -- `.trellis/workspace/<your-name>/` - Your personal workspace directory - -**Naming suggestions**: -- Human developers: Use your name, e.g., `john-doe` -- Cursor AI: `cursor-agent` or `cursor-<task>` -- Claude Code: `claude-agent` or `claude-<task>` -- iFlow cli: `iflow-agent` or `iflow-<task>` - -### Step 1: Understand Current Context - -```bash -# Get full context in one command -python3 ./.trellis/scripts/get_context.py - -# Or check manually: -python3 ./.trellis/scripts/get_developer.py # Your identity -python3 ./.trellis/scripts/task.py list # Active tasks -git status && git log --oneline -10 # Git state -``` - -### Step 2: Read Project Guidelines [MANDATORY] - -**CRITICAL**: Read guidelines before writing any code: - -```bash -# Discover available packages and spec layers -python3 ./.trellis/scripts/get_context.py --mode packages - -# Read the spec index for each relevant module -cat .trellis/spec/<package>/<layer>/index.md - -# Always read shared guides -cat .trellis/spec/guides/index.md -``` - -**Why this matters?** -- Understand which spec layers apply to your task -- Know coding standards for the packages you'll modify -- Learn the overall code quality requirements - -### Step 3: Before Coding - Read Specific Guidelines (Required) - -Based on your task, read the **detailed** guideline files listed in each spec index's **Pre-Development Checklist**: - -```bash -# The index points to specific files — read those, not just the index -cat .trellis/spec/<package>/<layer>/error-handling.md -cat .trellis/spec/<package>/<layer>/conventions.md -# etc. — based on what the Pre-Development Checklist lists -``` - ---- - -## Workflow Overview - -### Core Principles - -1. **Read Before Write** - Understand context before starting -2. **Follow Standards** - [!] **MUST read `.trellis/spec/` guidelines before coding** -3. **Incremental Development** - Complete one task at a time -4. **Record Promptly** - Update tracking files immediately after completion -5. **Document Limits** - [!] **Max 2000 lines per journal document** - -### File System - -``` -.trellis/ -|-- .developer # Developer identity (gitignored) -|-- scripts/ -| |-- __init__.py # Python package init -| |-- common/ # Shared utilities (Python) -| | |-- __init__.py -| | |-- paths.py # Path utilities -| | |-- developer.py # Developer management -| | +-- git_context.py # Git context implementation -| |-- multi_agent/ # Multi-agent pipeline scripts -| | |-- __init__.py -| | |-- start.py # Start worktree agent -| | |-- status.py # Monitor agent status -| | |-- create_pr.py # Create PR -| | +-- cleanup.py # Cleanup worktree -| |-- init_developer.py # Initialize developer identity -| |-- get_developer.py # Get current developer name -| |-- task.py # Manage tasks -| |-- get_context.py # Get session context -| +-- add_session.py # One-click session recording -|-- workspace/ # Developer workspaces -| |-- index.md # Workspace index + Session template -| +-- {developer}/ # Per-developer directories -| |-- index.md # Personal index (with @@@auto markers) -| +-- journal-N.md # Journal files (sequential numbering) -|-- tasks/ # Task tracking -| +-- {MM}-{DD}-{name}/ -| +-- task.json -|-- spec/ # [!] MUST READ before coding -| |-- frontend/ # Frontend guidelines (if applicable) -| | |-- index.md # Start here - guidelines index -| | +-- *.md # Topic-specific docs -| |-- backend/ # Backend guidelines (if applicable) -| | |-- index.md # Start here - guidelines index -| | +-- *.md # Topic-specific docs -| +-- guides/ # Thinking guides -| |-- index.md # Guides index -| |-- cross-layer-thinking-guide.md # Pre-implementation checklist -| +-- *.md # Other guides -+-- workflow.md # This document -``` - ---- - -## Session Start Process - -### Step 1: Get Session Context - -Use the unified context script: - -```bash -# Get all context in one command -python3 ./.trellis/scripts/get_context.py - -# Or get JSON format -python3 ./.trellis/scripts/get_context.py --json -``` - -### Step 2: Read Development Guidelines [!] REQUIRED - -**[!] CRITICAL: MUST read guidelines before writing any code** - -Based on what you'll develop, read the corresponding guidelines: - -```bash -# Discover available packages and spec layers -python3 ./.trellis/scripts/get_context.py --mode packages - -# Read spec indexes for relevant modules -cat .trellis/spec/<package>/<layer>/index.md - -# For cross-layer features -cat .trellis/spec/guides/cross-layer-thinking-guide.md -``` - -### Step 3: Select Task to Develop - -Use the task management script: - -```bash -# List active tasks -python3 ./.trellis/scripts/task.py list - -# Create new task (creates directory with task.json) -python3 ./.trellis/scripts/task.py create "<title>" --slug <task-name> -``` - ---- - -## Development Process - -### Task Development Flow - -``` -1. Create or select task - --> python3 ./.trellis/scripts/task.py create "<title>" --slug <name> or list - -2. Start task (mark as current) - --> python3 ./.trellis/scripts/task.py start <name> - --> Writes .trellis/.current-task; future sessions see it in <current-state> - -3. Write code according to guidelines - --> Read .trellis/spec/ docs relevant to your task - --> For cross-layer: read .trellis/spec/guides/ - -4. Self-test - --> Run project's lint/test commands (see spec docs) - --> Manual feature testing - -5. Commit code - --> git add <files> - --> git commit -m "type(scope): description" - Format: feat/fix/docs/refactor/test/chore - -6. Record session (one command) - --> python3 ./.trellis/scripts/add_session.py --title "Title" --commit "hash" - -7. Finish task (clear current) - --> python3 ./.trellis/scripts/task.py finish - --> Only when the task is fully done; otherwise leave it set so the - next session resumes where you left off -``` - -### Code Quality Checklist - -**Must pass before commit**: -- [OK] Lint checks pass (project-specific command) -- [OK] Type checks pass (if applicable) -- [OK] Manual feature testing passes - -**Project-specific checks**: -- See `.trellis/spec/<package>/<layer>/quality-guidelines.md` for package-specific checks - ---- - -## Session End - -### One-Click Session Recording - -After code is committed, use: - -```bash -python3 ./.trellis/scripts/add_session.py \ - --title "Session Title" \ - --commit "abc1234" \ - --summary "Brief summary" -``` - -This automatically: -1. Detects current journal file -2. Creates new file if 2000-line limit exceeded -3. Appends session content -4. Updates index.md (sessions count, history table) - -### Pre-end Checklist - -Use `/trellis:finish-work` command to run through: -1. [OK] All code committed, commit message follows convention -2. [OK] Session recorded via `add_session.py` -3. [OK] No lint/test errors -4. [OK] Working directory clean (or WIP noted) -5. [OK] Spec docs updated if needed - ---- - -## File Descriptions - -### 1. workspace/ - Developer Workspaces - -**Purpose**: Record each AI Agent session's work content - -**Structure** (Multi-developer support): -``` -workspace/ -|-- index.md # Main index (Active Developers table) -+-- {developer}/ # Per-developer directory - |-- index.md # Personal index (with @@@auto markers) - +-- journal-N.md # Journal files (sequential: 1, 2, 3...) -``` - -**When to update**: -- [OK] End of each session -- [OK] Complete important task -- [OK] Fix important bug - -### 2. spec/ - Development Guidelines - -**Purpose**: Documented standards for consistent development - -**Structure** (Multi-doc format): -``` -spec/ -|-- frontend/ # Frontend docs (if applicable) -| |-- index.md # Start here -| +-- *.md # Topic-specific docs -|-- backend/ # Backend docs (if applicable) -| |-- index.md # Start here -| +-- *.md # Topic-specific docs -+-- guides/ # Thinking guides - |-- index.md # Start here - +-- *.md # Guide-specific docs -``` - -**When to update**: -- [OK] New pattern discovered -- [OK] Bug fixed that reveals missing guidance -- [OK] New convention established - -### 3. Tasks - Task Tracking - -Each task is a directory containing `task.json`: - -``` -tasks/ -|-- 01-21-my-task/ -| +-- task.json -+-- archive/ - +-- 2026-01/ - +-- 01-15-old-task/ - +-- task.json -``` - -**Commands**: -```bash -python3 ./.trellis/scripts/task.py create "<title>" [--slug <name>] # Create task directory -python3 ./.trellis/scripts/task.py start <name> # Set as current task (writes .current-task, triggers after_start hooks) -python3 ./.trellis/scripts/task.py finish # Clear current task (triggers after_finish hooks) -python3 ./.trellis/scripts/task.py archive <name> # Archive to archive/{year-month}/ -python3 ./.trellis/scripts/task.py list # List active tasks -python3 ./.trellis/scripts/task.py list-archive # List archived tasks -``` - -**Current task mechanism**: `task.py start <name>` writes the selected task path to `.trellis/.current-task`. The SessionStart hook reads this file to inject `## CURRENT TASK` into every new session's context, so the AI immediately knows what you're working on without being told. Run `task.py finish` when you're done — subsequent sessions will show `(none)` until you start another task. - ---- - -## Best Practices - -### [OK] DO - Should Do - -1. **Before session start**: - - Run `python3 ./.trellis/scripts/get_context.py` for full context - - [!] **MUST read** relevant `.trellis/spec/` docs - -2. **During development**: - - [!] **Follow** `.trellis/spec/` guidelines - - For cross-layer features, use `/trellis:check-cross-layer` - - Develop only one task at a time - - Run lint and tests frequently - -3. **After development complete**: - - Use `/trellis:finish-work` for completion checklist - - After fix bug, use `/trellis:break-loop` for deep analysis - - Human commits after testing passes - - Use `add_session.py` to record progress - -### [X] DON'T - Should Not Do - -1. [!] **Don't** skip reading `.trellis/spec/` guidelines -2. [!] **Don't** let journal single file exceed 2000 lines -3. **Don't** develop multiple unrelated tasks simultaneously -4. **Don't** commit code with lint/test errors -5. **Don't** forget to update spec docs after learning something -6. [!] **Don't** execute `git commit` - AI should not commit code - ---- - -## Quick Reference - -### Must-read Before Development - -| Task Type | Must-read Document | -|-----------|-------------------| -| Frontend work | `frontend/index.md` → relevant docs | -| Backend work | `backend/index.md` → relevant docs | -| Cross-Layer Feature | `guides/cross-layer-thinking-guide.md` | - -### Commit Convention - -```bash -git commit -m "type(scope): description" -``` - -**Type**: feat, fix, docs, refactor, test, chore -**Scope**: Module name (e.g., auth, api, ui) - -### Common Commands - -```bash -# Session management -python3 ./.trellis/scripts/get_context.py # Get full context -python3 ./.trellis/scripts/add_session.py # Record session - -# Task management -python3 ./.trellis/scripts/task.py list # List tasks -python3 ./.trellis/scripts/task.py create "<title>" # Create task - -# Slash commands -/trellis:finish-work # Pre-commit checklist -/trellis:break-loop # Post-debug analysis -/trellis:check-cross-layer # Cross-layer verification -``` - ---- - -## Summary - -Following this workflow ensures: -- [OK] Continuity across multiple sessions -- [OK] Consistent code quality -- [OK] Trackable progress -- [OK] Knowledge accumulation in spec docs -- [OK] Transparent team collaboration - -**Core Philosophy**: Read before write, follow standards, record promptly, capture learnings diff --git a/.trellis/workspace/ShengLong/index.md b/.trellis/workspace/ShengLong/index.md deleted file mode 100644 index a000a2b9..00000000 --- a/.trellis/workspace/ShengLong/index.md +++ /dev/null @@ -1,40 +0,0 @@ -# Workspace Index - ShengLong - -> Journal tracking for AI development sessions. - ---- - -## Current Status - -<!-- @@@auto:current-status --> -- **Active File**: `journal-1.md` -- **Total Sessions**: 0 -- **Last Active**: - -<!-- @@@/auto:current-status --> - ---- - -## Active Documents - -<!-- @@@auto:active-documents --> -| File | Lines | Status | -|------|-------|--------| -| `journal-1.md` | ~0 | Active | -<!-- @@@/auto:active-documents --> - ---- - -## Session History - -<!-- @@@auto:session-history --> -| # | Date | Title | Commits | Branch | -|---|------|-------|---------|--------| -<!-- @@@/auto:session-history --> - ---- - -## Notes - -- Sessions are appended to journal files -- New journal file created when current exceeds 2000 lines -- Use `add_session.py` to record sessions diff --git a/.trellis/workspace/ShengLong/journal-1.md b/.trellis/workspace/ShengLong/journal-1.md deleted file mode 100644 index 1d75ec8e..00000000 --- a/.trellis/workspace/ShengLong/journal-1.md +++ /dev/null @@ -1,7 +0,0 @@ -# Journal - ShengLong (Part 1) - -> AI development session journal -> Started: 2026-04-20 - ---- - diff --git a/.trellis/workspace/index.md b/.trellis/workspace/index.md deleted file mode 100644 index f132a77e..00000000 --- a/.trellis/workspace/index.md +++ /dev/null @@ -1,125 +0,0 @@ -# Workspace Index - -> Records of all AI Agent work records across all developers - ---- - -## Overview - -This directory tracks records for all developers working with AI Agents on this project. - -### File Structure - -``` -workspace/ -|-- index.md # This file - main index -+-- {developer}/ # Per-developer directory - |-- index.md # Personal index with session history - |-- tasks/ # Task files - | |-- *.json # Active tasks - | +-- archive/ # Archived tasks by month - +-- journal-N.md # Journal files (sequential: 1, 2, 3...) -``` - ---- - -## Active Developers - -| Developer | Last Active | Sessions | Active File | -|-----------|-------------|----------|-------------| -| (none yet) | - | - | - | - ---- - -## Getting Started - -### For New Developers - -Run the initialization script: - -```bash -python3 ./.trellis/scripts/init_developer.py <your-name> -``` - -This will: -1. Create your identity file (gitignored) -2. Create your progress directory -3. Create your personal index -4. Create initial journal file - -### For Returning Developers - -1. Get your developer name: - ```bash - python3 ./.trellis/scripts/get_developer.py - ``` - -2. Read your personal index: - ```bash - cat .trellis/workspace/$(python3 ./.trellis/scripts/get_developer.py)/index.md - ``` - ---- - -## Guidelines - -### Journal File Rules - -- **Max 2000 lines** per journal file -- When limit is reached, create `journal-{N+1}.md` -- Update your personal `index.md` when creating new files - -### Session Record Format - -Each session should include: -- Summary: One-line description -- Branch: Which branch the work was done on -- Main Changes: What was modified -- Git Commits: Commit hashes and messages -- Next Steps: What to do next - ---- - -## Session Template - -Use this template when recording sessions: - -```markdown -## Session {N}: {Title} - -**Date**: YYYY-MM-DD -**Task**: {task-name} -**Branch**: `{branch-name}` - -### Summary - -{One-line summary} - -### Main Changes - -- {Change 1} -- {Change 2} - -### Git Commits - -| Hash | Message | -|------|---------| -| `abc1234` | {commit message} | - -### Testing - -- [OK] {Test result} - -### Status - -[OK] **Completed** / # **In Progress** / [P] **Blocked** - -### Next Steps - -- {Next step 1} -- {Next step 2} -``` - ---- - -**Language**: All documentation must be written in **English**. diff --git a/.trellis/worktree.yaml b/.trellis/worktree.yaml deleted file mode 100644 index 26485608..00000000 --- a/.trellis/worktree.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# Worktree Configuration for Multi-Agent Pipeline -# Used for worktree initialization in multi-agent workflows -# -# All paths are relative to project root - -#------------------------------------------------------------------------------- -# Paths -#------------------------------------------------------------------------------- - -# Worktree storage directory (relative to project root) -worktree_dir: ../trellis-worktrees - -#------------------------------------------------------------------------------- -# Files to Copy -#------------------------------------------------------------------------------- - -# Files to copy to each worktree (each worktree needs independent copy) -# These files contain sensitive info or need worktree-independent config -copy: - # Environment variables (uncomment and customize as needed) - # - .env - # - .env.local - # Workflow config - - .trellis/.developer - -#------------------------------------------------------------------------------- -# Post-Create Hooks -#------------------------------------------------------------------------------- - -# Commands to run after creating worktree -# Executed in worktree directory, in order, abort on failure -post_create: - # Install dependencies (uncomment based on your package manager) - # - npm install - # - pnpm install --frozen-lockfile - # - yarn install --frozen-lockfile - -#------------------------------------------------------------------------------- -# Check Agent Verification (Ralph Loop) -#------------------------------------------------------------------------------- - -# Commands to verify code quality before allowing check agent to finish -# If configured, Ralph Loop will run these commands - all must pass to allow completion -# If not configured or empty, trusts agent's completion markers -verify: - # - pnpm lint - # - pnpm typecheck diff --git a/admin/src/api/patient.ts b/admin/src/api/patient.ts new file mode 100644 index 00000000..d26e8929 --- /dev/null +++ b/admin/src/api/patient.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 接诊台 - 待接诊队列(复用挂号列表接口) +// 建议调用方式:receptionQueue({ status: 1, start_date: today, end_date: today, page_size: 50 }) +export function receptionQueue(params: any) { + return request.get({ url: '/doctor.appointment/lists', params }) +} + +// 接诊台 - 聚合详情:挂号信息 + 诊单病例 + 血糖血压记录 +export function receptionDetail(params: { id: number }) { + return request.get({ url: '/doctor.appointment/reception', params }) +} + +// 接诊台 - 通知接诊医助(发企业微信) +export function notifyAssistant(params: { id: number }) { + return request.post({ url: '/doctor.appointment/notifyAssistant', params }) +} + +// 医生备注 - 添加/追加(同一天追加 content + tongue_images) +export function addDoctorNote(params: { diagnosis_id: number; content?: string; tongue_images?: string[] }) { + return request.post({ url: '/doctor.appointment/addDoctorNote', params }) +} + +// 医生备注 - 按诊单查询列表 +export function getDoctorNotes(params: { diagnosis_id: number }) { + return request.get({ url: '/doctor.appointment/doctorNotes', params }) +} diff --git a/admin/src/components/chat-dialog/index.vue b/admin/src/components/chat-dialog/index.vue index c94a18d5..0a5ac20e 100644 --- a/admin/src/components/chat-dialog/index.vue +++ b/admin/src/components/chat-dialog/index.vue @@ -129,6 +129,7 @@ import { ref, nextTick, watch, computed, onMounted, onUnmounted } from 'vue' import { Loading, Close, Rank, Camera, Fold, Expand } from '@element-plus/icons-vue' import { uploadImageBlob, uploadVideoBlob } from '@/api/file' +import { addDoctorNote } from '@/api/patient' import { attachLocalCallRecording, bindCallRoom, @@ -1327,6 +1328,9 @@ const handleCallKitScreenshot = async () => { } }) ) + try { + await addDoctorNote({ diagnosis_id: diagnosisId.value, tongue_images: [path] }) + } catch { /* 写入备注表失败不阻塞主流程 */ } } catch (e: unknown) { const err = e as Error console.error(err) diff --git a/admin/src/views/patient/reception/components/NoteTimeline.vue b/admin/src/views/patient/reception/components/NoteTimeline.vue new file mode 100644 index 00000000..df6a8935 --- /dev/null +++ b/admin/src/views/patient/reception/components/NoteTimeline.vue @@ -0,0 +1,116 @@ +<template> + <div v-if="notes.length" class="note-timeline"> + <div v-for="note in notes" :key="note.id" class="timeline-node"> + <div class="timeline-dot"></div> + <div class="timeline-date">{{ note.note_date }}</div> + <div class="timeline-body"> + <div v-if="note.content" class="timeline-content"> + <div v-for="(line, idx) in splitLines(note.content)" :key="idx" class="content-line"> + {{ line }} + </div> + </div> + <div v-if="note.tongue_images?.length" class="timeline-images"> + <el-image + v-for="(url, idx) in note.tongue_images" + :key="idx" + :src="url" + :preview-src-list="note.tongue_images" + :initial-index="idx" + fit="cover" + class="timeline-thumb" + preview-teleported + /> + </div> + </div> + </div> + </div> +</template> + +<script setup lang="ts"> +export interface DoctorNoteItem { + id: number + note_date: string + content: string | null + tongue_images: string[] +} + +defineProps<{ notes: DoctorNoteItem[] }>() + +const splitLines = (content: string | null): string[] => { + if (!content) return [] + return content.split('\n').filter(Boolean) +} +</script> + +<style scoped lang="scss"> +.note-timeline { + position: relative; + padding-left: 22px; +} +.note-timeline::before { + content: ''; + position: absolute; + left: 6px; + top: 4px; + bottom: 4px; + width: 2px; + background: #ebeef5; + border-radius: 1px; +} +.timeline-node { + position: relative; + padding-bottom: 16px; +} +.timeline-node:last-child { + padding-bottom: 0; +} +.timeline-dot { + position: absolute; + left: -19px; + top: 5px; + width: 10px; + height: 10px; + border-radius: 50%; + background: #409eff; + border: 2px solid #ecf5ff; +} +.timeline-date { + font-size: 13px; + font-weight: 600; + color: #303133; + margin-bottom: 6px; + font-family: 'IBM Plex Mono', Consolas, monospace; +} +.timeline-body { + display: flex; + flex-direction: column; + gap: 6px; +} +.timeline-content { + display: flex; + flex-direction: column; + gap: 2px; +} +.content-line { + font-size: 12.5px; + color: #606266; + line-height: 1.6; + word-break: break-word; +} +.timeline-images { + display: flex; + flex-wrap: wrap; + gap: 6px; +} +.timeline-thumb { + width: 64px; + height: 64px; + border-radius: 6px; + border: 1px solid #ebeef5; + cursor: pointer; + transition: transform 0.15s ease; +} +.timeline-thumb:hover { + transform: scale(1.05); +} +</style> diff --git a/admin/src/views/patient/reception/index.vue b/admin/src/views/patient/reception/index.vue new file mode 100644 index 00000000..0d4c7f9b --- /dev/null +++ b/admin/src/views/patient/reception/index.vue @@ -0,0 +1,1250 @@ +<template> + <div class="reception-page"> + <!-- 页头 --> + <div class="reception-header"> + <div class="header-left"> + <h1 class="header-title">接诊台</h1> + <!-- <div class="header-desc">显示今日待接诊与已过号患者,左侧选人,右侧处理。</div> --> + <div class="header-meta">{{ todayMeta }}</div> + </div> + <div class="header-right"> + <div class="live-pill"> + <span class="live-dot" :class="{ paused: pollPaused }"></span> + <span>{{ pollPaused ? '已暂停' : `${countdown}s 后刷新` }}</span> + </div> + </div> + </div> + + <!-- 筛选条 --> + <div class="filter-shell"> + <el-input + v-model="searchName" + placeholder="请输入患者姓名" + clearable + size="default" + class="search-input" + @keyup.enter="handleSearch" + @clear="handleSearch" + > + <template #prefix> + <el-icon><Search /></el-icon> + </template> + </el-input> + <div class="filter-tabs"> + <span + class="filter-tab" + :class="{ active: activeStatus === 1 }" + @click="switchStatus(1)" + >待接诊 {{ waitingTotal }} 人</span> + <span class="filter-sep">·</span> + <span + class="filter-tab" + :class="{ active: activeStatus === 4 }" + @click="switchStatus(4)" + >已过号 {{ passedTotal }} 人</span> + </div> + </div> + + <!-- 主体 --> + <div class="main-area"> + <!-- 左侧:待接诊队列 --> + <aside class="queue-col"> + <div class="queue-panel"> + <div class="queue-head"> + <span class="queue-title">{{ activeStatus === 1 ? '待接诊' : '已过号' }}</span> + <span class="queue-meta">{{ total }} 人</span> + </div> + <div ref="queueScrollRef" v-loading="queueLoading && queue.length === 0" class="queue-list"> + <div + v-for="row in queue" + :key="row.id" + class="queue-row" + :class="{ active: selectedId === row.id, passed: row.status === 4 }" + @click="selectRow(row)" + > + <div class="row-name"> + <div class="name-line"> + {{ row.patient_name || '未命名' }} + <span class="name-meta">{{ formatGenderAge(row) }}</span> + <el-tag v-if="row.status === 4" size="small" type="warning" class="ml-1">已过号</el-tag> + </div> + <div class="time-line"> + {{ row.appointment_time || '—' }} · 医助 {{ row.assistant_name || '—' }} + </div> + </div> + <div class="row-actions" @click.stop> + <el-tooltip content="通知医助(企业微信)" placement="top"> + <button + class="row-icon-btn notify" + :disabled="notifyingId === row.id" + @click="handleNotify(row)" + > + <el-icon v-if="notifyingId === row.id" class="is-loading"><Loading /></el-icon> + <el-icon v-else><ChatDotRound /></el-icon> + </button> + </el-tooltip> + <el-tooltip content="发起通话" placement="top"> + <button class="row-icon-btn call" @click="handleCall(row)"> + <el-icon><Phone /></el-icon> + </button> + </el-tooltip> + </div> + </div> + + <div v-if="queue.length > 0" ref="sentinelRef" class="scroll-sentinel"> + <span v-if="loadingMore">加载中…</span> + <span v-else-if="!hasMore" class="no-more">— 已全部加载 —</span> + </div> + + <el-empty v-if="!queueLoading && queue.length === 0" description="暂无待接诊患者" :image-size="64" /> + </div> + </div> + </aside> + + <!-- 右侧:患者信息 + 病例 + 血糖血压 --> + <section class="sidebar" v-loading="detailLoading && !detail"> + <template v-if="!selectedId"> + <div class="placeholder-card"> + <el-empty description="请从左侧选择一位待接诊患者" /> + </div> + </template> + + <template v-else-if="detail"> + <!-- 患者信息 --> + <div class="card patient-card"> + <div class="card-title">患者信息</div> + <div class="patient-hero"> + <div class="patient-name">{{ apt.patient_name || '—' }}</div> + <div class="patient-meta"> + <div>{{ maskPhone(apt.patient_phone) }} · {{ formatGender(diag.gender) }} · {{ diag.age != null ? diag.age + '岁' : '—' }}</div> + <div>{{ diag.height ? diag.height + 'cm' : '—' }} / {{ diag.weight ? diag.weight + 'kg' : '—' }} · {{ diag.region || '—' }}</div> + <div>预约:{{ apt.appointment_date }} {{ apt.appointment_time }} · {{ formatPeriod(apt.period) }}</div> + <div>医生:{{ apt.doctor_name || '—' }} 医助:{{ apt.assistant_name || '—' }}</div> + <div>状态:{{ apt.status_desc || '—' }} · {{ apt.has_prescription ? '已开方' : '未开方' }}</div> + <div v-if="apt.remark">备注:{{ apt.remark }}</div> + </div> + </div> + </div> + + <!-- 患者病例(完整、字段与 tcm/diagnosis/edit.vue 保持同步,只读展示) --> + <div class="card case-card"> + <div class="card-title"> + 患者病例 + <span class="case-sub">{{ caseTypeLabel }} · 诊断日期 {{ diag.diagnosis_date || apt.appointment_date || '—' }}</span> + </div> + + <!-- 基本信息 --> + <div class="grid-block"> + <div class="grid-title">基本信息</div> + <div class="kv-grid four"> + <KVItem label="诊单ID" :value="diag.patient_id" /> + <KVItem label="姓名" :value="diag.patient_name" /> + <KVItem label="身份证号" :value="diag.id_card" /> + <KVItem label="手机号" :value="maskPhone(diag.phone || apt.patient_phone)" /> + <KVItem label="性别" :value="textOf('gender')" /> + <KVItem label="年龄" :value="diag.age != null ? diag.age + '岁' : ''" /> + <KVItem label="婚姻状态" :value="textOf('marital_status')" /> + <KVItem label="地区" :value="diag.region" /> + </div> + </div> + + <!-- 生命体征 --> + <div class="grid-block"> + <div class="grid-title">生命体征</div> + <div class="kv-grid four"> + <KVItem label="身高" :value="diag.height ? diag.height + ' cm' : ''" /> + <KVItem label="体重" :value="diag.weight ? diag.weight + ' kg' : ''" /> + <KVItem label="高压" :value="diag.systolic_pressure ? diag.systolic_pressure + ' mmHg' : ''" /> + <KVItem label="低压" :value="diag.diastolic_pressure ? diag.diastolic_pressure + ' mmHg' : ''" /> + <KVItem label="空腹血糖" :value="diag.fasting_blood_sugar ? diag.fasting_blood_sugar + ' mmol/L' : ''" span="2" /> + <KVItem label="诊断类型" :value="textOf('diagnosis_type')" /> + <KVItem label="证型" :value="textOf('syndrome_type')" /> + <KVItem label="糖尿病期数" :value="textOf('diabetes_type')" /> + <KVItem label="在用药物" :value="diag.current_medications" span="3" multiline /> + </div> + </div> + + <!-- 主诉 --> + <div class="grid-block"> + <div class="grid-title">主诉</div> + <div class="kv-grid four"> + <KVItem label="当地医院诊断日期" :value="diag.diagnosis_date" /> + <KVItem label="发现糖尿病病史" :value="formatDiabetesDiscoveryDisplay ? formatDiabetesDiscoveryDisplay(diag.diabetes_discovery_year) : diag.diabetes_discovery_year" span="2" /> + <KVItem label="当地就诊医院" :value="diag.local_hospital_name" /> + <KVItem label="当地医院诊断结果" :value="joinArray(diag.local_hospital_diagnosis)" span="4" /> + </div> + </div> + + <!-- 现病史(后端已翻译 *_text) --> + <div class="grid-block"> + <div class="grid-title">现病史</div> + <div class="kv-grid three"> + <KVItem label="口腔感觉" :value="textOf('appetite')" /> + <KVItem label="每日饮水量" :value="textOf('water_intake')" /> + <KVItem label="近月体重变化" :value="textOf('weight_change')" /> + <KVItem label="脂肪肝程度" :value="textOf('fatty_liver_degree')" /> + <KVItem label="饮食情况" :value="textOf('diet_condition')" span="2" /> + <KVItem label="肢体感觉" :value="textOf('body_feeling')" /> + <KVItem label="睡眠情况" :value="textOf('sleep_condition')" /> + <KVItem label="眼睛情况" :value="textOf('eye_condition')" /> + <KVItem label="头部感觉" :value="textOf('head_feeling')" /> + <KVItem label="出汗情况" :value="textOf('sweat_condition')" /> + <KVItem label="皮肤情况" :value="textOf('skin_condition')" /> + <KVItem label="小便情况" :value="textOf('urine_condition')" /> + <KVItem label="大便情况" :value="textOf('stool_condition')" /> + <KVItem label="腰肾情况" :value="textOf('kidney_condition')" /> + <KVItem label="其他补充" :value="diag.symptoms" span="3" multiline /> + </div> + </div> + + <!-- 既往史 --> + <div class="grid-block"> + <div class="grid-title">既往史</div> + <div class="kv-grid three"> + <KVItem label="既往病史" :value="textOf('past_history')" span="3" /> + </div> + </div> + + <!-- 其他病史 --> + <div class="grid-block"> + <div class="grid-title">其他病史</div> + <div class="kv-grid three"> + <KVItem label="外伤史" :value="textOf('trauma_history')" /> + <KVItem label="手术史" :value="textOf('surgery_history')" /> + <KVItem label="过敏史" :value="textOf('allergy_history')" /> + <KVItem label="家族病史" :value="textOf('family_history')" /> + <KVItem label="妊娠哺乳史" :value="textOf('pregnancy_history')" /> + </div> + </div> + + <!-- 中医四诊与辨证 --> + <div class="grid-block"> + <div class="grid-title">中医四诊与辨证</div> + <div class="kv-grid two"> + <KVItem label="舌苔" :value="diag.tongue_coating" /> + <KVItem label="脉象" :value="diag.pulse" /> + <KVItem label="治则" :value="diag.treatment_principle" span="2" /> + </div> + </div> + + <!-- 病史补充 --> + <div class="grid-block" v-if="diag.remark"> + <div class="grid-title">病史补充</div> + <div class="kv-grid one"> + <KVItem label="" :value="diag.remark" multiline /> + </div> + </div> + + <!-- 处方意见 --> + <div class="grid-block"> + <div class="grid-title">处方意见</div> + <div class="rx-note"> + {{ apt.has_prescription ? '已开方。' : '当前未开方。' }} + </div> + </div> + </div> + + <!-- 医生备注 & 舌苔照片 --> + <div class="card note-card"> + <div class="card-title">医生备注 & 舌苔照片</div> + <NoteTimeline v-if="doctorNotes.length" :notes="doctorNotes" /> + <el-empty v-else description="暂无备注" :image-size="48" /> + </div> + + <!-- 血糖血压记录 --> + <div class="card metric-card"> + <div class="card-title">血糖血压记录</div> + <div class="metric-viewport"> + <el-table + :data="bloodRecords" + size="small" + stripe + empty-text="暂无血糖血压记录" + class="metric-table" + max-height="360" + > + <el-table-column prop="record_date" label="记录日期" width="110" /> + <el-table-column prop="record_time" label="记录时间" width="100"> + <template #default="{ row }">{{ row.record_time || '—' }}</template> + </el-table-column> + <el-table-column label="空腹血糖(mmol/L)" width="150"> + <template #default="{ row }">{{ row.fasting_blood_sugar ?? '—' }}</template> + </el-table-column> + <el-table-column label="餐后2小时血糖(mmol/L)" width="180"> + <template #default="{ row }">{{ row.postprandial_blood_sugar ?? '—' }}</template> + </el-table-column> + <el-table-column label="其他血糖(mmol/L)" width="150"> + <template #default="{ row }">{{ row.other_blood_sugar ?? '—' }}</template> + </el-table-column> + <el-table-column label="血压(mmHg)" width="130"> + <template #default="{ row }">{{ formatBp(row) }}</template> + </el-table-column> + <el-table-column label="西药" width="120"> + <template #default="{ row }">{{ row.western_medicine || '—' }}</template> + </el-table-column> + <el-table-column label="胰岛素" width="120"> + <template #default="{ row }">{{ row.insulin || '—' }}</template> + </el-table-column> + <el-table-column label="备注" min-width="160"> + <template #default="{ row }">{{ row.remark || '—' }}</template> + </el-table-column> + </el-table> + </div> + </div> + </template> + </section> + </div> + + <!-- 悬浮操作栏 --> + <transition name="fade"> + <div v-if="selectedId && detail" class="float-bar"> + <el-button + v-perms="['doctor.appointment/addDoctorNote']" + size="large" + @click="showNoteDialog = true" + > + 备注 + </el-button> + <el-button size="large" @click="handleEditDiagnosis"> + 编辑病历 + </el-button> + <el-button + v-if="apt.status === 1 || apt.status === 4" + v-perms="['doctor.appointment/complete']" + type="primary" + size="large" + :loading="finishLoading" + @click="handleFinish" + > + 完成接诊 + </el-button> + </div> + </transition> + + <!-- 备注弹窗 --> + <el-dialog v-model="showNoteDialog" title="添加备注" width="480px" append-to-body> + <el-input v-model="noteContent" type="textarea" :rows="4" placeholder="输入今日备注..." maxlength="500" show-word-limit /> + <template #footer> + <el-button @click="showNoteDialog = false">取消</el-button> + <el-button type="primary" :loading="noteSaving" @click="handleSaveNote">保存</el-button> + </template> + </el-dialog> + + <!-- 复用:通话弹窗 + 诊单编辑 --> + <component :is="ChatDialog" ref="chatDialogRef" /> + <component :is="DiagnosisEdit" ref="diagnosisEditRef" @success="onDiagnosisEditSuccess" /> + </div> +</template> + +<script setup lang="ts"> +import { defineAsyncComponent, onMounted, onUnmounted, h } from 'vue' +import { receptionQueue, receptionDetail, notifyAssistant, addDoctorNote } from '@/api/patient' +import NoteTimeline from './components/NoteTimeline.vue' +import { completeAppointment } from '@/api/doctor' +import { getCallSignature } from '@/api/tcm' +import feedback from '@/utils/feedback' +import { formatDiabetesDiscoveryDisplay } from '@/utils/diabetes-discovery-display' +import { + Phone, + Search, + ChatDotRound, + Loading +} from '@element-plus/icons-vue' + +const ChatDialog = defineAsyncComponent(() => import('@/components/chat-dialog/index.vue')) +const DiagnosisEdit = defineAsyncComponent(() => import('@/views/tcm/diagnosis/edit.vue')) + +/** + * 局部渲染组件:左侧 label + 右侧 value,支持 span / 换行 + */ +const KVItem = (props: { label: string; value: any; span?: string | number; multiline?: boolean }) => { + const val = props.value + const empty = val === undefined || val === null || val === '' || (Array.isArray(val) && val.length === 0) + return h( + 'div', + { + class: ['kv-item', props.multiline ? 'multiline' : '', empty ? 'empty' : ''], + style: props.span ? `grid-column: span ${props.span}` : '' + }, + [ + h('span', { class: 'kv-label' }, props.label), + h('span', { class: 'kv-value' }, empty ? '—' : String(val)) + ] + ) +} + +const POLL_MS = 5_000 +const PAGE_SIZE = 15 + +interface QueueRow { + id: number + patient_id: number + patient_name: string + patient_phone?: string + diagnosis_id?: number + doctor_id?: number + doctor_name?: string + assistant_id?: number + assistant_name?: string + appointment_date?: string + appointment_time?: string + gender?: number + age?: number | null + status?: number + status_desc?: string + has_prescription?: number + remark?: string +} + +const activeStatus = ref<1 | 4>(1) +const queue = ref<QueueRow[]>([]) +const total = ref(0) +const waitingTotal = ref(0) +const passedTotal = ref(0) +const page = ref(1) +const hasMore = ref(true) +const loadingMore = ref(false) +const queueLoading = ref(false) +const detailLoading = ref(false) +const selectedId = ref<number | null>(null) +const detail = ref<any>(null) +const finishLoading = ref(false) +const searchName = ref('') +const pollPaused = ref(false) +const countdown = ref(POLL_MS / 1000) +const notifyingId = ref<number | null>(null) +let pollTimer: ReturnType<typeof setInterval> | null = null +let countdownTimer: ReturnType<typeof setInterval> | null = null +/** 轮询请求未返回时的防重入标志,避免 5s 间隔下网络波动造成请求堆积 */ +let queueInflight = false +let detailInflight = false +let scrollObserver: IntersectionObserver | null = null + +const queueScrollRef = ref<HTMLElement | null>(null) +const sentinelRef = ref<HTMLElement | null>(null) +const chatDialogRef = ref() +const diagnosisEditRef = ref() +const showNoteDialog = ref(false) +const noteContent = ref('') +const noteSaving = ref(false) + +const apt = computed<any>(() => detail.value?.appointment || {}) +const diag = computed<any>(() => detail.value?.diagnosis || {}) +const bloodRecords = computed<any[]>(() => detail.value?.blood_records || []) +const doctorNotes = computed<any[]>(() => detail.value?.doctor_notes || []) + +const todayMeta = computed(() => { + const d = new Date() + const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][d.getDay()] + const pad = (n: number) => String(n).padStart(2, '0') + return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${week}` +}) + + +const caseTypeLabel = computed(() => { + if (!diag.value) return '初诊' + return diag.value.consultation_type === 'follow_up' ? '复诊' : '初诊' +}) + +/** + * 诊单字典字段由后端 AppointmentLogic::enrichDiagnosisLabels 预翻译, + * 前端直接读 `<field>_text`;找不到时回退原值。 + */ +const textOf = (field: string): string => { + const d: any = diag.value || {} + const t = d[field + '_text'] + if (t !== undefined && t !== null && t !== '') return String(t) + const raw = d[field] + if (raw === undefined || raw === null || raw === '') return '' + return Array.isArray(raw) ? raw.join('、') : String(raw) +} + +const todayStr = () => { + const d = new Date() + const pad = (n: number) => String(n).padStart(2, '0') + return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` +} + +const maskPhone = (phone?: string) => { + if (!phone) return '—' + if (phone.length < 11) return phone + return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2') +} + +const formatGender = (g?: number) => (g === 1 ? '男' : g === 0 ? '女' : '—') + +const formatGenderAge = (row: QueueRow) => { + const parts = [formatGender(row.gender), row.age != null ? row.age + '岁' : ''] + return parts.filter((p) => p && p !== '—').join(' ') +} + +const formatPeriod = (period?: string) => { + if (period === 'morning') return '上午' + if (period === 'afternoon') return '下午' + return '全天' +} + +const formatBp = (row: any) => { + const sys = row?.systolic_pressure + const dia = row?.diastolic_pressure + if (sys == null && dia == null) return '—' + return `${sys ?? '—'} / ${dia ?? '—'}` +} + +const joinArray = (arr: any): string => { + if (!arr) return '' + if (Array.isArray(arr)) return arr.filter(Boolean).join('、') + return String(arr) +} + +const fetchQueuePage = async (pageNo: number, status?: number) => { + const today = todayStr() + const res: any = await receptionQueue({ + status: status ?? activeStatus.value, + start_date: today, + end_date: today, + patient_name: searchName.value || undefined, + page_no: pageNo, + page_size: PAGE_SIZE + }) + const list: QueueRow[] = res?.lists || res?.data || [] + const count = Number(res?.count ?? res?.total ?? 0) + return { list, count } +} + +const fetchOtherCount = async () => { + const otherStatus = activeStatus.value === 1 ? 4 : 1 + try { + const { count } = await fetchQueuePage(1, otherStatus) + if (otherStatus === 1) waitingTotal.value = count + else passedTotal.value = count + } catch { /* 统计计数失败不阻塞 */ } +} + +const loadQueue = async (opts?: { silent?: boolean; keepSelection?: boolean }) => { + const silent = opts?.silent === true + if (silent && queueInflight) return + queueInflight = true + if (!silent) queueLoading.value = true + try { + page.value = 1 + const { list, count } = await fetchQueuePage(1) + queue.value = list + total.value = count || list.length + if (activeStatus.value === 1) waitingTotal.value = count + else passedTotal.value = count + hasMore.value = list.length >= PAGE_SIZE && queue.value.length < (count || 0) + + fetchOtherCount() + + if (selectedId.value && !list.some((r) => r.id === selectedId.value)) { + if (opts?.keepSelection === false) { + selectedId.value = null + detail.value = null + } + } + if (!selectedId.value && list.length > 0) { + await selectRow(list[0]) + } + } catch (e) { + if (!silent) console.error('加载队列失败:', e) + } finally { + queueLoading.value = false + queueInflight = false + } +} + +const loadMore = async () => { + if (loadingMore.value || !hasMore.value) return + loadingMore.value = true + try { + const nextPage = page.value + 1 + const { list, count } = await fetchQueuePage(nextPage) + // 去重合并(防止轮询时上方有新插入导致重复) + const existing = new Set(queue.value.map((r) => r.id)) + const appended = list.filter((r) => !existing.has(r.id)) + queue.value = [...queue.value, ...appended] + page.value = nextPage + total.value = count || total.value + hasMore.value = list.length >= PAGE_SIZE && queue.value.length < (count || 0) + } catch (e) { + console.error('加载更多失败:', e) + } finally { + loadingMore.value = false + } +} + +const refreshDetailSilently = async () => { + if (!selectedId.value || detailInflight) return + detailInflight = true + try { + const res: any = await receptionDetail({ id: selectedId.value }) + detail.value = res || detail.value + } catch (e) { + /* 静默失败 */ + } finally { + detailInflight = false + } +} + +const selectRow = async (row: QueueRow) => { + if (selectedId.value === row.id) return + selectedId.value = row.id + detail.value = null + detailLoading.value = true + detailInflight = true + resetCountdown() + try { + const res: any = await receptionDetail({ id: row.id }) + detail.value = res || null + } catch (e) { + console.error('加载详情失败:', e) + feedback.msgError('加载患者详情失败') + } finally { + detailLoading.value = false + detailInflight = false + } +} + +const switchStatus = async (status: 1 | 4) => { + if (activeStatus.value === status) return + activeStatus.value = status + selectedId.value = null + detail.value = null + await loadQueue() +} + +const handleSearch = async () => { + selectedId.value = null + detail.value = null + await loadQueue() +} + +const handleCall = async (row: QueueRow) => { + if (!row.patient_id) { + feedback.msgWarning('患者信息不完整') + return + } + try { + const res = await getCallSignature({ + patient_id: row.patient_id, + diagnosis_id: row.diagnosis_id || row.id + }) + chatDialogRef.value?.open({ + patientId: row.patient_id, + patientName: row.patient_name, + diagnosisId: row.diagnosis_id || row.id, + signatureData: res + }) + } catch (error: any) { + console.error('获取通话签名失败:', error) + feedback.msgError(error?.message || '获取通话签名失败') + } +} + +const handleNotify = async (row: QueueRow) => { + if (notifyingId.value) return + notifyingId.value = row.id + try { + await notifyAssistant({ id: row.id }) + feedback.msgSuccess(`已通知医助 ${row.assistant_name || ''}`) + } catch (e: any) { + feedback.msgError(e?.message || '通知失败') + } finally { + notifyingId.value = null + } +} + +const handleEditDiagnosis = () => { + if (!diag.value?.patient_id) return + diagnosisEditRef.value?.open('edit', diag.value.patient_id) +} + +const onDiagnosisEditSuccess = async () => { + await refreshDetailSilently() +} + +const handleFinish = async () => { + if (!apt.value?.id) return + try { + await feedback.confirm('确认将该患者标记为「已完成接诊」?此操作不可撤销。') + } catch { + return + } + finishLoading.value = true + try { + const removedId = apt.value.id + await completeAppointment({ id: removedId }) + feedback.msgSuccess('已完成接诊') + queue.value = queue.value.filter((r) => r.id !== removedId) + total.value = Math.max(0, total.value - 1) + if (activeStatus.value === 1) waitingTotal.value = Math.max(0, waitingTotal.value - 1) + else passedTotal.value = Math.max(0, passedTotal.value - 1) + selectedId.value = null + detail.value = null + resetCountdown() + if (queue.value.length > 0) { + await selectRow(queue.value[0]) + } else { + await loadQueue() + } + } catch (e: any) { + feedback.msgError(e?.message || '操作失败') + } finally { + finishLoading.value = false + } +} + +const handleSaveNote = async () => { + const diagId = diag.value?.id + if (!diagId) { + feedback.msgWarning('当前患者无诊单,无法添加备注') + return + } + const text = noteContent.value.trim() + if (!text) { + feedback.msgWarning('请输入备注内容') + return + } + noteSaving.value = true + try { + await addDoctorNote({ diagnosis_id: diagId, content: text }) + feedback.msgSuccess('备注保存成功') + noteContent.value = '' + showNoteDialog.value = false + await refreshDetailSilently() + } catch (e: any) { + feedback.msgError(e?.message || '保存失败') + } finally { + noteSaving.value = false + } +} + +const resetCountdown = () => { + countdown.value = POLL_MS / 1000 +} + +const startPolling = () => { + stopPolling() + resetCountdown() + // 1s 倒计时 + countdownTimer = setInterval(() => { + if (pollPaused.value) return + if (countdown.value > 1) { + countdown.value -= 1 + } else { + countdown.value = POLL_MS / 1000 + } + }, 1000) + // 5s 实际轮询 + pollTimer = setInterval(async () => { + if (pollPaused.value) return + await loadQueue({ silent: true, keepSelection: true }) + if (!detailLoading.value) { + await refreshDetailSilently() + } + }, POLL_MS) +} + +const stopPolling = () => { + if (pollTimer) { + clearInterval(pollTimer) + pollTimer = null + } + if (countdownTimer) { + clearInterval(countdownTimer) + countdownTimer = null + } +} + +const handleVisibilityChange = () => { + pollPaused.value = document.hidden + if (!document.hidden) { + resetCountdown() + loadQueue({ silent: true, keepSelection: true }) + refreshDetailSilently() + } +} + +/** + * 浏览器扩展(如钱包/翻译插件)注入的 content script 在页面卸载后投递消息, + * 常见报错 "Could not establish connection. Receiving end does not exist." + * 与本应用无关,静默吞掉避免污染控制台。 + */ +const onUnhandledRejection = (e: PromiseRejectionEvent) => { + const msg = String(e?.reason?.message || e?.reason || '') + if (/Receiving end does not exist|Could not establish connection/i.test(msg)) { + e.preventDefault() + } +} + +const setupScrollObserver = () => { + if (!sentinelRef.value || !queueScrollRef.value) return + scrollObserver?.disconnect() + scrollObserver = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) loadMore() + } + }, + { root: queueScrollRef.value, rootMargin: '80px', threshold: 0 } + ) + scrollObserver.observe(sentinelRef.value) +} + +watch(sentinelRef, () => setupScrollObserver()) + +onMounted(() => { + loadQueue() + startPolling() + document.addEventListener('visibilitychange', handleVisibilityChange) + window.addEventListener('unhandledrejection', onUnhandledRejection) + nextTick(() => setupScrollObserver()) +}) + +onUnmounted(() => { + stopPolling() + scrollObserver?.disconnect() + document.removeEventListener('visibilitychange', handleVisibilityChange) + window.removeEventListener('unhandledrejection', onUnhandledRejection) +}) +</script> + +<style scoped lang="scss"> +.reception-page { + --rx-bg: #f5f7fa; + --rx-surface: #ffffff; + --rx-ink: #303133; + --rx-muted: #606266; + --rx-soft: #909399; + --rx-line: #ebeef5; + --rx-accent: #409eff; + --rx-accent-soft: #ecf5ff; + --rx-success: #67c23a; + --rx-font-data: 'IBM Plex Mono', Consolas, Menlo, monospace; + + min-height: calc(100vh - 80px); + padding: 16px 20px 28px; + background: var(--rx-bg); + display: flex; + flex-direction: column; + gap: 16px; +} + +/* 页头 */ +.reception-header { + display: flex; + justify-content: space-between; + align-items: flex-end; + gap: 16px; +} +.header-title { + margin: 0 0 4px; + font-size: 22px; + font-weight: 700; + color: var(--rx-ink); +} +.header-desc { + color: var(--rx-muted); + font-size: 13px; +} +.header-meta { + margin-top: 4px; + color: var(--rx-soft); + font-family: var(--rx-font-data); + font-size: 12px; +} +.header-right { + display: flex; + gap: 10px; + align-items: center; +} +.live-pill { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + border-radius: 16px; + background: var(--rx-surface); + border: 1px solid var(--rx-line); + color: var(--rx-ink); + font-family: var(--rx-font-data); + font-size: 12px; + min-width: 112px; + justify-content: center; +} +.live-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--rx-success); + animation: pulse 1.6s infinite; +} +.live-dot.paused { + background: var(--rx-soft); + animation: none; +} +@keyframes pulse { + 0% { box-shadow: 0 0 0 0 rgba(103, 194, 58, 0.5); } + 70% { box-shadow: 0 0 0 8px rgba(103, 194, 58, 0); } + 100% { box-shadow: 0 0 0 0 rgba(103, 194, 58, 0); } +} + +/* 筛选条 */ +.filter-shell { + background: var(--rx-surface); + border: 1px solid var(--rx-line); + border-radius: 12px; + padding: 10px 16px; + display: flex; + align-items: center; + gap: 16px; +} +.search-input { + width: 280px; +} +.filter-tabs { + margin-left: auto; + display: flex; + align-items: center; + gap: 6px; + font-size: 13px; +} +.filter-tab { + color: var(--rx-soft); + cursor: pointer; + padding: 4px 10px; + border-radius: 6px; + transition: all 0.15s ease; + user-select: none; +} +.filter-tab:hover { + color: var(--rx-accent); + background: var(--rx-accent-soft); +} +.filter-tab.active { + color: var(--rx-accent); + background: var(--rx-accent-soft); + font-weight: 600; +} +.filter-sep { + color: var(--rx-line); + font-size: 12px; +} + +/* 主体 */ +.main-area { + display: flex; + gap: 14px; + flex: 1; + min-height: 0; +} +.queue-col { + width: 288px; + flex-shrink: 0; +} +.queue-panel { + background: var(--rx-surface); + border: 1px solid var(--rx-line); + border-radius: 12px; + padding: 12px; + display: flex; + flex-direction: column; + gap: 10px; + height: calc(100vh - 260px); + min-height: 480px; +} +.queue-head { + display: flex; + justify-content: space-between; + align-items: center; +} +.queue-title { + font-size: 15px; + font-weight: 700; + color: var(--rx-ink); +} +.queue-meta { + color: var(--rx-muted); + font-family: var(--rx-font-data); + font-size: 12px; +} +.queue-list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 8px; + padding-right: 2px; +} +.queue-row { + border: 1px solid var(--rx-line); + border-radius: 8px; + padding: 10px; + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + transition: all 0.15s ease; + background: #fff; +} +.queue-row:hover { + border-color: var(--rx-accent); + background: var(--rx-accent-soft); +} +.queue-row.active { + background: var(--rx-accent-soft); + border-color: var(--rx-accent); + box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.12); +} +.queue-row.passed { + opacity: 0.7; +} +.row-name { + flex: 1; + min-width: 0; +} +.name-line { + font-size: 13px; + font-weight: 600; + color: var(--rx-ink); + display: flex; + align-items: baseline; + gap: 6px; +} +.name-meta { + font-size: 12px; + color: var(--rx-muted); + font-weight: 400; +} +.time-line { + margin-top: 2px; + font-size: 12px; + color: var(--rx-soft); + font-family: var(--rx-font-data); +} +.row-actions { + display: flex; + align-items: center; + gap: 6px; + flex-shrink: 0; +} +.row-icon-btn { + width: 30px; + height: 30px; + border-radius: 8px; + border: 1px solid transparent; + background: transparent; + color: var(--rx-muted); + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.15s ease; + font-size: 15px; + padding: 0; +} +.row-icon-btn:hover { + background: var(--rx-accent-soft); + color: var(--rx-accent); + border-color: var(--rx-accent); +} +.row-icon-btn:active { + transform: scale(0.92); +} +.row-icon-btn.notify:hover { + background: #fff7e6; + color: #e6a23c; + border-color: #e6a23c; +} +.row-icon-btn:disabled { + opacity: 0.6; + cursor: not-allowed; +} +.scroll-sentinel { + padding: 12px 0 4px; + text-align: center; + color: var(--rx-soft); + font-size: 12px; + font-family: var(--rx-font-data); +} +.scroll-sentinel .no-more { + color: #c0c4cc; +} + +/* 右侧 */ +.sidebar { + flex: 1; + display: flex; + flex-direction: column; + gap: 14px; + min-width: 0; + overflow-y: auto; + max-height: calc(100vh - 170px); + padding-right: 4px; +} +.placeholder-card { + flex: 1; + background: var(--rx-surface); + border: 1px solid var(--rx-line); + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + min-height: 400px; +} +.card { + background: var(--rx-surface); + border: 1px solid var(--rx-line); + border-radius: 12px; + padding: 16px; + display: flex; + flex-direction: column; + gap: 12px; +} +.card-title { + font-size: 15px; + font-weight: 700; + color: var(--rx-ink); + display: flex; + align-items: baseline; + gap: 10px; +} +.case-sub { + font-size: 12px; + font-weight: 400; + color: var(--rx-soft); + font-family: var(--rx-font-data); +} +.patient-hero { + background: #f8fafc; + border: 1px solid var(--rx-line); + border-radius: 8px; + padding: 14px; + display: flex; + flex-direction: column; + gap: 6px; +} +.patient-name { + font-size: 22px; + font-weight: 700; + color: var(--rx-ink); +} +.patient-meta { + color: var(--rx-muted); + font-size: 13px; + line-height: 1.6; + display: flex; + flex-direction: column; + gap: 2px; +} + +/* 病例紧凑网格 */ +.grid-block { + display: flex; + flex-direction: column; + gap: 8px; + padding-top: 8px; + border-top: 1px dashed var(--rx-line); +} +.grid-block:first-of-type { + border-top: none; + padding-top: 0; +} +.grid-title { + font-size: 13px; + font-weight: 600; + color: var(--rx-ink); + letter-spacing: 0.02em; +} +.kv-grid { + display: grid; + gap: 6px 14px; +} +.kv-grid.one { grid-template-columns: 1fr; } +.kv-grid.two { grid-template-columns: repeat(2, 1fr); } +.kv-grid.three { grid-template-columns: repeat(3, 1fr); } +.kv-grid.four { grid-template-columns: repeat(4, 1fr); } + +:deep(.kv-item) { + display: flex; + gap: 6px; + font-size: 12.5px; + line-height: 1.55; + min-width: 0; +} +:deep(.kv-item.multiline) { + flex-direction: column; + gap: 2px; +} +:deep(.kv-item .kv-label) { + color: var(--rx-soft); + flex-shrink: 0; + min-width: 58px; +} +:deep(.kv-item .kv-value) { + color: var(--rx-ink); + word-break: break-word; + flex: 1; +} +:deep(.kv-item.empty .kv-value) { + color: #c0c4cc; +} +:deep(.kv-item.multiline .kv-value) { + white-space: pre-wrap; +} + +.rx-note { + font-size: 13px; + color: var(--rx-muted); + line-height: 1.6; + padding: 10px 12px; + background: #fafbfc; + border-radius: 6px; +} + +.metric-viewport { + border: 1px solid var(--rx-line); + border-radius: 8px; + overflow: hidden; +} +.metric-table :deep(.el-table__header) th { + background: #fafbfc; + color: var(--rx-ink); + font-weight: 600; +} + +.float-bar { + position: fixed; + right: 80px; + bottom: 15px; + z-index: 20; +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.2s ease, transform 0.2s ease; +} +.fade-enter-from, +.fade-leave-to { + opacity: 0; + transform: translateY(8px); +} + +@media (max-width: 1100px) { + .main-area { + flex-direction: column; + } + .queue-col { + width: 100%; + } + .queue-panel { + height: auto; + max-height: 360px; + } + .kv-grid.three, + .kv-grid.four { + grid-template-columns: repeat(2, 1fr); + } +} +</style> diff --git a/admin/src/views/tcm/diagnosis/edit.vue b/admin/src/views/tcm/diagnosis/edit.vue index d1017985..a7b6aab3 100644 --- a/admin/src/views/tcm/diagnosis/edit.vue +++ b/admin/src/views/tcm/diagnosis/edit.vue @@ -662,6 +662,13 @@ /> <el-empty v-else description="请先保存诊单后再查看挂号记录" /> </el-tab-pane> + <el-tab-pane label="医生备注" name="doctorNote" :disabled="!formData.id" lazy> + <div v-if="formData.id" class="p-4"> + <NoteTimeline v-if="diagNotes.length" :notes="diagNotes" /> + <el-empty v-else description="暂无备注记录" :image-size="48" /> + </div> + <el-empty v-else description="请先保存诊单后查看" /> + </el-tab-pane> </el-tabs> <!-- 处方详情(查看病历) --> @@ -702,7 +709,9 @@ import CallRecordPanel from './components/CallRecordPanel.vue' import ImChatRecordPanel from './components/ImChatRecordPanel.vue' import AssignLogPanel from './components/AssignLogPanel.vue' import AppointmentRecordPanel from './components/AppointmentRecordPanel.vue' +import NoteTimeline from '@/views/patient/reception/components/NoteTimeline.vue' import TcmPrescription from '@/components/tcm-prescription/index.vue' +import { getDoctorNotes } from '@/api/patient' import { DIAGNOSIS_TONGUE_IMAGES_UPDATED, type DiagnosisTongueImagesUpdatedDetail @@ -733,6 +742,16 @@ const drawerTitle = computed(() => { return mode.value === 'add' ? '新增诊单' : '编辑诊单' }) +const diagNotes = ref<any[]>([]) + +watch(() => activeTab.value, async (tab) => { + if (tab === 'doctorNote' && formData.value.id) { + try { + diagNotes.value = await getDoctorNotes({ diagnosis_id: Number(formData.value.id) }) || [] + } catch { diagNotes.value = [] } + } +}) + watch([visible, activeTab], () => { if (!visible.value) return if (activeTab.value === 'chat' && !hasPermission(['tcm.diagnosis/chat'])) { diff --git a/admin/tsconfig.tsbuildinfo b/admin/tsconfig.tsbuildinfo index ba9c68e2..439ee9f2 100644 --- a/admin/tsconfig.tsbuildinfo +++ b/admin/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/importmeta.d.ts","./node_modules/vite/client.d.ts","./global.d.ts","./node_modules/@vue/shared/dist/shared.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","./node_modules/@vue/reactivity/dist/reactivity.d.ts","./node_modules/@vue/runtime-core/dist/runtime-core.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","./node_modules/vue/dist/vue.d.mts","./node_modules/vue/jsx-runtime/index.d.ts","./node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts","./node_modules/vue-router/dist/router-cwonjprp.d.mts","./node_modules/vue-router/dist/vue-router.d.mts","./node_modules/@vueuse/shared/index.d.mts","./node_modules/@vueuse/core/index.d.mts","./node_modules/element-plus/es/locale/lang/zh-cn.d.ts","./src/enums/appenums.ts","./node_modules/vue-demi/lib/index.d.ts","./node_modules/pinia/dist/pinia.d.ts","./node_modules/axios/index.d.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./src/config/index.ts","./src/enums/pageenum.ts","./src/enums/requestenums.ts","./src/api/user.ts","./src/enums/cacheenums.ts","./src/utils/validate.ts","./src/stores/modules/multipletabs.ts","./src/utils/cache.ts","./src/utils/auth.ts","./src/stores/modules/user.ts","./src/config/setting.ts","./src/utils/theme.ts","./src/stores/modules/setting.ts","./src/layout/default/components/setting/drawer.vue","./src/layout/default/components/setting/index.vue","./src/hooks/usewatchroute.ts","./src/layout/default/components/header/breadcrumb.vue","./src/layout/default/components/header/fold.vue","./src/layout/default/components/header/full-screen.vue","./src/hooks/usemultipletabs.ts","./src/layout/default/components/header/multiple-tabs.vue","./src/layout/default/components/header/refresh.vue","./src/api/setting/system.ts","./node_modules/element-plus/es/utils/dom/aria.d.ts","./node_modules/element-plus/es/utils/dom/event.d.ts","./node_modules/element-plus/es/utils/dom/position.d.ts","./node_modules/element-plus/es/utils/dom/scroll.d.ts","./node_modules/element-plus/es/utils/dom/style.d.ts","./node_modules/element-plus/es/utils/dom/element.d.ts","./node_modules/element-plus/es/utils/dom/index.d.ts","./node_modules/element-plus/es/utils/vue/global-node.d.ts","./node_modules/element-plus/es/utils/vue/icon.d.ts","./node_modules/element-plus/es/utils/vue/typescript.d.ts","./node_modules/element-plus/es/utils/vue/install.d.ts","./node_modules/element-plus/es/utils/vue/props/util.d.ts","./node_modules/element-plus/es/utils/vue/props/runtime.d.ts","./node_modules/element-plus/es/utils/vue/props/types.d.ts","./node_modules/element-plus/es/utils/vue/props/index.d.ts","./node_modules/element-plus/es/utils/vue/refs.d.ts","./node_modules/element-plus/es/constants/aria.d.ts","./node_modules/element-plus/es/constants/date.d.ts","./node_modules/element-plus/es/constants/event.d.ts","./node_modules/element-plus/es/constants/key.d.ts","./node_modules/element-plus/es/constants/size.d.ts","./node_modules/element-plus/es/constants/column-alignment.d.ts","./node_modules/element-plus/es/constants/form.d.ts","./node_modules/element-plus/es/constants/index.d.ts","./node_modules/element-plus/es/utils/vue/size.d.ts","./node_modules/element-plus/es/utils/vue/validator.d.ts","./node_modules/element-plus/es/utils/vue/vnode.d.ts","./node_modules/element-plus/es/utils/vue/index.d.ts","./node_modules/@types/lodash-es/add.d.ts","./node_modules/@types/lodash-es/after.d.ts","./node_modules/@types/lodash-es/ary.d.ts","./node_modules/@types/lodash-es/assign.d.ts","./node_modules/@types/lodash-es/assignin.d.ts","./node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/@types/lodash-es/at.d.ts","./node_modules/@types/lodash-es/attempt.d.ts","./node_modules/@types/lodash-es/before.d.ts","./node_modules/@types/lodash-es/bind.d.ts","./node_modules/@types/lodash-es/bindall.d.ts","./node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/@types/lodash-es/castarray.d.ts","./node_modules/@types/lodash-es/ceil.d.ts","./node_modules/@types/lodash-es/chain.d.ts","./node_modules/@types/lodash-es/chunk.d.ts","./node_modules/@types/lodash-es/clamp.d.ts","./node_modules/@types/lodash-es/clone.d.ts","./node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/@types/lodash-es/compact.d.ts","./node_modules/@types/lodash-es/concat.d.ts","./node_modules/@types/lodash-es/cond.d.ts","./node_modules/@types/lodash-es/conforms.d.ts","./node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/@types/lodash-es/constant.d.ts","./node_modules/@types/lodash-es/countby.d.ts","./node_modules/@types/lodash-es/create.d.ts","./node_modules/@types/lodash-es/curry.d.ts","./node_modules/@types/lodash-es/curryright.d.ts","./node_modules/@types/lodash-es/debounce.d.ts","./node_modules/@types/lodash-es/deburr.d.ts","./node_modules/@types/lodash-es/defaults.d.ts","./node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/@types/lodash-es/defer.d.ts","./node_modules/@types/lodash-es/delay.d.ts","./node_modules/@types/lodash-es/difference.d.ts","./node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/@types/lodash-es/divide.d.ts","./node_modules/@types/lodash-es/drop.d.ts","./node_modules/@types/lodash-es/dropright.d.ts","./node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/@types/lodash-es/each.d.ts","./node_modules/@types/lodash-es/eachright.d.ts","./node_modules/@types/lodash-es/endswith.d.ts","./node_modules/@types/lodash-es/entries.d.ts","./node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/@types/lodash-es/eq.d.ts","./node_modules/@types/lodash-es/escape.d.ts","./node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/@types/lodash-es/every.d.ts","./node_modules/@types/lodash-es/extend.d.ts","./node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/@types/lodash-es/fill.d.ts","./node_modules/@types/lodash-es/filter.d.ts","./node_modules/@types/lodash-es/find.d.ts","./node_modules/@types/lodash-es/findindex.d.ts","./node_modules/@types/lodash-es/findkey.d.ts","./node_modules/@types/lodash-es/findlast.d.ts","./node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/@types/lodash-es/first.d.ts","./node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/@types/lodash-es/flatten.d.ts","./node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/@types/lodash-es/flip.d.ts","./node_modules/@types/lodash-es/floor.d.ts","./node_modules/@types/lodash-es/flow.d.ts","./node_modules/@types/lodash-es/flowright.d.ts","./node_modules/@types/lodash-es/foreach.d.ts","./node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/@types/lodash-es/forin.d.ts","./node_modules/@types/lodash-es/forinright.d.ts","./node_modules/@types/lodash-es/forown.d.ts","./node_modules/@types/lodash-es/forownright.d.ts","./node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/@types/lodash-es/functions.d.ts","./node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/@types/lodash-es/get.d.ts","./node_modules/@types/lodash-es/groupby.d.ts","./node_modules/@types/lodash-es/gt.d.ts","./node_modules/@types/lodash-es/gte.d.ts","./node_modules/@types/lodash-es/has.d.ts","./node_modules/@types/lodash-es/hasin.d.ts","./node_modules/@types/lodash-es/head.d.ts","./node_modules/@types/lodash-es/identity.d.ts","./node_modules/@types/lodash-es/includes.d.ts","./node_modules/@types/lodash-es/indexof.d.ts","./node_modules/@types/lodash-es/initial.d.ts","./node_modules/@types/lodash-es/inrange.d.ts","./node_modules/@types/lodash-es/intersection.d.ts","./node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/@types/lodash-es/invert.d.ts","./node_modules/@types/lodash-es/invertby.d.ts","./node_modules/@types/lodash-es/invoke.d.ts","./node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/@types/lodash-es/isarray.d.ts","./node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/@types/lodash-es/isdate.d.ts","./node_modules/@types/lodash-es/iselement.d.ts","./node_modules/@types/lodash-es/isempty.d.ts","./node_modules/@types/lodash-es/isequal.d.ts","./node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/@types/lodash-es/iserror.d.ts","./node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/@types/lodash-es/islength.d.ts","./node_modules/@types/lodash-es/ismap.d.ts","./node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/@types/lodash-es/isnan.d.ts","./node_modules/@types/lodash-es/isnative.d.ts","./node_modules/@types/lodash-es/isnil.d.ts","./node_modules/@types/lodash-es/isnull.d.ts","./node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/@types/lodash-es/isobject.d.ts","./node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/@types/lodash-es/isset.d.ts","./node_modules/@types/lodash-es/isstring.d.ts","./node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/@types/lodash-es/join.d.ts","./node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/@types/lodash-es/keyby.d.ts","./node_modules/@types/lodash-es/keys.d.ts","./node_modules/@types/lodash-es/keysin.d.ts","./node_modules/@types/lodash-es/last.d.ts","./node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/@types/lodash-es/lt.d.ts","./node_modules/@types/lodash-es/lte.d.ts","./node_modules/@types/lodash-es/map.d.ts","./node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/@types/lodash-es/matches.d.ts","./node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/@types/lodash-es/max.d.ts","./node_modules/@types/lodash-es/maxby.d.ts","./node_modules/@types/lodash-es/mean.d.ts","./node_modules/@types/lodash-es/meanby.d.ts","./node_modules/@types/lodash-es/memoize.d.ts","./node_modules/@types/lodash-es/merge.d.ts","./node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/@types/lodash-es/method.d.ts","./node_modules/@types/lodash-es/methodof.d.ts","./node_modules/@types/lodash-es/min.d.ts","./node_modules/@types/lodash-es/minby.d.ts","./node_modules/@types/lodash-es/mixin.d.ts","./node_modules/@types/lodash-es/multiply.d.ts","./node_modules/@types/lodash-es/negate.d.ts","./node_modules/@types/lodash-es/noop.d.ts","./node_modules/@types/lodash-es/now.d.ts","./node_modules/@types/lodash-es/nth.d.ts","./node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/@types/lodash-es/omit.d.ts","./node_modules/@types/lodash-es/omitby.d.ts","./node_modules/@types/lodash-es/once.d.ts","./node_modules/@types/lodash-es/orderby.d.ts","./node_modules/@types/lodash-es/over.d.ts","./node_modules/@types/lodash-es/overargs.d.ts","./node_modules/@types/lodash-es/overevery.d.ts","./node_modules/@types/lodash-es/oversome.d.ts","./node_modules/@types/lodash-es/pad.d.ts","./node_modules/@types/lodash-es/padend.d.ts","./node_modules/@types/lodash-es/padstart.d.ts","./node_modules/@types/lodash-es/parseint.d.ts","./node_modules/@types/lodash-es/partial.d.ts","./node_modules/@types/lodash-es/partialright.d.ts","./node_modules/@types/lodash-es/partition.d.ts","./node_modules/@types/lodash-es/pick.d.ts","./node_modules/@types/lodash-es/pickby.d.ts","./node_modules/@types/lodash-es/property.d.ts","./node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/@types/lodash-es/pull.d.ts","./node_modules/@types/lodash-es/pullall.d.ts","./node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/@types/lodash-es/pullat.d.ts","./node_modules/@types/lodash-es/random.d.ts","./node_modules/@types/lodash-es/range.d.ts","./node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/@types/lodash-es/rearg.d.ts","./node_modules/@types/lodash-es/reduce.d.ts","./node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/@types/lodash-es/reject.d.ts","./node_modules/@types/lodash-es/remove.d.ts","./node_modules/@types/lodash-es/repeat.d.ts","./node_modules/@types/lodash-es/replace.d.ts","./node_modules/@types/lodash-es/rest.d.ts","./node_modules/@types/lodash-es/result.d.ts","./node_modules/@types/lodash-es/reverse.d.ts","./node_modules/@types/lodash-es/round.d.ts","./node_modules/@types/lodash-es/sample.d.ts","./node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/@types/lodash-es/set.d.ts","./node_modules/@types/lodash-es/setwith.d.ts","./node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/@types/lodash-es/size.d.ts","./node_modules/@types/lodash-es/slice.d.ts","./node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/@types/lodash-es/some.d.ts","./node_modules/@types/lodash-es/sortby.d.ts","./node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/@types/lodash-es/split.d.ts","./node_modules/@types/lodash-es/spread.d.ts","./node_modules/@types/lodash-es/startcase.d.ts","./node_modules/@types/lodash-es/startswith.d.ts","./node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/@types/lodash-es/subtract.d.ts","./node_modules/@types/lodash-es/sum.d.ts","./node_modules/@types/lodash-es/sumby.d.ts","./node_modules/@types/lodash-es/tail.d.ts","./node_modules/@types/lodash-es/take.d.ts","./node_modules/@types/lodash-es/takeright.d.ts","./node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/@types/lodash-es/tap.d.ts","./node_modules/@types/lodash-es/template.d.ts","./node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/@types/lodash-es/throttle.d.ts","./node_modules/@types/lodash-es/thru.d.ts","./node_modules/@types/lodash-es/times.d.ts","./node_modules/@types/lodash-es/toarray.d.ts","./node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/@types/lodash-es/tolength.d.ts","./node_modules/@types/lodash-es/tolower.d.ts","./node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/@types/lodash-es/topairs.d.ts","./node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/@types/lodash-es/topath.d.ts","./node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/@types/lodash-es/tostring.d.ts","./node_modules/@types/lodash-es/toupper.d.ts","./node_modules/@types/lodash-es/transform.d.ts","./node_modules/@types/lodash-es/trim.d.ts","./node_modules/@types/lodash-es/trimend.d.ts","./node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/@types/lodash-es/truncate.d.ts","./node_modules/@types/lodash-es/unary.d.ts","./node_modules/@types/lodash-es/unescape.d.ts","./node_modules/@types/lodash-es/union.d.ts","./node_modules/@types/lodash-es/unionby.d.ts","./node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/@types/lodash-es/uniq.d.ts","./node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/@types/lodash-es/unset.d.ts","./node_modules/@types/lodash-es/unzip.d.ts","./node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/@types/lodash-es/update.d.ts","./node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/@types/lodash-es/values.d.ts","./node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/@types/lodash-es/without.d.ts","./node_modules/@types/lodash-es/words.d.ts","./node_modules/@types/lodash-es/wrap.d.ts","./node_modules/@types/lodash-es/xor.d.ts","./node_modules/@types/lodash-es/xorby.d.ts","./node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/@types/lodash-es/zip.d.ts","./node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/@types/lodash-es/index.d.ts","./node_modules/lodash-unified/type.d.ts","./node_modules/element-plus/es/utils/arrays.d.ts","./node_modules/element-plus/node_modules/@vueuse/shared/index.d.mts","./node_modules/element-plus/node_modules/@vueuse/core/index.d.mts","./node_modules/element-plus/es/utils/browser.d.ts","./node_modules/element-plus/es/utils/error.d.ts","./node_modules/element-plus/es/utils/functions.d.ts","./node_modules/element-plus/es/utils/i18n.d.ts","./node_modules/element-plus/es/utils/objects.d.ts","./node_modules/element-plus/es/utils/raf.d.ts","./node_modules/element-plus/es/utils/rand.d.ts","./node_modules/element-plus/es/utils/strings.d.ts","./node_modules/element-plus/es/utils/types.d.ts","./node_modules/element-plus/es/utils/typescript.d.ts","./node_modules/element-plus/es/utils/throttlebyraf.d.ts","./node_modules/element-plus/es/utils/easings.d.ts","./node_modules/element-plus/es/utils/index.d.ts","./node_modules/element-plus/es/components/affix/src/affix.d.ts","./node_modules/element-plus/es/components/affix/src/affix.vue.d.ts","./node_modules/element-plus/es/components/affix/index.d.ts","./node_modules/element-plus/es/components/alert/src/alert.d.ts","./node_modules/element-plus/es/components/alert/src/alert.vue.d.ts","./node_modules/element-plus/es/components/alert/src/instance.d.ts","./node_modules/element-plus/es/components/alert/index.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/element-plus/es/components/popper/src/constants.d.ts","./node_modules/element-plus/es/components/popper/src/popper.d.ts","./node_modules/element-plus/es/components/popper/src/popper.vue.d.ts","./node_modules/element-plus/es/components/popper/src/arrow.vue.d.ts","./node_modules/element-plus/es/components/popper/src/trigger.d.ts","./node_modules/element-plus/es/components/popper/src/trigger.vue.d.ts","./node_modules/element-plus/es/components/popper/src/arrow.d.ts","./node_modules/element-plus/es/components/popper/src/content.d.ts","./node_modules/element-plus/es/components/popper/src/content.vue.d.ts","./node_modules/element-plus/es/components/popper/index.d.ts","./node_modules/element-plus/es/components/input/src/input.d.ts","./node_modules/element-plus/es/components/input/src/input.vue.d.ts","./node_modules/element-plus/es/components/input/src/instance.d.ts","./node_modules/element-plus/es/components/input/index.d.ts","./node_modules/element-plus/es/hooks/use-attrs/index.d.ts","./node_modules/element-plus/es/hooks/use-calc-input-width/index.d.ts","./node_modules/element-plus/es/hooks/use-deprecated/index.d.ts","./node_modules/element-plus/es/hooks/use-draggable/index.d.ts","./node_modules/element-plus/es/hooks/use-focus/index.d.ts","./node_modules/element-plus/es/locale/lang/en.d.ts","./node_modules/element-plus/es/locale/lang/af.d.ts","./node_modules/element-plus/es/locale/lang/ar-eg.d.ts","./node_modules/element-plus/es/locale/lang/ar.d.ts","./node_modules/element-plus/es/locale/lang/az.d.ts","./node_modules/element-plus/es/locale/lang/bg.d.ts","./node_modules/element-plus/es/locale/lang/bn.d.ts","./node_modules/element-plus/es/locale/lang/ca.d.ts","./node_modules/element-plus/es/locale/lang/ckb.d.ts","./node_modules/element-plus/es/locale/lang/cs.d.ts","./node_modules/element-plus/es/locale/lang/da.d.ts","./node_modules/element-plus/es/locale/lang/de.d.ts","./node_modules/element-plus/es/locale/lang/el.d.ts","./node_modules/element-plus/es/locale/lang/eo.d.ts","./node_modules/element-plus/es/locale/lang/es.d.ts","./node_modules/element-plus/es/locale/lang/et.d.ts","./node_modules/element-plus/es/locale/lang/eu.d.ts","./node_modules/element-plus/es/locale/lang/fa.d.ts","./node_modules/element-plus/es/locale/lang/fi.d.ts","./node_modules/element-plus/es/locale/lang/fr.d.ts","./node_modules/element-plus/es/locale/lang/he.d.ts","./node_modules/element-plus/es/locale/lang/hi.d.ts","./node_modules/element-plus/es/locale/lang/hr.d.ts","./node_modules/element-plus/es/locale/lang/hu.d.ts","./node_modules/element-plus/es/locale/lang/hy-am.d.ts","./node_modules/element-plus/es/locale/lang/id.d.ts","./node_modules/element-plus/es/locale/lang/it.d.ts","./node_modules/element-plus/es/locale/lang/ja.d.ts","./node_modules/element-plus/es/locale/lang/kk.d.ts","./node_modules/element-plus/es/locale/lang/km.d.ts","./node_modules/element-plus/es/locale/lang/ko.d.ts","./node_modules/element-plus/es/locale/lang/ku.d.ts","./node_modules/element-plus/es/locale/lang/ky.d.ts","./node_modules/element-plus/es/locale/lang/lo.d.ts","./node_modules/element-plus/es/locale/lang/lt.d.ts","./node_modules/element-plus/es/locale/lang/lv.d.ts","./node_modules/element-plus/es/locale/lang/mg.d.ts","./node_modules/element-plus/es/locale/lang/mn.d.ts","./node_modules/element-plus/es/locale/lang/ms.d.ts","./node_modules/element-plus/es/locale/lang/my.d.ts","./node_modules/element-plus/es/locale/lang/nb-no.d.ts","./node_modules/element-plus/es/locale/lang/nl.d.ts","./node_modules/element-plus/es/locale/lang/no.d.ts","./node_modules/element-plus/es/locale/lang/pa.d.ts","./node_modules/element-plus/es/locale/lang/pl.d.ts","./node_modules/element-plus/es/locale/lang/pt-br.d.ts","./node_modules/element-plus/es/locale/lang/pt.d.ts","./node_modules/element-plus/es/locale/lang/ro.d.ts","./node_modules/element-plus/es/locale/lang/ru.d.ts","./node_modules/element-plus/es/locale/lang/sk.d.ts","./node_modules/element-plus/es/locale/lang/sl.d.ts","./node_modules/element-plus/es/locale/lang/sr.d.ts","./node_modules/element-plus/es/locale/lang/sv.d.ts","./node_modules/element-plus/es/locale/lang/sw.d.ts","./node_modules/element-plus/es/locale/lang/ta.d.ts","./node_modules/element-plus/es/locale/lang/te.d.ts","./node_modules/element-plus/es/locale/lang/th.d.ts","./node_modules/element-plus/es/locale/lang/tk.d.ts","./node_modules/element-plus/es/locale/lang/tr.d.ts","./node_modules/element-plus/es/locale/lang/ug-cn.d.ts","./node_modules/element-plus/es/locale/lang/uk.d.ts","./node_modules/element-plus/es/locale/lang/uz-uz.d.ts","./node_modules/element-plus/es/locale/lang/vi.d.ts","./node_modules/element-plus/es/locale/lang/zh-tw.d.ts","./node_modules/element-plus/es/locale/lang/zh-hk.d.ts","./node_modules/element-plus/es/locale/lang/zh-mo.d.ts","./node_modules/element-plus/es/locale/index.d.ts","./node_modules/element-plus/es/hooks/use-locale/index.d.ts","./node_modules/element-plus/es/hooks/use-namespace/index.d.ts","./node_modules/element-plus/es/hooks/use-lockscreen/index.d.ts","./node_modules/element-plus/es/hooks/use-modal/index.d.ts","./node_modules/element-plus/es/hooks/use-model-toggle/index.d.ts","./node_modules/element-plus/es/hooks/use-prevent-global/index.d.ts","./node_modules/element-plus/es/hooks/use-prop/index.d.ts","./node_modules/element-plus/es/hooks/use-popper/index.d.ts","./node_modules/element-plus/es/hooks/use-same-target/index.d.ts","./node_modules/element-plus/es/hooks/use-teleport/index.d.ts","./node_modules/element-plus/es/hooks/use-throttle-render/index.d.ts","./node_modules/element-plus/es/hooks/use-timeout/index.d.ts","./node_modules/element-plus/es/hooks/use-transition-fallthrough/index.d.ts","./node_modules/element-plus/es/hooks/use-id/index.d.ts","./node_modules/element-plus/es/hooks/use-escape-keydown/index.d.ts","./node_modules/element-plus/es/hooks/use-popper-container/index.d.ts","./node_modules/element-plus/es/hooks/use-intermediate-render/index.d.ts","./node_modules/element-plus/es/hooks/use-delayed-toggle/index.d.ts","./node_modules/element-plus/es/hooks/use-forward-ref/index.d.ts","./node_modules/element-plus/es/hooks/use-z-index/index.d.ts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./node_modules/element-plus/es/hooks/use-floating/index.d.ts","./node_modules/element-plus/es/hooks/use-cursor/index.d.ts","./node_modules/element-plus/es/hooks/use-ordered-children/index.d.ts","./node_modules/element-plus/es/hooks/use-size/index.d.ts","./node_modules/element-plus/es/hooks/use-focus-controller/index.d.ts","./node_modules/element-plus/es/hooks/use-composition/index.d.ts","./node_modules/element-plus/es/hooks/use-empty-values/index.d.ts","./node_modules/element-plus/es/hooks/use-aria/index.d.ts","./node_modules/element-plus/es/hooks/index.d.ts","./node_modules/element-plus/es/components/tooltip/src/content.vue.d.ts","./node_modules/element-plus/es/components/tooltip/src/content.d.ts","./node_modules/element-plus/es/components/tooltip/src/trigger.d.ts","./node_modules/element-plus/es/components/tooltip/src/tooltip.d.ts","./node_modules/element-plus/es/components/tooltip/src/tooltip.vue.d.ts","./node_modules/element-plus/es/components/tooltip/src/constants.d.ts","./node_modules/element-plus/es/components/tooltip/index.d.ts","./node_modules/element-plus/es/components/autocomplete/src/autocomplete.d.ts","./node_modules/element-plus/es/components/autocomplete/src/autocomplete.vue.d.ts","./node_modules/element-plus/es/components/autocomplete/index.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar.vue.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar-group.d.ts","./node_modules/element-plus/es/components/avatar/src/constants.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar-group-props.d.ts","./node_modules/element-plus/es/components/avatar/src/instance.d.ts","./node_modules/element-plus/es/components/avatar/index.d.ts","./node_modules/element-plus/es/components/backtop/src/backtop.d.ts","./node_modules/element-plus/es/components/backtop/src/backtop.vue.d.ts","./node_modules/element-plus/es/components/backtop/src/instance.d.ts","./node_modules/element-plus/es/components/backtop/index.d.ts","./node_modules/element-plus/es/components/badge/src/badge.d.ts","./node_modules/element-plus/es/components/badge/src/badge.vue.d.ts","./node_modules/element-plus/es/components/badge/src/instance.d.ts","./node_modules/element-plus/es/components/badge/index.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.vue.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.vue.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/constants.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/instances.d.ts","./node_modules/element-plus/es/components/breadcrumb/index.d.ts","./node_modules/element-plus/es/components/button/src/button.d.ts","./node_modules/element-plus/es/components/button/src/button.vue.d.ts","./node_modules/element-plus/es/components/button/src/button-group.d.ts","./node_modules/element-plus/es/components/button/src/button-group.vue.d.ts","./node_modules/element-plus/es/components/button/src/constants.d.ts","./node_modules/element-plus/es/components/button/src/instance.d.ts","./node_modules/element-plus/es/components/button/index.d.ts","./node_modules/element-plus/es/components/calendar/src/calendar.d.ts","./node_modules/dayjs/locale/types.d.ts","./node_modules/dayjs/locale/index.d.ts","./node_modules/dayjs/index.d.ts","./node_modules/element-plus/es/components/calendar/src/calendar.vue.d.ts","./node_modules/element-plus/es/components/calendar/src/date-table.d.ts","./node_modules/element-plus/es/components/calendar/src/date-table.vue.d.ts","./node_modules/element-plus/es/components/calendar/src/instance.d.ts","./node_modules/element-plus/es/components/calendar/index.d.ts","./node_modules/element-plus/es/components/card/src/card.d.ts","./node_modules/element-plus/es/components/card/src/card.vue.d.ts","./node_modules/element-plus/es/components/card/src/instance.d.ts","./node_modules/element-plus/es/components/card/index.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel.vue.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel-item.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel-item.vue.d.ts","./node_modules/element-plus/es/components/carousel/src/constants.d.ts","./node_modules/element-plus/es/components/carousel/src/instance.d.ts","./node_modules/element-plus/es/components/carousel/index.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/types.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/node.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/menu.vue.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/instance.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/config.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/index.vue.d.ts","./node_modules/element-plus/es/components/cascader-panel/index.d.ts","./node_modules/element-plus/es/components/tag/src/tag.d.ts","./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","./node_modules/element-plus/es/components/tag/index.d.ts","./node_modules/element-plus/es/components/cascader/src/cascader.d.ts","./node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","./node_modules/element-plus/es/components/cascader/src/instances.d.ts","./node_modules/element-plus/es/components/cascader/index.d.ts","./node_modules/element-plus/es/components/check-tag/src/check-tag.d.ts","./node_modules/element-plus/es/components/check-tag/src/check-tag.vue.d.ts","./node_modules/element-plus/es/components/check-tag/index.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-button.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-group.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-group.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/constants.d.ts","./node_modules/element-plus/es/components/checkbox/index.d.ts","./node_modules/element-plus/es/components/col/src/col.d.ts","./node_modules/element-plus/es/components/col/src/col.vue.d.ts","./node_modules/element-plus/es/components/col/index.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse.vue.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse-item.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse-item.vue.d.ts","./node_modules/element-plus/es/components/collapse/src/constants.d.ts","./node_modules/element-plus/es/components/collapse/src/instance.d.ts","./node_modules/element-plus/es/components/collapse/index.d.ts","./node_modules/element-plus/es/components/collapse-transition/src/collapse-transition.vue.d.ts","./node_modules/element-plus/es/components/collapse-transition/index.d.ts","./node_modules/@ctrl/tinycolor/dist/interfaces.d.ts","./node_modules/@ctrl/tinycolor/dist/index.d.ts","./node_modules/@ctrl/tinycolor/dist/css-color-names.d.ts","./node_modules/@ctrl/tinycolor/dist/readability.d.ts","./node_modules/@ctrl/tinycolor/dist/to-ms-filter.d.ts","./node_modules/@ctrl/tinycolor/dist/from-ratio.d.ts","./node_modules/@ctrl/tinycolor/dist/format-input.d.ts","./node_modules/@ctrl/tinycolor/dist/random.d.ts","./node_modules/@ctrl/tinycolor/dist/conversion.d.ts","./node_modules/@ctrl/tinycolor/dist/public_api.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/utils/color.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.vue.d.ts","./node_modules/element-plus/es/components/color-picker-panel/index.d.ts","./node_modules/element-plus/es/components/color-picker/src/color-picker.d.ts","./node_modules/element-plus/es/components/color-picker/src/color-picker.vue.d.ts","./node_modules/element-plus/es/components/color-picker/index.d.ts","./node_modules/element-plus/es/components/message/src/message.vue.d.ts","./node_modules/element-plus/es/components/message/src/message.d.ts","./node_modules/element-plus/es/components/message/index.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog-content.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog.vue.d.ts","./node_modules/element-plus/es/components/dialog/src/use-dialog.d.ts","./node_modules/element-plus/es/components/dialog/src/constants.d.ts","./node_modules/element-plus/es/components/dialog/index.d.ts","./node_modules/element-plus/es/components/link/src/link.d.ts","./node_modules/element-plus/es/components/link/src/link.vue.d.ts","./node_modules/element-plus/es/components/link/index.d.ts","./node_modules/element-plus/es/components/table/src/store/tree.d.ts","./node_modules/element-plus/es/components/table/src/store/index.d.ts","./node_modules/element-plus/es/components/table/src/util.d.ts","./node_modules/element-plus/es/components/table/src/table/defaults.d.ts","./node_modules/element-plus/es/components/table/src/table-column/defaults.d.ts","./node_modules/element-plus/es/components/table/src/table-header/index.d.ts","./node_modules/element-plus/es/components/table/src/table-layout.d.ts","./node_modules/element-plus/es/components/table/src/table.vue.d.ts","./node_modules/element-plus/es/components/table/src/table-column/index.d.ts","./node_modules/element-plus/es/components/table/src/tablecolumn.d.ts","./node_modules/element-plus/es/components/table/index.d.ts","./node_modules/element-plus/es/components/config-provider/src/config-provider-props.d.ts","./node_modules/element-plus/es/components/config-provider/src/config-provider.d.ts","./node_modules/element-plus/es/components/config-provider/src/constants.d.ts","./node_modules/element-plus/es/components/config-provider/src/hooks/use-global-config.d.ts","./node_modules/element-plus/es/components/config-provider/index.d.ts","./node_modules/element-plus/es/components/container/src/container.vue.d.ts","./node_modules/element-plus/es/components/container/src/aside.vue.d.ts","./node_modules/element-plus/es/components/container/src/footer.vue.d.ts","./node_modules/element-plus/es/components/container/src/header.vue.d.ts","./node_modules/element-plus/es/components/container/src/main.vue.d.ts","./node_modules/element-plus/es/components/container/index.d.ts","./node_modules/element-plus/es/components/countdown/src/countdown.d.ts","./node_modules/element-plus/es/components/countdown/src/countdown.vue.d.ts","./node_modules/element-plus/es/components/countdown/index.d.ts","./node_modules/element-plus/es/components/time-picker/src/common/props.d.ts","./node_modules/element-plus/es/components/time-picker/src/time-picker.d.ts","./node_modules/element-plus/es/components/time-picker/src/common/picker.vue.d.ts","./node_modules/element-plus/es/components/time-picker/src/time-picker-com/panel-time-pick.vue.d.ts","./node_modules/element-plus/es/components/time-picker/src/utils.d.ts","./node_modules/element-plus/es/components/time-picker/src/composables/use-common-picker.d.ts","./node_modules/element-plus/es/components/time-picker/src/constants.d.ts","./node_modules/element-plus/es/components/time-picker/index.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/date-picker-panel.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/constants.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/types.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/props/date-picker-panel.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/instance.d.ts","./node_modules/element-plus/es/components/date-picker-panel/index.d.ts","./node_modules/element-plus/es/components/date-picker/src/date-picker.d.ts","./node_modules/element-plus/es/components/date-picker/src/props.d.ts","./node_modules/element-plus/es/components/date-picker/src/instance.d.ts","./node_modules/element-plus/es/components/date-picker/index.d.ts","./node_modules/element-plus/es/components/descriptions/src/description.d.ts","./node_modules/element-plus/es/components/descriptions/src/description.vue.d.ts","./node_modules/element-plus/es/components/descriptions/src/description-item.d.ts","./node_modules/element-plus/es/components/descriptions/index.d.ts","./node_modules/element-plus/es/components/divider/src/divider.d.ts","./node_modules/element-plus/es/components/divider/src/divider.vue.d.ts","./node_modules/element-plus/es/components/divider/index.d.ts","./node_modules/element-plus/es/components/drawer/src/drawer.d.ts","./node_modules/element-plus/es/components/drawer/src/drawer.vue.d.ts","./node_modules/element-plus/es/components/drawer/index.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown-item.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown-menu.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown.d.ts","./node_modules/element-plus/es/components/dropdown/src/instance.d.ts","./node_modules/element-plus/es/components/dropdown/src/tokens.d.ts","./node_modules/element-plus/es/components/dropdown/index.d.ts","./node_modules/element-plus/es/components/empty/src/empty.d.ts","./node_modules/element-plus/es/components/empty/src/empty.vue.d.ts","./node_modules/element-plus/es/components/empty/src/instance.d.ts","./node_modules/element-plus/es/components/empty/index.d.ts","./node_modules/async-validator/dist-types/interface.d.ts","./node_modules/async-validator/dist-types/index.d.ts","./node_modules/element-plus/es/components/form/src/utils.d.ts","./node_modules/element-plus/es/components/form/src/types.d.ts","./node_modules/element-plus/es/components/form/src/form-item.d.ts","./node_modules/element-plus/es/components/form/src/form.d.ts","./node_modules/element-plus/es/components/form/src/form.vue.d.ts","./node_modules/element-plus/es/components/form/src/form-item.vue.d.ts","./node_modules/element-plus/es/components/form/src/constants.d.ts","./node_modules/element-plus/es/components/form/src/hooks/use-form-common-props.d.ts","./node_modules/element-plus/es/components/form/src/hooks/use-form-item.d.ts","./node_modules/element-plus/es/components/form/src/hooks/index.d.ts","./node_modules/element-plus/es/components/form/index.d.ts","./node_modules/element-plus/es/components/icon/src/icon.d.ts","./node_modules/element-plus/es/components/icon/src/icon.vue.d.ts","./node_modules/element-plus/es/components/icon/index.d.ts","./node_modules/element-plus/es/components/image/src/image.d.ts","./node_modules/element-plus/es/components/image-viewer/src/image-viewer.d.ts","./node_modules/element-plus/es/components/image-viewer/src/image-viewer.vue.d.ts","./node_modules/element-plus/es/components/image-viewer/index.d.ts","./node_modules/element-plus/es/components/image/src/image.vue.d.ts","./node_modules/element-plus/es/components/image/index.d.ts","./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","./node_modules/element-plus/es/components/input-number/src/input-number.vue.d.ts","./node_modules/element-plus/es/components/input-number/index.d.ts","./node_modules/element-plus/es/components/input-tag/src/input-tag.d.ts","./node_modules/element-plus/es/components/input-tag/src/input-tag.vue.d.ts","./node_modules/element-plus/es/components/input-tag/src/instance.d.ts","./node_modules/element-plus/es/components/input-tag/index.d.ts","./node_modules/element-plus/es/components/menu/src/types.d.ts","./node_modules/element-plus/es/components/menu/src/menu.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item.vue.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item-group.vue.d.ts","./node_modules/element-plus/es/components/menu/src/sub-menu.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item-group.d.ts","./node_modules/element-plus/es/components/menu/src/instance.d.ts","./node_modules/element-plus/es/components/menu/src/tokens.d.ts","./node_modules/element-plus/es/components/menu/index.d.ts","./node_modules/element-plus/es/components/overlay/src/overlay.d.ts","./node_modules/element-plus/es/components/overlay/index.d.ts","./node_modules/element-plus/es/components/page-header/src/page-header.d.ts","./node_modules/element-plus/es/components/page-header/src/page-header.vue.d.ts","./node_modules/element-plus/es/components/page-header/index.d.ts","./node_modules/element-plus/es/components/pagination/src/pagination.d.ts","./node_modules/element-plus/es/components/pagination/src/constants.d.ts","./node_modules/element-plus/es/components/pagination/index.d.ts","./node_modules/element-plus/es/components/popconfirm/src/popconfirm.d.ts","./node_modules/element-plus/es/components/popconfirm/src/popconfirm.vue.d.ts","./node_modules/element-plus/es/components/popconfirm/index.d.ts","./node_modules/element-plus/es/components/progress/src/progress.d.ts","./node_modules/element-plus/es/components/progress/src/progress.vue.d.ts","./node_modules/element-plus/es/components/progress/index.d.ts","./node_modules/element-plus/es/components/radio/src/radio.d.ts","./node_modules/element-plus/es/components/radio/src/radio.vue.d.ts","./node_modules/element-plus/es/components/radio/src/radio-button.d.ts","./node_modules/element-plus/es/components/radio/src/radio-button.vue.d.ts","./node_modules/element-plus/es/components/radio/src/radio-group.d.ts","./node_modules/element-plus/es/components/radio/src/radio-group.vue.d.ts","./node_modules/element-plus/es/components/radio/src/constants.d.ts","./node_modules/element-plus/es/components/radio/index.d.ts","./node_modules/element-plus/es/components/rate/src/rate.d.ts","./node_modules/element-plus/es/components/rate/src/rate.vue.d.ts","./node_modules/element-plus/es/components/rate/index.d.ts","./node_modules/element-plus/es/components/result/src/result.d.ts","./node_modules/element-plus/es/components/result/src/result.vue.d.ts","./node_modules/element-plus/es/components/result/index.d.ts","./node_modules/element-plus/es/components/row/src/row.d.ts","./node_modules/element-plus/es/components/row/src/row.vue.d.ts","./node_modules/element-plus/es/components/row/src/constants.d.ts","./node_modules/element-plus/es/components/row/index.d.ts","./node_modules/element-plus/es/components/scrollbar/src/scrollbar.d.ts","./node_modules/element-plus/es/components/scrollbar/src/scrollbar.vue.d.ts","./node_modules/element-plus/es/components/scrollbar/src/thumb.vue.d.ts","./node_modules/element-plus/es/components/scrollbar/src/thumb.d.ts","./node_modules/element-plus/es/components/scrollbar/src/util.d.ts","./node_modules/element-plus/es/components/scrollbar/src/constants.d.ts","./node_modules/element-plus/es/components/scrollbar/index.d.ts","./node_modules/element-plus/es/components/select-v2/src/select.types.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-list.d.ts","./node_modules/element-plus/es/components/virtual-list/src/defaults.d.ts","./node_modules/element-plus/es/components/virtual-list/src/types.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-list.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-grid.d.ts","./node_modules/memoize-one/dist/memoize-one.d.ts","./node_modules/element-plus/es/components/virtual-list/src/hooks/use-cache.d.ts","./node_modules/element-plus/es/components/virtual-list/src/props.d.ts","./node_modules/element-plus/es/components/virtual-list/src/builders/build-grid.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-grid.d.ts","./node_modules/element-plus/es/components/virtual-list/index.d.ts","./node_modules/element-plus/es/components/select-v2/src/select-dropdown.d.ts","./node_modules/element-plus/es/components/select-v2/src/select.vue.d.ts","./node_modules/element-plus/es/components/select-v2/src/defaults.d.ts","./node_modules/element-plus/es/components/select-v2/src/token.d.ts","./node_modules/element-plus/es/components/select-v2/src/useprops.d.ts","./node_modules/element-plus/es/components/select/src/select.d.ts","./node_modules/element-plus/es/components/select/src/option.d.ts","./node_modules/element-plus/es/components/select/src/type.d.ts","./node_modules/element-plus/es/components/select/src/select.vue.d.ts","./node_modules/element-plus/es/components/select/src/option.vue.d.ts","./node_modules/element-plus/es/components/select/src/option-group.vue.d.ts","./node_modules/element-plus/es/components/select/src/token.d.ts","./node_modules/element-plus/es/components/select/index.d.ts","./node_modules/element-plus/es/components/select-v2/index.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton.vue.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton-item.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton-item.vue.d.ts","./node_modules/element-plus/es/components/skeleton/index.d.ts","./node_modules/element-plus/es/components/slider/src/slider.vue.d.ts","./node_modules/element-plus/es/components/slider/src/marker.d.ts","./node_modules/element-plus/es/components/slider/src/slider.d.ts","./node_modules/element-plus/es/components/slider/src/constants.d.ts","./node_modules/element-plus/es/components/slider/index.d.ts","./node_modules/element-plus/es/components/space/src/space.d.ts","./node_modules/element-plus/es/components/space/src/item.d.ts","./node_modules/element-plus/es/components/space/src/use-space.d.ts","./node_modules/element-plus/es/components/space/index.d.ts","./node_modules/element-plus/es/components/statistic/src/statistic.d.ts","./node_modules/element-plus/es/components/statistic/src/statistic.vue.d.ts","./node_modules/element-plus/es/components/statistic/index.d.ts","./node_modules/element-plus/es/components/steps/src/steps.d.ts","./node_modules/element-plus/es/components/steps/src/steps.vue.d.ts","./node_modules/element-plus/es/components/steps/src/item.d.ts","./node_modules/element-plus/es/components/steps/src/item.vue.d.ts","./node_modules/element-plus/es/components/steps/src/tokens.d.ts","./node_modules/element-plus/es/components/steps/index.d.ts","./node_modules/element-plus/es/components/switch/src/switch.d.ts","./node_modules/element-plus/es/components/switch/src/switch.vue.d.ts","./node_modules/element-plus/es/components/switch/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/constants.d.ts","./node_modules/element-plus/es/components/table-v2/src/types.d.ts","./node_modules/element-plus/es/components/table-v2/src/common.d.ts","./node_modules/element-plus/es/components/table-v2/src/row.d.ts","./node_modules/element-plus/es/components/table-v2/src/grid.d.ts","./node_modules/element-plus/es/components/table-v2/src/table.d.ts","./node_modules/element-plus/es/components/table-v2/src/table-grid.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-scrollbar.d.ts","./node_modules/element-plus/es/components/table-v2/src/table-v2.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/auto-resizer.d.ts","./node_modules/element-plus/es/components/table-v2/src/auto-resizer.d.ts","./node_modules/element-plus/es/components/table-v2/src/private.d.ts","./node_modules/element-plus/es/components/table-v2/src/cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/header-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/header.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-columns.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/row.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/sort-icon.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/expand-icon.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-data.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-styles.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-auto-resize.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/use-table.d.ts","./node_modules/element-plus/es/components/table-v2/src/renderers/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/index.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-pane.vue.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-pane.d.ts","./node_modules/element-plus/es/components/tabs/src/constants.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-bar.vue.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-bar.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-nav.d.ts","./node_modules/element-plus/es/components/tabs/src/tabs.d.ts","./node_modules/element-plus/es/components/tabs/index.d.ts","./node_modules/element-plus/es/components/text/src/text.d.ts","./node_modules/element-plus/es/components/text/src/text.vue.d.ts","./node_modules/element-plus/es/components/text/index.d.ts","./node_modules/element-plus/es/components/time-select/src/time-select.d.ts","./node_modules/element-plus/es/components/time-select/src/time-select.vue.d.ts","./node_modules/element-plus/es/components/time-select/index.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline-item.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline-item.vue.d.ts","./node_modules/element-plus/es/components/timeline/src/tokens.d.ts","./node_modules/element-plus/es/components/timeline/index.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer-panel.vue.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer-panel.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer.vue.d.ts","./node_modules/element-plus/es/components/transfer/index.d.ts","./node_modules/element-plus/es/components/tree/src/tree.d.ts","./node_modules/element-plus/es/components/tree/src/model/usedragnode.d.ts","./node_modules/element-plus/es/components/tree/src/tree.type.d.ts","./node_modules/element-plus/es/components/tree/src/model/tree-store.d.ts","./node_modules/element-plus/es/components/tree/src/model/node.d.ts","./node_modules/element-plus/es/components/tree/src/tree.vue.d.ts","./node_modules/element-plus/es/components/tree/src/instance.d.ts","./node_modules/element-plus/es/components/tree/src/tokens.d.ts","./node_modules/element-plus/es/components/tree/index.d.ts","./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","./node_modules/element-plus/es/components/tree-select/src/instance.d.ts","./node_modules/element-plus/es/components/tree-select/index.d.ts","./node_modules/element-plus/es/components/tree-v2/src/types.d.ts","./node_modules/element-plus/es/components/tree-v2/src/virtual-tree.d.ts","./node_modules/element-plus/es/components/tree-v2/src/tree.vue.d.ts","./node_modules/element-plus/es/components/tree-v2/src/instance.d.ts","./node_modules/element-plus/es/components/tree-v2/index.d.ts","./node_modules/element-plus/es/components/upload/src/ajax.d.ts","./node_modules/element-plus/es/components/upload/src/upload.d.ts","./node_modules/element-plus/es/components/upload/src/upload.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-content.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-content.d.ts","./node_modules/element-plus/es/components/upload/src/upload-list.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-list.d.ts","./node_modules/element-plus/es/components/upload/src/upload-dragger.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-dragger.d.ts","./node_modules/element-plus/es/components/upload/src/constants.d.ts","./node_modules/element-plus/es/components/upload/index.d.ts","./node_modules/element-plus/es/components/watermark/src/watermark.d.ts","./node_modules/element-plus/es/components/watermark/src/watermark.vue.d.ts","./node_modules/element-plus/es/components/watermark/index.d.ts","./node_modules/element-plus/es/components/tour/src/content.d.ts","./node_modules/element-plus/es/components/tour/src/types.d.ts","./node_modules/element-plus/es/components/tour/src/tour.d.ts","./node_modules/element-plus/es/components/tour/src/tour.vue.d.ts","./node_modules/element-plus/es/components/tour/src/step.d.ts","./node_modules/element-plus/es/components/tour/src/step.vue.d.ts","./node_modules/element-plus/es/components/tour/index.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor.vue.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor-link.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor-link.vue.d.ts","./node_modules/element-plus/es/components/anchor/index.d.ts","./node_modules/element-plus/es/components/segmented/src/types.d.ts","./node_modules/element-plus/es/components/segmented/src/segmented.vue.d.ts","./node_modules/element-plus/es/components/segmented/src/segmented.d.ts","./node_modules/element-plus/es/components/segmented/index.d.ts","./node_modules/element-plus/es/components/mention/src/types.d.ts","./node_modules/element-plus/es/components/mention/src/helper.d.ts","./node_modules/element-plus/es/components/mention/src/mention.d.ts","./node_modules/element-plus/es/components/mention/src/mention.vue.d.ts","./node_modules/element-plus/es/components/mention/index.d.ts","./node_modules/element-plus/es/components/splitter/src/type.d.ts","./node_modules/element-plus/es/components/splitter/src/splitter.d.ts","./node_modules/element-plus/es/components/splitter/src/splitter.vue.d.ts","./node_modules/element-plus/es/components/splitter/src/split-panel.d.ts","./node_modules/element-plus/es/components/splitter/src/split-panel.vue.d.ts","./node_modules/element-plus/es/components/splitter/index.d.ts","./node_modules/element-plus/es/components/infinite-scroll/src/index.d.ts","./node_modules/element-plus/es/components/infinite-scroll/index.d.ts","./node_modules/element-plus/es/components/loading/src/types.d.ts","./node_modules/element-plus/es/components/loading/src/loading.d.ts","./node_modules/element-plus/es/components/loading/src/service.d.ts","./node_modules/element-plus/es/components/loading/src/directive.d.ts","./node_modules/element-plus/es/components/loading/index.d.ts","./node_modules/element-plus/es/components/message-box/src/message-box.type.d.ts","./node_modules/element-plus/es/components/message-box/src/messagebox.d.ts","./node_modules/element-plus/es/components/message-box/index.d.ts","./node_modules/element-plus/es/components/notification/src/notification.vue.d.ts","./node_modules/element-plus/es/components/notification/src/notification.d.ts","./node_modules/element-plus/es/components/notification/index.d.ts","./node_modules/element-plus/es/components/popover/src/popover.d.ts","./node_modules/element-plus/es/components/popover/src/popover.vue.d.ts","./node_modules/element-plus/es/components/popover/src/directive.d.ts","./node_modules/element-plus/es/components/popover/index.d.ts","./node_modules/element-plus/es/components/index.d.ts","./node_modules/element-plus/es/defaults.d.ts","./node_modules/element-plus/es/directives/click-outside/index.d.ts","./node_modules/element-plus/es/directives/repeat-click/index.d.ts","./node_modules/element-plus/es/directives/trap-focus/index.d.ts","./node_modules/normalize-wheel-es/index.d.ts","./node_modules/element-plus/es/directives/mousewheel/index.d.ts","./node_modules/element-plus/es/directives/index.d.ts","./node_modules/element-plus/es/make-installer.d.ts","./node_modules/element-plus/es/index.d.ts","./src/utils/feedback.ts","./src/layout/default/components/header/user-drop-down.vue","./src/layout/default/components/header/index.vue","./src/layout/default/components/main.vue","./src/layout/default/components/sidebar/logo.vue","./src/utils/util.ts","./src/layout/default/components/sidebar/menu-item.vue","./src/layout/default/components/sidebar/menu.vue","./src/layout/default/components/sidebar/side.vue","./src/layout/default/components/sidebar/index.vue","./src/layout/default/index.vue","./src/views/error/components/error.vue","./src/views/error/404.vue","./src/views/error/403.vue","./node_modules/@element-plus/icons-vue/dist/types/components/add-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/aim.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/alarm-clock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/apple.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-down-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-down.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-left-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-right-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-up-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/avatar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/back.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/baseball.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/basketball.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bell-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bell.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bicycle.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bowl.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/briefcase.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/brush-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/brush.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/burger.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/calendar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/camera-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/camera.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-bottom.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-top.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cellphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-line-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-line-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/check.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cherry.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chicken.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chrome-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-check-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-check.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-close-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-close.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-plus-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/clock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/close-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/close.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coffee-cup.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coffee.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coin.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cold-drink.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/collection-tag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/collection.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/comment.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/compass.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/connection.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coordinate.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/copy-document.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cpu.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/credit-card.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/crop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-caret.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-analysis.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-board.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-line.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dessert.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/discount.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dish-dot.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dish.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-add.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-copy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/download.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/drizzling.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/edit-pen.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/edit.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/eleme-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/eleme.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/element-plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/expand.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/failed.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/female.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/files.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/film.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/filter.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/finished.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/first-aid-kit.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/flag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-add.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-opened.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/food.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/football.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fork-spoon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fries.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/full-screen.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-square-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/gold-medal.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goods-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goods.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/grape.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/grid.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/guide.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/handbag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/headset.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/help-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/help.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/hide.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/histogram.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/home-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/hot-water.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/house.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-drink.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-tea.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/info-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/iphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/key.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/knife-fork.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lightning.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/link.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/list.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/loading.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location-information.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lollipop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/magic-stick.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/magnet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/male.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/management.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/map-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/medal.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/memo.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/menu.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/message-box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/message.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mic.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/microphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/milk-tea.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/minus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/money.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/monitor.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/moon-night.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/moon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/more-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/more.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mostly-cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mouse.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mug.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mute-notification.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mute.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/no-smoking.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/notebook.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/notification.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/odometer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/office-building.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/open.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/operation.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/opportunity.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/orange.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/paperclip.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/partly-cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pear.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/phone-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/phone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture-rounded.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pie-chart.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/place.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/platform.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pointer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/position.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/postcard.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pouring.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/present.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/price-tag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/printer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/promotion.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/quartz-watch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/question-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/rank.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/reading-lamp.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/reading.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refrigerator.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/remove-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/scale-to-original.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/school.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/scissor.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/search.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/select.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sell.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/semi-select.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/service.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/set-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/setting.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/share.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ship.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-bag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-trolley.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/smoking.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/soccer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sold-out.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort-down.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/stamp.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/star-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/star.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/stopwatch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/success-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sugar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/suitcase-line.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/suitcase.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunny.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunrise.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunset.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch-button.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/takeaway-box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ticket.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/tickets.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/timer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/toilet-paper.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/tools.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trend-charts.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trophy-base.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trophy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/turn-off.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/umbrella.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/unlock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/upload-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/upload.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/user-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/user.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/van.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-camera-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-camera.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-pause.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-play.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/view.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wallet-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wallet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warn-triangle-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warning-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warning.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/watch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/watermelon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wind-power.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/zoom-in.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/zoom-out.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/index.d.ts","./node_modules/@element-plus/icons-vue/dist/types/index.d.ts","./src/hooks/uselockfn.ts","./src/layout/components/footer.vue","./src/views/account/login.vue","./src/views/account/change-password.vue","./src/utils/wecomoauthpostmessage.ts","./src/views/account/bind-work-wechat.vue","./src/views/user/setting.vue","./src/api/doctor.ts","./src/views/doctor/progress.vue","./src/api/decoration.ts","./src/views/decoration/component/widgets/index.ts","./src/views/decoration/component/pages/preview-pc.vue","./src/views/decoration/pc_details.vue","./src/api/fans.ts","./src/views/fans/h5.vue","./src/api/tcm.ts","./src/api/channel/weapp.ts","./src/utils/perm.ts","./node_modules/echarts/types/dist/echarts.d.ts","./node_modules/echarts/index.d.ts","./src/views/tcm/diagnosis/components/bloodrecordlist.vue","./src/views/tcm/diagnosis/components/dietrecordlist.vue","./src/views/tcm/diagnosis/components/exerciserecordlist.vue","./src/views/tcm/diagnosis/components/caserecordlist.vue","./src/views/tcm/diagnosis/components/callrecordpanel.vue","./src/utils/im-business-message-parse.ts","./src/views/tcm/diagnosis/components/imchatrecordpanel.vue","./src/views/tcm/diagnosis/components/assignlogpanel.vue","./src/views/tcm/diagnosis/components/appointmentrecordpanel.vue","./src/api/medicine.ts","./src/components/medicine-name-select/index.vue","./src/utils/diabetes-discovery-display.ts","./node_modules/html2canvas/dist/types/core/logger.d.ts","./node_modules/html2canvas/dist/types/core/cache-storage.d.ts","./node_modules/html2canvas/dist/types/core/context.d.ts","./node_modules/html2canvas/dist/types/css/layout/bounds.d.ts","./node_modules/html2canvas/dist/types/dom/document-cloner.d.ts","./node_modules/html2canvas/dist/types/css/syntax/tokenizer.d.ts","./node_modules/html2canvas/dist/types/css/syntax/parser.d.ts","./node_modules/html2canvas/dist/types/css/types/index.d.ts","./node_modules/html2canvas/dist/types/css/ipropertydescriptor.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-clip.d.ts","./node_modules/html2canvas/dist/types/css/itypedescriptor.d.ts","./node_modules/html2canvas/dist/types/css/types/color.d.ts","./node_modules/html2canvas/dist/types/css/types/length-percentage.d.ts","./node_modules/html2canvas/dist/types/css/types/image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-origin.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-position.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-repeat.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-size.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-radius.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-style.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-width.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/direction.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/display.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/float.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/letter-spacing.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/line-break.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-position.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-type.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/overflow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/overflow-wrap.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-align.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/position.d.ts","./node_modules/html2canvas/dist/types/css/types/length.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-shadow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-transform.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/transform.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/transform-origin.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/visibility.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/word-break.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/z-index.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/opacity.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-line.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-family.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-weight.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-variant.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-style.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/content.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/counter-increment.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/counter-reset.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/duration.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/quotes.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/box-shadow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/paint-order.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts","./node_modules/html2canvas/dist/types/css/index.d.ts","./node_modules/html2canvas/dist/types/css/layout/text.d.ts","./node_modules/html2canvas/dist/types/dom/text-container.d.ts","./node_modules/html2canvas/dist/types/dom/element-container.d.ts","./node_modules/html2canvas/dist/types/render/vector.d.ts","./node_modules/html2canvas/dist/types/render/bezier-curve.d.ts","./node_modules/html2canvas/dist/types/render/path.d.ts","./node_modules/html2canvas/dist/types/render/bound-curves.d.ts","./node_modules/html2canvas/dist/types/render/effects.d.ts","./node_modules/html2canvas/dist/types/render/stacking-context.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/canvas-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/image-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/svg-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/index.d.ts","./node_modules/html2canvas/dist/types/render/renderer.d.ts","./node_modules/html2canvas/dist/types/render/canvas/canvas-renderer.d.ts","./node_modules/html2canvas/dist/types/index.d.ts","./node_modules/jspdf/types/index.d.ts","./src/components/tcm-prescription/index.vue","./src/utils/diagnosis-sync-events.ts","./src/views/tcm/diagnosis/edit.vue","./src/views/tcm/diagnosis/detail.vue","./node_modules/dayjs/plugin/isoweek.d.ts","./src/views/tcm/diagnosis/appointment.vue","./src/views/tcm/diagnosis/index_h5.vue","./src/router/routes.ts","./src/router/index.ts","./src/utils/request/cancel.ts","./src/utils/request/type.d.ts","./src/utils/request/axios.ts","./src/utils/wecombindguard.ts","./src/utils/request/index.ts","./src/api/app.ts","./src/stores/modules/app.ts","./src/api/chat.ts","./src/components/chat-notify-toast/index.vue","./src/app.vue","./src/permission.ts","./src/install/index.ts","./src/main.ts","./src/api/article.ts","./src/api/consumer.ts","./src/api/file.ts","./src/api/finance.ts","./src/api/message.ts","./src/api/order.ts","./src/api/qywx-msg.ts","./src/api/qywx.ts","./src/api/stats.ts","./src/api/app/recharge.ts","./src/api/channel/h5.ts","./src/api/channel/open_setting.ts","./src/api/channel/wx_oa.ts","./src/api/org/department.ts","./src/api/org/post.ts","./src/api/perms/admin.ts","./src/api/perms/menu.ts","./src/api/perms/role.ts","./src/api/setting/dict.ts","./src/api/setting/pay.ts","./src/api/setting/search.ts","./src/api/setting/storage.ts","./src/api/setting/user.ts","./src/api/setting/website.ts","./src/api/tools/code.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/chat.vue.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/chatheader.vue.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/hooks/usechatheader.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/login.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/loginstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/avatar.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/constants/avatar.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/userpicker/type.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/userpicker/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/basecomp/view/view.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/basecomp/view/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/chatsetting/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/uikitmodalstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/type.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/uikitmodal.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/useroommodal/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/base.d.ts","./node_modules/@tencentcloud/tuiroom-engine-js/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/tuiroom-engine-js/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/device.d.ts","./node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/message.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/useofflinepushinfo.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/engine.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/search.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/contact.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/conversation.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/call.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/chatsetting.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/live.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/stream.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/videomixer.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/audience.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/seat.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/monitor.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/coguest.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/cohost.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/battle.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/barrage.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/room.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/participant.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/beauty.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/virtualbackground.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/user.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/devicestate/devicestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/devicestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useroomengine.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/audiosettingpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/videosettingpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/rtc.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/barragestate/barragestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/barragestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/battlestate/battlestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/battlestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cogueststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/cohoststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveaudiencestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/liveliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/livemonitorstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/utils/eventcenter.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveseatstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/videomixerstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/barrageinputh5.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barragelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/coguestpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/cohostpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/liveaudiencelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/livemonitorview.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livescenepanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/liveview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/streammixer/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/live/live.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/asr.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/asrstate/asrstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/freebeautystate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/roomparticipantstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/roomstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/virtualbackgroundstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/scheduleroompanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/virtualbackgroundpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/freebeautypanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/room/room.d.ts","./node_modules/tuikit-atomicx-vue3/dist/i18n/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/contactlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/conversationlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/messageinput/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/usemessageactions.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/messagelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/search/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/c2csettingstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/contactliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/conversationliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/groupsettingstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/messageactionstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/type.d.ts","./node_modules/orderedmap/dist/index.d.ts","./node_modules/prosemirror-model/dist/index.d.ts","./node_modules/prosemirror-transform/dist/index.d.ts","./node_modules/prosemirror-view/dist/index.d.ts","./node_modules/prosemirror-state/dist/index.d.ts","./node_modules/@tiptap/pm/state/dist/index.d.ts","./node_modules/@tiptap/pm/model/dist/index.d.ts","./node_modules/@tiptap/pm/view/dist/index.d.ts","./node_modules/@tiptap/core/dist/eventemitter.d.ts","./node_modules/@tiptap/pm/transform/dist/index.d.ts","./node_modules/@tiptap/core/dist/inputrule.d.ts","./node_modules/@tiptap/core/dist/pasterule.d.ts","./node_modules/@tiptap/core/dist/node.d.ts","./node_modules/@tiptap/core/dist/mark.d.ts","./node_modules/@tiptap/core/dist/extension.d.ts","./node_modules/@tiptap/core/dist/types.d.ts","./node_modules/@tiptap/core/dist/extensionmanager.d.ts","./node_modules/@tiptap/core/dist/nodepos.d.ts","./node_modules/@tiptap/core/dist/extensions/clipboardtextserializer.d.ts","./node_modules/@tiptap/core/dist/commands/blur.d.ts","./node_modules/@tiptap/core/dist/commands/clearcontent.d.ts","./node_modules/@tiptap/core/dist/commands/clearnodes.d.ts","./node_modules/@tiptap/core/dist/commands/command.d.ts","./node_modules/@tiptap/core/dist/commands/createparagraphnear.d.ts","./node_modules/@tiptap/core/dist/commands/cut.d.ts","./node_modules/@tiptap/core/dist/commands/deletecurrentnode.d.ts","./node_modules/@tiptap/core/dist/commands/deletenode.d.ts","./node_modules/@tiptap/core/dist/commands/deleterange.d.ts","./node_modules/@tiptap/core/dist/commands/deleteselection.d.ts","./node_modules/@tiptap/core/dist/commands/enter.d.ts","./node_modules/@tiptap/core/dist/commands/exitcode.d.ts","./node_modules/@tiptap/core/dist/commands/extendmarkrange.d.ts","./node_modules/@tiptap/core/dist/commands/first.d.ts","./node_modules/@tiptap/core/dist/commands/focus.d.ts","./node_modules/@tiptap/core/dist/commands/foreach.d.ts","./node_modules/@tiptap/core/dist/commands/insertcontent.d.ts","./node_modules/@tiptap/core/dist/commands/insertcontentat.d.ts","./node_modules/@tiptap/core/dist/commands/join.d.ts","./node_modules/@tiptap/core/dist/commands/joinitembackward.d.ts","./node_modules/@tiptap/core/dist/commands/joinitemforward.d.ts","./node_modules/@tiptap/core/dist/commands/jointextblockbackward.d.ts","./node_modules/@tiptap/core/dist/commands/jointextblockforward.d.ts","./node_modules/@tiptap/core/dist/commands/keyboardshortcut.d.ts","./node_modules/@tiptap/core/dist/commands/lift.d.ts","./node_modules/@tiptap/core/dist/commands/liftemptyblock.d.ts","./node_modules/@tiptap/core/dist/commands/liftlistitem.d.ts","./node_modules/@tiptap/core/dist/commands/newlineincode.d.ts","./node_modules/@tiptap/core/dist/commands/resetattributes.d.ts","./node_modules/@tiptap/core/dist/commands/scrollintoview.d.ts","./node_modules/@tiptap/core/dist/commands/selectall.d.ts","./node_modules/@tiptap/core/dist/commands/selectnodebackward.d.ts","./node_modules/@tiptap/core/dist/commands/selectnodeforward.d.ts","./node_modules/@tiptap/core/dist/commands/selectparentnode.d.ts","./node_modules/@tiptap/core/dist/commands/selecttextblockend.d.ts","./node_modules/@tiptap/core/dist/commands/selecttextblockstart.d.ts","./node_modules/@tiptap/core/dist/commands/setcontent.d.ts","./node_modules/@tiptap/core/dist/commands/setmark.d.ts","./node_modules/@tiptap/core/dist/commands/setmeta.d.ts","./node_modules/@tiptap/core/dist/commands/setnode.d.ts","./node_modules/@tiptap/core/dist/commands/setnodeselection.d.ts","./node_modules/@tiptap/core/dist/commands/settextselection.d.ts","./node_modules/@tiptap/core/dist/commands/sinklistitem.d.ts","./node_modules/@tiptap/core/dist/commands/splitblock.d.ts","./node_modules/@tiptap/core/dist/commands/splitlistitem.d.ts","./node_modules/@tiptap/core/dist/commands/togglelist.d.ts","./node_modules/@tiptap/core/dist/commands/togglemark.d.ts","./node_modules/@tiptap/core/dist/commands/togglenode.d.ts","./node_modules/@tiptap/core/dist/commands/togglewrap.d.ts","./node_modules/@tiptap/core/dist/commands/undoinputrule.d.ts","./node_modules/@tiptap/core/dist/commands/unsetallmarks.d.ts","./node_modules/@tiptap/core/dist/commands/unsetmark.d.ts","./node_modules/@tiptap/core/dist/commands/updateattributes.d.ts","./node_modules/@tiptap/core/dist/commands/wrapin.d.ts","./node_modules/@tiptap/core/dist/commands/wrapinlist.d.ts","./node_modules/@tiptap/core/dist/commands/index.d.ts","./node_modules/@tiptap/core/dist/extensions/commands.d.ts","./node_modules/@tiptap/core/dist/extensions/drop.d.ts","./node_modules/@tiptap/core/dist/extensions/editable.d.ts","./node_modules/@tiptap/core/dist/extensions/focusevents.d.ts","./node_modules/@tiptap/core/dist/extensions/keymap.d.ts","./node_modules/@tiptap/core/dist/extensions/paste.d.ts","./node_modules/@tiptap/core/dist/extensions/tabindex.d.ts","./node_modules/@tiptap/core/dist/extensions/index.d.ts","./node_modules/@tiptap/core/dist/editor.d.ts","./node_modules/@tiptap/core/dist/commandmanager.d.ts","./node_modules/@tiptap/core/dist/helpers/combinetransactionsteps.d.ts","./node_modules/@tiptap/core/dist/helpers/createchainablestate.d.ts","./node_modules/@tiptap/core/dist/helpers/createdocument.d.ts","./node_modules/@tiptap/core/dist/helpers/createnodefromcontent.d.ts","./node_modules/@tiptap/core/dist/helpers/defaultblockat.d.ts","./node_modules/@tiptap/core/dist/helpers/findchildren.d.ts","./node_modules/@tiptap/core/dist/helpers/findchildreninrange.d.ts","./node_modules/@tiptap/core/dist/helpers/findparentnode.d.ts","./node_modules/@tiptap/core/dist/helpers/findparentnodeclosesttopos.d.ts","./node_modules/@tiptap/core/dist/helpers/generatehtml.d.ts","./node_modules/@tiptap/core/dist/helpers/generatejson.d.ts","./node_modules/@tiptap/core/dist/helpers/generatetext.d.ts","./node_modules/@tiptap/core/dist/helpers/getattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getattributesfromextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/getchangedranges.d.ts","./node_modules/@tiptap/core/dist/helpers/getdebugjson.d.ts","./node_modules/@tiptap/core/dist/helpers/getextensionfield.d.ts","./node_modules/@tiptap/core/dist/helpers/gethtmlfromfragment.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarkattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarkrange.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarksbetween.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarktype.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodeatposition.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodeattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodetype.d.ts","./node_modules/@tiptap/core/dist/helpers/getrenderedattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getschema.d.ts","./node_modules/@tiptap/core/dist/helpers/getschemabyresolvedextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/getschematypebyname.d.ts","./node_modules/@tiptap/core/dist/helpers/getschematypenamebyname.d.ts","./node_modules/@tiptap/core/dist/helpers/getsplittedattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/gettext.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextbetween.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextcontentfromnodes.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextserializersfromschema.d.ts","./node_modules/@tiptap/core/dist/helpers/injectextensionattributestoparserule.d.ts","./node_modules/@tiptap/core/dist/helpers/isactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isatendofnode.d.ts","./node_modules/@tiptap/core/dist/helpers/isatstartofnode.d.ts","./node_modules/@tiptap/core/dist/helpers/isextensionrulesenabled.d.ts","./node_modules/@tiptap/core/dist/helpers/islist.d.ts","./node_modules/@tiptap/core/dist/helpers/ismarkactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeempty.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeselection.d.ts","./node_modules/@tiptap/core/dist/helpers/istextselection.d.ts","./node_modules/@tiptap/core/dist/helpers/postodomrect.d.ts","./node_modules/@tiptap/core/dist/helpers/resolvefocusposition.d.ts","./node_modules/@tiptap/core/dist/helpers/rewriteunknowncontent.d.ts","./node_modules/@tiptap/core/dist/helpers/selectiontoinsertionend.d.ts","./node_modules/@tiptap/core/dist/helpers/splitextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/index.d.ts","./node_modules/@tiptap/core/dist/inputrules/markinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/nodeinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/textblocktypeinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/textinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/wrappinginputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/index.d.ts","./node_modules/@tiptap/core/dist/nodeview.d.ts","./node_modules/@tiptap/core/dist/pasterules/markpasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/nodepasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/textpasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/index.d.ts","./node_modules/@tiptap/core/dist/tracker.d.ts","./node_modules/@tiptap/core/dist/utilities/callorreturn.d.ts","./node_modules/@tiptap/core/dist/utilities/caninsertnode.d.ts","./node_modules/@tiptap/core/dist/utilities/createstyletag.d.ts","./node_modules/@tiptap/core/dist/utilities/deleteprops.d.ts","./node_modules/@tiptap/core/dist/utilities/elementfromstring.d.ts","./node_modules/@tiptap/core/dist/utilities/escapeforregex.d.ts","./node_modules/@tiptap/core/dist/utilities/findduplicates.d.ts","./node_modules/@tiptap/core/dist/utilities/fromstring.d.ts","./node_modules/@tiptap/core/dist/utilities/isemptyobject.d.ts","./node_modules/@tiptap/core/dist/utilities/isfunction.d.ts","./node_modules/@tiptap/core/dist/utilities/isios.d.ts","./node_modules/@tiptap/core/dist/utilities/ismacos.d.ts","./node_modules/@tiptap/core/dist/utilities/isnumber.d.ts","./node_modules/@tiptap/core/dist/utilities/isplainobject.d.ts","./node_modules/@tiptap/core/dist/utilities/isregexp.d.ts","./node_modules/@tiptap/core/dist/utilities/issafari.d.ts","./node_modules/@tiptap/core/dist/utilities/isstring.d.ts","./node_modules/@tiptap/core/dist/utilities/mergeattributes.d.ts","./node_modules/@tiptap/core/dist/utilities/mergedeep.d.ts","./node_modules/@tiptap/core/dist/utilities/minmax.d.ts","./node_modules/@tiptap/core/dist/utilities/objectincludes.d.ts","./node_modules/@tiptap/core/dist/utilities/removeduplicates.d.ts","./node_modules/@tiptap/core/dist/utilities/index.d.ts","./node_modules/@tiptap/core/dist/index.d.ts","./node_modules/tippy.js/index.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu-plugin.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/index.d.ts","./node_modules/@tiptap/vue-3/dist/bubblemenu.d.ts","./node_modules/@tiptap/vue-3/dist/editor.d.ts","./node_modules/@tiptap/vue-3/dist/editorcontent.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/floating-menu-plugin.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/floating-menu.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/index.d.ts","./node_modules/@tiptap/vue-3/dist/floatingmenu.d.ts","./node_modules/@tiptap/vue-3/dist/nodeviewcontent.d.ts","./node_modules/@tiptap/vue-3/dist/nodeviewwrapper.d.ts","./node_modules/@tiptap/vue-3/dist/useeditor.d.ts","./node_modules/@tiptap/vue-3/dist/vuenodeviewrenderer.d.ts","./node_modules/@tiptap/vue-3/dist/vuerenderer.d.ts","./node_modules/@tiptap/vue-3/dist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/messageinputstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/messageliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/chat/chat.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/chat/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/helpers.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/options.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/t.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.mts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/index.d.ts","./src/components/sidetab.vue","./src/components/app-link/index.vue","./src/components/chat-dialog/chatmessageitem.vue","./src/utils/call-local-recorder.ts","./src/utils/call-video-screenshot.ts","./src/utils/tuicall-error.ts","./src/utils/im-call-hangup-detect.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/index.d.ts","./node_modules/@tencentcloud/call-engine-js/index.d.ts","./src/components/chat-dialog/index.vue","./src/components/color-picker/index.vue","./src/components/daterange-picker/index.vue","./src/components/del-wrap/index.vue","./src/components/dict-value/index.vue","./node_modules/@wangeditor/editor/dist/editor/src/utils/browser-polyfill.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/utils/node-polyfill.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/locale/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/register-builtin-modules/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/init-default-config/index.d.ts","./node_modules/slate/dist/create-editor.d.ts","./node_modules/slate/dist/interfaces/element.d.ts","./node_modules/slate/dist/interfaces/node.d.ts","./node_modules/slate/dist/interfaces/editor.d.ts","./node_modules/slate/dist/interfaces/location.d.ts","./node_modules/slate/dist/interfaces/operation.d.ts","./node_modules/slate/dist/interfaces/path.d.ts","./node_modules/slate/dist/interfaces/path-ref.d.ts","./node_modules/slate/dist/interfaces/point.d.ts","./node_modules/slate/dist/interfaces/point-ref.d.ts","./node_modules/slate/dist/interfaces/range.d.ts","./node_modules/slate/dist/interfaces/range-ref.d.ts","./node_modules/slate/dist/interfaces/custom-types.d.ts","./node_modules/slate/dist/interfaces/text.d.ts","./node_modules/slate/dist/transforms/general.d.ts","./node_modules/slate/dist/transforms/node.d.ts","./node_modules/slate/dist/transforms/selection.d.ts","./node_modules/slate/dist/transforms/text.d.ts","./node_modules/slate/dist/transforms/index.d.ts","./node_modules/slate/dist/index.d.ts","./node_modules/snabbdom/build/htmldomapi.d.ts","./node_modules/snabbdom/build/helpers/attachto.d.ts","./node_modules/snabbdom/build/modules/style.d.ts","./node_modules/snabbdom/build/modules/eventlisteners.d.ts","./node_modules/snabbdom/build/modules/attributes.d.ts","./node_modules/snabbdom/build/modules/class.d.ts","./node_modules/snabbdom/build/modules/props.d.ts","./node_modules/snabbdom/build/modules/dataset.d.ts","./node_modules/snabbdom/build/vnode.d.ts","./node_modules/snabbdom/build/hooks.d.ts","./node_modules/snabbdom/build/modules/module.d.ts","./node_modules/snabbdom/build/init.d.ts","./node_modules/snabbdom/build/thunk.d.ts","./node_modules/snabbdom/build/is.d.ts","./node_modules/snabbdom/build/tovnode.d.ts","./node_modules/snabbdom/build/h.d.ts","./node_modules/snabbdom/build/jsx.d.ts","./node_modules/snabbdom/build/index.d.ts","./node_modules/@types/event-emitter/index.d.ts","./node_modules/dom7/dom7.d.ts","./node_modules/@wangeditor/core/dist/core/src/utils/dom.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/config/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/editor/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/render/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/to-html/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/parse-html/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/bar/toolbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/register.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/baseclass.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/modal.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/index.d.ts","./node_modules/slate-history/dist/history.d.ts","./node_modules/slate-history/dist/history-editor.d.ts","./node_modules/slate-history/dist/with-history.d.ts","./node_modules/slate-history/dist/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/create-editor.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/create-toolbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/utils/key.d.ts","./node_modules/@wangeditor/core/dist/core/src/text-area/textarea.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/bar/hoverbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/editor/dom-editor.d.ts","./node_modules/@uppy/utils/types/index.d.ts","./node_modules/@uppy/core/types/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/createuploader.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/index.d.ts","./node_modules/i18next/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/i18n/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/boot.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/utils/dom.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/create.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/index.d.ts","./node_modules/vuedraggable/src/vuedraggable.d.ts","./src/components/popup/index.vue","./src/components/material/file.vue","./src/hooks/usepaging.ts","./src/components/material/hook.ts","./src/components/material/preview.vue","./src/components/material/index.vue","./src/components/material/picker.vue","./src/components/editor/index.vue","./src/components/export-data/index.vue","./src/components/footer-btns/index.vue","./src/components/icon/index.ts","./src/components/icon/svg-icon.vue","./src/components/icon/index.vue","./src/components/icon/picker.vue","./src/components/image-contain/index.vue","./src/components/link/index.ts","./src/components/link/article-list.vue","./src/components/link/custom-link.vue","./src/components/link/mini-program.vue","./src/components/link/shop-pages.vue","./src/components/link/index.vue","./src/components/link/picker.vue","./src/components/overflow-tooltip/index.vue","./src/components/pagination/index.vue","./src/components/popover-input/index.vue","./src/components/upload/index.vue","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/index.d.ts","./src/components/video-call/index.vue","./src/hooks/usedictoptions.ts","./node_modules/vue-clipboard3/dist/esm/index.d.ts","./src/install/directives/copy.ts","./src/install/directives/perms.ts","./node_modules/echarts/types/dist/shared.d.ts","./node_modules/echarts/types/dist/charts.d.ts","./node_modules/echarts/charts.d.ts","./node_modules/echarts/types/dist/components.d.ts","./node_modules/echarts/components.d.ts","./node_modules/echarts/types/dist/core.d.ts","./node_modules/echarts/core.d.ts","./node_modules/echarts/types/dist/features.d.ts","./node_modules/echarts/features.d.ts","./node_modules/echarts/types/dist/renderers.d.ts","./node_modules/echarts/renderers.d.ts","./src/install/plugins/echart.ts","./node_modules/element-plus/es/components/base/style/css.d.ts","./node_modules/element-plus/es/components/overlay/style/css.d.ts","./node_modules/element-plus/es/components/dialog/style/css.d.ts","./src/install/plugins/element.ts","./node_modules/@highlightjs/vue-plugin/dist/vue.d.ts","./node_modules/highlight.js/types/index.d.ts","./src/install/plugins/hljs.ts","./src/stores/index.ts","./src/install/plugins/pinia.ts","./src/router/guard/index.ts","./src/install/plugins/router.ts","./src/install/plugins/tuikit.ts","./src/router/guard/init.ts","./src/utils/checkhttps.ts","./src/utils/env.ts","./src/utils/getexposetype.ts","./src/views/app/recharge/index.vue","./src/views/article/column/edit.vue","./src/views/article/column/index.vue","./src/views/article/lists/edit.vue","./src/views/article/lists/index.vue","./src/views/channel/h5.vue","./src/views/channel/open_setting.vue","./src/views/channel/weapp.vue","./src/views/channel/wx_oa/config.vue","./src/views/channel/wx_oa/menu_com/usemenuoa.ts","./src/views/channel/wx_oa/menu_com/oa-menu-form.vue","./src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue","./src/views/channel/wx_oa/menu_com/oa-attr.vue","./src/views/channel/wx_oa/menu_com/oa-phone.vue","./src/views/channel/wx_oa/menu.vue","./src/views/channel/wx_oa/reply/edit.vue","./src/views/channel/wx_oa/reply/default_reply.vue","./src/views/channel/wx_oa/reply/follow_reply.vue","./src/views/channel/wx_oa/reply/keyword_reply.vue","./src/views/chat/components/messagebubble.vue","./src/views/chat/components/sendpanel.vue","./src/views/chat/index.vue","./src/views/consumer/assistant/edit.vue","./src/views/consumer/assistant/index.vue","./src/views/consumer/components/account-adjust.vue","./src/views/consumer/doctor/edit.vue","./src/views/consumer/doctor/index.vue","./src/views/consumer/doctor/paiban.vue","./src/views/consumer/lists/detail.vue","./src/views/consumer/lists/index.vue","./src/views/consumer/prescription/index.vue","./src/views/consumer/prescription/list.vue","./src/views/consumer/prescription/order_list.vue","./src/views/decoration/pc.vue","./src/views/decoration/component/pages/menu.vue","./src/views/decoration/component/tabbar/mobile/attr.vue","./src/views/decoration/component/decoration-img.vue","./src/views/decoration/component/tabbar/mobile/content.vue","./src/views/decoration/component/tabbar/mobile/index.ts","./src/views/decoration/tabbar.vue","./src/views/decoration/component/add-nav.vue","./src/views/decoration/component/pages/attr-setting.vue","./src/views/decoration/component/pages/preview.vue","./src/views/decoration/component/tabbar/pc/menu-set.vue","./src/views/decoration/component/tabbar/pc/attr.vue","./src/views/decoration/component/tabbar/pc/content.vue","./src/views/decoration/component/tabbar/pc/index.ts","./src/views/decoration/component/widgets/banner/options.ts","./src/views/decoration/component/widgets/banner/attr.vue","./src/views/decoration/component/widgets/banner/content.vue","./src/views/decoration/component/widgets/banner/index.ts","./src/views/decoration/component/widgets/customer-service/options.ts","./src/views/decoration/component/widgets/customer-service/attr.vue","./src/views/decoration/component/widgets/customer-service/content.vue","./src/views/decoration/component/widgets/customer-service/index.ts","./src/views/decoration/component/widgets/middle-banner/options.ts","./src/views/decoration/component/widgets/middle-banner/attr.vue","./src/views/decoration/component/widgets/middle-banner/content.vue","./src/views/decoration/component/widgets/middle-banner/index.ts","./src/views/decoration/component/widgets/my-service/options.ts","./src/views/decoration/component/widgets/my-service/attr.vue","./src/views/decoration/component/widgets/my-service/content.vue","./src/views/decoration/component/widgets/my-service/index.ts","./src/views/decoration/component/widgets/nav/options.ts","./src/views/decoration/component/widgets/nav/attr.vue","./src/views/decoration/component/widgets/nav/content.vue","./src/views/decoration/component/widgets/nav/index.ts","./src/views/decoration/component/widgets/news/options.ts","./src/views/decoration/component/widgets/news/attr.vue","./src/views/decoration/component/widgets/news/content.vue","./src/views/decoration/component/widgets/news/index.ts","./src/views/decoration/component/widgets/page-meta/options.ts","./src/views/decoration/component/widgets/page-meta/attr.vue","./src/views/decoration/component/widgets/page-meta/content.vue","./src/views/decoration/component/widgets/page-meta/index.ts","./src/views/decoration/component/widgets/pc-banner/options.ts","./src/views/decoration/component/widgets/pc-banner/content.vue","./src/views/decoration/component/widgets/pc-banner/index.ts","./src/views/decoration/component/widgets/search/options.ts","./src/views/decoration/component/widgets/search/attr.vue","./src/views/decoration/component/widgets/search/content.vue","./src/views/decoration/component/widgets/search/index.ts","./src/views/decoration/component/widgets/user-banner/options.ts","./src/views/decoration/component/widgets/user-banner/attr.vue","./src/views/decoration/component/widgets/user-banner/content.vue","./src/views/decoration/component/widgets/user-banner/index.ts","./src/views/decoration/component/widgets/user-info/options.ts","./src/views/decoration/component/widgets/user-info/attr.vue","./src/views/decoration/component/widgets/user-info/content.vue","./src/views/decoration/component/widgets/user-info/index.ts","./src/views/decoration/pages/index.vue","./src/views/decoration/style/components/theme-picker.vue","./src/views/decoration/style/components/mobile-style.vue","./src/views/decoration/style/style.vue","./src/views/dev_tools/components/relations-add.vue","./src/views/dev_tools/code/edit.vue","./src/views/dev_tools/components/code-preview.vue","./src/views/dev_tools/components/data-table.vue","./src/views/dev_tools/code/index.vue","./src/views/doctor/dept-tongji.vue","./src/views/doctor/medicine.vue","./src/views/doctor/roster.vue","./src/views/doctor/tongji.vue","./src/views/fans/index.vue","./src/views/fans/qywx.vue","./src/views/finance/balance_details.vue","./src/views/finance/recharge_record.vue","./src/views/finance/component/refund-log.vue","./src/views/finance/refund_record.vue","./src/views/finance/account_cost/edit.vue","./src/views/finance/account_cost/index.vue","./src/views/material/index.vue","./src/views/message/notice/edit.vue","./src/views/message/notice/index.vue","./src/views/message/short_letter/edit.vue","./src/views/message/short_letter/index.vue","./src/views/order/index.vue","./src/views/organization/department/edit.vue","./src/views/organization/department/index.vue","./src/views/organization/post/edit.vue","./src/views/organization/post/index.vue","./src/views/permission/admin/edit.vue","./src/views/permission/admin/index.vue","./src/views/permission/menu/edit.vue","./src/views/permission/menu/index.vue","./src/views/permission/role/auth.vue","./src/views/permission/role/edit.vue","./src/views/permission/role/index.vue","./src/views/setting/dict/data/edit.vue","./src/views/setting/dict/data/index.vue","./src/views/setting/dict/type/edit.vue","./src/views/setting/dict/type/index.vue","./src/views/setting/pay/config/edit.vue","./src/views/setting/pay/config/index.vue","./src/views/setting/pay/method/index.vue","./src/views/setting/search/index.vue","./src/views/setting/storage/edit.vue","./src/views/setting/storage/index.vue","./src/views/setting/system/cache.vue","./src/views/setting/system/environment.vue","./src/views/setting/system/journal.vue","./src/views/setting/system/scheduled_task/edit.vue","./src/views/setting/system/scheduled_task/index.vue","./src/views/setting/user/login_register.vue","./src/views/setting/user/setup.vue","./src/views/setting/website/filing.vue","./src/views/setting/website/information.vue","./src/views/setting/website/protocol.vue","./src/views/setting/website/statistics.vue","./node_modules/vue-echarts/node_modules/vue-demi/lib/index.d.ts","./node_modules/vue-echarts/dist/index.d.ts","./src/views/stats/conversion/index.vue","./src/views/tcm/appointment/list.vue","./src/views/tcm/appointment/components/prescription-drawer.vue","./src/views/tcm/diagnosis/add.vue","./node_modules/trtc-sdk-v5/plugins/cdn-streaming/cdn-streaming.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/device-detector/device-detector.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/virtual-background/virtual-background.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/watermark/watermark.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/beauty/beauty.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/basic-beauty/basic-beauty.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/cross-room/cross-room.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/custom-encryption/custom-encryption.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/video-mixer/video-mixer.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/small-stream-auto-switcher/small-stream-auto-switcher.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/chorus/chorus.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/lebplayer/lebplayer.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/realtime-transcriber/realtime-transcriber.esm.d.ts","./node_modules/trtc-sdk-v5/index.d.ts","./src/views/tcm/diagnosis/components/assistantwatchcalldialog.vue","./src/views/tcm/diagnosis/index.vue","./src/views/tcm/follow/index.vue","./src/views/template/component/file.vue","./src/views/template/component/icon.vue","./src/views/template/component/link.vue","./src/views/template/component/overflow.vue","./src/views/template/component/popover_input.vue","./src/views/template/component/rich_text.vue","./src/views/template/component/upload.vue","./src/views/test/patient-call.vue","./src/views/workbench/index.vue","./components.d.ts","./auto-imports.d.ts","./typings/index.d.ts","./typings/router.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/sass/types/deprecations.d.ts","./node_modules/sass/types/util/promise_or.d.ts","./node_modules/sass/types/importer.d.ts","./node_modules/sass/types/logger/source_location.d.ts","./node_modules/sass/types/logger/source_span.d.ts","./node_modules/sass/types/logger/index.d.ts","./node_modules/immutable/dist/immutable.d.ts","./node_modules/sass/types/value/boolean.d.ts","./node_modules/sass/types/value/calculation.d.ts","./node_modules/sass/types/value/color.d.ts","./node_modules/sass/types/value/function.d.ts","./node_modules/sass/types/value/list.d.ts","./node_modules/sass/types/value/map.d.ts","./node_modules/sass/types/value/mixin.d.ts","./node_modules/sass/types/value/number.d.ts","./node_modules/sass/types/value/string.d.ts","./node_modules/sass/types/value/argument_list.d.ts","./node_modules/sass/types/value/index.d.ts","./node_modules/sass/types/options.d.ts","./node_modules/sass/types/compile.d.ts","./node_modules/sass/types/exception.d.ts","./node_modules/sass/types/legacy/exception.d.ts","./node_modules/sass/types/legacy/plugin_this.d.ts","./node_modules/sass/types/legacy/function.d.ts","./node_modules/sass/types/legacy/importer.d.ts","./node_modules/sass/types/legacy/options.d.ts","./node_modules/sass/types/legacy/render.d.ts","./node_modules/sass/types/index.d.ts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","./node_modules/vue/compiler-sfc/index.d.mts","./node_modules/@vitejs/plugin-vue/dist/index.d.mts","./node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","./node_modules/@vue/babel-plugin-jsx/dist/index.d.mts","./node_modules/@vitejs/plugin-vue-jsx/dist/index.d.mts","./node_modules/mlly/dist/index.d.ts","./node_modules/unimport/dist/shared/unimport.cavrr9sh.d.mts","./node_modules/unimport/dist/shared/unimport.czoa5cgj.d.mts","./node_modules/strip-literal/node_modules/js-tokens/index.d.ts","./node_modules/strip-literal/dist/index.d.mts","./node_modules/unimport/dist/index.d.mts","./node_modules/unplugin-utils/dist/index.d.ts","./node_modules/unplugin-auto-import/dist/types-bch7f5uk.d.ts","./node_modules/unplugin-auto-import/dist/vite.d.ts","./node_modules/webpack-virtual-modules/lib/index.d.ts","./node_modules/unplugin/dist/index.d.ts","./node_modules/unplugin-vue-components/dist/types-cfwifa2k.d.ts","./node_modules/unplugin-vue-components/dist/resolvers.d.ts","./node_modules/unplugin-vue-components/dist/vite.d.ts","./node_modules/vite-plugin-style-import/dist/index.d.ts","./node_modules/@types/svgo/index.d.ts","./node_modules/vite-plugin-svg-icons/dist/index.d.ts","./node_modules/vite-plugin-vue-setup-extend/dist/index.d.ts","./vite.config.ts"],"fileIdsList":[[103,107,113,2312,2315,2321,2369,2386,2387],[103,107,113,1104,1444,1520,1537,1950,1951,1952,1972,1973,1974,1975,1976,2058,2059,2062,2063,2064,2065,2066,2067,2069,2070,2071,2072,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2098,2315,2321,2369,2386,2387],[92,2321,2369,2386,2387],[103,104,107,113,2312,2321,2369,2386,2387],[95,2321,2369,2386,2387],[2321,2369,2386,2387],[740,2321,2369,2386,2387],[741,2321,2369,2386,2387],[740,741,742,743,744,745,746,747,748,2321,2369,2386,2387],[103,107,113,2312,2321,2369,2386,2387],[1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,2321,2369,2386,2387],[1412,2321,2369,2386,2387],[632,2321,2369,2386,2387],[633,634,2321,2369,2386,2387],[524,2321,2369,2386,2387],[518,520,2321,2369,2386,2387],[508,518,519,521,522,523,2321,2369,2386,2387],[518,2321,2369,2386,2387],[508,518,2321,2369,2386,2387],[509,510,511,512,513,514,515,516,517,2321,2369,2386,2387],[509,513,514,517,518,521,2321,2369,2386,2387],[509,510,511,512,513,514,515,516,517,518,519,521,522,2321,2369,2386,2387],[508,509,510,511,512,513,514,515,516,517,2321,2369,2386,2387],[1592,2321,2369,2386,2387],[1969,2321,2369,2386,2387],[1960,1961,1965,1966,2321,2369,2386,2387],[1960,2321,2369,2386,2387],[1957,1958,1959,2321,2369,2386,2387],[1960,1967,1968,2321,2369,2386,2387],[1960,1965,2321,2369,2386,2387],[1961,1962,1963,1964,2321,2369,2386,2387],[1567,2321,2369,2386,2387],[1569,1570,2321,2369,2386,2387],[1568,1571,1890,1948,2321,2369,2386,2387],[1589,2321,2369,2386,2387],[103,107,113,1921,1922,2312,2321,2369,2386,2387],[103,107,113,1921,2312,2321,2369,2386,2387],[103,107,113,1904,2312,2321,2369,2386,2387],[103,107,113,1906,2312,2321,2369,2386,2387],[103,107,113,1906,1907,2312,2321,2369,2386,2387],[1904,2321,2369,2386,2387],[103,107,113,1909,2312,2321,2369,2386,2387],[103,107,113,1911,2312,2321,2369,2386,2387],[103,107,113,1911,1912,1913,2312,2321,2369,2386,2387],[1942,2321,2369,2386,2387],[1905,1908,1910,1914,1915,1920,1923,1925,1926,1927,1929,1930,1934,1936,1938,1941,1943,1944,2321,2369,2386,2387],[103,107,113,1924,2312,2321,2369,2386,2387],[1916,1917,2321,2369,2386,2387],[1918,1919,2321,2369,2386,2387],[1939,1940,2321,2369,2386,2387],[103,107,113,1939,2312,2321,2369,2386,2387],[1931,1932,1933,2321,2369,2386,2387],[103,107,113,1931,2312,2321,2369,2386,2387],[103,107,113,1928,2312,2321,2369,2386,2387],[103,107,113,1935,2312,2321,2369,2386,2387],[103,107,113,1937,2312,2321,2369,2386,2387],[103,107,113,1946,2312,2321,2369,2386,2387],[1897,1903,1945,1947,2321,2369,2386,2387],[1898,1899,2321,2369,2386,2387],[103,107,113,1898,2312,2321,2369,2386,2387],[103,107,113,1896,1897,2312,2321,2369,2386,2387],[103,107,113,1891,1900,2312,2321,2369,2386,2387],[103,107,113,1891,1896,2312,2321,2369,2386,2387],[1896,2321,2369,2386,2387],[1901,1902,2321,2369,2386,2387],[1892,1893,1894,1895,2321,2369,2386,2387],[1892,1893,1894,2321,2369,2386,2387],[1892,2321,2369,2386,2387],[1892,1893,2321,2369,2386,2387],[1700,1710,1778,2321,2369,2386,2387],[1707,1708,1709,1710,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1700,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1766,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1767,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1768,1867,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1867,2321,2369,2386,2387],[1700,1701,1702,1703,1710,1711,1712,1777,2321,2369,2386,2387],[1700,1705,1706,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1778,1867,2321,2369,2386,2387],[1700,1701,1702,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1778,1867,2321,2369,2386,2387],[1709,2321,2369,2386,2387],[1709,1769,2321,2369,2386,2387],[1700,1709,2321,2369,2386,2387],[1713,1770,1771,1772,1773,1774,1775,1776,2321,2369,2386,2387],[1700,1701,1704,2321,2369,2386,2387],[1700,2321,2369,2386,2387],[1701,1710,2321,2369,2386,2387],[1701,2321,2369,2386,2387],[1696,1700,1710,2321,2369,2386,2387],[1710,2321,2369,2386,2387],[1700,1701,2321,2369,2386,2387],[1704,1710,2321,2369,2386,2387],[1701,1710,1778,2321,2369,2386,2387],[1701,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2321,2369,2386,2387],[1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,2321,2369,2386,2387],[1702,2321,2369,2386,2387],[1700,1701,1710,2321,2369,2386,2387],[1707,1708,1709,1710,2321,2369,2386,2387],[1705,1706,1707,1708,1709,1710,1712,1777,1778,1779,1831,1837,1838,1842,1843,1866,2321,2369,2386,2387],[1832,1833,1834,1835,1836,2321,2369,2386,2387],[1701,1705,1710,2321,2369,2386,2387],[1705,2321,2369,2386,2387],[1701,1705,1710,1778,2321,2369,2386,2387],[1700,1701,1705,1706,1707,1708,1709,1710,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1778,1867,2321,2369,2386,2387],[1702,1710,1778,2321,2369,2386,2387],[1839,1840,1841,2321,2369,2386,2387],[1701,1706,1710,2321,2369,2386,2387],[1706,2321,2369,2386,2387],[1700,1701,1702,1704,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1778,1867,2321,2369,2386,2387],[1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,2321,2369,2386,2387],[1700,1702,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1868,2321,2369,2386,2387],[1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1869,2321,2369,2386,2387],[1869,1870,2321,2369,2386,2387],[1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1875,2321,2369,2386,2387],[1875,1876,2321,2369,2386,2387],[1696,2321,2369,2386,2387],[1699,2321,2369,2386,2387],[1697,2321,2369,2386,2387],[1698,2321,2369,2386,2387],[103,107,113,1698,1699,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1868,1871,2312,2321,2369,2386,2387],[103,107,113,1700,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2312,2321,2369,2386,2387],[103,107,113,1873,2312,2321,2369,2386,2387],[103,107,113,1698,1699,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1868,1877,2312,2321,2369,2386,2387],[1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1872,1873,1874,1878,1879,1880,1881,1882,1883,2321,2369,2386,2387],[103,107,113,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,1873,2312,2321,2369,2386,2387],[103,107,113,1701,1702,1707,1708,1709,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1867,2312,2321,2369,2386,2387],[2096,2321,2369,2386,2387],[2087,2088,2092,2093,2321,2369,2386,2387],[2087,2321,2369,2386,2387],[2084,2085,2086,2321,2369,2386,2387],[2087,2094,2095,2321,2369,2386,2387],[2087,2092,2321,2369,2386,2387],[2088,2089,2090,2091,2321,2369,2386,2387],[127,2321,2369,2386,2387],[179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,2321,2369,2386,2387],[115,117,118,119,120,121,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,118,119,120,121,122,123,124,125,126,127,2321,2369,2386,2387],[116,117,118,119,120,121,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,119,120,121,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,120,121,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,121,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,122,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,123,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,122,124,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,122,123,125,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,122,123,124,126,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,122,123,124,125,127,2321,2369,2386,2387],[115,116,117,118,119,120,121,122,123,124,125,126,2321,2369,2386,2387],[2321,2366,2367,2369,2386,2387],[2321,2368,2369,2386,2387],[2369,2386,2387],[2321,2369,2374,2386,2387,2404],[2321,2369,2370,2375,2380,2386,2387,2389,2401,2412],[2321,2369,2370,2371,2380,2386,2387,2389],[2316,2317,2318,2321,2369,2386,2387],[2321,2369,2372,2386,2387,2413],[2321,2369,2373,2374,2381,2386,2387,2390],[2321,2369,2374,2386,2387,2401,2409],[2321,2369,2375,2377,2380,2386,2387,2389],[2321,2368,2369,2376,2386,2387],[2321,2369,2377,2378,2386,2387],[2321,2369,2379,2380,2386,2387],[2321,2368,2369,2380,2386,2387],[2321,2369,2380,2381,2382,2386,2387,2401,2412],[2321,2369,2380,2381,2382,2386,2387,2396,2401,2404],[2321,2362,2369,2377,2380,2383,2386,2387,2389,2401,2412],[2321,2369,2380,2381,2383,2384,2386,2387,2389,2401,2409,2412],[2321,2369,2383,2385,2386,2387,2401,2409,2412],[2319,2320,2321,2322,2323,2324,2325,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418],[2321,2369,2380,2386,2387],[2321,2369,2386,2387,2388,2412],[2321,2369,2377,2380,2386,2387,2389,2401],[2321,2369,2386,2387,2390],[2321,2369,2386,2387,2391],[2321,2368,2369,2386,2387,2392],[2321,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418],[2321,2369,2386,2387,2394],[2321,2369,2386,2387,2395],[2321,2369,2380,2386,2387,2396,2397],[2321,2369,2386,2387,2396,2398,2413,2415],[2321,2369,2381,2386,2387],[2321,2369,2380,2386,2387,2401,2402,2404],[2321,2369,2386,2387,2403,2404],[2321,2369,2386,2387,2401,2402],[2321,2369,2386,2387,2404],[2321,2369,2386,2387,2405],[2321,2366,2369,2386,2387,2401,2406,2412],[2321,2369,2380,2386,2387,2407,2408],[2321,2369,2386,2387,2407,2408],[2321,2369,2374,2386,2387,2389,2401,2409],[2321,2369,2386,2387,2410],[2321,2369,2386,2387,2389,2411],[2321,2369,2383,2386,2387,2395,2412],[2321,2369,2374,2386,2387,2413],[2321,2369,2386,2387,2401,2414],[2321,2369,2386,2387,2388,2415],[2321,2369,2386,2387,2416],[2321,2362,2369,2386,2387],[2321,2362,2369,2380,2382,2386,2387,2392,2401,2404,2412,2414,2415,2417],[2321,2369,2386,2387,2401,2418],[2321,2369,2386,2387,2419],[2045,2321,2369,2386,2387],[2321,2369,2386,2387,2477,2484],[2321,2369,2386,2387,2477,2481],[95,2321,2369,2386,2387,2483],[2321,2369,2386,2387,2480],[94,95,96,2321,2369,2386,2387],[97,2321,2369,2386,2387],[95,96,97,2321,2369,2386,2387,2445,2478,2479],[94,2321,2369,2386,2387],[94,99,100,102,2321,2369,2386,2387],[99,100,101,102,2321,2369,2386,2387],[103,107,108,113,2312,2321,2369,2386,2387],[2001,2023,2025,2321,2369,2386,2387],[2001,2022,2024,2025,2037,2321,2369,2386,2387],[2022,2024,2025,2029,2321,2369,2386,2387],[2038,2039,2321,2369,2386,2387],[2001,2022,2025,2029,2041,2042,2043,2321,2369,2386,2387],[2001,2020,2022,2023,2024,2321,2369,2386,2387],[2050,2321,2369,2386,2387],[92,2024,2025,2026,2027,2028,2033,2040,2044,2049,2051,2321,2369,2386,2387],[2023,2321,2369,2386,2387],[2022,2023,2024,2321,2369,2386,2387],[2023,2029,2030,2032,2321,2369,2386,2387],[2001,2022,2025,2321,2369,2386,2387],[2022,2025,2321,2369,2386,2387],[2022,2023,2025,2031,2321,2369,2386,2387],[2001,2019,2025,2321,2369,2386,2387],[2022,2321,2369,2386,2387],[2001,2025,2321,2369,2386,2387],[2046,2047,2321,2369,2386,2387],[2047,2048,2321,2369,2386,2387],[2046,2321,2369,2386,2387],[2021,2321,2369,2386,2387],[2052,2321,2369,2386,2387],[2001,2052,2054,2321,2369,2386,2387],[92,1979,1980,1981,2001,2052,2053,2055,2321,2369,2386,2387],[833,2321,2369,2386,2387],[686,2321,2369,2386,2387],[685,2321,2369,2386,2387],[687,2321,2369,2386,2387],[2104,2321,2369,2386,2387],[2106,2321,2369,2386,2387],[2108,2321,2369,2386,2387],[2110,2321,2369,2386,2387],[1432,2321,2369,2386,2387],[2112,2321,2369,2386,2387],[2103,2321,2369,2386,2387],[500,501,502,2321,2369,2386,2387],[101,103,107,113,500,502,2312,2321,2369,2386,2387],[101,103,107,113,501,2312,2321,2369,2386,2387],[500,504,505,506,2321,2369,2386,2387],[103,107,113,500,2312,2321,2369,2386,2387],[103,107,113,500,504,2312,2321,2369,2386,2387],[505,2321,2369,2386,2387],[500,1058,1059,1061,2321,2369,2386,2387],[103,107,113,1060,2312,2321,2369,2386,2387],[103,107,113,500,1059,2312,2321,2369,2386,2387],[103,107,113,1058,2312,2321,2369,2386,2387],[500,652,653,2321,2369,2386,2387],[103,107,113,500,535,539,651,653,2312,2321,2369,2386,2387],[103,107,113,500,539,651,652,2312,2321,2369,2386,2387],[500,655,656,657,658,659,660,2321,2369,2386,2387],[103,107,113,500,535,2312,2321,2369,2386,2387],[103,104,107,113,500,1104,2312,2321,2369,2386,2387],[101,103,107,113,174,500,2312,2321,2369,2386,2387],[101,103,107,113,655,2312,2321,2369,2386,2387],[103,107,113,655,2312,2321,2369,2386,2387],[656,657,2321,2369,2386,2387],[500,662,663,664,2321,2369,2386,2387],[103,107,113,662,2312,2321,2369,2386,2387],[663,2321,2369,2386,2387],[500,666,667,668,2321,2369,2386,2387],[103,107,113,666,2312,2321,2369,2386,2387],[667,2321,2369,2386,2387],[500,670,671,672,673,674,675,2321,2369,2386,2387],[103,107,113,500,2312,2315,2321,2369,2386,2387],[103,107,113,672,2312,2315,2321,2369,2386,2387],[103,107,113,670,2312,2321,2369,2386,2387],[671,673,2321,2369,2386,2387],[500,677,678,680,681,682,2321,2369,2386,2387],[103,107,113,500,677,2312,2321,2369,2386,2387],[103,107,113,679,2312,2321,2369,2386,2387],[103,107,113,174,500,2312,2321,2369,2386,2387],[103,107,113,677,2312,2321,2369,2386,2387],[678,680,2321,2369,2386,2387],[500,684,688,691,2321,2369,2386,2387],[103,107,113,684,687,2312,2321,2369,2386,2387],[103,107,113,500,687,2312,2321,2369,2386,2387],[103,107,113,687,689,2312,2321,2369,2386,2387],[688,690,2321,2369,2386,2387],[500,693,694,695,2321,2369,2386,2387],[103,107,113,693,2312,2321,2369,2386,2387],[694,2321,2369,2386,2387],[500,697,698,699,700,701,702,2321,2369,2386,2387],[103,107,113,699,2312,2321,2369,2386,2387],[103,107,113,697,2312,2321,2369,2386,2387],[698,700,2321,2369,2386,2387],[500,704,707,708,709,2321,2369,2386,2387],[103,107,113,500,704,2312,2321,2369,2386,2387],[103,107,113,704,705,707,708,2312,2321,2369,2386,2387],[706,709,2321,2369,2386,2387],[103,107,113,704,2312,2321,2369,2386,2387],[704,2321,2369,2386,2387],[103,107,113,500,705,2312,2321,2369,2386,2387],[500,714,715,716,2321,2369,2386,2387],[103,107,113,174,500,535,644,710,713,2312,2321,2369,2386,2387],[103,107,113,500,535,710,714,2312,2321,2369,2386,2387],[715,2321,2369,2386,2387],[500,718,719,2321,2369,2386,2387],[103,107,113,500,719,2312,2321,2369,2386,2387],[103,107,113,718,2312,2321,2369,2386,2387],[500,721,722,723,724,725,726,2321,2369,2386,2387],[103,107,113,721,2312,2321,2369,2386,2387],[103,107,113,174,500,644,721,725,2312,2321,2369,2386,2387],[103,107,113,724,1104,2312,2321,2369,2386,2387],[103,107,113,174,500,644,722,2312,2321,2369,2386,2387],[103,107,113,724,2312,2321,2369,2386,2387],[500,728,729,2321,2369,2386,2387],[103,107,113,500,729,2312,2321,2369,2386,2387],[103,107,113,728,2312,2321,2369,2386,2387],[500,738,2321,2369,2386,2387],[500,731,732,733,734,735,736,2321,2369,2386,2387],[103,107,113,500,731,2312,2321,2369,2386,2387],[103,107,113,500,733,2312,2321,2369,2386,2387],[103,107,113,731,2312,2321,2369,2386,2387],[732,734,2321,2369,2386,2387],[500,751,752,2321,2369,2386,2387],[103,107,113,500,749,750,752,2312,2321,2369,2386,2387],[103,107,113,539,750,751,2312,2321,2369,2386,2387],[749,2321,2369,2386,2387],[500,754,755,2321,2369,2386,2387],[103,107,113,174,500,644,651,749,755,2312,2321,2369,2386,2387],[103,107,113,750,754,2312,2321,2369,2386,2387],[500,780,781,782,783,2321,2369,2386,2387],[103,107,113,500,611,683,696,759,765,768,779,2312,2321,2369,2386,2387],[103,107,113,500,611,759,780,1104,2312,2321,2369,2386,2387],[103,107,113,780,2312,2321,2369,2386,2387],[103,107,113,487,644,782,1104,2312,2321,2369,2386,2387],[500,785,786,787,788,789,2321,2369,2386,2387],[500,791,792,2321,2369,2386,2387],[103,107,113,500,687,792,2312,2321,2369,2386,2387],[103,107,113,687,791,2312,2321,2369,2386,2387],[500,802,803,804,805,806,2321,2369,2386,2387],[103,107,113,644,2312,2321,2369,2386,2387],[103,104,107,113,500,801,1104,2312,2321,2369,2386,2387],[802,2321,2369,2386,2387],[103,107,113,500,801,804,2312,2321,2369,2386,2387],[500,808,809,810,2321,2369,2386,2387],[103,104,107,113,500,801,807,1104,2312,2321,2369,2386,2387],[808,2321,2369,2386,2387],[103,107,113,500,801,804,1104,2312,2321,2369,2386,2387],[500,812,813,814,2321,2369,2386,2387],[103,107,113,174,500,813,2312,2321,2369,2386,2387],[103,107,113,812,2312,2321,2369,2386,2387],[500,761,762,763,764,2321,2369,2386,2387],[103,107,113,500,760,762,2312,2321,2369,2386,2387],[103,107,113,761,2312,2321,2369,2386,2387],[92,2115,2116,2321,2369,2386,2387],[500,816,817,2321,2369,2386,2387],[103,107,113,500,817,2312,2321,2369,2386,2387],[103,107,113,816,2312,2321,2369,2386,2387],[500,819,820,2321,2369,2386,2387],[103,107,113,500,765,820,2312,2321,2369,2386,2387],[103,107,113,765,819,2312,2321,2369,2386,2387],[500,822,823,824,825,826,827,2321,2369,2386,2387],[103,107,113,500,525,535,683,2312,2321,2369,2386,2387],[103,107,113,500,644,651,683,1104,2312,2321,2369,2386,2387],[822,2321,2369,2386,2387],[103,107,113,535,2312,2321,2369,2386,2387],[500,829,830,831,2321,2369,2386,2387],[103,107,113,829,2312,2321,2369,2386,2387],[830,2321,2369,2386,2387],[500,836,837,838,839,840,841,844,2321,2369,2386,2387],[103,107,113,836,2312,2321,2369,2386,2387],[103,107,113,174,500,836,2312,2321,2369,2386,2387],[103,107,113,836,837,2312,2321,2369,2386,2387],[103,107,113,174,500,836,837,2312,2321,2369,2386,2387],[103,107,113,500,836,837,838,2312,2321,2369,2386,2387],[842,843,2321,2369,2386,2387],[103,107,113,174,487,2312,2321,2369,2386,2387],[103,107,113,174,487,500,834,835,837,838,2312,2321,2369,2386,2387],[103,107,113,500,836,837,2312,2321,2369,2386,2387],[500,846,847,2321,2369,2386,2387],[103,107,113,500,847,2312,2321,2369,2386,2387],[103,107,113,846,2312,2321,2369,2386,2387],[500,850,851,2321,2369,2386,2387],[103,107,113,500,851,2312,2321,2369,2386,2387],[103,107,113,850,2312,2321,2369,2386,2387],[500,849,853,2321,2369,2386,2387],[103,107,113,500,853,2312,2321,2369,2386,2387],[103,107,113,849,852,2312,2321,2369,2386,2387],[503,507,535,539,651,654,661,665,669,676,683,692,696,703,710,713,717,720,727,730,737,739,753,756,759,765,768,779,784,790,793,801,807,811,815,818,821,828,832,845,848,852,854,857,861,871,873,876,879,882,885,893,896,899,903,910,922,935,936,941,946,950,953,959,962,995,1003,1006,1009,1014,1019,1028,1031,1036,1047,1050,1057,1062,1066,1071,1077,1079,1084,1087,1090,1094,2321,2369,2386,2387],[103,107,113,500,1078,2312,2321,2369,2386,2387],[500,855,856,2321,2369,2386,2387],[103,107,113,174,500,856,2312,2321,2369,2386,2387],[103,107,113,855,2312,2321,2369,2386,2387],[500,858,859,860,2321,2369,2386,2387],[103,107,113,174,500,535,713,2312,2321,2369,2386,2387],[103,107,113,500,858,1104,2312,2321,2369,2386,2387],[859,2321,2369,2386,2387],[500,536,537,538,2321,2369,2386,2387],[103,107,113,500,536,2312,2321,2369,2386,2387],[537,2321,2369,2386,2387],[500,766,767,2321,2369,2386,2387],[103,107,113,500,767,2312,2321,2369,2386,2387],[103,107,113,766,2312,2321,2369,2386,2387],[103,107,113,1080,1081,1082,1083,2312,2321,2369,2386,2387],[103,107,113,1080,1081,2312,2321,2369,2386,2387],[103,107,113,1080,2312,2321,2369,2386,2387],[103,107,113,487,2312,2321,2369,2386,2387],[500,1069,1070,2321,2369,2386,2387],[1067,2321,2369,2386,2387],[103,107,113,500,535,539,651,1067,1068,1070,2312,2321,2369,2386,2387],[103,107,113,500,525,539,651,1067,1068,1069,2312,2321,2369,2386,2387],[500,862,863,864,865,866,867,868,869,870,2321,2369,2386,2387],[863,865,866,867,2321,2369,2386,2387],[103,107,113,500,862,2312,2315,2321,2369,2386,2387],[103,107,113,862,864,2312,2321,2369,2386,2387],[103,107,113,500,535,862,2312,2315,2321,2369,2386,2387],[103,107,113,863,2312,2315,2321,2369,2386,2387],[500,1085,1086,2321,2369,2386,2387],[103,107,113,174,536,683,2312,2321,2369,2386,2387],[1085,2321,2369,2386,2387],[500,758,2321,2369,2386,2387],[103,107,113,500,757,2312,2321,2369,2386,2387],[103,107,113,500,758,2312,2321,2369,2386,2387],[500,1089,2321,2369,2386,2387],[103,107,113,500,1088,2312,2321,2369,2386,2387],[103,107,113,500,1089,2312,2321,2369,2386,2387],[101,103,107,113,500,872,2312,2321,2369,2386,2387],[101,103,107,113,500,2312,2321,2369,2386,2387],[92,2115,2321,2369,2386,2387],[500,874,875,2321,2369,2386,2387],[103,107,113,500,875,2312,2321,2369,2386,2387],[103,107,113,500,874,2312,2321,2369,2386,2387],[500,877,878,2321,2369,2386,2387],[500,880,881,2321,2369,2386,2387],[103,107,113,500,651,683,881,1104,2312,2321,2369,2386,2387],[103,107,113,500,683,880,1104,2312,2321,2369,2386,2387],[500,1091,1092,1093,2321,2369,2386,2387],[103,107,113,500,525,535,651,1092,2312,2321,2369,2386,2387],[103,107,113,500,651,1091,1104,2312,2321,2369,2386,2387],[500,525,526,527,528,529,530,531,532,533,534,2321,2369,2386,2387],[103,107,113,500,529,2312,2321,2369,2386,2387],[103,107,113,525,2312,2321,2369,2386,2387],[103,107,113,500,525,526,527,532,534,2312,2321,2369,2386,2387],[103,107,113,525,533,1104,2312,2321,2369,2386,2387],[103,107,113,500,528,2312,2321,2369,2386,2387],[103,107,113,526,527,2312,2321,2369,2386,2387],[103,107,113,526,531,2312,2321,2369,2386,2387],[103,107,113,526,530,2312,2321,2369,2386,2387],[500,883,884,2321,2369,2386,2387],[103,107,113,500,884,2312,2321,2369,2386,2387],[103,107,113,883,2312,2321,2369,2386,2387],[500,886,887,888,889,890,891,892,2321,2369,2386,2387],[103,107,113,890,2312,2321,2369,2386,2387],[103,107,113,500,886,889,2312,2321,2369,2386,2387],[103,107,113,888,2312,2321,2369,2386,2387],[103,107,113,174,500,891,2312,2321,2369,2386,2387],[103,107,113,174,500,887,2312,2321,2369,2386,2387],[103,107,113,886,2312,2321,2369,2386,2387],[500,894,895,2321,2369,2386,2387],[103,107,113,174,500,895,2312,2321,2369,2386,2387],[103,107,113,500,894,2312,2321,2369,2386,2387],[500,897,898,2321,2369,2386,2387],[103,107,113,500,898,2312,2321,2369,2386,2387],[103,107,113,897,2312,2321,2369,2386,2387],[500,900,901,902,2321,2369,2386,2387],[103,107,113,500,901,2312,2321,2369,2386,2387],[103,107,113,900,2312,2321,2369,2386,2387],[500,904,905,907,908,909,2321,2369,2386,2387],[103,107,113,500,905,2312,2321,2369,2386,2387],[103,107,113,904,2312,2321,2369,2386,2387],[103,107,113,906,2312,2321,2369,2386,2387],[103,107,113,907,2312,2321,2369,2386,2387],[103,107,113,1063,1065,1104,2312,2321,2369,2386,2387],[103,107,113,174,500,1063,1064,2312,2321,2369,2386,2387],[103,107,113,1063,1065,2312,2321,2369,2386,2387],[500,924,926,2321,2369,2386,2387],[103,107,113,160,500,535,911,924,927,2312,2321,2369,2386,2387],[103,104,107,113,911,922,2312,2321,2369,2386,2387],[103,107,113,486,500,651,911,923,925,927,1104,2312,2321,2369,2386,2387],[103,107,113,651,911,925,2312,2321,2369,2386,2387],[103,107,113,911,926,2312,2321,2369,2386,2387],[500,928,930,931,932,933,934,2321,2369,2386,2387],[103,107,113,500,930,2312,2321,2369,2386,2387],[103,107,113,500,535,927,931,2312,2321,2369,2386,2387],[103,107,113,486,500,651,910,911,927,928,930,1104,2312,2321,2369,2386,2387],[103,107,113,930,2312,2321,2369,2386,2387],[103,107,113,928,929,2312,2321,2369,2386,2387],[500,937,938,939,940,2321,2369,2386,2387],[103,107,113,500,940,2312,2321,2369,2386,2387],[103,107,113,939,2312,2321,2369,2386,2387],[103,107,113,500,644,938,2312,2321,2369,2386,2387],[103,107,113,937,2312,2321,2369,2386,2387],[500,942,944,945,2321,2369,2386,2387],[103,107,113,944,2312,2321,2369,2386,2387],[103,107,113,500,525,942,943,2312,2321,2369,2386,2387],[103,107,113,500,1104,2312,2321,2369,2386,2387],[500,947,948,949,2321,2369,2386,2387],[103,107,113,500,947,2312,2321,2369,2386,2387],[500,1073,1074,1075,1076,2321,2369,2386,2387],[103,107,113,500,1076,2312,2321,2369,2386,2387],[103,107,113,1075,2312,2321,2369,2386,2387],[103,107,113,500,1072,1074,2312,2321,2369,2386,2387],[103,107,113,1072,1073,2312,2321,2369,2386,2387],[500,951,952,2321,2369,2386,2387],[103,107,113,500,687,952,2312,2321,2369,2386,2387],[103,107,113,687,951,2312,2321,2369,2386,2387],[500,954,955,956,957,958,2321,2369,2386,2387],[103,107,113,500,957,2312,2321,2369,2386,2387],[103,107,113,500,954,956,2312,2321,2369,2386,2387],[103,107,113,500,955,2312,2321,2369,2386,2387],[103,107,113,954,2312,2321,2369,2386,2387],[500,960,961,2321,2369,2386,2387],[103,107,113,174,500,961,2312,2321,2369,2386,2387],[103,107,113,960,2312,2321,2369,2386,2387],[500,963,964,966,968,971,972,973,974,994,2321,2369,2386,2387],[103,107,113,500,965,2312,2321,2369,2386,2387],[103,107,113,964,2312,2321,2369,2386,2387],[103,107,113,975,2312,2321,2369,2386,2387],[103,104,107,113,984,2312,2321,2369,2386,2387],[103,107,113,977,2312,2321,2369,2386,2387],[103,104,107,113,964,965,979,2312,2321,2369,2386,2387],[103,104,107,113,500,965,981,982,2312,2321,2369,2386,2387],[976,978,980,983,984,985,986,2321,2369,2386,2387],[103,104,107,113,500,964,965,966,2312,2321,2369,2386,2387],[103,107,113,963,2312,2321,2369,2386,2387],[970,982,988,989,990,991,2321,2369,2386,2387],[103,107,113,973,2312,2321,2369,2386,2387],[103,107,113,964,968,2312,2321,2369,2386,2387],[103,107,113,964,968,988,2312,2321,2369,2386,2387],[103,107,113,644,964,966,967,968,969,2312,2321,2369,2386,2387],[103,107,113,922,968,969,2312,2321,2369,2386,2387],[103,107,113,968,982,2312,2321,2369,2386,2387],[103,107,113,500,922,964,965,2312,2321,2369,2386,2387],[103,107,113,965,2312,2321,2369,2386,2387],[103,107,113,964,965,2312,2321,2369,2386,2387],[103,107,113,644,968,987,993,2312,2321,2369,2386,2387],[103,107,113,500,964,965,2312,2321,2369,2386,2387],[103,104,107,113,500,922,964,965,967,2312,2321,2369,2386,2387],[103,104,107,113,500,964,965,967,968,970,1104,2312,2321,2369,2386,2387],[103,107,113,500,963,964,965,966,967,2312,2321,2369,2386,2387],[103,107,113,174,963,2312,2321,2369,2386,2387],[103,107,113,964,967,968,969,992,1104,2312,2321,2369,2386,2387],[500,772,776,778,2321,2369,2386,2387],[103,107,113,644,769,772,773,2312,2321,2369,2386,2387],[103,107,113,770,772,2312,2321,2369,2386,2387],[103,107,113,770,771,772,2312,2321,2369,2386,2387],[103,107,113,772,773,1104,2312,2321,2369,2386,2387],[103,107,113,612,770,772,773,775,2312,2321,2369,2386,2387],[103,107,113,770,772,773,774,2312,2321,2369,2386,2387],[103,107,113,127,500,644,769,770,772,773,775,1104,2312,2321,2369,2386,2387],[103,107,113,174,500,770,771,773,775,2312,2321,2369,2386,2387],[777,2321,2369,2386,2387],[103,107,113,651,772,773,2312,2321,2369,2386,2387],[500,996,997,998,1000,1001,1002,2321,2369,2386,2387],[103,107,113,997,1001,1002,2312,2321,2369,2386,2387],[103,107,113,500,998,999,2312,2321,2369,2386,2387],[103,107,113,998,1000,2312,2321,2369,2386,2387],[103,104,107,113,500,998,1000,2312,2321,2369,2386,2387],[103,107,113,500,996,2312,2321,2369,2386,2387],[103,107,113,997,2312,2321,2369,2386,2387],[103,104,107,113,500,998,1001,2312,2321,2369,2386,2387],[500,711,712,2321,2369,2386,2387],[103,107,113,174,500,712,2312,2321,2369,2386,2387],[103,107,113,711,2312,2321,2369,2386,2387],[500,1004,1005,2321,2369,2386,2387],[103,107,113,1004,1104,2312,2321,2369,2386,2387],[500,794,795,796,797,798,800,2321,2369,2386,2387],[103,107,113,500,525,687,794,2312,2321,2369,2386,2387],[103,107,113,500,525,535,687,2312,2321,2369,2386,2387],[103,107,113,687,794,2312,2321,2369,2386,2387],[103,107,113,799,2312,2321,2369,2386,2387],[103,104,107,113,500,794,1104,2312,2321,2369,2386,2387],[687,794,2321,2369,2386,2387],[500,1007,1008,2321,2369,2386,2387],[103,107,113,174,500,535,644,1008,2312,2321,2369,2386,2387],[103,107,113,500,1007,1104,2312,2321,2369,2386,2387],[500,1010,1011,1012,1013,2321,2369,2386,2387],[103,107,113,500,1012,2312,2321,2369,2386,2387],[103,107,113,1011,2312,2321,2369,2386,2387],[103,107,113,1010,2312,2321,2369,2386,2387],[500,646,647,648,649,650,2321,2369,2386,2387],[103,107,113,500,647,2312,2321,2369,2386,2387],[103,107,113,500,535,644,645,2312,2321,2369,2386,2387],[103,107,113,535,646,2312,2321,2369,2386,2387],[103,107,113,500,535,644,646,647,649,2312,2321,2369,2386,2387],[103,107,113,500,535,646,647,648,2312,2321,2369,2386,2387],[500,1051,1052,1053,1054,1055,1056,2321,2369,2386,2387],[103,107,113,500,635,2312,2321,2369,2386,2387],[103,107,113,500,632,1051,1052,2312,2321,2369,2386,2387],[103,107,113,632,1052,1055,2312,2321,2369,2386,2387],[103,107,113,500,632,1051,1052,1054,2312,2321,2369,2386,2387],[103,107,113,632,1053,1104,2312,2321,2369,2386,2387],[103,107,113,683,2312,2321,2369,2386,2387],[500,1015,1018,2321,2369,2386,2387],[103,107,113,500,1015,1016,2312,2321,2369,2386,2387],[103,107,113,500,1017,1104,2312,2321,2369,2386,2387],[103,107,113,500,1018,2312,2321,2369,2386,2387],[103,107,113,1015,1017,2312,2321,2369,2386,2387],[500,1029,1030,2321,2369,2386,2387],[935,1028,2321,2369,2386,2387],[103,107,113,500,935,1028,1104,2312,2321,2369,2386,2387],[500,1034,1035,2321,2369,2386,2387],[1034,2321,2369,2386,2387],[103,107,113,500,922,1032,1033,1104,2312,2321,2369,2386,2387],[103,107,113,500,1033,2312,2321,2369,2386,2387],[103,107,113,500,727,1022,1032,2312,2321,2369,2386,2387],[500,1020,1022,1025,1026,1027,2321,2369,2386,2387],[1025,2321,2369,2386,2387],[500,1022,1023,2321,2369,2386,2387],[1022,1024,2321,2369,2386,2387],[103,107,113,1020,1022,1023,1024,2312,2321,2369,2386,2387],[103,107,113,500,1022,1024,2312,2321,2369,2386,2387],[103,107,113,1020,1021,1023,1024,2312,2321,2369,2386,2387],[103,107,113,500,644,1022,1024,2312,2321,2369,2386,2387],[500,1038,1039,1041,1043,1045,1046,2321,2369,2386,2387],[1038,2321,2369,2386,2387],[103,107,113,500,1037,1038,1040,2312,2321,2369,2386,2387],[103,107,113,500,1037,1038,1041,2312,2321,2369,2386,2387],[103,107,113,500,1044,2312,2321,2369,2386,2387],[103,107,113,1045,2312,2321,2369,2386,2387],[103,107,113,500,1038,1042,2312,2321,2369,2386,2387],[103,107,113,1038,1043,2312,2321,2369,2386,2387],[103,107,113,500,1037,1039,2312,2321,2369,2386,2387],[103,107,113,500,1038,2312,2321,2369,2386,2387],[912,914,915,916,919,920,921,2321,2369,2386,2387],[103,107,113,500,914,918,919,2312,2321,2369,2386,2387],[103,107,113,500,914,920,2312,2321,2369,2386,2387],[103,107,113,500,914,2312,2321,2369,2386,2387],[103,107,113,127,917,2312,2321,2369,2386,2387],[103,107,113,913,2312,2321,2369,2386,2387],[500,1048,1049,2321,2369,2386,2387],[103,107,113,500,1049,2312,2321,2369,2386,2387],[103,107,113,1048,2312,2321,2369,2386,2387],[167,168,169,170,171,172,173,2321,2369,2386,2387],[103,107,113,1095,2312,2321,2369,2386,2387],[1097,1098,1099,1101,2321,2369,2386,2387],[103,107,113,1100,2312,2321,2369,2386,2387],[540,541,542,543,544,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,636,637,638,639,640,641,642,643,2321,2369,2386,2387],[487,2321,2369,2386,2387],[103,107,113,635,2312,2321,2369,2386,2387],[103,107,113,487,500,545,611,2312,2321,2369,2386,2387],[103,107,113,613,2312,2321,2369,2386,2387],[103,107,113,174,644,687,1095,1096,1102,1103,2312,2321,2369,2386,2387],[110,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,2321,2369,2386,2387],[103,107,113,784,2312,2321,2369,2386,2387],[484,2321,2369,2386,2387],[151,152,153,154,155,156,2321,2369,2386,2387],[157,178,485,488,489,490,491,492,493,494,495,496,497,498,499,2321,2369,2386,2387],[94,500,2321,2369,2386,2387],[158,159,160,161,165,166,175,176,177,2321,2369,2386,2387],[103,107,113,160,2312,2321,2369,2386,2387],[162,163,164,2321,2369,2386,2387],[103,107,113,164,2312,2321,2369,2386,2387],[103,107,113,162,163,2312,2321,2369,2386,2387],[174,2321,2369,2386,2387],[112,486,2321,2369,2386,2387],[112,2321,2369,2386,2387],[2120,2321,2369,2386,2387],[1448,2321,2369,2386,2387],[1446,1447,1449,2321,2369,2386,2387],[1448,1452,1455,1457,1458,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,2321,2369,2386,2387],[1448,1452,1453,2321,2369,2386,2387],[1448,1452,2321,2369,2386,2387],[1448,1449,1502,2321,2369,2386,2387],[1454,2321,2369,2386,2387],[1454,1459,2321,2369,2386,2387],[1454,1458,2321,2369,2386,2387],[1451,1454,1458,2321,2369,2386,2387],[1454,1457,1480,2321,2369,2386,2387],[1452,1454,2321,2369,2386,2387],[1451,2321,2369,2386,2387],[1448,1456,2321,2369,2386,2387],[1452,1456,1457,1458,2321,2369,2386,2387],[1451,1452,2321,2369,2386,2387],[1448,1449,2321,2369,2386,2387],[1448,1449,1502,1504,2321,2369,2386,2387],[1448,1505,2321,2369,2386,2387],[1512,1513,1514,2321,2369,2386,2387],[1448,1502,1503,2321,2369,2386,2387],[1448,1450,1517,2321,2369,2386,2387],[1506,1508,2321,2369,2386,2387],[1505,1508,2321,2369,2386,2387],[1448,1457,1466,1502,1503,1504,1505,1508,1509,1510,1511,1515,1516,2321,2369,2386,2387],[1483,1508,2321,2369,2386,2387],[1506,1507,2321,2369,2386,2387],[1448,1517,2321,2369,2386,2387],[1505,1509,1510,2321,2369,2386,2387],[1508,2321,2369,2386,2387],[483,2321,2369,2386,2387],[103,107,112,2312,2321,2369,2386,2387],[2321,2369,2386,2387,2441],[2321,2369,2386,2387,2439,2441],[2321,2369,2386,2387,2430,2438,2439,2440,2442,2444],[2321,2369,2386,2387,2428],[2321,2369,2386,2387,2431,2436,2441,2444],[2321,2369,2386,2387,2427,2444],[2321,2369,2386,2387,2431,2432,2435,2436,2437,2444],[2321,2369,2386,2387,2431,2432,2433,2435,2436,2444],[2321,2369,2386,2387,2428,2429,2430,2431,2432,2436,2437,2438,2440,2441,2442,2444],[2321,2369,2386,2387,2444],[2321,2369,2386,2387,2426,2428,2429,2430,2431,2432,2433,2435,2436,2437,2438,2439,2440,2441,2442,2443],[2321,2369,2386,2387,2426,2444],[2321,2369,2386,2387,2431,2433,2434,2436,2437,2444],[2321,2369,2386,2387,2435,2444],[2321,2369,2386,2387,2436,2437,2441,2444],[2321,2369,2386,2387,2429,2439],[1695,2321,2369,2386,2387],[1696,1697,1698,2321,2369,2386,2387],[1696,1697,1699,2321,2369,2386,2387],[2321,2369,2386,2387,2421,2476,2477],[2321,2369,2386,2387,2420,2421],[2321,2369,2386,2387,2426,2465],[2321,2369,2386,2387,2452],[2321,2369,2386,2387,2448,2465],[2321,2369,2386,2387,2447,2448,2449,2452,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473],[2321,2369,2386,2387,2469],[2321,2369,2386,2387,2447,2449,2452,2470,2471],[2321,2369,2386,2387,2468,2472],[2321,2369,2386,2387,2447,2450,2451],[2321,2369,2386,2387,2450],[2321,2369,2386,2387,2447,2448,2449,2452,2464],[2321,2369,2386,2387,2453,2458,2464],[2321,2369,2386,2387,2464],[2321,2369,2386,2387,2453,2464],[2321,2369,2386,2387,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463],[2001,2034,2321,2369,2386,2387],[2001,2321,2369,2386,2387],[2034,2035,2036,2321,2369,2386,2387],[2001,2035,2321,2369,2386,2387],[1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,2000,2321,2369,2386,2387],[1983,1984,2001,2321,2369,2386,2387],[1983,2001,2321,2369,2386,2387],[1994,2001,2321,2369,2386,2387],[1996,1997,1998,1999,2321,2369,2386,2387],[1985,2001,2321,2369,2386,2387],[2010,2321,2369,2386,2387],[2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2321,2369,2386,2387],[2002,2010,2012,2321,2369,2386,2387],[2008,2010,2017,2321,2369,2386,2387],[2012,2321,2369,2386,2387],[2010,2012,2321,2369,2386,2387],[2011,2321,2369,2386,2387],[2002,2010,2321,2369,2386,2387],[2003,2004,2005,2006,2007,2008,2009,2011,2321,2369,2386,2387],[2321,2369,2386,2387,2489],[525,2321,2369,2386,2387],[2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2321,2369,2386,2387],[2299,2321,2369,2386,2387],[1579,2321,2369,2386,2387],[1574,1575,2321,2369,2386,2387],[103,107,113,1644,2312,2321,2369,2386,2387],[1647,2321,2369,2386,2387],[103,107,113,1593,1677,2312,2321,2369,2386,2387],[103,107,113,1576,1593,1677,2312,2321,2369,2386,2387],[103,107,113,1677,2312,2321,2369,2386,2387],[1653,2321,2369,2386,2387],[103,107,113,1621,2312,2321,2369,2386,2387],[103,107,113,1677,1681,2312,2321,2369,2386,2387],[1657,2321,2369,2386,2387],[1585,1586,2321,2369,2386,2387],[1584,2321,2369,2386,2387],[103,107,113,1577,2312,2321,2369,2386,2387],[103,107,113,1598,2312,2321,2369,2386,2387],[1595,1596,2321,2369,2386,2387],[1598,2321,2369,2386,2387],[1595,2321,2369,2386,2387],[1590,2321,2369,2386,2387],[1621,1628,1660,1675,1676,1889,2321,2369,2386,2387],[103,107,113,1661,2312,2321,2369,2386,2387],[103,107,113,1590,1615,2312,2321,2369,2386,2387],[1629,2321,2369,2386,2387],[1631,2321,2369,2386,2387],[1684,2321,2369,2386,2387],[103,107,113,1590,1621,2312,2321,2369,2386,2387],[1634,2321,2369,2386,2387],[1686,2321,2369,2386,2387],[103,107,113,1593,1621,2312,2321,2369,2386,2387],[1688,2321,2369,2386,2387],[103,107,113,1590,1591,1621,2312,2321,2369,2386,2387],[1622,2321,2369,2386,2387],[1663,2321,2369,2386,2387],[1603,2321,2369,2386,2387],[1690,2321,2369,2386,2387],[1637,2321,2369,2386,2387],[103,107,113,1621,1677,2312,2321,2369,2386,2387],[103,107,113,1590,1610,1640,1677,2312,2321,2369,2386,2387],[103,107,113,1572,2312,2321,2369,2386,2387],[1692,2321,2369,2386,2387],[103,107,113,1595,1598,2312,2321,2369,2386,2387],[1885,2321,2369,2386,2387],[103,107,113,1597,1598,1694,1884,2312,2321,2369,2386,2387],[1887,2321,2369,2386,2387],[1617,2321,2369,2386,2387],[1616,2321,2369,2386,2387],[1582,2321,2369,2386,2387],[1642,2321,2369,2386,2387],[1667,2321,2369,2386,2387],[103,107,113,1619,2312,2321,2369,2386,2387],[1580,1581,1594,1598,1599,1600,1601,1602,1604,1678,1679,1680,1681,1682,1683,1685,1687,1689,1691,1693,1886,1888,2321,2369,2386,2387],[1573,1576,1578,1594,1598,1599,1600,1601,1602,1604,1889,2321,2369,2386,2387],[1573,1576,1578,1583,1587,2321,2369,2386,2387],[1588,1627,2321,2369,2386,2387],[1623,1624,1625,1626,2321,2369,2386,2387],[1630,1632,1633,1635,1636,1638,1639,1641,1643,1645,1646,1648,1649,1650,1651,1652,1654,1655,1656,1658,1659,2321,2369,2386,2387],[1662,1664,1665,1666,1668,1669,1670,1671,1672,1673,1674,2321,2369,2386,2387],[1610,2321,2369,2386,2387],[1609,2321,2369,2386,2387],[103,107,113,1593,1598,2312,2321,2369,2386,2387],[103,107,113,1576,1593,1598,1600,2312,2321,2369,2386,2387],[1593,1597,2321,2369,2386,2387],[1572,1591,1594,1598,1599,1600,1601,1602,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,2321,2369,2386,2387],[1605,2321,2369,2386,2387],[1593,2321,2369,2386,2387],[103,107,113,1591,1616,2312,2321,2369,2386,2387],[1591,2321,2369,2386,2387],[103,107,113,1591,1605,2312,2321,2369,2386,2387],[2321,2334,2338,2369,2386,2387,2412],[2321,2334,2369,2386,2387,2401,2412],[2321,2329,2369,2386,2387],[2321,2331,2334,2369,2386,2387,2409,2412],[2321,2369,2386,2387,2389,2409],[2321,2329,2369,2386,2387,2419],[2321,2331,2334,2369,2386,2387,2389,2412],[2321,2326,2327,2330,2333,2369,2380,2386,2387,2401,2412],[2321,2334,2341,2369,2386,2387],[2321,2326,2332,2369,2386,2387],[2321,2334,2355,2356,2369,2386,2387],[2321,2330,2334,2369,2386,2387,2404,2412,2419],[2321,2355,2369,2386,2387,2419],[2321,2328,2329,2369,2386,2387,2419],[2321,2334,2369,2386,2387],[2321,2328,2329,2330,2331,2332,2333,2334,2335,2336,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2356,2357,2358,2359,2360,2361,2369,2386,2387],[2321,2334,2349,2369,2386,2387],[2321,2334,2341,2342,2369,2386,2387],[2321,2332,2334,2342,2343,2369,2386,2387],[2321,2333,2369,2386,2387],[2321,2326,2329,2334,2369,2386,2387],[2321,2334,2338,2342,2343,2369,2386,2387],[2321,2338,2369,2386,2387],[2321,2332,2334,2337,2369,2386,2387,2412],[2321,2326,2331,2334,2341,2369,2386,2387],[2321,2369,2386,2387,2401],[2321,2329,2334,2355,2369,2386,2387,2417,2419],[2321,2369,2386,2387,2478,2486,2487,2488,2490],[2321,2369,2386,2387,2478,2486],[2321,2369,2386,2387,2487],[2321,2369,2386,2387,2491,2492],[2321,2369,2386,2387,2477,2493],[2321,2369,2386,2387,2492,2497],[2321,2369,2386,2387,2492,2496],[2321,2369,2386,2387,2477,2497],[2321,2369,2386,2387,2421,2425,2476,2477,2495],[2321,2369,2386,2387,2477],[2321,2369,2386,2387,2477,2501],[91,2321,2369,2386,2387],[87,88,90,2321,2369,2380,2381,2383,2384,2385,2386,2387,2389,2401,2409,2412,2418,2419,2421,2422,2423,2424,2425,2445,2446,2475,2476,2477],[87,88,89,2321,2369,2386,2387,2423],[87,2321,2369,2386,2387],[88,2321,2369,2386,2387],[89,90,2321,2369,2386,2387],[2321,2369,2386,2387,2474],[2321,2369,2386,2387,2421,2477],[103,107,113,1432,1433,2103,2109,2280,2312,2321,2369,2386,2387],[103,106,107,113,2312,2321,2369,2386,2387],[98,102,2321,2369,2386,2387],[102,2321,2369,2386,2387],[104,1533,2321,2369,2386,2387],[104,128,130,136,1533,1535,2321,2369,2386,2387],[104,128,1533,2321,2369,2386,2387],[103,104,105,107,109,110,111,113,137,140,1535,1537,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,133,2312,2321,2369,2386,2387],[103,104,105,107,113,1439,1949,2312,2321,2369,2386,2387],[92,103,104,105,107,113,137,1105,1413,1429,1521,1544,1592,1593,1949,1952,1953,1954,1955,1956,1970,1971,2312,2321,2369,2386,2387],[103,104,105,107,113,1413,1536,2312,2315,2321,2369,2386,2387],[103,104,105,107,109,113,2312,2321,2369,2386,2387],[103,104,105,107,113,2312,2321,2369,2386,2387],[103,104,105,107,113,1975,2312,2321,2369,2386,2387],[92,103,104,105,107,113,1110,2056,2064,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1105,2058,2312,2321,2369,2386,2387],[104,1413,2321,2369,2386,2387],[103,104,105,107,113,1104,2068,2069,2070,2312,2321,2369,2386,2387],[103,104,105,107,109,113,1104,2068,2312,2321,2369,2386,2387],[103,104,105,107,113,1110,2069,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1110,2312,2321,2369,2386,2387],[103,104,105,107,113,1413,1542,2060,2073,2312,2321,2369,2386,2387],[103,104,105,107,113,2073,2312,2321,2369,2386,2387],[104,2321,2369,2386,2387],[103,104,105,107,113,2073,2074,2075,2076,2077,2312,2321,2369,2386,2387],[103,104,105,107,113,2058,2073,2078,2312,2321,2369,2386,2387],[103,104,105,107,113,2059,2312,2321,2369,2386,2387],[103,104,107,113,1104,1105,1544,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,2059,2061,2062,2312,2321,2369,2386,2387],[103,104,105,107,109,113,1535,2057,2058,2059,2062,2063,2064,2312,2321,2369,2386,2387],[103,104,105,107,113,1443,2312,2321,2369,2386,2387],[103,104,105,107,109,113,1104,2312,2321,2369,2386,2387],[103,104,105,107,113,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1948,1949,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1105,1413,1429,1444,1445,1518,1519,1534,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,128,130,137,1104,1105,1535,2083,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1413,1429,1955,2097,2312,2321,2369,2386,2387],[103,104,107,113,1534,2312,2321,2369,2386,2387],[104,134,140,2321,2369,2386,2387],[104,107,2315,2321,2369,2386,2387],[104,1105,2100,2321,2369,2386,2387],[103,104,107,113,137,2312,2321,2369,2386,2387],[104,2105,2107,2109,2111,2113,2321,2369,2386,2387],[103,104,107,113,1413,2117,2312,2321,2369,2386,2387],[92,103,104,107,113,2119,2120,2312,2321,2369,2386,2387],[103,104,107,113,2122,2312,2321,2369,2386,2387],[103,104,107,113,1528,2124,2312,2321,2369,2386,2387],[103,104,105,107,113,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,143,2312,2315,2321,2369,2386,2387],[103,104,105,107,109,113,140,142,144,145,146,148,149,1106,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,134,143,147,2312,2321,2369,2386,2387],[103,104,105,107,113,137,150,1105,2312,2321,2369,2386,2387],[103,104,105,107,113,134,140,1535,2312,2321,2369,2386,2387],[92,103,104,105,107,109,113,140,2312,2321,2369,2386,2387],[103,104,105,107,113,140,141,2312,2321,2369,2386,2387],[103,104,105,107,113,140,1113,1535,2312,2321,2369,2386,2387],[103,104,105,107,111,113,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,133,1110,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,1111,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,137,140,1109,1112,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,1107,1108,1114,2312,2321,2369,2386,2387],[92,103,104,107,113,1534,1538,1539,1540,2312,2321,2369,2386,2387],[104,107,128,129,133,134,136,137,1527,1528,2315,2321,2369,2386,2387],[104,107,1535,2315,2321,2369,2386,2387],[104,107,111,133,137,1527,2315,2321,2369,2386,2387],[104,107,129,1115,1117,1118,1416,1417,1419,1420,1422,1426,1428,1526,2315,2321,2369,2386,2387],[104,113,2321,2369,2386,2387],[104,113,1534,2321,2369,2386,2387],[104,107,113,129,133,2315,2321,2369,2386,2387],[94,104,113,132,135,138,139,2321,2369,2386,2387],[104,107,113,129,131,132,135,136,1528,2315,2321,2369,2386,2387],[104,132,134,135,137,1528,2321,2369,2386,2387],[104,1081,1104,2321,2369,2386,2387],[104,687,2321,2369,2386,2387],[104,137,2321,2369,2386,2387],[104,114,127,130,1529,1530,2321,2369,2386,2387],[104,114,1530,2321,2369,2386,2387],[104,114,127,128,129,130,136,1105,1528,1530,1531,1532,2321,2369,2386,2387],[114,1530,2321,2369,2386,2387],[104,2314,2321,2369,2386,2387],[94,104,127,2321,2369,2386,2387],[103,104,105,107,113,129,131,136,137,1104,1413,1415,1418,2312,2321,2369,2386,2387],[103,104,105,107,113,129,131,136,137,1104,1414,1415,2312,2321,2369,2386,2387],[103,104,105,107,113,129,131,132,135,137,1104,1413,1414,1415,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,1551,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1542,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1542,2060,2132,2312,2321,2369,2386,2387],[103,104,105,107,113,147,1104,1542,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1528,1542,2060,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1552,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1553,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1430,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1535,1554,2312,2321,2369,2386,2387],[103,104,105,107,113,2140,2143,2144,2312,2321,2369,2386,2387],[103,104,105,107,113,2140,2141,2142,2312,2321,2369,2386,2387],[103,104,105,107,113,2141,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,2140,2312,2321,2369,2386,2387],[103,104,105,107,113,140,2140,2312,2321,2369,2386,2387],[103,104,107,113,1104,1105,1554,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1554,2060,2146,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1554,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1110,1413,1548,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1413,1544,1548,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1110,1413,1548,2060,2150,2151,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1105,1534,1555,1556,1557,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1557,2060,2153,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1557,2060,2156,2312,2321,2369,2386,2387],[103,104,105,107,113,687,1105,1413,1421,1429,1524,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1110,1543,2155,2312,2321,2369,2386,2387],[103,104,105,107,111,113,1528,1543,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1104,1105,1413,1429,1522,1534,1547,1559,1974,2060,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,137,1104,1105,1429,1444,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1104,1105,1413,1429,1518,1519,1534,1974,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,2057,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1110,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,1424,2312,2321,2369,2386,2387],[103,104,105,107,113,1413,1424,2312,2321,2369,2386,2387],[103,104,105,107,113,483,1413,1424,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2312,2321,2369,2386,2387],[104,2166,2168,2321,2369,2386,2387],[103,104,105,107,113,2174,2312,2321,2369,2386,2387],[104,2175,2176,2321,2369,2386,2387],[103,104,105,107,113,483,1105,2057,2312,2321,2369,2386,2387],[103,104,105,107,113,483,1105,2057,2178,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2178,2312,2321,2369,2386,2387],[104,2178,2179,2180,2321,2369,2386,2387],[103,104,105,107,113,2182,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2182,2312,2321,2369,2386,2387],[104,2182,2183,2184,2321,2369,2386,2387],[103,104,105,107,113,483,1105,2057,2186,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2186,2312,2321,2369,2386,2387],[104,2186,2187,2188,2321,2369,2386,2387],[103,104,105,107,113,2171,2190,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2190,2312,2321,2369,2386,2387],[104,2190,2191,2192,2321,2369,2386,2387],[103,104,105,107,113,2171,2194,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2194,2312,2321,2369,2386,2387],[104,2194,2195,2196,2321,2369,2386,2387],[103,104,105,107,113,2198,2312,2321,2369,2386,2387],[103,104,105,107,113,1423,2198,2312,2321,2369,2386,2387],[104,2198,2199,2200,2321,2369,2386,2387],[103,104,105,107,113,2202,2312,2321,2369,2386,2387],[104,2202,2203,2204,2321,2369,2386,2387],[103,104,105,107,113,483,1105,2058,2206,2312,2321,2369,2386,2387],[104,2206,2207,2321,2369,2386,2387],[103,104,105,107,113,2209,2312,2321,2369,2386,2387],[104,2209,2210,2211,2321,2369,2386,2387],[103,104,105,107,113,483,1105,2057,2213,2312,2321,2369,2386,2387],[103,104,105,107,113,2167,2213,2312,2321,2369,2386,2387],[104,2213,2214,2215,2321,2369,2386,2387],[103,104,105,107,113,2217,2312,2321,2369,2386,2387],[104,2217,2218,2219,2321,2369,2386,2387],[103,104,105,107,113,1110,1423,1424,2165,2172,2173,2312,2321,2369,2386,2387],[103,104,105,107,113,1423,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1413,1423,1425,2312,2321,2369,2386,2387],[103,104,105,107,109,113,2222,2312,2321,2369,2386,2387],[103,104,105,107,113,1423,2223,2312,2321,2369,2386,2387],[103,104,105,107,113,1423,2165,2169,2312,2321,2369,2386,2387],[103,104,105,107,113,127,1104,1105,1558,1560,1566,2099,2225,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1528,1566,2060,2129,2227,2228,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,2100,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1566,2058,2060,2081,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1566,2058,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1421,2312,2321,2369,2386,2387],[103,104,105,107,113,136,1104,1105,1413,1443,2312,2321,2369,2386,2387],[103,104,105,107,113,137,687,1413,1421,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,687,1104,1105,1421,1524,1557,2312,2321,2369,2386,2387],[103,104,105,107,113,1116,2312,2321,2369,2386,2387],[103,104,105,107,113,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,687,1104,1105,1413,1427,2312,2321,2369,2386,2387],[103,104,105,107,113,687,1104,1105,1427,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1413,1549,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1545,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1545,2060,2240,2312,2321,2369,2386,2387],[103,104,105,107,113,1545,2060,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1545,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1545,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1545,2060,2238,2312,2321,2369,2386,2387],[103,104,105,107,113,127,147,1104,1105,1546,2312,2321,2369,2386,2387],[103,104,105,107,113,1528,1546,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1546,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1546,2245,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1413,1429,1547,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1555,2058,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1105,1555,2248,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1556,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1556,2060,2250,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1555,1556,1557,1559,2058,2099,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1557,1559,2060,2099,2252,2312,2321,2369,2386,2387],[103,104,105,107,111,113,1104,1110,1528,1558,2058,2312,2321,2369,2386,2387],[103,104,105,107,111,113,1104,1105,1558,2060,2254,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1110,1558,1559,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1559,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1559,2060,2256,2257,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1560,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1560,2060,2259,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1528,1560,2060,2261,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1414,1561,2130,2312,2321,2369,2386,2387],[103,104,105,107,113,1561,2130,2263,2312,2321,2369,2386,2387],[103,104,105,107,113,127,1561,2312,2321,2369,2386,2387],[103,104,105,107,113,1562,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1563,2058,2312,2321,2369,2386,2387],[103,104,105,107,113,1563,2267,2312,2321,2369,2386,2387],[103,104,105,107,113,150,1105,2312,2321,2369,2386,2387],[103,104,105,107,113,150,2312,2321,2369,2386,2387],[103,104,105,107,113,150,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,147,150,1104,2312,2321,2369,2386,2387],[103,104,105,107,113,150,1105,1528,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1564,2312,2321,2369,2386,2387],[103,104,105,107,113,1564,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1565,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1535,1565,2312,2321,2369,2386,2387],[103,104,105,107,113,1565,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1565,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1550,2060,2281,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1105,1429,1444,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1105,1413,1421,1429,1430,1445,1520,1522,1534,1972,2060,2312,2321,2369,2386,2387],[103,104,105,107,113,1104,1105,1413,1429,1534,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,687,1105,1413,1421,1429,1524,1534,2312,2321,2369,2386,2387],[103,104,105,107,113,1421,1534,2312,2321,2369,2386,2387],[103,104,105,107,113,1429,2312,2321,2369,2386,2387],[103,104,105,107,113,1429,2299,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1429,1433,2312,2321,2369,2386,2387],[103,104,105,107,113,1105,1429,2312,2321,2369,2386,2387],[103,104,105,107,113,687,1413,1429,1439,2312,2321,2369,2386,2387],[103,104,105,107,113,1429,1534,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1104,1105,1413,1429,1431,1434,1435,1436,1437,1438,1440,1441,1442,1520,1521,1534,1535,2312,2321,2369,2386,2387],[103,104,105,107,113,137,687,1105,1413,1421,1429,1430,1431,1522,1523,1525,1534,1547,2060,2300,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,137,687,1105,1413,1429,1430,1522,1523,1525,1534,2312,2321,2369,2386,2387],[103,104,105,107,113,137,687,1105,1413,1421,1429,1430,1431,1522,1523,1525,1534,1547,1555,2060,2300,2312,2315,2321,2369,2386,2387],[103,104,105,107,113,2068,2070,2312,2321,2369,2386,2387],[103,104,105,107,113,2083,2312,2321,2369,2386,2387],[103,104,105,107,113,137,1104,1413,1533,1970,2312,2321,2369,2386,2387],[103,104,105,107,113,131,137,1104,1105,1413,1418,2312,2321,2369,2386,2387],[103,104,105,107,113,140,1110,1413,1429,1534,1547,2130,2281,2312,2321,2369,2386,2387],[107,2315,2321,2369,2386,2387],[104,2321,2369,2381,2386,2387,2391,2412,2477,2482,2485,2494,2498,2499,2500,2502,2503]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"19efad8495a7a6b064483fccd1d2b427403dd84e67819f86d1c6ee3d7abf749c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},"65996936fbb042915f7b74a200fcdde7e410f32a669b1ab9597cfaa4b0faddb5",{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"524a409ad72186b7f6cb16898c349465cfa876f641d6cb6137b3123d5cfca619","impliedFormat":1},{"version":"ebe84ad8344962b7117a3b95065f47383215020eaf1b626463863b45b4d16e62","impliedFormat":1},{"version":"de5abbc02627403ac5796572520dc2b42df54f1257e7218a9ef37509d9b56972","impliedFormat":1},{"version":"8fefccf7758a68c7053d9830ba385f45300b612807629f3559630988abeca71b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"0e0542f4d578424ae30421da410c0efb116a350dabaf63c4635ce41f5551ba1f","impliedFormat":1},{"version":"c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62","impliedFormat":99},{"version":"318d19118bf6bf8d088441c948990f53cafc79ed581b78f3d41a0f7a3f5f145c","impliedFormat":1},{"version":"25900318042675aee6d709c82309effd29c995d03f92f8b7a469d38e07c7f846","affectsGlobalScope":true,"impliedFormat":1},{"version":"860814185d89237c84a6bd1e4f108c2c0b2401609a74a33bc7cab14ea4ee9f21","impliedFormat":99},{"version":"e1ddcbacb7658bf0683bca4ebd31bd05f64823712651263bfc75128a45f00ff7","impliedFormat":99},{"version":"5b2f1e43f07ae5590bd899398b23b2d114ed9c3b6b3fb4cb60d4c6216d712b87","impliedFormat":99},{"version":"94c8b35ee85f4a36f1536050dd2eed1490239340f72733d787b84f6ee13b3dbb","impliedFormat":99},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"8581f0150a40bc1df613e00da0100ee40bfefa9fbc9b230a0076c9a308c244c8","signature":"7619d41131900b9c062164455e3b48429842941c90917209f97b32e766572d3e"},{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"a69e8bce30aea7ec98f3b6ddfbc378c92826fede01aafbaec703057c2503ea51","impliedFormat":1},{"version":"faf770b3935c2ba6558b2bb65af5d5de58945d81f496dc1a5938c41a1abb358b","impliedFormat":99},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"40de86ced5175a6ffe84a52abe6ac59ac0efbc604a5975a8c6476c3ddc682ff1","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"5a0b15210129310cee9fa6af9200714bb4b12af4a04d890e15f34dbea1cf1852","impliedFormat":1},{"version":"0244119dbcbcf34faf3ffdae72dab1e9bc2bc9efc3c477b2240ffa94af3bca56","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"9701c8a809fc4799215b4be61e7d77485a6c269ce54d0793c53c0182f6168658","signature":"be07557fd9157ca6b5d1978c21c8d88d3f67eb0f78b4a8ca35df1082dca9936c"},{"version":"0faed574ac7add37d53fd63688d470292b1c9375500cb1b9d59e40982a6a2d4c","signature":"563cbeff1949c04c2ef8019f53fb0a662b952f5899c91f4023d4a1cace3e6a12"},{"version":"458ba7766b75821db88a9e3a82d1a5a077601407df7074cdae0aaeb420a12227","signature":"d65de4df2e4daedbd81cb2eac348261cd44bc66fe7f3621eaffe645e88dad130"},{"version":"049ab0431e432e82a8d4e9e67c226a1b06b0b7fbc717947b31de14bd45d2432a","signature":"9c5665b1986e8b8ed1a649a90eeea270c9108d07bed500ecfdd64db46fa27c74"},{"version":"0fece3f69b2d8b9625171e6baded9b978a4c9507fdd12b46d66c2f19ee16d881","signature":"63205b21c5c43b3b72b01921324508b5eee86fc33c9a929482b9d5341c0fb036"},{"version":"c78e57507f352ed3f4b0121f748e0ab2ae86e6379fda3d55c907e9a05ee44d13","signature":"e3991e8c3b7b2908e01e3db099c7774c514309d1d4b941476948c4e237a8cfc2"},{"version":"7a41ff742ae9b818a2a7a7fb158870393619a5a5fb773b181ea482b631cfb061","signature":"4a523b3cefa160981ce7248da0f144f61c77cf3661a551ea1cb6272e1523c90d"},{"version":"c6f9373ea1968b4958b855e30904f2a7d0152b9b477241f523895a4941ba7108","signature":"e424f6182ba6a69c94530430c7b2b4f9b63f0c5dff951a7a4fd804a6dfa784da"},{"version":"9ceb5d09a35a13c567b0d489ee550a9adc6981d4ed2b32811c7c3dd7ca00df8d","signature":"182894ae29f669ba9b640841a71aa5148d256a416f4008353eda6761c5dc30d2"},{"version":"46891b2836f1953416414c93c96fabf621e3b94c65be237eaf2aabcfcee409d7","signature":"8d83a9b4f436f29ecdd89af3994aa55a1dafd8511bb7eb356f897a810b223b81"},{"version":"f3688d50959d31cf849535023dceb5bec1f48eb68b6e9fb9273ade1c64daa1eb","signature":"ceba66401fa2692ae179b26fabbaea855a2409014371133f8a26a306111183e1"},{"version":"8c98a68934697f4ec08a5d3a293a6771b8f3d963d0c21e6f433f95bda580a314","signature":"381f39a2c6a9508f653a84b43b346867d70896712655853e8a2dfcef3c0b8aec"},{"version":"629b4a81c8e38f30e8144b6a6b37adda26b4669858d3c24748443e1017f6dcfe","signature":"24d764db1a0643c6d9477799e3c1add95ca2cfbb0bae0768f3281c2d0dc0dfff"},{"version":"5f35695b50bcd8c9b60b67d0ecbc342ac9492119056c10796fb1944bf34109a4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"27a47c5461677ba48f59978dfcb094cdfa10f772bbb28cd158c1b4818413b016","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"48c5eaab5574f1c388873fcb1b6fee5e657ea930867e5cd84dc9593eaf337189","signature":"690f8331a0b8a5aad028db258b13ef9a18a04afe5622903361f5be4b89c913cd"},{"version":"b4492c3409a367c459fadc11294b0eae8fc81463c1be5112b3f0c4afdec4c489","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"5903f95657f31e779d3f5d4e1568582da03c631e553de96999cab75d3fed1dc1","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"176eccb49c5e533cac85b5a5bc077f4ca5d026604962ef2ee7ed1c15c79cbdf4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"c39cb8aac612362378716ecdebd348df782cc24445e9e8238f5b011518816850","signature":"3e7a4f70f4dfd529a9b3bfd247a83d4c2e02746edc3d9079b7bc0f1392e5087b"},{"version":"ecb915eb83c1df5622ef6d68214c2a45e17270c395b4f2c1964ecd433a19847b","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"acd4045783fafe623f2d35019e5dd82221cc34173a43421b30aa99ab2e58d7a3","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"b2d710eeb8708d0a1d42a4e7f08d569d96e9b172132cf0d57609e03f215ca15b","signature":"a131fb8810b3011fa3dae35c6b0c19ca10edd96d099a987d63a6bd6c8f488bb1"},{"version":"55f16f0ff7dd262a9580fefab47b85fa13bc54ebf21279392fd049c78f7f16d1","impliedFormat":1},{"version":"8c88919faba2b1eb94197a0f3e21d6a827aa574edf4f6c1d0fc402a754749dc8","impliedFormat":1},{"version":"c8044346db3a2a4dcd61dfd96c7cefcb6b1c212ee3e48d474253aafc79970658","impliedFormat":1},{"version":"445f99b5b19666f40eb49bbdedb117a9d9713b91095ea49a371f7941e6a8e0e0","impliedFormat":1},{"version":"d0d35f701530154b2d2c119bd628543e94963a8b43568b61119299eba8f1d4c7","impliedFormat":1},{"version":"d9618b24b11dab78cb0232eef9f3c53cd82e5bc5c998685283265eb82a395b9e","impliedFormat":1},{"version":"a9e6b1ecb19c3094b7ad0075b2910f76e100b9bc04aa7436a33968af73aeba3f","impliedFormat":1},{"version":"7a536e3ebcee17d5d3c3f9466484e97643d81fcf60f1be83a29b7c29326fc076","impliedFormat":1},{"version":"1df8ecdd79b8d5fd6db26c794f25b306a871ca33526967225a7eda4a48384c4c","impliedFormat":1},{"version":"9680c5777715120af62968d8dc0f903e4328eec5518a4e2490caaa1c080ac32d","impliedFormat":1},{"version":"94abb9c4a3661f09b71006cf9f7ace48b80977831f2f81934d40dd81d52c892d","impliedFormat":1},{"version":"f637ba5370e6cab04d4a0b622517bdf2bea791287fb67282eafa0c07cbe55172","impliedFormat":1},{"version":"502d86bc361f90e6255d35a3b7a58dab4130dd1fd0972731d69190968b65e2ff","impliedFormat":1},{"version":"55e52908b8cd39f6d28862d2786ae205b5ff406c5f1652018fb4f4f2193b6834","impliedFormat":1},{"version":"37be5251e2670095621b9a5108db7e200c26edd88ea86fa95a11439a5f72ca55","impliedFormat":1},{"version":"c6ac9cddacb38c304b4e3e6247b02032039ddc35d27e31d11b74452b73ac366d","impliedFormat":1},{"version":"96cf61a20a43a45d6aecdd774c04b62d56b98b68f5b8281ce9cd9cf99400e650","impliedFormat":1},{"version":"ef5530c5dcbe6787a3329c576e87100e920d6eae1b24ea25988d6758c98fdc88","impliedFormat":1},{"version":"0a7e987533de7a29e57d966b7d0d07f483cf03ba5e4c8a0a0793d6730373cb33","impliedFormat":1},{"version":"a298d8f582d84941168e725933c7116b8089b4967c071e86a231dc4d8aeab415","impliedFormat":1},{"version":"7e0f65da240a84018008f2dba1b00d48ea6d20de8034a071431984f96fb714ae","impliedFormat":1},{"version":"d88f975470fb9352bb5c19b1648e820f070449d109a16598173aecf136341b6d","impliedFormat":1},{"version":"fa833a23d1cecc35c100456a55c3842539d6ae24f9750a33c88dcfc1a248002d","impliedFormat":1},{"version":"8f3b798b039eb617b6195743f0a4bc33cce160ba3550b3713fef422942d812d9","impliedFormat":1},{"version":"7cfcc6812e72d9798d39e9be36ced6c35afdc3d7a31891ca782400b34f43e052","impliedFormat":1},{"version":"d54f0d672071e90edb13875ff3115f21716eb3132b25462e92a74108c25c0d48","impliedFormat":1},{"version":"87efca7cf70fc12e5ff28912f86a28f268f8ddd73a9d33c3ac0f091f09bc111f","impliedFormat":1},{"version":"f194d954a36cb19f15e80ac6730b118e57d85f10c05d4374641a85a19dacd27f","impliedFormat":1},{"version":"cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","impliedFormat":99},{"version":"90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","impliedFormat":99},{"version":"ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","impliedFormat":99},{"version":"afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","impliedFormat":99},{"version":"5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","impliedFormat":99},{"version":"7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","impliedFormat":99},{"version":"90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","impliedFormat":99},{"version":"a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","impliedFormat":99},{"version":"bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","impliedFormat":99},{"version":"bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","impliedFormat":99},{"version":"fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","impliedFormat":99},{"version":"15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","impliedFormat":99},{"version":"51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","impliedFormat":99},{"version":"ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","impliedFormat":99},{"version":"9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","impliedFormat":99},{"version":"391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","impliedFormat":99},{"version":"ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","impliedFormat":99},{"version":"633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","impliedFormat":99},{"version":"6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","impliedFormat":99},{"version":"ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","impliedFormat":99},{"version":"22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","impliedFormat":99},{"version":"7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","impliedFormat":99},{"version":"0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","impliedFormat":99},{"version":"91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","impliedFormat":99},{"version":"d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","impliedFormat":99},{"version":"ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","impliedFormat":99},{"version":"9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","impliedFormat":99},{"version":"90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","impliedFormat":99},{"version":"49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","impliedFormat":99},{"version":"8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","impliedFormat":99},{"version":"49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","impliedFormat":99},{"version":"59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","impliedFormat":99},{"version":"33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","impliedFormat":99},{"version":"605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","impliedFormat":99},{"version":"a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","impliedFormat":99},{"version":"0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","impliedFormat":99},{"version":"cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","impliedFormat":99},{"version":"f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","impliedFormat":99},{"version":"530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","impliedFormat":99},{"version":"165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","impliedFormat":99},{"version":"61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","impliedFormat":99},{"version":"69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","impliedFormat":99},{"version":"fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","impliedFormat":99},{"version":"c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","impliedFormat":99},{"version":"ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","impliedFormat":99},{"version":"e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","impliedFormat":99},{"version":"7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","impliedFormat":99},{"version":"ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","impliedFormat":99},{"version":"ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","impliedFormat":99},{"version":"4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","impliedFormat":99},{"version":"57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","impliedFormat":99},{"version":"d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","impliedFormat":99},{"version":"be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","impliedFormat":99},{"version":"c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","impliedFormat":99},{"version":"d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","impliedFormat":99},{"version":"01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","impliedFormat":99},{"version":"ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","impliedFormat":99},{"version":"39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","impliedFormat":99},{"version":"0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","impliedFormat":99},{"version":"2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","impliedFormat":99},{"version":"d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","impliedFormat":99},{"version":"bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","impliedFormat":99},{"version":"f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","impliedFormat":99},{"version":"2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","impliedFormat":99},{"version":"05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","impliedFormat":99},{"version":"62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","impliedFormat":99},{"version":"ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","impliedFormat":99},{"version":"59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","impliedFormat":99},{"version":"84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","impliedFormat":99},{"version":"43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","impliedFormat":99},{"version":"a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","impliedFormat":99},{"version":"1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","impliedFormat":99},{"version":"256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","impliedFormat":99},{"version":"d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","impliedFormat":99},{"version":"e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","impliedFormat":99},{"version":"91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","impliedFormat":99},{"version":"03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","impliedFormat":99},{"version":"e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","impliedFormat":99},{"version":"bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","impliedFormat":99},{"version":"985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","impliedFormat":99},{"version":"6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","impliedFormat":99},{"version":"89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","impliedFormat":99},{"version":"44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","impliedFormat":99},{"version":"ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","impliedFormat":99},{"version":"858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","impliedFormat":99},{"version":"60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","impliedFormat":99},{"version":"409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","impliedFormat":99},{"version":"b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","impliedFormat":99},{"version":"c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","impliedFormat":99},{"version":"99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","impliedFormat":99},{"version":"c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","impliedFormat":99},{"version":"42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","impliedFormat":99},{"version":"542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","impliedFormat":99},{"version":"97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","impliedFormat":99},{"version":"d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","impliedFormat":99},{"version":"0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","impliedFormat":99},{"version":"b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","impliedFormat":99},{"version":"d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","impliedFormat":99},{"version":"d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","impliedFormat":99},{"version":"73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","impliedFormat":99},{"version":"cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","impliedFormat":99},{"version":"301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","impliedFormat":99},{"version":"711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","impliedFormat":99},{"version":"e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","impliedFormat":99},{"version":"17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","impliedFormat":99},{"version":"73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","impliedFormat":99},{"version":"2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","impliedFormat":99},{"version":"c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","impliedFormat":99},{"version":"c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","impliedFormat":99},{"version":"5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","impliedFormat":99},{"version":"f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","impliedFormat":99},{"version":"9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","impliedFormat":99},{"version":"5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","impliedFormat":99},{"version":"24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","impliedFormat":99},{"version":"bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","impliedFormat":99},{"version":"75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","impliedFormat":99},{"version":"3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","impliedFormat":99},{"version":"da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","impliedFormat":99},{"version":"3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","impliedFormat":99},{"version":"1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","impliedFormat":99},{"version":"2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","impliedFormat":99},{"version":"41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","impliedFormat":99},{"version":"6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","impliedFormat":99},{"version":"e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","impliedFormat":99},{"version":"2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","impliedFormat":99},{"version":"4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","impliedFormat":99},{"version":"bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","impliedFormat":99},{"version":"62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","impliedFormat":99},{"version":"be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","impliedFormat":99},{"version":"cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","impliedFormat":99},{"version":"b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","impliedFormat":99},{"version":"164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","impliedFormat":99},{"version":"b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","impliedFormat":99},{"version":"a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","impliedFormat":99},{"version":"8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","impliedFormat":99},{"version":"0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","impliedFormat":99},{"version":"0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","impliedFormat":99},{"version":"7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","impliedFormat":99},{"version":"81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","impliedFormat":99},{"version":"0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","impliedFormat":99},{"version":"b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","impliedFormat":99},{"version":"7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","impliedFormat":99},{"version":"8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","impliedFormat":99},{"version":"e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","impliedFormat":99},{"version":"3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","impliedFormat":99},{"version":"fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","impliedFormat":99},{"version":"99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","impliedFormat":99},{"version":"5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","impliedFormat":99},{"version":"7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","impliedFormat":99},{"version":"0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","impliedFormat":99},{"version":"3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","impliedFormat":99},{"version":"ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","impliedFormat":99},{"version":"89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","impliedFormat":99},{"version":"7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","impliedFormat":99},{"version":"512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","impliedFormat":99},{"version":"6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","impliedFormat":99},{"version":"f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","impliedFormat":99},{"version":"dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","impliedFormat":99},{"version":"a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","impliedFormat":99},{"version":"3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","impliedFormat":99},{"version":"394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","impliedFormat":99},{"version":"0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","impliedFormat":99},{"version":"a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","impliedFormat":99},{"version":"659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","impliedFormat":99},{"version":"1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","impliedFormat":99},{"version":"500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","impliedFormat":99},{"version":"a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","impliedFormat":99},{"version":"e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","impliedFormat":99},{"version":"7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","impliedFormat":99},{"version":"17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","impliedFormat":99},{"version":"f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","impliedFormat":99},{"version":"231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","impliedFormat":99},{"version":"6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","impliedFormat":99},{"version":"65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","impliedFormat":99},{"version":"787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","impliedFormat":99},{"version":"5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","impliedFormat":99},{"version":"bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","impliedFormat":99},{"version":"d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","impliedFormat":99},{"version":"6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","impliedFormat":99},{"version":"1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","impliedFormat":99},{"version":"de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","impliedFormat":99},{"version":"98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","impliedFormat":99},{"version":"9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","impliedFormat":99},{"version":"31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","impliedFormat":99},{"version":"2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","impliedFormat":99},{"version":"666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","impliedFormat":99},{"version":"a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","impliedFormat":99},{"version":"07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","impliedFormat":99},{"version":"39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","impliedFormat":99},{"version":"b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","impliedFormat":99},{"version":"f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","impliedFormat":99},{"version":"8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","impliedFormat":99},{"version":"ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","impliedFormat":99},{"version":"d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","impliedFormat":99},{"version":"19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","impliedFormat":99},{"version":"553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","impliedFormat":99},{"version":"1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","impliedFormat":99},{"version":"f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","impliedFormat":99},{"version":"e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","impliedFormat":99},{"version":"9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","impliedFormat":99},{"version":"0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","impliedFormat":99},{"version":"2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","impliedFormat":99},{"version":"17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","impliedFormat":99},{"version":"3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","impliedFormat":99},{"version":"41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","impliedFormat":99},{"version":"17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","impliedFormat":99},{"version":"ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","impliedFormat":99},{"version":"ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","impliedFormat":99},{"version":"b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","impliedFormat":99},{"version":"73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","impliedFormat":99},{"version":"d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","impliedFormat":99},{"version":"4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","impliedFormat":99},{"version":"58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","impliedFormat":99},{"version":"a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","impliedFormat":99},{"version":"df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","impliedFormat":99},{"version":"256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","impliedFormat":99},{"version":"9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","impliedFormat":99},{"version":"07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","impliedFormat":99},{"version":"1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","impliedFormat":99},{"version":"6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","impliedFormat":99},{"version":"34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","impliedFormat":99},{"version":"a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","impliedFormat":99},{"version":"ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","impliedFormat":99},{"version":"35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","impliedFormat":99},{"version":"2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","impliedFormat":99},{"version":"1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","impliedFormat":99},{"version":"9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","impliedFormat":99},{"version":"0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","impliedFormat":99},{"version":"6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","impliedFormat":99},{"version":"9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","impliedFormat":99},{"version":"f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","impliedFormat":99},{"version":"674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","impliedFormat":99},{"version":"41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","impliedFormat":99},{"version":"44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","impliedFormat":99},{"version":"6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","impliedFormat":99},{"version":"e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","impliedFormat":99},{"version":"62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","impliedFormat":99},{"version":"4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","impliedFormat":99},{"version":"f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","impliedFormat":99},{"version":"279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","impliedFormat":99},{"version":"a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","impliedFormat":99},{"version":"f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","impliedFormat":99},{"version":"3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","impliedFormat":99},{"version":"21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","impliedFormat":99},{"version":"2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","impliedFormat":99},{"version":"d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","impliedFormat":99},{"version":"395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","impliedFormat":99},{"version":"d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","impliedFormat":99},{"version":"ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","impliedFormat":99},{"version":"cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","impliedFormat":99},{"version":"2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","impliedFormat":99},{"version":"9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","impliedFormat":99},{"version":"c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","impliedFormat":99},{"version":"25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","impliedFormat":99},{"version":"d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","impliedFormat":99},{"version":"1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","impliedFormat":99},{"version":"7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","impliedFormat":99},{"version":"d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","impliedFormat":99},{"version":"05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","impliedFormat":99},{"version":"a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","impliedFormat":99},{"version":"7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","impliedFormat":99},{"version":"e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","impliedFormat":99},{"version":"619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","impliedFormat":99},{"version":"88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","impliedFormat":99},{"version":"044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","impliedFormat":99},{"version":"a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","impliedFormat":99},{"version":"5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","impliedFormat":99},{"version":"13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","impliedFormat":99},{"version":"7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","impliedFormat":99},{"version":"601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","impliedFormat":99},{"version":"168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","impliedFormat":99},{"version":"37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","impliedFormat":99},{"version":"f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","impliedFormat":99},{"version":"823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","impliedFormat":99},{"version":"b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","impliedFormat":99},{"version":"a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","impliedFormat":99},{"version":"0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","impliedFormat":99},{"version":"d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","impliedFormat":99},{"version":"824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","impliedFormat":99},{"version":"84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","impliedFormat":99},{"version":"35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","impliedFormat":99},{"version":"64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","impliedFormat":99},{"version":"0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","impliedFormat":99},{"version":"7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","impliedFormat":99},{"version":"3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","impliedFormat":99},{"version":"aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","impliedFormat":99},{"version":"1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","impliedFormat":99},{"version":"d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","impliedFormat":99},{"version":"dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","impliedFormat":99},{"version":"427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","impliedFormat":99},{"version":"c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","impliedFormat":99},{"version":"7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","impliedFormat":99},{"version":"57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","impliedFormat":99},{"version":"8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","impliedFormat":99},{"version":"810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","impliedFormat":99},{"version":"87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","impliedFormat":99},{"version":"28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","impliedFormat":99},{"version":"cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","impliedFormat":99},{"version":"d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","impliedFormat":99},{"version":"4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","impliedFormat":99},{"version":"9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","impliedFormat":99},{"version":"74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","impliedFormat":99},{"version":"4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","impliedFormat":99},{"version":"4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","impliedFormat":99},{"version":"48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","impliedFormat":99},{"version":"2a80ab285da5ec06299594edb456abd51ee69a7506278cca24e1ab494a86952b","impliedFormat":99},{"version":"d7c334ef4c10e9f7c8ebed40342b311ae77de6e80febf22a23927c774957b2ec","impliedFormat":1},{"version":"201688a543bd945e4cb8c9affe99e801fcd97b5dc27080b45fa5653a91f02c30","impliedFormat":99},{"version":"39bdb75d428f49bafbbb4ebd79d48a019c8912e31906ef676e88e6d98b4a62c0","impliedFormat":99},{"version":"015af3f63dc78f5e0219debe1e00649f77877327ef539fbab9a5bb1cbb0f1379","impliedFormat":1},{"version":"486057fe8c8d495fb331e7d6c52524888ba890364993153fabf53b1c870ea10f","impliedFormat":1},{"version":"2639085533befdc499c15a8b9f4087fab12eb1a579cc3bd3008222f6be7f9a1f","impliedFormat":1},{"version":"c48f61fc0470c3437ee79f736ca4cb8d478868377e5993dd5cf2c4f153f3fb13","impliedFormat":1},{"version":"bbd033845ce7f8dcbee73a6cbabfa50f6aa96293c7463d48da286b269db587ae","impliedFormat":1},{"version":"d2530a27db1ad726ee2406fa9f67ac32fd8cb359f593e062ff9aad8e9030d09f","impliedFormat":1},{"version":"309a5306c6c1b394938c1fa863ff14fa0e7532688c962a3a8521f0bda102382a","impliedFormat":1},{"version":"e532e8e4ac90ec48d8ea80c54e6360da6be10b56acd76872e53141275d6e0f59","impliedFormat":1},{"version":"331c422934e75dace7f30568554bb7bfe3ca79023c129071f695148404e3e6ce","impliedFormat":1},{"version":"62d760313c4b8b2f610f6c9732ec500ab012a2ef3d2888eef5e67b80eefcbaea","impliedFormat":1},{"version":"d79afb98e94f37cc3b0afbd9cc742b6ed802c230c7e34cef67827a1d57bf2908","impliedFormat":1},{"version":"7d979e73309901b0e93eedaf96ee968c4819e15a31aa8bf891343d93492441ce","impliedFormat":1},{"version":"48bb97ed124a6baf3ec6f65571e68c1a7c53334f4d26f50d99b7cfc0165bca9c","impliedFormat":1},{"version":"20e3a2aebe3815579fab8a8549706c23f70683b6139f6bb5e899d5d96a0e1225","impliedFormat":1},{"version":"4fa1ec89a0fbf7ea9ed432144b1f04021f7275c37d439c02306184b96f430dd1","impliedFormat":1},{"version":"50c42f4c9693d4d18af70f9e768e2a48cc166044209ee8c7e275c3f89bd63c70","impliedFormat":1},{"version":"9f7c68ac36cad40ed178aab8a954b114c8e940258f919d30b9b9ba76c09a50e6","impliedFormat":1},{"version":"697590086f6e294d5b1625b2ef259559f9799c3cff1d5ac424f35988ca8975f4","impliedFormat":1},{"version":"11be2635c1b3bd67cf734fd47fce489d2448e66ea4617b71a21be8f8bb9557a0","impliedFormat":1},{"version":"ab0309363c9030c31c8beebc112301006bb080a926ecac106dc9dca8cddd20a9","impliedFormat":1},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"11928e29593cb960a3f96eae627d671bc2f2170d7e0a75622e49cef01622fe46","impliedFormat":1},{"version":"20cc41f51c8ff33d21fb79e8e97b985f5a609bf1451f70cc3ce83e6d5f965ab8","impliedFormat":1},{"version":"3289840aa1a3d57da672099a7f14afbc8ef8bf0dd6e2d243c1aff336196ee4f4","impliedFormat":1},{"version":"9af44a67ddc3ee8dec8a5087f3f5551d771a9bbb28c859ab6e39cbbfeef1486a","impliedFormat":1},{"version":"5ab9a9cccf1c561c6f567977ea85eaae51ebe908069f36fb6c35b8d901ab4058","impliedFormat":1},{"version":"0064748c8fb148e24cd533817dec1ae7b42b1aefcce5c69f7462a55c25bdb9f0","impliedFormat":1},{"version":"5cb0311f0b2f20978411aa8dd28124aa7419c0ab5ea4bef73a2b0310938f52d6","impliedFormat":1},{"version":"e6c940a7a05214c36c7f9c383dcd6ebd345d1c87ab06a10d38163e50b9a681f1","impliedFormat":1},{"version":"d362ff2cedbe3e9ba605cadcb2190bc6bf50c163267071b8ac3a6c8d84317f78","impliedFormat":1},{"version":"df805cd98531520aed08a1b485e17e5a69892c7ead5583a0a301d92cfb80714f","impliedFormat":1},{"version":"57b5763182f9cabb6e31c735665668f8c131f3c7d1aa2b880c40dcbcb34d4ee9","impliedFormat":1},{"version":"a19828b49ac566575268aab52fd7dc0c4e58d77d043dd1c83f82ae8d8b9874d0","impliedFormat":1},{"version":"fa1421553ab8ddba9ce3d8af27741e188e9f8c773b84fa54a05658be564cf6f4","impliedFormat":1},{"version":"eafc9af1fa28dc82ee9e41d81fef98ab08078d8e7de6ac286e458eca3e4b0e98","impliedFormat":1},{"version":"5faebccb33e83ed47d6652b4eb41e3cb6e57f66c9e8740e78c8dc2d6ece62bf6","impliedFormat":1},{"version":"f0cbc9019c7953282a1210dc4e47771caaafdaae8cdd9d6b666a4ec8bd67c914","impliedFormat":1},{"version":"93650916d98eab24b6ea86f2f79731c5fd9578acab81176f1a576bcfcddcd970","impliedFormat":1},{"version":"1bf980acccc086cf3469896843e8df2fd1711a98ce37fc5133c1c5739722647b","impliedFormat":1},{"version":"baabe118c17f263b0a356c34802898eccd3f7ca40b96997aceffe1e35e22cc49","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"d8811e82b5bf65e4f839071467bc752d45d52289f2c2e49ee56de51209051ed1","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"8c95ed06561efa2ef61a233502be995190f3492d3cde7643aabcc4fc80888153","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"dcd3a1a5b14e905d2c14c0304e03b4239277536406701c36331130710974af97","impliedFormat":1},{"version":"7e176b34473a960c96ab4688774b371d348534ccbc7de76bf218c96a706eb441","impliedFormat":1},{"version":"12895ea8bfe211b655fd579c833d21caaefb55fbc8b0d042f651cfb8f8424286","impliedFormat":1},{"version":"245000cdaa0e0f759e45745d7dac85c90f929bd6ccc16457703c362259dcb0d9","impliedFormat":1},{"version":"b30047932ac48c6a8c61ba49baa29d8066148462489fb752cd54d4c07938da7a","impliedFormat":1},{"version":"eb91981d121da4c3599e678f2d161d7785e4a484e26debd4bbf76793bdc9ae44","impliedFormat":1},{"version":"0eedef2ce9102ec35928c757e3cf27e09f3ca04f3bb7d4a32123f2fe7ea37e30","impliedFormat":1},{"version":"b9b8f1f897989e30f4c91f18990cf1828dc0832532c5479502606ca52a25658f","impliedFormat":1},{"version":"b24f299d182f14a7f88c6c90f7d654c1c85eb6d3813479e182154d35cb49c809","impliedFormat":1},{"version":"e1f1b1c8b61cead248779c6a541e637a368bdf5cfae5bf4c4a8accad2a500054","impliedFormat":1},{"version":"6af0479ea02058353cd8414c6c6f36adf61ee0516864c930a6187e8ccfce49e6","impliedFormat":1},{"version":"1eebb499f94f45857b355e3865503a671eb9f1955987701b2492f9ebbb19ee35","impliedFormat":1},{"version":"5c0254455343a2164c7d7a6c1d43c2319d329edd8177b4567054bd9cc18bf083","impliedFormat":1},{"version":"d1496a79ffc3e1c5f8898817c5f87efe3070f3f6bfdcf3c13ec12f9141cce565","impliedFormat":1},{"version":"f5d0ab6a6b996911c87a781d43bddb86c19b3332d47ba05c8978c1984700dfa9","impliedFormat":1},{"version":"fa820e260726225d1692a06cef6e1d915c3e8a41de7e9e6a1d4575d0f85121ef","impliedFormat":1},{"version":"d1d949485ad8b723a439d4fbfba00cdf9c20928e9de72bac4061173eedb7246e","impliedFormat":1},{"version":"e60233856285c83d8337d2272081ea908c16ac12fc4040c977a8ab11c749bcaa","impliedFormat":1},{"version":"44b381acba23994aca7f6904680093716baab24e476b3fe9e9cbae8e8c47944d","impliedFormat":1},{"version":"09e058a6d706073073c018ee3c9f0a1ad393a437ef18a325c1ae85cb29d34cc5","impliedFormat":1},{"version":"90250a0987fc980d117820d9e1c89c0f7656a15e297dc15d392e87dbd97ada83","impliedFormat":1},{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},{"version":"ce7ce51836fd2f508b0bcddcaa0b8b780da883d7a1239e17538feca295409eaf","impliedFormat":1},{"version":"9e5a833bfb54b4a3370486188a3d12e134c5b29b3364dade3a81b9451ddffd1e","impliedFormat":1},{"version":"b7f70ef6d1a9ce25d100f75f1288c2c444fde889f5caeb2c8a49f70194f44da6","impliedFormat":1},{"version":"4d09be69ea360a371a6cffc15f02f9f159bd64507c6d457133a73f663e41c25f","impliedFormat":1},{"version":"49838f8f6ed3a2653c01022f7e8a58ab5e560d73064303fbdea7b3eafee42287","impliedFormat":1},{"version":"334b9c6b47c119e7d44beb54ac4205db17dc6b24794e4f06e04a68711954d863","impliedFormat":1},{"version":"e14bebaab3c57f3268f92aa47423b225061c40524d337bf86d16936b924c7977","impliedFormat":1},{"version":"a439861fe62f996adf814884947650650fc436898af722e1918e328349fd6417","impliedFormat":1},{"version":"d8f2d457913790a6059dc6ee295aa9a0eb1b7754fea88c24fcfaebc9680cf7f0","impliedFormat":1},{"version":"260a47ebfd3a752a1230a7058c64fc381e4a6a8bc96f7bb7dabbf7af87202976","impliedFormat":1},{"version":"6fdf0d3132926f10124404134840fa72fe00870da3328e349b8060940382c2f9","impliedFormat":1},{"version":"bedf7e7e31a641654db1a556fb77dcc15180f19514fb0d2ed39f157cb0fc301a","impliedFormat":1},{"version":"d1362b8db27eb8fa56916a4e7875fc8a025a759f71865b424c5c0b5ad91ce73f","impliedFormat":1},{"version":"25c4f1af91513fa2c2423d43589c40145b1047b52c075dc58bdc42c2bc41bcb4","impliedFormat":1},{"version":"070eca51dd0a478ddd7cc1cf23c31f4a40ff1fee9465d2d354fedac657ccb2dc","impliedFormat":1},{"version":"91b487cd1a6e7607465a977fdcdf339d8c6225900a1d213dd41936ca3d048836","impliedFormat":1},{"version":"af28cd496b08df6780b3303a74b1d3db3064d8bba9293cc815e92291fc160805","impliedFormat":1},{"version":"ca0fe4ef002f68456b7f92ef4686ef098854137cd58bfcaec7f9ae191148bf1d","impliedFormat":1},{"version":"9330046da4d6724db3c7ef4655b01545f69f12ea9b0eb74d498512244be94727","impliedFormat":1},{"version":"a879c9b09499eecb06df95a87ac084f699e125532ff4f7267ec57ea0da8642bb","impliedFormat":1},{"version":"cea6f3dbab165b13ee7094a5c688d656b411eb0c599a3f8e67f2dbbc53b5663f","impliedFormat":1},{"version":"5b9eb0b64742b99fa2bfab2d1256e99219fbdcea283fc33a36baee703ef3d757","impliedFormat":1},{"version":"f73c97ee355afdb250266e82f79e6d987d23d9a84273b17857c3e61114a76568","impliedFormat":1},{"version":"7c5834846a2e40307b2afdf9cc4d7aac1b16df7f1ddb101307273efb9ed8626f","impliedFormat":1},{"version":"e5cb8515e1b89e67f61ce60306635456dc0ade7e3ee4c1a21ef318d3b543eec9","impliedFormat":1},{"version":"0fbb5ef40d55bfb6f7a5c2dfc74211bbc610a3ee1eb421185d3e9a322f69a142","impliedFormat":1},{"version":"c225b50585f0fc6f4687b62f5511881df9f3d063f60f2f3af727dff2e690d519","impliedFormat":1},{"version":"0331c6f3ea4740df86020283f0ff05cc4bc755e6310bfc9cbdc10c0b27c2c08f","impliedFormat":1},{"version":"5662a627ac042ee96e4627f855f76b08bdcdacb6f5c546a6692fe4629dbfd1af","impliedFormat":1},{"version":"ed673eb6be36e1804151a1e42478c83dd0b92e0cc265bad9dfddb3abe51002e1","impliedFormat":1},{"version":"0485ef83541c8cc016daa28f7ebe980f698d903151dc50a7efe7ddf023815681","impliedFormat":1},{"version":"1c906055b32d01ec3c6ffd245d9f5d5d2387de23a9026e6849c35729d5d1252c","impliedFormat":1},{"version":"aaa7fec72a5ded92db87991af37956fc8255e9b8da4d9165445edb6e5ada22c4","impliedFormat":1},{"version":"6acc9e5761737d08a7e163c43d2ac814eb63ab1d6450594e9ce8e66f49e1eddb","impliedFormat":1},{"version":"c4aacb40f647365929a82cddb1e51fea7c8b530183ffad74382c9648c03b56a4","impliedFormat":1},{"version":"8c1bd8efad0300b1d4a652fb5aa1f958931d9009c9ce89d98019d7a8b55dd757","impliedFormat":1},{"version":"0e1a8479fd2c48803a987f637ebb64089c526b8e53d7974160204e6dadd8ef94","impliedFormat":1},{"version":"b9d6eb16792ce9cb9229c083db7c9dad07e4d598ecf3a891933942e7ad1fb070","impliedFormat":1},{"version":"cf75c3422ccc5362f4911467a896f4f77f7cc1bcfdd074046efcb3130ebdb8e4","impliedFormat":1},{"version":"2e0d32660751155f11c422e203181d899fb70685334dd688c17d158f31b5b0ea","impliedFormat":1},{"version":"3992ab15b523b97d436a282b1df2f2b9f20c9ef9e44d0c23956c25aca77d2076","impliedFormat":1},{"version":"68744a94adb00cff7991566d8b0467fdcadd642c7221ce963c8de8f730c47251","impliedFormat":1},{"version":"859d3d75d172b559d96b45b16b260905984693ec0798a2062211542355858498","impliedFormat":1},{"version":"b8070a737ec60850d4f04568a45665a2cdc692a6ea7545d7c9ac6c8a25d54b38","impliedFormat":1},{"version":"b4ea4a558b069b4035bbc2bdebc370205266a830dcf1c90cb7ead22da288d074","impliedFormat":1},{"version":"5a39278b38da2df895e9e2e6fffa33f50c32516732275e62fcad0d5f2b50acc4","impliedFormat":1},{"version":"aaef2354583399610f0cfffd6683fa200f43f9055bd4dfc8c9bcdbba89c93aaa","impliedFormat":1},{"version":"fdd33dc882f735aeac4e1c6ccde0b8d25b07b1caa7e560adcde7fde1df1e8e59","impliedFormat":1},{"version":"4ef318a4a4e1e127d7bd4c7099f61e5e38487b0164aad0eae92794de0e220a5f","impliedFormat":1},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},{"version":"befa24d0fe8eb1c15032e835c25acb8ae19ae101b55891226786b78884036440","impliedFormat":1},{"version":"431384f165550e249a024da1e4f5ecf67a9ab9bd80824b9198b991600442c0df","impliedFormat":1},{"version":"4300901bc259f4793bbae2d30b57367e6cf28873a8b59a35ec466cf5141bc71e","impliedFormat":1},{"version":"a5cdab3f89ea55f22485d6c6396b9477b8fddffb8096d869a2c3eb6a0e9f339b","impliedFormat":1},{"version":"0f45810ad7155f5cf85c3b99d8837fae35bef7d711f122a362bdbf9e30484cff","impliedFormat":1},{"version":"d12a37c3bbf382d20cdafe0f214cd2aa06cdc45a1753bf975ea44595b8852486","impliedFormat":1},{"version":"3f11a6347ba9d4ff1810cd6e8724295f2b5b92226279e33288f0b81c06854b11","impliedFormat":1},{"version":"8709b29708d70d23bd2f6bee7439d1d63aadd3bbbbbac60ecc49cfd114492b83","impliedFormat":1},{"version":"63603b74a5c670f0b329da6cae9613e71315ec3a663a5460d9892a24ae63fce8","impliedFormat":1},{"version":"474597287b297a39012f8b0fa009e7804716ed3d98b4f6762e62c6af03edbaae","impliedFormat":1},{"version":"3da5744f338a502b7a30a8f7d2aeb8dabe9f291be198e2589f0ee6eb462b6c49","impliedFormat":1},{"version":"c1c5dfcacaef9132803b17ea1cf5f2053712379342c872e4aaefd53141c556cc","impliedFormat":1},{"version":"1eec8cf56d2093c649743c7697af7492818af939a54f9abf98ccad3403232a2c","impliedFormat":1},{"version":"9b72b48165071801b8ca583e8d0a54171628e6ab6b30a6bd18878add23fe0cda","impliedFormat":1},{"version":"7f49c8e8cfe9d10753fc2d20dcba79fd7b28100248c8604daf1fbc787582da5f","impliedFormat":1},{"version":"704243b2f7a509a2f624ab1134a5601f821a39e1c9f1409e0a28eb06e98ac49a","impliedFormat":1},{"version":"d2456be08bf14016213e583c1ef6f8b7862ee1945073418ba333332c2a387bd9","impliedFormat":1},{"version":"b92ad137770ccbe702dd1cee2cec758cc420aae8650c89634c2125caf569041b","impliedFormat":1},{"version":"1add518ade30764380038c2d9aa0ec37d7928dbccae9ac123c4f8ea0c7f7932a","impliedFormat":1},{"version":"5bcbeb26010db8f17f012b0e77790f082c316a346f53d4ed75c342b14e69c8e6","impliedFormat":1},{"version":"3c799e898646a0555a7985f291b5064b7f335681f4ee3a796ea6deff8a73ab13","impliedFormat":1},{"version":"3ea3feea868f4f946bf6716b08886c2d0a22fd6c189bc9ffac2e8b31a9ddcdde","impliedFormat":1},{"version":"64c6e64233faa6e3b585f7b49794a4e8a9d0179273cda83e7b14aabcf6f113c1","impliedFormat":1},{"version":"07ceab1b624380efa77e39a01059bee7a792c94b5dd25baf13f1251efd2f4998","impliedFormat":1},{"version":"fd006bbb36d0cc0fbb782e0412404db082ebd1ac6800fb4b45bb224feaf83cac","impliedFormat":1},{"version":"3f72825d097b9c4ab66e25d105ad242d564391d77046861efaa361b1c7f19f69","impliedFormat":1},{"version":"9858d6b1cd99022bdd06174633253e7ccacf1ed62a15adc91ba148293f9804d8","impliedFormat":1},{"version":"4aa8fe27a526a30d218700ec9e5c09032ab40bf0a18cb4fc4b05f773a1e346ca","impliedFormat":1},{"version":"0597858092c8c1c38653961b31ef9e1550a4cba33da9b03e0b26a424b9d565f6","impliedFormat":1},{"version":"e1e73fab0b8967e5849fcfc6c7de0303614410ee427edae0e36053ecc2533548","impliedFormat":1},{"version":"21316facbb79ba139743466ee6194f3b8f9ba797a2b55af86587161533b46b06","impliedFormat":1},{"version":"17217ee1c357567b7a3a16bb2e179ef01dd41fd28fff1558739bc340577f10fb","impliedFormat":1},{"version":"5a25f38411dcb5454f5c65110b4f6ec13af072cdf8febaea3829057f91ccd332","impliedFormat":1},{"version":"fd3170f4e448620561e53ac9e6447b35380d19ca9bcad219aab7e9add85a7187","impliedFormat":1},{"version":"f476947becc7ea284038fa40c427377d093c965ba93c5fd41f97b13b5045a1de","impliedFormat":1},{"version":"53407709f23c0357090d046b42f584cfff0d53696f0069bfe8469132b6142bfb","impliedFormat":1},{"version":"90a1100f09a52b5910bbb6a99b2e38f401b12de60f62af0afc7d034cf993b631","impliedFormat":1},{"version":"001dfa751f23df81842cdb8c26d561075c5802fc533e9dbb3ee73f7da3b5adcb","impliedFormat":1},{"version":"eebddc56f0570ba1a5538cb83507cac13ab7f24759e784da8af667d133409ff1","impliedFormat":1},{"version":"01794a05b7afd9db0848393a716ca3066cb32c4fc6d7ded02d70d8f2d4eb44c0","impliedFormat":1},{"version":"4a495b3b83986729f7ccb8c56e818e4c45d7d9050ea5827c23f6a89cd71bc529","impliedFormat":1},{"version":"bfc25a76dd65759c7401cd2fe4f070af193e8785c1fbf0a44014476a74190801","impliedFormat":1},{"version":"e59dee4d2b27a22b2bcb9020210a7d065073f09ce609da7cd402c76aad73d883","impliedFormat":1},{"version":"394ebdc9deae76a1c3e4ba740d60f137a46bf62d77e0fed50b079c34cb907533","impliedFormat":1},{"version":"8a0840a8819a08a9b7af9e053df07230542906bd2aab74bd3dada375f86c75e7","impliedFormat":1},{"version":"9ab6534198d7bc487bf5e990c6f1b971475d75a321f0a34f0f3f73a3d5e42265","impliedFormat":1},{"version":"5546f701029060f659bc0366cbc2cf212aed72316f1b41744740462ed416751f","impliedFormat":1},{"version":"a55dcf8d5c65de8a5326cd6f20a620b98ae5bdf86848a586902320dfa612b33d","impliedFormat":1},{"version":"9488e08ce992e9e64976132daa5275c57bc3b91b3fa37fc33b81585617daf727","impliedFormat":1},{"version":"fc9c2fd31b900c7fe943948a532ddbcd3b7e687f71768223c889596d11ad8dfc","impliedFormat":1},{"version":"cf5d4a9d3befa0c6c34a5efa3489fc7ca003100e05b2a2200c812744dc4b2920","impliedFormat":1},{"version":"73ba02ac9e145564d4e91fe90d07abdb6c3d565f213907cdd81298fbb01ed73f","impliedFormat":1},{"version":"d600313e3c07f919782e2cefcee7dd9af336e847d61d7bb6f77b813b08d4558e","impliedFormat":1},{"version":"c509b5642db6151661020758ac12bffa7652ffde20014b621a17a38ba2a39e32","impliedFormat":1},{"version":"df9d5f06a1692717762ca9f368917924fdaccfdfced152804d768eff9baeb352","impliedFormat":1},{"version":"34fec0d3b9abe499f5d53f1ae7a6c28d34ac289e5cff6f17587da846823cecb0","impliedFormat":1},{"version":"9ea3742314159f08b93e3dccb7fdba67637ba75736c12923d4df3ec9f40590ab","impliedFormat":1},{"version":"bc55f374f2b27277afd0ebdf0e503faa20ac18e81d15ac106e443ab354d3e892","impliedFormat":1},{"version":"4055e5f20cd88d6a1b97dcc9ef0708655901c23c974c17e7cb5a649ebb960b47","impliedFormat":1},{"version":"e35562032ca67f79d83bb8e2b86b61dfcbac6a914ce15b0e2235e6626dbd49f7","impliedFormat":1},{"version":"6fa98c19548b13e63df64ea3b9dcdd5b456059f2ec6ba14de67ba295c3884a9f","impliedFormat":1},{"version":"39fa2f68f5480e3f2dde09f8cf03e37c0b79479247c7a169ce833a39c3da38a3","impliedFormat":1},{"version":"34166077f3e6c2e0425c493ac22f674bb82bf02346f73dfab87d948e22f935ea","impliedFormat":1},{"version":"470b0bf94d9a87acee352d3064e5a58ca17c0e724ac322f99277df7d61def640","impliedFormat":1},{"version":"ba3735044629473bf01fb4eaf08e7feda3f79b00ed8e940567ded154b3ef7a92","impliedFormat":1},{"version":"95380bb77008f7bea0cb26c8419d7d9a4059dd1b052ad398cc8206307488321b","impliedFormat":1},{"version":"9ab2a9cdf761d55b5d7e6880a2eec20e50605202a34ab46cc8e3724c463ccf18","impliedFormat":1},{"version":"33f56865801c2354a9445b2f73ad504ca30bd16d9ca1677e80e14f9b1d76d456","impliedFormat":1},{"version":"a732278091b58df250bf1c50f11967bff74125ad4908da145934b5f2556328b2","impliedFormat":1},{"version":"9f53d732e2428018d73f09349e131c752387390bffff810fd0e0e8107337dde1","impliedFormat":1},{"version":"b4f5d434244ce624d089903f43f6fd9a1968afc9672443481e01743ac30fc135","impliedFormat":1},{"version":"72cc6feaff60559b953dd5ed55eed369037a02e1e75cda3845ca5de197a95a98","impliedFormat":1},{"version":"238284e79622aa34170eec5478e831fe63840fbb21e4300fb93b20b6c0902f35","impliedFormat":1},{"version":"d6503005937bbcc00bf5e2f5bd8d8189874aa824fb97499b2bd6c3b2eac1a043","impliedFormat":1},{"version":"bf9df1f095e33429aa80a7b057dad0185eaf472153408e0dde1f3e1986384686","impliedFormat":1},{"version":"1c9447cb3bc13bcccc77f144ade5a14f22fdfa1fb4f70f329c390e83b7b75a60","impliedFormat":1},{"version":"0ed013647437fa6f99ff128466bc63da7617d424996363b93f802c46a629843d","impliedFormat":1},{"version":"9ce2630805a121ede26ab84c426011dcdbcb653cf9205c8ca76a7a3893911055","impliedFormat":1},{"version":"be027215c5ee2b49b7489152206927df2b445fa7bbfcc34bce0977faf343ffe2","impliedFormat":1},{"version":"03925a73fad9827b2ad7812d6da4119fede2006e792fba0e59921bf55dde9bd8","impliedFormat":1},{"version":"c9f7ea1441283c00853bde21aebda6882b05e33c6168c93baa2d9b97ca530d43","impliedFormat":1},{"version":"f7f295733dc582028cbdad1e143f235bb85057d2352f7eaad46913b7c633918f","impliedFormat":1},{"version":"3b75242f88aaa3f3f32906223e09604e289fa6307dcd408320c9ed5c1b8189b5","impliedFormat":1},{"version":"6c0e51147f9b5769564aa829ee92beb65d4fde7d7241ec477a5c90dd09bc88a8","impliedFormat":1},{"version":"bb23f3a09f655673fa8c540028fd8cd016a9f5193b99b8dff1fa5233c240f55a","impliedFormat":1},{"version":"17c437eede5b2b3794cee847a4813d34c420cd1d4928b7a1e7322914112c949a","impliedFormat":1},{"version":"5eae95c41ccab2837381bbbf6ad8d2268ba05b65e760a3d0778a17b4d19965e5","impliedFormat":1},{"version":"43859204f2f5c89806116b87e6258aa9a9632d276a4e6f31585e0bcf79f6d81c","impliedFormat":1},{"version":"e175be3dcc5e0bdff3c26ee6ba0df95317312500e77ba770a2bc2e6a6c1ed3e4","impliedFormat":1},{"version":"8c4a91c016dc8cabd9338b7e4f2d1c704e24def84cf11c364eb44182d6ef5571","impliedFormat":1},{"version":"425407e1fb17c6762a6826e200882ab78ab254c06a6444bcb5a3edcf46ceac38","impliedFormat":1},{"version":"cf83180e6daaa29b5d127036a28a163b7dc5847a091f39719b39186a2ec35e7e","impliedFormat":1},{"version":"5a966cbed46a89616d3440cb50faefa551bb97b638ef26463d83a26b80c85584","impliedFormat":1},{"version":"0d8c8a56bd5161dbf6e10ce058d9dfe704ba946dc0d96a06a5b1c24c1d263d9a","impliedFormat":1},{"version":"476a6e9be301a83ea80d7f6475f2149a791e5d0bccc4653e627858ef4de62c0c","impliedFormat":1},{"version":"8c544128f4b4bf0764171b3be269511a3ae1c7ed0a3a721d41a690fdd7be929f","impliedFormat":1},{"version":"b2ea16e5a45b52fcd1c9fe6ad92095043d4d14b6ba661e34b8989f56fd9e43b9","impliedFormat":1},{"version":"d41897ad53cb52a13672bded07f42ce1c26b2e09776f8e6476c3f72f2d66dabc","impliedFormat":1},{"version":"1696982a830aea0e8e2f24ed5948fcec04ffebdb488bd93682313cde65cd4070","impliedFormat":1},{"version":"1e0bf6a0392611a0471a2f5ee45bd0b37b7100f112b5cc6a39d133beef733166","impliedFormat":1},{"version":"3ef07627f9a75f417148c2b65636c85c1995fe1130b194f1ee3e78fe3fbd8e80","impliedFormat":1},{"version":"d41897ad53cb52a13672bded07f42ce1c26b2e09776f8e6476c3f72f2d66dabc","impliedFormat":1},{"version":"3fa41f1b472d6e2719ac119190cc3e2ea4624b215fd15ea9e24fa5b7f8ec92ff","impliedFormat":1},{"version":"a0ad754b3bd67e8319030bbd6fe4749403ae0957153aa9f8f2c3ef72367cb0e7","impliedFormat":1},{"version":"515a4b762ab67fbb967fb5cf5e04ea3bab01b8757f5f0a3b834ff57f64a43217","impliedFormat":1},{"version":"9ff0d5d064fd804259fcad19909310bec4f6aec74c4970717aa604a159f84211","impliedFormat":1},{"version":"8ca03f479209baed02f5887a9e8222d4928850fbb14f79d3efe90d7a47028ba2","impliedFormat":1},{"version":"8341b97d5144a2dd38aa90c0d3a68f513faeefd56c758ddcde9c4d5b509674ed","impliedFormat":1},{"version":"34b5a3984848f246d14980ce87dea6e65318c32d5d33524740554c07ad9887c1","impliedFormat":1},{"version":"c6ca371b4283afbdd3a50f79e622879c00ad47514e242b03fa5179c7eb95dce9","impliedFormat":1},{"version":"e1e33525d37412411fba373f748ad91a6227943562ecba5e5e15ec140b220a44","impliedFormat":1},{"version":"523064befafbbe3bd4531dcf4fcdfa8e8bd25b6254d3da82ca8daf28e929cf45","impliedFormat":1},{"version":"bbbabc262fe1433817034b7225b9ab813063089e7faaabee72bef82178427b6c","impliedFormat":1},{"version":"4abbabd14e5ecb558fb4d8336fef5b2f602cf2a473a4260c5791537b3336a120","impliedFormat":1},{"version":"3559692171981b2101f0632726cabecc990914a9bd9abd4ceda20262811e4739","impliedFormat":1},{"version":"c48ca18e123cb997aeccf59222900780f64f83ab3c09ad585925b4962b15d250","impliedFormat":1},{"version":"401a63669e727547540d3b7baa92a52baa3347da9a306caf2f95700233b53a4e","impliedFormat":1},{"version":"b2233cd6b982a2ed3025edb1cde0f00c2d0d6db1fa8d7fd6b8ff9faf55fff742","impliedFormat":1},{"version":"97a1e967f06b13f2a8d7a3d75d89321458f761da80348c2804efb7e741225b87","impliedFormat":1},{"version":"c99b06fb20ce897f44d6777c61323130a0a21cafb690ff7c7304ea4d0d8745f7","impliedFormat":1},{"version":"82d152b72a86c2e9fb8c04c47716b03d4331c7ea00741d9093e667542c93a9bd","impliedFormat":1},{"version":"12f31c855d6740f7e9e334f93ae201c80044870233588b044e984cf383e9a94f","impliedFormat":1},{"version":"6b3e497a71110453570df44901ecc7dbdd5c5c62b008abe9b69dd8da27def2d5","impliedFormat":1},{"version":"bd89b633f43565e1f28b0add79691af677e16225bb8871f84c0056757f3ad7a0","impliedFormat":1},{"version":"84586dc2e5f93a90a1146cd283267572d6f511d860529e61d59edae63fed30bc","impliedFormat":1},{"version":"f590b53c526623edbd9fce0ca85c4d842c9c6bf44f3b8d7beda62c773ccf17f5","impliedFormat":1},{"version":"68747c8a7d6a02d44b626b1666f1af75dd6d50adef6996ecbc8a762488ed6550","impliedFormat":1},{"version":"96e01aa02ba1cd98b7570bb870537d3f49a68bd6407fd9239139985da202bcf7","impliedFormat":1},{"version":"e24c8e4ce93f2f740d5dd1ea575a85725b8e1dd320da5257356938beec2f5287","impliedFormat":1},{"version":"755f25e8fd9e37870e11091272f14dabb0cd9e3dd86f5df0e364eeb6419de87b","impliedFormat":1},{"version":"327754df1479b0c9c265b97b0aca99fbe1953e3d20497aa42ad6d418e514bd7e","impliedFormat":1},{"version":"3aaff6c0d520561d754395b0c4b7d706f06a98587b100f686734d20a643a4c56","impliedFormat":1},{"version":"0e8d39b8b864d097c5ecc6dcb09be4d6026d54d7a811b7bf7629b756de1c842c","impliedFormat":1},{"version":"a2ed41eaaf4327dabdcfae228cdb972e44b7ee768a13905026951a3d9f23daef","impliedFormat":1},{"version":"9fbf799e5eb45a1236439e09922d29f48da728c266a9db773f49047d43b73f1b","impliedFormat":1},{"version":"5751682bedac376a5779f4495e103aabcb1f363789226e0a754b201a7c3530c8","impliedFormat":1},{"version":"7cd9e903bf78a331847fff8d4d8c468894aadbbf2506a9bedc7c4f0a6a24c3a6","impliedFormat":1},{"version":"a501c4d0b90cde0f0721c1d8bccfdfb6843c650fae6435a185940776e72d82d8","impliedFormat":1},{"version":"8774d92fc085de678c5da7070b9cdbd39b939f629cf683a59218aa1d05db45d0","impliedFormat":1},{"version":"d9dd5e0f97d82848d11e11f87e71e9b9f475fd836f3e879b351cb4ac72bed905","impliedFormat":1},{"version":"d6a2e78ffd68d0a404d13cd60152f7ee4ec48bc1ccada92daab8e4492d502fd0","impliedFormat":1},{"version":"072e6a97e2a9291437f0541d5c06b5579e077d573d41f9cc9740d04972549633","impliedFormat":1},{"version":"d291627c803d32e31129575c8c3c5a83a23e38e69d8e5cfe3de0d2ce3f2c7fc8","impliedFormat":1},{"version":"d25e50fca109215ad1dc01b671caae85734594c677952c26da77facae17849af","impliedFormat":1},{"version":"98dea46d677c4222fa5b77c267335b2d336e393740f22768179fc0a0f9f95bc6","impliedFormat":1},{"version":"daec5d2d52be233262c80013e18d57be920152412de99ddb637700410ee7fa7d","impliedFormat":1},{"version":"e1e1837b07bbeb81a00d1b0b7edebf8f3e2b44ad148d5faff905ba17a0005813","impliedFormat":1},{"version":"e7e02f538956c85e11acbf3586c30048ba17d9457f23a4547cc6213ca80438c4","impliedFormat":1},{"version":"f5c47c1ab571300759282cd621f629a1c905742a67445e08e1fbf23f60183f2a","impliedFormat":1},{"version":"32d0da1473ddefee1c6fda291b0a80b90cc29b595c5482091e3e7ef8290e73aa","impliedFormat":1},{"version":"d025d6a28b3d69ddeb3cb0b9c3e7ed19ec8fb24452e18add0b495fdb5ddd18f1","impliedFormat":1},{"version":"1e778ec11fda32eb4a43f94247733639185f80212b6bb7e340838d4bb5c6249f","impliedFormat":1},{"version":"98a9416dba4de725fef1dd559a12f1fecf1ac784e6542141b590a611ce5084cf","impliedFormat":1},{"version":"20e1e198d28a4ce7f665091b7dea408351573c6599a8a3fef57bb3e345de4660","impliedFormat":1},{"version":"331a4c59ba270fca4e7d2bac87ba39135a117c460a12ec48dd919eb8a47ace50","impliedFormat":1},{"version":"0e56229981d691c2276d9f0112f536e103bba5e8192ccd5554845cd1f22a8c0c","impliedFormat":1},{"version":"c4afd4c403c5c08c2e0ee80f9a2d1653e4a55b5eb826db428ada069871c5b954","impliedFormat":1},{"version":"1bbb133267e10a208164b403e93aab3fbd78bc7d6c846a17804b95d6928b5077","impliedFormat":1},{"version":"ea5dfd206950d5a8eed566a321e42033f5b5a9df94c728e5c777c15fd009fac2","impliedFormat":1},{"version":"3464bfdffab42a9330124e1ee6aadd25433822602ee6a7b30102bf08ed7001fb","impliedFormat":1},{"version":"a7125fe108eb2f3687f74863ce642b05df19b2ccd2ac517a991957e3225c6496","impliedFormat":1},{"version":"41d618c1a7458dbaa9f29c5545d1df2923b8978836c757b41d85627982b01311","impliedFormat":1},{"version":"4bb6ea7f076386c7e82a21f763a931335150189147d191a70eb256f271cc0c8e","impliedFormat":1},{"version":"c7b19f40914ec59fe03cf4d6ebaf1b78a5d919e7284c22fcb57fee0ba547e084","impliedFormat":1},{"version":"0bb2c3e440231a71c28098da7857a79af8b7b462efdff01f6617b6a644aead8d","impliedFormat":1},{"version":"130e2259e30267f491043652773c9bc451fa8c7fb390f015dcfe7b3274b5b943","impliedFormat":1},{"version":"ae8b19ae045199e8177376fbc2d7b5d22dceccdcf965a4fd8b1591b7b1e6c954","impliedFormat":1},{"version":"0f4636ef291069225e2021144bda3c5370940ec70713ee0997f60b5084071823","impliedFormat":1},{"version":"f962fc4f05bde2eac9d70b613116e0e190d01511d62997d156b97d91eaa86ff4","impliedFormat":1},{"version":"6d80a7a75e84e9088cf23db88d829d7bf234c4e0dc4dbec02f78298c933b1882","impliedFormat":1},{"version":"543727847603aef88cf045219ff34f21392234e0cda33c6b4a87b296bacff9c6","impliedFormat":1},{"version":"8043dca35c02bf2e374c2c4e7d6be0429cd0b40ad80d51244adc061d68b54274","impliedFormat":1},{"version":"3c18cf90597200a6d15570e8ebacc02defbbb55077656628ad88e5e441b0b767","impliedFormat":1},{"version":"c369fec12e7e19e0db95d3bb4c5bc2b5b0abdf27cf6a69c07d40af580ba2062f","impliedFormat":1},{"version":"bd88ef18037d28b1f6b73ff2c9656cda9b85662b0a9e713a0531d28edd82ce1b","impliedFormat":1},{"version":"d1ae311b1aa20b835952069b1cf5c5e789140c45ab3a8eeca05781963ffc31f2","impliedFormat":1},{"version":"3a8628855f9dcdf076089ae6191a1797b41d4326aac3ea444e7b25a4e51457ef","impliedFormat":1},{"version":"0a613cd9a16af8a92d40007872548dcc1099e5a8063ceb6353821281c25b972e","impliedFormat":1},{"version":"454f21c515fd79ca2e8a7d024e384a9a680f2e94773c250adea98513a1e22519","impliedFormat":1},{"version":"fa37abd7294cb730fa278277b6aa22ed4c867308e778842113fe7b112c1054a3","impliedFormat":1},{"version":"f42496e94a212599cd12686e30a03c2ee81acb62e8b7dfbd3e84bf80abedda4f","impliedFormat":1},{"version":"6512a1722a7bae28f23066b426ab271134a23438c5dbb4030368dbbd085c220e","impliedFormat":1},{"version":"5a4944638591d30d04ce19dd91d92e083e620b0962f9c6a5dbc73fcfee155e17","impliedFormat":1},{"version":"83295161ed888ff8329c83d76ef4fcd0cd8d75010fde91623e65524017cae470","impliedFormat":1},{"version":"9e0219eefe4f1950bba1be69f32ce595175925332a654bf77d79b5c588acb099","impliedFormat":1},{"version":"e050e9297ced6e6b38841b93032503c6a5a0ba9bbfad6dd100803ba7ee86fb1f","impliedFormat":1},{"version":"2b4464731f95a1383395b4b6ab05750dd8003cd4bfc082328926524dc960071c","impliedFormat":1},{"version":"6c5db87af9fbb0b8ce270c6e700e5792ba4e75dc011932f5ebf8f88815abba3f","impliedFormat":1},{"version":"46609a58ccfa4ed8951d70c8ab20c6210aac7134db4f02f29eb8280601aa2ead","impliedFormat":1},{"version":"d221b97fda8881de90ecd5230e016f799ff3f581365e1ea80ec46bcf9804fca8","impliedFormat":1},{"version":"7fb8c3b540902629363eca66cfef31a0911e173a4b2fda3dcb0c8b38153e784c","impliedFormat":1},{"version":"70f1363b4768270a362bc0c1f3c2c6b4b1cd91ff6e62a861cfefb85f10bd2d90","impliedFormat":1},{"version":"d459a18f41d24c565e0e7bf8071058cdf4a9442a4ed8db1dd1aee59db9ff5cd4","impliedFormat":1},{"version":"624e6a7c29d308edd5de72cfc550bdee7625f2dff415c54d106b3be0b8651e68","impliedFormat":1},{"version":"25839b70a7407a9407a4d1a23fcb27762ef797eb3e94379383de748d52b4bb66","impliedFormat":1},{"version":"0adf7800005a992506b7e466c6591d100b9ad6d35b6d401e36d8307bb5c85015","impliedFormat":1},{"version":"6cc8242641c5e6befff23d1f62e400ee92437ad7bb89aafdb4924a6642564492","impliedFormat":1},{"version":"9d11489bc447facb412f41bec85117d3316e2af4d61eae43373609e890a55a6f","impliedFormat":1},{"version":"df82a8fb2e5cef3128830a08f6d00e5e7c3cfa25444faf10041011ad1ddc7623","impliedFormat":1},{"version":"0fff108215903bb791003f0ec4f522eb5b14986db32e11665ba09e73f407fa8c","impliedFormat":1},{"version":"98e1825ffe5adf884f52d751cde062b83b65fc2700c7098207686ca2f59741d2","impliedFormat":1},{"version":"6a3ecc2e6aaf46352e340596f82bfd01f52af258de902c9f98d332d646e5c9ad","impliedFormat":1},{"version":"77750e016cfd22e596572f957394adc24de3bb58e522cc55e289273442fc5002","impliedFormat":1},{"version":"98084a725f9b773ef2857a65fd4c7ba5d14694f9d73641a73d4647af79285b37","impliedFormat":1},{"version":"911f6b60872922ed17729a45fa3c1fd451e21b3ad8c3713a922beda14d5c7fa8","impliedFormat":1},{"version":"c3a92b5f905158df2f7600695b5af9b5c6254a0c7fa55fd6f191dc57cec97e83","impliedFormat":1},{"version":"a26901dc8a992d9283f94d258becf1500ee527a7941a6d7a5a64c586b6136733","impliedFormat":1},{"version":"2810b64ac19e63be91648169e04961f6add2d4e236a5730ec91d0cd8ee607155","impliedFormat":1},{"version":"09cfcb72ced8e606b5be59f4b87ed0af05fb1971726f21cb88c8c1bbc1cd2248","impliedFormat":1},{"version":"fe058e3ac05f9718ae89fbbae68991631c6540cb86036efba7910eab4557526e","impliedFormat":1},{"version":"6c8117420cc7babd64276da689df960d1949274970e4c0d39966404eaa1e3dd1","impliedFormat":1},{"version":"24184a91f0780558b3f1e8dab0c65ab320acd993e3f96872ab1951ab2020d1aa","impliedFormat":1},{"version":"6f5725b935925bf077168f60943fa29985839b7fa3669fbd5b078c347cd01e05","impliedFormat":1},{"version":"8bc25096cba884c56dc7a170830defd7dbc4eb75ba1e83d1e285216a50870f9a","impliedFormat":1},{"version":"aeca1b84be03d3326ca244d5a45a541004d2ecc543dbbe5e14727d03dff7ff22","impliedFormat":1},{"version":"fa8e0b4784fd50a6d0cfd6f7bbbc2e19d6aaa1cf58f8197c16d5e86e47e44aec","impliedFormat":1},{"version":"2e8e081aaf314b1c50271aa63a84934d91dd664ede3662d65572831b61976aae","impliedFormat":1},{"version":"abf7b81b492331d5c2c126c8d40eb3c8656c4214eb611feefddf12d3f259336d","impliedFormat":1},{"version":"8c8e7e234af3c537f53d8080666c39bc482066e043819d97aee7eccf6ac9d7ab","impliedFormat":1},{"version":"cba3353f5a0c93c5f29d3592f892251c9a367390b86cbfa44dcf92b54f6b1273","impliedFormat":1},{"version":"7b52572cbd825c9ee1cda96d9f2aba22c433ba93708b798dcf688cd79880788e","impliedFormat":1},{"version":"5e33a99c3759bb4ada6eac2103dbf45f073de71d7fdfde76569d81e324e6ec2c","impliedFormat":1},{"version":"75193a248aa1f5916bed2f77cf1aba44f598800089f701a24c8f82dd0fbc6b8b","impliedFormat":1},{"version":"956030ad86fb7367c9372d16f7802e72d67677620e4391f4ddd343629afd13f1","impliedFormat":1},{"version":"acfb2b43dfe5a70cf679bdbe793765d0dc21a6d2ad3f755fb89ecacc18f04b61","impliedFormat":1},{"version":"0a9a5cd5e4510d9f1cb8cdd897a98526b3a387e814b992fdd44eb9ffc6096103","impliedFormat":1},{"version":"944c2fa1a0bd0ec1b6ca003d7fdd4015641d388a124a8a42c9e50204f0b5322e","impliedFormat":1},{"version":"50c88ab8c34ab68c084a9d57e16e7d6df1b2f4b034b2d807b0ac63ffb5452aab","impliedFormat":1},{"version":"acac703a2fe782a9075fa64161d83b93e2ed84971ce5778b54367cae04861b4b","impliedFormat":1},{"version":"1e37e13f7eed10a9113766a659c71c8524131f906f7a255dad2a5bbbf523a3e8","impliedFormat":1},{"version":"acd1a028e3e324ce781004b3d7caf47642583674f37806bc324e712e1a73079d","impliedFormat":1},{"version":"6f8c2f7d30b0826e4abb52cab6ee47b38da458b2f4df1d9847aea7dba09d91d2","impliedFormat":1},{"version":"81e485f9e98308bccf4ac86f1d82f321ceda2457d412fec97000f817b9d643bf","impliedFormat":1},{"version":"6d4035817abe611f96e16ab5c02d08769e57d8378a21bedc639ad01c0dc18f96","impliedFormat":1},{"version":"28f011d350478330e3c38dc8fbd6a803667c93aab3b7f48ee1821b77d1fe295f","impliedFormat":1},{"version":"58f99b255362976cf050f38c16c1d5c2692f16df9c89d32fba375b2d6e245c9f","impliedFormat":1},{"version":"ac21b8dab215ffdd94a264d31c1a103f1367f64572314683f07c668b49a654a5","impliedFormat":1},{"version":"229add56e247c1e8182d073d534d3f907caea366c89c346d8340c247a04cbc8c","impliedFormat":1},{"version":"b6e116973657b5cf2cb3f51332793b26fe31f2153c5eb48caab0d4a5af01542a","impliedFormat":1},{"version":"968ff63aa5d7b93804ed371538653ad8e1f7a8c9988bb1aa9efd65b620aad64d","impliedFormat":1},{"version":"9f2ab92b089dd1b38818c1af589dca006eaab8abea5a4309b57f0de09cb5ae5e","impliedFormat":1},{"version":"6875771fb6530522c5316033bfcb39881bdaaf7266b145792f322d895fb26ea1","impliedFormat":1},{"version":"a8e3fe551a045dce96e3c5edb2bc6f142692ec771758b91e28f1a7107e9c742d","impliedFormat":1},{"version":"d739cf4900378ed3f81009897b135cd8bf836d2c61354a0afc624788c820b0c5","impliedFormat":1},{"version":"09e15e0e59d1be87d2c68a4542c6ca9a6debd152158a6f880454e0ab9be37ad9","impliedFormat":1},{"version":"3710a4a6660a9277bbe498a19aa9999997802dc0dc53dd242087fc8ce4832198","impliedFormat":1},{"version":"fcfa4fd199884206ef931eb960e66d35a21570dd023630504a48c68421a35a6f","impliedFormat":1},{"version":"3c021642295e99ab82b34dfccf1f9107105e765941ee149a58da1e75d8b34fc4","impliedFormat":1},{"version":"eac743b5660e8e7a5b5c3b1cbde9d58d1d938f31c4ce301186d4904ed16d129b","impliedFormat":1},{"version":"35f03a5828927f555db3778528178499447b7ca406f4ec0c94981c715284a637","impliedFormat":1},{"version":"4bef1a896cb320e389ec8ef025097a41159164ff26a14280d59775af2257f9f8","impliedFormat":1},{"version":"dc36e988cb993278abb0cd3dd2c32802d8e8065ee6e970fa69494aa6600dcf5a","impliedFormat":1},{"version":"2a35ef77ab70c650c39416ce43c7c6e1f9cabdfef48314ac1b809cfd6227ce66","impliedFormat":1},{"version":"d97f7d66cff15354733fb262de4a7f2ee46adec1e46f20ee717ec710a9567aeb","impliedFormat":1},{"version":"f8057bf8e38926f5f57ea9a7eba012cd59b33817eb5c548fe2ba784d55adc0c7","impliedFormat":1},{"version":"0531e251316a6e6d629960dbff082680a1dab1953f6b1092c47a3f9941db12d6","impliedFormat":1},{"version":"c3bf7657a61131bd57391555d79d54e2a4dfb8b4df5f3255c3fbf352cbc68801","impliedFormat":1},{"version":"1941d9c193562b505c762f4e2474a170947f4d38ab7cb01cc6cb0cbe19648d2c","impliedFormat":1},{"version":"b6a68e51a0e96f3e28520a55806b70f3d9cac59fe0e1d3d56d9eab26fa07d368","impliedFormat":1},{"version":"ee4a57ab6f2a9e0f7db13574e1ca490c8564076c7e1f1023ef6b033510036005","impliedFormat":1},{"version":"6f948794453feba1a5701259ba0743610aec499fb5d821a35a0d658bc02ba79e","impliedFormat":1},{"version":"3100f28c18a0a974faa3235684d7719d47a88132994ddb00490771217bce03a3","impliedFormat":1},{"version":"896531d3473483a5f8125cfb1939eaca0e68889594423268086db6d111ee522e","impliedFormat":1},{"version":"d8a0e4eb3f52e820e62a823e62815a9727b613ce7fbea995e999af0d8fc5386f","impliedFormat":1},{"version":"75bbd778624ac10799f7b0e5c529bb517ed4b323ec1aa63e7ffc5b9be348aeaa","impliedFormat":1},{"version":"d6c627c11a2d9d4a9911d028cff4c244f5f6cd102adcb575cd6cf92d55582d07","impliedFormat":1},{"version":"5511449580cba83543fcdb22bd6927e7bdb57e3331413921d9846bc6eba5ab2f","impliedFormat":1},{"version":"7c7c0b5bfc91d722fec5c59d43ad9be93a40ffc95d79b3384ac78eed047f9ed6","impliedFormat":1},{"version":"05176fadcabfff757208c5f736ee1689a73345ea9895566e93740738e86e5643","impliedFormat":1},{"version":"3b02d9156887116ffbd6fd7124d9bddfef1b5228adc7028ff0bba5a174d7fcc6","impliedFormat":1},{"version":"07581991b81e0d49d323bd35f17d2d0d00736fca125970998e8ef876dbaf8b13","impliedFormat":1},{"version":"f2b525f05e7ad7fa4f8fe746df2b9d4f41cda24edaa77be17d54f1c10fb51a05","impliedFormat":1},{"version":"5d2017f209bf5c177ffcb026c1e452dff03dd73db56000f65c2c5ea3dec89ec0","impliedFormat":1},{"version":"18977816a92eaca224b1bde34424d2478165d41183916a17c0f151b3666c78a6","impliedFormat":1},{"version":"27fc88c6a6d0ba0ae47f3ec03c9776a8864d13718c2d28d1fec4a2eef81a2c9f","impliedFormat":1},{"version":"18c50657b75421d43fcd0bebf144599e077757e197a16a77fc77c82c56c7fa53","impliedFormat":1},{"version":"ce6503a1afca12129cd690f7394e8b77515e3855637fa4ed3c08e260000bc170","impliedFormat":1},{"version":"253f2f34330657b3b936cd44c74ed1ef99e1c72819cda33dcb68edba670bf745","impliedFormat":1},{"version":"d6f068d7a96ccb435848dd65d8aae4a0cefed10984b270906f1543f7926f7906","impliedFormat":1},{"version":"445aaa283d55e4c514ffd0092dbde240881d006b328f109b3d560dbd4e188f46","impliedFormat":1},{"version":"00e725bfd68aa39a6adb7da022b285e25248ec45c6f5bea067fed2332e9649b3","impliedFormat":1},{"version":"800711e010bf97883d17ad5f9ddf273cbd144154ba049b13be5782ee12631d84","impliedFormat":1},{"version":"197f54fbdb04c26933b16c7136580a64ad04fc06070a45912dee4f6b8fcde925","impliedFormat":1},{"version":"d49017483f66844e8783e9233e0c3f09fec91aa5320f2e748f11d3b3eb9f7d5e","impliedFormat":1},{"version":"23c6c92831e898a6f8b85625b55b9fef92d6881e572de418202f3fc1bccf699d","impliedFormat":1},{"version":"ecec1f45c9cfbc298e3289f86b1f7777fb98d0d30ef0faf9cffd5531f2ebe82a","impliedFormat":1},{"version":"7e15689b7d761fc48392b4567c1686140fb0f5af010c37d8cc73d64a9b342efc","impliedFormat":1},{"version":"7b3bd78b337f25ee3e5fef56bf9128c35a9c373132dc32973a2f3562c05f2c18","impliedFormat":1},{"version":"8017d763bebde1b9b1809b5db43f3bdcb96c6e143acd5508fad20b9241bfe52b","impliedFormat":1},{"version":"8c57412451bb8b0d63059493bd6172b0093b1dc4ab67135800bab686211668e2","impliedFormat":1},{"version":"ec9da0cb04d7c3bb80aeeef3ca4e0e41848cd75d2641b2aebc1cd743a0a92de1","impliedFormat":1},{"version":"55afc4e97b67990ba7cdf4e3411e58b7a71744ff1ac2c4ad1d48242e134f3dfa","impliedFormat":1},{"version":"89740506440be9310e5f28fe1b9934b6be996bd5ace4161ede38a88c639716ad","impliedFormat":1},{"version":"010d565a326fcf7b7dea5721776f7908adec311179cd473e43e93430d3fb52f6","impliedFormat":1},{"version":"67a040f0a1160345ecacacf65694ff1f2b1bb1b8db1543bb89641b4bce078c74","impliedFormat":1},{"version":"be96211f16e21fbac4daa790a0debaeb7d2f33bb66abbce99556041f370402e2","impliedFormat":1},{"version":"b2d6bceecca68f239a650eb576994d1a6df7f8772cdf395210d54d8ba32405d1","impliedFormat":1},{"version":"327107debca41a137b7827a1bff2a7650ee82273ae0c2414956c72463c2c4692","impliedFormat":1},{"version":"e63a99dbdfb1509c282d4871f37230f0220cbb62f6c5b123c7eb29e08925e543","impliedFormat":1},{"version":"282d7d906e2e6a7d1851a4df9bca2313303a60badbc2737edf77c143526b1c88","impliedFormat":1},{"version":"7a9a9af10e90eea2b7ad7c484145e4d7f77c9f02b937c29390c3821886573ac9","impliedFormat":1},{"version":"74792d4ca5e78ab1de2a86d75e81149776cd3ede006e22433232179e1d9d1740","impliedFormat":1},{"version":"2c828772900391675f9010a154eae8c6272d50632474bb62f966b2e9905fca2a","impliedFormat":1},{"version":"206a972d542353e0e574b80ba816be9133791e42f411ca4ccab6bec67ecb1615","impliedFormat":1},{"version":"dfdbc2fa0d615f3c8157094eed58d365f3ee895f0a62d88695effaded9509b58","impliedFormat":1},{"version":"4db4dfd8dd13152d2f0344d3b4ee3676772eb931aa0e93693e5681d1c7e7568a","impliedFormat":1},{"version":"726f3a07eaa8d4ad213f1e35169129bcf300a9f57087882812042fedfb4a1103","impliedFormat":1},{"version":"1d09c5eedc322d202d08f8debb077cee094299482d4f31ed45687b7ff39f0537","impliedFormat":1},{"version":"0ef19fe230623672c6d256236bc6e76623050b292f2b305987de90f06828fff4","impliedFormat":1},{"version":"40c1a51dc07eabd3e30c7a0869fe042a06cb6e397abadea4d981034160533554","impliedFormat":1},{"version":"f6144da2ecbde205418b9306abaa7454f2c963a30fc1a402ee037fe67edb5a85","impliedFormat":1},{"version":"1e371cf5281c9defa39cc57a2bed1dda7bf53051539577eaaaf56d258704403e","impliedFormat":1},{"version":"b7ac271ef8c556941eabe8e72c44f5024e17d910e47ba5babb604f2ad3d9914a","impliedFormat":1},{"version":"254759e0f50858e5be171805b4a673bcc43f2a15f649f436462a7d87ddec1e93","impliedFormat":1},{"version":"ae343c5c09bc1a4a8ccc1c1513797c167e0767993d2d82597bc64d2c42b52685","impliedFormat":1},{"version":"e74200516a897bd98d1609f27be582033cf12b7d4fb01dfcf48092b8ccbfcdc9","impliedFormat":1},{"version":"c00a3889431a387cd5213e40230aa093ac00ecaa3d163a85bc592139ac6631ae","impliedFormat":1},{"version":"7ecab76043bb20076cb5212aa8da948c8771d30ced270ae8ea001f34397b3209","impliedFormat":1},{"version":"1714ce8458fd5b757fcf0a01eb07cc0aa297cf88edd7ef74eb0922b8a80e3b0f","impliedFormat":1},{"version":"a4c896217bf522dbacae0080d82e52dc47718cb7267cdf6c46c4a2febd0e9d2f","impliedFormat":1},{"version":"b750bf8cb0d80e742d74deb78d6c2723e28075665fdbab98f7fbf6984894d950","impliedFormat":1},{"version":"cd22215a4f429603c0ca0989bd2ef90c3214f22d1ed40b93753c30e77e34c23d","impliedFormat":1},{"version":"32cf3787c1c2e11daf3b263983d3d4a286ca876438776e76aab1a7f69a09ffd5","impliedFormat":1},{"version":"3f8b73c205dcc937301e19a8524096481b94b08b3f539f228303ecfe3f720f8a","impliedFormat":1},{"version":"ec172d151652710ccc7561454b21c9891d346b0d42cf3fdb532c9e4c9c18b42b","impliedFormat":1},{"version":"7ed827f20555786ebb85de60f124f7ec5d310e62e8caf09c7fa6fac788ea24dd","impliedFormat":1},{"version":"4f0c321ae3f9670d8752be0d6d8fef08d7f6fcc9048cb65e5d03c0e934b73887","impliedFormat":1},{"version":"ba80c7f32729824e8ec521ecd544355012990ca20c16ddcf968720a7b1c817f1","impliedFormat":1},{"version":"5e0d1da019d104d5340908bd5a3c47704303818d27e07b94abba10170d3f9b83","impliedFormat":1},{"version":"640dfe5cfcb32afd002a422aeb3fd663be2d4f0db7ad2bb2f4fd492a855e49ab","impliedFormat":1},{"version":"1a1bfccc6354ef6e9d73011cc08b734311e0c6cbeb9fe19f6c25e4ee47ce0bf4","impliedFormat":1},{"version":"12c40972340ddbf2a8482e5f7320d5e6aa4230a462be754b7574201d2dbda89f","impliedFormat":1},{"version":"3970ea9e13ee6f473b5912ebde92e3de8857cafa609e9969c3bbfe606907e465","impliedFormat":1},{"version":"a67e70d495ed11f391211a8fbb04c22ea96d97a0646faced3a843aff89b34b7d","impliedFormat":1},{"version":"a9611f7ce5024a263fe3c6d13d6afd7f4d40ac5e8ccae29659f2266b035fea4e","impliedFormat":1},{"version":"69c0910cd2adbac7ef977b3174152f048e22730b9212daf1c04691e27797cbec","impliedFormat":1},{"version":"4cd263e37563aae86103d7f05bf7a7b822c196a5df199de5493321b3956b1d70","impliedFormat":1},{"version":"81a9830fd86e978c54212175d4e98261d483b18b0c20a0d8b7969bca7854abe5","impliedFormat":1},{"version":"e511f9b393c367c510423b8c32cea29b85041cafd62db728820314101d26b63f","impliedFormat":1},{"version":"91cf055ff6d1157cad637c0854905c175ae16e085d90896fc4fdc8579c01f0c5","impliedFormat":1},{"version":"5bd284409327bd032d3a03e4af87b80c140e426338c7be7aa5094da3d0eeee45","impliedFormat":1},{"version":"e73a2f7ff4c22c9f8e8a2c9f2167411a43abf7c2b0df2040fcbef397432d6849","impliedFormat":1},{"version":"9ea0fed4f40164e059b356cfa79eca1f4989262247398dba27d0e4d5301da816","impliedFormat":1},{"version":"509bd89f23a7956d094bcc4c600cc12564ec32e609b6acfe498b6c67d1ccfbfc","impliedFormat":1},{"version":"d63707bd1c8e4d6e988a6f8b81724b1188a23195016f491d31fb6098b600c985","impliedFormat":1},{"version":"47110029aa9cc198e2dd55b8983df71956785bf7aae3d40f1e17c0a41e2f40ba","impliedFormat":1},{"version":"e41408cc29f9283a9cc2479b2ed04d378c1dcc07a132e1a0db61ae5e6fbed624","impliedFormat":1},{"version":"7edfde4df10c002ecdcf9600c1e731c83ce9b88a3895fda32f3cacfe1448a545","impliedFormat":1},{"version":"26f845eb94f0cbff4fb342010e1fc24064a79f3cb244cfbdcb901c72313eaea5","impliedFormat":1},{"version":"c08abe4eb7d27ceb3bdfde948ffa7a7831b9b716bf03618ddba0db0199e49fed","impliedFormat":1},{"version":"0d0437bac216bead268ff9b4a2c66d10efccafdc41ba582b2f35f38f848ed8c2","impliedFormat":1},{"version":"43b31cc0fd38809f0c3bc3c2d2cc77b391acd9085d382c3c91e80e1b4c34caaf","impliedFormat":1},{"version":"da9985233839dc77b5a16b04a3c30afc1db42e3e991a1f23bd42a43deae80e06","impliedFormat":1},{"version":"1d7dfdb7412f7705b88a306775ec0f433b4ca2032484c539af05eb1019855b60","impliedFormat":1},{"version":"b7efab411587fe6eec7d0debbf96fe3ea9a2878dd01a928f5590847bec9ec884","impliedFormat":1},{"version":"fe3231da9e8e77e23d81974eeba44d4de894e4f7631244c12beb30ccb9b7780f","impliedFormat":1},{"version":"d5f05696f63397aa52e7d5f736cfbcd5117fbc1f97e66b60df0ac6926f786024","impliedFormat":1},{"version":"8b1c6336949a671ab4a6f11f9cab39ea5a1fd2ce229490883c43e99c1ae1b9da","impliedFormat":1},{"version":"42ebe555ac2d83bc60369750812eba8e048c83bd650b250780f472329f252c23","impliedFormat":1},{"version":"4d7aa8c8a4ab7c4c98c2786272d4f30111618d73f32a06360b66aa8c03916de9","impliedFormat":1},{"version":"12cc4340b2d5a15599ba3a4ea32aed2f952f0517f61f1c314cdd67a85980b08a","impliedFormat":1},{"version":"3a932644a88d6ae1957c97f3b10c5d1560801d40cc8c96d6cb580c2d90958805","impliedFormat":1},{"version":"f6702e5d7b8933f4c638b391e0c654e4dded8fe60ad98d2fd2d01ba0640c8cdf","impliedFormat":1},{"version":"e43818f6c3bfa9b25be2285a99d55c73b0299a4f964c46a6baff49a4861c77db","impliedFormat":1},{"version":"d9e3b7368160756be2b7be06d2106cc4f88c788b3b264792e7ccf0b82afaf8a1","impliedFormat":1},{"version":"601d218e0d8293f49e6a4e80f8a21e6735d234b1b8b8e302f8273968b82b66f1","impliedFormat":1},{"version":"47e2f1f2056fc79183944dc67435934c076221e0dce4cdbb5d5351c507c8358f","impliedFormat":1},{"version":"0caa8b7fa869d238bfe1ad77608606828d3ed36824f1c6d749fb01f4235c878d","impliedFormat":1},{"version":"a4989e72ed4d93d727577790eeeb8f8e10f555779c10dc38e7cdd4577ec233ca","impliedFormat":1},{"version":"f26c3f9dafe8315df6a5e70b04fdced7963854ee479a73cf41a6f7a7dd7caf4f","impliedFormat":1},{"version":"2d842f7ed1de57ebdfdfdb8a8805ac6301e127f45124dcbcd9115a12c3fc251c","impliedFormat":1},{"version":"0421e5aaae059f79a8579b19c03a6a5ace53545c03215a5e6c35b93ba7c6964b","impliedFormat":1},{"version":"9d23012eb12780a94b65be1e3d8cb9afc3efc8c06d17012307d462117219de12","impliedFormat":1},{"version":"e066a06edf364d52f4257380e6966a02442c01ca2b3e222f496355d35ef7f0b6","impliedFormat":1},{"version":"70002710a6f982715c40fd1da01eca0bc9298ba07f3bc37347995645f53c2dea","impliedFormat":1},{"version":"29c9532cc4863787c5827dcffd566f97b0798ecc33558ddc5167d52d0e6168b9","impliedFormat":1},{"version":"de2127b95990f154f41afb1f80a9f459ae7746354a9437a7eda1e55e4420e529","impliedFormat":1},{"version":"aa2c16e35d7af2b6835509ce8e778f5046c45b91b2d37f5737578e0788d1a7e1","impliedFormat":1},{"version":"93aa2e0816593d2bc0cf04c1c6b14371d2fcada6e561c14bf56d3282d35daaa6","impliedFormat":1},{"version":"fdee57eacfb577d17fe209f809f7affdf510c1a64aba8ed3cedb4d74e899cf84","impliedFormat":1},{"version":"db60e032111a14f8c2b6fe319ba70e199d0cb75a0a5adb68c51754cad0941f59","impliedFormat":1},{"version":"03d492c452bdb5d1f9a9efb0e3b375ac17fec045947da6bed9745853b4ee24bf","impliedFormat":1},{"version":"76613c2b87fe472db96b9a4381cd105444b2a15712dabee2703744f4ea6e2fdb","impliedFormat":1},{"version":"641954759d5b9bb6ddb22115d022e224a3f62bad81077d6fe8d85bdf4ebe3bb2","impliedFormat":1},{"version":"dfd535a8d6b871735d13ee27e090b80eb67185cf52e376076574cf0dbc508dd0","impliedFormat":1},{"version":"b7c031179aea37a4b665ab42bc6832392cfc086651e1f3cbbbe17a1229527ec4","impliedFormat":1},{"version":"2a14128e218dc0fce2ad3700c3e45b79eee6de3919a1af2005205665f30c50f3","impliedFormat":1},{"version":"7c2fdfff73c7b0e57b16b5707ae5b237c8a71473f14961403564741bb2d9ad1b","impliedFormat":1},{"version":"7f262a8e55403fdb506262a921fc15d7e31b6b66295fbb4dad302f6fdf8b21fc","impliedFormat":1},{"version":"75faf23b173bcb248d922a0e7d19b7855afb7f5e386028e87a75f525f22a0bd2","impliedFormat":1},{"version":"05bc146f044fee663255512523593acab4a310fb3700199598dcdf84d9818432","impliedFormat":1},{"version":"fb39949c6605d05313099ad88baaf92f2824eb36d20b80b0bb3fef70b5cf83eb","impliedFormat":1},{"version":"8ba546d0184f4a7cfa7bedb4f0c7cd30b3d8ac67f9fb960dd26fdb9ffc63b713","impliedFormat":1},{"version":"1261f11b2ebd54f4dc6afc809457da931b4c9618c99b488c041c3fffc5f3788b","impliedFormat":1},{"version":"6eb3cf6a903570fd4d8f670cdff675bfb67e8828e7b579b71208c0467eeaaa3b","impliedFormat":1},{"version":"6181651b3d922f2009a00282ec2d6fc0931176a944b894b79f8e18cf4b2b7f74","impliedFormat":1},{"version":"df4c48b5a767ca6d06f0b71b84db179851243122d8b15a92e1b8ddcac7e31547","impliedFormat":1},{"version":"0d2afa97d7b566556abadc03816c3568c5b374a66e72e7e6631bf4e3da6a631a","impliedFormat":1},{"version":"e166c42a1b73ad0a670c7f118a12d89f89a8b7b7120b4a3814a06343b0051ee0","impliedFormat":1},{"version":"eb896f64d252e42a5566ac88ba8262fdeeebe3f1903f38acbed1e3090bffb3fe","impliedFormat":1},{"version":"d0e4b317ecdf6c4f2c0caa0c95f99768cad523ee9e915df43d656fcbb6f00e18","impliedFormat":1},{"version":"a58cb0a782ebf1fb98c33f0c82fd5bfc44663566d47b91de1e242faf18853e30","impliedFormat":1},{"version":"4893fd721b065c846b558036d7110d64708a8337677886a664da64f80d75033e","impliedFormat":1},{"version":"189c79c8717c3a2cb0562feef4597430dce71ab1b123107413b7b92cbdfa6583","impliedFormat":1},{"version":"149fa2725757abef64f95bfe357fa53dcb173502afdc8ee0067ff0b9344ec310","impliedFormat":1},{"version":"0fce30e9ea633141f934dee5bdeba6b955dd4383ebb34553c214280ae6c595f0","impliedFormat":1},{"version":"e42ed423f29f47e2c44a574ca7de673c853231f85f4c3590ee6970db259b75bf","impliedFormat":1},{"version":"5bde7261dd941588be86b702b9dc72786561299cf7271aef232504bd8a22f504","impliedFormat":1},{"version":"926cb5e62425abba24f17d3813e59966bee892e434f84d51fa4ac3c2d2f02ca3","impliedFormat":1},{"version":"47597ce6305dcddc401ba92e383cd8e751ec078fc42546f305326e9f76b4a4ec","impliedFormat":1},{"version":"b1de63b1a81c18999c5331e9a14bb999caba0905b7815619dd1fb1fa690813a1","impliedFormat":1},{"version":"c39749c50dca48cb564a35f413d170089152380233e39396105eba049c1554ec","impliedFormat":1},{"version":"e4128e408464f38961eb93e466b10f0b70a5347bed31a306567de8a9d2cfa2e2","impliedFormat":1},{"version":"2d6abcf5bafa6dcba05d93f3a5addb1fbe1fd97accf0fa31d68cb0efcdb43c09","impliedFormat":1},{"version":"728f996f14dc3935a2ed4c0a419a84163f85c52473fc930b2bc7d29c0c67a309","impliedFormat":1},{"version":"4ec8b0efbfb1789df78f2d1a83701eb6ea2bb28902be8dd48f2881185c056951","impliedFormat":1},{"version":"692ab2223b4e73eb7366d5eddbe53fa33c95c3824db0bd9127ce00f4220f4d2b","impliedFormat":1},{"version":"2c347f3123d7bfcbef0ef65ee28afdfbea669a34d0599e3a957c2f7b0b2e2ea1","signature":"cbf4929a03e21f1efc096c3844bf23ebbc2a63aee04a1c112961550959e78bed"},{"version":"b454c786b93610e4c1f846e6ec79151383c92a8ba811474e43ccb4b27fb6def2","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3aa0191a3fef91838c231928cb85718ddd5cb835e744ff6409fa2041853b5f59","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"27e94fcd5716ea90316f94c16d7adf20e84ef834f1f2299a06707c3b470d35c7","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"cf9c748355bd3a2e3fda3af11516ff1514b0d6381b23787de0a3c657a9781020","signature":"fe6da0811de9969e3fbc0f33e6f71c577ddddaed82d0a71c66cea696c1e4451f"},{"version":"a05e78cdc4cb75d13705456fa8f9487d6d2971d57fe0b3099f5b2b8635628708","signature":"27c6fb0b1d1e5e95b7206c5d93c4b83da39f719852a81292032aa140dea802c7"},{"version":"718449c8119775878941cf45768d55238d3da7c44b1d1cc8b5fd7a7c6ca87f4a","signature":"da4b6b9c275762e16c3f25c9b9a2619e85b0e275b6bac04149df7546cdc7d3f7"},{"version":"ae00d6233f6b444350a758adc33a2bdc7e4114cf85673507f4b0ec0d011bf28f","signature":"b1fa6b24929b174a175ae6939c5343037df32c88b753142562e407d382637df5"},{"version":"045faf11c365dbc6efab1eff851db2cf8611e3b4d3d857e3ae20e2d7b073fee4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"a3306a655467fd78f94061efea6a4849d73e2ce70c16a7aa2e86edcac8003d67","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"eb58fe82b94e9d939bf7f9008ec2bd60685abb453c84766ee6b383bc0ea3ee04","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"865299278243076bc46d6fab22ad7102dadbaf37822f9b8e3e9efb6731551686","signature":"56c3bec3b3870d45356c40cdf8eaed6d48801b994e9de964d1d198caa24cfc5f"},{"version":"1bce8e979bbbfbbafc15255ceeecd3260345ab4d628f6c7d1232ac66576321c0","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"1fd6adc58258543eb8b1d73733f506d52ea718d3b07052559d1a681e6b59b043","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"e720c8a37b87f5713093ed04015dbc647996545ffc0fdf07885f444af738dcff","impliedFormat":99},{"version":"f73b596cb4b4860fd0a3ea8cab67a42ad344d95a392ca986ca4588f59ea8c2cf","impliedFormat":99},{"version":"ad60a27f86232effccda771b5fe6852604ab7fa36637dac3da122be6be7107b7","signature":"be6fb521f30d2952c0fdfb51bc2cf2dedb65686dad9e276be5411df932abfa06"},{"version":"836dc9b821395e33a0635201a8babad409e4cdf5410f6b91052fd7068481a567","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"4ef9ca3b2a2bf2f8b21343632ba0146fb9fa05b7ed0ceeea8df8b3bfe4e36131","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9e004aab4cd07f39dcb06c24812bf54b4eadea987824d064f194121bb2181750","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"bb8161c1a15c2a9abd02cd18522ef0f53b4fdcd2a570ef75dd4fc4d556c86a27","signature":"2d02b8fe2d138e9e77835960e51348bab6ebcffbb959dec5407476588e16ba3c"},"7121f8a3d7143ca81e758e5f4924bb60730a03268151ddc0688f144b03d427d2",{"version":"4b464ebe4030df055365a7b373960c31ad3193a0ca6035dbd47a4524dd3b30e1","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"33bde33d22193adce818d990639a9648ba80edf3c421f07a5969c531026d7ec2","signature":"2fbd85addfc0a7ea8bb60dee32e74cfae717193f4d1c4de92d98774ee70fdbb6"},"4237415a94b53051094d964f586967c87a8cb1ab3eb0032c831c2951d4d09edb",{"version":"fa7aa9c16a019d592fdc0fb49dbd819e070ce7188c86075d2f0bbcd0933e66c8","signature":"32c85b961d512c4baf4471d93f0f98703b97771389f5be0a3724433740392b34"},{"version":"543e0c4b4aaaf8daf7cff0e2b10057d42f3a1776c16a43553338ad1fc707e1ed","signature":"9356d6a20f98e71a50eebb88c2f22214c5717ec91c9e566346749f3fb76698dc"},{"version":"872f02345461bb5215bbefd538532bbf88503ac14d127d957bbefb544fa716ed","signature":"4f132fa93602067ffd08f96a0df65b0fae0cdafdb90074774c0db99586961253"},{"version":"789891e8b8386136b7290fe7eba4de8f1f75d0e96b52b4d268b67e5f0c406096","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"e6e6ec0b2210f5491401581cf12db8c0c2454110f6e582e9a5949215bc895c1a","signature":"4203881928b2d5bf69d893ec7ebfba37a893334dfdb8c1a1991fe7ac3be05c37"},{"version":"cb97ad5e7e8900ccde8f4622e4dc09c51c8c4d411c1b963320efa8f3bc111e94","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"471c11ae126af540479b5f9ca4944304fe529c949d44a9c14649bf2b5aa5c67f","signature":"7c007f445e74844401f69399f0da3614cffff3f36237de516376eeee12eedaa0"},{"version":"97baaec03502555b8e929aca9be1b28995a0010709c28d4f7922ba51ccd1b397","signature":"2c58ca6c8aed6645f9506ba40ae1ddc6ba7fa41cfe5bada11f5287db56d67526"},{"version":"79c662455dda7276e2ade17948973bd374e733279c0db40a19522b9a3f9b7c3f","signature":"d576fffdebf99baba8b6213da269a0c0edcbcc87428e33ff117c85fb01fafe14"},{"version":"6392353adcff7db02a3f5dcacb5637b791dbbcb76125aac3075da2519af9785a","impliedFormat":99},{"version":"1f3952b74b8c766a2e602a0ba2db19d3d872d00bab4e01746c6b7229c585086c","impliedFormat":99},{"version":"8df31065cfb339718aaad75291fa8c1cf6957e08178947f8ddbb81bb08ff5480","signature":"b6d89b0b278e33c0aa514ed188ce46c6cbffd6c20f2214c7b139b5e5b59535a7"},{"version":"4181fe0f4efd449a39014ef97fd87ded8c44e1dde60c1da5a182910e74900ba2","signature":"b6d89b0b278e33c0aa514ed188ce46c6cbffd6c20f2214c7b139b5e5b59535a7"},{"version":"96beaeea47007a8d7f575b648ff2df60e48ebb865bf83539371067692d798c4a","signature":"b6d89b0b278e33c0aa514ed188ce46c6cbffd6c20f2214c7b139b5e5b59535a7"},{"version":"b0d4a0de9bdd186cf2a14f78058ef54f62c2e4757f3a78cf2b490c0db4d6e80a","signature":"431837d6b403e5fb2be960c5c8df9385fff1b501dd0b79904da8228ac60859ae"},{"version":"620ba450e15d2b364888dc6c96b3a1d8859716c544d76a17476c994f9f0fee25","signature":"6b068e399e00dfcaa1cf320a39587ec06fbb40db94ff0adb3508749c8634d77c"},{"version":"58e83811bbdc661eab637ad96abb4320043cc7b9cfa99b9ecc638face30e5534","signature":"f0173c01d763b29191674bbeab42f507fa2774bc7a42a6ca483171a59dde2d68"},{"version":"58dd7d6545588d7ff9b47101fe2d0d1280069c2254275caf90c5db95e02c95c2","signature":"60431984f24d016d11104ab72b4d2f49e64bd379627bf6903846815ed63a63fe"},{"version":"8a097dff56f7a9df9f0d099e472a2bbfc0458a216339f4518e7e6188ce29bcbc","signature":"6b068e399e00dfcaa1cf320a39587ec06fbb40db94ff0adb3508749c8634d77c"},{"version":"d1dc71213d324f0e882aba598b72e386c7770ebb71ae1435cdaa2bcdda362cc1","signature":"6b068e399e00dfcaa1cf320a39587ec06fbb40db94ff0adb3508749c8634d77c"},{"version":"eb5bd03afd30cee73f8ac1ea025169963b86ec8d37853e8f7ae16fd06b98fdc4","signature":"b82ca94dad8e235588cdba1ab7661ac7e17a1d714398d7ef12573549fc81127a"},{"version":"1112723954173b83f679fdf3d528dde3d70edabb8232602f3a0892aac032a78b","signature":"87ed88cf4d218b1da179801cd77c3d78cf045fc4d7f6447b99378a2d1f18119d"},{"version":"60602c57f5d767045ffe824c29dc24c644dcfb7905d6e0f252bb06194d9ee19e","signature":"ce38a92d6b07e8b610a1e01a66751772b90afd94beff8eb3e9c73fdd5d8d10c5"},{"version":"c9c42d5948aa033c444cb6a3c188bcd925997bcc2bd8e97928af480ee356417f","impliedFormat":1},{"version":"f4bb2d3708ccd853dac13f97ede135d721bf5c2586f73ab8f1170f439e44b5b4","impliedFormat":1},{"version":"fd5649816766f52b1f86aa290fd07802d26cbb3b66df8ed788a0381494ebd5ed","impliedFormat":1},{"version":"269a13226bf6847c953f01ada5aefe59a3963a3a74f98c866ccbf08679d16b86","impliedFormat":1},{"version":"b769494ac41040c4c26eb6b268d519db4cc8853523d9d6863bee472a08f77f80","impliedFormat":1},{"version":"2fe42f88e2d318ede2a2f84283e36fdb9bd1448cd36b4a66f4ead846c48c1a33","impliedFormat":1},{"version":"cb403dfd16fdbdfd38aa13527bcbb7d15445374bc1c947cfcc3a9e6b514418ab","impliedFormat":1},{"version":"60810cf2adc328fa95c85a0ce2fd10842b8985c97a2832802656166950f8d164","impliedFormat":1},{"version":"de54c75cad3c584e18a8392a9a7e0668b735cd6b81a3f8433e18b5507fd68049","impliedFormat":1},{"version":"c477e5c4e8a805010af88a67996440ba61f826b1ced55e05423ad1b026338582","impliedFormat":1},{"version":"6b419ab45dc8cb943a1da4259a65f203b4bd1d4b67ac4522e43b40d2e424bdd6","impliedFormat":1},{"version":"a364ff73bf9b7b301c73730130aed0b3ca51454a4690922fc4ce0975b6e20a33","impliedFormat":1},{"version":"ef113fa4d5404c269863879ff8c9790aa238e577477d53c781cdae1e4552a0cf","impliedFormat":1},{"version":"5bfa561404d8a4b72b3ab8f2a9e218ab3ebb92a552811c88c878465751b72005","impliedFormat":1},{"version":"45a384db52cf8656860fc79ca496377b60ae93c0966ea65c7b1021d1d196d552","impliedFormat":1},{"version":"b2db0d237108fa98b859197d9fb1e9204915971239edbf63ed418b210e318fb8","impliedFormat":1},{"version":"93470daf956b2faa5f470b910d18b0876cfa3d1f5d7184e9aeafd8de86a30229","impliedFormat":1},{"version":"d472c153510dc0fd95624ad22711d264097ff0518059764981736f7aa94d0fa6","impliedFormat":1},{"version":"01fdef99a0d07e88a5f79d67e0142fc399302a8d679997aac07a901d4cf0fc83","impliedFormat":1},{"version":"ffcbdda683402303fa8845faf9a8fbb068723e08862b9689fc5a37c70ef989b8","impliedFormat":1},{"version":"208c5d0173b66b96c87c659d2decb774be70fb7a5d5af599a5d05f842b2e8d74","impliedFormat":1},{"version":"ec3b09b073a5e8a14fd5932cc4c33efaa0280c967d15bbc4c0c5b73a0d2f1a68","impliedFormat":1},{"version":"4b4c884e11985025294a651092f55dcbf588646d704e339674dfe51bdeead853","impliedFormat":1},{"version":"78c8b34f69c45078c6a3a3f10a24f1a03ea98495b6d75b945c1a3408a3ce5a26","impliedFormat":1},{"version":"0b1a08da571520eb288eb75843aad95d07fed423aba18b1149b5a0c767baf688","impliedFormat":1},{"version":"9c4708e703c8deb525e95946b3fdd8d5caaf724b3ac4a1cd6c2cab759b53f76f","impliedFormat":1},{"version":"ed14fb238769ed0b0dff6b78bef5263f0f50f403878ecd609fc71774b2113b12","impliedFormat":1},{"version":"59405847661d05bec9243efe9498211cb7e66d2620fe946e40750ffcb9e7d56a","impliedFormat":1},{"version":"ef95961bc90e8972bc9d88bee5264544d916929c0240e8c3c8ae220568b26ead","impliedFormat":1},{"version":"3f64230713c989e5f2d1d46c13fc8b2d9193b5dd59d393d5e70098c221894b1e","impliedFormat":1},{"version":"e49eeb0f93ea6a311a22f5b66a155c368e9cdb3585695fd951945df1a4192eb7","impliedFormat":1},{"version":"6f704837b406e4ac6ec5942018691ecc10e2d079cd64706d8ed1e86826d0671e","impliedFormat":1},{"version":"ee2229f4fc2d2306c864e5c2399aaa5958e4b3e1c964701fb8a84709237c9f47","impliedFormat":1},{"version":"6e5563614d424223f4748c6b714e1e197c8422824ff42fdc16f64484e1a863a6","impliedFormat":1},{"version":"8f31673ebf988cfc4b7ce2adb6a6c489dd748025600d8e2b7d922f952d7d21af","impliedFormat":1},{"version":"fd3715f87964b5fc26f4c333422969da8ca45e69e3fb6973ba6c806f437eb012","impliedFormat":1},{"version":"97b1e695f57dd56a6495f7bdca876981cc8db1cc4a555c3964aa14ce26e0f4de","impliedFormat":1},{"version":"cf32c06d23f373f81db3e93d47b7006f5bfc005df4d92bf5407b7792adcb3c47","impliedFormat":1},{"version":"eacc624e44f4b61dae0502e59ca5c0307dee65e7c257ee3eab4b2c8c6f156cd9","impliedFormat":1},{"version":"6041c1c22cb701abf3d98f153f878b12280f3b2213144588209b66ad5f5915dd","impliedFormat":1},{"version":"d95c6fb6552ca855ed11cdcaa5c68ad484bdc6325fd86fbadccdebfe57ed841b","impliedFormat":1},{"version":"0063b3ff097c4542be10322c67ca804e9e4504545b46ae8d620ceab59349ee84","impliedFormat":1},{"version":"9ff44b788f5d8d86f6fa34abf3faec8c425ecf1838248318acb0c5a4c88e62e7","impliedFormat":1},{"version":"4169cb216a6b361ba3caadf4a13670354e2a68ce055f4ec77ae7688902d2ab2d","impliedFormat":1},{"version":"e642a86d8e0956bb7c76aec21b83bde20409b19eb22786ed72ac5515aa9268c8","impliedFormat":1},{"version":"879e2a34d0139f04a32974fdfa44c5720619afd28f8bde0e5860f371d5f65d34","impliedFormat":1},{"version":"8e04860bdf072d4270b09b33b2b91ec4545297f23cc580041cad3e738f58d92c","impliedFormat":1},{"version":"bff595611ce25571f0cb50a83b7dcd7599559d6d3e98bf4fe87ad77b9c347664","impliedFormat":1},{"version":"2eced6af832d4e69811e353c7751f73bba07dc3b63189e0fa963e8264f341c12","impliedFormat":1},{"version":"a884b3560c8a29e5cb7f1263d880ff5c8b017991009edc20f450027c4a112b3f","impliedFormat":1},{"version":"6775c3e28d13ee126ec2c2e0827ec76422b0e11d9d5c2cfdfa7b982d48455fff","impliedFormat":1},{"version":"2ab0ffd4cdaff94c5cb8701f34442f8a018a2b62623528a66ad1ad8172ac6626","impliedFormat":1},{"version":"ea8215cf7cab1015579eac88e2f16fa1fabbe9f84ce4d2848c10f36d7df8ca1d","impliedFormat":1},{"version":"cc894fd562a73055ff72dcb7821729cef909b85bca4d0e2e2cbd0c1a2ecadeba","impliedFormat":1},{"version":"ab058bf3dbdbde6571f97a57a3b52b14be9d7e19f23190e9a551d5d6f6b6563f","impliedFormat":1},{"version":"142892cddebce23312318d79014de94e64a1085b8b0d73b942b4a6ce40a1b18d","impliedFormat":1},{"version":"db84257986e870ab22b304a80b02ea5e079c13a7f7be7891c0950bfd9e33f915","impliedFormat":1},{"version":"24cb43d567d33ac17daaad4e86cd52aba2bb8ff2196d8e1e7f0802faeeb39e95","impliedFormat":1},{"version":"dc6e0137694a7048ceba1ce02e6a57ab77573c38b1d41b36ae8e2e092b04ced2","impliedFormat":1},{"version":"aca624f59f59e63a55f8a5743f02fffc81dd270916e65fcd0edb3d4839641fbe","impliedFormat":1},{"version":"ce47b859c7ada1fbb72b66078a0cade8a234c7ae2ee966f39a21aada85b69dc0","impliedFormat":1},{"version":"389afe4c6734c505044a3a35477b118de0c54a1ae945ad454a065dc9446130a4","impliedFormat":1},{"version":"a44e6996f02661be9aa5c08bce6c2117b675211e92b6e552293e0682325f303e","impliedFormat":1},{"version":"b674f6631098d532a779f21fa6e9bdfca23718614f51d212089c355f27eea479","impliedFormat":1},{"version":"9dbc2b9b24df7b3a609c746eaada8bbc8a49a228d8801e076628d5a067ff3cc3","impliedFormat":1},{"version":"d6ea60339acf1584f623c91f5214be0ac654c0692c0c3abd69a601fe0ff0e165","impliedFormat":1},{"version":"d08badb0bbee55e449ea9ea7e7978cc94859804c49bdc7dc73e25d348337c0da","impliedFormat":1},{"version":"b116a03deacf70767f572c96a833e3c1adf01fff5c47f6c23e7bcb60c71359ba","impliedFormat":1},{"version":"023aedd02204fce1597fd16d7c0f1d7be13fcf4bc1ed28fb30a39587715ea000","impliedFormat":1},{"version":"b18adf3f8103e0711fbe633893cfbce2897f745554058cffa9273348366304d2","impliedFormat":1},{"version":"f41fbddb4a2c67dbf13863507b50f416c2645e7440895ea698605541d5038754","impliedFormat":1},{"version":"636a0fc7a5ee207de956241b8cc821305c8cc72b9f0bec69b9c9de15a9eafcfe","impliedFormat":1},{"version":"c326f85f762b14708a25b9f5c84691562f5cf39ae9148c00f990b8b4a2a4461a","impliedFormat":1},{"version":"caef5b191982cd88619282b10e1c52c3cde8c81d4eaf4650b4e62d73f77483d4","impliedFormat":1},{"version":"67759e9a92dc9e76be40019d7d2f5616bb1e0307c9935ece1f86b39f531811bd","signature":"572661c7274a7a2e851c811600536f38f0aeb617f480596c6bfaa2c76c575ac1"},{"version":"36d7b8ded6867fa2eaba8b55f41504d7d5db0967a86d72635d34bcf10cd8b34e","signature":"04ffa140faf9afaaef959427e3d915547136779fe8b0489552f4e51f720041df"},{"version":"b5277460e6c08d01ab6acf7386b4bceffc67d2afb98335d2db6b33a668099874","signature":"caf1101b3030a602c7800d3ca21e22054e350ca16b5bd55def0c7605f96135ca"},{"version":"78c1eac4fadcf916d09bef94daeab7d032610da7632d1c2483e1a79e0fa614da","signature":"e4df14de67b46c721819c143860dce6532f4325ec928fae3c86bc28ed15470d1"},{"version":"9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","impliedFormat":1},{"version":"7af2cded11e7ce2a54233ec5eae020dda35621f22de86e892416adb043b081fc","signature":"5b0016407f298eb4b0e2d455811c7d5ba29fa2a28e6862cda7a23cd1a8902a8a"},{"version":"85ca8e59de5ad36ab068b146778b205a9b0b963ddce95f0a85d6105a07ab55d9","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},"c1d4d4444aba9b01cb64dd485fe7c8ed3575fae862bc5977db4836ba02890a6a",{"version":"fa7f2e8b69aa84a64dcf0417f8a8d9719b11af3776c4c1ef35f63e9895cde3b2","signature":"61402ffe48f427afeb8a9905bfde958d8a875b4a73b010408eeafb6938552fb2"},{"version":"daae3fef862be66a4f3d019dbca43534e1e84c56b4b488ebdadcf71d7c93ac4d","signature":"69cb2e721e96bd522ad548f4c9e29b8789deff2fcf3a51a0c6aae39137cdd730"},"bdd3a7ac1f79283acbc594a8d7b17fb3186eb7ff42d19b57f113f7cfecc05ed1",{"version":"95d4125fa23520b53f94144c541372f2e4aacf495ba6c6f01a76e6ab4aa7f39a","signature":"91cc7881f1d3daf49a57b874ab0a6920824323c116fcda15210a9c83354d9024"},{"version":"471d2936b56890579899605818de833a454f2e8950a1816394a79d492ba9d94b","signature":"f7cf47465eeec9cca25e00b2c80eec701edd264296761cede900834f5ec8f0dc"},"297ba6d7e4e8c638f366363cb8d85141fdb1c2daaa6b06ba257eac005ac978fb",{"version":"0baddfc43f36b1b20d5b3f08162039f860d19470299795b17c44eb8631d4d956","signature":"6169ae88a69aa1c5c1da434f7d152c30a1b7933dc0ae68d1d8dbdaf952d0a3f0"},{"version":"10252be95a2e479a4434d42db379a2331359386072e9a15b2b3e366020616c4c","signature":"21dbb0edf7bbb55dbea374086764d613fbda1fc91513fe3d7fb659f01abe8488"},{"version":"62612748bead131af42d1680779fe254cfa5a59e87a484fa22e078bdc9978d10","signature":"109281b0c2cb0b694a3df77236aa739504c8041f210149af581bb4226b3b7fe0"},{"version":"8eb25039b561bc9f7994190dafa895ef1c3438a7576de564f57cc8e7f9f9c47f","signature":"0fede8a2334c7b8c664ca7026725f5c4cfa6b3a742da12b6496e03ffe9dafd7c"},"ea79deb2c6f4040dc55bd04e4a37ea36858d7e59ae354ebc0eccaa2698fcfeb5","91883e5a7e00b0bc6e87ac5989af4c21de2377268e6bc15379ec1eaae601db50",{"version":"7c12eca255521629498c645929488f10adfc8c6e03cd4e343115718e5cbec0b1","signature":"ed551f11e60e954e5684991e4587ebf9e2e66f5d460e925ca064ab90a3bd1fb5"},{"version":"4c15633afa04ae5207867257f5a56ab0e76c10be5e9ae6b9f9ce7be9a03cd67a","signature":"14967d27c8c9ab215d7e1c9ec3663e6f9a1b1c85f515287a51c1e269646ef7e0"},{"version":"a0630ded9a175c1fc3fca8488e5b04c3954565bd723cbf89e997fde070c2c8c3","signature":"b235d72f7b8f214e148e3eb9d7c7173bdd58a9a470e1b168eb493d047c06dc28"},{"version":"3b33ec1a7c1ba2685df026fee39a51c6f7a1db65ebedd9489e50187bf74b6812","signature":"b62c4d220735f1e4e3e293424c16b416cb393dbe6e0a16f5f6c878828403ead9"},{"version":"3dacc5b5e74ed8864cf1b499d718e937bcec987edff316303d84b0738bb8c28c","signature":"a388248c3501e1b917d6e23450c037e94dc5985dad5ccb748b9a3af42222c0b4"},{"version":"0ad9e60592042393bc127a9f930f47da6391cc7d8ff9afc7a63da641b463d052","signature":"383ed1621a32172eba20123a7055e4ff5461af5c8020219c620b9da657f23cbb"},{"version":"1750df344be53385979e126bf8411a36b545091d74f719327c805e77bd5abdef","signature":"8c0b9211fd75721d449c9250a1abe94637c0022d0189c555cfef9ec21173ecbd"},{"version":"ac572c40e3f87e53112b34060575b5450efbdc11fcb6f077a5e4d1979a10c994","signature":"d8a85502009fd40ef5758688602b7ab4105e5ffa90c129da15a37c4fd32adbba"},{"version":"4b2b3a557bb745adc2003f01ac67a42ffaec553b3363e84c455e304818de8411","signature":"fe880f4ac0e592b24d66aaf190a58dcfb0e0792a669a12af3a54a37f681b282e"},{"version":"41b37536c68576a51e4a027a6c057de6e3f581967fbdfef4d88e56ce3cd9754a","signature":"db8d5d6d2b58ae9b2c66190f35db0f4181ccfd37263c83d9e23a1030d13956df"},{"version":"d763c69fddb176fcae60ee69e091f9ae4b9ef8247abe142ef034b04d9855dd34","signature":"66f91078b7b81b850862ad709c4e6280031f9b0759169e06f9cf0e2a8c93f3fe"},{"version":"ecc2e5e7824d6de1118b83f4d4e3ba4315ac3100ad3b334f091309c38041c34e","signature":"90f59b4ea8a4fbd503e2e871a05e1bd160563857a65b98415b7eee6870b2cc55"},{"version":"48af7517257558314b62056f4ac95d2eb262d4af1489cd925d6f799d5a01904b","signature":"914f7fb0224db3edf12b88260a241c0510251cf6235365d957a373c3b7908bf2"},{"version":"43e1113c7fb7a8d33aa20e34a2b9dc8ee5802f95fc5cf9876169931b2934fc33","signature":"420937680b542114a25ac81bf07c834427be730c5d5dfbb6e9e673cfadc523bf"},{"version":"45f46f7810e24cd766508538e7184733a5b8e3bce1796cfd131fc5a51a9a6260","signature":"e179a2e4e15a3463c0accd58a3cf8f93802e65b13ef4f886978f2d66204e02d3"},{"version":"6c298f95b95399bd38f4bffbd92fc2934e7acd8c700d09d178aa5e4aa99eae3c","signature":"aa8e48362ea3c443635d0c6b8cb46032bf4fa37206e7baabcfa37d4d0a26fc30"},{"version":"dbc5d120ae090bc3b86c888ab051cfacf5e6e214ecfbeada46d3da75039c5012","signature":"05c5b3909dcff6e1e3309ad1b8322d977ca0453ed03429c2aa33ac2bd45ed229"},{"version":"f3f28aaf7089d69817203730645c71ebe7b21f0b29bef967f4b61b51b27990ed","signature":"3dd19b2e197c44aee2e4c1c3b3c7cc9cd4afd75533ddb77aa469bf633f33740c"},{"version":"313c8aafe4e94425f066c93067550d37ca0b15621e1086595a53dea95a974b45","signature":"7a447468a52ee94492482174f65a14994440854501c143a519d9bb469573749a"},{"version":"29271907eff0763b42558502632c8a3967be0df3c27432fdabcf0429266157e7","signature":"ffe80270c15b12a818ae8570eb9ea1fc2cd0383c543966aff6030f6980022e3a"},{"version":"1f43bc59dff60fd58fb5115edc06dbf752022ff4ce091f339879265ed79e1143","signature":"c1660dc4115ae9d89c4806730e90f532e4848437d2b670f9c7f492d0d37b75b8"},{"version":"fa0267687f9ea8b57f4404ab5f6ce654b89ebf2221a09175d56a8b30df74f636","signature":"b43ac93734ccb5f35bd6d939e862c19405d1ccf752522075810c3230262746c9"},{"version":"9a59d5981c4cf2e0574120a1d9c8abe5a18a00e9059f5c3eb499daf22fe12154","signature":"2298c65c524016391e7f79b937ee215398e863df1e7e85488c13475350a96f92"},{"version":"f031e290da3a6623e47c7d36933f8fbc5cd1c8b50c391e7e3d81366e07a2f613","signature":"86130004e2396f6825b1a328ac03678a9778be0496db00ffcbc6d9fa382df7d4"},{"version":"2ab3f67c979d3939bd52826532d24ac26cad3ed138c03cc468245fdba7beb290","signature":"9f3d5dfd1d6fb14a43287e7c42d2c49fc56bbfd2f71373c493a82827a02a9b35"},{"version":"498c2abd4fd3d4068cac59a57e26311229e155651b2b589fb1784451eec77d14","signature":"bf0ea882649b6707ff836a829e8f42b3cbdf167b98154b2233cd4458319e83da"},{"version":"9d7f4716d0d172817827aef036d4a39e7a95b3af1aec1614572fd271fa148de8","signature":"81d5770d0ee1ee2232d9509a00258df59e9f102eebc52a608e64cac3588a9a44"},{"version":"55a914fba7f17f73eb971e012bcb90221d5dca20751852c217428a5511db57a4","impliedFormat":99},{"version":"d9b54195cd22859480b70a2e287c41e654c812b0d3945652bd08c8943ddef78b","impliedFormat":99},{"version":"73b32be132963c6e06bb2f833ea0c21116581a3aafc8ac9145cc89a0b6f54bc0","impliedFormat":99},{"version":"73597a22736b6efce7cb30e380705cd6572d9e3f9816068130ec09550129996f","impliedFormat":99},{"version":"04504c465aabfed05529bf3b314df66c4eb449b188547c51edb962d8eb6069e0","impliedFormat":99},{"version":"09466b34e26295ee836861fa6348aff7b2275c6220cc0b41040c9949421e052f","impliedFormat":99},{"version":"242ce683695df72f1cdd40ae2ac06c569412e533528de95d956b26218cd195f5","impliedFormat":99},{"version":"d75a572cfd779c99cbdab5f8f44f6ce465367c057c07e33364d186de41ad9b14","impliedFormat":99},{"version":"8d12c3032607835687037e28dc245a4af486ef4aa6e6cb13744dcb0a3b074ab4","impliedFormat":99},{"version":"7ee2d1edc6f59a50eaeb12ac61a74ab4832f64661f795131df23ac8256df2329","impliedFormat":99},{"version":"8fea385f7e21a39e857e3fae89eabde7b0960083d205177430be507b38413579","impliedFormat":99},{"version":"7fdb8950d8a019940182ff1f50d02809a45832121b9a7899677a497aaba506ce","impliedFormat":99},{"version":"530e23db4425868edfc20e35fe2d8acf047af5b6f14afa46ee2e0e71e40c8df1","impliedFormat":99},{"version":"7cf421c4c6e223d2b648dae0ea51a134c4c8a5d8d55db1287372c4c1569c656f","impliedFormat":99},{"version":"ee662f8ffa58a60ca3ca8c141d4910043216efe63f696146b6fa0a455a4f9034","impliedFormat":99},{"version":"4eb4f2e56895129861a971177f8e9241ccf633daae3a6ac7343b92e973381c26","impliedFormat":99},{"version":"c75223aab2bfbe3fe85211fe56cfc844dd93d33e503e22e9911fd0d3e6f6538f","impliedFormat":99},{"version":"8fcea3d952a8129821d4060969f305a341706c256cb8002aba8e5b07088c24ed","impliedFormat":99},{"version":"2a6cef87ea83b5bdbc862e894329ba11002e76d5fb6ab24247502ecad2c6fbe7","impliedFormat":99},{"version":"39248c14bedc3e2d734739452408661523228ec790d7142a4de185ae88904da4","impliedFormat":99},{"version":"c14433af8654964ed33f9cc16f9369e05ae543d56bbc6a1c3b393fa7077f08a1","impliedFormat":99},{"version":"d867a5469eabe8abab25b27abb7125ef2ba019ef42dd1ca2b5d0871513042629","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"c031417387ddbb2923f41e3fc94b49157745785281c8949a221cd69368610086","impliedFormat":1},{"version":"73ef706b29d220404677226880137ad0da0145b6a2332d5427b9517dee295e70","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},{"version":"50854b8ef4c29f3e952f170aaa045604a9d90360b680ddaeff542d1f5bb5fa8c","impliedFormat":99},{"version":"caa3a0be5c051f52e27b91642c8b31037c09ad0b65288498f4c55e33be7ea249","impliedFormat":99},{"version":"48020f2aa87dd71c26414f9afdf172159a6c31186705417da52add9d6cfe2153","impliedFormat":99},{"version":"f4e5a6883146482d6b49c1406f99a38b1ef883382b169bb5fc6cf7cf9f2ac70c","impliedFormat":99},{"version":"8b7b4f82a54a847a29fa481af4ea74372c19b75379bd27658c2a819149f21871","impliedFormat":99},{"version":"4f7faca5821e340342ea0feb3d478126659ece37d5dfdd6d9c9536bfd48def34","impliedFormat":99},{"version":"99878cc85152e70be715546f165826d83cf033547b4647cc3cc9cbd6d4df429a","impliedFormat":99},{"version":"7677f5595e7bdc2e6e42ebe8b4df4f4b520b28f6f175c839b73a208e6f3c8907","impliedFormat":99},{"version":"fd7faa9225e2e61a0a3d786a7a859af52dcb295c06bce7dfca140037655dc095","impliedFormat":99},{"version":"af0f7e3281ab0774f26ca8bc36d6aa37709f3510c8c1eb0ab122e7063159be01","impliedFormat":99},{"version":"960096f9e2ff9e9019e1c23a04916f2005d4c8dbd43f96b196d754b6c8a16700","impliedFormat":99},{"version":"c7c18305c761411b3c168f2b3376101b60d7a7d7c0505e81c6d8193a418f3d63","impliedFormat":99},{"version":"6b9a76dbc0ac3a427aa7370981cea9aea0e8286453b189dd03776f1034f7847c","impliedFormat":99},{"version":"3e48026dd0f58d4668dbfa9c6747302dcbc52e3aec373ec1f95c2ba78c308f33","impliedFormat":99},{"version":"053f54680ea9b4b1a8e9e5fe9f4a1fdcbc00f8f9b6d895109eb0d169915dfd11","impliedFormat":99},{"version":"3b0f440d9e4227285cec9159b1a472bc885687baf227a7b4126e2ba6dbef96fc","impliedFormat":99},{"version":"656e3a4ac005fcb1513ab1224eacfd55ae04b6f16d21d66c971dc901dad62c66","impliedFormat":99},{"version":"ea4891706f147e494a2a7028b2376110c2e85b7561b27448d51a7d1277c6fcf2","impliedFormat":99},{"version":"7f9bb3e6bb8d0607f94d1498c5fa8ac7445fcb4af52d0775a857d0986e0d0c84","impliedFormat":99},{"version":"c98c85d5b894c8955950338b1091f0febdc6c6702cf3b67a171d29d80fb2dfce","impliedFormat":99},{"version":"d00addf28fd877e3f8109b592b1918084cfb831268a0fd052fa72e6e01390cca","impliedFormat":99},{"version":"0cc0f30db3c4a2577606c6930eac2814d0463148d1bf02be9eaa318d6cb6d40e","impliedFormat":99},{"version":"21fb062824012292b09e9357aa7ac3231a0d683a7fbb9bc8e2b027346c7bcb32","impliedFormat":99},{"version":"9aa939dd1371c068dcda7d17c32fcbee08fa994890fefac8ad39d8cd5a294d92","impliedFormat":99},{"version":"8c0e829b03024d1905dba908ed55a5808d79159709770fe7a3b0395fa78125c6","impliedFormat":99},{"version":"15e6253aeb724521fcd0fd8bab60ac00b40e1b6c39aabb0de3b3e45ebe2d584a","impliedFormat":99},{"version":"4d3a0370e69c2d70d62a2eaeb40512474e38b4dff1a4e7ac98637f954ec5c143","impliedFormat":99},{"version":"b0094b81741504d0282359218e3659f5282b9748ad0e80d9a1c634bc1c88af4b","impliedFormat":99},{"version":"2c8e3d7848994c490cace467a6aae3fc4908e5b577b5ab0996200497062bb80b","impliedFormat":99},{"version":"6db32445cedcfaf6f6a4dbb922cdaf87e1cfc0422e4a31efeebef3fb0eb1a93b","impliedFormat":99},{"version":"b5102cfc507fe0c916a9ad45f4f52e00e3959b90eb90c5873e9527cb37eadb78","impliedFormat":99},{"version":"21e3abbcf80dc69638d138f5c6d07f596f8a162a8dca3bd71286403a96f8d0ab","impliedFormat":99},{"version":"20eab98ea24e9bf8834db1a339abb373e6f6a268537efa1fd571cd3809839eb1","impliedFormat":99},{"version":"796885a2efe76d5bef797516bd3a798b275f81075da8497fc1f6a9d3e085f2a8","impliedFormat":99},{"version":"b5a2192e328273da5a8279add3052bbc33b1adecb15f34a577c69c4dd2766d8e","impliedFormat":99},{"version":"20126c8c53f22550e68edb187f5d4d477b79a2effe7801fff3aa47949219d67b","impliedFormat":99},{"version":"8b63cf9a4a5bafaa3d2e157e6d07bb20d0d73fe0c5ddda715342a48d18534154","impliedFormat":99},{"version":"369dd195a978dcb88d63f1f1878e5dabb90bbc79b3e5fb0f16cf06209ab9e7aa","impliedFormat":99},{"version":"090b7d0fd37b238e003029b9137d5dff073791e21adaac556dd7524ed9ed977e","impliedFormat":99},{"version":"efedab846f4656f034814230fc05513b8cefb5f95994faee4f9b174c98bfef41","impliedFormat":99},{"version":"4f8876f00aa99ae0b39d6bca9da9e86f426dc6c458558773a647100a85fc3312","impliedFormat":99},{"version":"a13e1f68a2a1f29ceac30f51562e13677a5b8615377af952f0b7d1f9edff34f4","impliedFormat":99},{"version":"06f1e24d4146a779e7fd7a0f0cfdcdcb878da25e271e1e7d5d7f81d874f2dbec","impliedFormat":99},{"version":"0a3ede23be099f3ad266a10b4ad0cfb6efd446b9951f553274706348c3b56dae","impliedFormat":99},{"version":"c7b05cafd385f8988babecd476f4f9c817ecc68141dad54e2dd3ae458878a8f4","impliedFormat":99},{"version":"8fc8726fe9d96e0440518b06451181cabba87bdcb60a6e854b77e2b6dab52890","impliedFormat":99},{"version":"6cb381987d43f853d8d01c2fd5f32627e0c0f3a4dd1a11d5e3f94ff5832aff2b","impliedFormat":99},{"version":"ba0567434dbadd0fb8e80c4e00fb9c30449497f8bf07e82b2b857db0029f9b18","impliedFormat":99},{"version":"f72e417b7d49a5dec2d4f3857f6925ee78608cda1c42655d0179ccd38c66c15a","impliedFormat":99},{"version":"fdbb1158637d3ca4d209c7174270e5eb1414b4ee5324e9c33b1fae88e83bfc14","impliedFormat":99},{"version":"436cdc04f8ad3a54d2194b9926f52d564157ca162dcf3c9f71fa4711d057190b","impliedFormat":99},{"version":"73d9180a0b84dfb4c1a95bf72028103bd81472595617dd7ce788ea21639bcee4","impliedFormat":99},{"version":"55c1b951a4d7289a3056e2edea9855671a9d1f8f09632916ed1fb2aebb57b5c6","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"bb9c7998d6def957496260f4c881ccc5b3d4eb4084ab00fbd8abc8c1e1ba67b7","impliedFormat":99},{"version":"340efc3f335a2a3ea2ca1899755906bcb6ebcbddf14306e66d0f16746db98273","impliedFormat":99},{"version":"6a691651e2748bf7792a251d820f00e8d9d3e4da1cdfbea91c33beda2bdd8b89","impliedFormat":99},{"version":"c3096b0c0f579462e17c525ee6835d82952c32b35061a1d32ac32d7e0f191da1","impliedFormat":99},{"version":"91b3c513f0ca4e2d0c5bc9ba1f43b169e1da7c49ff2cf5ffe730009c229f359f","impliedFormat":99},{"version":"ea0b435818ce832634961d1b65e972927f65a3c29a3e2c0cec3aafa0d7fe4ea0","impliedFormat":99},{"version":"50fe63347779cd2244429e0d54148fdb5d230dcc11f2bb8c7efc9d12c1e573d2","impliedFormat":99},{"version":"7adac175e5942f34a34f223d213bdd9869935ec6083dc6da836b996b7acdf7d5","impliedFormat":99},{"version":"2af0e322d1c39e8b16436cd9bd9c97b6013b75c179281df61afa10df0c722a1b","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"0ef3eabd40fcec506413988e397ff7dcbed2aebfe4f88c486e2ba8dd1bc0ee0b","impliedFormat":99},{"version":"44dce86f2b5ef5e38fe6c068bc629afc04221adfa039f0dd649ae10f799f9ec8","impliedFormat":99},{"version":"5ad41356543df4a83b3ce069a7e628d2ba648399db0bdd4005bd1dfef26d34e2","impliedFormat":99},{"version":"0b448474270be29ded59bb946ac311c40c579ef0b9cf358a54750eef34359088","impliedFormat":99},{"version":"d7ddde645d6ca5b97f75923b3946e96495f81d7f4fd568201653f1939a3312a3","impliedFormat":99},{"version":"fb1148873f0d706261f8517b7ce3574b369c8213e8304c7c21cb9ca248b8dcc3","impliedFormat":99},{"version":"0637ec66edeed3f9ee0da72c0d5ab2c128db9e5a6226f8aca5672aa617db1726","impliedFormat":99},{"version":"ee49e1206cf12b67d5b72a98eaab773481130b87a9eeaa262086a4314d1cd991","impliedFormat":99},{"version":"9fa29d6f0b05ee8f619202c07680a46025b166da55e431a49c5badaa2983429b","impliedFormat":99},{"version":"f53857d23110842c0c62416b09caccb9286b3ba52fa2b6bbe254c58123d9bb09","impliedFormat":99},{"version":"89c02b0ad4fc44d10576b3e37c2c5262a37f2db171a486d2d5960ee60323bb96","impliedFormat":99},{"version":"59348badf356a43f7e1847364a8fdb8a914b9977a517b41f3ed206db36b875c1","impliedFormat":99},{"version":"ff0c09d8b0c8c0ffb09ef9250fac17c98eb4dd5a4f4955d53fc3880d6553b91b","impliedFormat":99},{"version":"07146d909fcbc1d33c5fc02f74dab3750d075a4de305a6c078fff8265e089c5e","impliedFormat":99},{"version":"b323496b42ebb7f2839ef1acb04947c74cc586c8ad20cc936c069d34b98a29ac","impliedFormat":99},{"version":"62159930f535b73f265f98f669c7f7bbdaef719ebc2de3a2bc4835e71ed68ba0","impliedFormat":99},{"version":"6ae1d121a8c1ff3398eff8af6e398868b631689d120076d7004c787479eacc61","impliedFormat":99},{"version":"d23bfd5a61fb32048f370f988a9772966651be1380c1a93c199d7cb25b7b0cf0","impliedFormat":99},{"version":"7344e1d823581d72124f6a328669abbeec44910c2045823bf7e7bef79ca49f73","impliedFormat":99},{"version":"af4a6e7559998dac4978f02c572d0f391928b6f40c62459c1e4ae5afc12995c7","impliedFormat":99},{"version":"b0a2a4c5ca7f6f874de72e39be8f470b348ec062c005cb5a7acc840fd7f67807","impliedFormat":99},{"version":"75083e759d8b09bcbf201a250c918a35221d05c7524cbb67b2b4d8959c919252","impliedFormat":99},{"version":"d89f7811a420d990b817f383c3fec421559063a7cb744fae619e8bba20dd151d","impliedFormat":99},{"version":"abd03428933117fdb9db45ac492eaac24d9a77c37c3944d26dba044b7fce6870","impliedFormat":99},{"version":"97050f022128934adae6a773a63be3c5bd5726f153fb72e9a8d34f2656135de2","impliedFormat":99},{"version":"3901f637d5f111593a5ea39a31d27e7a5f62195251f4ed6a50b77a020bc6e416","impliedFormat":99},{"version":"7edffa8d9c968f6a96b6ffc774be07717378ec619777e78510a7b6de4bfe67df","impliedFormat":99},{"version":"8f8d24c887f993b6c131075ac4f82cefbb246747b22c50491dc64ffd2cb340d9","impliedFormat":99},{"version":"5ffb8c07f5474d45bab306b6267ef2777ad786a841e0942416f485125cbd2385","impliedFormat":99},{"version":"e0d7a3cdfaa21621610dc3b74f8ccd59a5cd8617843ded1d610f05bf790adde6","impliedFormat":99},{"version":"b8f4165a3fa8fea167bb5016ad7629581d8fffb16447217d480c8a7ea438ed8d","impliedFormat":99},{"version":"b936b8e4ad57e3be1407c74e36645d31bebe7f1183d926a0c438cf416ec708f5","impliedFormat":99},{"version":"13fc27c27bc9a42e5e0c4cc08b64e7693b225c565bdab45ace16c179760f3cc9","impliedFormat":99},{"version":"8ff87eb5acdf565af022fb9145942b2207ac8cd0644917bc7d44efb91f4115d3","impliedFormat":99},{"version":"616ff480886a32cf50f73c4ee5fdd9672a5f21428eadcac34c41acb06035c214","impliedFormat":99},{"version":"f08e5842644a8e03da9efdbf89bf4eb61ea906a3bbc255bd7d7583756cb3dc61","impliedFormat":99},{"version":"562682efb4f43e58eb779a742f3e26c1fd796da0b785620de601202a38764785","impliedFormat":99},{"version":"264f935450101e4b000eb351cf75c9d799ca20a278b260a9e5770303b5f2b6a3","impliedFormat":99},{"version":"f6f171b23ae6db93454343f1b788960f799c8f37043904874a752c0990c6fca6","impliedFormat":99},{"version":"089f9928e7ab1ca2c225e167a80ff1cb5ed0a71c98be7e81f040a51e2cc6bf5e","impliedFormat":99},{"version":"b11acc27c280988d7256bbd8ffe9f1cb5a0e5ed17cddf5335289ee0e81500369","affectsGlobalScope":true,"impliedFormat":99},{"version":"02ab5dbcaa58da1d58c46c7cdfa7f94792c5ccf0fc7c0622ef33755fe415366c","impliedFormat":99},{"version":"e689cc8cd8a102d31c9d3a7b0db0028594202093c4aca25982b425e8ae744556","impliedFormat":99},{"version":"478e59ac0830a0f6360236632d0d589fb0211183aa1ab82292fbca529c0cce35","impliedFormat":99},{"version":"1b4ed9deaba72d4bc8495bf46db690dbf91040da0cb2401db10bad162732c0e2","impliedFormat":99},{"version":"cf60c9e69392dd40b81c02f9674792e8bc5b2aff91d1b468e3d19da8b18358f8","impliedFormat":99},{"version":"3e94295f73335c9122308a858445d2348949842579ac2bacd30728ab46fe75a7","impliedFormat":99},{"version":"8a778c0e0c2f0d9156ca87ab56556b7fd876a185960d829c7e9ed416d5be5fb4","impliedFormat":99},{"version":"b233a945227880b8100b0fec2a8916339fa061ccc23d2d9db4b4646a6cd9655f","impliedFormat":99},{"version":"54821272a9f633d5e8ec23714ece5559ae9a7acc576197fe255974ddbd9b05d6","impliedFormat":99},{"version":"e08685c946d49f555b523e481f4122b398c4444c55b164e5ac67c3ba878db8d1","impliedFormat":99},{"version":"3c99d5232a3c8b54016e5700502078af50fe917eb9cb4b6d9a75a0a3456fcd5d","impliedFormat":99},{"version":"9d8e34ec610435ee2708595564bbad809eab15c9e3fa01ad3746bbe9015faaed","impliedFormat":99},{"version":"7202a89bea0bdab87cc0ae60912b9e631a48f519b6a1f323dba8bc77a02a3481","impliedFormat":99},{"version":"f865343c121abc3516abf5b888d0c1b7596ec772229d8e4d4d796f89e8c9d0c0","impliedFormat":99},{"version":"77114bdbc7388aeeb188c85ebe27e38b1a6e29bc9fea6e09b7011bbb4d71ec41","impliedFormat":99},{"version":"3df489529e6dfe63250b187f1823a9d6006b86a7e9cac6b338944d5fc008db70","impliedFormat":99},{"version":"fe0d316062384b233b16caee26bf8c66f2efdcedcf497be08ad9bcea24bd2d2c","impliedFormat":99},{"version":"2f5846c85bd28a5e8ce93a6e8b67ad0fd6f5a9f7049c74e9c1f6628a0c10062a","impliedFormat":99},{"version":"7dfb517c06ecb1ca89d0b46444eae16ad53d0054e6ec9d82c38e3fbf381ff698","impliedFormat":99},{"version":"35999449fe3af6c7821c63cad3c41b99526113945c778f56c2ae970b4b35c490","impliedFormat":99},{"version":"1fff68ffb3b4a2bf1b6f7f4793f17d6a94c72ca8d67c1d0ac8a872483d23aaf2","impliedFormat":99},{"version":"6dd231d71a5c28f43983de7d91fb34c2c841b0d79c3be2e6bffeb2836d344f00","impliedFormat":99},{"version":"e6a96ceaa78397df35800bafd1069651832422126206e60e1046c3b15b6e5977","impliedFormat":99},{"version":"035dcab32722ff83675483f2608d21cb1ec7b0428b8dca87139f1b524c7fcdb5","impliedFormat":99},{"version":"605892c358273dffa8178aa455edf675c326c4197993f3d1287b120d09cee23f","impliedFormat":99},{"version":"a1caf633e62346bf432d548a0ae03d9288dc803c033412d52f6c4d065ef13c25","impliedFormat":99},{"version":"774f59be62f64cf91d01f9f84c52d9797a86ef7713ff7fc11c8815512be20d12","impliedFormat":99},{"version":"46fc114448951c7b7d9ed1f2cc314e8b9be05b655792ab39262c144c7398be9f","impliedFormat":99},{"version":"9be0a613d408a84fa06b3d748ca37fd83abf7448c534873633b7a1d473c21f76","impliedFormat":99},{"version":"f447ea732d033408efd829cf135cac4f920c4d2065fa926d7f019bff4e119630","impliedFormat":99},{"version":"09f1e21f95a70af0aa40680aaa7aadd7d97eb0ef3b61effd1810557e07e4f66a","impliedFormat":99},{"version":"a43ec5b51f6b4d3c53971d68d4522ef3d5d0b6727e0673a83a0a5d8c1ced6be2","impliedFormat":99},{"version":"c06578ae45a183ba9d35eee917b48ecfdec19bb43860ffc9947a7ab2145c8748","impliedFormat":99},{"version":"2a9b4fd6e99e31552e6c1861352c0f0f2efd6efb6eacf62aa22375b6df1684b1","impliedFormat":99},{"version":"ad9f4320035ac22a5d7f5346a38c9907d06ec35e28ec87e66768e336bc1b4d69","impliedFormat":99},{"version":"05a090d5fb9dc0b48e001b69dc13beaab56883d016e6c6835dbdaf4027d622d4","impliedFormat":99},{"version":"76edff84d1d0ad9cece05db594ebc8d55d6492c9f9cc211776d64b722f1908e0","impliedFormat":99},{"version":"ec7cef68bcd53fae06eecbf331bb3e7fdfbbf34ed0bbb1fb026811a3cd323cb4","impliedFormat":99},{"version":"36ea0d582c82f48990eea829818e7e84e1dd80c9dc26119803b735beac5ee025","impliedFormat":99},{"version":"9c3f927107fb7e1086611de817b1eb2c728da334812ddab9592580070c3d0754","impliedFormat":99},{"version":"eeae71425f0747a79f45381da8dd823d625a28c22c31dca659d62fcc8be159c2","impliedFormat":99},{"version":"d769fae4e2194e67a946d6c51bb8081cf7bd35688f9505951ad2fd293e570701","impliedFormat":99},{"version":"55ce8d5c56f615ae645811e512ddb9438168c0f70e2d536537f7e83cd6b7b4b0","impliedFormat":99},{"version":"fa1369ff60d8c69c1493e4d99f35f43089f0922531205d4040e540bb99c0af4f","impliedFormat":99},{"version":"a3382dd7ef2186ea109a6ee6850ca95db91293693c23f7294045034e7d4e3acf","impliedFormat":99},{"version":"2b1d213281f3aa615ae6c81397247800891be98deca0b8b2123681d736784374","impliedFormat":99},{"version":"c34e7a89ed828af658c88c87db249b579a61e116bea0c472d058e05a19bf5fa9","impliedFormat":99},{"version":"7ae166eb400af5825d3e89eea5783261627959809308d4e383f3c627f9dad3d8","impliedFormat":99},{"version":"69f64614a16f499e755db4951fcbb9cf6e6b722cc072c469b60d2ea9a7d3efe8","impliedFormat":99},{"version":"75df3b2101fc743f2e9443a99d4d53c462953c497497cce204d55fc1efb091e0","impliedFormat":99},{"version":"7dc0f40059b991a1624098161c88b4650644375cc748f4ac142888eb527e9ccd","impliedFormat":99},{"version":"a601809a87528d651b7e1501837d57bb840f47766f06e695949a85f3e58c6315","impliedFormat":99},{"version":"d64f68c9dbd079ad99ec9bae342e1b303da6ce5eac4160eb1ed2ef225a9e9b23","impliedFormat":99},{"version":"99c738354ecc1dba7f6364ed69b4e32f5b0ad6ec39f05e1ee485e1ee40b958eb","impliedFormat":99},{"version":"8cd2c3f1c7c15af539068573c2c77a35cc3a1c6914535275228b8ef934e93ae4","impliedFormat":99},{"version":"efb3ac710c156d408caa25dafd69ea6352257c4cebe80dba0f7554b9e903919c","impliedFormat":99},{"version":"260244548bc1c69fbb26f0a3bb7a65441ae24bcaee4fe0724cf0279596d97fb4","impliedFormat":99},{"version":"ce230ce8f34f70c65809e3ac64dfea499c5fd2f2e73cd2c6e9c7a2c5856215a8","impliedFormat":99},{"version":"0e154a7f40d689bd52af327dee00e988d659258af43ee822e125620bdd3e5519","impliedFormat":99},{"version":"cca506c38ef84e3f70e1a01b709dc98573044530807a74fe090798a8d4dc71ac","impliedFormat":99},{"version":"160dbb165463d553da188b8269b095a4636a48145b733acda60041de8fa0ae88","impliedFormat":99},{"version":"8b1deebfd2c3507964b3078743c1cb8dbef48e565ded3a5743063c5387dec62f","impliedFormat":99},{"version":"6a77c11718845ff230ac61f823221c09ec9a14e5edd4c9eae34eead3fc47e2c7","impliedFormat":99},{"version":"5a633dd8dcf5e35ee141c70e7c0a58df4f481fb44bce225019c75eed483be9be","impliedFormat":99},{"version":"f3fb008d3231c50435508ec6fd8a9e1fdc04dd75d4e56ec3879b08215da02e2c","impliedFormat":99},{"version":"9e4af21f88f57530eea7c963d5223b21de0ddccfd79550636e7618612cc33224","impliedFormat":99},{"version":"b48dd54bd70b7cf7310c671c2b5d21a4c50e882273787eeea62a430c378b041a","impliedFormat":99},{"version":"1302d4a20b1ce874c8c7c0af30051e28b7105dadaec0aebd45545fd365592f30","impliedFormat":99},{"version":"fd939887989692c614ea38129952e34eeca05802a0633cb5c85f3f3b00ce9dff","impliedFormat":99},{"version":"3040f5b3649c95d0df70ce7e7c3cce1d22549dd04ae05e655a40e54e4c6299de","impliedFormat":99},{"version":"de0bd5d5bd17ba2789f4a448964aba57e269a89d0499a521ccb08531d8892f55","impliedFormat":99},{"version":"921d42c7ec8dbefd1457f09466dadedb5855a71fa2637ad67f82ff1ed3ddc0d0","impliedFormat":99},{"version":"b0750451f8aec5c70df9e582ab794fab08dae83ea81bb96bf0b0976e0a2301ee","impliedFormat":99},{"version":"8ba931de83284a779d0524b6f8d6cf3956755fb41c8c8c41cd32caf464d27f05","impliedFormat":99},{"version":"4305804b3ae68aebb7ef164aabd7345c6b91aada8adda10db0227922b2c16502","impliedFormat":99},{"version":"96ae321ebb4b8dcdb57e9f8f92a3f8ddb50bdf534cf58e774281c7a90b502f66","impliedFormat":99},{"version":"934158ee729064a805c8d37713161fef46bf36aa9f0d0949f2cd665ded9e2444","impliedFormat":99},{"version":"6ef5957bb7e973ea49d2b04d739e8561bca5ae125925948491b3cfbd4bf6a553","impliedFormat":99},{"version":"6a32433315d54a605c4be53bf7248dfd784a051e8626aeb01a4e71294dd2747f","impliedFormat":99},{"version":"9476325d3457bfe059adfee87179a5c7d44ecbeec789ede9cfab8dc7b74c48db","impliedFormat":99},{"version":"4f1c9401c286c6fff7bbf2596feef20f76828c99e3ccb81f23d2bd33e72256aa","impliedFormat":99},{"version":"b711cdd39419677f7ca52dd050364d8f8d00ea781bb3252b19c71bdb7ec5423e","impliedFormat":99},{"version":"ee11e2318448babc4d95f7a31f9241823b0dfc4eada26c71ef6899ea06e6f46b","impliedFormat":99},{"version":"27a270826a46278ad5196a6dfc21cd6f9173481ca91443669199379772a32ae8","impliedFormat":99},{"version":"7c52f16314474cef2117a00f8b427dfa62c00e889e6484817dc4cabb9143ac73","impliedFormat":99},{"version":"6c72a60bb273bb1c9a03e64f161136af2eb8aacc23be0c29c8c3ece0ea75a919","impliedFormat":99},{"version":"6fa96d12a720bbad2c4e2c75ddffa8572ef9af4b00750d119a783e32aede3013","impliedFormat":99},{"version":"00128fe475159552deb7d2f8699974a30f25c848cf36448a20f10f1f29249696","impliedFormat":99},{"version":"e7bd1dc063eced5cd08738a5adbba56028b319b0781a8a4971472abf05b0efb4","impliedFormat":99},{"version":"2a92bdf4acbd620f12a8930f0e0ec70f1f0a90e3d9b90a5b0954aac6c1d2a39c","impliedFormat":99},{"version":"c8d08a1e9d91ad3f7d9c3862b30fa32ba4bc3ca8393adafdeeeb915275887b82","impliedFormat":99},{"version":"c0dd6b325d95454319f13802d291f4945556a3df50cf8eed54dbb6d0ade0de2f","impliedFormat":99},{"version":"0627ae8289f0107f1d8425904bb0daa9955481138ca5ba2f8b57707003c428d5","impliedFormat":99},{"version":"4d8c5cc34355bfb08441f6bc18bf31f416afbfa1c71b7b25255d66d349be7e14","impliedFormat":99},{"version":"b365233eaff00901f4709fa605ae164a8e1d304dc6c39b82f49dda3338bea2b0","impliedFormat":99},{"version":"456da89f7f4e0f3dc82afc7918090f550a8af51c72a3cfb9887cf7783d09a266","impliedFormat":99},{"version":"d9a2dcc08e20a9cf3cc56cd6e796611247a0e69aa51254811ec2eed5b63e4ba5","impliedFormat":99},{"version":"44abf5b087f6500ab9280da1e51a2682b985f110134488696ac5f84ae6be566c","impliedFormat":99},{"version":"ced7ef0f2429676d335307ad64116cd2cc727bb0ce29a070bb2992e675a8991e","impliedFormat":99},{"version":"0b73db1447d976759731255d45c5a6feff3d59b7856a1c4da057ab8ccf46dc84","impliedFormat":99},{"version":"3fc6f405e56a678370e4feb7a38afd909f77eb2e26fe153cdaea0fb3c42fbbee","impliedFormat":99},{"version":"2762ed7b9ceb45268b0a8023fd96f02df88f5eb2ad56851cbb3da110fd35fdb5","impliedFormat":99},{"version":"9c20802909ca00f79936c66d8315a5f7f2355d343359a1e51b521ec7a8cfa8bf","impliedFormat":99},{"version":"31ddfdf751c96959c458220cd417454b260ff5e88f66dddc33236343156eb22c","impliedFormat":99},{"version":"ec0339cf070b4dedf708aaed26b8da900a86b3396b30a4777afcd76e69462448","impliedFormat":99},{"version":"067eed0758f3e99f0b1cfe5e3948aa371cbb0f48a26db8c911772e50a9cc9283","impliedFormat":99},{"version":"7dfb9316cfbf2124903d9bc3721d6c19afbf5109dfbc2017ca8ae758f85178ab","impliedFormat":99},{"version":"919a7135fa54057cf42c8cd52165bf938baeb6df316b438bbf4d97f3174ff532","impliedFormat":99},{"version":"4a2957dfe878c8b49acb18299dfba2f72b8bf7a265b793916c0479b3d636b23b","impliedFormat":99},{"version":"fad6a11a73a787168630bf5276f8e8525ab56f897a6a0bf0d3795550201e9df5","impliedFormat":99},{"version":"0cc8d34354ec904617af9f1d569c29b90915634c06d61e7e74b74de26c9379d2","impliedFormat":99},{"version":"529b225f4de49eed08f5a8e5c0b3030699980a8ea130298ff9dfa385a99c2a76","impliedFormat":99},{"version":"77bb50ea87284de10139d000837e5cce037405ac2b699707e3f8766454a8c884","impliedFormat":99},{"version":"95c33ceea3574b974d7a2007fed54992c16b68472b25b426336ef9813e2e96e8","impliedFormat":99},{"version":"1ecb3c690b1bfdc8ea6aaa565415802e5c9012ec616a1d9fb6a2dbd15de7b9dc","impliedFormat":99},{"version":"57fc10e689d39484d5ae38b7fc5632c173d2d9f6f90196fc6a81d6087187ed03","impliedFormat":99},{"version":"f1fb180503fecd5b10428a872f284cc6de52053d4f81f53f7ec2df1c9760d0c0","impliedFormat":99},{"version":"d30d4de63fc781a5b9d8431a4b217cd8ca866d6dc7959c2ce8b7561d57a7213f","impliedFormat":99},{"version":"765896b848b82522a72b7f1837342f613d7c7d46e24752344e790d1f5b02810b","impliedFormat":99},{"version":"ee032efc2dd5c686680f097a676b8031726396a7a2083a4b0b0499b0d32a2aea","impliedFormat":99},{"version":"b76c65680c3160e6b92f5f32bc2e35bca72fedb854195126b26144fd191cd696","impliedFormat":99},{"version":"13e9a215593478bd90e44c1a494caf3c2079c426d5ad8023928261bfc4271c72","impliedFormat":99},{"version":"3e27476a10a715506f9bb196c9c8699a8fe952199233c5af428d801fdda56761","impliedFormat":99},{"version":"dbb9ad48b056876e59a7da5e1552c730b7fa27d59fcd5bf27fd7decc9d823bb8","impliedFormat":99},{"version":"4bd72a99a4273c273201ca6d1e4c77415d10aa24274089b7246d3d0e0084ca06","impliedFormat":99},{"version":"7ae03c4abb0c2d04f81d193895241b40355ae605ec16132c1f339c69552627c1","impliedFormat":99},{"version":"650eddf2807994621e8ca331a29cc5d4a093f5f7ff2f588c3bb7016d3fe4ae6a","impliedFormat":99},{"version":"615834ad3e9e9fe6505d8f657e1de837404a7366e35127fcb20e93e9a0fb1370","impliedFormat":99},{"version":"c3661daba5576b4255a3b157e46884151319d8a270ec37ca8f353c3546b12e9b","impliedFormat":99},{"version":"de4abffb7f7ba4fffbd5986f1fe1d9c73339793e9ac8175176f0d70d4e2c26d2","impliedFormat":99},{"version":"211513b39f80376a8428623bb4d11a8f7ef9cd5aa9adce243200698b84ce4dfb","impliedFormat":99},{"version":"9e8d2591367f2773368f9803f62273eb44ef34dd7dfdaa62ff2f671f30ee1165","impliedFormat":99},{"version":"0f3cef820a473cd90e8c4bdf43be376c7becfda2847174320add08d6a04b5e6e","impliedFormat":99},{"version":"20eed68bc1619806d1a8c501163873b760514b04fcf6a7d185c5595ff5baef65","impliedFormat":99},{"version":"620ef28641765cc6701be0d10d537b61868e6f54c9db153ae64d28187b51dbc0","impliedFormat":99},{"version":"341c8114357c0ec0b17a2a1a99aecbfc6bc0393df49ea6a66193d1e7a691b437","impliedFormat":99},{"version":"b01fe782d4c8efc30ab8f55fae1328898ad88a3b2362ba4daac2059bd30ef903","impliedFormat":99},{"version":"f8e8b33983efa33e28e045b68347341fc77f64821b7aabaac456d17b1781e5f4","impliedFormat":99},{"version":"8d3e416906fb559b9e4ad8b4c4a5f54aeadeb48702e4d0367ffba27483a2e822","impliedFormat":99},{"version":"47db572e8e1c12a37c9ac6bd7e3c88b38e169e3d7fd58cb8fb4a978651e3b121","impliedFormat":99},{"version":"a83a8785713569da150cded8e22c8c14b98b8802eb56167db5734157e23ee804","impliedFormat":99},{"version":"cce1c8b93d1e5ed8dcbaca2c4d346abb34da5c14fa51a1c2e5f93a31c214d8e9","impliedFormat":99},{"version":"213a867daad9eba39f37f264e72e7f2faa0bda9095837de58ab276046d61d97c","impliedFormat":99},{"version":"e1c2ba2ca44e3977d3a79d529940706cef16c9fdd9fd9cad836022643edff84f","impliedFormat":99},{"version":"d63bfe03c3113d5e5b6fcef0bed9cd905e391d523a222caa6d537e767f4e0127","impliedFormat":99},{"version":"4f0a99cb58b887865ae5eed873a34f24032b9a8d390aa27c11982e82f0560b0f","impliedFormat":99},{"version":"3c8a75636dc5639ebd8b0d9b27e5f99cdbc4e52df7f8144bc30e530a90310bbe","impliedFormat":99},{"version":"831ec85d8b9ce9460069612cb8ac6c1407ce45ccaa610a8ae53fe6398f4c1ffd","impliedFormat":99},{"version":"84a15a4f985193d563288b201cb1297f3b2e69cf24042e3f47ad14894bd38e74","impliedFormat":99},{"version":"ea9357f6a359e393d26d83d46f709bc9932a59da732e2c59ea0a46c7db70a8d2","impliedFormat":99},{"version":"2b26c09c593fea6a92facd6475954d4fba0bcc62fe7862849f0cc6073d2c6916","impliedFormat":99},{"version":"b56425afeb034738f443847132bcdec0653b89091e5ea836707338175e5cf014","impliedFormat":99},{"version":"7b3019addc0fd289ab1d174d00854502642f26bec1ae4dadd10ca04db0803a30","impliedFormat":99},{"version":"77883003a85bcfe75dc97d4bd07bd68f8603853d5aad11614c1c57a1204aaf03","impliedFormat":99},{"version":"a69755456ad2d38956b1e54b824556195497fbbb438052c9da5cce5a763a9148","impliedFormat":99},{"version":"c4ea7a4734875037bb04c39e9d9a34701b37784b2e83549b340c01e1851e9fca","impliedFormat":99},{"version":"bba563452954b858d18cc5de0aa8a343b70d58ec0369788b2ffd4c97aa8a8bd1","impliedFormat":99},{"version":"48dd38c566f454246dd0a335309bce001ab25a46be2b44b1988f580d576ae3b5","impliedFormat":99},{"version":"0362f8eccf01deee1ada6f9d899cf83e935970431d6b204a0a450b8a425f8143","impliedFormat":99},{"version":"942c02023b0411836b6d404fc290583309df4c50c0c3a5771051be8ecd832e8d","impliedFormat":99},{"version":"181655e54e8b288d671457be112383e6c51502cff5c4e39020c89f281a987307","impliedFormat":99},{"version":"27d7f5784622ac15e5f56c5d0be9aeefe069ed4855e36cc399c12f31818c40d4","impliedFormat":99},{"version":"0e5e37c5ee7966a03954ddcfc7b11c3faed715ee714a7d7b3f6aaf64173c9ac7","impliedFormat":99},{"version":"adcfd9aaf644eca652b521a4ebac738636c38e28826845dcd2e0dac2130ef539","impliedFormat":99},{"version":"fecc64892b1779fb8ee2f78682f7b4a981a10ed19868108d772bd5807c7fec4f","impliedFormat":99},{"version":"a68eb05fb9bfda476d616b68c2c37776e71cba95406d193b91e71a3369f2bbe7","impliedFormat":99},{"version":"0adf5fa16fe3c677bb0923bde787b4e7e1eb23bcc7b83f89d48d65a6eb563699","impliedFormat":99},{"version":"bf4a06264e6b80cc96fa5e6f11b05825126845563efbf5a68a5b18fddee833b1","impliedFormat":99},{"version":"560a6b3a1e8401fe5e947676dabca8bb337fa115dfd292e96a86f3561274a56d","impliedFormat":99},{"version":"b2e451d7958fb4e559df8470e78cbabd17bcebdf694c3ac05440b00ae685aadb","impliedFormat":1},{"version":"435b214f224e0bd2daa15376b7663fd6f5cb0e2bb3a4042672d6396686f7967b","impliedFormat":99},{"version":"5ac787a4a245d99203a12f93f1004db507735a7f3f16f3bc41d21997ccf54256","impliedFormat":99},{"version":"767a9d1487a4a83e6dbe19a56310706b92a77dc0e6c400aa288f48891c8af8d3","impliedFormat":99},{"version":"198f2246a78930833c24db9c42da7ab40c084c2e2132a899f9c03dcbe59d207d","impliedFormat":99},{"version":"eb07eea29499b56357f7593fbdbc6d2312d8afc32c14396952db8d897ea0c4c2","impliedFormat":99},{"version":"06efe54b5ceaa113fbc649424419746efde6dcd5af2a7d4472efb62d751801b3","impliedFormat":99},{"version":"39613fd5250b0e6b48f03d2c994f0135c55d64060c6a0486ecfd6344d4a90a7f","impliedFormat":99},{"version":"8dfbc0d30d20c17f8a9a4487ca14ca8fab6b7d6e0432378ba50cc689d4c07a73","impliedFormat":99},{"version":"4b91040a9b0a06d098defafb39f7e6794789d39c6be0cfd95d73dd3635ca7961","impliedFormat":99},{"version":"66b67d15116c453abd384a1ec73ad2cb90b19fff4c08289360c4f3f573465838","impliedFormat":99},{"version":"5805f6ee9c3a5369ba7f37a809e226f0b217d2059d6f699cc242c9907671143f","impliedFormat":99},{"version":"2f0578c52f2b95a2a2187ad6d1d8fa4e835278871c81747c500bf04bbe0301a2","impliedFormat":99},{"version":"ee9811c1b947c37077408d66bf61ca0f7e6ffad850ecec1e246e643c51fbb5e3","impliedFormat":99},{"version":"4e919bdf4100bc0338598352ad2778d4750fb0d5facbd1bc7c5210340a1f756d","impliedFormat":99},{"version":"4b54813a405270d710da2c598f57cc0c512aad7b5f34f8d2e109862020568a58","impliedFormat":99},{"version":"ac29a9fe4dc4829c7f3f693c7667483f9903ead6ac67abf8d6a5744a5578a7a4","impliedFormat":99},{"version":"5429b7f938113b40fa315e0f100220a5801992497bc3eb05e3b395055033a93c","impliedFormat":99},{"version":"aac828f821e824489c3f10a5452e05b7abc084894dcf6cef1855fe44c88d8556","impliedFormat":99},{"version":"9dda93662ba9cc072a048ed9717df4869820cdc84ebd33db3db6e1ef354f521a","impliedFormat":99},{"version":"a769f4df15ce86d72fdc646ef33bf9ad634e2d7f544399ca030b61d61c781942","impliedFormat":99},{"version":"e1848b9ea5d00c149eae78db2141cb099cd5cd0573064c03f24fada82b2a0d94","impliedFormat":99},{"version":"535dc92c4a20901f7dad384f1fd2b19735bb33720fad67283f4c2b06c4735777","impliedFormat":99},{"version":"695dbe57a9f1686b727ff8112def7376b69da4a9f92a6b4660cfc7adfeb4fd57","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"5fd2267cea69c19286f0e90a9ba78c0e19c3782ab2580bfc2f5678c5326fb78a","impliedFormat":1},{"version":"2a628d887712c299dd78731d2e18e5d456ac03fb258b8e39f61b2478b02481ee","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"e9f80c5934982b97886eadab6684c073344a588d1758b12fba2d0184e6f450a2","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"a822bb869dd9dfdb4b1b5c887b90373d5a1e900191772646b6211541a5ea13b8","impliedFormat":99},{"version":"ba56cf294acda8f40e97bdf8f102617b57c914664476e1f900db307ad0e8c3f2","impliedFormat":99},{"version":"92be2c8229c02b140324d56906af58882ffd87ead115a34380580e9dedea4a18","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"69b3e0b9435c37d191bce1a4d38c8d18e8add8cb99835eab8f566b95ad9de828","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"9382e32237e08424b2642d1d9ea4af3a76001cef48888273f769af0c95cf169b","impliedFormat":99},{"version":"45a95142d20916e8510b2d4c42b09aaa3d8ca3d0c3dbd7f915da870ad182380c","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"827f0158dcf51b4afd0bf7867d30ac9436535fb4422b891a16b88799f9caa6e8","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"6e477dd31a5483cbab13f1f907b29474b33a5140dd4e8672a7ebe00aa27984cf","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"513d0b8895a905e579ed2baebdc817a23dae16e78ecd925400e3142a8096f33e","impliedFormat":99},{"version":"d8ef707d006fdf8e64a9ea3673c4748374cac72d794b632dd6868e7973de3b55","impliedFormat":99},{"version":"780807f8c8cdf68e8d646043b476ab5e2b4fa0f0f87dffe2007db40a770f6d50","signature":"4f16316542ebec0c73702c5e557352876951dfdf2c6606438a834f52161e65d3"},{"version":"1559f7dcafbe461f88574162b5c133c7443a2543088e50842348ccc11049dfaf","signature":"06bbc177243a23ceb55b80f721a5a660a2dae89e715b0c73e097c783fab95014"},{"version":"7688bba0d1cce772a26874fb87ad985fa2a488ab711b789563919194aa33b4da","signature":"0ceb4ef84ef078e260af63215f7878d2086590ac443fe35a3d510f1c8f792bdf"},"2778747ec5f0fa749a66df42831ea70270ab3a17a94f1313e01905b794f92a47",{"version":"4a8f3f92baec87162d727caa562595aa6a14d9c126f62283bd5b17fe594d6a2d","signature":"0ef67e19a4d054ed8e3344bef6d4fd32de744aa050ec30c6bedd4c8a0c626abf"},{"version":"d3bb8603a9ce30438913b8acb12952915acb82bf8bcc2af304f4a858f36887ad","signature":"905c8ddd1e91d1aa7e87b85b84a088cf739678c6b2b87cf6e467fb3291bb9402"},{"version":"c7db7712217e9d79ce5f0993f6664ff5f61bf2b5990c93c8d1a09de51fbcc361","signature":"763a24b877bb2330e819e4dddfa3752624b8f472a594b61544a0b9a603f45e2a"},{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"7d2c1ce36b9370a3af266ca6c663fe62e82671f9cf41337bda0efd837a5e2de9","impliedFormat":1},{"version":"6e45f5dd809aca05301c8e1b9f526096fe89b3369da10fe34f9c037832f103a9","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"cba87731af3b8e51151ab6b3ba2d9604739649cf132885dff49836d5369ae387","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"108fd0cab464e528dfa511d982368df2c9d9964e1e66f8921ef40accce9dfcf7","impliedFormat":1},{"version":"8d48c98fca3f013fd2872810d7168a9c405c4037962637aaa0a094571e731757","impliedFormat":1},{"version":"9898a7c6ed78c9656079244ea2318282f42ffd1cb5d4aa5753decaa7f3eaafa2","impliedFormat":1},{"version":"9b84cea77bbf5cac5c4714a341f2233f2c81f9f4473c26b0c11c159a8598abb9","signature":"8e4ef7f11e844396ec1dab547d5236a02a5e49fbb1ec65016537ff5676df17be"},{"version":"de5c24590448a0399aa7cf3057217387b277f4664c602028531ed60758394287","signature":"be1d725124dee573983a99a43e377dbbd1818698ab81d1ac83bf63b92b4e3d46"},{"version":"95ccade4cb1378910811207172141620038bee6a72e0aac8703203a4fa9ee2b1","signature":"eadfbe13ba9a2b836bc92ac706dd8818ded7bedfb6dda133cb00a6bf31fac519"},{"version":"28b3666039f660adb329975264b4e2ceeffa0dd061155e72da33d773f0e57c30","signature":"ea2db494593e46f26782a2d3331a279039a91f0cf48aa8a26b1dbedf4a7f5e4c"},{"version":"4f5239569ea92e174986b8cc746afb6d3bd469d9f87d28119997c7ed207c36ed","signature":"7cf2986b54b4761dd3255ee59a0d0f98c1af8a8d563ae217afeac4195e0dfaf7"},{"version":"b4f89206c8e318e5e65294ae7925a52a5bc13508809c5c699d7ebfa14e0509eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d51500cee65d776a8591b72c1019b0dada25d6f7ea39685130ccedad2e8b1eff","impliedFormat":1},{"version":"e733b8a7d2ecce20916d95d75a0c7cdfff7e8371879006902d77969da1550d65","impliedFormat":1},{"version":"d9d5884c0b7a87c6b0b319474eac7987f915f7460a04012d54689c14c800d69c","impliedFormat":1},{"version":"42739f43f21108aaa8b2e9d1246c537c88fc193694d5c3660b49ab5ed87bec60","impliedFormat":1},{"version":"8c4c212cbe640024a5076e006d5ed48c6856bf3a79880c52d0fe453495b84e7d","impliedFormat":1},{"version":"8dbd432facc1bfd211d58bbbf86a405dd55cdf04d6425037171282ae5e1bd5ae","impliedFormat":1},{"version":"bd0ae662720de3f141b078c64de498113fb13faec0c1cbec62f1630f7b8954a3","impliedFormat":1},{"version":"517fee0f998ca443a8eedaed7ad143753cd7ed6c9fc97a62200c09b21ea661d7","impliedFormat":1},{"version":"e94e5a0936bba407a0d0b7846ff8a7960667f09040b575b5035bc30298510781","impliedFormat":1},{"version":"f6a3229a9d452117bfc85b50e955b836c8c91b1244dd8d3413c2824333022982","impliedFormat":1},{"version":"f7a32e6a301921e58c28b8cb944134cd447d4db8b5b85d0e614abc90a333080c","impliedFormat":1},{"version":"28732171a9e5a176e9d8b9bb417b32dc885591bc2642232389a44167bc5ec581","impliedFormat":1},{"version":"90ebe8ddee75b7e87baf030d45d49e13a91dea47fa4cd8494ac85e5ea35779c8","impliedFormat":1},{"version":"6ec1d690b2213c008b55d31778e6c4f13141487fe26749ee6a0b4c2b6f84f9c9","impliedFormat":1},{"version":"43ae0b1b0a836f113aa973b1a4d114e2867fd320125e43a80805d9a80ab07c4b","impliedFormat":1},{"version":"1b6d1aeb6a58db9a9702623d7edaa31eda44cb33fe66f349f6156b20db8b6211","impliedFormat":1},{"version":"5ee542acb0e360c539bcf027de4389536fdaae8653e47b33eb0445ba85bf223a","impliedFormat":1},{"version":"8a0a53613cfa756a769e4514632acac0e17d80631af21a888daa46ac01ccdd1d","impliedFormat":1},{"version":"e7f9e4cf51627c95fdddff062c58c6b1c4e22d1868acbf3e7e663ee95e3790b8","impliedFormat":1},{"version":"449d082b398ad2a53c5def35397b752d61c968a2acacffb935d564b5ff3aa19c","impliedFormat":1},{"version":"1a3aa0fb5f9a2dc05a33faa6246f85ecc52c8af7a5257d8639e724a12ebc92bf","impliedFormat":1},{"version":"6480e9b0877e389c96e3b89c43fb2e4d84bb6ae8cea22f8ea2bf30ac4a4c4136","impliedFormat":1},{"version":"9cd1a75410c01f48f43befd40b47a7d2d42565b5593d5cf02b7472b04a1d98c8","impliedFormat":1},{"version":"d0144e7240c7f26030468a13211194d192316099ebbcee7782c6005cc393c734","impliedFormat":1},{"version":"095a402135de9fbfda29ba7c984bf54b9e65757396b4165706d898e9baa83ed5","impliedFormat":99},{"version":"0b6471168629b8a0cbac9f8f67bbbba83a1d64cf1424cd7d299439b3af88129a","impliedFormat":99},{"version":"3e0fa3b04086663fd406499ea37f0714b0d7cbc296eb81e244f2bf0ba4938bb2","impliedFormat":99},{"version":"3d11abe325e68a5b76d9f53ecc0b4ea29685ccbd8690b279f2177e0750d87f8c","impliedFormat":99},{"version":"f1952d24cb1344241341230924197977764249edcde80605e96454f073ebb35a","impliedFormat":99},{"version":"3b5b37b56d81802168c5b8df2f1d4a7ee018d67e7463f221d49b6ea20af00060","impliedFormat":99},{"version":"f3a6db8faeb959400a4d0e1100b9d5c54eb494800e6dc9a2452bb2e00a27397c","impliedFormat":99},{"version":"d278699a1c7e06a195ecc065c4965d1bbfb5bc2d67176e63bebf58b273158023","impliedFormat":99},{"version":"261ffd2f7502d9387324715c7dcb9f3a30c8d044b6dc3abc7ff80737c366476c","impliedFormat":99},{"version":"28729ff7b2ea98a9ba6ca4490c5540be744a4d73b4199ff6094cb65c9db33607","impliedFormat":99},{"version":"6ac889647435812fb7ced7035daf90c1f307710056e4b496a3fd5cb97c87daed","impliedFormat":99},{"version":"29f60d17027d6bc8891797f6ed95ac84ee42313e6b03ddb49beff6f22f49f8c6","impliedFormat":99},{"version":"f71579228be8825267577e970c8f0ee2869cebae0bb7603b00644fec924c6717","impliedFormat":99},{"version":"e50f096cb424b63343ad5814622623f15cf3830f41710376bebb3c7f71554713","impliedFormat":99},{"version":"69ebae4354b59ff1ba38419d6033e22d0db6ffe6c1d562e78914f88f06ec517f","impliedFormat":99},{"version":"45f0aee62dc187cbde99b10987e1f8649a30bba8bf9c95957e37d1551d0626da","impliedFormat":99},{"version":"919b048385b82efca27e5adec2f61f17a2b219582f2deb8a13b4648c7c8fafbf","impliedFormat":99},{"version":"47747eabb3c64620a12f707bf30c7f7a211e25754a2da1f98267068f49bd0947","impliedFormat":99},{"version":"2dc1bcd6a132924a89f965b60edd5b5333aaa7eb28ba5af44a0a0a328756e9ad","impliedFormat":1},{"version":"ad117b97b2eb65daeeabf0adb13573a8f1d12d5ce21c312eb7eb588106b92560","impliedFormat":1},{"version":"683f7d52795b5e2c0a269c4a202f212d147eee850b6d74050af619cea7638605","impliedFormat":1},{"version":"bf338c88f9e91b1700029f806a2d8bb447f19d3e39fa57dbba16ce8bf43902c2","impliedFormat":1},{"version":"d3c9c7df6fe4c7905f73578af2542e2f303da2b0565abb10ccf8a75626da1bb5","impliedFormat":1},{"version":"a16c041923053317f99708de244e50f0c563de0ee22313739810b67cec8af89a","impliedFormat":1},{"version":"b64880a77efc0fba08ee595d277a52e7abbdef2dde51a163376f03d6d3a67c7a","impliedFormat":1},{"version":"817d7ba9b41a1f3f7d15e8c1067bc32ce0044aab0ba05e2794294ed25959cdf7","impliedFormat":1},{"version":"6e6d52eece8b335d10a436ca59f91cbf0727f9f2ac0521a0b0ffc32da2006948","impliedFormat":1},{"version":"98e70d3105aa56ac3e2a34a78f10c6d352ff9e3148b1bc2bb11c1787f0176d26","impliedFormat":1},{"version":"144ffc9e0632f167247b8ebc6c12b690555b27930cb2d92edceea7df51e54bbe","impliedFormat":1},{"version":"cb6b2bd587f4d8b0299840be7cedf422fb895d3c7f6cbd8c18c041518ba82fee","impliedFormat":1},{"version":"849b51d422f1a846684da755840ffe68f65701b7b7703ea9622847df65dfb2cb","impliedFormat":1},{"version":"3b17eebfd6fea2320c3d3ab55e26bee41e6745fe51432da7901e898249a8c186","impliedFormat":1},{"version":"5d9c054ecd5fad83e0ec5e117196acdcd4b1cc5b8d28f5df752a416c27052aa2","impliedFormat":1},{"version":"949c8eb79434b05b6d1c10d2010216fbd6c920ee376d08627f717d24b6572454","impliedFormat":1},{"version":"25495d26470692e2591e386c1dbffe4aa0b2d8c00af6ac9c8c69657818262dd5","impliedFormat":1},{"version":"abee0197420ed0849c7adbff50fc13f54ccb52f9a8c906e298c28321bf736cd9","impliedFormat":1},{"version":"3af7286265437a7488193d0ab0b56a6e20e1a5e08831a6c3fe0880212c2c6c75","impliedFormat":1},{"version":"d7eadcb936edf325912a70d1c4874c29b92463ba1eecdb302858763db6a68692","impliedFormat":1},{"version":"04fe6e4f5bd35c234cd04ea88ada66b718aec4b3edf611147b0ec9ea216b3cd7","impliedFormat":1},{"version":"7aa826d09dcfa85af6b2cfeeb6a7f340d417968632695fa8eacf4186fb71e8ac","impliedFormat":1},{"version":"ebbf2bf006f21fc203f1a555ff0fdcd8542d1546d7cab60aa835ff5902db0d2d","impliedFormat":1},{"version":"12aaf4e3c85225c710acd6a9f41532bf8e06bf180e54c1bedc60fa9b9c1a7d23","impliedFormat":1},{"version":"7814f653054116409bc9a36968b77c878c2013ef8d8873328e8f6fcd3348d8d9","impliedFormat":1},{"version":"ff4ade9606d1b3fe1a10bdf6ab944e1bb1d5ac86035228ddd3ecb5fbe51d4d47","impliedFormat":99},{"version":"608ffc65e122c3eeeff832a9007ecc00fe71bf1b03a3069a44e8c565ee8af368","impliedFormat":99},{"version":"40b54b241bc79a986a5ac364f7f11c60af8c68ac8d45c80501ed31af7e587a74","impliedFormat":1},{"version":"0d1a503605c35a53f49ff2b6506704b289bc33d9001d2244044c91fc82315c8a","impliedFormat":1},{"version":"96d1d70759af66ea4404f7c18130ef478e5052de8863e2bf4467cfbc2fc7176a","impliedFormat":1},{"version":"d0476ddaacf1b8b9b18aa7cdb54eb8bc7edb69165a455803e2065fc28a321960","impliedFormat":1},{"version":"9332e2b6255fd361167671093522351ad5e2d0e3a78d9bf8f0959d779f6d3246","impliedFormat":1},{"version":"5be2e2b5ca39c4fc74b0273674a3e7705088513872fa3de1e4f75357a507a988","impliedFormat":1},{"version":"fc8bef71b44a15c1c6afe97e2ce74c7beb10d0a3c45d19dca5b9d53cf81cc744","impliedFormat":1},{"version":"41dd7695c5e11ca31e40bb8d9a2edc9c2b3e262d1007fc7471ecb91516874d98","impliedFormat":1},{"version":"262efb4650083ac514f3119534d502211d0270140057698e7d4978caaf4b6f97","impliedFormat":1},{"version":"b5e98f1f4e64ace252ae743df592ff0187aac817efaf58cd97c63e243fe15951","impliedFormat":1},{"version":"151f53de4563905919248ae634d857276a8491e62416b6f2cccbfebfe6794a72","impliedFormat":1},{"version":"83e392127f71627fce9a8e0ce30fd22c043db537c93d8731101b138c38fbea04","signature":"b18f85c7c3b4572e27d008df363a8a478673a34b2643af924408500defd13eff"},{"version":"59d65621a16b1bff32e7a8b07fc677b0cceab8d73c5ebbc0f23a405d5fe63686","signature":"afb3c335573313cccc5129cf7d65a34280b70ab837ca01adf5749f147d36a2b0"},"b2ef51f383a2363e3d66d715c0f9bb84249becf53629f26486d418c8cb6b5aa3",{"version":"752f6b591f1efbb939af28c2e5c33ed607dd554df8711c0a469fb9dc0b59c5f5","signature":"2bc07b301241975bcbac4d5d79029c4ef22487fcba1b2e17fd5291c9ff75f899"},{"version":"a6e0b5559a7189298206415308a4a1f1bd13b5f5ed91da861cee12cab2f641f4","signature":"b85afdfada5cd23d82b75470d0a07c77e28b3d12f5c3f85a560e0ab55d49bbfa"},{"version":"1b4dda36948afd6a509a29f86633a7a538a79211aae9e3e09fe24d3d6dc65a97","signature":"67ba6fe95c932da75b57cffc54d7a789939fc278feb0357272efe2ff87b999e2"},{"version":"1036b4ff3d86ef2764256afd871b34a8546244586f00a93646aed983167dcd22","signature":"73c54888d278429c71c1a3fb2cc4a04e6329ffdd314ad247fda1bc568fad32e4"},{"version":"181dab36aef859f6e4aa54e1b0e755866866228cbbe5455522779dcc99648dc4","signature":"328225c19eb7e55d60128f4732ecb4393caf9c2e9362d3b2f5b73daa0cd4b14f"},{"version":"b2e1f4d7e311fcbd8998f5a631ea9c77601967f8976c4ca626a1b05ebf3efaa7","signature":"d9a9d70a217deda30251a4fd497ef29604c7169134c6358b7f72f749c50129fc"},{"version":"31bcdb1016481b1fff0668d003946e34ce93fd86e80777c56026d7d1987305c0","signature":"0ddbcfeefd42e0db9bfa750c4088677fc903d4e246f7ec9d517a0abc1c4f302c"},{"version":"ca28e21dec32859f280a5efcc5392c626582d4017c0b36a8265c9ff581b3617c","signature":"31cbd413f24383fe9ba24aea48e827a2b6299680c89b4775912883b30a1c615f"},{"version":"246d7397668a7ddf2858967263ed8aeaee0e7ba4f0ec063d639aeffbab6ed81a","signature":"be201d5e21bafa57bfe609e7ba8268e25415e086a3171120b57515ced376cc83"},{"version":"d1726a0ddc24aea9e851a8ce56684a29f58aaa37a41d7f3840cbdba69043db99","signature":"ac529d5c8704e7b6039d0f13282335ae6c9073a1d58c9f80ce3476ee07da2f80"},{"version":"3eb40afdc378b50a96a2ae67116adbd1c163600481f7d182d46e5a3bf3a8cc25","signature":"bf164b6233447badd8a6dcd799adeeb613f85e0b21bffea907d4cd12b2787613"},{"version":"3c3c17f0acbd71abbd94c109027b0c0274a6bc9aee0fabe5b9d48463ea69d87b","signature":"cc20f52fd4785722688412244fc078f326b981d25a0dc5c88408ffe4ce821a2a"},{"version":"296273d01ad5a060d70f600fa110abc2545b9bc707fcdbeeecc85c4e9cda7509","signature":"6495a8c6a32e2cdbd564621ea29851da9282bf492488d1a315e573265ee1159d"},{"version":"1ff3822feead679faad5ae04acc6b7a08df0c44e3077e45566b2c4df19df28c3","signature":"5a0a01691ec73195f56d4106b854cd9dc0c77e5a8b062d6a80dcb51969dd2761"},{"version":"3a02674c3a48813e03c2fd5ae7fd6307fb6c5bd772065a5cf7ce56633d284a35","signature":"36f3bc973c0536dbbc4836bba1b4b26a1aef52391bb2ce206e05d9b0a6f83bec"},{"version":"e3ee5daefb9a226bf3097abcf3b628db556ccebd9641a7ee0609547d98c851db","signature":"36f3bc973c0536dbbc4836bba1b4b26a1aef52391bb2ce206e05d9b0a6f83bec"},{"version":"203ac3e8a0db9e5eb975c9cbbe5905c7fcc0b1907c4c1e13ae1eb2899ab00055","signature":"36f3bc973c0536dbbc4836bba1b4b26a1aef52391bb2ce206e05d9b0a6f83bec"},{"version":"48d88d2c46c6da424c84808ff7b0df53b716cfee2b8cdead2f491602cfa76796","signature":"93c35385913c1c8762d04f6fcde1b39978173061cf194cf37d4eaa4d86ff9447"},{"version":"f2391323b20c3ff6cdc785f9d7e6ec7d515843857f4f2edf4470f4899b91cc5e","signature":"de67cbd5a7c02252a3cd23f87c49b9539aca2d737f26d1a5140f23cb0f5a71d6"},{"version":"f973ea7a19526aa0096d2799105e6d65030be2dc9baf5497c67a1e8355530f50","signature":"9327f268ce4afe27d071f199c21275c2098e5d190981ce3639107e97beb526e6"},{"version":"e4890347e9bcae005176bdde5d04078511f7f0102f856b1ae9d6467622895fca","signature":"78412e9f82f609e0f9b50cfc92378eb42d10aadfe9c29c9f011d74de21e1a2a3"},{"version":"b59e268333810a6ed4d17e2b490ece89d2db6cef01236b84526bb8248be2aac9","signature":"d05b78897e269664ac949de0b4d9d8d514b7084679a26bfb340d04f24036631a"},{"version":"a2fd6350ef2a8ab815957ccdeaa328e0ca6bffbd2b82c6c1fa1b319b0b883a2c","signature":"94fcd5e1694e5bc5e9955010905fa7100a2baa06268b4c13487e1d669df224de"},{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"26168183003371ceac063f0cdf62be889d0515a193444a99b176094565dabb0a","impliedFormat":1},{"version":"7fc99221160c51281d2b9095552be2b24b600b3b6fe305cfd068bf501f623ef2","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"747f48fa4633d85211b7e6afefcbba37b7adf816b171a569105db23ce6009286","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"c1eb69b3ec8f1080980c25c8244c4ba093af729f4dac451758e69026b20c50a7","impliedFormat":1},{"version":"f67870591872110fd6a97ec0d933972f21ccf433bfb9d8ed1f044740958c4e43","impliedFormat":1},{"version":"a849f7a91ecba56e6ecacc20a383a825aa6cf5b2842e75a3fa9348f06d71295e","signature":"123038618600a62541709eeab9660a35f5d74ef00a05c6a97e85f561f6eea0a2"},{"version":"858794e17e92e99c7257ce08c98ad806be9123f7c1fea852f2f899a0508aece7","signature":"5e830f1bd5b1920dbf7cb2524fa1ddc2a0bd7a309f4c253f6d1f1a7ea41cfb52"},{"version":"a28e6fadb0b6e7a95cfcd29366f2b72a8e3193270d3f2b673e1876edf0159c7b","impliedFormat":99},{"version":"5494ffbcdd6e45046d78e3001b4da0b472dcaf9e6681d1bf84e99c0b206a9861","signature":"286abc56d85f06a05eec8a1529f862e68c99845d1fc209c1db82949361a42382"},{"version":"837c40e7e259b78104bdda5a8fd589b19a753fb7f77c8c316baad18bce444fba","signature":"d017418eeb84dad9542caf56a02bbc676cdd1efc28b95eefd9109cf79386f2c7"},{"version":"9891b4e49d435c7ac14fb3cc769e97077bbd946100c952df08eda117c3b5b68d","impliedFormat":99},{"version":"9be0dc6f4c5ebff5d838dc0d059f25e5a6ab1d224d5adc7ef46887ce8549e897","impliedFormat":99},{"version":"32aa20fd978847e617304582657723f0dcd1809de9b087ed0ad5b7090b1a47c1","impliedFormat":99},{"version":"1f37db92ea78f4d197a201f80a3c52ce6e2b759b19d3a1e9de5aab0c9026fe3f","impliedFormat":99},{"version":"c07898a85c15b3b636506443e88fe6d85bbd568c0bb504a9ae5cb371d58f6319","impliedFormat":99},{"version":"2d45f7ff55036e74513af142af1f414924ad337cc00e612bb37bb55473c70b30","impliedFormat":99},{"version":"3a6b10911970b0588c5a287642e4c6be91c16b96407a499c6dc81a96daf1085a","impliedFormat":99},{"version":"795d467a57e3a7c4aa3d645fa2edae9a2d0d44dde435bd1b222ab533da6fce44","impliedFormat":99},{"version":"bfc5aa7977557874fcbe1e96f7a06e46b3b568b955c82b74a85cc8f6c62060a5","impliedFormat":99},{"version":"f20bb3ae0de20cd6a4b73155cb506bae39e904b7e5ea4f618f5bda7b3ae474fc","impliedFormat":99},{"version":"44c5d9f47e85552ea141ddc1b0af65903297624f0ff2227372d5ce31ff0380c6","impliedFormat":99},{"version":"8790b28796d1f491f3268564d782ebe2879829ead0c10d9aab60c2e9d3588d6f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c0a4aac782cdc312e796608b467bd8fe8c8202b0fdbce29eb83d1f439f2a09cc","impliedFormat":1},{"version":"c7a397d655099caf70ef4b64ba4fb3c672d810d7c1e46fda7f1ae500131ec248","impliedFormat":1},{"version":"cbe4de475b5492a3fc5443dc2c75c08d054f83d459c06d4e1a82722223fd0fcd","impliedFormat":1},{"version":"45ea1eb14968f6bc1c7a77cffc1a5f762a7069668732cd2bd5cf143d96a10d88","signature":"e5e1c6216d62f457ef69e1ed96429f8efd86a38b212ba4a5eb98e1e73d732855"},{"version":"a896cee6bbf43009c05e9ee4b0cfb1147ae49a4ffc2d814c6d7465806d76fe72","impliedFormat":99},{"version":"6bd987ccf12886137d96b81e48f65a7a6fa940085753c4e212c91f51555f13e5","impliedFormat":1},{"version":"a9b4d5ebf62da6decff3d9ba91a354f1f84e4b672160bfe672219d719a6c9735","signature":"f1191ab09b35a7f58e249ea6e95f8ea3da01f49e19d545ffcb3d042f8719dbfa"},{"version":"e6be08931c776916434a0240aea01e097d7c8ab0278ca22c535f9564d99755c7","signature":"3c8a0ea4bd3239f6eb1e8156e4d938e462caf35b41506d66e43e7c8c870de0aa"},{"version":"3bf7074d9fe7a42890f98df09734c059560bee1acd58eeeb45ef749c6590ea72","signature":"16a788b1980c11f82d60a66f8b463cb929e8f84ee1caee0bde6909965f043c46"},{"version":"2f9ac707504adc40be90c966bf6941ca32749c9cff11269ceb74ebce549998fc","signature":"3666c9442e889778feaafa6e18daf18c2cf7008d6f74bf98355613389cf73ccb"},{"version":"760b600c4664aa4cbff56d74e9b168e77d62eb11637f9df97ed4898e6fd0bc7d","signature":"16a788b1980c11f82d60a66f8b463cb929e8f84ee1caee0bde6909965f043c46"},{"version":"2ecea95b433caa7cb7693c720f23e62f076b13c5e46ba8c6bc5ac4a597c2c09b","signature":"eb6ea5c92365b1a69c6326c48cf2cb2d06f922bde4efaaf36053d8d6d2516ce9"},{"version":"4b248dbaf94ed07ca827344205498cd6a199486ca4ed481c6823ce4a2a58f101","signature":"99bda55390689990f1929654a21c7ae72b3d5a745c01d4d07d56b9de620e3bea"},{"version":"204f71fd5637e5eaf2acabf1ba5a674077eb97e5920f67ddb43bab804b3bfdb5","signature":"c6aea2acaed7df5ee9a9e31e8a4d055f9d409d1c730571833a4c580f66befcfb"},{"version":"1c190c54c58a41ed84b31f88cf7737ffddb2449fa474b154dcf5fb5684667c0c","signature":"6aa83915c053dd02210cc975820738ad28468c46ae300915cab3d5d99c44b835"},{"version":"113d200d8709d86af1e1c17057bc2a59faa494d31fe3aba5d3e472a11196cd66","signature":"c3608f8ed7d19e09dc67a10b45509768befe050838343d5ae39b60f97edf679f"},{"version":"e5179def8be76cf5e1e4045132bb5bc23bd5bbca339ce159fdcb6a6eced7acf9","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"cfc919572f1ed08c7f16b22096d3dead757f805e00e1eab0f8d2f2e6a454aa76","signature":"adb85e9733a81adb297d425caed0eea00d13a000fa634b14594fef8edd9ec024"},{"version":"93fa6d6206af8ef1708c47eacc1e3315561f7df227c30dcdf22613de15d8dcb8","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"fdb2f04ac4847fba15176be0465a64b67ae3d16140a62d472516f0024fe576b4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"5e074078d297d407f935b084436a66161fe67af6150e64356457a64830a48926","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"fb78e606dc1da5d66f1d47782c50f29f5f1fb73938572cdc5df442ee3528fb1c","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"de98eeddf3ed100c9fc5146dbb11932f0234b74b1c8dae05f64dcb766bd2b1b8","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"648e905763c70a88cdeb815bd4a162250027c2bbd4c17e5f831f0f12c273798e","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"0f3e97babf73961349e942e4c41f7419163afe93e043ab7cd304cbd492e0f39a","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"ef5f13cf96aeddd3100b42f791205e602f551c2106eadbab7a72fc8fec1ee543","signature":"246abdc7457c79ba330703be8a21c32783cc2f8412e16790e607d78116368dd5"},{"version":"d1ce233383060afc1db856828610052df70105dff680d55eea0c9a7f82d39bc5","signature":"648d858af8388a3331b43dafcdeecc53d42fd1e332cfef77e989c10d1f3c4ee0"},{"version":"36953fe9fee3721c62cfafe0b87327d606205da9d2f2a3e41abdc9c3ddba7d54","signature":"7a81656b588a584936c64722c6f279d1ab98178f8ab1ebc2537a070053c32f85"},{"version":"df884a193d2e819aa76f4e57a6c0ef72612663d1e9b37a1de0027c8c11fbf216","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3d4cef432d7e96fa18c66c90a6161fc79e3982ac09c6dccb5a1c237b81320591","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"f34d529d782257ccc87df267226d63b6ebfc985cd5af510a9d4ee3ae8bd14cca","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"05086b2bdd1ee47459168c8f63a2daa5742ce31567dad416da219f936b4bdfeb","signature":"b745a48386544d018b478c58273869028973eea6f481c8f08040a6d9b670445c"},{"version":"8f72bdd08e7a4c15c7cb3baa6ad7972bb0daef797dc3dda0f2d2122a93a5c786","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"908a50708098d91ea15a6ad201583246a6ae804572fab4d6096a8ce2bd84801d","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"f6b4a321f86474cb40c946d6de4cd8c861e983fc266d6a9edad68ffc526da908","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"35823beef0e23c5e19c2398d9f602d8fe2a3156e4163e62acfdf7d2d0950e48f","signature":"62e73377511c1daa3d75a644531745ec773c5c9573adc465458788978b863c1f"},{"version":"e2a2b24f612af140c8d6b59baa23af4df49a95d319d046086bb1e24d1deffa32","signature":"e719f7e10acba456eee9f963078b98be2e4d2d5a331e6835d45bb826d2a0ff07"},{"version":"b2634ebe505bd7463a3e751f6a27e37074bddaf44fef83514faccb664ac76a13","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3463099173871b687dd02764d17d631e92cc63e7cbddd3e8eaa21fd927988901","signature":"72024a6c9c8b87e090b9d9a1a6e2322235a7de726859a5ce8401c5069a87465b"},{"version":"f798a2b88c55e96dab7d93ca4597fd3a7a6963c5f38114bfdddac05ee084264c","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"c82b628a7676ad99c15ae7b32bb6e70f8effc59ff56ea5044b7d573c280cf5ce","signature":"77ea860fed466f552a479dd8e9a4914c75eb3d3eaba2e59903d01fe5c7a4871f"},{"version":"664fd6bf7cbf4e641f172c6877b41dbc500e606ae01f3917300264ed5f0f55ce","signature":"72024a6c9c8b87e090b9d9a1a6e2322235a7de726859a5ce8401c5069a87465b"},{"version":"837678e6e5a58f269855ec23e6a2dc16ad61daa89be3793696a550e4ff62739a","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"a0ead136f7e2ff0de9c31f2bee24dc00988f7789f32a5a648bd365656a9da740","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"c4bf9ae7d77fbc75fbd333d92e8b5927b33063b64d8a526ee3fae74cd1cc6482","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"cda56df36d3c1eed4aa985131088cc86268e77fa310c8c939171c2c841e4fbec","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"44a6f397bc1c98e8b94b8ebe54516bfbc940f8c78ba44d9fa8491e4e64211a4d","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"433a718101638b14bd7d628d853940bf49c9e73fd649f6bed45d38b08c1a33d8","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"cb016c547dad6d346d42eec7bccdf8180233466c0b6a3d1b802a6fa14c69533c","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"7b433aaf72fe38be0c239f9090c8e211352b376ce169567fd935ff31395f9f49","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"bf9daf2670c8b49fe9e7435d48b1a74215cdfb8a01e2c0d6bbe46d83abf9f31c","signature":"8f97c6882f0e15e9e14e3804ad71e97b55513f84ed8128c972141c4753032515"},{"version":"69b15103a5bd95b62c4f7c4dc23e1b516766a206f38c8a132bbb70e07c79439b","signature":"5cc986d834f48532220bbe48b3b481b811c0befe8bbb13e3b472751c01ca16d7"},{"version":"ec685be78af113fc87ec6998f7ea72d31b6250440bc1763c6279f8b33ff40ae6","signature":"cc20f52fd4785722688412244fc078f326b981d25a0dc5c88408ffe4ce821a2a"},{"version":"16401c0faac33cfc2b628a1cbcc1664559e1c4bb3a085a8538142bb28f8f0e7e","signature":"999025c61786b8a7131d5fdc6f5d1084a5b2c32e6a56b45cb9f5a1a91525821b"},{"version":"e8da0541d9cc6e6dbf7b8be36c653a109c40310de8d3054e56f55a1609bb119f","signature":"bde0e60f6853caa976fdd8ff4f5ac0e12708ee1e053f978a1f773da1810a952c"},{"version":"f8c32fd18a406cd29fa0ccf06d887ed0c19d5162ef2a3d3129c1dab3ef553ced","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"abab797abf6b9380a2083d4b164baa04570735d7faf51b5164064cd6e93694f3","signature":"57fbd1e904cc52393bd2c01e95fe6e8feb7094c17652c1afd0773f66e47974ef"},{"version":"d72b48d15417b240c392315dcf497a2beca0c1fdc09d155a3727659a6916fadb","signature":"23164e2a6cf12e9352cd4ff965e2e8b90303c88fce5e481b084ad9925ff7aa2e"},{"version":"e29318092a9d32cd2b0164102cb746052331b6d7f855f457ca11c0385339b11e","signature":"c860db1ca2adb2b534449887235ff11dd99f6d96310b14ce7c2c783aa952c6c7"},{"version":"25ebca34c1077f3a29919061e3ac807c17c0fdddc9050b1b8d2bde585c827866","signature":"649672eb2fd0c222897718632f63d8e147c04f17d2bf2ab946f03780aa6a42a7"},{"version":"519ffd06ea1dac7802692b811edec2a93b18700f7c940ce65de3bb2235702a1d","signature":"c762ba51cc0654ba2e0ef3b4888d705b776eda3754df83a224aaf338cfbbf154"},{"version":"2ee58ec4f3f11c32edd3499867198be5f4ad7022f8480369067687547f7ef75b","signature":"a9f21db081a63636acac58c38771c7b5ec230524eda57cbe0ec9a676d4fc4a20"},{"version":"e8da0541d9cc6e6dbf7b8be36c653a109c40310de8d3054e56f55a1609bb119f","signature":"3e2c4249f48f721fe1889f66ea1f1a713715cb2756db4e1963f16a9b03cb7559"},{"version":"af123751fef26c39cb168362d699b48c419c8c8ad7ec5503c90f6bbce554b467","signature":"237d645cc5dee7c6604c86dc4f6b41b0129d9ef8d097102be2203681e1d3883b"},{"version":"ed36faa2344c5c40ad5794972657f29d487b68fe0662145a5093a3cd018e15b3","signature":"9acd65d19f983b23aa6b660cf01f5ad3641702941efd356b74b4f945e824c15c"},{"version":"ac9b3c53465714855f732448dc69f0dc56fb108dbe8c2e3e92c723e2a78db039","signature":"4f2b19841ce35b47477f08400e0d4969aca8c4f966a0bab3b6ae97d3d90a333d"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"fad16cea5b71686272ec5af39f801f8f74acc2d54177afed6a9b8520d83a3d39"},{"version":"d7804b8341e5a42c044455c766b13098e3e3e03ae11b2ad9b3f3806bcbab3b29","signature":"f5b9ed448c08a0146b530fa29beeb19d77c43c97a868bd967cc27220c230aec4"},{"version":"3b6704a38e51fc05dbe9ea78361e0d31bffbe4a602edf08563593b75556f8040","signature":"6fd3513ec99ec1dafc8182018390cee48c18389a964f6a601b29c808581c76cc"},{"version":"0a714f89f0a6189d342941717d0ff3a0fb57dcab179216fd59f5017c00cbe46e","signature":"a8dd8cf09660c6e6734dde4d379bb97f6c4252f41b4de1090f081031bf77a3cf"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"e9c0ceea90fabffa3a39929fc71440a51118f5ce6a0fd321f61c60e2f7b57e0e"},{"version":"373a74a89570f59c6a418b5e7f31ba11ad1ff0546e36c1bce4cc14bd0c45ee3f","signature":"87b32b3608f4ce02d7131b8d18ac99f3cce429b1ff01818ed0a36a6098ce4c6e"},{"version":"eba3e941058c78550eb515df949f97ea94df504d0f5665783994605e4bc59c96","signature":"6a15015acd7ce2322799675a317b5975d4df6bafe575c154e223c77bed3bae05"},{"version":"1d1ff9197037131b99ffc2c4c5dbbaf1868985b02c5f97196723663c9042ecd1","signature":"14a246541298979d6a1bd283ca52a82edbc7c2ff62612b9e95b24d0695997fa7"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"45fff50bbd279e787194a942f2a709f0ce3139f7c82f45b1241ce372079dfdba"},{"version":"74dd0f04dc885d4d6e8d93023de5585ff3f3514eb45cc8d7208e8d35864c4102","signature":"f8afe038abe81568f469130daca472fb7be83adf7b1f212af6c88ee505bccb25"},{"version":"7843ad58cd87b4f05b763ee2529d5033b4976ce382035ad56940e5421333a881","signature":"b519c0accf9ead969dae1e68bc6fbdc40ee09a620964533abbaec0a79e06bb2f"},{"version":"bf3d8eb0bc84896bd718e16ffd3242ab613b5038ccc6911138a9f176d009f3ba","signature":"6fa00514166a47945e40552cc4a86bf02f9dbadd3824152aa06aa9c1f33bfc6d"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"6e21f50714ec4372056112508f15a2049126d5c872baefbfaccd85238a8f73e0"},{"version":"5cbc2158ab882ffc7cee918a4615273b034bddff06981b2ea0159985a2bfc0e8","signature":"ed6c0ac5972abd08c597a4a8a2963e6d38e5360805a87dc49c40cd247ec3e6a8"},{"version":"e32875bed8e71e5d0f768f568cef2b369ec6fa377e8d6c2bd7c16d159c446e3e","signature":"ccbef7021cf0157a58d8543544b3e9e36e3afc7f7c06c1fe7eafec7efb8956e5"},{"version":"d48b15b88a44803dff86441a47c28527ec6776ff5f9f5174925416ebd48d7243","signature":"58163bc26fa81bdcf6a6bad2a6d11049785658384837d550d1225f135052eca6"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"221730b70b436f8a68f4a78a03bde90ba8ed5c8a91fd408e8c1c82c2f22690c3"},{"version":"fb2d94450ecefa5d5aafdddbaead3be7851f60ee640ca767fd157420de107031","signature":"d7600e24f1163ddf2ee8b67a7ac3bf5db91e0fb1ddf4227c16cd8695d659d18f"},{"version":"2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","signature":"1e990012e7983cd5c76c27cbdeba4ef362909be4e033b36559a929622d6ea876"},{"version":"72f66686356db0a28a50ef2cdc8f3090fd19b8af99a38e694a784890bbf2fc46","signature":"1e990012e7983cd5c76c27cbdeba4ef362909be4e033b36559a929622d6ea876"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"29e640a8e8957ebd0c0ae74ea9874b2f08f5e68006a13b3690bd3e6db835f71e"},{"version":"c974216dd887bd740070ab6149cdf1d229681128db0e3b3e63c5831b6e5a297b","signature":"4a606c7174f9aa1917ef2c5e793b0da7913e237d30fe916e3f5c53c740d32feb"},{"version":"e420e515c767af879783c06b721ed56b8def324c94986c3c68dd298a242c0109","signature":"5df5c65bb934ed5b54d8827291645e680f842973c8718bee32c4a94069e103a6"},{"version":"04bc9e2aa8ba0e24cd1ac0412e04f7eda620e79c2568c7d7a563a1d6469cf3d6","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"4f8935d2036180f8bf36f7cda2a2b8d65f669678984870f2eaa46f5e91e02072"},{"version":"9cbbeadba97307031520e54afe9d97adb96f07978b5b9355af803b4f0fd9fa14","signature":"b8c097878eb0f2b1eabf3ce4aad35d2ecd87b1e48f1de4a713fe8e010fe3f6e5"},{"version":"a5296dc92dd530b36527e0b9e0d8d64098387d58fbfd9b75bc615173710bfb22","signature":"c2daa10009be33ffffe9b0b9aa8a4973ec288a5508e3e924ecc68f3f1a05aa73"},{"version":"50af9f05c8c14400e2e654db0de71b8a3dcbe9a056f7f59b98f355a9c77a7c56","signature":"0e3b4b6a658192d99cbde1673f9bcbb9e8acec3b6d1a0e2049e935efce7a6698"},{"version":"6a63d80e2bcbeb94b2bfc8e8785798c52241197c48907df714a5bbbfc546ab7d","signature":"d7600e24f1163ddf2ee8b67a7ac3bf5db91e0fb1ddf4227c16cd8695d659d18f"},{"version":"2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","signature":"1e990012e7983cd5c76c27cbdeba4ef362909be4e033b36559a929622d6ea876"},{"version":"f3568b78c51c0eaa6208e18a24d5f932db096214a4a047e16e2952fa6aac3e20","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"1a30a17de988f329704a45867761357a3e56b3b5949dba8de01e280351f0acbd"},{"version":"f023f56bf192bb8d3a10e656cdd365d0ac9d36024dc91dee1dc8886a5927420c","signature":"87b32b3608f4ce02d7131b8d18ac99f3cce429b1ff01818ed0a36a6098ce4c6e"},{"version":"abdfa3e09d37d63db9d2f4a01578c283cf3ef67af44b69f0f171b2fffb70654b","signature":"b574065749da1636587e6430d566a105c7cb60b7bf24429a2a53b39e947b2cca"},{"version":"61a9872e2f7a0aa6b4a21f036bd1202257c4a3ac248c8cbdab3d7ab5e8c24530","signature":"af4a0ec7d4c0f310dcdd93709ee541b44c11d9ffee14107f20d0c86ee36ad929"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"f8a55ad542413f671f230b4023f54b9a60edc10e67272719fbc227882062b5a9"},{"version":"fbb5158d60ac1917beb99b62f514d9781276677987ed0112d7240b64bc88468b","signature":"d7600e24f1163ddf2ee8b67a7ac3bf5db91e0fb1ddf4227c16cd8695d659d18f"},{"version":"2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","signature":"1e990012e7983cd5c76c27cbdeba4ef362909be4e033b36559a929622d6ea876"},{"version":"11e43cb7483636b4b594e4c695ff2eeea74c83518e8bc4acc8874a0395c97c48","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","signature":"1a30a17de988f329704a45867761357a3e56b3b5949dba8de01e280351f0acbd"},{"version":"6ba4e40c79a235f49c43533e0c3ecc39b5f3e5c94d3e6a340aef1c1948c8cca4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"e7fae19caafb8b41e2ce6705a725f30baddaa2523137595a50f4098a00250353","signature":"3f4885b5af073c13b6f31f2c3abb2d0b47dde6c107f4e2da6effc79083e70039"},{"version":"6c1971b1ef9a8b843015e680052166e122c0fbe49a3cf8ffb357dbac6ef0f6ce","signature":"11d72634b38e2e7d9ab8a4f52662010376e50830ad852857d16ffbedd8a3b496"},{"version":"6d0015106f628b262842e5206987321769071c2cadf3cb99bd142db2e75aabb5","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"409bd5c7699db706e9b176afcda3f03a7ec0fc85257544d7184ed887e15fbacb","signature":"949c48021ab0f8d5ed14241b0fe797efd5414ca86567ccb53c5ac37f995c886f"},{"version":"36418dd9b4281991aa6b096f123a77bb4bb9b8d6564427813980b561fc056140","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"52abfe012e6f3751811a6a95c31656f073d7cba4c614b693d6dd661f743dd538","signature":"f48e7d217c19d6b0bb9dae45d1e703472caebdc4b06da9b3d7a760df9501e705"},{"version":"9cecd2093208086c1486c2765418e4aa090620a0d6ff193c5a537c81387eebf6","signature":"0061326d558f5e423506681cc75ed85ef13f87835d59d28b5a614742d70485a1"},{"version":"bb409549eff0557c51f60fd5ba3409560ec39f06800cd9e2a29de22a02d89712","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3b802579ce8e09cb8fe1e9b9be6b73df3c37b7a951666caf650203cb0e9bb209","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"8daa5329562a959761c1c35e995dda6367b904bc631939db199f5b9fc2419137","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"0e3995e174ad08a98e91c411249d15e2b6aed4cf3b1438b39dd84f3bacde83c3","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3ac37ece13e9bab69da5166baa4272affdc771469c7d28271e6c47e07f48ab4c","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"91106a5b9be3398e71729f182a13432bf7ce9e0554527015e4e818dda2c3e9bb","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"32695b2ac8527912097a5205f2564dde19cd7343de9a3f78b43a489add053d96","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"f180cdcbfd6c52fab93742caadb7b16d871fe925d8bd49f1e23fcaaa26c85387","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"32aaeb25b9b7e9c067c1ab26e99dd48f8cad3945b3f5eff231cbe6860c6b7a50","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"f8592a4dc96fd879fa0dccbb7498b66d489e06c767aad8f25ec7f7b16698be19","signature":"8809ef47fb1e5eaa7e8fa880eb2c8e71228837300b0abb5a72f6e09607104ff9"},{"version":"b060c231e45cf2b6d8f689b31e8b09823d2b0976b9105124b9ef4da433f56528","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"975f705d11ed080e67656c39ea3b134921cad73a6dc6c921a7dce72b82739a81","signature":"23cf424f9c2dd36f0b5575186f4573df15a9a7c1abde3d5fa2d73907ec6a7eda"},{"version":"285031dded391571dc4cf9e3be1bb1bf15b3771b5fa237ac0365e012816c4c67","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"777e70b20f712c12efa1725c0a96eda237733bf2fc020dfd98f31dee2b670c5b","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"8175b911625c67a01cf345e7dc0a03517191a85c5dbdc9ef6306241551dbffcd","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"450cbfba9e6e5eb96accb26c6c75a31d0f018a6eda0dd9a407778123ba045eaf","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"2a6c5a33ac04e9578bab2495d168f2482c78037a144a1d18c09ab55aad797b4e","signature":"db392d1edfbe6b0b50d944078441d1e4a6d4b357b5fde0374d2fe4314fbf107d"},{"version":"f33bb080cac8ff5d2f4a5cf60ef91706f236254ae0b868008bea767c74f5a7b4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"76908abefb913859b0d5aa6a55e0ea01270a21ad02399bec95e9df092902b124","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"d20cbef7830eb4e327bf0e3693940ed8fc53bdf3e7166a90ff60b7fcd2acdee0","signature":"adb85e9733a81adb297d425caed0eea00d13a000fa634b14594fef8edd9ec024"},{"version":"9f310cf1cfb1c765fda6e6e5768aa6c7fca1243b994a5ca997759181590981ec","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"54fb69757912848ef5be2332c7e6a520d2cb8eeddf07ca128a0497f5c43b9363","signature":"adb85e9733a81adb297d425caed0eea00d13a000fa634b14594fef8edd9ec024"},{"version":"bd25366208b91d6bafe0041c1d58443c247a68710d8a614f47f565b7798f45dc","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"61b9c114b3e0787363a01a0213e46d8d0c779136e9f0aeedf4046074c6fbbf87","signature":"72024a6c9c8b87e090b9d9a1a6e2322235a7de726859a5ce8401c5069a87465b"},{"version":"b2c76981efbe8b4fb6b88e7e0d451a9ac3498cea786689d4a0cfcc1aceb0ba1d","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9cad936e014102ec314530df983168a713d6661eade3cc9b2e8aacfd0d18d6ee","signature":"adb85e9733a81adb297d425caed0eea00d13a000fa634b14594fef8edd9ec024"},{"version":"2d95a52272da8ca2ec37da0ad7ddd089227e97dca9e9e0464b2d2be43fa572d9","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"67f4ad1ade1c7c1a1b177a84332b36b3d604e9a39d8a7fd8e3b7706bc278ea06","signature":"8d17e7a5580833d7a6d06a30c68066228d888a3e38c5ac7310d7493f0ebeec5c"},{"version":"34b41d4b5cc0c4a094eb51817fb0c53173f3fd59c3aa2e4aff42b53aa1a59476","signature":"84b26f043ed3e3e46891bef539d14172bfadc6a15844874441bdc6cfe7d7df08"},{"version":"cf9d9ca32be2070a00ff82e9a4d576e1ae315999e526b95285e6c8382d979f41","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"bd6a585ecb6eb73fc29256c6ef8b100e4bb47e28aeb38473f820a7b63e4da52b","signature":"eddbdaebfe55dc4350cad03706a187450c1464774370f154f73d4d12a6312ea8"},{"version":"0bfed83ae9c9c74bbb020467548eaf51afe75cb72eba1cc83ba45049b34e2607","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9b2884a3729baeeb3708ff8a6edc53378713cbac697fa061035618cdc8845a95","signature":"eddbdaebfe55dc4350cad03706a187450c1464774370f154f73d4d12a6312ea8"},{"version":"da1ebb8a528155c78e9b278daaab1bb609fff3e8c6477add4bdb698b015358f6","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"2207ee1ef5d66c035d9245dbd0e1f09da53e13151252e1ad4892beb4301726ee","signature":"ce8fc2a222a0ca3b1aa6270c8428973e225f827b85cb099d8590a8727143c17d"},{"version":"28469d0d6d7825f55da5a0daa6fff57b5b5be551ffd119352992632a13f69ab9","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"a952c96a93b87fd33fb519f48d4ff50d30edbdff005e6c488453d837f528714a","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"d455a31c1e8b57a791b325d376a985b79aabf9bd954f8b974909e087408cd3db","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"4ba2afb0338a9116a5e7fb0c22af19098a4c7261a0555cd8fd05c93ae0cba2f2","signature":"db392d1edfbe6b0b50d944078441d1e4a6d4b357b5fde0374d2fe4314fbf107d"},{"version":"e23076b177e7f44d35c37c9645fa286efb8e155e298aeffd555bcbec9dd148c4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"af2c52be7b6ea33fc0a9cc62e9e1709b4a6c3d82522c08f58df28e2ca82680ce","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"0c285f87cd0f498d364b27cc2ff54a36fdee9091a0f13a00e587313341415cc4","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9e1f168fc16f07964cced00315dc5127d4de5ac744b698eac660af137418495d","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"0b5b656d443c1e8fdff0d18a6337712ce51101d869f841523abfdca018f3d65b","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"f002d86a49dfd48d8b6eb7f8c817e201f0d8bc95329c7d379914c8d66b047f32","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"5fe8cba90fd05514a212949ccf3023eb89815d3623eee04dac3556258ef9267c","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"b2b02f2f2c6dcfe8f71590005cafcaa6d6b80bcf0771c0f004c6e4d7b5b84402","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"5c00a2bcc6e3c6fd241864a4673644e13b975d46959b6653f489c493e2a66562","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"8e08ad059dc1d5c4b0c6ca3f40bf5820ed51a9af0ab5519f9c1d800a2968619f","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"d948ec6d0b9107601583e3ae3af2359519e0c2f1da78905154e1877c6ca4770f","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"bc0f0db364583c7cfeeed5a28499fbdbf691035183dfc39859fc31e689d1db21","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"19726a169a4000cba269c284b97043faa0593de45865c43553c233f6825af0fb","impliedFormat":1},{"version":"21028948cfdb733523ceea3681a998c1f6dfd148484d3f92c4fd853119479135","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"365c25418c596a0ce608713cf26954f79c3a772b894a33bb92553092626a7c89","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"4982aa30c44f2e60ead9dbb4cf161061ec0111b0fd5c382e1b7aadf07695bdd0","signature":"875a5a4e27b5ec4596044f4ed2c66ae9d9167b33a7955dfd0f8638e685eefaf0"},{"version":"5144645ae774a6e01de125a35dfbf23fc59c648560a64d017718d7ba41fcc7eb","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"3312f7d9eb01483f9e392733e461f06755fdc624b5f2318e01f686a6a036ed7b","impliedFormat":1},{"version":"34491a67ae33c8bdacec1f4c07008f01d2ebe588ed8b7b1bd8f940f5fe953f2a","impliedFormat":1},{"version":"cc0e6f2705c8fd9eb831790840c08be6a3d3108d7c7043c4a1c0a97e3e9e289e","impliedFormat":1},{"version":"273928f388427cb6d6859c6b29d760de7612a110f8a50afe092d3a6440ed0cd3","impliedFormat":1},{"version":"54db43f6a831781a4587d81802277a9686bf34680c586fc0496e32088f2d8942","impliedFormat":1},{"version":"0f53259dab3f0531bfefb89211d4be171821c855980a843b396e9dcf06ab23a3","impliedFormat":1},{"version":"b1b1faeb576467d84ffaab5942f6bd5a024bb715dae28aaeeb22b37cc0f17030","impliedFormat":1},{"version":"a7380d88b8153951784d10b663b949986aa02c238d7aba129d378bc8f0bd2900","impliedFormat":1},{"version":"2110f6c3b26b0d0af8f4d0d7bf8fe89cafbe2a200cc2187db2e446c57628b67f","impliedFormat":1},{"version":"b2d0ca3686d89f74053a1d0d90e8088b9d48869c9814db2cce4554585c83094a","impliedFormat":1},{"version":"6491db94d895853640fd0c6814aa5decc2458a6085193abbd7a83a0a65736a30","impliedFormat":1},{"version":"ce8cd3fcda8947836cb52af1f9a5958fb9cea1ed5eb53466227a82c079ba5622","impliedFormat":1},{"version":"5a081b7e2596e450b5bbcd5c5556806b85bf2c0bdb6b7fbcd640dfa6339a0bb3","impliedFormat":1},{"version":"aac73aa91eb81c430a982c274181ae5768c1c631dd659e603a7070b0310d9d40","impliedFormat":1},{"version":"20c7945340b58e982aa79db5a549b5c33ef2dd8dd8c5c71d29c308be0a9ebaee","signature":"d5c7f7111fb2de4e422bf75540909f55a0a8db04fcc388dc245078ae8b93dfb4"},{"version":"65bc9af861d2b7b7eef963dd5f77f3f93b4b70e40bd09d3dcc481efc9cd9e3ff","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"27e71a2bc50062a65a09c235470415f30daf22f50a725e4cb1f483fc3f3caf1e","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"12ef08f711049716cb22a4f1e77a331f49b640134d9c19289690addacd83d766","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"5d5a30193ac10062960d2679da9e34adbe589aad7c4c80bb2e5380d7cdeb105d","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"84e4a43313428b2723f1316caa759144c5e2601784416c51d31ab4e77bcc25fb","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"aed983a78fb2aa231cf118edc699b9cbe731b3c4e3f2023b829d196a24b621d7","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"493607ce396819ce844d8aa37267a4e2d41ab8fea4b15b6f2568a3aade4c7b45","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"eb7dc1aecc02de71340df9fe20e6d7ac37cdae03756892a872bc4a8b43a11f29","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"6418aa13b4f8bdfcd2635cfa609c7e598063ac2d7de516aac055fe13123d4967","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"9a330e8a3bc218cbfe22f7fa109c16b21c0b08af272d85c6c3fee2100b49d9c0","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},{"version":"d7a967e4306c0ef742975cfc121736a576d45685db57e0544d16e2d7636cd0e3","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},"6bedf07a7ec7f488b8d5c650ae4c232a274ef9e52651ae1193137189ec9ef247",{"version":"1b8e4993b0a8abdc8e98f9c11fe535f583dce84039b8402e6afab966c3f84501","affectsGlobalScope":true},{"version":"7c3f548ca157e70e5a54055ac71977acb07fc5e7b69e2041d3387b144fafa9cb","affectsGlobalScope":true},"360938ae1ab9ddfffe8fee6efe46572956c7e900adefb11d4c9995874def011c",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"bf6402a3cfff440801c3ea5835f08784aac18087016534b48741adbcee931921","impliedFormat":1},{"version":"71b110829b8f5e7653352a132544ece2b9a10e93ba1c77453187673bd46f13ee","impliedFormat":1},{"version":"7c0ace9de3109ecdd8ad808dd40a052b82681786c66bb0bff6d848c1fc56a7c4","impliedFormat":1},{"version":"1223780c318ef42fd33ac772996335ed92d57cf7c0fc73178acab5e154971aab","impliedFormat":1},{"version":"0d04cbe88c8a25c2debd2eef03ec5674563e23ca9323fa82ede3577822653bd2","impliedFormat":1},{"version":"aaa70439f135c3fa0a34313de49e94cae3db954c8b8d6af0d56a46c998c2923f","impliedFormat":1},{"version":"4ace083580c1b77eb8ddf4ea915cde605af1a96e426c4c04b897feef1acdb534","impliedFormat":1},{"version":"daf07c1ca8ccfb21ad958833546a4f414c418fe096dcebdbb90b02e12aa5c3a2","impliedFormat":1},{"version":"89ac5224feeb2de76fc52fc2a91c5f6448a98dbe4e8d726ecb1730fa64cd2d30","impliedFormat":1},{"version":"7feb39ba69b3fc6d55faca4f91f06d77d15ffedd3931b0ef7740e8b6fd488b15","impliedFormat":1},{"version":"acf00cfabe8c4de18bea655754ea39c4d04140257556bbf283255b695d00e36f","impliedFormat":1},{"version":"39b70d5f131fcfdeba404ee63aba25f26d8376a73bacd8275fb5a9f06219ac77","impliedFormat":1},{"version":"cdae26c737cf4534eeec210e42eab2d5f0c3855240d8dde3be4aee9194e4e781","impliedFormat":1},{"version":"5aa0c50083d0d9a423a46afaef78c7f42420759cfa038ad40e8b9e6cafc38831","impliedFormat":1},{"version":"10d6a49a99a593678ba4ea6073d53d005adfc383df24a9e93f86bf47de6ed857","impliedFormat":1},{"version":"1b7ea32849a7982047c2e5d372300a4c92338683864c9ab0f5bbd1acadae83a3","impliedFormat":1},{"version":"224083e6fcec1d300229da3d1dafc678c642863996cbfed7290df20954435a55","impliedFormat":1},{"version":"4248ac3167b1a1ce199fda9307abc314b3132527aeb94ec30dbcfe4c6a417b1b","impliedFormat":1},{"version":"633cb8c2c51c550a63bda0e3dec0ad5fa1346d1682111917ad4bc7005d496d8c","impliedFormat":1},{"version":"ca055d26105248f745ea6259b4c498ebeed18c9b772e7f2b3a16f50226ff9078","impliedFormat":1},{"version":"ea6b2badb951d6dfa24bb7d7eb733327e5f9a15fc994d6dc1c54b2c7a83b6a0b","impliedFormat":1},{"version":"03fdf8dba650d830388b9985750d770dd435f95634717f41cea814863a9ac98b","impliedFormat":1},{"version":"6fd08e3ef1568cd0dc735c9015f6765e25143a4a0331d004a29c51b50eec402a","impliedFormat":1},{"version":"2e988cd4d24edac4936449630581c79686c8adac10357eb0cdb410c24f47c7f0","impliedFormat":1},{"version":"b813f62a37886ed986b0f6f8c5bf323b3fcae32c1952b71d75741e74ea9353cf","impliedFormat":1},{"version":"44a1a722038365972b1b52841e1132785bf5d75839dbc6cc1339f2d36f8507a1","impliedFormat":1},{"version":"83fe1053701101ac6d25364696fea50d2ceb2f81d1456bc11e682a20aaeac52e","impliedFormat":1},{"version":"4f228cb2089a5a135a1a8cefe612d5aebcef8258f7dbe3b7c4dad4e26a81ec08","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"e134052a6b1ded61693b4037f615dc72f14e2881e79c1ddbff6c514c8a516b05","impliedFormat":1},{"version":"957a44f864ab3c182edc747428e8eec1765257deee7fac86c1147eeac897d832","impliedFormat":1},{"version":"3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","impliedFormat":99},{"version":"bbdfaf7d9b20534c5df1e1b937a20f17ca049d603a2afe072983bf7aff2279f5","impliedFormat":99},{"version":"86d818ada2f5f0cfffca153af94205b67ba50f8e36524a413d66652f34ef19af","impliedFormat":99},{"version":"40afd49a15d0bafef682b42664ff21c274e02dcc60052f2df85dd53c70d9394f","impliedFormat":99},{"version":"5a5b1dd91662e93efae28d985e0e44d10f6a7e3c2c2ae8abc29bcfc406cb5310","impliedFormat":99},{"version":"66d0a61b3b0df6c9c2eb09dbe26e3c2aef71d9043fed17cd56de6669cb706325","impliedFormat":99},{"version":"f6692c3a1847d846bc4b7a690ef2ba096b2ca56bea5818f073eb8193ce33b5e1","impliedFormat":99},{"version":"1e4d27cf43aa16d164e958a220fee3c225b9dd146b1912cbc12083263f157ca9","impliedFormat":99},{"version":"a46147f499d4246998d1e44b43beecd2ee04c0a330c35863eaeccc827a737fdf","impliedFormat":1},{"version":"390140c96dcaf0831d24b5408d19af017e3a8f150fed140791d976ac20dd2da7","impliedFormat":99},{"version":"3181a53b0974a6fa4c6f8cf78cf2945248949467f1fc1d3ddb058b0efe6c4f00","impliedFormat":99},{"version":"13e7c1f8ddda39d034935e667f3a314ec8b89b8be18fbd4cd987ea4312b4221f","impliedFormat":99},{"version":"678307b1f5a25d7fb9b7307a7ccd8d146115b28f74315c48511d1e1fdf9f8166","impliedFormat":99},{"version":"ba6f2f79892f59ea9bf645e15ad70658fc76dfbbba32669c2957b7547210e6ff","impliedFormat":99},{"version":"768fd34f23de8dc5f5df6cd45f044bb4193105b5964e4ef734dbfc1a1f8e6223","impliedFormat":1},{"version":"376d229cb7d2f7a4d5fbfb2eb5df262c31385b0c314fffa6660ba7ea4a5937f1","impliedFormat":99},{"version":"0ebf97879a0c2914ab35ef84b5802a5acbc8b6a7fc3ad952c1f8bb568026e571","impliedFormat":99},{"version":"81d3389164d84254c3869f799509672d323d5027a9766c0fa4c22b12c9be6bc5","impliedFormat":99},{"version":"ca6cd2c9c706f1d84fe86e3f87e3aa779256ed9ca3a2adcca81931faab807683","impliedFormat":99},{"version":"cf76eeea2b4ec3fe26520cd129cfc32352d1ddb22b6d4ff0c6a709656a4b1b37","impliedFormat":1},{"version":"fea0cb28540b473977c722853998d39d28575fa12e31b3371fcf1f324e3a9fb7","impliedFormat":1},{"version":"ee4ee9bf6c6d276343e7f0bce3a5374800eb4ec6b2d7c70fab6ae3ef840d9777","impliedFormat":1},{"version":"571ba264349552a1111ac0d6a5ed580a41c390aac43a70546c3a7374c77faa71","impliedFormat":1},{"version":"4ad34258acf819cf5f356e000d833974ddb2c2d76f9d50e0783d316986782dd3","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"}],"root":[93,111,[128,150],[1105,1118],[1414,1431],[1434,1445],[1520,1523],[1525,1566],[1950,1956],[1972,1976],[2058,2083],2098,2099,2101,2102,2114,2118,[2121,2279],[2282,2285],[2300,2315],2504],"options":{"allowImportingTsExtensions":true,"composite":true,"esModuleInterop":true,"jsx":1,"jsxImportSource":"vue","module":99,"noImplicitThis":true,"skipLibCheck":true,"strict":true,"target":99,"useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[2313,1],[2312,2],[93,3],[105,4],[96,5],[95,6],[748,7],[742,6],[746,7],[745,8],[741,7],[740,6],[749,9],[747,8],[743,8],[744,8],[1119,10],[1120,10],[1121,10],[1122,10],[1123,10],[1124,10],[1125,10],[1126,10],[1127,10],[1128,10],[1129,10],[1130,10],[1131,10],[1132,10],[1133,10],[1134,10],[1135,10],[1136,10],[1137,10],[1138,10],[1139,10],[1140,10],[1141,10],[1142,10],[1143,10],[1144,10],[1145,10],[1146,10],[1147,10],[1148,10],[1149,10],[1150,10],[1151,10],[1152,10],[1153,10],[1154,10],[1155,10],[1156,10],[1157,10],[1158,10],[1159,10],[1160,10],[1161,10],[1162,10],[1163,10],[1164,10],[1165,10],[1166,10],[1167,10],[1168,10],[1169,10],[1170,10],[1171,10],[1172,10],[1173,10],[1174,10],[1175,10],[1176,10],[1177,10],[1178,10],[1179,10],[1180,10],[1181,10],[1182,10],[1183,10],[1184,10],[1185,10],[1186,10],[1187,10],[1188,10],[1189,10],[1190,10],[1191,10],[1192,10],[1193,10],[1194,10],[1195,10],[1196,10],[1197,10],[1198,10],[1199,10],[1200,10],[1201,10],[1202,10],[1203,10],[1204,10],[1205,10],[1206,10],[1207,10],[1208,10],[1209,10],[1210,10],[1211,10],[1212,10],[1213,10],[1214,10],[1215,10],[1216,10],[1217,10],[1218,10],[1219,10],[1220,10],[1221,10],[1222,10],[1223,10],[1224,10],[1225,10],[1226,10],[1227,10],[1228,10],[1229,10],[1230,10],[1231,10],[1232,10],[1233,10],[1234,10],[1235,10],[1236,10],[1237,10],[1238,10],[1239,10],[1240,10],[1241,10],[1242,10],[1243,10],[1244,10],[1245,10],[1246,10],[1247,10],[1248,10],[1249,10],[1250,10],[1251,10],[1252,10],[1253,10],[1254,10],[1255,10],[1256,10],[1257,10],[1258,10],[1259,10],[1260,10],[1412,11],[1261,10],[1262,10],[1263,10],[1264,10],[1265,10],[1266,10],[1267,10],[1268,10],[1269,10],[1270,10],[1271,10],[1272,10],[1273,10],[1274,10],[1275,10],[1276,10],[1277,10],[1278,10],[1279,10],[1280,10],[1281,10],[1282,10],[1283,10],[1284,10],[1285,10],[1286,10],[1287,10],[1288,10],[1289,10],[1290,10],[1291,10],[1292,10],[1293,10],[1294,10],[1295,10],[1296,10],[1297,10],[1298,10],[1299,10],[1300,10],[1301,10],[1302,10],[1303,10],[1304,10],[1305,10],[1306,10],[1307,10],[1308,10],[1309,10],[1310,10],[1311,10],[1312,10],[1313,10],[1314,10],[1315,10],[1316,10],[1317,10],[1318,10],[1319,10],[1320,10],[1321,10],[1322,10],[1323,10],[1324,10],[1325,10],[1326,10],[1327,10],[1328,10],[1329,10],[1330,10],[1331,10],[1332,10],[1333,10],[1334,10],[1335,10],[1336,10],[1337,10],[1338,10],[1339,10],[1340,10],[1341,10],[1342,10],[1343,10],[1344,10],[1345,10],[1346,10],[1347,10],[1348,10],[1349,10],[1350,10],[1351,10],[1352,10],[1353,10],[1354,10],[1355,10],[1356,10],[1357,10],[1358,10],[1359,10],[1360,10],[1361,10],[1362,10],[1363,10],[1364,10],[1365,10],[1366,10],[1367,10],[1368,10],[1369,10],[1370,10],[1371,10],[1372,10],[1373,10],[1374,10],[1375,10],[1376,10],[1377,10],[1378,10],[1379,10],[1380,10],[1381,10],[1382,10],[1383,10],[1384,10],[1385,10],[1386,10],[1387,10],[1388,10],[1389,10],[1390,10],[1391,10],[1392,10],[1393,10],[1394,10],[1395,10],[1396,10],[1397,10],[1398,10],[1399,10],[1400,10],[1401,10],[1402,10],[1403,10],[1404,10],[1405,10],[1406,10],[1407,10],[1408,10],[1409,10],[1410,10],[1411,10],[1413,12],[633,13],[635,14],[632,6],[634,6],[2119,10],[525,15],[521,16],[508,6],[524,17],[517,18],[515,19],[514,19],[513,18],[510,19],[511,18],[519,20],[512,19],[509,18],[516,19],[522,21],[523,22],[518,23],[520,19],[1971,24],[1970,25],[1967,26],[1966,27],[1957,6],[1958,6],[1960,28],[1959,6],[1969,29],[1961,27],[1962,30],[1965,31],[1963,6],[1964,27],[1968,6],[1593,24],[1567,10],[1568,32],[1569,10],[1570,10],[1571,33],[1949,34],[1592,6],[1590,35],[1589,6],[1923,36],[1922,37],[1921,6],[1905,38],[1904,10],[1907,39],[1908,40],[1906,41],[1910,42],[1909,6],[1913,43],[1914,44],[1912,43],[1911,6],[1943,45],[1942,10],[1915,10],[1945,46],[1925,47],[1924,10],[1916,6],[1918,48],[1917,6],[1920,49],[1919,41],[1927,10],[1941,50],[1940,51],[1939,10],[1926,10],[1930,10],[1934,52],[1932,53],[1933,10],[1931,10],[1929,54],[1928,6],[1936,55],[1935,6],[1938,56],[1937,10],[1891,6],[1947,57],[1946,10],[1948,58],[1900,59],[1899,60],[1898,61],[1901,62],[1902,63],[1897,64],[1903,65],[1944,6],[1896,66],[1895,67],[1892,6],[1893,68],[1894,69],[1779,70],[1714,71],[1715,72],[1716,73],[1717,74],[1718,75],[1719,76],[1720,77],[1721,78],[1722,79],[1723,80],[1724,81],[1725,82],[1726,83],[1727,84],[1728,85],[1729,86],[1769,87],[1730,88],[1731,89],[1732,90],[1733,91],[1734,92],[1735,93],[1736,94],[1737,95],[1738,96],[1739,97],[1740,98],[1741,99],[1742,100],[1743,101],[1744,102],[1745,103],[1746,104],[1747,105],[1748,106],[1749,107],[1750,108],[1751,109],[1752,110],[1753,111],[1754,112],[1755,113],[1756,114],[1757,115],[1758,116],[1759,117],[1760,118],[1761,119],[1762,120],[1763,121],[1764,122],[1765,123],[1766,124],[1767,125],[1768,126],[1778,127],[1703,6],[1709,128],[1711,129],[1713,130],[1770,131],[1771,130],[1772,130],[1773,132],[1777,133],[1774,130],[1775,130],[1776,130],[1780,134],[1781,135],[1782,136],[1783,136],[1784,137],[1785,136],[1786,136],[1787,138],[1788,136],[1789,139],[1790,139],[1791,139],[1792,140],[1793,139],[1794,141],[1795,136],[1796,139],[1797,137],[1798,140],[1799,136],[1800,136],[1801,137],[1802,140],[1803,140],[1804,137],[1805,136],[1806,142],[1807,143],[1808,137],[1809,137],[1810,139],[1811,136],[1812,136],[1813,137],[1814,136],[1831,144],[1815,136],[1816,135],[1817,135],[1818,135],[1819,139],[1820,139],[1821,140],[1822,140],[1823,137],[1824,135],[1825,135],[1826,145],[1827,146],[1828,136],[1829,135],[1830,147],[1867,148],[1705,70],[1837,149],[1832,150],[1833,150],[1834,150],[1835,151],[1836,152],[1708,153],[1707,153],[1712,142],[1838,154],[1706,70],[1842,155],[1839,156],[1840,156],[1841,157],[1843,135],[1710,158],[1844,139],[1845,140],[1846,6],[1847,6],[1848,6],[1849,6],[1850,6],[1851,6],[1866,159],[1852,6],[1853,6],[1854,6],[1855,6],[1856,6],[1857,6],[1858,6],[1859,6],[1860,6],[1861,6],[1862,6],[1863,6],[1864,6],[1865,6],[1869,160],[1870,161],[1871,162],[1875,160],[1876,163],[1877,164],[1701,165],[1700,166],[1704,167],[1702,168],[1872,169],[1873,170],[1874,171],[1878,172],[1884,173],[1879,10],[1880,10],[1881,174],[1882,175],[1883,174],[2097,176],[2094,177],[2093,178],[2084,6],[2085,6],[2087,179],[2086,6],[2096,180],[2088,178],[2089,181],[2092,182],[2090,6],[2091,178],[2095,6],[2420,6],[2020,6],[179,183],[180,183],[181,183],[182,183],[183,183],[184,183],[185,183],[186,183],[187,183],[188,183],[189,183],[190,183],[191,183],[192,183],[193,183],[194,183],[195,183],[196,183],[197,183],[198,183],[199,183],[200,183],[201,183],[202,183],[203,183],[204,183],[205,183],[206,183],[207,183],[208,183],[209,183],[210,183],[211,183],[212,183],[213,183],[214,183],[215,183],[216,183],[217,183],[218,183],[219,183],[220,183],[221,183],[222,183],[223,183],[224,183],[225,183],[226,183],[227,183],[228,183],[229,183],[230,183],[231,183],[232,183],[233,183],[234,183],[235,183],[236,183],[237,183],[238,183],[239,183],[240,183],[241,183],[242,183],[243,183],[244,183],[245,183],[246,183],[247,183],[248,183],[249,183],[250,183],[251,183],[252,183],[253,183],[254,183],[255,183],[256,183],[257,183],[258,183],[259,183],[260,183],[261,183],[262,183],[263,183],[264,183],[265,183],[266,183],[267,183],[268,183],[269,183],[270,183],[271,183],[272,183],[273,183],[274,183],[275,183],[483,184],[276,183],[277,183],[278,183],[279,183],[280,183],[281,183],[282,183],[283,183],[284,183],[285,183],[286,183],[287,183],[288,183],[289,183],[290,183],[291,183],[292,183],[293,183],[294,183],[295,183],[296,183],[297,183],[298,183],[299,183],[300,183],[301,183],[302,183],[303,183],[304,183],[305,183],[306,183],[307,183],[308,183],[309,183],[310,183],[311,183],[312,183],[313,183],[314,183],[315,183],[316,183],[317,183],[318,183],[319,183],[320,183],[321,183],[322,183],[323,183],[324,183],[325,183],[326,183],[327,183],[328,183],[329,183],[330,183],[331,183],[332,183],[333,183],[334,183],[335,183],[336,183],[337,183],[338,183],[339,183],[340,183],[341,183],[342,183],[343,183],[344,183],[345,183],[346,183],[347,183],[348,183],[349,183],[350,183],[351,183],[352,183],[353,183],[354,183],[355,183],[356,183],[357,183],[358,183],[359,183],[360,183],[361,183],[362,183],[363,183],[364,183],[365,183],[366,183],[367,183],[368,183],[369,183],[370,183],[371,183],[372,183],[373,183],[374,183],[375,183],[376,183],[377,183],[378,183],[379,183],[380,183],[381,183],[382,183],[383,183],[384,183],[385,183],[386,183],[387,183],[388,183],[389,183],[390,183],[391,183],[392,183],[393,183],[394,183],[395,183],[396,183],[397,183],[398,183],[399,183],[400,183],[401,183],[402,183],[403,183],[404,183],[405,183],[406,183],[407,183],[408,183],[409,183],[410,183],[411,183],[412,183],[413,183],[414,183],[415,183],[416,183],[417,183],[418,183],[419,183],[420,183],[421,183],[422,183],[423,183],[424,183],[425,183],[426,183],[427,183],[428,183],[429,183],[430,183],[431,183],[432,183],[433,183],[434,183],[435,183],[436,183],[437,183],[438,183],[439,183],[440,183],[441,183],[442,183],[443,183],[444,183],[445,183],[446,183],[447,183],[448,183],[449,183],[450,183],[451,183],[452,183],[453,183],[454,183],[455,183],[456,183],[457,183],[458,183],[459,183],[460,183],[461,183],[462,183],[463,183],[464,183],[465,183],[466,183],[467,183],[468,183],[469,183],[470,183],[471,183],[472,183],[473,183],[474,183],[475,183],[476,183],[477,183],[478,183],[479,183],[480,183],[481,183],[482,183],[116,185],[117,186],[115,187],[118,188],[119,189],[120,190],[121,191],[122,192],[123,193],[124,194],[125,195],[126,196],[127,197],[2366,198],[2367,198],[2368,199],[2321,200],[2369,201],[2370,202],[2371,203],[2316,6],[2319,204],[2317,6],[2318,6],[2372,205],[2373,206],[2374,207],[2375,208],[2376,209],[2377,210],[2378,210],[2379,211],[2380,212],[2381,213],[2382,214],[2322,6],[2320,6],[2383,215],[2384,216],[2385,217],[2419,218],[2386,219],[2387,6],[2388,220],[2389,221],[2390,222],[2391,223],[2392,224],[2393,225],[2394,226],[2395,227],[2396,228],[2397,228],[2398,229],[2399,6],[2400,230],[2401,231],[2403,232],[2402,233],[2404,234],[2405,235],[2406,236],[2407,237],[2408,238],[2409,239],[2410,240],[2411,241],[2412,242],[2413,243],[2414,244],[2415,245],[2416,246],[2323,6],[2324,6],[2325,6],[2363,247],[2364,6],[2365,6],[2417,248],[2418,249],[2501,250],[2046,251],[2045,251],[2485,252],[2482,253],[2484,254],[2483,255],[97,256],[98,257],[2480,258],[99,259],[100,260],[102,261],[94,6],[109,262],[108,10],[2024,263],[2038,264],[2039,265],[2040,266],[2044,267],[2025,268],[2051,269],[2052,270],[2043,271],[2029,272],[2033,273],[2023,274],[2031,275],[2032,276],[2030,271],[2028,274],[2026,277],[2042,278],[2027,279],[2048,280],[2049,281],[2047,282],[2022,283],[2041,6],[2053,284],[2055,285],[2056,286],[1981,6],[1979,6],[1980,3],[1977,6],[2054,6],[1978,6],[834,287],[833,6],[114,6],[101,6],[687,288],[686,289],[685,6],[1524,290],[2021,6],[2105,291],[2107,292],[2109,293],[2111,294],[1433,295],[2113,296],[2104,297],[2106,297],[2108,297],[1432,6],[2110,297],[2112,297],[2103,6],[503,298],[501,299],[502,300],[507,301],[504,302],[505,303],[506,304],[1062,305],[1060,10],[1061,306],[1058,307],[1059,308],[654,309],[652,310],[653,311],[661,312],[659,313],[657,314],[655,315],[656,316],[658,317],[660,318],[665,319],[662,10],[663,320],[664,321],[669,322],[666,302],[667,323],[668,324],[2115,3],[676,325],[672,326],[673,327],[670,302],[671,328],[674,328],[675,329],[683,330],[679,331],[680,332],[677,333],[678,331],[681,334],[682,335],[692,336],[684,302],[688,337],[689,338],[690,339],[691,340],[696,341],[693,302],[694,342],[695,343],[703,344],[699,302],[700,345],[697,302],[698,346],[701,345],[702,347],[710,348],[708,349],[709,350],[707,351],[706,352],[705,353],[704,354],[717,355],[714,356],[715,357],[716,358],[720,359],[718,360],[719,361],[727,362],[723,363],[724,364],[725,365],[721,366],[722,363],[726,367],[730,368],[728,369],[729,370],[739,371],[738,10],[737,372],[733,373],[734,374],[731,302],[732,375],[735,375],[736,376],[753,377],[751,378],[752,379],[750,380],[756,381],[754,382],[755,383],[784,384],[780,385],[781,386],[782,387],[783,388],[790,389],[786,10],[785,10],[787,10],[788,10],[789,10],[793,390],[791,391],[792,392],[807,393],[803,394],[802,395],[806,396],[805,397],[804,290],[811,398],[808,399],[810,400],[809,401],[815,402],[814,302],[812,403],[813,404],[765,405],[764,394],[760,302],[761,406],[762,407],[763,407],[2117,408],[818,409],[816,410],[817,411],[821,412],[819,413],[820,414],[828,415],[823,302],[824,10],[825,416],[822,417],[826,418],[827,419],[832,420],[829,302],[830,421],[831,422],[845,423],[841,424],[837,425],[840,426],[838,427],[839,428],[844,429],[842,430],[843,424],[836,431],[835,432],[848,433],[846,434],[847,435],[852,436],[850,437],[851,438],[854,439],[849,440],[853,441],[1095,442],[1079,443],[1078,10],[857,444],[855,445],[856,446],[861,447],[858,448],[859,449],[860,450],[539,451],[536,333],[537,452],[538,453],[768,454],[766,455],[767,456],[1084,457],[1083,458],[1081,459],[1082,458],[1080,460],[1071,461],[1068,462],[1069,463],[1070,464],[1067,6],[871,465],[869,466],[868,10],[866,10],[864,467],[865,468],[863,469],[867,302],[870,6],[862,470],[1087,471],[1085,472],[1086,473],[759,474],[758,475],[757,476],[1090,477],[1089,478],[1088,479],[873,480],[872,481],[2116,482],[876,483],[874,484],[875,485],[879,486],[878,10],[877,302],[882,487],[880,488],[881,489],[1094,490],[1093,10],[1091,491],[1092,492],[535,493],[532,494],[529,10],[526,495],[533,496],[534,497],[527,498],[528,499],[530,500],[531,501],[885,502],[883,503],[884,504],[893,505],[892,506],[888,507],[889,508],[890,509],[891,506],[886,510],[887,511],[896,512],[894,513],[895,514],[899,515],[897,516],[898,517],[903,518],[902,10],[900,519],[901,520],[910,521],[909,10],[904,522],[905,523],[907,524],[906,10],[908,525],[1066,526],[1065,527],[1064,528],[1063,6],[936,529],[925,530],[923,531],[911,6],[924,532],[926,533],[927,534],[935,535],[933,10],[929,302],[932,536],[928,537],[931,538],[934,539],[930,540],[941,541],[939,542],[940,543],[937,544],[938,545],[946,546],[945,547],[943,302],[944,548],[942,549],[950,550],[948,10],[947,481],[949,551],[1077,552],[1075,553],[1076,554],[1073,555],[1074,556],[1072,10],[953,557],[951,558],[952,559],[959,560],[956,561],[957,562],[954,563],[955,564],[958,6],[962,565],[960,566],[961,567],[995,568],[973,10],[975,569],[965,570],[972,4],[976,571],[986,572],[978,573],[980,574],[983,575],[987,576],[984,577],[985,578],[992,579],[991,580],[982,581],[989,582],[988,583],[970,584],[990,585],[963,6],[967,586],[977,587],[979,588],[981,569],[974,6],[994,589],[966,590],[969,591],[971,592],[968,593],[964,594],[993,595],[779,596],[770,597],[769,598],[773,599],[777,600],[774,601],[775,602],[776,603],[772,604],[778,605],[771,606],[1003,607],[998,608],[1000,609],[999,610],[1001,611],[997,612],[996,613],[1002,614],[713,615],[711,616],[712,617],[1006,618],[1004,333],[1005,619],[801,620],[796,621],[794,622],[799,623],[800,624],[797,338],[795,625],[798,626],[1009,627],[1007,628],[1008,629],[1014,630],[1011,631],[1012,632],[1010,302],[1013,633],[651,634],[650,635],[646,636],[645,637],[648,638],[649,639],[647,313],[1057,640],[1051,641],[1055,642],[1056,643],[1053,644],[1054,645],[1052,646],[1019,647],[1017,648],[1016,649],[1015,650],[1018,651],[1031,652],[1030,653],[1029,654],[1036,655],[1035,656],[1034,657],[1032,658],[1033,659],[1028,660],[1026,661],[1024,662],[1023,663],[1021,664],[1027,6],[1020,665],[1022,666],[1025,667],[1047,668],[1037,669],[1046,10],[1041,670],[1040,671],[1045,672],[1044,673],[1043,674],[1042,675],[1038,676],[1039,677],[922,678],[920,679],[921,680],[915,681],[916,549],[912,549],[913,6],[918,682],[919,681],[914,683],[1050,684],[1048,685],[1049,686],[167,6],[172,6],[168,6],[169,6],[173,6],[174,687],[170,6],[171,6],[1096,688],[1097,10],[1102,689],[1101,690],[1098,10],[1099,10],[644,691],[643,10],[540,10],[541,10],[641,10],[637,10],[629,302],[542,692],[543,10],[642,302],[626,6],[636,693],[640,460],[544,10],[630,10],[625,460],[628,10],[612,694],[614,695],[615,10],[616,302],[613,10],[638,10],[627,10],[619,495],[617,10],[618,10],[620,6],[639,333],[621,10],[622,10],[623,6],[624,6],[631,10],[1104,696],[611,697],[546,6],[547,6],[548,6],[549,6],[550,6],[551,6],[552,6],[553,6],[554,6],[555,6],[556,6],[557,6],[545,6],[558,6],[559,6],[560,6],[561,6],[562,6],[563,6],[564,6],[565,6],[566,6],[567,6],[568,6],[569,6],[570,6],[571,6],[572,6],[573,6],[574,6],[575,6],[576,6],[577,6],[578,6],[579,6],[580,6],[581,6],[582,6],[583,6],[584,6],[585,6],[586,6],[587,6],[588,6],[589,6],[590,6],[591,6],[592,6],[593,6],[594,6],[595,6],[596,6],[597,6],[598,6],[599,6],[600,6],[601,6],[602,6],[603,6],[604,6],[605,6],[606,6],[607,6],[110,6],[609,6],[610,6],[608,6],[1103,698],[485,699],[488,692],[151,6],[156,6],[152,6],[157,700],[153,6],[154,6],[155,10],[499,6],[489,6],[490,259],[491,6],[500,701],[492,702],[493,6],[494,6],[495,259],[498,6],[496,259],[497,6],[158,6],[159,10],[178,703],[161,704],[165,705],[163,706],[164,707],[162,6],[166,10],[175,708],[160,10],[176,708],[177,10],[487,709],[486,710],[2425,6],[2120,711],[1447,712],[1448,713],[1446,6],[1502,714],[1454,715],[1456,716],[1449,712],[1503,717],[1455,718],[1460,719],[1461,718],[1462,720],[1463,718],[1464,721],[1465,720],[1466,718],[1467,718],[1499,722],[1494,723],[1495,718],[1496,718],[1468,718],[1469,718],[1497,718],[1470,718],[1490,718],[1493,718],[1492,718],[1491,718],[1471,718],[1472,718],[1473,719],[1474,718],[1475,718],[1488,718],[1477,718],[1476,718],[1500,718],[1479,718],[1498,718],[1478,718],[1489,718],[1481,722],[1482,718],[1484,720],[1483,718],[1485,718],[1501,718],[1486,718],[1487,718],[1452,724],[1451,6],[1457,725],[1459,726],[1453,6],[1458,727],[1480,727],[1450,728],[1505,729],[1512,730],[1513,730],[1515,731],[1514,730],[1504,732],[1518,733],[1507,734],[1509,735],[1517,736],[1510,737],[1508,738],[1516,739],[1511,740],[1506,741],[2050,6],[2453,6],[1519,6],[484,742],[2478,6],[917,6],[2486,6],[1100,6],[1695,6],[113,743],[2442,744],[2440,745],[2441,746],[2429,747],[2430,745],[2437,748],[2428,749],[2433,750],[2443,6],[2434,751],[2439,752],[2445,753],[2444,754],[2427,755],[2435,756],[2436,757],[2431,758],[2438,744],[2432,759],[1696,760],[1699,761],[1697,165],[1698,762],[2422,763],[2421,764],[2466,765],[2447,6],[2467,766],[2449,767],[2474,768],[2468,6],[2470,769],[2471,769],[2472,770],[2469,6],[2473,771],[2452,772],[2450,6],[2451,773],[2465,774],[2448,6],[2463,775],[2454,776],[2455,777],[2456,777],[2457,776],[2464,778],[2458,777],[2459,775],[2460,776],[2461,777],[2462,776],[2035,779],[2034,780],[2037,781],[2036,782],[1982,780],[2001,783],[1994,6],[1985,784],[1983,780],[1986,780],[1984,785],[1987,780],[1989,780],[1988,780],[1991,780],[1990,780],[1993,780],[1992,780],[1995,786],[1996,780],[2000,787],[1997,788],[1998,780],[1999,780],[2017,789],[2003,789],[2011,789],[2002,6],[2019,790],[2013,791],[2015,6],[2018,792],[2006,793],[2007,793],[2009,793],[2005,794],[2012,795],[2008,793],[2004,793],[2014,789],[2016,796],[2010,797],[2426,6],[2490,798],[2489,6],[1868,799],[2299,800],[2286,6],[2296,6],[2292,6],[2293,6],[2287,6],[2297,6],[2298,6],[2295,6],[2291,6],[2290,6],[2294,801],[2288,6],[2289,6],[1580,802],[1579,10],[1625,10],[1574,10],[1575,6],[1576,803],[1644,10],[1645,804],[1646,10],[1648,805],[1647,10],[1581,10],[1649,10],[1650,10],[1678,806],[1679,807],[1674,10],[1651,808],[1652,808],[1654,809],[1653,810],[1655,10],[1656,808],[1680,10],[1682,811],[1658,812],[1657,10],[1669,10],[1670,808],[1671,808],[1672,808],[1683,806],[1659,10],[1587,813],[1584,10],[1585,814],[1586,6],[1578,815],[1577,6],[1626,10],[1673,10],[1681,816],[1597,817],[1595,818],[1596,819],[1624,820],[1676,6],[1677,821],[1662,822],[1629,823],[1630,824],[1631,810],[1632,825],[1684,10],[1685,826],[1633,810],[1634,827],[1635,828],[1686,810],[1687,829],[1688,830],[1689,831],[1622,832],[1623,833],[1663,810],[1664,834],[1690,835],[1691,836],[1603,10],[1636,810],[1638,837],[1637,810],[1639,838],[1641,839],[1573,840],[1693,841],[1692,842],[1886,843],[1885,844],[1694,6],[1888,845],[1887,816],[1665,846],[1666,847],[1583,848],[1582,10],[1643,849],[1642,810],[1668,850],[1667,851],[1889,852],[1890,853],[1588,854],[1628,855],[1627,856],[1660,857],[1675,858],[1661,6],[1609,820],[1615,6],[1614,859],[1618,6],[1602,6],[1604,835],[1612,860],[1613,6],[1600,861],[1601,862],[1591,6],[1598,863],[1621,864],[1606,865],[1572,6],[1594,866],[1611,6],[1617,867],[1616,10],[1599,816],[1610,868],[1607,6],[1605,6],[1620,869],[1608,820],[1619,6],[1640,6],[84,6],[85,6],[15,6],[13,6],[14,6],[19,6],[18,6],[2,6],[20,6],[21,6],[22,6],[23,6],[24,6],[25,6],[26,6],[27,6],[3,6],[28,6],[29,6],[4,6],[30,6],[34,6],[31,6],[32,6],[33,6],[35,6],[36,6],[37,6],[5,6],[38,6],[39,6],[40,6],[41,6],[6,6],[45,6],[42,6],[43,6],[44,6],[46,6],[7,6],[47,6],[52,6],[53,6],[48,6],[49,6],[50,6],[51,6],[8,6],[57,6],[54,6],[55,6],[56,6],[58,6],[9,6],[59,6],[60,6],[61,6],[63,6],[62,6],[64,6],[65,6],[10,6],[66,6],[67,6],[68,6],[11,6],[69,6],[70,6],[71,6],[72,6],[73,6],[1,6],[74,6],[75,6],[12,6],[79,6],[77,6],[82,6],[81,6],[86,6],[76,6],[80,6],[78,6],[83,6],[17,6],[16,6],[2479,6],[2341,870],[2351,871],[2340,870],[2361,872],[2332,873],[2331,874],[2360,250],[2354,875],[2359,876],[2334,877],[2348,878],[2333,879],[2357,880],[2329,881],[2328,250],[2358,882],[2330,883],[2335,884],[2336,6],[2339,884],[2326,6],[2362,885],[2352,886],[2343,887],[2344,888],[2346,889],[2342,890],[2345,891],[2355,250],[2337,892],[2338,893],[2347,894],[2327,895],[2350,886],[2349,884],[2353,6],[2356,896],[2491,897],[2487,898],[2488,899],[2493,900],[2494,901],[2492,6],[2498,902],[2497,903],[2499,904],[2496,905],[2500,906],[2502,907],[2503,906],[92,908],[2477,909],[2424,910],[2423,911],[88,911],[87,6],[89,912],[90,6],[91,913],[2475,914],[2446,6],[2476,915],[2100,6],[112,10],[2281,916],[2280,10],[106,10],[107,917],[2481,255],[103,918],[104,919],[2057,10],[2495,6],[1534,920],[1551,920],[1542,920],[1552,920],[1553,920],[1430,920],[1554,920],[1536,920],[1543,920],[1423,920],[1421,920],[1427,920],[1544,921],[1545,920],[1443,920],[1546,920],[1547,920],[1555,920],[1556,920],[1557,920],[1558,920],[1559,920],[1548,920],[1549,920],[1560,920],[1561,920],[1562,920],[1563,920],[150,920],[1564,920],[1565,920],[1550,920],[1429,920],[1566,920],[131,922],[1538,923],[1951,924],[1952,925],[1972,926],[1537,927],[1973,928],[1974,929],[1975,930],[1976,929],[2065,931],[2066,932],[2067,929],[2068,933],[2070,934],[2071,935],[2069,936],[2072,937],[2074,938],[2075,939],[2073,940],[2078,941],[2076,939],[2079,942],[2077,939],[2059,943],[2061,944],[2063,945],[2064,946],[2062,929],[1444,947],[2080,948],[2081,929],[2082,928],[2058,949],[1950,950],[1520,951],[2083,952],[2098,953],[128,940],[138,940],[111,940],[132,940],[129,940],[130,940],[2099,954],[1414,4],[147,955],[2060,4],[143,956],[2101,957],[2102,958],[1540,4],[2114,959],[2118,960],[2121,961],[2123,962],[2125,963],[2126,4],[1415,964],[144,965],[145,964],[146,928],[1107,966],[148,967],[149,964],[1106,968],[1108,969],[141,970],[142,971],[1114,972],[1109,973],[1111,974],[1112,975],[1113,976],[1115,977],[1541,978],[1539,979],[2124,956],[2127,980],[1528,981],[1527,982],[2122,983],[1535,984],[134,985],[140,986],[137,987],[136,988],[135,940],[1953,940],[1954,940],[2128,940],[1445,940],[1521,940],[2129,940],[1105,989],[2130,4],[1439,990],[1956,940],[1431,991],[1531,992],[1529,993],[1533,994],[1530,995],[139,996],[1955,940],[1110,997],[133,940],[1532,940],[1418,940],[1419,998],[1417,999],[1416,1000],[2131,1001],[2132,1002],[2133,1003],[2134,1004],[2135,1005],[2136,1006],[2137,1007],[2138,1008],[2139,1009],[2145,1010],[2143,1011],[2142,1012],[2141,1013],[2144,1014],[2140,1015],[2147,1016],[2146,1017],[2148,1016],[2149,1016],[2150,1018],[2151,1019],[2152,1020],[2153,1021],[2154,1022],[2155,932],[2156,1021],[2157,1023],[2158,1024],[2159,1025],[2160,1026],[2161,1027],[2162,1028],[2163,1029],[2171,1030],[2167,1031],[2172,1032],[2165,929],[1425,1033],[2173,1034],[2166,1030],[2168,1035],[2169,1036],[2175,1037],[2176,1035],[2177,1038],[2174,1039],[2179,1040],[2180,1041],[2181,1042],[2178,940],[2183,1043],[2184,1044],[2185,1045],[2182,940],[1424,940],[2187,1046],[2188,1047],[2189,1048],[2186,940],[2191,1049],[2192,1050],[2193,1051],[2190,940],[2195,1052],[2196,1053],[2197,1054],[2194,940],[2199,1055],[2200,1056],[2201,1057],[2198,940],[2203,1058],[2204,929],[2205,1059],[2202,940],[2207,1060],[2208,1061],[2206,940],[2210,1062],[2211,929],[2212,1063],[2209,940],[2214,1064],[2215,1065],[2216,1066],[2213,940],[2218,1067],[2219,929],[2220,1068],[2217,940],[2221,1069],[2164,1070],[1426,1071],[2223,1072],[2222,928],[2224,1073],[2170,1074],[2226,1075],[2229,1076],[2227,1077],[2228,1078],[2225,1079],[2230,1080],[2231,1081],[1422,1082],[2232,1083],[2233,1080],[1118,1084],[1117,1084],[1116,1085],[1428,1086],[2234,1087],[2235,1088],[2240,1089],[2241,1090],[2236,1091],[2238,1092],[2237,1093],[2239,1094],[2242,929],[2243,1095],[2244,1096],[2245,1097],[2246,1098],[2247,1099],[2248,1100],[2249,1101],[2250,1102],[2251,1103],[2252,1104],[2253,1105],[2254,1106],[2255,1107],[2256,1108],[2257,1109],[2258,1110],[2259,1111],[2260,1112],[2261,1111],[2262,1113],[2263,1114],[2264,1115],[2265,1116],[2266,1117],[2267,1118],[2268,1119],[2269,1120],[2270,1121],[2271,1122],[2272,1123],[2273,1124],[2274,1125],[2275,1126],[2276,1127],[2277,1128],[2278,1129],[2279,1130],[2282,1131],[2284,1132],[2283,1133],[2285,1134],[1525,1135],[1442,1136],[1441,1137],[2300,1138],[1434,1139],[1438,1137],[1437,1137],[1435,1140],[1436,1140],[1440,1141],[1523,1142],[1522,1143],[2301,1144],[1526,1145],[2302,1146],[2303,929],[2304,1147],[2305,929],[2306,929],[2307,929],[2308,929],[2309,1148],[2310,1149],[1420,1150],[2311,1151],[2314,6],[2315,1152],[2504,1153]],"semanticDiagnosticsPerFile":[[1428,[{"start":1757,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '\"\" | \"danger\" | \"info\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '\"\"' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]},{"start":7601,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[1434,[{"start":14231,"length":34,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'number'."}]],[1953,[{"start":10172,"length":13,"code":2339,"category":1,"messageText":"Property 'captureStream' does not exist on type 'HTMLVideoElement'."}]],[2065,[{"start":860,"length":28,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module '@wangeditor/editor-for-vue'. '/Users/long/Work/zyt/admin/node_modules/@wangeditor/editor-for-vue/dist/index.esm.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"@wangeditor/editor-for-vue","mode":99}}]}}]],[2161,[{"start":72181,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ name: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ name: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":72443,"length":962,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":73419,"length":457,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":73890,"length":457,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":74361,"length":780,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":48414,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '(value: string[]) => void' is not assignable to type '(value: CascaderValue | null | undefined) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'value' and 'value' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'CascaderValue | null | undefined' is not assignable to type 'string[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string[]'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","start":3298,"length":8,"messageText":"The expected type comes from property 'onChange' which is declared here on type '__VLS_NormalizeComponentEvent<NonNullable<Partial<{ disabled: boolean; separator: string; props: CascaderProps; placement: Placement; options: CascaderOption[]; effect: PopperEffect; ... 15 more ...; showCheckedStrategy: \"parent\" | \"child\"; }> & Omit<...> & Record<...>>, { ...; }, \"onChange\", \"change\", \"change\">'","category":3,"code":6500}]}]],[2163,[{"start":108901,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ value: any; label: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ value: any; label: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":137588,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":144513,"length":15,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./src/api/tcm.ts","start":12001,"length":15,"messageText":"The expected type comes from property 'medication_days' which is declared here on type '{ id: number; dose_count?: number | undefined; medication_days?: number | undefined; }'","category":3,"code":6500}]},{"start":150039,"length":15,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'tracking_number' does not exist in type '{ fulfillment_status?: number | undefined; }'."},{"start":156950,"length":18,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'completion_request' does not exist in type '{ id: number; order_type: number; pay_amount: number; pay_remark?: string | undefined; }'."},{"start":157456,"length":13,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'pay_order_ids' does not exist in type '{ id: number; pay_order_id: number; }'. Did you mean to write 'pay_order_id'?"},{"start":20647,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":141636,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":21125,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":158522,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":21571,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":141636,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":22041,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":159378,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":22477,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; express_company?: unknown; tracking_number?: unknown; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; express_company?: unknown; tracking_number?: unknown; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":150925,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":22932,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":155751,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":23382,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":158282,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":61553,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":752,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type 'Partial<{ disabled: boolean; id: string; valueOnClear: number | \"max\" | \"min\" | null; min: number; max: number; inputmode: \"url\" | \"text\" | \"search\" | \"email\" | \"tel\" | \"none\" | \"numeric\" | \"decimal\"; ... 6 more ...; stepStrictly: boolean; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":73445,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":752,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type 'Partial<{ disabled: boolean; id: string; valueOnClear: number | \"max\" | \"min\" | null; min: number; max: number; inputmode: \"url\" | \"text\" | \"search\" | \"email\" | \"tel\" | \"none\" | \"numeric\" | \"decimal\"; ... 6 more ...; stepStrictly: boolean; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":100716,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2175,[{"start":316,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":3919,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]},{"start":442,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":3919,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]}]],[2188,[{"start":190,"length":6,"code":2339,"category":1,"messageText":"Property 'height' does not exist on type '{}'."}]],[2230,[{"start":5579,"length":5,"messageText":"Parameter 'depts' implicitly has an 'any' type.","category":1,"code":7006},{"start":5607,"length":6,"messageText":"Variable 'result' implicitly has type 'any[]' in some locations where its type cannot be determined.","category":1,"code":7034},{"start":5645,"length":4,"messageText":"Parameter 'dept' implicitly has an 'any' type.","category":1,"code":7006},{"start":5811,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005},{"start":5906,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005}]],[2233,[{"start":10049,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":10250,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":4609,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]},{"start":6777,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[2234,[{"start":7456,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[2244,[{"start":386,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '(opts?: { silent?: boolean; }) => Promise<any>' is not assignable to type '(name: TabPaneName) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'opts' and 'name' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'TabPaneName' is not assignable to type '{ silent?: boolean | undefined; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' has no properties in common with type '{ silent?: boolean | undefined; }'.","category":1,"code":2559}]}]}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/tabs/src/tabs.d.ts","start":8466,"length":11,"messageText":"The expected type comes from property 'onTabChange' which is declared here on type '__VLS_NormalizeComponentEvent<NonNullable<Partial<{ readonly tabindex: EpPropMergeType<readonly [StringConstructor, NumberConstructor], unknown, unknown>; readonly stretch: boolean; ... 5 more ...; readonly addable: boolean; }> & Omit<...> & Record<...>>, { ...; }, \"onTabChange\", \"tab-change\", \"tabChange\">'","category":3,"code":6500}]}]],[2247,[{"start":46757,"length":34,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367},{"start":18780,"length":28,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367}]],[2248,[{"start":723,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":31111,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ data: TreeData; disabled: EpPropMergeType<BooleanConstructor, unknown, unknown>; tabindex: EpPropMergeType<(NumberConstructor | StringConstructor)[], unknown, unknown>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2252,[{"start":1689,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":31111,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ data: TreeData; disabled: EpPropMergeType<BooleanConstructor, unknown, unknown>; tabindex: EpPropMergeType<(NumberConstructor | StringConstructor)[], unknown, unknown>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2285,[{"start":31557,"length":6,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":31557,"length":6,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]},{"start":32314,"length":2,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":32314,"length":2,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]}]],[2301,[{"start":594,"length":19,"code":2339,"category":1,"messageText":"Property 'pending_unscheduled' does not exist on type '{ keyword: string; diagnosis_type: string; syndrome_type: string; assistant_id: string; start_time: string; end_time: string; diagnosis_confirmed: \"\" | \"0\" | \"1\"; appointment_date: string; has_appointment: \"\" | ... 1 more ... | \"1\"; pending_assign: \"\" | \"1\"; }'."},{"start":1198,"length":32,"code":2339,"category":1,"messageText":"Property 'handlePendingUnscheduledTabClick' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { hasPermission: (perms: string[]) => boolean; Loading: DefineComponent<{}, void, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 12 more ..., any>; ... 96 more ...; handleDeleteRecord: (id: number) => Promise<...>; }, ... 23 more ..., {}>'."},{"start":1134,"length":19,"code":2339,"category":1,"messageText":"Property 'pending_unscheduled' does not exist on type '{ keyword: string; diagnosis_type: string; syndrome_type: string; assistant_id: string; start_time: string; end_time: string; diagnosis_confirmed: \"\" | \"0\" | \"1\"; appointment_date: string; has_appointment: \"\" | ... 1 more ... | \"1\"; pending_assign: \"\" | \"1\"; }'."},{"start":1316,"length":23,"code":2339,"category":1,"messageText":"Property 'pendingUnscheduledCount' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { hasPermission: (perms: string[]) => boolean; Loading: DefineComponent<{}, void, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 12 more ..., any>; ... 96 more ...; handleDeleteRecord: (id: number) => Promise<...>; }, ... 23 more ..., {}>'."},{"start":1358,"length":23,"code":2339,"category":1,"messageText":"Property 'pendingUnscheduledCount' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { hasPermission: (perms: string[]) => boolean; Loading: DefineComponent<{}, void, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 12 more ..., any>; ... 96 more ...; handleDeleteRecord: (id: number) => Promise<...>; }, ... 23 more ..., {}>'."}]],[2311,[{"start":24155,"length":1,"messageText":"Parameter 'd' implicitly has an 'any' type.","category":1,"code":7006}]]],"affectedFilesPendingEmit":[1534,1551,1542,1552,1553,1430,1554,1536,1543,1423,1421,1427,1544,1545,1443,1546,1547,1555,1556,1557,1558,1559,1548,1549,1560,1561,1562,1563,150,1564,1565,1550,1429,1566,131,1538,1951,1952,1972,1537,1973,1974,1975,1976,2065,2066,2067,2068,2070,2071,2069,2072,2074,2075,2073,2078,2076,2079,2077,2059,2061,2063,2064,2062,1444,2080,2081,2082,2058,1950,1520,2083,2098,128,138,111,132,129,130,2099,1414,147,2060,143,2101,2102,1540,2114,2118,2121,2123,2125,2126,1415,144,145,146,1107,148,149,1106,1108,141,142,1114,1109,1111,1112,1113,1115,1541,1539,2124,2127,1528,1527,2122,1535,134,140,137,136,135,1953,1954,2128,1445,1521,2129,1105,2130,1439,1956,1431,1531,1529,1533,139,1955,1110,133,1532,1418,1419,1417,1416,2131,2132,2133,2134,2135,2136,2137,2138,2139,2145,2143,2142,2141,2144,2140,2147,2146,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2171,2167,2172,2165,1425,2173,2166,2168,2169,2175,2176,2177,2174,2179,2180,2181,2178,2183,2184,2185,2182,1424,2187,2188,2189,2186,2191,2192,2193,2190,2195,2196,2197,2194,2199,2200,2201,2198,2203,2204,2205,2202,2207,2208,2206,2210,2211,2212,2209,2214,2215,2216,2213,2218,2219,2220,2217,2221,2164,1426,2223,2222,2224,2170,2226,2229,2227,2228,2225,2230,2231,1422,2232,2233,1118,1117,1116,1428,2234,2235,2240,2241,2236,2238,2237,2239,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2282,2284,2283,2285,1525,1442,1441,2300,1434,1438,1437,1435,1436,1440,1523,1522,2301,1526,2302,2303,2304,2305,2306,2307,2308,2309,2310,1420,2311,2504],"emitSignatures":[111,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1520,1521,1522,1523,1525,1526,1527,1528,1529,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1950,1951,1952,1953,1954,1955,1956,1972,1973,1974,1975,1976,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2098,2099,2101,2102,2114,2118,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2282,2283,2284,2285,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2504],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.esnext.full.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/importmeta.d.ts","./node_modules/vite/client.d.ts","./global.d.ts","./node_modules/@vue/shared/dist/shared.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","./node_modules/@vue/reactivity/dist/reactivity.d.ts","./node_modules/@vue/runtime-core/dist/runtime-core.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","./node_modules/vue/dist/vue.d.mts","./node_modules/vue/jsx-runtime/index.d.ts","./node_modules/.vue-global-types/vue_3.5_0_0_0.d.ts","./node_modules/vue-router/dist/router-cwonjprp.d.mts","./node_modules/vue-router/dist/vue-router.d.mts","./node_modules/@vueuse/shared/index.d.mts","./node_modules/@vueuse/core/index.d.mts","./node_modules/element-plus/es/locale/lang/zh-cn.d.ts","./src/enums/appenums.ts","./node_modules/vue-demi/lib/index.d.ts","./node_modules/pinia/dist/pinia.d.ts","./node_modules/axios/index.d.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./src/config/index.ts","./src/enums/pageenum.ts","./src/enums/requestenums.ts","./src/api/user.ts","./src/enums/cacheenums.ts","./src/utils/validate.ts","./src/stores/modules/multipletabs.ts","./src/utils/cache.ts","./src/utils/auth.ts","./src/stores/modules/user.ts","./src/config/setting.ts","./src/utils/theme.ts","./src/stores/modules/setting.ts","./src/layout/default/components/setting/drawer.vue","./src/layout/default/components/setting/index.vue","./src/hooks/usewatchroute.ts","./src/layout/default/components/header/breadcrumb.vue","./src/layout/default/components/header/fold.vue","./src/layout/default/components/header/full-screen.vue","./src/hooks/usemultipletabs.ts","./src/layout/default/components/header/multiple-tabs.vue","./src/layout/default/components/header/refresh.vue","./src/api/setting/system.ts","./node_modules/element-plus/es/utils/dom/aria.d.ts","./node_modules/element-plus/es/utils/dom/event.d.ts","./node_modules/element-plus/es/utils/dom/position.d.ts","./node_modules/element-plus/es/utils/dom/scroll.d.ts","./node_modules/element-plus/es/utils/dom/style.d.ts","./node_modules/element-plus/es/utils/dom/element.d.ts","./node_modules/element-plus/es/utils/dom/index.d.ts","./node_modules/element-plus/es/utils/vue/global-node.d.ts","./node_modules/element-plus/es/utils/vue/icon.d.ts","./node_modules/element-plus/es/utils/vue/typescript.d.ts","./node_modules/element-plus/es/utils/vue/install.d.ts","./node_modules/element-plus/es/utils/vue/props/util.d.ts","./node_modules/element-plus/es/utils/vue/props/runtime.d.ts","./node_modules/element-plus/es/utils/vue/props/types.d.ts","./node_modules/element-plus/es/utils/vue/props/index.d.ts","./node_modules/element-plus/es/utils/vue/refs.d.ts","./node_modules/element-plus/es/constants/aria.d.ts","./node_modules/element-plus/es/constants/date.d.ts","./node_modules/element-plus/es/constants/event.d.ts","./node_modules/element-plus/es/constants/key.d.ts","./node_modules/element-plus/es/constants/size.d.ts","./node_modules/element-plus/es/constants/column-alignment.d.ts","./node_modules/element-plus/es/constants/form.d.ts","./node_modules/element-plus/es/constants/index.d.ts","./node_modules/element-plus/es/utils/vue/size.d.ts","./node_modules/element-plus/es/utils/vue/validator.d.ts","./node_modules/element-plus/es/utils/vue/vnode.d.ts","./node_modules/element-plus/es/utils/vue/index.d.ts","./node_modules/@types/lodash-es/add.d.ts","./node_modules/@types/lodash-es/after.d.ts","./node_modules/@types/lodash-es/ary.d.ts","./node_modules/@types/lodash-es/assign.d.ts","./node_modules/@types/lodash-es/assignin.d.ts","./node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/@types/lodash-es/at.d.ts","./node_modules/@types/lodash-es/attempt.d.ts","./node_modules/@types/lodash-es/before.d.ts","./node_modules/@types/lodash-es/bind.d.ts","./node_modules/@types/lodash-es/bindall.d.ts","./node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/@types/lodash-es/castarray.d.ts","./node_modules/@types/lodash-es/ceil.d.ts","./node_modules/@types/lodash-es/chain.d.ts","./node_modules/@types/lodash-es/chunk.d.ts","./node_modules/@types/lodash-es/clamp.d.ts","./node_modules/@types/lodash-es/clone.d.ts","./node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/@types/lodash-es/compact.d.ts","./node_modules/@types/lodash-es/concat.d.ts","./node_modules/@types/lodash-es/cond.d.ts","./node_modules/@types/lodash-es/conforms.d.ts","./node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/@types/lodash-es/constant.d.ts","./node_modules/@types/lodash-es/countby.d.ts","./node_modules/@types/lodash-es/create.d.ts","./node_modules/@types/lodash-es/curry.d.ts","./node_modules/@types/lodash-es/curryright.d.ts","./node_modules/@types/lodash-es/debounce.d.ts","./node_modules/@types/lodash-es/deburr.d.ts","./node_modules/@types/lodash-es/defaults.d.ts","./node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/@types/lodash-es/defer.d.ts","./node_modules/@types/lodash-es/delay.d.ts","./node_modules/@types/lodash-es/difference.d.ts","./node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/@types/lodash-es/divide.d.ts","./node_modules/@types/lodash-es/drop.d.ts","./node_modules/@types/lodash-es/dropright.d.ts","./node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/@types/lodash-es/each.d.ts","./node_modules/@types/lodash-es/eachright.d.ts","./node_modules/@types/lodash-es/endswith.d.ts","./node_modules/@types/lodash-es/entries.d.ts","./node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/@types/lodash-es/eq.d.ts","./node_modules/@types/lodash-es/escape.d.ts","./node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/@types/lodash-es/every.d.ts","./node_modules/@types/lodash-es/extend.d.ts","./node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/@types/lodash-es/fill.d.ts","./node_modules/@types/lodash-es/filter.d.ts","./node_modules/@types/lodash-es/find.d.ts","./node_modules/@types/lodash-es/findindex.d.ts","./node_modules/@types/lodash-es/findkey.d.ts","./node_modules/@types/lodash-es/findlast.d.ts","./node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/@types/lodash-es/first.d.ts","./node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/@types/lodash-es/flatten.d.ts","./node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/@types/lodash-es/flip.d.ts","./node_modules/@types/lodash-es/floor.d.ts","./node_modules/@types/lodash-es/flow.d.ts","./node_modules/@types/lodash-es/flowright.d.ts","./node_modules/@types/lodash-es/foreach.d.ts","./node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/@types/lodash-es/forin.d.ts","./node_modules/@types/lodash-es/forinright.d.ts","./node_modules/@types/lodash-es/forown.d.ts","./node_modules/@types/lodash-es/forownright.d.ts","./node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/@types/lodash-es/functions.d.ts","./node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/@types/lodash-es/get.d.ts","./node_modules/@types/lodash-es/groupby.d.ts","./node_modules/@types/lodash-es/gt.d.ts","./node_modules/@types/lodash-es/gte.d.ts","./node_modules/@types/lodash-es/has.d.ts","./node_modules/@types/lodash-es/hasin.d.ts","./node_modules/@types/lodash-es/head.d.ts","./node_modules/@types/lodash-es/identity.d.ts","./node_modules/@types/lodash-es/includes.d.ts","./node_modules/@types/lodash-es/indexof.d.ts","./node_modules/@types/lodash-es/initial.d.ts","./node_modules/@types/lodash-es/inrange.d.ts","./node_modules/@types/lodash-es/intersection.d.ts","./node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/@types/lodash-es/invert.d.ts","./node_modules/@types/lodash-es/invertby.d.ts","./node_modules/@types/lodash-es/invoke.d.ts","./node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/@types/lodash-es/isarray.d.ts","./node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/@types/lodash-es/isdate.d.ts","./node_modules/@types/lodash-es/iselement.d.ts","./node_modules/@types/lodash-es/isempty.d.ts","./node_modules/@types/lodash-es/isequal.d.ts","./node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/@types/lodash-es/iserror.d.ts","./node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/@types/lodash-es/islength.d.ts","./node_modules/@types/lodash-es/ismap.d.ts","./node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/@types/lodash-es/isnan.d.ts","./node_modules/@types/lodash-es/isnative.d.ts","./node_modules/@types/lodash-es/isnil.d.ts","./node_modules/@types/lodash-es/isnull.d.ts","./node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/@types/lodash-es/isobject.d.ts","./node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/@types/lodash-es/isset.d.ts","./node_modules/@types/lodash-es/isstring.d.ts","./node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/@types/lodash-es/join.d.ts","./node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/@types/lodash-es/keyby.d.ts","./node_modules/@types/lodash-es/keys.d.ts","./node_modules/@types/lodash-es/keysin.d.ts","./node_modules/@types/lodash-es/last.d.ts","./node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/@types/lodash-es/lt.d.ts","./node_modules/@types/lodash-es/lte.d.ts","./node_modules/@types/lodash-es/map.d.ts","./node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/@types/lodash-es/matches.d.ts","./node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/@types/lodash-es/max.d.ts","./node_modules/@types/lodash-es/maxby.d.ts","./node_modules/@types/lodash-es/mean.d.ts","./node_modules/@types/lodash-es/meanby.d.ts","./node_modules/@types/lodash-es/memoize.d.ts","./node_modules/@types/lodash-es/merge.d.ts","./node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/@types/lodash-es/method.d.ts","./node_modules/@types/lodash-es/methodof.d.ts","./node_modules/@types/lodash-es/min.d.ts","./node_modules/@types/lodash-es/minby.d.ts","./node_modules/@types/lodash-es/mixin.d.ts","./node_modules/@types/lodash-es/multiply.d.ts","./node_modules/@types/lodash-es/negate.d.ts","./node_modules/@types/lodash-es/noop.d.ts","./node_modules/@types/lodash-es/now.d.ts","./node_modules/@types/lodash-es/nth.d.ts","./node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/@types/lodash-es/omit.d.ts","./node_modules/@types/lodash-es/omitby.d.ts","./node_modules/@types/lodash-es/once.d.ts","./node_modules/@types/lodash-es/orderby.d.ts","./node_modules/@types/lodash-es/over.d.ts","./node_modules/@types/lodash-es/overargs.d.ts","./node_modules/@types/lodash-es/overevery.d.ts","./node_modules/@types/lodash-es/oversome.d.ts","./node_modules/@types/lodash-es/pad.d.ts","./node_modules/@types/lodash-es/padend.d.ts","./node_modules/@types/lodash-es/padstart.d.ts","./node_modules/@types/lodash-es/parseint.d.ts","./node_modules/@types/lodash-es/partial.d.ts","./node_modules/@types/lodash-es/partialright.d.ts","./node_modules/@types/lodash-es/partition.d.ts","./node_modules/@types/lodash-es/pick.d.ts","./node_modules/@types/lodash-es/pickby.d.ts","./node_modules/@types/lodash-es/property.d.ts","./node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/@types/lodash-es/pull.d.ts","./node_modules/@types/lodash-es/pullall.d.ts","./node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/@types/lodash-es/pullat.d.ts","./node_modules/@types/lodash-es/random.d.ts","./node_modules/@types/lodash-es/range.d.ts","./node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/@types/lodash-es/rearg.d.ts","./node_modules/@types/lodash-es/reduce.d.ts","./node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/@types/lodash-es/reject.d.ts","./node_modules/@types/lodash-es/remove.d.ts","./node_modules/@types/lodash-es/repeat.d.ts","./node_modules/@types/lodash-es/replace.d.ts","./node_modules/@types/lodash-es/rest.d.ts","./node_modules/@types/lodash-es/result.d.ts","./node_modules/@types/lodash-es/reverse.d.ts","./node_modules/@types/lodash-es/round.d.ts","./node_modules/@types/lodash-es/sample.d.ts","./node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/@types/lodash-es/set.d.ts","./node_modules/@types/lodash-es/setwith.d.ts","./node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/@types/lodash-es/size.d.ts","./node_modules/@types/lodash-es/slice.d.ts","./node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/@types/lodash-es/some.d.ts","./node_modules/@types/lodash-es/sortby.d.ts","./node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/@types/lodash-es/split.d.ts","./node_modules/@types/lodash-es/spread.d.ts","./node_modules/@types/lodash-es/startcase.d.ts","./node_modules/@types/lodash-es/startswith.d.ts","./node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/@types/lodash-es/subtract.d.ts","./node_modules/@types/lodash-es/sum.d.ts","./node_modules/@types/lodash-es/sumby.d.ts","./node_modules/@types/lodash-es/tail.d.ts","./node_modules/@types/lodash-es/take.d.ts","./node_modules/@types/lodash-es/takeright.d.ts","./node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/@types/lodash-es/tap.d.ts","./node_modules/@types/lodash-es/template.d.ts","./node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/@types/lodash-es/throttle.d.ts","./node_modules/@types/lodash-es/thru.d.ts","./node_modules/@types/lodash-es/times.d.ts","./node_modules/@types/lodash-es/toarray.d.ts","./node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/@types/lodash-es/tolength.d.ts","./node_modules/@types/lodash-es/tolower.d.ts","./node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/@types/lodash-es/topairs.d.ts","./node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/@types/lodash-es/topath.d.ts","./node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/@types/lodash-es/tostring.d.ts","./node_modules/@types/lodash-es/toupper.d.ts","./node_modules/@types/lodash-es/transform.d.ts","./node_modules/@types/lodash-es/trim.d.ts","./node_modules/@types/lodash-es/trimend.d.ts","./node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/@types/lodash-es/truncate.d.ts","./node_modules/@types/lodash-es/unary.d.ts","./node_modules/@types/lodash-es/unescape.d.ts","./node_modules/@types/lodash-es/union.d.ts","./node_modules/@types/lodash-es/unionby.d.ts","./node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/@types/lodash-es/uniq.d.ts","./node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/@types/lodash-es/unset.d.ts","./node_modules/@types/lodash-es/unzip.d.ts","./node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/@types/lodash-es/update.d.ts","./node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/@types/lodash-es/values.d.ts","./node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/@types/lodash-es/without.d.ts","./node_modules/@types/lodash-es/words.d.ts","./node_modules/@types/lodash-es/wrap.d.ts","./node_modules/@types/lodash-es/xor.d.ts","./node_modules/@types/lodash-es/xorby.d.ts","./node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/@types/lodash-es/zip.d.ts","./node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/@types/lodash-es/index.d.ts","./node_modules/lodash-unified/type.d.ts","./node_modules/element-plus/es/utils/arrays.d.ts","./node_modules/element-plus/node_modules/@vueuse/shared/index.d.mts","./node_modules/element-plus/node_modules/@vueuse/core/index.d.mts","./node_modules/element-plus/es/utils/browser.d.ts","./node_modules/element-plus/es/utils/error.d.ts","./node_modules/element-plus/es/utils/functions.d.ts","./node_modules/element-plus/es/utils/i18n.d.ts","./node_modules/element-plus/es/utils/objects.d.ts","./node_modules/element-plus/es/utils/raf.d.ts","./node_modules/element-plus/es/utils/rand.d.ts","./node_modules/element-plus/es/utils/strings.d.ts","./node_modules/element-plus/es/utils/types.d.ts","./node_modules/element-plus/es/utils/typescript.d.ts","./node_modules/element-plus/es/utils/throttlebyraf.d.ts","./node_modules/element-plus/es/utils/easings.d.ts","./node_modules/element-plus/es/utils/index.d.ts","./node_modules/element-plus/es/components/affix/src/affix.d.ts","./node_modules/element-plus/es/components/affix/src/affix.vue.d.ts","./node_modules/element-plus/es/components/affix/index.d.ts","./node_modules/element-plus/es/components/alert/src/alert.d.ts","./node_modules/element-plus/es/components/alert/src/alert.vue.d.ts","./node_modules/element-plus/es/components/alert/src/instance.d.ts","./node_modules/element-plus/es/components/alert/index.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","./node_modules/@popperjs/core/lib/createpopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/element-plus/es/components/popper/src/constants.d.ts","./node_modules/element-plus/es/components/popper/src/popper.d.ts","./node_modules/element-plus/es/components/popper/src/popper.vue.d.ts","./node_modules/element-plus/es/components/popper/src/arrow.vue.d.ts","./node_modules/element-plus/es/components/popper/src/trigger.d.ts","./node_modules/element-plus/es/components/popper/src/trigger.vue.d.ts","./node_modules/element-plus/es/components/popper/src/arrow.d.ts","./node_modules/element-plus/es/components/popper/src/content.d.ts","./node_modules/element-plus/es/components/popper/src/content.vue.d.ts","./node_modules/element-plus/es/components/popper/index.d.ts","./node_modules/element-plus/es/components/input/src/input.d.ts","./node_modules/element-plus/es/components/input/src/input.vue.d.ts","./node_modules/element-plus/es/components/input/src/instance.d.ts","./node_modules/element-plus/es/components/input/index.d.ts","./node_modules/element-plus/es/hooks/use-attrs/index.d.ts","./node_modules/element-plus/es/hooks/use-calc-input-width/index.d.ts","./node_modules/element-plus/es/hooks/use-deprecated/index.d.ts","./node_modules/element-plus/es/hooks/use-draggable/index.d.ts","./node_modules/element-plus/es/hooks/use-focus/index.d.ts","./node_modules/element-plus/es/locale/lang/en.d.ts","./node_modules/element-plus/es/locale/lang/af.d.ts","./node_modules/element-plus/es/locale/lang/ar-eg.d.ts","./node_modules/element-plus/es/locale/lang/ar.d.ts","./node_modules/element-plus/es/locale/lang/az.d.ts","./node_modules/element-plus/es/locale/lang/bg.d.ts","./node_modules/element-plus/es/locale/lang/bn.d.ts","./node_modules/element-plus/es/locale/lang/ca.d.ts","./node_modules/element-plus/es/locale/lang/ckb.d.ts","./node_modules/element-plus/es/locale/lang/cs.d.ts","./node_modules/element-plus/es/locale/lang/da.d.ts","./node_modules/element-plus/es/locale/lang/de.d.ts","./node_modules/element-plus/es/locale/lang/el.d.ts","./node_modules/element-plus/es/locale/lang/eo.d.ts","./node_modules/element-plus/es/locale/lang/es.d.ts","./node_modules/element-plus/es/locale/lang/et.d.ts","./node_modules/element-plus/es/locale/lang/eu.d.ts","./node_modules/element-plus/es/locale/lang/fa.d.ts","./node_modules/element-plus/es/locale/lang/fi.d.ts","./node_modules/element-plus/es/locale/lang/fr.d.ts","./node_modules/element-plus/es/locale/lang/he.d.ts","./node_modules/element-plus/es/locale/lang/hi.d.ts","./node_modules/element-plus/es/locale/lang/hr.d.ts","./node_modules/element-plus/es/locale/lang/hu.d.ts","./node_modules/element-plus/es/locale/lang/hy-am.d.ts","./node_modules/element-plus/es/locale/lang/id.d.ts","./node_modules/element-plus/es/locale/lang/it.d.ts","./node_modules/element-plus/es/locale/lang/ja.d.ts","./node_modules/element-plus/es/locale/lang/kk.d.ts","./node_modules/element-plus/es/locale/lang/km.d.ts","./node_modules/element-plus/es/locale/lang/ko.d.ts","./node_modules/element-plus/es/locale/lang/ku.d.ts","./node_modules/element-plus/es/locale/lang/ky.d.ts","./node_modules/element-plus/es/locale/lang/lo.d.ts","./node_modules/element-plus/es/locale/lang/lt.d.ts","./node_modules/element-plus/es/locale/lang/lv.d.ts","./node_modules/element-plus/es/locale/lang/mg.d.ts","./node_modules/element-plus/es/locale/lang/mn.d.ts","./node_modules/element-plus/es/locale/lang/ms.d.ts","./node_modules/element-plus/es/locale/lang/my.d.ts","./node_modules/element-plus/es/locale/lang/nb-no.d.ts","./node_modules/element-plus/es/locale/lang/nl.d.ts","./node_modules/element-plus/es/locale/lang/no.d.ts","./node_modules/element-plus/es/locale/lang/pa.d.ts","./node_modules/element-plus/es/locale/lang/pl.d.ts","./node_modules/element-plus/es/locale/lang/pt-br.d.ts","./node_modules/element-plus/es/locale/lang/pt.d.ts","./node_modules/element-plus/es/locale/lang/ro.d.ts","./node_modules/element-plus/es/locale/lang/ru.d.ts","./node_modules/element-plus/es/locale/lang/sk.d.ts","./node_modules/element-plus/es/locale/lang/sl.d.ts","./node_modules/element-plus/es/locale/lang/sr.d.ts","./node_modules/element-plus/es/locale/lang/sv.d.ts","./node_modules/element-plus/es/locale/lang/sw.d.ts","./node_modules/element-plus/es/locale/lang/ta.d.ts","./node_modules/element-plus/es/locale/lang/te.d.ts","./node_modules/element-plus/es/locale/lang/th.d.ts","./node_modules/element-plus/es/locale/lang/tk.d.ts","./node_modules/element-plus/es/locale/lang/tr.d.ts","./node_modules/element-plus/es/locale/lang/ug-cn.d.ts","./node_modules/element-plus/es/locale/lang/uk.d.ts","./node_modules/element-plus/es/locale/lang/uz-uz.d.ts","./node_modules/element-plus/es/locale/lang/vi.d.ts","./node_modules/element-plus/es/locale/lang/zh-tw.d.ts","./node_modules/element-plus/es/locale/lang/zh-hk.d.ts","./node_modules/element-plus/es/locale/lang/zh-mo.d.ts","./node_modules/element-plus/es/locale/index.d.ts","./node_modules/element-plus/es/hooks/use-locale/index.d.ts","./node_modules/element-plus/es/hooks/use-namespace/index.d.ts","./node_modules/element-plus/es/hooks/use-lockscreen/index.d.ts","./node_modules/element-plus/es/hooks/use-modal/index.d.ts","./node_modules/element-plus/es/hooks/use-model-toggle/index.d.ts","./node_modules/element-plus/es/hooks/use-prevent-global/index.d.ts","./node_modules/element-plus/es/hooks/use-prop/index.d.ts","./node_modules/element-plus/es/hooks/use-popper/index.d.ts","./node_modules/element-plus/es/hooks/use-same-target/index.d.ts","./node_modules/element-plus/es/hooks/use-teleport/index.d.ts","./node_modules/element-plus/es/hooks/use-throttle-render/index.d.ts","./node_modules/element-plus/es/hooks/use-timeout/index.d.ts","./node_modules/element-plus/es/hooks/use-transition-fallthrough/index.d.ts","./node_modules/element-plus/es/hooks/use-id/index.d.ts","./node_modules/element-plus/es/hooks/use-escape-keydown/index.d.ts","./node_modules/element-plus/es/hooks/use-popper-container/index.d.ts","./node_modules/element-plus/es/hooks/use-intermediate-render/index.d.ts","./node_modules/element-plus/es/hooks/use-delayed-toggle/index.d.ts","./node_modules/element-plus/es/hooks/use-forward-ref/index.d.ts","./node_modules/element-plus/es/hooks/use-z-index/index.d.ts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts","./node_modules/@floating-ui/core/dist/floating-ui.core.d.mts","./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.d.mts","./node_modules/@floating-ui/dom/dist/floating-ui.dom.d.mts","./node_modules/element-plus/es/hooks/use-floating/index.d.ts","./node_modules/element-plus/es/hooks/use-cursor/index.d.ts","./node_modules/element-plus/es/hooks/use-ordered-children/index.d.ts","./node_modules/element-plus/es/hooks/use-size/index.d.ts","./node_modules/element-plus/es/hooks/use-focus-controller/index.d.ts","./node_modules/element-plus/es/hooks/use-composition/index.d.ts","./node_modules/element-plus/es/hooks/use-empty-values/index.d.ts","./node_modules/element-plus/es/hooks/use-aria/index.d.ts","./node_modules/element-plus/es/hooks/index.d.ts","./node_modules/element-plus/es/components/tooltip/src/content.vue.d.ts","./node_modules/element-plus/es/components/tooltip/src/content.d.ts","./node_modules/element-plus/es/components/tooltip/src/trigger.d.ts","./node_modules/element-plus/es/components/tooltip/src/tooltip.d.ts","./node_modules/element-plus/es/components/tooltip/src/tooltip.vue.d.ts","./node_modules/element-plus/es/components/tooltip/src/constants.d.ts","./node_modules/element-plus/es/components/tooltip/index.d.ts","./node_modules/element-plus/es/components/autocomplete/src/autocomplete.d.ts","./node_modules/element-plus/es/components/autocomplete/src/autocomplete.vue.d.ts","./node_modules/element-plus/es/components/autocomplete/index.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar.vue.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar-group.d.ts","./node_modules/element-plus/es/components/avatar/src/constants.d.ts","./node_modules/element-plus/es/components/avatar/src/avatar-group-props.d.ts","./node_modules/element-plus/es/components/avatar/src/instance.d.ts","./node_modules/element-plus/es/components/avatar/index.d.ts","./node_modules/element-plus/es/components/backtop/src/backtop.d.ts","./node_modules/element-plus/es/components/backtop/src/backtop.vue.d.ts","./node_modules/element-plus/es/components/backtop/src/instance.d.ts","./node_modules/element-plus/es/components/backtop/index.d.ts","./node_modules/element-plus/es/components/badge/src/badge.d.ts","./node_modules/element-plus/es/components/badge/src/badge.vue.d.ts","./node_modules/element-plus/es/components/badge/src/instance.d.ts","./node_modules/element-plus/es/components/badge/index.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb.vue.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/breadcrumb-item.vue.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/constants.d.ts","./node_modules/element-plus/es/components/breadcrumb/src/instances.d.ts","./node_modules/element-plus/es/components/breadcrumb/index.d.ts","./node_modules/element-plus/es/components/button/src/button.d.ts","./node_modules/element-plus/es/components/button/src/button.vue.d.ts","./node_modules/element-plus/es/components/button/src/button-group.d.ts","./node_modules/element-plus/es/components/button/src/button-group.vue.d.ts","./node_modules/element-plus/es/components/button/src/constants.d.ts","./node_modules/element-plus/es/components/button/src/instance.d.ts","./node_modules/element-plus/es/components/button/index.d.ts","./node_modules/element-plus/es/components/calendar/src/calendar.d.ts","./node_modules/dayjs/locale/types.d.ts","./node_modules/dayjs/locale/index.d.ts","./node_modules/dayjs/index.d.ts","./node_modules/element-plus/es/components/calendar/src/calendar.vue.d.ts","./node_modules/element-plus/es/components/calendar/src/date-table.d.ts","./node_modules/element-plus/es/components/calendar/src/date-table.vue.d.ts","./node_modules/element-plus/es/components/calendar/src/instance.d.ts","./node_modules/element-plus/es/components/calendar/index.d.ts","./node_modules/element-plus/es/components/card/src/card.d.ts","./node_modules/element-plus/es/components/card/src/card.vue.d.ts","./node_modules/element-plus/es/components/card/src/instance.d.ts","./node_modules/element-plus/es/components/card/index.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel.vue.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel-item.d.ts","./node_modules/element-plus/es/components/carousel/src/carousel-item.vue.d.ts","./node_modules/element-plus/es/components/carousel/src/constants.d.ts","./node_modules/element-plus/es/components/carousel/src/instance.d.ts","./node_modules/element-plus/es/components/carousel/index.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/types.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/node.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/menu.vue.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/instance.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/config.d.ts","./node_modules/element-plus/es/components/cascader-panel/src/index.vue.d.ts","./node_modules/element-plus/es/components/cascader-panel/index.d.ts","./node_modules/element-plus/es/components/tag/src/tag.d.ts","./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","./node_modules/element-plus/es/components/tag/index.d.ts","./node_modules/element-plus/es/components/cascader/src/cascader.d.ts","./node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","./node_modules/element-plus/es/components/cascader/src/instances.d.ts","./node_modules/element-plus/es/components/cascader/index.d.ts","./node_modules/element-plus/es/components/check-tag/src/check-tag.d.ts","./node_modules/element-plus/es/components/check-tag/src/check-tag.vue.d.ts","./node_modules/element-plus/es/components/check-tag/index.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-button.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-group.d.ts","./node_modules/element-plus/es/components/checkbox/src/checkbox-group.vue.d.ts","./node_modules/element-plus/es/components/checkbox/src/constants.d.ts","./node_modules/element-plus/es/components/checkbox/index.d.ts","./node_modules/element-plus/es/components/col/src/col.d.ts","./node_modules/element-plus/es/components/col/src/col.vue.d.ts","./node_modules/element-plus/es/components/col/index.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse.vue.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse-item.d.ts","./node_modules/element-plus/es/components/collapse/src/collapse-item.vue.d.ts","./node_modules/element-plus/es/components/collapse/src/constants.d.ts","./node_modules/element-plus/es/components/collapse/src/instance.d.ts","./node_modules/element-plus/es/components/collapse/index.d.ts","./node_modules/element-plus/es/components/collapse-transition/src/collapse-transition.vue.d.ts","./node_modules/element-plus/es/components/collapse-transition/index.d.ts","./node_modules/@ctrl/tinycolor/dist/interfaces.d.ts","./node_modules/@ctrl/tinycolor/dist/index.d.ts","./node_modules/@ctrl/tinycolor/dist/css-color-names.d.ts","./node_modules/@ctrl/tinycolor/dist/readability.d.ts","./node_modules/@ctrl/tinycolor/dist/to-ms-filter.d.ts","./node_modules/@ctrl/tinycolor/dist/from-ratio.d.ts","./node_modules/@ctrl/tinycolor/dist/format-input.d.ts","./node_modules/@ctrl/tinycolor/dist/random.d.ts","./node_modules/@ctrl/tinycolor/dist/conversion.d.ts","./node_modules/@ctrl/tinycolor/dist/public_api.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/utils/color.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.d.ts","./node_modules/element-plus/es/components/color-picker-panel/src/color-picker-panel.vue.d.ts","./node_modules/element-plus/es/components/color-picker-panel/index.d.ts","./node_modules/element-plus/es/components/color-picker/src/color-picker.d.ts","./node_modules/element-plus/es/components/color-picker/src/color-picker.vue.d.ts","./node_modules/element-plus/es/components/color-picker/index.d.ts","./node_modules/element-plus/es/components/message/src/message.vue.d.ts","./node_modules/element-plus/es/components/message/src/message.d.ts","./node_modules/element-plus/es/components/message/index.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog-content.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog.d.ts","./node_modules/element-plus/es/components/dialog/src/dialog.vue.d.ts","./node_modules/element-plus/es/components/dialog/src/use-dialog.d.ts","./node_modules/element-plus/es/components/dialog/src/constants.d.ts","./node_modules/element-plus/es/components/dialog/index.d.ts","./node_modules/element-plus/es/components/link/src/link.d.ts","./node_modules/element-plus/es/components/link/src/link.vue.d.ts","./node_modules/element-plus/es/components/link/index.d.ts","./node_modules/element-plus/es/components/table/src/store/tree.d.ts","./node_modules/element-plus/es/components/table/src/store/index.d.ts","./node_modules/element-plus/es/components/table/src/util.d.ts","./node_modules/element-plus/es/components/table/src/table/defaults.d.ts","./node_modules/element-plus/es/components/table/src/table-column/defaults.d.ts","./node_modules/element-plus/es/components/table/src/table-header/index.d.ts","./node_modules/element-plus/es/components/table/src/table-layout.d.ts","./node_modules/element-plus/es/components/table/src/table.vue.d.ts","./node_modules/element-plus/es/components/table/src/table-column/index.d.ts","./node_modules/element-plus/es/components/table/src/tablecolumn.d.ts","./node_modules/element-plus/es/components/table/index.d.ts","./node_modules/element-plus/es/components/config-provider/src/config-provider-props.d.ts","./node_modules/element-plus/es/components/config-provider/src/config-provider.d.ts","./node_modules/element-plus/es/components/config-provider/src/constants.d.ts","./node_modules/element-plus/es/components/config-provider/src/hooks/use-global-config.d.ts","./node_modules/element-plus/es/components/config-provider/index.d.ts","./node_modules/element-plus/es/components/container/src/container.vue.d.ts","./node_modules/element-plus/es/components/container/src/aside.vue.d.ts","./node_modules/element-plus/es/components/container/src/footer.vue.d.ts","./node_modules/element-plus/es/components/container/src/header.vue.d.ts","./node_modules/element-plus/es/components/container/src/main.vue.d.ts","./node_modules/element-plus/es/components/container/index.d.ts","./node_modules/element-plus/es/components/countdown/src/countdown.d.ts","./node_modules/element-plus/es/components/countdown/src/countdown.vue.d.ts","./node_modules/element-plus/es/components/countdown/index.d.ts","./node_modules/element-plus/es/components/time-picker/src/common/props.d.ts","./node_modules/element-plus/es/components/time-picker/src/time-picker.d.ts","./node_modules/element-plus/es/components/time-picker/src/common/picker.vue.d.ts","./node_modules/element-plus/es/components/time-picker/src/time-picker-com/panel-time-pick.vue.d.ts","./node_modules/element-plus/es/components/time-picker/src/utils.d.ts","./node_modules/element-plus/es/components/time-picker/src/composables/use-common-picker.d.ts","./node_modules/element-plus/es/components/time-picker/src/constants.d.ts","./node_modules/element-plus/es/components/time-picker/index.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/date-picker-panel.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/constants.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/types.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/props/date-picker-panel.d.ts","./node_modules/element-plus/es/components/date-picker-panel/src/instance.d.ts","./node_modules/element-plus/es/components/date-picker-panel/index.d.ts","./node_modules/element-plus/es/components/date-picker/src/date-picker.d.ts","./node_modules/element-plus/es/components/date-picker/src/props.d.ts","./node_modules/element-plus/es/components/date-picker/src/instance.d.ts","./node_modules/element-plus/es/components/date-picker/index.d.ts","./node_modules/element-plus/es/components/descriptions/src/description.d.ts","./node_modules/element-plus/es/components/descriptions/src/description.vue.d.ts","./node_modules/element-plus/es/components/descriptions/src/description-item.d.ts","./node_modules/element-plus/es/components/descriptions/index.d.ts","./node_modules/element-plus/es/components/divider/src/divider.d.ts","./node_modules/element-plus/es/components/divider/src/divider.vue.d.ts","./node_modules/element-plus/es/components/divider/index.d.ts","./node_modules/element-plus/es/components/drawer/src/drawer.d.ts","./node_modules/element-plus/es/components/drawer/src/drawer.vue.d.ts","./node_modules/element-plus/es/components/drawer/index.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown-item.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown-menu.vue.d.ts","./node_modules/element-plus/es/components/dropdown/src/dropdown.d.ts","./node_modules/element-plus/es/components/dropdown/src/instance.d.ts","./node_modules/element-plus/es/components/dropdown/src/tokens.d.ts","./node_modules/element-plus/es/components/dropdown/index.d.ts","./node_modules/element-plus/es/components/empty/src/empty.d.ts","./node_modules/element-plus/es/components/empty/src/empty.vue.d.ts","./node_modules/element-plus/es/components/empty/src/instance.d.ts","./node_modules/element-plus/es/components/empty/index.d.ts","./node_modules/async-validator/dist-types/interface.d.ts","./node_modules/async-validator/dist-types/index.d.ts","./node_modules/element-plus/es/components/form/src/utils.d.ts","./node_modules/element-plus/es/components/form/src/types.d.ts","./node_modules/element-plus/es/components/form/src/form-item.d.ts","./node_modules/element-plus/es/components/form/src/form.d.ts","./node_modules/element-plus/es/components/form/src/form.vue.d.ts","./node_modules/element-plus/es/components/form/src/form-item.vue.d.ts","./node_modules/element-plus/es/components/form/src/constants.d.ts","./node_modules/element-plus/es/components/form/src/hooks/use-form-common-props.d.ts","./node_modules/element-plus/es/components/form/src/hooks/use-form-item.d.ts","./node_modules/element-plus/es/components/form/src/hooks/index.d.ts","./node_modules/element-plus/es/components/form/index.d.ts","./node_modules/element-plus/es/components/icon/src/icon.d.ts","./node_modules/element-plus/es/components/icon/src/icon.vue.d.ts","./node_modules/element-plus/es/components/icon/index.d.ts","./node_modules/element-plus/es/components/image/src/image.d.ts","./node_modules/element-plus/es/components/image-viewer/src/image-viewer.d.ts","./node_modules/element-plus/es/components/image-viewer/src/image-viewer.vue.d.ts","./node_modules/element-plus/es/components/image-viewer/index.d.ts","./node_modules/element-plus/es/components/image/src/image.vue.d.ts","./node_modules/element-plus/es/components/image/index.d.ts","./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","./node_modules/element-plus/es/components/input-number/src/input-number.vue.d.ts","./node_modules/element-plus/es/components/input-number/index.d.ts","./node_modules/element-plus/es/components/input-tag/src/input-tag.d.ts","./node_modules/element-plus/es/components/input-tag/src/input-tag.vue.d.ts","./node_modules/element-plus/es/components/input-tag/src/instance.d.ts","./node_modules/element-plus/es/components/input-tag/index.d.ts","./node_modules/element-plus/es/components/menu/src/types.d.ts","./node_modules/element-plus/es/components/menu/src/menu.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item.vue.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item-group.vue.d.ts","./node_modules/element-plus/es/components/menu/src/sub-menu.d.ts","./node_modules/element-plus/es/components/menu/src/menu-item-group.d.ts","./node_modules/element-plus/es/components/menu/src/instance.d.ts","./node_modules/element-plus/es/components/menu/src/tokens.d.ts","./node_modules/element-plus/es/components/menu/index.d.ts","./node_modules/element-plus/es/components/overlay/src/overlay.d.ts","./node_modules/element-plus/es/components/overlay/index.d.ts","./node_modules/element-plus/es/components/page-header/src/page-header.d.ts","./node_modules/element-plus/es/components/page-header/src/page-header.vue.d.ts","./node_modules/element-plus/es/components/page-header/index.d.ts","./node_modules/element-plus/es/components/pagination/src/pagination.d.ts","./node_modules/element-plus/es/components/pagination/src/constants.d.ts","./node_modules/element-plus/es/components/pagination/index.d.ts","./node_modules/element-plus/es/components/popconfirm/src/popconfirm.d.ts","./node_modules/element-plus/es/components/popconfirm/src/popconfirm.vue.d.ts","./node_modules/element-plus/es/components/popconfirm/index.d.ts","./node_modules/element-plus/es/components/progress/src/progress.d.ts","./node_modules/element-plus/es/components/progress/src/progress.vue.d.ts","./node_modules/element-plus/es/components/progress/index.d.ts","./node_modules/element-plus/es/components/radio/src/radio.d.ts","./node_modules/element-plus/es/components/radio/src/radio.vue.d.ts","./node_modules/element-plus/es/components/radio/src/radio-button.d.ts","./node_modules/element-plus/es/components/radio/src/radio-button.vue.d.ts","./node_modules/element-plus/es/components/radio/src/radio-group.d.ts","./node_modules/element-plus/es/components/radio/src/radio-group.vue.d.ts","./node_modules/element-plus/es/components/radio/src/constants.d.ts","./node_modules/element-plus/es/components/radio/index.d.ts","./node_modules/element-plus/es/components/rate/src/rate.d.ts","./node_modules/element-plus/es/components/rate/src/rate.vue.d.ts","./node_modules/element-plus/es/components/rate/index.d.ts","./node_modules/element-plus/es/components/result/src/result.d.ts","./node_modules/element-plus/es/components/result/src/result.vue.d.ts","./node_modules/element-plus/es/components/result/index.d.ts","./node_modules/element-plus/es/components/row/src/row.d.ts","./node_modules/element-plus/es/components/row/src/row.vue.d.ts","./node_modules/element-plus/es/components/row/src/constants.d.ts","./node_modules/element-plus/es/components/row/index.d.ts","./node_modules/element-plus/es/components/scrollbar/src/scrollbar.d.ts","./node_modules/element-plus/es/components/scrollbar/src/scrollbar.vue.d.ts","./node_modules/element-plus/es/components/scrollbar/src/thumb.vue.d.ts","./node_modules/element-plus/es/components/scrollbar/src/thumb.d.ts","./node_modules/element-plus/es/components/scrollbar/src/util.d.ts","./node_modules/element-plus/es/components/scrollbar/src/constants.d.ts","./node_modules/element-plus/es/components/scrollbar/index.d.ts","./node_modules/element-plus/es/components/select-v2/src/select.types.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-list.d.ts","./node_modules/element-plus/es/components/virtual-list/src/defaults.d.ts","./node_modules/element-plus/es/components/virtual-list/src/types.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-list.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/fixed-size-grid.d.ts","./node_modules/memoize-one/dist/memoize-one.d.ts","./node_modules/element-plus/es/components/virtual-list/src/hooks/use-cache.d.ts","./node_modules/element-plus/es/components/virtual-list/src/props.d.ts","./node_modules/element-plus/es/components/virtual-list/src/builders/build-grid.d.ts","./node_modules/element-plus/es/components/virtual-list/src/components/dynamic-size-grid.d.ts","./node_modules/element-plus/es/components/virtual-list/index.d.ts","./node_modules/element-plus/es/components/select-v2/src/select-dropdown.d.ts","./node_modules/element-plus/es/components/select-v2/src/select.vue.d.ts","./node_modules/element-plus/es/components/select-v2/src/defaults.d.ts","./node_modules/element-plus/es/components/select-v2/src/token.d.ts","./node_modules/element-plus/es/components/select-v2/src/useprops.d.ts","./node_modules/element-plus/es/components/select/src/select.d.ts","./node_modules/element-plus/es/components/select/src/option.d.ts","./node_modules/element-plus/es/components/select/src/type.d.ts","./node_modules/element-plus/es/components/select/src/select.vue.d.ts","./node_modules/element-plus/es/components/select/src/option.vue.d.ts","./node_modules/element-plus/es/components/select/src/option-group.vue.d.ts","./node_modules/element-plus/es/components/select/src/token.d.ts","./node_modules/element-plus/es/components/select/index.d.ts","./node_modules/element-plus/es/components/select-v2/index.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton.vue.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton-item.d.ts","./node_modules/element-plus/es/components/skeleton/src/skeleton-item.vue.d.ts","./node_modules/element-plus/es/components/skeleton/index.d.ts","./node_modules/element-plus/es/components/slider/src/slider.vue.d.ts","./node_modules/element-plus/es/components/slider/src/marker.d.ts","./node_modules/element-plus/es/components/slider/src/slider.d.ts","./node_modules/element-plus/es/components/slider/src/constants.d.ts","./node_modules/element-plus/es/components/slider/index.d.ts","./node_modules/element-plus/es/components/space/src/space.d.ts","./node_modules/element-plus/es/components/space/src/item.d.ts","./node_modules/element-plus/es/components/space/src/use-space.d.ts","./node_modules/element-plus/es/components/space/index.d.ts","./node_modules/element-plus/es/components/statistic/src/statistic.d.ts","./node_modules/element-plus/es/components/statistic/src/statistic.vue.d.ts","./node_modules/element-plus/es/components/statistic/index.d.ts","./node_modules/element-plus/es/components/steps/src/steps.d.ts","./node_modules/element-plus/es/components/steps/src/steps.vue.d.ts","./node_modules/element-plus/es/components/steps/src/item.d.ts","./node_modules/element-plus/es/components/steps/src/item.vue.d.ts","./node_modules/element-plus/es/components/steps/src/tokens.d.ts","./node_modules/element-plus/es/components/steps/index.d.ts","./node_modules/element-plus/es/components/switch/src/switch.d.ts","./node_modules/element-plus/es/components/switch/src/switch.vue.d.ts","./node_modules/element-plus/es/components/switch/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/constants.d.ts","./node_modules/element-plus/es/components/table-v2/src/types.d.ts","./node_modules/element-plus/es/components/table-v2/src/common.d.ts","./node_modules/element-plus/es/components/table-v2/src/row.d.ts","./node_modules/element-plus/es/components/table-v2/src/grid.d.ts","./node_modules/element-plus/es/components/table-v2/src/table.d.ts","./node_modules/element-plus/es/components/table-v2/src/table-grid.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-scrollbar.d.ts","./node_modules/element-plus/es/components/table-v2/src/table-v2.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/auto-resizer.d.ts","./node_modules/element-plus/es/components/table-v2/src/auto-resizer.d.ts","./node_modules/element-plus/es/components/table-v2/src/private.d.ts","./node_modules/element-plus/es/components/table-v2/src/cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/src/header-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/header.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-columns.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/header.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/row.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/sort-icon.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/expand-icon.d.ts","./node_modules/element-plus/es/components/table-v2/src/components/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-row.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-data.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-styles.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/use-auto-resize.d.ts","./node_modules/element-plus/es/components/table-v2/src/composables/index.d.ts","./node_modules/element-plus/es/components/table-v2/src/use-table.d.ts","./node_modules/element-plus/es/components/table-v2/src/renderers/header-cell.d.ts","./node_modules/element-plus/es/components/table-v2/index.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-pane.vue.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-pane.d.ts","./node_modules/element-plus/es/components/tabs/src/constants.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-bar.vue.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-bar.d.ts","./node_modules/element-plus/es/components/tabs/src/tab-nav.d.ts","./node_modules/element-plus/es/components/tabs/src/tabs.d.ts","./node_modules/element-plus/es/components/tabs/index.d.ts","./node_modules/element-plus/es/components/text/src/text.d.ts","./node_modules/element-plus/es/components/text/src/text.vue.d.ts","./node_modules/element-plus/es/components/text/index.d.ts","./node_modules/element-plus/es/components/time-select/src/time-select.d.ts","./node_modules/element-plus/es/components/time-select/src/time-select.vue.d.ts","./node_modules/element-plus/es/components/time-select/index.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline-item.d.ts","./node_modules/element-plus/es/components/timeline/src/timeline-item.vue.d.ts","./node_modules/element-plus/es/components/timeline/src/tokens.d.ts","./node_modules/element-plus/es/components/timeline/index.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer-panel.vue.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer-panel.d.ts","./node_modules/element-plus/es/components/transfer/src/transfer.vue.d.ts","./node_modules/element-plus/es/components/transfer/index.d.ts","./node_modules/element-plus/es/components/tree/src/tree.d.ts","./node_modules/element-plus/es/components/tree/src/model/usedragnode.d.ts","./node_modules/element-plus/es/components/tree/src/tree.type.d.ts","./node_modules/element-plus/es/components/tree/src/model/tree-store.d.ts","./node_modules/element-plus/es/components/tree/src/model/node.d.ts","./node_modules/element-plus/es/components/tree/src/tree.vue.d.ts","./node_modules/element-plus/es/components/tree/src/instance.d.ts","./node_modules/element-plus/es/components/tree/src/tokens.d.ts","./node_modules/element-plus/es/components/tree/index.d.ts","./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","./node_modules/element-plus/es/components/tree-select/src/instance.d.ts","./node_modules/element-plus/es/components/tree-select/index.d.ts","./node_modules/element-plus/es/components/tree-v2/src/types.d.ts","./node_modules/element-plus/es/components/tree-v2/src/virtual-tree.d.ts","./node_modules/element-plus/es/components/tree-v2/src/tree.vue.d.ts","./node_modules/element-plus/es/components/tree-v2/src/instance.d.ts","./node_modules/element-plus/es/components/tree-v2/index.d.ts","./node_modules/element-plus/es/components/upload/src/ajax.d.ts","./node_modules/element-plus/es/components/upload/src/upload.d.ts","./node_modules/element-plus/es/components/upload/src/upload.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-content.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-content.d.ts","./node_modules/element-plus/es/components/upload/src/upload-list.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-list.d.ts","./node_modules/element-plus/es/components/upload/src/upload-dragger.vue.d.ts","./node_modules/element-plus/es/components/upload/src/upload-dragger.d.ts","./node_modules/element-plus/es/components/upload/src/constants.d.ts","./node_modules/element-plus/es/components/upload/index.d.ts","./node_modules/element-plus/es/components/watermark/src/watermark.d.ts","./node_modules/element-plus/es/components/watermark/src/watermark.vue.d.ts","./node_modules/element-plus/es/components/watermark/index.d.ts","./node_modules/element-plus/es/components/tour/src/content.d.ts","./node_modules/element-plus/es/components/tour/src/types.d.ts","./node_modules/element-plus/es/components/tour/src/tour.d.ts","./node_modules/element-plus/es/components/tour/src/tour.vue.d.ts","./node_modules/element-plus/es/components/tour/src/step.d.ts","./node_modules/element-plus/es/components/tour/src/step.vue.d.ts","./node_modules/element-plus/es/components/tour/index.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor.vue.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor-link.d.ts","./node_modules/element-plus/es/components/anchor/src/anchor-link.vue.d.ts","./node_modules/element-plus/es/components/anchor/index.d.ts","./node_modules/element-plus/es/components/segmented/src/types.d.ts","./node_modules/element-plus/es/components/segmented/src/segmented.vue.d.ts","./node_modules/element-plus/es/components/segmented/src/segmented.d.ts","./node_modules/element-plus/es/components/segmented/index.d.ts","./node_modules/element-plus/es/components/mention/src/types.d.ts","./node_modules/element-plus/es/components/mention/src/helper.d.ts","./node_modules/element-plus/es/components/mention/src/mention.d.ts","./node_modules/element-plus/es/components/mention/src/mention.vue.d.ts","./node_modules/element-plus/es/components/mention/index.d.ts","./node_modules/element-plus/es/components/splitter/src/type.d.ts","./node_modules/element-plus/es/components/splitter/src/splitter.d.ts","./node_modules/element-plus/es/components/splitter/src/splitter.vue.d.ts","./node_modules/element-plus/es/components/splitter/src/split-panel.d.ts","./node_modules/element-plus/es/components/splitter/src/split-panel.vue.d.ts","./node_modules/element-plus/es/components/splitter/index.d.ts","./node_modules/element-plus/es/components/infinite-scroll/src/index.d.ts","./node_modules/element-plus/es/components/infinite-scroll/index.d.ts","./node_modules/element-plus/es/components/loading/src/types.d.ts","./node_modules/element-plus/es/components/loading/src/loading.d.ts","./node_modules/element-plus/es/components/loading/src/service.d.ts","./node_modules/element-plus/es/components/loading/src/directive.d.ts","./node_modules/element-plus/es/components/loading/index.d.ts","./node_modules/element-plus/es/components/message-box/src/message-box.type.d.ts","./node_modules/element-plus/es/components/message-box/src/messagebox.d.ts","./node_modules/element-plus/es/components/message-box/index.d.ts","./node_modules/element-plus/es/components/notification/src/notification.vue.d.ts","./node_modules/element-plus/es/components/notification/src/notification.d.ts","./node_modules/element-plus/es/components/notification/index.d.ts","./node_modules/element-plus/es/components/popover/src/popover.d.ts","./node_modules/element-plus/es/components/popover/src/popover.vue.d.ts","./node_modules/element-plus/es/components/popover/src/directive.d.ts","./node_modules/element-plus/es/components/popover/index.d.ts","./node_modules/element-plus/es/components/index.d.ts","./node_modules/element-plus/es/defaults.d.ts","./node_modules/element-plus/es/directives/click-outside/index.d.ts","./node_modules/element-plus/es/directives/repeat-click/index.d.ts","./node_modules/element-plus/es/directives/trap-focus/index.d.ts","./node_modules/normalize-wheel-es/index.d.ts","./node_modules/element-plus/es/directives/mousewheel/index.d.ts","./node_modules/element-plus/es/directives/index.d.ts","./node_modules/element-plus/es/make-installer.d.ts","./node_modules/element-plus/es/index.d.ts","./src/utils/feedback.ts","./src/layout/default/components/header/user-drop-down.vue","./src/layout/default/components/header/index.vue","./src/layout/default/components/main.vue","./src/layout/default/components/sidebar/logo.vue","./src/utils/util.ts","./src/layout/default/components/sidebar/menu-item.vue","./src/layout/default/components/sidebar/menu.vue","./src/layout/default/components/sidebar/side.vue","./src/layout/default/components/sidebar/index.vue","./src/layout/default/index.vue","./src/views/error/components/error.vue","./src/views/error/404.vue","./src/views/error/403.vue","./node_modules/@element-plus/icons-vue/dist/types/components/add-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/aim.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/alarm-clock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/apple.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-down-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-down.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-left-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-right-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-up-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/arrow-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/avatar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/back.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/baseball.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/basketball.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bell-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bell.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bicycle.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bottom.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/bowl.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/briefcase.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/brush-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/brush.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/burger.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/calendar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/camera-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/camera.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-bottom.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/caret-top.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cellphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-dot-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-line-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-line-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chat-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/check.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cherry.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chicken.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/chrome-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-check-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-check.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-close-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-close.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-plus-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/circle-plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/clock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/close-bold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/close.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coffee-cup.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coffee.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coin.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cold-drink.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/collection-tag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/collection.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/comment.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/compass.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/connection.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/coordinate.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/copy-document.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/cpu.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/credit-card.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/crop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-arrow-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/d-caret.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-analysis.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-board.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/data-line.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dessert.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/discount.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dish-dot.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/dish.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-add.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-copy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document-remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/document.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/download.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/drizzling.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/edit-pen.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/edit.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/eleme-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/eleme.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/element-plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/expand.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/failed.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/female.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/files.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/film.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/filter.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/finished.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/first-aid-kit.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/flag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fold.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-add.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-checked.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-delete.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-opened.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder-remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/folder.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/food.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/football.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fork-spoon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/fries.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/full-screen.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-square-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goblet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/gold-medal.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goods-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/goods.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/grape.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/grid.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/guide.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/handbag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/headset.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/help-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/help.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/hide.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/histogram.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/home-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/hot-water.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/house.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-round.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream-square.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-cream.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-drink.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ice-tea.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/info-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/iphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/key.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/knife-fork.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lightning.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/link.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/list.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/loading.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location-information.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/lollipop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/magic-stick.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/magnet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/male.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/management.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/map-location.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/medal.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/memo.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/menu.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/message-box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/message.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mic.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/microphone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/milk-tea.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/minus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/money.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/monitor.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/moon-night.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/moon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/more-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/more.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mostly-cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mouse.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mug.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mute-notification.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/mute.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/no-smoking.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/notebook.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/notification.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/odometer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/office-building.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/open.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/operation.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/opportunity.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/orange.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/paperclip.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/partly-cloudy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pear.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/phone-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/phone.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture-rounded.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/picture.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pie-chart.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/place.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/platform.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/plus.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pointer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/position.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/postcard.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/pouring.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/present.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/price-tag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/printer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/promotion.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/quartz-watch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/question-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/rank.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/reading-lamp.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/reading.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refresh.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/refrigerator.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/remove-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/remove.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/scale-to-original.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/school.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/scissor.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/search.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/select.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sell.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/semi-select.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/service.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/set-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/setting.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/share.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ship.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shop.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-bag.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart-full.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-cart.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/shopping-trolley.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/smoking.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/soccer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sold-out.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort-down.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort-up.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sort.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/stamp.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/star-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/star.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/stopwatch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/success-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sugar.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/suitcase-line.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/suitcase.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunny.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunrise.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/sunset.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch-button.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/switch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/takeaway-box.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/ticket.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/tickets.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/timer.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/toilet-paper.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/tools.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top-left.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top-right.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/top.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trend-charts.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trophy-base.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/trophy.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/turn-off.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/umbrella.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/unlock.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/upload-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/upload.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/user-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/user.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/van.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-camera-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-camera.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-pause.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/video-play.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/view.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wallet-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wallet.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warn-triangle-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warning-filled.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/warning.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/watch.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/watermelon.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/wind-power.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/zoom-in.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/zoom-out.vue.d.ts","./node_modules/@element-plus/icons-vue/dist/types/components/index.d.ts","./node_modules/@element-plus/icons-vue/dist/types/index.d.ts","./src/hooks/uselockfn.ts","./src/layout/components/footer.vue","./src/views/account/login.vue","./src/views/account/change-password.vue","./src/utils/wecomoauthpostmessage.ts","./src/views/account/bind-work-wechat.vue","./src/views/user/setting.vue","./src/api/doctor.ts","./src/views/doctor/progress.vue","./src/api/decoration.ts","./src/views/decoration/component/widgets/index.ts","./src/views/decoration/component/pages/preview-pc.vue","./src/views/decoration/pc_details.vue","./src/api/fans.ts","./src/views/fans/h5.vue","./src/api/tcm.ts","./src/api/order.ts","./src/api/channel/weapp.ts","./src/hooks/usepaging.ts","./src/utils/perm.ts","./node_modules/echarts/types/dist/echarts.d.ts","./node_modules/echarts/index.d.ts","./src/views/tcm/diagnosis/components/bloodrecordlist.vue","./src/views/tcm/diagnosis/components/dietrecordlist.vue","./src/views/tcm/diagnosis/components/exerciserecordlist.vue","./src/views/tcm/diagnosis/components/caserecordlist.vue","./src/views/tcm/diagnosis/components/callrecordpanel.vue","./src/utils/im-business-message-parse.ts","./src/views/tcm/diagnosis/components/imchatrecordpanel.vue","./src/views/tcm/diagnosis/components/assignlogpanel.vue","./src/views/tcm/diagnosis/components/appointmentrecordpanel.vue","./src/views/patient/reception/components/notetimeline.vue","./src/api/medicine.ts","./src/components/medicine-name-select/index.vue","./src/utils/diabetes-discovery-display.ts","./node_modules/html2canvas/dist/types/core/logger.d.ts","./node_modules/html2canvas/dist/types/core/cache-storage.d.ts","./node_modules/html2canvas/dist/types/core/context.d.ts","./node_modules/html2canvas/dist/types/css/layout/bounds.d.ts","./node_modules/html2canvas/dist/types/dom/document-cloner.d.ts","./node_modules/html2canvas/dist/types/css/syntax/tokenizer.d.ts","./node_modules/html2canvas/dist/types/css/syntax/parser.d.ts","./node_modules/html2canvas/dist/types/css/types/index.d.ts","./node_modules/html2canvas/dist/types/css/ipropertydescriptor.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-clip.d.ts","./node_modules/html2canvas/dist/types/css/itypedescriptor.d.ts","./node_modules/html2canvas/dist/types/css/types/color.d.ts","./node_modules/html2canvas/dist/types/css/types/length-percentage.d.ts","./node_modules/html2canvas/dist/types/css/types/image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-origin.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-position.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-repeat.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/background-size.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-radius.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-style.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/border-width.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/direction.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/display.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/float.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/letter-spacing.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/line-break.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-image.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-position.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/list-style-type.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/overflow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/overflow-wrap.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-align.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/position.d.ts","./node_modules/html2canvas/dist/types/css/types/length.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-shadow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-transform.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/transform.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/transform-origin.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/visibility.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/word-break.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/z-index.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/opacity.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/text-decoration-line.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-family.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-weight.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-variant.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/font-style.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/content.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/counter-increment.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/counter-reset.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/duration.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/quotes.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/box-shadow.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/paint-order.d.ts","./node_modules/html2canvas/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts","./node_modules/html2canvas/dist/types/css/index.d.ts","./node_modules/html2canvas/dist/types/css/layout/text.d.ts","./node_modules/html2canvas/dist/types/dom/text-container.d.ts","./node_modules/html2canvas/dist/types/dom/element-container.d.ts","./node_modules/html2canvas/dist/types/render/vector.d.ts","./node_modules/html2canvas/dist/types/render/bezier-curve.d.ts","./node_modules/html2canvas/dist/types/render/path.d.ts","./node_modules/html2canvas/dist/types/render/bound-curves.d.ts","./node_modules/html2canvas/dist/types/render/effects.d.ts","./node_modules/html2canvas/dist/types/render/stacking-context.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/canvas-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/image-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/svg-element-container.d.ts","./node_modules/html2canvas/dist/types/dom/replaced-elements/index.d.ts","./node_modules/html2canvas/dist/types/render/renderer.d.ts","./node_modules/html2canvas/dist/types/render/canvas/canvas-renderer.d.ts","./node_modules/html2canvas/dist/types/index.d.ts","./node_modules/jspdf/types/index.d.ts","./src/components/tcm-prescription/index.vue","./src/api/patient.ts","./src/utils/diagnosis-sync-events.ts","./src/views/tcm/diagnosis/edit.vue","./src/views/tcm/diagnosis/detail.vue","./node_modules/dayjs/plugin/isoweek.d.ts","./src/views/tcm/diagnosis/appointment.vue","./node_modules/trtc-sdk-v5/plugins/cdn-streaming/cdn-streaming.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/device-detector/device-detector.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/virtual-background/virtual-background.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/watermark/watermark.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/beauty/beauty.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/basic-beauty/basic-beauty.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/cross-room/cross-room.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/custom-encryption/custom-encryption.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/video-effect/video-mixer/video-mixer.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/small-stream-auto-switcher/small-stream-auto-switcher.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/chorus/chorus.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/lebplayer/lebplayer.esm.d.ts","./node_modules/trtc-sdk-v5/plugins/realtime-transcriber/realtime-transcriber.esm.d.ts","./node_modules/trtc-sdk-v5/index.d.ts","./src/views/tcm/diagnosis/components/assistantwatchcalldialog.vue","./src/views/tcm/diagnosis/index_h5.vue","./src/router/routes.ts","./src/router/index.ts","./src/utils/request/cancel.ts","./src/utils/request/type.d.ts","./src/utils/request/axios.ts","./src/utils/wecombindguard.ts","./src/utils/request/index.ts","./src/api/app.ts","./src/stores/modules/app.ts","./src/api/chat.ts","./src/components/chat-notify-toast/index.vue","./src/app.vue","./src/permission.ts","./src/install/index.ts","./src/main.ts","./src/api/article.ts","./src/api/consumer.ts","./src/api/file.ts","./src/api/finance.ts","./src/api/message.ts","./src/api/qywx-msg.ts","./src/api/qywx.ts","./src/api/stats.ts","./src/api/app/recharge.ts","./src/api/channel/h5.ts","./src/api/channel/open_setting.ts","./src/api/channel/wx_oa.ts","./src/api/org/department.ts","./src/api/org/post.ts","./src/api/perms/admin.ts","./src/api/perms/menu.ts","./src/api/perms/role.ts","./src/api/setting/dict.ts","./src/api/setting/pay.ts","./src/api/setting/search.ts","./src/api/setting/storage.ts","./src/api/setting/user.ts","./src/api/setting/website.ts","./src/api/tools/code.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/chat.vue.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/chatheader.vue.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/hooks/usechatheader.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/components/chatheader/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/login.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/loginstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/avatar.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/constants/avatar.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/avatar/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/userpicker/type.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/userpicker/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/basecomp/view/view.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/basecomp/view/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/chatsetting/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/uikitmodalstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/uikitmodalstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/type.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/uikitmodal.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/useroommodal/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/uikitmodal/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/base.d.ts","./node_modules/@tencentcloud/tuiroom-engine-js/node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/tuiroom-engine-js/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/device.d.ts","./node_modules/@tencentcloud/chat/index.d.ts","./node_modules/@tencentcloud/chat-uikit-engine/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/message.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/useofflinepushinfo.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useofflinepushinfo/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/engine.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/search.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/contact.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/conversation.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/call.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/chatsetting.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/types.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/live.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/stream.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/videomixer.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/audience.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/seat.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/monitor.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/coguest.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/cohost.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/battle.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/barrage.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/room.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/participant.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/beauty.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/virtualbackground.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/user.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/devicestate/devicestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/devicestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/useroomengine.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/audiosettingpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/videosettingpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/rtc.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/common/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/barragestate/barragestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/barragestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/battlestate/battlestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/battlestate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cogueststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/cohoststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/cohoststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveaudiencestate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/liveliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/livemonitorstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/utils/eventcenter.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/liveseatstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/videomixerstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/videomixerstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/barrageinputh5.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barrageinput/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/barragelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/camerabutton/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/coguestpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/cohostpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/liveaudiencelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/livemonitorview.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livemonitorview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/livescenepanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/liveview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.vue.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/micbutton/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/streammixer/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/live/live.d.ts","./node_modules/tuikit-atomicx-vue3/dist/types/asr.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/asrstate/asrstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/freebeautystate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/freebeautystate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/roomparticipantstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/roomstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/virtualbackgroundstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/virtualbackgroundstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomparticipantview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/roomview/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/scheduleroompanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/virtualbackgroundpanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/freebeautypanel/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/room/room.d.ts","./node_modules/tuikit-atomicx-vue3/dist/i18n/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/contactlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/conversationlist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/messageinput/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/hooks/usemessageactions.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/messagelist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/components/search/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/c2csettingstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/c2csettingstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/contactliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/contactliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/conversationliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/conversationliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/groupsettingstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/groupsettingstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/messageactionstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageactionstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/type.d.ts","./node_modules/orderedmap/dist/index.d.ts","./node_modules/prosemirror-model/dist/index.d.ts","./node_modules/prosemirror-transform/dist/index.d.ts","./node_modules/prosemirror-view/dist/index.d.ts","./node_modules/prosemirror-state/dist/index.d.ts","./node_modules/@tiptap/pm/state/dist/index.d.ts","./node_modules/@tiptap/pm/model/dist/index.d.ts","./node_modules/@tiptap/pm/view/dist/index.d.ts","./node_modules/@tiptap/core/dist/eventemitter.d.ts","./node_modules/@tiptap/pm/transform/dist/index.d.ts","./node_modules/@tiptap/core/dist/inputrule.d.ts","./node_modules/@tiptap/core/dist/pasterule.d.ts","./node_modules/@tiptap/core/dist/node.d.ts","./node_modules/@tiptap/core/dist/mark.d.ts","./node_modules/@tiptap/core/dist/extension.d.ts","./node_modules/@tiptap/core/dist/types.d.ts","./node_modules/@tiptap/core/dist/extensionmanager.d.ts","./node_modules/@tiptap/core/dist/nodepos.d.ts","./node_modules/@tiptap/core/dist/extensions/clipboardtextserializer.d.ts","./node_modules/@tiptap/core/dist/commands/blur.d.ts","./node_modules/@tiptap/core/dist/commands/clearcontent.d.ts","./node_modules/@tiptap/core/dist/commands/clearnodes.d.ts","./node_modules/@tiptap/core/dist/commands/command.d.ts","./node_modules/@tiptap/core/dist/commands/createparagraphnear.d.ts","./node_modules/@tiptap/core/dist/commands/cut.d.ts","./node_modules/@tiptap/core/dist/commands/deletecurrentnode.d.ts","./node_modules/@tiptap/core/dist/commands/deletenode.d.ts","./node_modules/@tiptap/core/dist/commands/deleterange.d.ts","./node_modules/@tiptap/core/dist/commands/deleteselection.d.ts","./node_modules/@tiptap/core/dist/commands/enter.d.ts","./node_modules/@tiptap/core/dist/commands/exitcode.d.ts","./node_modules/@tiptap/core/dist/commands/extendmarkrange.d.ts","./node_modules/@tiptap/core/dist/commands/first.d.ts","./node_modules/@tiptap/core/dist/commands/focus.d.ts","./node_modules/@tiptap/core/dist/commands/foreach.d.ts","./node_modules/@tiptap/core/dist/commands/insertcontent.d.ts","./node_modules/@tiptap/core/dist/commands/insertcontentat.d.ts","./node_modules/@tiptap/core/dist/commands/join.d.ts","./node_modules/@tiptap/core/dist/commands/joinitembackward.d.ts","./node_modules/@tiptap/core/dist/commands/joinitemforward.d.ts","./node_modules/@tiptap/core/dist/commands/jointextblockbackward.d.ts","./node_modules/@tiptap/core/dist/commands/jointextblockforward.d.ts","./node_modules/@tiptap/core/dist/commands/keyboardshortcut.d.ts","./node_modules/@tiptap/core/dist/commands/lift.d.ts","./node_modules/@tiptap/core/dist/commands/liftemptyblock.d.ts","./node_modules/@tiptap/core/dist/commands/liftlistitem.d.ts","./node_modules/@tiptap/core/dist/commands/newlineincode.d.ts","./node_modules/@tiptap/core/dist/commands/resetattributes.d.ts","./node_modules/@tiptap/core/dist/commands/scrollintoview.d.ts","./node_modules/@tiptap/core/dist/commands/selectall.d.ts","./node_modules/@tiptap/core/dist/commands/selectnodebackward.d.ts","./node_modules/@tiptap/core/dist/commands/selectnodeforward.d.ts","./node_modules/@tiptap/core/dist/commands/selectparentnode.d.ts","./node_modules/@tiptap/core/dist/commands/selecttextblockend.d.ts","./node_modules/@tiptap/core/dist/commands/selecttextblockstart.d.ts","./node_modules/@tiptap/core/dist/commands/setcontent.d.ts","./node_modules/@tiptap/core/dist/commands/setmark.d.ts","./node_modules/@tiptap/core/dist/commands/setmeta.d.ts","./node_modules/@tiptap/core/dist/commands/setnode.d.ts","./node_modules/@tiptap/core/dist/commands/setnodeselection.d.ts","./node_modules/@tiptap/core/dist/commands/settextselection.d.ts","./node_modules/@tiptap/core/dist/commands/sinklistitem.d.ts","./node_modules/@tiptap/core/dist/commands/splitblock.d.ts","./node_modules/@tiptap/core/dist/commands/splitlistitem.d.ts","./node_modules/@tiptap/core/dist/commands/togglelist.d.ts","./node_modules/@tiptap/core/dist/commands/togglemark.d.ts","./node_modules/@tiptap/core/dist/commands/togglenode.d.ts","./node_modules/@tiptap/core/dist/commands/togglewrap.d.ts","./node_modules/@tiptap/core/dist/commands/undoinputrule.d.ts","./node_modules/@tiptap/core/dist/commands/unsetallmarks.d.ts","./node_modules/@tiptap/core/dist/commands/unsetmark.d.ts","./node_modules/@tiptap/core/dist/commands/updateattributes.d.ts","./node_modules/@tiptap/core/dist/commands/wrapin.d.ts","./node_modules/@tiptap/core/dist/commands/wrapinlist.d.ts","./node_modules/@tiptap/core/dist/commands/index.d.ts","./node_modules/@tiptap/core/dist/extensions/commands.d.ts","./node_modules/@tiptap/core/dist/extensions/drop.d.ts","./node_modules/@tiptap/core/dist/extensions/editable.d.ts","./node_modules/@tiptap/core/dist/extensions/focusevents.d.ts","./node_modules/@tiptap/core/dist/extensions/keymap.d.ts","./node_modules/@tiptap/core/dist/extensions/paste.d.ts","./node_modules/@tiptap/core/dist/extensions/tabindex.d.ts","./node_modules/@tiptap/core/dist/extensions/index.d.ts","./node_modules/@tiptap/core/dist/editor.d.ts","./node_modules/@tiptap/core/dist/commandmanager.d.ts","./node_modules/@tiptap/core/dist/helpers/combinetransactionsteps.d.ts","./node_modules/@tiptap/core/dist/helpers/createchainablestate.d.ts","./node_modules/@tiptap/core/dist/helpers/createdocument.d.ts","./node_modules/@tiptap/core/dist/helpers/createnodefromcontent.d.ts","./node_modules/@tiptap/core/dist/helpers/defaultblockat.d.ts","./node_modules/@tiptap/core/dist/helpers/findchildren.d.ts","./node_modules/@tiptap/core/dist/helpers/findchildreninrange.d.ts","./node_modules/@tiptap/core/dist/helpers/findparentnode.d.ts","./node_modules/@tiptap/core/dist/helpers/findparentnodeclosesttopos.d.ts","./node_modules/@tiptap/core/dist/helpers/generatehtml.d.ts","./node_modules/@tiptap/core/dist/helpers/generatejson.d.ts","./node_modules/@tiptap/core/dist/helpers/generatetext.d.ts","./node_modules/@tiptap/core/dist/helpers/getattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getattributesfromextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/getchangedranges.d.ts","./node_modules/@tiptap/core/dist/helpers/getdebugjson.d.ts","./node_modules/@tiptap/core/dist/helpers/getextensionfield.d.ts","./node_modules/@tiptap/core/dist/helpers/gethtmlfromfragment.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarkattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarkrange.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarksbetween.d.ts","./node_modules/@tiptap/core/dist/helpers/getmarktype.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodeatposition.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodeattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getnodetype.d.ts","./node_modules/@tiptap/core/dist/helpers/getrenderedattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/getschema.d.ts","./node_modules/@tiptap/core/dist/helpers/getschemabyresolvedextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/getschematypebyname.d.ts","./node_modules/@tiptap/core/dist/helpers/getschematypenamebyname.d.ts","./node_modules/@tiptap/core/dist/helpers/getsplittedattributes.d.ts","./node_modules/@tiptap/core/dist/helpers/gettext.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextbetween.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextcontentfromnodes.d.ts","./node_modules/@tiptap/core/dist/helpers/gettextserializersfromschema.d.ts","./node_modules/@tiptap/core/dist/helpers/injectextensionattributestoparserule.d.ts","./node_modules/@tiptap/core/dist/helpers/isactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isatendofnode.d.ts","./node_modules/@tiptap/core/dist/helpers/isatstartofnode.d.ts","./node_modules/@tiptap/core/dist/helpers/isextensionrulesenabled.d.ts","./node_modules/@tiptap/core/dist/helpers/islist.d.ts","./node_modules/@tiptap/core/dist/helpers/ismarkactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeactive.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeempty.d.ts","./node_modules/@tiptap/core/dist/helpers/isnodeselection.d.ts","./node_modules/@tiptap/core/dist/helpers/istextselection.d.ts","./node_modules/@tiptap/core/dist/helpers/postodomrect.d.ts","./node_modules/@tiptap/core/dist/helpers/resolvefocusposition.d.ts","./node_modules/@tiptap/core/dist/helpers/rewriteunknowncontent.d.ts","./node_modules/@tiptap/core/dist/helpers/selectiontoinsertionend.d.ts","./node_modules/@tiptap/core/dist/helpers/splitextensions.d.ts","./node_modules/@tiptap/core/dist/helpers/index.d.ts","./node_modules/@tiptap/core/dist/inputrules/markinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/nodeinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/textblocktypeinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/textinputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/wrappinginputrule.d.ts","./node_modules/@tiptap/core/dist/inputrules/index.d.ts","./node_modules/@tiptap/core/dist/nodeview.d.ts","./node_modules/@tiptap/core/dist/pasterules/markpasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/nodepasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/textpasterule.d.ts","./node_modules/@tiptap/core/dist/pasterules/index.d.ts","./node_modules/@tiptap/core/dist/tracker.d.ts","./node_modules/@tiptap/core/dist/utilities/callorreturn.d.ts","./node_modules/@tiptap/core/dist/utilities/caninsertnode.d.ts","./node_modules/@tiptap/core/dist/utilities/createstyletag.d.ts","./node_modules/@tiptap/core/dist/utilities/deleteprops.d.ts","./node_modules/@tiptap/core/dist/utilities/elementfromstring.d.ts","./node_modules/@tiptap/core/dist/utilities/escapeforregex.d.ts","./node_modules/@tiptap/core/dist/utilities/findduplicates.d.ts","./node_modules/@tiptap/core/dist/utilities/fromstring.d.ts","./node_modules/@tiptap/core/dist/utilities/isemptyobject.d.ts","./node_modules/@tiptap/core/dist/utilities/isfunction.d.ts","./node_modules/@tiptap/core/dist/utilities/isios.d.ts","./node_modules/@tiptap/core/dist/utilities/ismacos.d.ts","./node_modules/@tiptap/core/dist/utilities/isnumber.d.ts","./node_modules/@tiptap/core/dist/utilities/isplainobject.d.ts","./node_modules/@tiptap/core/dist/utilities/isregexp.d.ts","./node_modules/@tiptap/core/dist/utilities/issafari.d.ts","./node_modules/@tiptap/core/dist/utilities/isstring.d.ts","./node_modules/@tiptap/core/dist/utilities/mergeattributes.d.ts","./node_modules/@tiptap/core/dist/utilities/mergedeep.d.ts","./node_modules/@tiptap/core/dist/utilities/minmax.d.ts","./node_modules/@tiptap/core/dist/utilities/objectincludes.d.ts","./node_modules/@tiptap/core/dist/utilities/removeduplicates.d.ts","./node_modules/@tiptap/core/dist/utilities/index.d.ts","./node_modules/@tiptap/core/dist/index.d.ts","./node_modules/tippy.js/index.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu-plugin.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/bubble-menu.d.ts","./node_modules/@tiptap/extension-bubble-menu/dist/index.d.ts","./node_modules/@tiptap/vue-3/dist/bubblemenu.d.ts","./node_modules/@tiptap/vue-3/dist/editor.d.ts","./node_modules/@tiptap/vue-3/dist/editorcontent.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/floating-menu-plugin.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/floating-menu.d.ts","./node_modules/@tiptap/extension-floating-menu/dist/index.d.ts","./node_modules/@tiptap/vue-3/dist/floatingmenu.d.ts","./node_modules/@tiptap/vue-3/dist/nodeviewcontent.d.ts","./node_modules/@tiptap/vue-3/dist/nodeviewwrapper.d.ts","./node_modules/@tiptap/vue-3/dist/useeditor.d.ts","./node_modules/@tiptap/vue-3/dist/vuenodeviewrenderer.d.ts","./node_modules/@tiptap/vue-3/dist/vuerenderer.d.ts","./node_modules/@tiptap/vue-3/dist/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/messageinputstate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageinputstate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/messageliststate.d.ts","./node_modules/tuikit-atomicx-vue3/dist/states/messageliststate/index.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/chat/chat.d.ts","./node_modules/tuikit-atomicx-vue3/dist/subentry/chat/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/constants/interface.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/helpers.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/options.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/typescript/t.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/node_modules/i18next/index.d.mts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/uselanguageprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/languageprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/languageprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/uikitprovider.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/contexts/uikitprovider/useuikitprovider.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/providers/uikitprovider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/button/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/dialog.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dialog/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/drawer/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/dropdownitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/dropdown/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/icon/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/en-us/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/zh-cn/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/i18n/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/messagebox/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/badge/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/input/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/select/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/option/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/types.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/switch/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/slider/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/swiperitem.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/swiper/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/toast/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/watermark/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/type.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.vue.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/popup/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/usecomponent.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/hooks/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/utils/utils.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/components/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/loading/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/directives/index.d.ts","./node_modules/@tencentcloud/uikit-base-component-vue3/dist/index.d.ts","./node_modules/@tencentcloud/chat-uikit-vue3/dist/index.d.ts","./src/components/sidetab.vue","./src/components/app-link/index.vue","./src/components/chat-dialog/chatmessageitem.vue","./src/utils/call-local-recorder.ts","./src/utils/call-video-screenshot.ts","./src/utils/tuicall-error.ts","./src/utils/im-call-hangup-detect.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/@tencentcloud/call-uikit-vue/types/index.d.ts","./node_modules/@tencentcloud/call-engine-js/index.d.ts","./src/components/chat-dialog/index.vue","./src/components/color-picker/index.vue","./src/components/daterange-picker/index.vue","./src/components/del-wrap/index.vue","./src/components/dict-value/index.vue","./node_modules/@wangeditor/editor/dist/editor/src/utils/browser-polyfill.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/utils/node-polyfill.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/locale/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/register-builtin-modules/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/init-default-config/index.d.ts","./node_modules/slate/dist/create-editor.d.ts","./node_modules/slate/dist/interfaces/element.d.ts","./node_modules/slate/dist/interfaces/node.d.ts","./node_modules/slate/dist/interfaces/editor.d.ts","./node_modules/slate/dist/interfaces/location.d.ts","./node_modules/slate/dist/interfaces/operation.d.ts","./node_modules/slate/dist/interfaces/path.d.ts","./node_modules/slate/dist/interfaces/path-ref.d.ts","./node_modules/slate/dist/interfaces/point.d.ts","./node_modules/slate/dist/interfaces/point-ref.d.ts","./node_modules/slate/dist/interfaces/range.d.ts","./node_modules/slate/dist/interfaces/range-ref.d.ts","./node_modules/slate/dist/interfaces/custom-types.d.ts","./node_modules/slate/dist/interfaces/text.d.ts","./node_modules/slate/dist/transforms/general.d.ts","./node_modules/slate/dist/transforms/node.d.ts","./node_modules/slate/dist/transforms/selection.d.ts","./node_modules/slate/dist/transforms/text.d.ts","./node_modules/slate/dist/transforms/index.d.ts","./node_modules/slate/dist/index.d.ts","./node_modules/snabbdom/build/htmldomapi.d.ts","./node_modules/snabbdom/build/helpers/attachto.d.ts","./node_modules/snabbdom/build/modules/style.d.ts","./node_modules/snabbdom/build/modules/eventlisteners.d.ts","./node_modules/snabbdom/build/modules/attributes.d.ts","./node_modules/snabbdom/build/modules/class.d.ts","./node_modules/snabbdom/build/modules/props.d.ts","./node_modules/snabbdom/build/modules/dataset.d.ts","./node_modules/snabbdom/build/vnode.d.ts","./node_modules/snabbdom/build/hooks.d.ts","./node_modules/snabbdom/build/modules/module.d.ts","./node_modules/snabbdom/build/init.d.ts","./node_modules/snabbdom/build/thunk.d.ts","./node_modules/snabbdom/build/is.d.ts","./node_modules/snabbdom/build/tovnode.d.ts","./node_modules/snabbdom/build/h.d.ts","./node_modules/snabbdom/build/jsx.d.ts","./node_modules/snabbdom/build/index.d.ts","./node_modules/@types/event-emitter/index.d.ts","./node_modules/dom7/dom7.d.ts","./node_modules/@wangeditor/core/dist/core/src/utils/dom.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/config/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/editor/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/render/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/to-html/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/parse-html/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/bar/toolbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/register.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/baseclass.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/panel-and-modal/modal.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/index.d.ts","./node_modules/slate-history/dist/history.d.ts","./node_modules/slate-history/dist/history-editor.d.ts","./node_modules/slate-history/dist/with-history.d.ts","./node_modules/slate-history/dist/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/create-editor.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/create-toolbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/create/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/utils/key.d.ts","./node_modules/@wangeditor/core/dist/core/src/text-area/textarea.d.ts","./node_modules/@wangeditor/core/dist/core/src/menus/bar/hoverbar.d.ts","./node_modules/@wangeditor/core/dist/core/src/editor/dom-editor.d.ts","./node_modules/@uppy/utils/types/index.d.ts","./node_modules/@uppy/core/types/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/interface.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/createuploader.d.ts","./node_modules/@wangeditor/core/dist/core/src/upload/index.d.ts","./node_modules/i18next/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/i18n/index.d.ts","./node_modules/@wangeditor/core/dist/core/src/index.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/boot.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/utils/dom.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/create.d.ts","./node_modules/@wangeditor/editor/dist/editor/src/index.d.ts","./node_modules/vuedraggable/src/vuedraggable.d.ts","./src/components/popup/index.vue","./src/components/material/file.vue","./src/components/material/hook.ts","./src/components/material/preview.vue","./src/components/material/index.vue","./src/components/material/picker.vue","./src/components/editor/index.vue","./src/components/export-data/index.vue","./src/components/footer-btns/index.vue","./src/components/icon/index.ts","./src/components/icon/svg-icon.vue","./src/components/icon/index.vue","./src/components/icon/picker.vue","./src/components/image-contain/index.vue","./src/components/link/index.ts","./src/components/link/article-list.vue","./src/components/link/custom-link.vue","./src/components/link/mini-program.vue","./src/components/link/shop-pages.vue","./src/components/link/index.vue","./src/components/link/picker.vue","./src/components/overflow-tooltip/index.vue","./src/components/pagination/index.vue","./src/components/popover-input/index.vue","./src/components/upload/index.vue","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/call.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/error.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/log.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/const/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallservice.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/icallstore.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituiglobal.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/ituistore.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/interface/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/uidesign.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/callservice/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/locales/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/tuicallservice/index.d.ts","./node_modules/@trtc/calls-uikit-vue/types/index.d.ts","./src/components/video-call/index.vue","./src/hooks/usedictoptions.ts","./node_modules/vue-clipboard3/dist/esm/index.d.ts","./src/install/directives/copy.ts","./src/install/directives/perms.ts","./node_modules/echarts/types/dist/shared.d.ts","./node_modules/echarts/types/dist/charts.d.ts","./node_modules/echarts/charts.d.ts","./node_modules/echarts/types/dist/components.d.ts","./node_modules/echarts/components.d.ts","./node_modules/echarts/types/dist/core.d.ts","./node_modules/echarts/core.d.ts","./node_modules/echarts/types/dist/features.d.ts","./node_modules/echarts/features.d.ts","./node_modules/echarts/types/dist/renderers.d.ts","./node_modules/echarts/renderers.d.ts","./src/install/plugins/echart.ts","./node_modules/element-plus/es/components/base/style/css.d.ts","./node_modules/element-plus/es/components/overlay/style/css.d.ts","./node_modules/element-plus/es/components/dialog/style/css.d.ts","./src/install/plugins/element.ts","./node_modules/@highlightjs/vue-plugin/dist/vue.d.ts","./node_modules/highlight.js/types/index.d.ts","./src/install/plugins/hljs.ts","./src/stores/index.ts","./src/install/plugins/pinia.ts","./src/router/guard/index.ts","./src/install/plugins/router.ts","./src/install/plugins/tuikit.ts","./src/router/guard/init.ts","./src/utils/checkhttps.ts","./src/utils/env.ts","./src/utils/getexposetype.ts","./src/views/app/recharge/index.vue","./src/views/article/column/edit.vue","./src/views/article/column/index.vue","./src/views/article/lists/edit.vue","./src/views/article/lists/index.vue","./src/views/channel/h5.vue","./src/views/channel/open_setting.vue","./src/views/channel/weapp.vue","./src/views/channel/wx_oa/config.vue","./src/views/channel/wx_oa/menu_com/usemenuoa.ts","./src/views/channel/wx_oa/menu_com/oa-menu-form.vue","./src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue","./src/views/channel/wx_oa/menu_com/oa-attr.vue","./src/views/channel/wx_oa/menu_com/oa-phone.vue","./src/views/channel/wx_oa/menu.vue","./src/views/channel/wx_oa/reply/edit.vue","./src/views/channel/wx_oa/reply/default_reply.vue","./src/views/channel/wx_oa/reply/follow_reply.vue","./src/views/channel/wx_oa/reply/keyword_reply.vue","./src/views/chat/components/messagebubble.vue","./src/views/chat/components/sendpanel.vue","./src/views/chat/index.vue","./src/views/consumer/assistant/edit.vue","./src/views/consumer/assistant/index.vue","./src/views/consumer/components/account-adjust.vue","./src/views/consumer/doctor/edit.vue","./src/views/consumer/doctor/index.vue","./src/views/consumer/doctor/paiban.vue","./src/views/consumer/lists/detail.vue","./src/views/consumer/lists/index.vue","./src/views/consumer/prescription/index.vue","./src/views/consumer/prescription/list.vue","./src/views/consumer/prescription/order_list.vue","./src/views/decoration/pc.vue","./src/views/decoration/component/pages/menu.vue","./src/views/decoration/component/tabbar/mobile/attr.vue","./src/views/decoration/component/decoration-img.vue","./src/views/decoration/component/tabbar/mobile/content.vue","./src/views/decoration/component/tabbar/mobile/index.ts","./src/views/decoration/tabbar.vue","./src/views/decoration/component/add-nav.vue","./src/views/decoration/component/pages/attr-setting.vue","./src/views/decoration/component/pages/preview.vue","./src/views/decoration/component/tabbar/pc/menu-set.vue","./src/views/decoration/component/tabbar/pc/attr.vue","./src/views/decoration/component/tabbar/pc/content.vue","./src/views/decoration/component/tabbar/pc/index.ts","./src/views/decoration/component/widgets/banner/options.ts","./src/views/decoration/component/widgets/banner/attr.vue","./src/views/decoration/component/widgets/banner/content.vue","./src/views/decoration/component/widgets/banner/index.ts","./src/views/decoration/component/widgets/customer-service/options.ts","./src/views/decoration/component/widgets/customer-service/attr.vue","./src/views/decoration/component/widgets/customer-service/content.vue","./src/views/decoration/component/widgets/customer-service/index.ts","./src/views/decoration/component/widgets/middle-banner/options.ts","./src/views/decoration/component/widgets/middle-banner/attr.vue","./src/views/decoration/component/widgets/middle-banner/content.vue","./src/views/decoration/component/widgets/middle-banner/index.ts","./src/views/decoration/component/widgets/my-service/options.ts","./src/views/decoration/component/widgets/my-service/attr.vue","./src/views/decoration/component/widgets/my-service/content.vue","./src/views/decoration/component/widgets/my-service/index.ts","./src/views/decoration/component/widgets/nav/options.ts","./src/views/decoration/component/widgets/nav/attr.vue","./src/views/decoration/component/widgets/nav/content.vue","./src/views/decoration/component/widgets/nav/index.ts","./src/views/decoration/component/widgets/news/options.ts","./src/views/decoration/component/widgets/news/attr.vue","./src/views/decoration/component/widgets/news/content.vue","./src/views/decoration/component/widgets/news/index.ts","./src/views/decoration/component/widgets/page-meta/options.ts","./src/views/decoration/component/widgets/page-meta/attr.vue","./src/views/decoration/component/widgets/page-meta/content.vue","./src/views/decoration/component/widgets/page-meta/index.ts","./src/views/decoration/component/widgets/pc-banner/options.ts","./src/views/decoration/component/widgets/pc-banner/content.vue","./src/views/decoration/component/widgets/pc-banner/index.ts","./src/views/decoration/component/widgets/search/options.ts","./src/views/decoration/component/widgets/search/attr.vue","./src/views/decoration/component/widgets/search/content.vue","./src/views/decoration/component/widgets/search/index.ts","./src/views/decoration/component/widgets/user-banner/options.ts","./src/views/decoration/component/widgets/user-banner/attr.vue","./src/views/decoration/component/widgets/user-banner/content.vue","./src/views/decoration/component/widgets/user-banner/index.ts","./src/views/decoration/component/widgets/user-info/options.ts","./src/views/decoration/component/widgets/user-info/attr.vue","./src/views/decoration/component/widgets/user-info/content.vue","./src/views/decoration/component/widgets/user-info/index.ts","./src/views/decoration/pages/index.vue","./src/views/decoration/style/components/theme-picker.vue","./src/views/decoration/style/components/mobile-style.vue","./src/views/decoration/style/style.vue","./src/views/dev_tools/components/relations-add.vue","./src/views/dev_tools/code/edit.vue","./src/views/dev_tools/components/code-preview.vue","./src/views/dev_tools/components/data-table.vue","./src/views/dev_tools/code/index.vue","./src/views/doctor/dept-tongji.vue","./src/views/doctor/medicine.vue","./src/views/doctor/roster.vue","./src/views/doctor/tongji.vue","./src/views/fans/index.vue","./src/views/fans/qywx.vue","./src/views/finance/balance_details.vue","./src/views/finance/recharge_record.vue","./src/views/finance/component/refund-log.vue","./src/views/finance/refund_record.vue","./src/views/finance/account_cost/edit.vue","./src/views/finance/account_cost/index.vue","./src/views/material/index.vue","./src/views/message/notice/edit.vue","./src/views/message/notice/index.vue","./src/views/message/short_letter/edit.vue","./src/views/message/short_letter/index.vue","./src/views/order/index.vue","./src/views/organization/department/edit.vue","./src/views/organization/department/index.vue","./src/views/organization/post/edit.vue","./src/views/organization/post/index.vue","./src/views/patient/reception/index.vue","./src/views/permission/admin/edit.vue","./src/views/permission/admin/index.vue","./src/views/permission/menu/edit.vue","./src/views/permission/menu/index.vue","./src/views/permission/role/auth.vue","./src/views/permission/role/edit.vue","./src/views/permission/role/index.vue","./src/views/setting/dict/data/edit.vue","./src/views/setting/dict/data/index.vue","./src/views/setting/dict/type/edit.vue","./src/views/setting/dict/type/index.vue","./src/views/setting/pay/config/edit.vue","./src/views/setting/pay/config/index.vue","./src/views/setting/pay/method/index.vue","./src/views/setting/search/index.vue","./src/views/setting/storage/edit.vue","./src/views/setting/storage/index.vue","./src/views/setting/system/cache.vue","./src/views/setting/system/environment.vue","./src/views/setting/system/journal.vue","./src/views/setting/system/scheduled_task/edit.vue","./src/views/setting/system/scheduled_task/index.vue","./src/views/setting/user/login_register.vue","./src/views/setting/user/setup.vue","./src/views/setting/website/filing.vue","./src/views/setting/website/information.vue","./src/views/setting/website/protocol.vue","./src/views/setting/website/statistics.vue","./node_modules/vue-echarts/node_modules/vue-demi/lib/index.d.ts","./node_modules/vue-echarts/dist/index.d.ts","./src/views/stats/conversion/index.vue","./src/views/tcm/appointment/list.vue","./src/views/tcm/appointment/components/prescription-drawer.vue","./src/views/tcm/diagnosis/add.vue","./src/views/tcm/diagnosis/index.vue","./src/views/tcm/follow/index.vue","./src/views/template/component/file.vue","./src/views/template/component/icon.vue","./src/views/template/component/link.vue","./src/views/template/component/overflow.vue","./src/views/template/component/popover_input.vue","./src/views/template/component/rich_text.vue","./src/views/template/component/upload.vue","./src/views/test/patient-call.vue","./src/views/workbench/index.vue","./components.d.ts","./auto-imports.d.ts","./typings/index.d.ts","./typings/router.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/types/internal/lightningcssoptions.d.ts","./node_modules/sass/types/deprecations.d.ts","./node_modules/sass/types/util/promise_or.d.ts","./node_modules/sass/types/importer.d.ts","./node_modules/sass/types/logger/source_location.d.ts","./node_modules/sass/types/logger/source_span.d.ts","./node_modules/sass/types/logger/index.d.ts","./node_modules/immutable/dist/immutable.d.ts","./node_modules/sass/types/value/boolean.d.ts","./node_modules/sass/types/value/calculation.d.ts","./node_modules/sass/types/value/color.d.ts","./node_modules/sass/types/value/function.d.ts","./node_modules/sass/types/value/list.d.ts","./node_modules/sass/types/value/map.d.ts","./node_modules/sass/types/value/mixin.d.ts","./node_modules/sass/types/value/number.d.ts","./node_modules/sass/types/value/string.d.ts","./node_modules/sass/types/value/argument_list.d.ts","./node_modules/sass/types/value/index.d.ts","./node_modules/sass/types/options.d.ts","./node_modules/sass/types/compile.d.ts","./node_modules/sass/types/exception.d.ts","./node_modules/sass/types/legacy/exception.d.ts","./node_modules/sass/types/legacy/plugin_this.d.ts","./node_modules/sass/types/legacy/function.d.ts","./node_modules/sass/types/legacy/importer.d.ts","./node_modules/sass/types/legacy/options.d.ts","./node_modules/sass/types/legacy/render.d.ts","./node_modules/sass/types/index.d.ts","./node_modules/vite/types/internal/csspreprocessoroptions.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","./node_modules/vue/compiler-sfc/index.d.mts","./node_modules/@vitejs/plugin-vue/dist/index.d.mts","./node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","./node_modules/@vue/babel-plugin-jsx/dist/index.d.mts","./node_modules/@vitejs/plugin-vue-jsx/dist/index.d.mts","./node_modules/mlly/dist/index.d.ts","./node_modules/unimport/dist/shared/unimport.cavrr9sh.d.mts","./node_modules/unimport/dist/shared/unimport.czoa5cgj.d.mts","./node_modules/strip-literal/node_modules/js-tokens/index.d.ts","./node_modules/strip-literal/dist/index.d.mts","./node_modules/unimport/dist/index.d.mts","./node_modules/unplugin-utils/dist/index.d.ts","./node_modules/unplugin-auto-import/dist/types-bch7f5uk.d.ts","./node_modules/unplugin-auto-import/dist/vite.d.ts","./node_modules/webpack-virtual-modules/lib/index.d.ts","./node_modules/unplugin/dist/index.d.ts","./node_modules/unplugin-vue-components/dist/types-cfwifa2k.d.ts","./node_modules/unplugin-vue-components/dist/resolvers.d.ts","./node_modules/unplugin-vue-components/dist/vite.d.ts","./node_modules/vite-plugin-style-import/dist/index.d.ts","./node_modules/@types/svgo/index.d.ts","./node_modules/vite-plugin-svg-icons/dist/index.d.ts","./node_modules/vite-plugin-vue-setup-extend/dist/index.d.ts","./vite.config.ts"],"fileIdsList":[[103,107,113,2315,2318,2324,2372,2389,2390],[103,107,113,1104,1447,1523,1556,1968,1969,1970,1990,1991,1992,1993,1994,2076,2077,2079,2080,2081,2082,2083,2084,2086,2087,2088,2089,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2115,2318,2324,2372,2389,2390],[92,2324,2372,2389,2390],[103,104,107,113,2315,2324,2372,2389,2390],[95,2324,2372,2389,2390],[2324,2372,2389,2390],[740,2324,2372,2389,2390],[741,2324,2372,2389,2390],[740,741,742,743,744,745,746,747,748,2324,2372,2389,2390],[103,107,113,2315,2324,2372,2389,2390],[1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,2324,2372,2389,2390],[1412,2324,2372,2389,2390],[632,2324,2372,2389,2390],[633,634,2324,2372,2389,2390],[524,2324,2372,2389,2390],[518,520,2324,2372,2389,2390],[508,518,519,521,522,523,2324,2372,2389,2390],[518,2324,2372,2389,2390],[508,518,2324,2372,2389,2390],[509,510,511,512,513,514,515,516,517,2324,2372,2389,2390],[509,513,514,517,518,521,2324,2372,2389,2390],[509,510,511,512,513,514,515,516,517,518,519,521,522,2324,2372,2389,2390],[508,509,510,511,512,513,514,515,516,517,2324,2372,2389,2390],[1610,2324,2372,2389,2390],[1987,2324,2372,2389,2390],[1978,1979,1983,1984,2324,2372,2389,2390],[1978,2324,2372,2389,2390],[1975,1976,1977,2324,2372,2389,2390],[1978,1985,1986,2324,2372,2389,2390],[1978,1983,2324,2372,2389,2390],[1979,1980,1981,1982,2324,2372,2389,2390],[1585,2324,2372,2389,2390],[1587,1588,2324,2372,2389,2390],[1586,1589,1908,1966,2324,2372,2389,2390],[1607,2324,2372,2389,2390],[103,107,113,1939,1940,2315,2324,2372,2389,2390],[103,107,113,1939,2315,2324,2372,2389,2390],[103,107,113,1922,2315,2324,2372,2389,2390],[103,107,113,1924,2315,2324,2372,2389,2390],[103,107,113,1924,1925,2315,2324,2372,2389,2390],[1922,2324,2372,2389,2390],[103,107,113,1927,2315,2324,2372,2389,2390],[103,107,113,1929,2315,2324,2372,2389,2390],[103,107,113,1929,1930,1931,2315,2324,2372,2389,2390],[1960,2324,2372,2389,2390],[1923,1926,1928,1932,1933,1938,1941,1943,1944,1945,1947,1948,1952,1954,1956,1959,1961,1962,2324,2372,2389,2390],[103,107,113,1942,2315,2324,2372,2389,2390],[1934,1935,2324,2372,2389,2390],[1936,1937,2324,2372,2389,2390],[1957,1958,2324,2372,2389,2390],[103,107,113,1957,2315,2324,2372,2389,2390],[1949,1950,1951,2324,2372,2389,2390],[103,107,113,1949,2315,2324,2372,2389,2390],[103,107,113,1946,2315,2324,2372,2389,2390],[103,107,113,1953,2315,2324,2372,2389,2390],[103,107,113,1955,2315,2324,2372,2389,2390],[103,107,113,1964,2315,2324,2372,2389,2390],[1915,1921,1963,1965,2324,2372,2389,2390],[1916,1917,2324,2372,2389,2390],[103,107,113,1916,2315,2324,2372,2389,2390],[103,107,113,1914,1915,2315,2324,2372,2389,2390],[103,107,113,1909,1918,2315,2324,2372,2389,2390],[103,107,113,1909,1914,2315,2324,2372,2389,2390],[1914,2324,2372,2389,2390],[1919,1920,2324,2372,2389,2390],[1910,1911,1912,1913,2324,2372,2389,2390],[1910,1911,1912,2324,2372,2389,2390],[1910,2324,2372,2389,2390],[1910,1911,2324,2372,2389,2390],[1718,1728,1796,2324,2372,2389,2390],[1725,1726,1727,1728,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1718,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1784,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1785,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1786,1885,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1885,2324,2372,2389,2390],[1718,1719,1720,1721,1728,1729,1730,1795,2324,2372,2389,2390],[1718,1723,1724,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1796,1885,2324,2372,2389,2390],[1718,1719,1720,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1796,1885,2324,2372,2389,2390],[1727,2324,2372,2389,2390],[1727,1787,2324,2372,2389,2390],[1718,1727,2324,2372,2389,2390],[1731,1788,1789,1790,1791,1792,1793,1794,2324,2372,2389,2390],[1718,1719,1722,2324,2372,2389,2390],[1718,2324,2372,2389,2390],[1719,1728,2324,2372,2389,2390],[1719,2324,2372,2389,2390],[1714,1718,1728,2324,2372,2389,2390],[1728,2324,2372,2389,2390],[1718,1719,2324,2372,2389,2390],[1722,1728,2324,2372,2389,2390],[1719,1728,1796,2324,2372,2389,2390],[1719,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2324,2372,2389,2390],[1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,2324,2372,2389,2390],[1720,2324,2372,2389,2390],[1718,1719,1728,2324,2372,2389,2390],[1725,1726,1727,1728,2324,2372,2389,2390],[1723,1724,1725,1726,1727,1728,1730,1795,1796,1797,1849,1855,1856,1860,1861,1884,2324,2372,2389,2390],[1850,1851,1852,1853,1854,2324,2372,2389,2390],[1719,1723,1728,2324,2372,2389,2390],[1723,2324,2372,2389,2390],[1719,1723,1728,1796,2324,2372,2389,2390],[1718,1719,1723,1724,1725,1726,1727,1728,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1796,1885,2324,2372,2389,2390],[1720,1728,1796,2324,2372,2389,2390],[1857,1858,1859,2324,2372,2389,2390],[1719,1724,1728,2324,2372,2389,2390],[1724,2324,2372,2389,2390],[1718,1719,1720,1722,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1796,1885,2324,2372,2389,2390],[1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,2324,2372,2389,2390],[1718,1720,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1886,2324,2372,2389,2390],[1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1887,2324,2372,2389,2390],[1887,1888,2324,2372,2389,2390],[1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1893,2324,2372,2389,2390],[1893,1894,2324,2372,2389,2390],[1714,2324,2372,2389,2390],[1717,2324,2372,2389,2390],[1715,2324,2372,2389,2390],[1716,2324,2372,2389,2390],[103,107,113,1716,1717,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1886,1889,2315,2324,2372,2389,2390],[103,107,113,1718,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2315,2324,2372,2389,2390],[103,107,113,1891,2315,2324,2372,2389,2390],[103,107,113,1716,1717,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1886,1895,2315,2324,2372,2389,2390],[1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1890,1891,1892,1896,1897,1898,1899,1900,1901,2324,2372,2389,2390],[103,107,113,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,1891,2315,2324,2372,2389,2390],[103,107,113,1719,1720,1725,1726,1727,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1885,2315,2324,2372,2389,2390],[2113,2324,2372,2389,2390],[2104,2105,2109,2110,2324,2372,2389,2390],[2104,2324,2372,2389,2390],[2101,2102,2103,2324,2372,2389,2390],[2104,2111,2112,2324,2372,2389,2390],[2104,2109,2324,2372,2389,2390],[2105,2106,2107,2108,2324,2372,2389,2390],[127,2324,2372,2389,2390],[179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,2324,2372,2389,2390],[115,117,118,119,120,121,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,118,119,120,121,122,123,124,125,126,127,2324,2372,2389,2390],[116,117,118,119,120,121,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,119,120,121,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,120,121,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,121,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,122,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,123,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,122,124,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,122,123,125,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,122,123,124,126,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,122,123,124,125,127,2324,2372,2389,2390],[115,116,117,118,119,120,121,122,123,124,125,126,2324,2372,2389,2390],[2324,2369,2370,2372,2389,2390],[2324,2371,2372,2389,2390],[2372,2389,2390],[2324,2372,2377,2389,2390,2407],[2324,2372,2373,2378,2383,2389,2390,2392,2404,2415],[2324,2372,2373,2374,2383,2389,2390,2392],[2319,2320,2321,2324,2372,2389,2390],[2324,2372,2375,2389,2390,2416],[2324,2372,2376,2377,2384,2389,2390,2393],[2324,2372,2377,2389,2390,2404,2412],[2324,2372,2378,2380,2383,2389,2390,2392],[2324,2371,2372,2379,2389,2390],[2324,2372,2380,2381,2389,2390],[2324,2372,2382,2383,2389,2390],[2324,2371,2372,2383,2389,2390],[2324,2372,2383,2384,2385,2389,2390,2404,2415],[2324,2372,2383,2384,2385,2389,2390,2399,2404,2407],[2324,2365,2372,2380,2383,2386,2389,2390,2392,2404,2415],[2324,2372,2383,2384,2386,2387,2389,2390,2392,2404,2412,2415],[2324,2372,2386,2388,2389,2390,2404,2412,2415],[2322,2323,2324,2325,2326,2327,2328,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421],[2324,2372,2383,2389,2390],[2324,2372,2389,2390,2391,2415],[2324,2372,2380,2383,2389,2390,2392,2404],[2324,2372,2389,2390,2393],[2324,2372,2389,2390,2394],[2324,2371,2372,2389,2390,2395],[2324,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421],[2324,2372,2389,2390,2397],[2324,2372,2389,2390,2398],[2324,2372,2383,2389,2390,2399,2400],[2324,2372,2389,2390,2399,2401,2416,2418],[2324,2372,2384,2389,2390],[2324,2372,2383,2389,2390,2404,2405,2407],[2324,2372,2389,2390,2406,2407],[2324,2372,2389,2390,2404,2405],[2324,2372,2389,2390,2407],[2324,2372,2389,2390,2408],[2324,2369,2372,2389,2390,2404,2409,2415],[2324,2372,2383,2389,2390,2410,2411],[2324,2372,2389,2390,2410,2411],[2324,2372,2377,2389,2390,2392,2404,2412],[2324,2372,2389,2390,2413],[2324,2372,2389,2390,2392,2414],[2324,2372,2386,2389,2390,2398,2415],[2324,2372,2377,2389,2390,2416],[2324,2372,2389,2390,2404,2417],[2324,2372,2389,2390,2391,2418],[2324,2372,2389,2390,2419],[2324,2365,2372,2389,2390],[2324,2365,2372,2383,2385,2389,2390,2395,2404,2407,2415,2417,2418,2420],[2324,2372,2389,2390,2404,2421],[2324,2372,2389,2390,2422],[2063,2324,2372,2389,2390],[2324,2372,2389,2390,2480,2487],[2324,2372,2389,2390,2480,2484],[95,2324,2372,2389,2390,2486],[2324,2372,2389,2390,2483],[94,95,96,2324,2372,2389,2390],[97,2324,2372,2389,2390],[95,96,97,2324,2372,2389,2390,2448,2481,2482],[94,2324,2372,2389,2390],[94,99,100,102,2324,2372,2389,2390],[99,100,101,102,2324,2372,2389,2390],[103,107,108,113,2315,2324,2372,2389,2390],[2019,2041,2043,2324,2372,2389,2390],[2019,2040,2042,2043,2055,2324,2372,2389,2390],[2040,2042,2043,2047,2324,2372,2389,2390],[2056,2057,2324,2372,2389,2390],[2019,2040,2043,2047,2059,2060,2061,2324,2372,2389,2390],[2019,2038,2040,2041,2042,2324,2372,2389,2390],[2068,2324,2372,2389,2390],[92,2042,2043,2044,2045,2046,2051,2058,2062,2067,2069,2324,2372,2389,2390],[2041,2324,2372,2389,2390],[2040,2041,2042,2324,2372,2389,2390],[2041,2047,2048,2050,2324,2372,2389,2390],[2019,2040,2043,2324,2372,2389,2390],[2040,2043,2324,2372,2389,2390],[2040,2041,2043,2049,2324,2372,2389,2390],[2019,2037,2043,2324,2372,2389,2390],[2040,2324,2372,2389,2390],[2019,2043,2324,2372,2389,2390],[2064,2065,2324,2372,2389,2390],[2065,2066,2324,2372,2389,2390],[2064,2324,2372,2389,2390],[2039,2324,2372,2389,2390],[2070,2324,2372,2389,2390],[2019,2070,2072,2324,2372,2389,2390],[92,1997,1998,1999,2019,2070,2071,2073,2324,2372,2389,2390],[833,2324,2372,2389,2390],[686,2324,2372,2389,2390],[685,2324,2372,2389,2390],[687,2324,2372,2389,2390],[2121,2324,2372,2389,2390],[2123,2324,2372,2389,2390],[2125,2324,2372,2389,2390],[2127,2324,2372,2389,2390],[1434,2324,2372,2389,2390],[2129,2324,2372,2389,2390],[2120,2324,2372,2389,2390],[500,501,502,2324,2372,2389,2390],[101,103,107,113,500,502,2315,2324,2372,2389,2390],[101,103,107,113,501,2315,2324,2372,2389,2390],[500,504,505,506,2324,2372,2389,2390],[103,107,113,500,2315,2324,2372,2389,2390],[103,107,113,500,504,2315,2324,2372,2389,2390],[505,2324,2372,2389,2390],[500,1058,1059,1061,2324,2372,2389,2390],[103,107,113,1060,2315,2324,2372,2389,2390],[103,107,113,500,1059,2315,2324,2372,2389,2390],[103,107,113,1058,2315,2324,2372,2389,2390],[500,652,653,2324,2372,2389,2390],[103,107,113,500,535,539,651,653,2315,2324,2372,2389,2390],[103,107,113,500,539,651,652,2315,2324,2372,2389,2390],[500,655,656,657,658,659,660,2324,2372,2389,2390],[103,107,113,500,535,2315,2324,2372,2389,2390],[103,104,107,113,500,1104,2315,2324,2372,2389,2390],[101,103,107,113,174,500,2315,2324,2372,2389,2390],[101,103,107,113,655,2315,2324,2372,2389,2390],[103,107,113,655,2315,2324,2372,2389,2390],[656,657,2324,2372,2389,2390],[500,662,663,664,2324,2372,2389,2390],[103,107,113,662,2315,2324,2372,2389,2390],[663,2324,2372,2389,2390],[500,666,667,668,2324,2372,2389,2390],[103,107,113,666,2315,2324,2372,2389,2390],[667,2324,2372,2389,2390],[500,670,671,672,673,674,675,2324,2372,2389,2390],[103,107,113,500,2315,2318,2324,2372,2389,2390],[103,107,113,672,2315,2318,2324,2372,2389,2390],[103,107,113,670,2315,2324,2372,2389,2390],[671,673,2324,2372,2389,2390],[500,677,678,680,681,682,2324,2372,2389,2390],[103,107,113,500,677,2315,2324,2372,2389,2390],[103,107,113,679,2315,2324,2372,2389,2390],[103,107,113,174,500,2315,2324,2372,2389,2390],[103,107,113,677,2315,2324,2372,2389,2390],[678,680,2324,2372,2389,2390],[500,684,688,691,2324,2372,2389,2390],[103,107,113,684,687,2315,2324,2372,2389,2390],[103,107,113,500,687,2315,2324,2372,2389,2390],[103,107,113,687,689,2315,2324,2372,2389,2390],[688,690,2324,2372,2389,2390],[500,693,694,695,2324,2372,2389,2390],[103,107,113,693,2315,2324,2372,2389,2390],[694,2324,2372,2389,2390],[500,697,698,699,700,701,702,2324,2372,2389,2390],[103,107,113,699,2315,2324,2372,2389,2390],[103,107,113,697,2315,2324,2372,2389,2390],[698,700,2324,2372,2389,2390],[500,704,707,708,709,2324,2372,2389,2390],[103,107,113,500,704,2315,2324,2372,2389,2390],[103,107,113,704,705,707,708,2315,2324,2372,2389,2390],[706,709,2324,2372,2389,2390],[103,107,113,704,2315,2324,2372,2389,2390],[704,2324,2372,2389,2390],[103,107,113,500,705,2315,2324,2372,2389,2390],[500,714,715,716,2324,2372,2389,2390],[103,107,113,174,500,535,644,710,713,2315,2324,2372,2389,2390],[103,107,113,500,535,710,714,2315,2324,2372,2389,2390],[715,2324,2372,2389,2390],[500,718,719,2324,2372,2389,2390],[103,107,113,500,719,2315,2324,2372,2389,2390],[103,107,113,718,2315,2324,2372,2389,2390],[500,721,722,723,724,725,726,2324,2372,2389,2390],[103,107,113,721,2315,2324,2372,2389,2390],[103,107,113,174,500,644,721,725,2315,2324,2372,2389,2390],[103,107,113,724,1104,2315,2324,2372,2389,2390],[103,107,113,174,500,644,722,2315,2324,2372,2389,2390],[103,107,113,724,2315,2324,2372,2389,2390],[500,728,729,2324,2372,2389,2390],[103,107,113,500,729,2315,2324,2372,2389,2390],[103,107,113,728,2315,2324,2372,2389,2390],[500,738,2324,2372,2389,2390],[500,731,732,733,734,735,736,2324,2372,2389,2390],[103,107,113,500,731,2315,2324,2372,2389,2390],[103,107,113,500,733,2315,2324,2372,2389,2390],[103,107,113,731,2315,2324,2372,2389,2390],[732,734,2324,2372,2389,2390],[500,751,752,2324,2372,2389,2390],[103,107,113,500,749,750,752,2315,2324,2372,2389,2390],[103,107,113,539,750,751,2315,2324,2372,2389,2390],[749,2324,2372,2389,2390],[500,754,755,2324,2372,2389,2390],[103,107,113,174,500,644,651,749,755,2315,2324,2372,2389,2390],[103,107,113,750,754,2315,2324,2372,2389,2390],[500,780,781,782,783,2324,2372,2389,2390],[103,107,113,500,611,683,696,759,765,768,779,2315,2324,2372,2389,2390],[103,107,113,500,611,759,780,1104,2315,2324,2372,2389,2390],[103,107,113,780,2315,2324,2372,2389,2390],[103,107,113,487,644,782,1104,2315,2324,2372,2389,2390],[500,785,786,787,788,789,2324,2372,2389,2390],[500,791,792,2324,2372,2389,2390],[103,107,113,500,687,792,2315,2324,2372,2389,2390],[103,107,113,687,791,2315,2324,2372,2389,2390],[500,802,803,804,805,806,2324,2372,2389,2390],[103,107,113,644,2315,2324,2372,2389,2390],[103,104,107,113,500,801,1104,2315,2324,2372,2389,2390],[802,2324,2372,2389,2390],[103,107,113,500,801,804,2315,2324,2372,2389,2390],[500,808,809,810,2324,2372,2389,2390],[103,104,107,113,500,801,807,1104,2315,2324,2372,2389,2390],[808,2324,2372,2389,2390],[103,107,113,500,801,804,1104,2315,2324,2372,2389,2390],[500,812,813,814,2324,2372,2389,2390],[103,107,113,174,500,813,2315,2324,2372,2389,2390],[103,107,113,812,2315,2324,2372,2389,2390],[500,761,762,763,764,2324,2372,2389,2390],[103,107,113,500,760,762,2315,2324,2372,2389,2390],[103,107,113,761,2315,2324,2372,2389,2390],[92,2132,2133,2324,2372,2389,2390],[500,816,817,2324,2372,2389,2390],[103,107,113,500,817,2315,2324,2372,2389,2390],[103,107,113,816,2315,2324,2372,2389,2390],[500,819,820,2324,2372,2389,2390],[103,107,113,500,765,820,2315,2324,2372,2389,2390],[103,107,113,765,819,2315,2324,2372,2389,2390],[500,822,823,824,825,826,827,2324,2372,2389,2390],[103,107,113,500,525,535,683,2315,2324,2372,2389,2390],[103,107,113,500,644,651,683,1104,2315,2324,2372,2389,2390],[822,2324,2372,2389,2390],[103,107,113,535,2315,2324,2372,2389,2390],[500,829,830,831,2324,2372,2389,2390],[103,107,113,829,2315,2324,2372,2389,2390],[830,2324,2372,2389,2390],[500,836,837,838,839,840,841,844,2324,2372,2389,2390],[103,107,113,836,2315,2324,2372,2389,2390],[103,107,113,174,500,836,2315,2324,2372,2389,2390],[103,107,113,836,837,2315,2324,2372,2389,2390],[103,107,113,174,500,836,837,2315,2324,2372,2389,2390],[103,107,113,500,836,837,838,2315,2324,2372,2389,2390],[842,843,2324,2372,2389,2390],[103,107,113,174,487,2315,2324,2372,2389,2390],[103,107,113,174,487,500,834,835,837,838,2315,2324,2372,2389,2390],[103,107,113,500,836,837,2315,2324,2372,2389,2390],[500,846,847,2324,2372,2389,2390],[103,107,113,500,847,2315,2324,2372,2389,2390],[103,107,113,846,2315,2324,2372,2389,2390],[500,850,851,2324,2372,2389,2390],[103,107,113,500,851,2315,2324,2372,2389,2390],[103,107,113,850,2315,2324,2372,2389,2390],[500,849,853,2324,2372,2389,2390],[103,107,113,500,853,2315,2324,2372,2389,2390],[103,107,113,849,852,2315,2324,2372,2389,2390],[503,507,535,539,651,654,661,665,669,676,683,692,696,703,710,713,717,720,727,730,737,739,753,756,759,765,768,779,784,790,793,801,807,811,815,818,821,828,832,845,848,852,854,857,861,871,873,876,879,882,885,893,896,899,903,910,922,935,936,941,946,950,953,959,962,995,1003,1006,1009,1014,1019,1028,1031,1036,1047,1050,1057,1062,1066,1071,1077,1079,1084,1087,1090,1094,2324,2372,2389,2390],[103,107,113,500,1078,2315,2324,2372,2389,2390],[500,855,856,2324,2372,2389,2390],[103,107,113,174,500,856,2315,2324,2372,2389,2390],[103,107,113,855,2315,2324,2372,2389,2390],[500,858,859,860,2324,2372,2389,2390],[103,107,113,174,500,535,713,2315,2324,2372,2389,2390],[103,107,113,500,858,1104,2315,2324,2372,2389,2390],[859,2324,2372,2389,2390],[500,536,537,538,2324,2372,2389,2390],[103,107,113,500,536,2315,2324,2372,2389,2390],[537,2324,2372,2389,2390],[500,766,767,2324,2372,2389,2390],[103,107,113,500,767,2315,2324,2372,2389,2390],[103,107,113,766,2315,2324,2372,2389,2390],[103,107,113,1080,1081,1082,1083,2315,2324,2372,2389,2390],[103,107,113,1080,1081,2315,2324,2372,2389,2390],[103,107,113,1080,2315,2324,2372,2389,2390],[103,107,113,487,2315,2324,2372,2389,2390],[500,1069,1070,2324,2372,2389,2390],[1067,2324,2372,2389,2390],[103,107,113,500,535,539,651,1067,1068,1070,2315,2324,2372,2389,2390],[103,107,113,500,525,539,651,1067,1068,1069,2315,2324,2372,2389,2390],[500,862,863,864,865,866,867,868,869,870,2324,2372,2389,2390],[863,865,866,867,2324,2372,2389,2390],[103,107,113,500,862,2315,2318,2324,2372,2389,2390],[103,107,113,862,864,2315,2324,2372,2389,2390],[103,107,113,500,535,862,2315,2318,2324,2372,2389,2390],[103,107,113,863,2315,2318,2324,2372,2389,2390],[500,1085,1086,2324,2372,2389,2390],[103,107,113,174,536,683,2315,2324,2372,2389,2390],[1085,2324,2372,2389,2390],[500,758,2324,2372,2389,2390],[103,107,113,500,757,2315,2324,2372,2389,2390],[103,107,113,500,758,2315,2324,2372,2389,2390],[500,1089,2324,2372,2389,2390],[103,107,113,500,1088,2315,2324,2372,2389,2390],[103,107,113,500,1089,2315,2324,2372,2389,2390],[101,103,107,113,500,872,2315,2324,2372,2389,2390],[101,103,107,113,500,2315,2324,2372,2389,2390],[92,2132,2324,2372,2389,2390],[500,874,875,2324,2372,2389,2390],[103,107,113,500,875,2315,2324,2372,2389,2390],[103,107,113,500,874,2315,2324,2372,2389,2390],[500,877,878,2324,2372,2389,2390],[500,880,881,2324,2372,2389,2390],[103,107,113,500,651,683,881,1104,2315,2324,2372,2389,2390],[103,107,113,500,683,880,1104,2315,2324,2372,2389,2390],[500,1091,1092,1093,2324,2372,2389,2390],[103,107,113,500,525,535,651,1092,2315,2324,2372,2389,2390],[103,107,113,500,651,1091,1104,2315,2324,2372,2389,2390],[500,525,526,527,528,529,530,531,532,533,534,2324,2372,2389,2390],[103,107,113,500,529,2315,2324,2372,2389,2390],[103,107,113,525,2315,2324,2372,2389,2390],[103,107,113,500,525,526,527,532,534,2315,2324,2372,2389,2390],[103,107,113,525,533,1104,2315,2324,2372,2389,2390],[103,107,113,500,528,2315,2324,2372,2389,2390],[103,107,113,526,527,2315,2324,2372,2389,2390],[103,107,113,526,531,2315,2324,2372,2389,2390],[103,107,113,526,530,2315,2324,2372,2389,2390],[500,883,884,2324,2372,2389,2390],[103,107,113,500,884,2315,2324,2372,2389,2390],[103,107,113,883,2315,2324,2372,2389,2390],[500,886,887,888,889,890,891,892,2324,2372,2389,2390],[103,107,113,890,2315,2324,2372,2389,2390],[103,107,113,500,886,889,2315,2324,2372,2389,2390],[103,107,113,888,2315,2324,2372,2389,2390],[103,107,113,174,500,891,2315,2324,2372,2389,2390],[103,107,113,174,500,887,2315,2324,2372,2389,2390],[103,107,113,886,2315,2324,2372,2389,2390],[500,894,895,2324,2372,2389,2390],[103,107,113,174,500,895,2315,2324,2372,2389,2390],[103,107,113,500,894,2315,2324,2372,2389,2390],[500,897,898,2324,2372,2389,2390],[103,107,113,500,898,2315,2324,2372,2389,2390],[103,107,113,897,2315,2324,2372,2389,2390],[500,900,901,902,2324,2372,2389,2390],[103,107,113,500,901,2315,2324,2372,2389,2390],[103,107,113,900,2315,2324,2372,2389,2390],[500,904,905,907,908,909,2324,2372,2389,2390],[103,107,113,500,905,2315,2324,2372,2389,2390],[103,107,113,904,2315,2324,2372,2389,2390],[103,107,113,906,2315,2324,2372,2389,2390],[103,107,113,907,2315,2324,2372,2389,2390],[103,107,113,1063,1065,1104,2315,2324,2372,2389,2390],[103,107,113,174,500,1063,1064,2315,2324,2372,2389,2390],[103,107,113,1063,1065,2315,2324,2372,2389,2390],[500,924,926,2324,2372,2389,2390],[103,107,113,160,500,535,911,924,927,2315,2324,2372,2389,2390],[103,104,107,113,911,922,2315,2324,2372,2389,2390],[103,107,113,486,500,651,911,923,925,927,1104,2315,2324,2372,2389,2390],[103,107,113,651,911,925,2315,2324,2372,2389,2390],[103,107,113,911,926,2315,2324,2372,2389,2390],[500,928,930,931,932,933,934,2324,2372,2389,2390],[103,107,113,500,930,2315,2324,2372,2389,2390],[103,107,113,500,535,927,931,2315,2324,2372,2389,2390],[103,107,113,486,500,651,910,911,927,928,930,1104,2315,2324,2372,2389,2390],[103,107,113,930,2315,2324,2372,2389,2390],[103,107,113,928,929,2315,2324,2372,2389,2390],[500,937,938,939,940,2324,2372,2389,2390],[103,107,113,500,940,2315,2324,2372,2389,2390],[103,107,113,939,2315,2324,2372,2389,2390],[103,107,113,500,644,938,2315,2324,2372,2389,2390],[103,107,113,937,2315,2324,2372,2389,2390],[500,942,944,945,2324,2372,2389,2390],[103,107,113,944,2315,2324,2372,2389,2390],[103,107,113,500,525,942,943,2315,2324,2372,2389,2390],[103,107,113,500,1104,2315,2324,2372,2389,2390],[500,947,948,949,2324,2372,2389,2390],[103,107,113,500,947,2315,2324,2372,2389,2390],[500,1073,1074,1075,1076,2324,2372,2389,2390],[103,107,113,500,1076,2315,2324,2372,2389,2390],[103,107,113,1075,2315,2324,2372,2389,2390],[103,107,113,500,1072,1074,2315,2324,2372,2389,2390],[103,107,113,1072,1073,2315,2324,2372,2389,2390],[500,951,952,2324,2372,2389,2390],[103,107,113,500,687,952,2315,2324,2372,2389,2390],[103,107,113,687,951,2315,2324,2372,2389,2390],[500,954,955,956,957,958,2324,2372,2389,2390],[103,107,113,500,957,2315,2324,2372,2389,2390],[103,107,113,500,954,956,2315,2324,2372,2389,2390],[103,107,113,500,955,2315,2324,2372,2389,2390],[103,107,113,954,2315,2324,2372,2389,2390],[500,960,961,2324,2372,2389,2390],[103,107,113,174,500,961,2315,2324,2372,2389,2390],[103,107,113,960,2315,2324,2372,2389,2390],[500,963,964,966,968,971,972,973,974,994,2324,2372,2389,2390],[103,107,113,500,965,2315,2324,2372,2389,2390],[103,107,113,964,2315,2324,2372,2389,2390],[103,107,113,975,2315,2324,2372,2389,2390],[103,104,107,113,984,2315,2324,2372,2389,2390],[103,107,113,977,2315,2324,2372,2389,2390],[103,104,107,113,964,965,979,2315,2324,2372,2389,2390],[103,104,107,113,500,965,981,982,2315,2324,2372,2389,2390],[976,978,980,983,984,985,986,2324,2372,2389,2390],[103,104,107,113,500,964,965,966,2315,2324,2372,2389,2390],[103,107,113,963,2315,2324,2372,2389,2390],[970,982,988,989,990,991,2324,2372,2389,2390],[103,107,113,973,2315,2324,2372,2389,2390],[103,107,113,964,968,2315,2324,2372,2389,2390],[103,107,113,964,968,988,2315,2324,2372,2389,2390],[103,107,113,644,964,966,967,968,969,2315,2324,2372,2389,2390],[103,107,113,922,968,969,2315,2324,2372,2389,2390],[103,107,113,968,982,2315,2324,2372,2389,2390],[103,107,113,500,922,964,965,2315,2324,2372,2389,2390],[103,107,113,965,2315,2324,2372,2389,2390],[103,107,113,964,965,2315,2324,2372,2389,2390],[103,107,113,644,968,987,993,2315,2324,2372,2389,2390],[103,107,113,500,964,965,2315,2324,2372,2389,2390],[103,104,107,113,500,922,964,965,967,2315,2324,2372,2389,2390],[103,104,107,113,500,964,965,967,968,970,1104,2315,2324,2372,2389,2390],[103,107,113,500,963,964,965,966,967,2315,2324,2372,2389,2390],[103,107,113,174,963,2315,2324,2372,2389,2390],[103,107,113,964,967,968,969,992,1104,2315,2324,2372,2389,2390],[500,772,776,778,2324,2372,2389,2390],[103,107,113,644,769,772,773,2315,2324,2372,2389,2390],[103,107,113,770,772,2315,2324,2372,2389,2390],[103,107,113,770,771,772,2315,2324,2372,2389,2390],[103,107,113,772,773,1104,2315,2324,2372,2389,2390],[103,107,113,612,770,772,773,775,2315,2324,2372,2389,2390],[103,107,113,770,772,773,774,2315,2324,2372,2389,2390],[103,107,113,127,500,644,769,770,772,773,775,1104,2315,2324,2372,2389,2390],[103,107,113,174,500,770,771,773,775,2315,2324,2372,2389,2390],[777,2324,2372,2389,2390],[103,107,113,651,772,773,2315,2324,2372,2389,2390],[500,996,997,998,1000,1001,1002,2324,2372,2389,2390],[103,107,113,997,1001,1002,2315,2324,2372,2389,2390],[103,107,113,500,998,999,2315,2324,2372,2389,2390],[103,107,113,998,1000,2315,2324,2372,2389,2390],[103,104,107,113,500,998,1000,2315,2324,2372,2389,2390],[103,107,113,500,996,2315,2324,2372,2389,2390],[103,107,113,997,2315,2324,2372,2389,2390],[103,104,107,113,500,998,1001,2315,2324,2372,2389,2390],[500,711,712,2324,2372,2389,2390],[103,107,113,174,500,712,2315,2324,2372,2389,2390],[103,107,113,711,2315,2324,2372,2389,2390],[500,1004,1005,2324,2372,2389,2390],[103,107,113,1004,1104,2315,2324,2372,2389,2390],[500,794,795,796,797,798,800,2324,2372,2389,2390],[103,107,113,500,525,687,794,2315,2324,2372,2389,2390],[103,107,113,500,525,535,687,2315,2324,2372,2389,2390],[103,107,113,687,794,2315,2324,2372,2389,2390],[103,107,113,799,2315,2324,2372,2389,2390],[103,104,107,113,500,794,1104,2315,2324,2372,2389,2390],[687,794,2324,2372,2389,2390],[500,1007,1008,2324,2372,2389,2390],[103,107,113,174,500,535,644,1008,2315,2324,2372,2389,2390],[103,107,113,500,1007,1104,2315,2324,2372,2389,2390],[500,1010,1011,1012,1013,2324,2372,2389,2390],[103,107,113,500,1012,2315,2324,2372,2389,2390],[103,107,113,1011,2315,2324,2372,2389,2390],[103,107,113,1010,2315,2324,2372,2389,2390],[500,646,647,648,649,650,2324,2372,2389,2390],[103,107,113,500,647,2315,2324,2372,2389,2390],[103,107,113,500,535,644,645,2315,2324,2372,2389,2390],[103,107,113,535,646,2315,2324,2372,2389,2390],[103,107,113,500,535,644,646,647,649,2315,2324,2372,2389,2390],[103,107,113,500,535,646,647,648,2315,2324,2372,2389,2390],[500,1051,1052,1053,1054,1055,1056,2324,2372,2389,2390],[103,107,113,500,635,2315,2324,2372,2389,2390],[103,107,113,500,632,1051,1052,2315,2324,2372,2389,2390],[103,107,113,632,1052,1055,2315,2324,2372,2389,2390],[103,107,113,500,632,1051,1052,1054,2315,2324,2372,2389,2390],[103,107,113,632,1053,1104,2315,2324,2372,2389,2390],[103,107,113,683,2315,2324,2372,2389,2390],[500,1015,1018,2324,2372,2389,2390],[103,107,113,500,1015,1016,2315,2324,2372,2389,2390],[103,107,113,500,1017,1104,2315,2324,2372,2389,2390],[103,107,113,500,1018,2315,2324,2372,2389,2390],[103,107,113,1015,1017,2315,2324,2372,2389,2390],[500,1029,1030,2324,2372,2389,2390],[935,1028,2324,2372,2389,2390],[103,107,113,500,935,1028,1104,2315,2324,2372,2389,2390],[500,1034,1035,2324,2372,2389,2390],[1034,2324,2372,2389,2390],[103,107,113,500,922,1032,1033,1104,2315,2324,2372,2389,2390],[103,107,113,500,1033,2315,2324,2372,2389,2390],[103,107,113,500,727,1022,1032,2315,2324,2372,2389,2390],[500,1020,1022,1025,1026,1027,2324,2372,2389,2390],[1025,2324,2372,2389,2390],[500,1022,1023,2324,2372,2389,2390],[1022,1024,2324,2372,2389,2390],[103,107,113,1020,1022,1023,1024,2315,2324,2372,2389,2390],[103,107,113,500,1022,1024,2315,2324,2372,2389,2390],[103,107,113,1020,1021,1023,1024,2315,2324,2372,2389,2390],[103,107,113,500,644,1022,1024,2315,2324,2372,2389,2390],[500,1038,1039,1041,1043,1045,1046,2324,2372,2389,2390],[1038,2324,2372,2389,2390],[103,107,113,500,1037,1038,1040,2315,2324,2372,2389,2390],[103,107,113,500,1037,1038,1041,2315,2324,2372,2389,2390],[103,107,113,500,1044,2315,2324,2372,2389,2390],[103,107,113,1045,2315,2324,2372,2389,2390],[103,107,113,500,1038,1042,2315,2324,2372,2389,2390],[103,107,113,1038,1043,2315,2324,2372,2389,2390],[103,107,113,500,1037,1039,2315,2324,2372,2389,2390],[103,107,113,500,1038,2315,2324,2372,2389,2390],[912,914,915,916,919,920,921,2324,2372,2389,2390],[103,107,113,500,914,918,919,2315,2324,2372,2389,2390],[103,107,113,500,914,920,2315,2324,2372,2389,2390],[103,107,113,500,914,2315,2324,2372,2389,2390],[103,107,113,127,917,2315,2324,2372,2389,2390],[103,107,113,913,2315,2324,2372,2389,2390],[500,1048,1049,2324,2372,2389,2390],[103,107,113,500,1049,2315,2324,2372,2389,2390],[103,107,113,1048,2315,2324,2372,2389,2390],[167,168,169,170,171,172,173,2324,2372,2389,2390],[103,107,113,1095,2315,2324,2372,2389,2390],[1097,1098,1099,1101,2324,2372,2389,2390],[103,107,113,1100,2315,2324,2372,2389,2390],[540,541,542,543,544,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,636,637,638,639,640,641,642,643,2324,2372,2389,2390],[487,2324,2372,2389,2390],[103,107,113,635,2315,2324,2372,2389,2390],[103,107,113,487,500,545,611,2315,2324,2372,2389,2390],[103,107,113,613,2315,2324,2372,2389,2390],[103,107,113,174,644,687,1095,1096,1102,1103,2315,2324,2372,2389,2390],[110,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,2324,2372,2389,2390],[103,107,113,784,2315,2324,2372,2389,2390],[484,2324,2372,2389,2390],[151,152,153,154,155,156,2324,2372,2389,2390],[157,178,485,488,489,490,491,492,493,494,495,496,497,498,499,2324,2372,2389,2390],[94,500,2324,2372,2389,2390],[158,159,160,161,165,166,175,176,177,2324,2372,2389,2390],[103,107,113,160,2315,2324,2372,2389,2390],[162,163,164,2324,2372,2389,2390],[103,107,113,164,2315,2324,2372,2389,2390],[103,107,113,162,163,2315,2324,2372,2389,2390],[174,2324,2372,2389,2390],[112,486,2324,2372,2389,2390],[112,2324,2372,2389,2390],[2137,2324,2372,2389,2390],[1451,2324,2372,2389,2390],[1449,1450,1452,2324,2372,2389,2390],[1451,1455,1458,1460,1461,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,2324,2372,2389,2390],[1451,1455,1456,2324,2372,2389,2390],[1451,1455,2324,2372,2389,2390],[1451,1452,1505,2324,2372,2389,2390],[1457,2324,2372,2389,2390],[1457,1462,2324,2372,2389,2390],[1457,1461,2324,2372,2389,2390],[1454,1457,1461,2324,2372,2389,2390],[1457,1460,1483,2324,2372,2389,2390],[1455,1457,2324,2372,2389,2390],[1454,2324,2372,2389,2390],[1451,1459,2324,2372,2389,2390],[1455,1459,1460,1461,2324,2372,2389,2390],[1454,1455,2324,2372,2389,2390],[1451,1452,2324,2372,2389,2390],[1451,1452,1505,1507,2324,2372,2389,2390],[1451,1508,2324,2372,2389,2390],[1515,1516,1517,2324,2372,2389,2390],[1451,1505,1506,2324,2372,2389,2390],[1451,1453,1520,2324,2372,2389,2390],[1509,1511,2324,2372,2389,2390],[1508,1511,2324,2372,2389,2390],[1451,1460,1469,1505,1506,1507,1508,1511,1512,1513,1514,1518,1519,2324,2372,2389,2390],[1486,1511,2324,2372,2389,2390],[1509,1510,2324,2372,2389,2390],[1451,1520,2324,2372,2389,2390],[1508,1512,1513,2324,2372,2389,2390],[1511,2324,2372,2389,2390],[483,2324,2372,2389,2390],[103,107,112,2315,2324,2372,2389,2390],[2324,2372,2389,2390,2444],[2324,2372,2389,2390,2442,2444],[2324,2372,2389,2390,2433,2441,2442,2443,2445,2447],[2324,2372,2389,2390,2431],[2324,2372,2389,2390,2434,2439,2444,2447],[2324,2372,2389,2390,2430,2447],[2324,2372,2389,2390,2434,2435,2438,2439,2440,2447],[2324,2372,2389,2390,2434,2435,2436,2438,2439,2447],[2324,2372,2389,2390,2431,2432,2433,2434,2435,2439,2440,2441,2443,2444,2445,2447],[2324,2372,2389,2390,2447],[2324,2372,2389,2390,2429,2431,2432,2433,2434,2435,2436,2438,2439,2440,2441,2442,2443,2444,2445,2446],[2324,2372,2389,2390,2429,2447],[2324,2372,2389,2390,2434,2436,2437,2439,2440,2447],[2324,2372,2389,2390,2438,2447],[2324,2372,2389,2390,2439,2440,2444,2447],[2324,2372,2389,2390,2432,2442],[1713,2324,2372,2389,2390],[1714,1715,1716,2324,2372,2389,2390],[1714,1715,1717,2324,2372,2389,2390],[2324,2372,2389,2390,2424,2479,2480],[2324,2372,2389,2390,2423,2424],[2324,2372,2389,2390,2429,2468],[2324,2372,2389,2390,2455],[2324,2372,2389,2390,2451,2468],[2324,2372,2389,2390,2450,2451,2452,2455,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476],[2324,2372,2389,2390,2472],[2324,2372,2389,2390,2450,2452,2455,2473,2474],[2324,2372,2389,2390,2471,2475],[2324,2372,2389,2390,2450,2453,2454],[2324,2372,2389,2390,2453],[2324,2372,2389,2390,2450,2451,2452,2455,2467],[2324,2372,2389,2390,2456,2461,2467],[2324,2372,2389,2390,2467],[2324,2372,2389,2390,2456,2467],[2324,2372,2389,2390,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466],[2019,2052,2324,2372,2389,2390],[2019,2324,2372,2389,2390],[2052,2053,2054,2324,2372,2389,2390],[2019,2053,2324,2372,2389,2390],[2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2018,2324,2372,2389,2390],[2001,2002,2019,2324,2372,2389,2390],[2001,2019,2324,2372,2389,2390],[2012,2019,2324,2372,2389,2390],[2014,2015,2016,2017,2324,2372,2389,2390],[2003,2019,2324,2372,2389,2390],[2028,2324,2372,2389,2390],[2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,2035,2036,2324,2372,2389,2390],[2020,2028,2030,2324,2372,2389,2390],[2026,2028,2035,2324,2372,2389,2390],[2030,2324,2372,2389,2390],[2028,2030,2324,2372,2389,2390],[2029,2324,2372,2389,2390],[2020,2028,2324,2372,2389,2390],[2021,2022,2023,2024,2025,2026,2027,2029,2324,2372,2389,2390],[2324,2372,2389,2390,2492],[525,2324,2372,2389,2390],[1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,2324,2372,2389,2390],[1543,2324,2372,2389,2390],[1597,2324,2372,2389,2390],[1592,1593,2324,2372,2389,2390],[103,107,113,1662,2315,2324,2372,2389,2390],[1665,2324,2372,2389,2390],[103,107,113,1611,1695,2315,2324,2372,2389,2390],[103,107,113,1594,1611,1695,2315,2324,2372,2389,2390],[103,107,113,1695,2315,2324,2372,2389,2390],[1671,2324,2372,2389,2390],[103,107,113,1639,2315,2324,2372,2389,2390],[103,107,113,1695,1699,2315,2324,2372,2389,2390],[1675,2324,2372,2389,2390],[1603,1604,2324,2372,2389,2390],[1602,2324,2372,2389,2390],[103,107,113,1595,2315,2324,2372,2389,2390],[103,107,113,1616,2315,2324,2372,2389,2390],[1613,1614,2324,2372,2389,2390],[1616,2324,2372,2389,2390],[1613,2324,2372,2389,2390],[1608,2324,2372,2389,2390],[1639,1646,1678,1693,1694,1907,2324,2372,2389,2390],[103,107,113,1679,2315,2324,2372,2389,2390],[103,107,113,1608,1633,2315,2324,2372,2389,2390],[1647,2324,2372,2389,2390],[1649,2324,2372,2389,2390],[1702,2324,2372,2389,2390],[103,107,113,1608,1639,2315,2324,2372,2389,2390],[1652,2324,2372,2389,2390],[1704,2324,2372,2389,2390],[103,107,113,1611,1639,2315,2324,2372,2389,2390],[1706,2324,2372,2389,2390],[103,107,113,1608,1609,1639,2315,2324,2372,2389,2390],[1640,2324,2372,2389,2390],[1681,2324,2372,2389,2390],[1621,2324,2372,2389,2390],[1708,2324,2372,2389,2390],[1655,2324,2372,2389,2390],[103,107,113,1639,1695,2315,2324,2372,2389,2390],[103,107,113,1608,1628,1658,1695,2315,2324,2372,2389,2390],[103,107,113,1590,2315,2324,2372,2389,2390],[1710,2324,2372,2389,2390],[103,107,113,1613,1616,2315,2324,2372,2389,2390],[1903,2324,2372,2389,2390],[103,107,113,1615,1616,1712,1902,2315,2324,2372,2389,2390],[1905,2324,2372,2389,2390],[1635,2324,2372,2389,2390],[1634,2324,2372,2389,2390],[1600,2324,2372,2389,2390],[1660,2324,2372,2389,2390],[1685,2324,2372,2389,2390],[103,107,113,1637,2315,2324,2372,2389,2390],[1598,1599,1612,1616,1617,1618,1619,1620,1622,1696,1697,1698,1699,1700,1701,1703,1705,1707,1709,1711,1904,1906,2324,2372,2389,2390],[1591,1594,1596,1612,1616,1617,1618,1619,1620,1622,1907,2324,2372,2389,2390],[1591,1594,1596,1601,1605,2324,2372,2389,2390],[1606,1645,2324,2372,2389,2390],[1641,1642,1643,1644,2324,2372,2389,2390],[1648,1650,1651,1653,1654,1656,1657,1659,1661,1663,1664,1666,1667,1668,1669,1670,1672,1673,1674,1676,1677,2324,2372,2389,2390],[1680,1682,1683,1684,1686,1687,1688,1689,1690,1691,1692,2324,2372,2389,2390],[1628,2324,2372,2389,2390],[1627,2324,2372,2389,2390],[103,107,113,1611,1616,2315,2324,2372,2389,2390],[103,107,113,1594,1611,1616,1618,2315,2324,2372,2389,2390],[1611,1615,2324,2372,2389,2390],[1590,1609,1612,1616,1617,1618,1619,1620,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,2324,2372,2389,2390],[1623,2324,2372,2389,2390],[1611,2324,2372,2389,2390],[103,107,113,1609,1634,2315,2324,2372,2389,2390],[1609,2324,2372,2389,2390],[103,107,113,1609,1623,2315,2324,2372,2389,2390],[2324,2337,2341,2372,2389,2390,2415],[2324,2337,2372,2389,2390,2404,2415],[2324,2332,2372,2389,2390],[2324,2334,2337,2372,2389,2390,2412,2415],[2324,2372,2389,2390,2392,2412],[2324,2332,2372,2389,2390,2422],[2324,2334,2337,2372,2389,2390,2392,2415],[2324,2329,2330,2333,2336,2372,2383,2389,2390,2404,2415],[2324,2337,2344,2372,2389,2390],[2324,2329,2335,2372,2389,2390],[2324,2337,2358,2359,2372,2389,2390],[2324,2333,2337,2372,2389,2390,2407,2415,2422],[2324,2358,2372,2389,2390,2422],[2324,2331,2332,2372,2389,2390,2422],[2324,2337,2372,2389,2390],[2324,2331,2332,2333,2334,2335,2336,2337,2338,2339,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2359,2360,2361,2362,2363,2364,2372,2389,2390],[2324,2337,2352,2372,2389,2390],[2324,2337,2344,2345,2372,2389,2390],[2324,2335,2337,2345,2346,2372,2389,2390],[2324,2336,2372,2389,2390],[2324,2329,2332,2337,2372,2389,2390],[2324,2337,2341,2345,2346,2372,2389,2390],[2324,2341,2372,2389,2390],[2324,2335,2337,2340,2372,2389,2390,2415],[2324,2329,2334,2337,2344,2372,2389,2390],[2324,2372,2389,2390,2404],[2324,2332,2337,2358,2372,2389,2390,2420,2422],[2324,2372,2389,2390,2481,2489,2490,2491,2493],[2324,2372,2389,2390,2481,2489],[2324,2372,2389,2390,2490],[2324,2372,2389,2390,2494,2495],[2324,2372,2389,2390,2480,2496],[2324,2372,2389,2390,2495,2500],[2324,2372,2389,2390,2495,2499],[2324,2372,2389,2390,2480,2500],[2324,2372,2389,2390,2424,2428,2479,2480,2498],[2324,2372,2389,2390,2480],[2324,2372,2389,2390,2480,2504],[91,2324,2372,2389,2390],[87,88,90,2324,2372,2383,2384,2386,2387,2388,2389,2390,2392,2404,2412,2415,2421,2422,2424,2425,2426,2427,2428,2448,2449,2478,2479,2480],[87,88,89,2324,2372,2389,2390,2426],[87,2324,2372,2389,2390],[88,2324,2372,2389,2390],[89,90,2324,2372,2389,2390],[2324,2372,2389,2390,2477],[2324,2372,2389,2390,2424,2480],[103,107,113,1434,1435,2120,2126,2298,2315,2324,2372,2389,2390],[103,106,107,113,2315,2324,2372,2389,2390],[98,102,2324,2372,2389,2390],[102,2324,2372,2389,2390],[104,1552,2324,2372,2389,2390],[104,128,130,136,1552,1554,2324,2372,2389,2390],[104,128,1552,2324,2372,2389,2390],[103,104,105,107,109,110,111,113,137,140,1554,1556,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,133,2315,2324,2372,2389,2390],[103,104,105,107,113,1441,1967,2315,2324,2372,2389,2390],[92,103,104,105,107,113,137,1105,1413,1429,1524,1525,1563,1610,1611,1967,1970,1971,1972,1973,1974,1988,1989,2315,2324,2372,2389,2390],[103,104,105,107,113,1413,1555,2315,2318,2324,2372,2389,2390],[103,104,105,107,109,113,2315,2324,2372,2389,2390],[103,104,105,107,113,2315,2324,2372,2389,2390],[103,104,105,107,113,1993,2315,2324,2372,2389,2390],[92,103,104,105,107,113,1110,2074,2081,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1105,2076,2315,2324,2372,2389,2390],[104,1413,2324,2372,2389,2390],[103,104,105,107,113,1104,2085,2086,2087,2315,2324,2372,2389,2390],[103,104,105,107,109,113,1104,2085,2315,2324,2372,2389,2390],[103,104,105,107,113,1110,2086,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1110,2315,2324,2372,2389,2390],[103,104,105,107,113,1413,1432,1561,2090,2315,2324,2372,2389,2390],[103,104,105,107,113,2090,2315,2324,2372,2389,2390],[104,2324,2372,2389,2390],[103,104,105,107,113,2090,2091,2092,2093,2094,2315,2324,2372,2389,2390],[103,104,105,107,113,2076,2090,2095,2315,2324,2372,2389,2390],[103,104,105,107,113,2077,2315,2324,2372,2389,2390],[103,104,107,113,1104,1105,1432,1563,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,2077,2078,2079,2315,2324,2372,2389,2390],[103,104,105,107,109,113,1554,2075,2076,2077,2079,2080,2081,2315,2324,2372,2389,2390],[103,104,105,107,113,1446,2315,2324,2372,2389,2390],[103,104,105,107,109,113,1104,2315,2324,2372,2389,2390],[103,104,105,107,113,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1966,1967,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1105,1413,1429,1447,1448,1521,1522,1553,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,128,130,137,1104,1105,1554,2100,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1429,1973,2114,2315,2324,2372,2389,2390],[103,104,107,113,1553,2315,2324,2372,2389,2390],[104,134,140,2324,2372,2389,2390],[104,107,2318,2324,2372,2389,2390],[104,1105,2117,2324,2372,2389,2390],[103,104,107,113,137,2315,2324,2372,2389,2390],[104,2122,2124,2126,2128,2130,2324,2372,2389,2390],[103,104,107,113,1413,2134,2315,2324,2372,2389,2390],[92,103,104,107,113,2136,2137,2315,2324,2372,2389,2390],[103,104,107,113,2139,2315,2324,2372,2389,2390],[103,104,107,113,1547,2141,2315,2324,2372,2389,2390],[103,104,105,107,113,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,143,2315,2318,2324,2372,2389,2390],[103,104,105,107,109,113,140,142,144,145,146,148,149,1106,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,134,143,147,2315,2324,2372,2389,2390],[103,104,105,107,113,137,150,1105,2315,2324,2372,2389,2390],[103,104,105,107,113,134,140,1554,2315,2324,2372,2389,2390],[92,103,104,105,107,109,113,140,2315,2324,2372,2389,2390],[103,104,105,107,113,140,141,2315,2324,2372,2389,2390],[103,104,105,107,113,140,1113,1554,2315,2324,2372,2389,2390],[103,104,105,107,111,113,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,133,1110,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,1111,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,137,140,1109,1112,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,1107,1108,1114,2315,2324,2372,2389,2390],[92,103,104,107,113,1553,1557,1558,1559,2315,2324,2372,2389,2390],[104,107,128,129,133,134,136,137,1546,1547,2318,2324,2372,2389,2390],[104,107,1554,2318,2324,2372,2389,2390],[104,107,111,133,137,1546,2318,2324,2372,2389,2390],[104,107,129,1115,1117,1118,1416,1417,1419,1420,1422,1426,1428,1545,2318,2324,2372,2389,2390],[104,113,2324,2372,2389,2390],[104,113,1553,2324,2372,2389,2390],[104,107,113,129,133,2318,2324,2372,2389,2390],[94,104,113,132,135,138,139,2324,2372,2389,2390],[104,107,113,129,131,132,135,136,1547,2318,2324,2372,2389,2390],[104,132,134,135,137,1547,2324,2372,2389,2390],[104,1081,1104,2324,2372,2389,2390],[104,687,2324,2372,2389,2390],[104,137,2324,2372,2389,2390],[104,114,127,130,1548,1549,2324,2372,2389,2390],[104,114,1549,2324,2372,2389,2390],[104,114,127,128,129,130,136,1105,1547,1549,1550,1551,2324,2372,2389,2390],[114,1549,2324,2372,2389,2390],[104,2317,2324,2372,2389,2390],[94,104,127,2324,2372,2389,2390],[103,104,105,107,113,129,131,136,137,1104,1413,1415,1418,2315,2324,2372,2389,2390],[103,104,105,107,113,129,131,136,137,1104,1414,1415,2315,2324,2372,2389,2390],[103,104,105,107,113,129,131,132,135,137,1104,1413,1414,1415,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,1569,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1561,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1561,2149,2315,2324,2372,2389,2390],[103,104,105,107,113,147,1104,1561,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1547,1561,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1570,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1571,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1431,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1554,1572,2315,2324,2372,2389,2390],[103,104,105,107,113,2157,2160,2161,2315,2324,2372,2389,2390],[103,104,105,107,113,2157,2158,2159,2315,2324,2372,2389,2390],[103,104,105,107,113,2158,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,2157,2315,2324,2372,2389,2390],[103,104,105,107,113,140,2157,2315,2324,2372,2389,2390],[103,104,107,113,1104,1105,1572,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1572,2163,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1572,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1110,1413,1566,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1563,1566,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1110,1413,1432,1566,2167,2168,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1105,1553,1573,1574,1575,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1575,2170,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1575,2173,2315,2324,2372,2389,2390],[103,104,105,107,113,687,1105,1413,1421,1429,1528,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1110,1562,2172,2315,2324,2372,2389,2390],[103,104,105,107,111,113,1432,1547,1562,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1104,1105,1413,1429,1430,1432,1447,1526,1553,1577,1992,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,137,1104,1105,1429,1432,1447,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1104,1105,1413,1429,1432,1521,1522,1553,1573,1992,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,2075,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1110,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,1424,2315,2324,2372,2389,2390],[103,104,105,107,113,1413,1424,2315,2324,2372,2389,2390],[103,104,105,107,113,483,1413,1424,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2315,2324,2372,2389,2390],[104,2183,2185,2324,2372,2389,2390],[103,104,105,107,113,2191,2315,2324,2372,2389,2390],[104,2192,2193,2324,2372,2389,2390],[103,104,105,107,113,483,1105,2075,2315,2324,2372,2389,2390],[103,104,105,107,113,483,1105,2075,2195,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2195,2315,2324,2372,2389,2390],[104,2195,2196,2197,2324,2372,2389,2390],[103,104,105,107,113,2199,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2199,2315,2324,2372,2389,2390],[104,2199,2200,2201,2324,2372,2389,2390],[103,104,105,107,113,483,1105,2075,2203,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2203,2315,2324,2372,2389,2390],[104,2203,2204,2205,2324,2372,2389,2390],[103,104,105,107,113,2188,2207,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2207,2315,2324,2372,2389,2390],[104,2207,2208,2209,2324,2372,2389,2390],[103,104,105,107,113,2188,2211,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2211,2315,2324,2372,2389,2390],[104,2211,2212,2213,2324,2372,2389,2390],[103,104,105,107,113,2215,2315,2324,2372,2389,2390],[103,104,105,107,113,1423,2215,2315,2324,2372,2389,2390],[104,2215,2216,2217,2324,2372,2389,2390],[103,104,105,107,113,2219,2315,2324,2372,2389,2390],[104,2219,2220,2221,2324,2372,2389,2390],[103,104,105,107,113,483,1105,2076,2223,2315,2324,2372,2389,2390],[104,2223,2224,2324,2372,2389,2390],[103,104,105,107,113,2226,2315,2324,2372,2389,2390],[104,2226,2227,2228,2324,2372,2389,2390],[103,104,105,107,113,483,1105,2075,2230,2315,2324,2372,2389,2390],[103,104,105,107,113,2184,2230,2315,2324,2372,2389,2390],[104,2230,2231,2232,2324,2372,2389,2390],[103,104,105,107,113,2234,2315,2324,2372,2389,2390],[104,2234,2235,2236,2324,2372,2389,2390],[103,104,105,107,113,1110,1423,1424,2182,2189,2190,2315,2324,2372,2389,2390],[103,104,105,107,113,1423,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1423,1425,2315,2324,2372,2389,2390],[103,104,105,107,109,113,2239,2315,2324,2372,2389,2390],[103,104,105,107,113,1423,2240,2315,2324,2372,2389,2390],[103,104,105,107,113,1423,2182,2186,2315,2324,2372,2389,2390],[103,104,105,107,113,127,1104,1105,1576,1578,1584,2116,2242,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1547,1584,2146,2244,2245,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,2117,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1584,2076,2098,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1584,2076,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1421,2315,2324,2372,2389,2390],[103,104,105,107,113,136,1104,1105,1413,1446,2315,2324,2372,2389,2390],[103,104,105,107,113,137,687,1413,1421,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,687,1104,1105,1421,1528,1575,2315,2324,2372,2389,2390],[103,104,105,107,113,1116,2315,2324,2372,2389,2390],[103,104,105,107,113,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,687,1104,1105,1413,1427,2315,2324,2372,2389,2390],[103,104,105,107,113,687,1104,1105,1427,1432,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1432,1567,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1564,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1564,2257,2315,2324,2372,2389,2390],[103,104,105,107,113,1432,1564,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1564,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1564,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1564,2255,2315,2324,2372,2389,2390],[103,104,105,107,113,127,147,1104,1105,1565,2315,2324,2372,2389,2390],[103,104,105,107,113,1432,1547,1565,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1565,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1565,2262,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1429,1430,1432,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1573,2076,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1105,1573,2265,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1574,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1574,2267,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1413,1421,1429,1445,1448,1524,1526,1990,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1573,1574,1575,1577,2076,2116,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1575,1577,2116,2270,2315,2324,2372,2389,2390],[103,104,105,107,111,113,1104,1110,1547,1576,2076,2315,2324,2372,2389,2390],[103,104,105,107,111,113,1104,1105,1432,1576,2272,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1110,1576,1577,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1577,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1577,2274,2275,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1578,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1578,2277,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1432,1547,1578,2279,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1414,1579,2147,2315,2324,2372,2389,2390],[103,104,105,107,113,1579,2147,2281,2315,2324,2372,2389,2390],[103,104,105,107,113,127,1579,2315,2324,2372,2389,2390],[103,104,105,107,113,1580,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1581,2076,2315,2324,2372,2389,2390],[103,104,105,107,113,1581,2285,2315,2324,2372,2389,2390],[103,104,105,107,113,150,1105,2315,2324,2372,2389,2390],[103,104,105,107,113,150,2315,2324,2372,2389,2390],[103,104,105,107,113,150,1432,2315,2324,2372,2389,2390],[103,104,105,107,113,147,150,1104,2315,2324,2372,2389,2390],[103,104,105,107,113,150,1105,1432,1547,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1582,2315,2324,2372,2389,2390],[103,104,105,107,113,1582,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1583,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1554,1583,2315,2324,2372,2389,2390],[103,104,105,107,113,1583,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1583,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1432,1568,2299,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1105,1429,1447,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1105,1413,1421,1429,1431,1432,1448,1523,1526,1553,1990,2315,2324,2372,2389,2390],[103,104,105,107,113,1104,1105,1413,1429,1553,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,687,1105,1413,1421,1429,1528,1553,2315,2324,2372,2389,2390],[103,104,105,107,113,1421,1553,2315,2324,2372,2389,2390],[103,104,105,107,113,1429,2315,2324,2372,2389,2390],[103,104,105,107,113,1429,1543,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1429,1435,2315,2324,2372,2389,2390],[103,104,105,107,113,1105,1429,2315,2324,2372,2389,2390],[103,104,105,107,113,687,1413,1429,1441,2315,2324,2372,2389,2390],[103,104,105,107,113,1429,1553,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1104,1105,1413,1429,1433,1436,1437,1438,1439,1440,1442,1443,1444,1445,1523,1524,1525,1553,1554,2315,2324,2372,2389,2390],[103,104,105,107,113,137,687,1105,1413,1421,1429,1430,1431,1432,1433,1523,1526,1527,1529,1544,1553,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,137,687,1105,1413,1421,1429,1430,1431,1432,1433,1523,1526,1527,1529,1544,1553,2315,2324,2372,2389,2390],[103,104,105,107,113,137,687,1105,1413,1421,1429,1430,1431,1432,1433,1526,1527,1529,1544,1553,1573,2315,2318,2324,2372,2389,2390],[103,104,105,107,113,2085,2087,2315,2324,2372,2389,2390],[103,104,105,107,113,2100,2315,2324,2372,2389,2390],[103,104,105,107,113,137,1104,1413,1552,1988,2315,2324,2372,2389,2390],[103,104,105,107,113,131,137,1104,1105,1413,1418,2315,2324,2372,2389,2390],[103,104,105,107,113,140,1110,1413,1429,1430,1553,2147,2299,2315,2324,2372,2389,2390],[107,2318,2324,2372,2389,2390],[104,2324,2372,2384,2389,2390,2394,2415,2480,2485,2488,2497,2501,2502,2503,2505,2506]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"19efad8495a7a6b064483fccd1d2b427403dd84e67819f86d1c6ee3d7abf749c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eef826bc4a19de22155487984e345a34c9cd511dd1170edc7a447cb8231dd4a","affectsGlobalScope":true,"impliedFormat":99},"65996936fbb042915f7b74a200fcdde7e410f32a669b1ab9597cfaa4b0faddb5",{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"524a409ad72186b7f6cb16898c349465cfa876f641d6cb6137b3123d5cfca619","impliedFormat":1},{"version":"ebe84ad8344962b7117a3b95065f47383215020eaf1b626463863b45b4d16e62","impliedFormat":1},{"version":"de5abbc02627403ac5796572520dc2b42df54f1257e7218a9ef37509d9b56972","impliedFormat":1},{"version":"8fefccf7758a68c7053d9830ba385f45300b612807629f3559630988abeca71b","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"0e0542f4d578424ae30421da410c0efb116a350dabaf63c4635ce41f5551ba1f","impliedFormat":1},{"version":"c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62","impliedFormat":99},{"version":"318d19118bf6bf8d088441c948990f53cafc79ed581b78f3d41a0f7a3f5f145c","impliedFormat":1},{"version":"25900318042675aee6d709c82309effd29c995d03f92f8b7a469d38e07c7f846","affectsGlobalScope":true,"impliedFormat":1},{"version":"860814185d89237c84a6bd1e4f108c2c0b2401609a74a33bc7cab14ea4ee9f21","impliedFormat":99},{"version":"e1ddcbacb7658bf0683bca4ebd31bd05f64823712651263bfc75128a45f00ff7","impliedFormat":99},{"version":"5b2f1e43f07ae5590bd899398b23b2d114ed9c3b6b3fb4cb60d4c6216d712b87","impliedFormat":99},{"version":"94c8b35ee85f4a36f1536050dd2eed1490239340f72733d787b84f6ee13b3dbb","impliedFormat":99},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},"8581f0150a40bc1df613e00da0100ee40bfefa9fbc9b230a0076c9a308c244c8",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"a69e8bce30aea7ec98f3b6ddfbc378c92826fede01aafbaec703057c2503ea51","impliedFormat":1},{"version":"faf770b3935c2ba6558b2bb65af5d5de58945d81f496dc1a5938c41a1abb358b","impliedFormat":99},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"40de86ced5175a6ffe84a52abe6ac59ac0efbc604a5975a8c6476c3ddc682ff1","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"5a0b15210129310cee9fa6af9200714bb4b12af4a04d890e15f34dbea1cf1852","impliedFormat":1},{"version":"0244119dbcbcf34faf3ffdae72dab1e9bc2bc9efc3c477b2240ffa94af3bca56","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},"9701c8a809fc4799215b4be61e7d77485a6c269ce54d0793c53c0182f6168658","0faed574ac7add37d53fd63688d470292b1c9375500cb1b9d59e40982a6a2d4c","458ba7766b75821db88a9e3a82d1a5a077601407df7074cdae0aaeb420a12227","049ab0431e432e82a8d4e9e67c226a1b06b0b7fbc717947b31de14bd45d2432a","0fece3f69b2d8b9625171e6baded9b978a4c9507fdd12b46d66c2f19ee16d881","c78e57507f352ed3f4b0121f748e0ab2ae86e6379fda3d55c907e9a05ee44d13","7a41ff742ae9b818a2a7a7fb158870393619a5a5fb773b181ea482b631cfb061","c6f9373ea1968b4958b855e30904f2a7d0152b9b477241f523895a4941ba7108","9ceb5d09a35a13c567b0d489ee550a9adc6981d4ed2b32811c7c3dd7ca00df8d","46891b2836f1953416414c93c96fabf621e3b94c65be237eaf2aabcfcee409d7","f3688d50959d31cf849535023dceb5bec1f48eb68b6e9fb9273ade1c64daa1eb","8c98a68934697f4ec08a5d3a293a6771b8f3d963d0c21e6f433f95bda580a314","629b4a81c8e38f30e8144b6a6b37adda26b4669858d3c24748443e1017f6dcfe","5f35695b50bcd8c9b60b67d0ecbc342ac9492119056c10796fb1944bf34109a4","27a47c5461677ba48f59978dfcb094cdfa10f772bbb28cd158c1b4818413b016","48c5eaab5574f1c388873fcb1b6fee5e657ea930867e5cd84dc9593eaf337189","b4492c3409a367c459fadc11294b0eae8fc81463c1be5112b3f0c4afdec4c489","5903f95657f31e779d3f5d4e1568582da03c631e553de96999cab75d3fed1dc1","176eccb49c5e533cac85b5a5bc077f4ca5d026604962ef2ee7ed1c15c79cbdf4","c39cb8aac612362378716ecdebd348df782cc24445e9e8238f5b011518816850","ecb915eb83c1df5622ef6d68214c2a45e17270c395b4f2c1964ecd433a19847b","acd4045783fafe623f2d35019e5dd82221cc34173a43421b30aa99ab2e58d7a3","b2d710eeb8708d0a1d42a4e7f08d569d96e9b172132cf0d57609e03f215ca15b",{"version":"55f16f0ff7dd262a9580fefab47b85fa13bc54ebf21279392fd049c78f7f16d1","impliedFormat":1},{"version":"8c88919faba2b1eb94197a0f3e21d6a827aa574edf4f6c1d0fc402a754749dc8","impliedFormat":1},{"version":"c8044346db3a2a4dcd61dfd96c7cefcb6b1c212ee3e48d474253aafc79970658","impliedFormat":1},{"version":"445f99b5b19666f40eb49bbdedb117a9d9713b91095ea49a371f7941e6a8e0e0","impliedFormat":1},{"version":"d0d35f701530154b2d2c119bd628543e94963a8b43568b61119299eba8f1d4c7","impliedFormat":1},{"version":"d9618b24b11dab78cb0232eef9f3c53cd82e5bc5c998685283265eb82a395b9e","impliedFormat":1},{"version":"a9e6b1ecb19c3094b7ad0075b2910f76e100b9bc04aa7436a33968af73aeba3f","impliedFormat":1},{"version":"7a536e3ebcee17d5d3c3f9466484e97643d81fcf60f1be83a29b7c29326fc076","impliedFormat":1},{"version":"1df8ecdd79b8d5fd6db26c794f25b306a871ca33526967225a7eda4a48384c4c","impliedFormat":1},{"version":"9680c5777715120af62968d8dc0f903e4328eec5518a4e2490caaa1c080ac32d","impliedFormat":1},{"version":"94abb9c4a3661f09b71006cf9f7ace48b80977831f2f81934d40dd81d52c892d","impliedFormat":1},{"version":"f637ba5370e6cab04d4a0b622517bdf2bea791287fb67282eafa0c07cbe55172","impliedFormat":1},{"version":"502d86bc361f90e6255d35a3b7a58dab4130dd1fd0972731d69190968b65e2ff","impliedFormat":1},{"version":"55e52908b8cd39f6d28862d2786ae205b5ff406c5f1652018fb4f4f2193b6834","impliedFormat":1},{"version":"37be5251e2670095621b9a5108db7e200c26edd88ea86fa95a11439a5f72ca55","impliedFormat":1},{"version":"c6ac9cddacb38c304b4e3e6247b02032039ddc35d27e31d11b74452b73ac366d","impliedFormat":1},{"version":"96cf61a20a43a45d6aecdd774c04b62d56b98b68f5b8281ce9cd9cf99400e650","impliedFormat":1},{"version":"ef5530c5dcbe6787a3329c576e87100e920d6eae1b24ea25988d6758c98fdc88","impliedFormat":1},{"version":"0a7e987533de7a29e57d966b7d0d07f483cf03ba5e4c8a0a0793d6730373cb33","impliedFormat":1},{"version":"a298d8f582d84941168e725933c7116b8089b4967c071e86a231dc4d8aeab415","impliedFormat":1},{"version":"7e0f65da240a84018008f2dba1b00d48ea6d20de8034a071431984f96fb714ae","impliedFormat":1},{"version":"d88f975470fb9352bb5c19b1648e820f070449d109a16598173aecf136341b6d","impliedFormat":1},{"version":"fa833a23d1cecc35c100456a55c3842539d6ae24f9750a33c88dcfc1a248002d","impliedFormat":1},{"version":"8f3b798b039eb617b6195743f0a4bc33cce160ba3550b3713fef422942d812d9","impliedFormat":1},{"version":"7cfcc6812e72d9798d39e9be36ced6c35afdc3d7a31891ca782400b34f43e052","impliedFormat":1},{"version":"d54f0d672071e90edb13875ff3115f21716eb3132b25462e92a74108c25c0d48","impliedFormat":1},{"version":"87efca7cf70fc12e5ff28912f86a28f268f8ddd73a9d33c3ac0f091f09bc111f","impliedFormat":1},{"version":"f194d954a36cb19f15e80ac6730b118e57d85f10c05d4374641a85a19dacd27f","impliedFormat":1},{"version":"cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","impliedFormat":99},{"version":"90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","impliedFormat":99},{"version":"ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","impliedFormat":99},{"version":"afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","impliedFormat":99},{"version":"5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","impliedFormat":99},{"version":"7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","impliedFormat":99},{"version":"90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","impliedFormat":99},{"version":"a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","impliedFormat":99},{"version":"bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","impliedFormat":99},{"version":"bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","impliedFormat":99},{"version":"fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","impliedFormat":99},{"version":"15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","impliedFormat":99},{"version":"51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","impliedFormat":99},{"version":"ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","impliedFormat":99},{"version":"9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","impliedFormat":99},{"version":"391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","impliedFormat":99},{"version":"ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","impliedFormat":99},{"version":"633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","impliedFormat":99},{"version":"6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","impliedFormat":99},{"version":"ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","impliedFormat":99},{"version":"22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","impliedFormat":99},{"version":"7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","impliedFormat":99},{"version":"0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","impliedFormat":99},{"version":"91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","impliedFormat":99},{"version":"d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","impliedFormat":99},{"version":"ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","impliedFormat":99},{"version":"9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","impliedFormat":99},{"version":"90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","impliedFormat":99},{"version":"49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","impliedFormat":99},{"version":"8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","impliedFormat":99},{"version":"49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","impliedFormat":99},{"version":"59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","impliedFormat":99},{"version":"33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","impliedFormat":99},{"version":"605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","impliedFormat":99},{"version":"a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","impliedFormat":99},{"version":"0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","impliedFormat":99},{"version":"cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","impliedFormat":99},{"version":"f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","impliedFormat":99},{"version":"530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","impliedFormat":99},{"version":"165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","impliedFormat":99},{"version":"61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","impliedFormat":99},{"version":"69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","impliedFormat":99},{"version":"fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","impliedFormat":99},{"version":"c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","impliedFormat":99},{"version":"ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","impliedFormat":99},{"version":"e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","impliedFormat":99},{"version":"7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","impliedFormat":99},{"version":"ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","impliedFormat":99},{"version":"ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","impliedFormat":99},{"version":"4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","impliedFormat":99},{"version":"57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","impliedFormat":99},{"version":"d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","impliedFormat":99},{"version":"be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","impliedFormat":99},{"version":"c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","impliedFormat":99},{"version":"d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","impliedFormat":99},{"version":"01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","impliedFormat":99},{"version":"ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","impliedFormat":99},{"version":"39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","impliedFormat":99},{"version":"0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","impliedFormat":99},{"version":"2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","impliedFormat":99},{"version":"d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","impliedFormat":99},{"version":"bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","impliedFormat":99},{"version":"f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","impliedFormat":99},{"version":"2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","impliedFormat":99},{"version":"05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","impliedFormat":99},{"version":"62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","impliedFormat":99},{"version":"ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","impliedFormat":99},{"version":"59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","impliedFormat":99},{"version":"84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","impliedFormat":99},{"version":"43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","impliedFormat":99},{"version":"a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","impliedFormat":99},{"version":"1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","impliedFormat":99},{"version":"256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","impliedFormat":99},{"version":"d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","impliedFormat":99},{"version":"e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","impliedFormat":99},{"version":"91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","impliedFormat":99},{"version":"03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","impliedFormat":99},{"version":"e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","impliedFormat":99},{"version":"bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","impliedFormat":99},{"version":"985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","impliedFormat":99},{"version":"6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","impliedFormat":99},{"version":"89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","impliedFormat":99},{"version":"44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","impliedFormat":99},{"version":"ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","impliedFormat":99},{"version":"858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","impliedFormat":99},{"version":"60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","impliedFormat":99},{"version":"409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","impliedFormat":99},{"version":"b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","impliedFormat":99},{"version":"c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","impliedFormat":99},{"version":"99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","impliedFormat":99},{"version":"c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","impliedFormat":99},{"version":"42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","impliedFormat":99},{"version":"542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","impliedFormat":99},{"version":"97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","impliedFormat":99},{"version":"d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","impliedFormat":99},{"version":"0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","impliedFormat":99},{"version":"b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","impliedFormat":99},{"version":"d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","impliedFormat":99},{"version":"d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","impliedFormat":99},{"version":"73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","impliedFormat":99},{"version":"cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","impliedFormat":99},{"version":"301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","impliedFormat":99},{"version":"711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","impliedFormat":99},{"version":"e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","impliedFormat":99},{"version":"17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","impliedFormat":99},{"version":"73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","impliedFormat":99},{"version":"2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","impliedFormat":99},{"version":"c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","impliedFormat":99},{"version":"c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","impliedFormat":99},{"version":"5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","impliedFormat":99},{"version":"f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","impliedFormat":99},{"version":"9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","impliedFormat":99},{"version":"5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","impliedFormat":99},{"version":"24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","impliedFormat":99},{"version":"bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","impliedFormat":99},{"version":"75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","impliedFormat":99},{"version":"3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","impliedFormat":99},{"version":"da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","impliedFormat":99},{"version":"3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","impliedFormat":99},{"version":"1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","impliedFormat":99},{"version":"2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","impliedFormat":99},{"version":"41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","impliedFormat":99},{"version":"6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","impliedFormat":99},{"version":"e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","impliedFormat":99},{"version":"2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","impliedFormat":99},{"version":"4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","impliedFormat":99},{"version":"bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","impliedFormat":99},{"version":"62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","impliedFormat":99},{"version":"be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","impliedFormat":99},{"version":"cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","impliedFormat":99},{"version":"b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","impliedFormat":99},{"version":"164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","impliedFormat":99},{"version":"b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","impliedFormat":99},{"version":"a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","impliedFormat":99},{"version":"8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","impliedFormat":99},{"version":"0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","impliedFormat":99},{"version":"0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","impliedFormat":99},{"version":"7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","impliedFormat":99},{"version":"81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","impliedFormat":99},{"version":"0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","impliedFormat":99},{"version":"b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","impliedFormat":99},{"version":"7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","impliedFormat":99},{"version":"8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","impliedFormat":99},{"version":"e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","impliedFormat":99},{"version":"3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","impliedFormat":99},{"version":"fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","impliedFormat":99},{"version":"99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","impliedFormat":99},{"version":"5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","impliedFormat":99},{"version":"7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","impliedFormat":99},{"version":"0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","impliedFormat":99},{"version":"3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","impliedFormat":99},{"version":"ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","impliedFormat":99},{"version":"89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","impliedFormat":99},{"version":"7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","impliedFormat":99},{"version":"512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","impliedFormat":99},{"version":"6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","impliedFormat":99},{"version":"f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","impliedFormat":99},{"version":"dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","impliedFormat":99},{"version":"a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","impliedFormat":99},{"version":"3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","impliedFormat":99},{"version":"394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","impliedFormat":99},{"version":"0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","impliedFormat":99},{"version":"a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","impliedFormat":99},{"version":"659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","impliedFormat":99},{"version":"1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","impliedFormat":99},{"version":"500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","impliedFormat":99},{"version":"a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","impliedFormat":99},{"version":"e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","impliedFormat":99},{"version":"7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","impliedFormat":99},{"version":"17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","impliedFormat":99},{"version":"f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","impliedFormat":99},{"version":"231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","impliedFormat":99},{"version":"6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","impliedFormat":99},{"version":"65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","impliedFormat":99},{"version":"787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","impliedFormat":99},{"version":"5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","impliedFormat":99},{"version":"bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","impliedFormat":99},{"version":"d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","impliedFormat":99},{"version":"6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","impliedFormat":99},{"version":"1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","impliedFormat":99},{"version":"de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","impliedFormat":99},{"version":"98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","impliedFormat":99},{"version":"9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","impliedFormat":99},{"version":"31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","impliedFormat":99},{"version":"2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","impliedFormat":99},{"version":"666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","impliedFormat":99},{"version":"a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","impliedFormat":99},{"version":"07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","impliedFormat":99},{"version":"39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","impliedFormat":99},{"version":"b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","impliedFormat":99},{"version":"f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","impliedFormat":99},{"version":"8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","impliedFormat":99},{"version":"ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","impliedFormat":99},{"version":"d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","impliedFormat":99},{"version":"19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","impliedFormat":99},{"version":"553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","impliedFormat":99},{"version":"1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","impliedFormat":99},{"version":"f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","impliedFormat":99},{"version":"e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","impliedFormat":99},{"version":"9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","impliedFormat":99},{"version":"0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","impliedFormat":99},{"version":"2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","impliedFormat":99},{"version":"17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","impliedFormat":99},{"version":"3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","impliedFormat":99},{"version":"41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","impliedFormat":99},{"version":"17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","impliedFormat":99},{"version":"ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","impliedFormat":99},{"version":"ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","impliedFormat":99},{"version":"b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","impliedFormat":99},{"version":"73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","impliedFormat":99},{"version":"d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","impliedFormat":99},{"version":"4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","impliedFormat":99},{"version":"58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","impliedFormat":99},{"version":"a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","impliedFormat":99},{"version":"df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","impliedFormat":99},{"version":"256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","impliedFormat":99},{"version":"9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","impliedFormat":99},{"version":"07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","impliedFormat":99},{"version":"1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","impliedFormat":99},{"version":"6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","impliedFormat":99},{"version":"34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","impliedFormat":99},{"version":"a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","impliedFormat":99},{"version":"ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","impliedFormat":99},{"version":"35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","impliedFormat":99},{"version":"2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","impliedFormat":99},{"version":"1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","impliedFormat":99},{"version":"9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","impliedFormat":99},{"version":"0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","impliedFormat":99},{"version":"6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","impliedFormat":99},{"version":"9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","impliedFormat":99},{"version":"f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","impliedFormat":99},{"version":"674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","impliedFormat":99},{"version":"41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","impliedFormat":99},{"version":"44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","impliedFormat":99},{"version":"6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","impliedFormat":99},{"version":"e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","impliedFormat":99},{"version":"62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","impliedFormat":99},{"version":"4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","impliedFormat":99},{"version":"f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","impliedFormat":99},{"version":"279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","impliedFormat":99},{"version":"a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","impliedFormat":99},{"version":"f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","impliedFormat":99},{"version":"3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","impliedFormat":99},{"version":"21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","impliedFormat":99},{"version":"2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","impliedFormat":99},{"version":"d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","impliedFormat":99},{"version":"395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","impliedFormat":99},{"version":"d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","impliedFormat":99},{"version":"ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","impliedFormat":99},{"version":"cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","impliedFormat":99},{"version":"2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","impliedFormat":99},{"version":"9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","impliedFormat":99},{"version":"c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","impliedFormat":99},{"version":"25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","impliedFormat":99},{"version":"d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","impliedFormat":99},{"version":"1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","impliedFormat":99},{"version":"7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","impliedFormat":99},{"version":"d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","impliedFormat":99},{"version":"05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","impliedFormat":99},{"version":"a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","impliedFormat":99},{"version":"7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","impliedFormat":99},{"version":"e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","impliedFormat":99},{"version":"619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","impliedFormat":99},{"version":"88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","impliedFormat":99},{"version":"044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","impliedFormat":99},{"version":"a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","impliedFormat":99},{"version":"5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","impliedFormat":99},{"version":"13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","impliedFormat":99},{"version":"7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","impliedFormat":99},{"version":"601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","impliedFormat":99},{"version":"168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","impliedFormat":99},{"version":"37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","impliedFormat":99},{"version":"f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","impliedFormat":99},{"version":"823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","impliedFormat":99},{"version":"b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","impliedFormat":99},{"version":"a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","impliedFormat":99},{"version":"0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","impliedFormat":99},{"version":"d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","impliedFormat":99},{"version":"824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","impliedFormat":99},{"version":"84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","impliedFormat":99},{"version":"35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","impliedFormat":99},{"version":"64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","impliedFormat":99},{"version":"0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","impliedFormat":99},{"version":"7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","impliedFormat":99},{"version":"3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","impliedFormat":99},{"version":"aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","impliedFormat":99},{"version":"1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","impliedFormat":99},{"version":"d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","impliedFormat":99},{"version":"dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","impliedFormat":99},{"version":"427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","impliedFormat":99},{"version":"c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","impliedFormat":99},{"version":"7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","impliedFormat":99},{"version":"57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","impliedFormat":99},{"version":"8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","impliedFormat":99},{"version":"810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","impliedFormat":99},{"version":"87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","impliedFormat":99},{"version":"28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","impliedFormat":99},{"version":"cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","impliedFormat":99},{"version":"d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","impliedFormat":99},{"version":"4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","impliedFormat":99},{"version":"9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","impliedFormat":99},{"version":"74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","impliedFormat":99},{"version":"4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","impliedFormat":99},{"version":"4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","impliedFormat":99},{"version":"48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","impliedFormat":99},{"version":"2a80ab285da5ec06299594edb456abd51ee69a7506278cca24e1ab494a86952b","impliedFormat":99},{"version":"d7c334ef4c10e9f7c8ebed40342b311ae77de6e80febf22a23927c774957b2ec","impliedFormat":1},{"version":"201688a543bd945e4cb8c9affe99e801fcd97b5dc27080b45fa5653a91f02c30","impliedFormat":99},{"version":"39bdb75d428f49bafbbb4ebd79d48a019c8912e31906ef676e88e6d98b4a62c0","impliedFormat":99},{"version":"015af3f63dc78f5e0219debe1e00649f77877327ef539fbab9a5bb1cbb0f1379","impliedFormat":1},{"version":"486057fe8c8d495fb331e7d6c52524888ba890364993153fabf53b1c870ea10f","impliedFormat":1},{"version":"2639085533befdc499c15a8b9f4087fab12eb1a579cc3bd3008222f6be7f9a1f","impliedFormat":1},{"version":"c48f61fc0470c3437ee79f736ca4cb8d478868377e5993dd5cf2c4f153f3fb13","impliedFormat":1},{"version":"bbd033845ce7f8dcbee73a6cbabfa50f6aa96293c7463d48da286b269db587ae","impliedFormat":1},{"version":"d2530a27db1ad726ee2406fa9f67ac32fd8cb359f593e062ff9aad8e9030d09f","impliedFormat":1},{"version":"309a5306c6c1b394938c1fa863ff14fa0e7532688c962a3a8521f0bda102382a","impliedFormat":1},{"version":"e532e8e4ac90ec48d8ea80c54e6360da6be10b56acd76872e53141275d6e0f59","impliedFormat":1},{"version":"331c422934e75dace7f30568554bb7bfe3ca79023c129071f695148404e3e6ce","impliedFormat":1},{"version":"62d760313c4b8b2f610f6c9732ec500ab012a2ef3d2888eef5e67b80eefcbaea","impliedFormat":1},{"version":"d79afb98e94f37cc3b0afbd9cc742b6ed802c230c7e34cef67827a1d57bf2908","impliedFormat":1},{"version":"7d979e73309901b0e93eedaf96ee968c4819e15a31aa8bf891343d93492441ce","impliedFormat":1},{"version":"48bb97ed124a6baf3ec6f65571e68c1a7c53334f4d26f50d99b7cfc0165bca9c","impliedFormat":1},{"version":"20e3a2aebe3815579fab8a8549706c23f70683b6139f6bb5e899d5d96a0e1225","impliedFormat":1},{"version":"4fa1ec89a0fbf7ea9ed432144b1f04021f7275c37d439c02306184b96f430dd1","impliedFormat":1},{"version":"50c42f4c9693d4d18af70f9e768e2a48cc166044209ee8c7e275c3f89bd63c70","impliedFormat":1},{"version":"9f7c68ac36cad40ed178aab8a954b114c8e940258f919d30b9b9ba76c09a50e6","impliedFormat":1},{"version":"697590086f6e294d5b1625b2ef259559f9799c3cff1d5ac424f35988ca8975f4","impliedFormat":1},{"version":"11be2635c1b3bd67cf734fd47fce489d2448e66ea4617b71a21be8f8bb9557a0","impliedFormat":1},{"version":"ab0309363c9030c31c8beebc112301006bb080a926ecac106dc9dca8cddd20a9","impliedFormat":1},{"version":"70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","impliedFormat":1},{"version":"869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","impliedFormat":1},{"version":"0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","impliedFormat":1},{"version":"e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","impliedFormat":1},{"version":"3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","impliedFormat":1},{"version":"9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","impliedFormat":1},{"version":"083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","impliedFormat":1},{"version":"969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","impliedFormat":1},{"version":"94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","impliedFormat":1},{"version":"2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","impliedFormat":1},{"version":"ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","impliedFormat":1},{"version":"5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","impliedFormat":1},{"version":"5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","impliedFormat":1},{"version":"0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","impliedFormat":1},{"version":"ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","impliedFormat":1},{"version":"6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","impliedFormat":1},{"version":"d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","impliedFormat":1},{"version":"6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","impliedFormat":1},{"version":"11928e29593cb960a3f96eae627d671bc2f2170d7e0a75622e49cef01622fe46","impliedFormat":1},{"version":"20cc41f51c8ff33d21fb79e8e97b985f5a609bf1451f70cc3ce83e6d5f965ab8","impliedFormat":1},{"version":"3289840aa1a3d57da672099a7f14afbc8ef8bf0dd6e2d243c1aff336196ee4f4","impliedFormat":1},{"version":"9af44a67ddc3ee8dec8a5087f3f5551d771a9bbb28c859ab6e39cbbfeef1486a","impliedFormat":1},{"version":"5ab9a9cccf1c561c6f567977ea85eaae51ebe908069f36fb6c35b8d901ab4058","impliedFormat":1},{"version":"0064748c8fb148e24cd533817dec1ae7b42b1aefcce5c69f7462a55c25bdb9f0","impliedFormat":1},{"version":"5cb0311f0b2f20978411aa8dd28124aa7419c0ab5ea4bef73a2b0310938f52d6","impliedFormat":1},{"version":"e6c940a7a05214c36c7f9c383dcd6ebd345d1c87ab06a10d38163e50b9a681f1","impliedFormat":1},{"version":"d362ff2cedbe3e9ba605cadcb2190bc6bf50c163267071b8ac3a6c8d84317f78","impliedFormat":1},{"version":"df805cd98531520aed08a1b485e17e5a69892c7ead5583a0a301d92cfb80714f","impliedFormat":1},{"version":"57b5763182f9cabb6e31c735665668f8c131f3c7d1aa2b880c40dcbcb34d4ee9","impliedFormat":1},{"version":"a19828b49ac566575268aab52fd7dc0c4e58d77d043dd1c83f82ae8d8b9874d0","impliedFormat":1},{"version":"fa1421553ab8ddba9ce3d8af27741e188e9f8c773b84fa54a05658be564cf6f4","impliedFormat":1},{"version":"eafc9af1fa28dc82ee9e41d81fef98ab08078d8e7de6ac286e458eca3e4b0e98","impliedFormat":1},{"version":"5faebccb33e83ed47d6652b4eb41e3cb6e57f66c9e8740e78c8dc2d6ece62bf6","impliedFormat":1},{"version":"f0cbc9019c7953282a1210dc4e47771caaafdaae8cdd9d6b666a4ec8bd67c914","impliedFormat":1},{"version":"93650916d98eab24b6ea86f2f79731c5fd9578acab81176f1a576bcfcddcd970","impliedFormat":1},{"version":"1bf980acccc086cf3469896843e8df2fd1711a98ce37fc5133c1c5739722647b","impliedFormat":1},{"version":"baabe118c17f263b0a356c34802898eccd3f7ca40b96997aceffe1e35e22cc49","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"d8811e82b5bf65e4f839071467bc752d45d52289f2c2e49ee56de51209051ed1","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"8c95ed06561efa2ef61a233502be995190f3492d3cde7643aabcc4fc80888153","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"7010271cc20a1bab3f96b8ed9df55a2d5281d588432343bf656d3d46fb3b6e92","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"aeae2c892e75a91a66ef4c33cad48eac4df713f39fa6640bbe30aefd8d068f31","impliedFormat":1},{"version":"dcd3a1a5b14e905d2c14c0304e03b4239277536406701c36331130710974af97","impliedFormat":1},{"version":"7e176b34473a960c96ab4688774b371d348534ccbc7de76bf218c96a706eb441","impliedFormat":1},{"version":"12895ea8bfe211b655fd579c833d21caaefb55fbc8b0d042f651cfb8f8424286","impliedFormat":1},{"version":"245000cdaa0e0f759e45745d7dac85c90f929bd6ccc16457703c362259dcb0d9","impliedFormat":1},{"version":"b30047932ac48c6a8c61ba49baa29d8066148462489fb752cd54d4c07938da7a","impliedFormat":1},{"version":"eb91981d121da4c3599e678f2d161d7785e4a484e26debd4bbf76793bdc9ae44","impliedFormat":1},{"version":"0eedef2ce9102ec35928c757e3cf27e09f3ca04f3bb7d4a32123f2fe7ea37e30","impliedFormat":1},{"version":"b9b8f1f897989e30f4c91f18990cf1828dc0832532c5479502606ca52a25658f","impliedFormat":1},{"version":"b24f299d182f14a7f88c6c90f7d654c1c85eb6d3813479e182154d35cb49c809","impliedFormat":1},{"version":"e1f1b1c8b61cead248779c6a541e637a368bdf5cfae5bf4c4a8accad2a500054","impliedFormat":1},{"version":"6af0479ea02058353cd8414c6c6f36adf61ee0516864c930a6187e8ccfce49e6","impliedFormat":1},{"version":"1eebb499f94f45857b355e3865503a671eb9f1955987701b2492f9ebbb19ee35","impliedFormat":1},{"version":"5c0254455343a2164c7d7a6c1d43c2319d329edd8177b4567054bd9cc18bf083","impliedFormat":1},{"version":"d1496a79ffc3e1c5f8898817c5f87efe3070f3f6bfdcf3c13ec12f9141cce565","impliedFormat":1},{"version":"f5d0ab6a6b996911c87a781d43bddb86c19b3332d47ba05c8978c1984700dfa9","impliedFormat":1},{"version":"fa820e260726225d1692a06cef6e1d915c3e8a41de7e9e6a1d4575d0f85121ef","impliedFormat":1},{"version":"d1d949485ad8b723a439d4fbfba00cdf9c20928e9de72bac4061173eedb7246e","impliedFormat":1},{"version":"e60233856285c83d8337d2272081ea908c16ac12fc4040c977a8ab11c749bcaa","impliedFormat":1},{"version":"44b381acba23994aca7f6904680093716baab24e476b3fe9e9cbae8e8c47944d","impliedFormat":1},{"version":"09e058a6d706073073c018ee3c9f0a1ad393a437ef18a325c1ae85cb29d34cc5","impliedFormat":1},{"version":"90250a0987fc980d117820d9e1c89c0f7656a15e297dc15d392e87dbd97ada83","impliedFormat":1},{"version":"2b4276dde46aa2faf0dd86119999c76b81e6488cd6b0d0fcf9fb985769cd11c0","impliedFormat":99},{"version":"38d4cff03e87dc58bfd50ffe5a3fb25e6e6d4136a1282883285baf71d35967c5","impliedFormat":99},{"version":"5ecea63968444d55f7c3cf677cbec9525db9229953b34f06be0386a24b0fffd2","impliedFormat":99},{"version":"6ea9c8bf2ae4d47a0dbc2a1f9ac1e36c639b2ac9225c4d271c2f63a2faf24831","impliedFormat":99},{"version":"ce7ce51836fd2f508b0bcddcaa0b8b780da883d7a1239e17538feca295409eaf","impliedFormat":1},{"version":"9e5a833bfb54b4a3370486188a3d12e134c5b29b3364dade3a81b9451ddffd1e","impliedFormat":1},{"version":"b7f70ef6d1a9ce25d100f75f1288c2c444fde889f5caeb2c8a49f70194f44da6","impliedFormat":1},{"version":"4d09be69ea360a371a6cffc15f02f9f159bd64507c6d457133a73f663e41c25f","impliedFormat":1},{"version":"49838f8f6ed3a2653c01022f7e8a58ab5e560d73064303fbdea7b3eafee42287","impliedFormat":1},{"version":"334b9c6b47c119e7d44beb54ac4205db17dc6b24794e4f06e04a68711954d863","impliedFormat":1},{"version":"e14bebaab3c57f3268f92aa47423b225061c40524d337bf86d16936b924c7977","impliedFormat":1},{"version":"a439861fe62f996adf814884947650650fc436898af722e1918e328349fd6417","impliedFormat":1},{"version":"d8f2d457913790a6059dc6ee295aa9a0eb1b7754fea88c24fcfaebc9680cf7f0","impliedFormat":1},{"version":"260a47ebfd3a752a1230a7058c64fc381e4a6a8bc96f7bb7dabbf7af87202976","impliedFormat":1},{"version":"6fdf0d3132926f10124404134840fa72fe00870da3328e349b8060940382c2f9","impliedFormat":1},{"version":"bedf7e7e31a641654db1a556fb77dcc15180f19514fb0d2ed39f157cb0fc301a","impliedFormat":1},{"version":"d1362b8db27eb8fa56916a4e7875fc8a025a759f71865b424c5c0b5ad91ce73f","impliedFormat":1},{"version":"25c4f1af91513fa2c2423d43589c40145b1047b52c075dc58bdc42c2bc41bcb4","impliedFormat":1},{"version":"070eca51dd0a478ddd7cc1cf23c31f4a40ff1fee9465d2d354fedac657ccb2dc","impliedFormat":1},{"version":"91b487cd1a6e7607465a977fdcdf339d8c6225900a1d213dd41936ca3d048836","impliedFormat":1},{"version":"af28cd496b08df6780b3303a74b1d3db3064d8bba9293cc815e92291fc160805","impliedFormat":1},{"version":"ca0fe4ef002f68456b7f92ef4686ef098854137cd58bfcaec7f9ae191148bf1d","impliedFormat":1},{"version":"9330046da4d6724db3c7ef4655b01545f69f12ea9b0eb74d498512244be94727","impliedFormat":1},{"version":"a879c9b09499eecb06df95a87ac084f699e125532ff4f7267ec57ea0da8642bb","impliedFormat":1},{"version":"cea6f3dbab165b13ee7094a5c688d656b411eb0c599a3f8e67f2dbbc53b5663f","impliedFormat":1},{"version":"5b9eb0b64742b99fa2bfab2d1256e99219fbdcea283fc33a36baee703ef3d757","impliedFormat":1},{"version":"f73c97ee355afdb250266e82f79e6d987d23d9a84273b17857c3e61114a76568","impliedFormat":1},{"version":"7c5834846a2e40307b2afdf9cc4d7aac1b16df7f1ddb101307273efb9ed8626f","impliedFormat":1},{"version":"e5cb8515e1b89e67f61ce60306635456dc0ade7e3ee4c1a21ef318d3b543eec9","impliedFormat":1},{"version":"0fbb5ef40d55bfb6f7a5c2dfc74211bbc610a3ee1eb421185d3e9a322f69a142","impliedFormat":1},{"version":"c225b50585f0fc6f4687b62f5511881df9f3d063f60f2f3af727dff2e690d519","impliedFormat":1},{"version":"0331c6f3ea4740df86020283f0ff05cc4bc755e6310bfc9cbdc10c0b27c2c08f","impliedFormat":1},{"version":"5662a627ac042ee96e4627f855f76b08bdcdacb6f5c546a6692fe4629dbfd1af","impliedFormat":1},{"version":"ed673eb6be36e1804151a1e42478c83dd0b92e0cc265bad9dfddb3abe51002e1","impliedFormat":1},{"version":"0485ef83541c8cc016daa28f7ebe980f698d903151dc50a7efe7ddf023815681","impliedFormat":1},{"version":"1c906055b32d01ec3c6ffd245d9f5d5d2387de23a9026e6849c35729d5d1252c","impliedFormat":1},{"version":"aaa7fec72a5ded92db87991af37956fc8255e9b8da4d9165445edb6e5ada22c4","impliedFormat":1},{"version":"6acc9e5761737d08a7e163c43d2ac814eb63ab1d6450594e9ce8e66f49e1eddb","impliedFormat":1},{"version":"c4aacb40f647365929a82cddb1e51fea7c8b530183ffad74382c9648c03b56a4","impliedFormat":1},{"version":"8c1bd8efad0300b1d4a652fb5aa1f958931d9009c9ce89d98019d7a8b55dd757","impliedFormat":1},{"version":"0e1a8479fd2c48803a987f637ebb64089c526b8e53d7974160204e6dadd8ef94","impliedFormat":1},{"version":"b9d6eb16792ce9cb9229c083db7c9dad07e4d598ecf3a891933942e7ad1fb070","impliedFormat":1},{"version":"cf75c3422ccc5362f4911467a896f4f77f7cc1bcfdd074046efcb3130ebdb8e4","impliedFormat":1},{"version":"2e0d32660751155f11c422e203181d899fb70685334dd688c17d158f31b5b0ea","impliedFormat":1},{"version":"3992ab15b523b97d436a282b1df2f2b9f20c9ef9e44d0c23956c25aca77d2076","impliedFormat":1},{"version":"68744a94adb00cff7991566d8b0467fdcadd642c7221ce963c8de8f730c47251","impliedFormat":1},{"version":"859d3d75d172b559d96b45b16b260905984693ec0798a2062211542355858498","impliedFormat":1},{"version":"b8070a737ec60850d4f04568a45665a2cdc692a6ea7545d7c9ac6c8a25d54b38","impliedFormat":1},{"version":"b4ea4a558b069b4035bbc2bdebc370205266a830dcf1c90cb7ead22da288d074","impliedFormat":1},{"version":"5a39278b38da2df895e9e2e6fffa33f50c32516732275e62fcad0d5f2b50acc4","impliedFormat":1},{"version":"aaef2354583399610f0cfffd6683fa200f43f9055bd4dfc8c9bcdbba89c93aaa","impliedFormat":1},{"version":"fdd33dc882f735aeac4e1c6ccde0b8d25b07b1caa7e560adcde7fde1df1e8e59","impliedFormat":1},{"version":"4ef318a4a4e1e127d7bd4c7099f61e5e38487b0164aad0eae92794de0e220a5f","impliedFormat":1},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true,"impliedFormat":1},{"version":"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","impliedFormat":1},{"version":"3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","impliedFormat":1},{"version":"befa24d0fe8eb1c15032e835c25acb8ae19ae101b55891226786b78884036440","impliedFormat":1},{"version":"431384f165550e249a024da1e4f5ecf67a9ab9bd80824b9198b991600442c0df","impliedFormat":1},{"version":"4300901bc259f4793bbae2d30b57367e6cf28873a8b59a35ec466cf5141bc71e","impliedFormat":1},{"version":"a5cdab3f89ea55f22485d6c6396b9477b8fddffb8096d869a2c3eb6a0e9f339b","impliedFormat":1},{"version":"0f45810ad7155f5cf85c3b99d8837fae35bef7d711f122a362bdbf9e30484cff","impliedFormat":1},{"version":"d12a37c3bbf382d20cdafe0f214cd2aa06cdc45a1753bf975ea44595b8852486","impliedFormat":1},{"version":"3f11a6347ba9d4ff1810cd6e8724295f2b5b92226279e33288f0b81c06854b11","impliedFormat":1},{"version":"8709b29708d70d23bd2f6bee7439d1d63aadd3bbbbbac60ecc49cfd114492b83","impliedFormat":1},{"version":"63603b74a5c670f0b329da6cae9613e71315ec3a663a5460d9892a24ae63fce8","impliedFormat":1},{"version":"474597287b297a39012f8b0fa009e7804716ed3d98b4f6762e62c6af03edbaae","impliedFormat":1},{"version":"3da5744f338a502b7a30a8f7d2aeb8dabe9f291be198e2589f0ee6eb462b6c49","impliedFormat":1},{"version":"c1c5dfcacaef9132803b17ea1cf5f2053712379342c872e4aaefd53141c556cc","impliedFormat":1},{"version":"1eec8cf56d2093c649743c7697af7492818af939a54f9abf98ccad3403232a2c","impliedFormat":1},{"version":"9b72b48165071801b8ca583e8d0a54171628e6ab6b30a6bd18878add23fe0cda","impliedFormat":1},{"version":"7f49c8e8cfe9d10753fc2d20dcba79fd7b28100248c8604daf1fbc787582da5f","impliedFormat":1},{"version":"704243b2f7a509a2f624ab1134a5601f821a39e1c9f1409e0a28eb06e98ac49a","impliedFormat":1},{"version":"d2456be08bf14016213e583c1ef6f8b7862ee1945073418ba333332c2a387bd9","impliedFormat":1},{"version":"b92ad137770ccbe702dd1cee2cec758cc420aae8650c89634c2125caf569041b","impliedFormat":1},{"version":"1add518ade30764380038c2d9aa0ec37d7928dbccae9ac123c4f8ea0c7f7932a","impliedFormat":1},{"version":"5bcbeb26010db8f17f012b0e77790f082c316a346f53d4ed75c342b14e69c8e6","impliedFormat":1},{"version":"3c799e898646a0555a7985f291b5064b7f335681f4ee3a796ea6deff8a73ab13","impliedFormat":1},{"version":"3ea3feea868f4f946bf6716b08886c2d0a22fd6c189bc9ffac2e8b31a9ddcdde","impliedFormat":1},{"version":"64c6e64233faa6e3b585f7b49794a4e8a9d0179273cda83e7b14aabcf6f113c1","impliedFormat":1},{"version":"07ceab1b624380efa77e39a01059bee7a792c94b5dd25baf13f1251efd2f4998","impliedFormat":1},{"version":"fd006bbb36d0cc0fbb782e0412404db082ebd1ac6800fb4b45bb224feaf83cac","impliedFormat":1},{"version":"3f72825d097b9c4ab66e25d105ad242d564391d77046861efaa361b1c7f19f69","impliedFormat":1},{"version":"9858d6b1cd99022bdd06174633253e7ccacf1ed62a15adc91ba148293f9804d8","impliedFormat":1},{"version":"4aa8fe27a526a30d218700ec9e5c09032ab40bf0a18cb4fc4b05f773a1e346ca","impliedFormat":1},{"version":"0597858092c8c1c38653961b31ef9e1550a4cba33da9b03e0b26a424b9d565f6","impliedFormat":1},{"version":"e1e73fab0b8967e5849fcfc6c7de0303614410ee427edae0e36053ecc2533548","impliedFormat":1},{"version":"21316facbb79ba139743466ee6194f3b8f9ba797a2b55af86587161533b46b06","impliedFormat":1},{"version":"17217ee1c357567b7a3a16bb2e179ef01dd41fd28fff1558739bc340577f10fb","impliedFormat":1},{"version":"5a25f38411dcb5454f5c65110b4f6ec13af072cdf8febaea3829057f91ccd332","impliedFormat":1},{"version":"fd3170f4e448620561e53ac9e6447b35380d19ca9bcad219aab7e9add85a7187","impliedFormat":1},{"version":"f476947becc7ea284038fa40c427377d093c965ba93c5fd41f97b13b5045a1de","impliedFormat":1},{"version":"53407709f23c0357090d046b42f584cfff0d53696f0069bfe8469132b6142bfb","impliedFormat":1},{"version":"90a1100f09a52b5910bbb6a99b2e38f401b12de60f62af0afc7d034cf993b631","impliedFormat":1},{"version":"001dfa751f23df81842cdb8c26d561075c5802fc533e9dbb3ee73f7da3b5adcb","impliedFormat":1},{"version":"eebddc56f0570ba1a5538cb83507cac13ab7f24759e784da8af667d133409ff1","impliedFormat":1},{"version":"01794a05b7afd9db0848393a716ca3066cb32c4fc6d7ded02d70d8f2d4eb44c0","impliedFormat":1},{"version":"4a495b3b83986729f7ccb8c56e818e4c45d7d9050ea5827c23f6a89cd71bc529","impliedFormat":1},{"version":"bfc25a76dd65759c7401cd2fe4f070af193e8785c1fbf0a44014476a74190801","impliedFormat":1},{"version":"e59dee4d2b27a22b2bcb9020210a7d065073f09ce609da7cd402c76aad73d883","impliedFormat":1},{"version":"394ebdc9deae76a1c3e4ba740d60f137a46bf62d77e0fed50b079c34cb907533","impliedFormat":1},{"version":"8a0840a8819a08a9b7af9e053df07230542906bd2aab74bd3dada375f86c75e7","impliedFormat":1},{"version":"9ab6534198d7bc487bf5e990c6f1b971475d75a321f0a34f0f3f73a3d5e42265","impliedFormat":1},{"version":"5546f701029060f659bc0366cbc2cf212aed72316f1b41744740462ed416751f","impliedFormat":1},{"version":"a55dcf8d5c65de8a5326cd6f20a620b98ae5bdf86848a586902320dfa612b33d","impliedFormat":1},{"version":"9488e08ce992e9e64976132daa5275c57bc3b91b3fa37fc33b81585617daf727","impliedFormat":1},{"version":"fc9c2fd31b900c7fe943948a532ddbcd3b7e687f71768223c889596d11ad8dfc","impliedFormat":1},{"version":"cf5d4a9d3befa0c6c34a5efa3489fc7ca003100e05b2a2200c812744dc4b2920","impliedFormat":1},{"version":"73ba02ac9e145564d4e91fe90d07abdb6c3d565f213907cdd81298fbb01ed73f","impliedFormat":1},{"version":"d600313e3c07f919782e2cefcee7dd9af336e847d61d7bb6f77b813b08d4558e","impliedFormat":1},{"version":"c509b5642db6151661020758ac12bffa7652ffde20014b621a17a38ba2a39e32","impliedFormat":1},{"version":"df9d5f06a1692717762ca9f368917924fdaccfdfced152804d768eff9baeb352","impliedFormat":1},{"version":"34fec0d3b9abe499f5d53f1ae7a6c28d34ac289e5cff6f17587da846823cecb0","impliedFormat":1},{"version":"9ea3742314159f08b93e3dccb7fdba67637ba75736c12923d4df3ec9f40590ab","impliedFormat":1},{"version":"bc55f374f2b27277afd0ebdf0e503faa20ac18e81d15ac106e443ab354d3e892","impliedFormat":1},{"version":"4055e5f20cd88d6a1b97dcc9ef0708655901c23c974c17e7cb5a649ebb960b47","impliedFormat":1},{"version":"e35562032ca67f79d83bb8e2b86b61dfcbac6a914ce15b0e2235e6626dbd49f7","impliedFormat":1},{"version":"6fa98c19548b13e63df64ea3b9dcdd5b456059f2ec6ba14de67ba295c3884a9f","impliedFormat":1},{"version":"39fa2f68f5480e3f2dde09f8cf03e37c0b79479247c7a169ce833a39c3da38a3","impliedFormat":1},{"version":"34166077f3e6c2e0425c493ac22f674bb82bf02346f73dfab87d948e22f935ea","impliedFormat":1},{"version":"470b0bf94d9a87acee352d3064e5a58ca17c0e724ac322f99277df7d61def640","impliedFormat":1},{"version":"ba3735044629473bf01fb4eaf08e7feda3f79b00ed8e940567ded154b3ef7a92","impliedFormat":1},{"version":"95380bb77008f7bea0cb26c8419d7d9a4059dd1b052ad398cc8206307488321b","impliedFormat":1},{"version":"9ab2a9cdf761d55b5d7e6880a2eec20e50605202a34ab46cc8e3724c463ccf18","impliedFormat":1},{"version":"33f56865801c2354a9445b2f73ad504ca30bd16d9ca1677e80e14f9b1d76d456","impliedFormat":1},{"version":"a732278091b58df250bf1c50f11967bff74125ad4908da145934b5f2556328b2","impliedFormat":1},{"version":"9f53d732e2428018d73f09349e131c752387390bffff810fd0e0e8107337dde1","impliedFormat":1},{"version":"b4f5d434244ce624d089903f43f6fd9a1968afc9672443481e01743ac30fc135","impliedFormat":1},{"version":"72cc6feaff60559b953dd5ed55eed369037a02e1e75cda3845ca5de197a95a98","impliedFormat":1},{"version":"238284e79622aa34170eec5478e831fe63840fbb21e4300fb93b20b6c0902f35","impliedFormat":1},{"version":"d6503005937bbcc00bf5e2f5bd8d8189874aa824fb97499b2bd6c3b2eac1a043","impliedFormat":1},{"version":"bf9df1f095e33429aa80a7b057dad0185eaf472153408e0dde1f3e1986384686","impliedFormat":1},{"version":"1c9447cb3bc13bcccc77f144ade5a14f22fdfa1fb4f70f329c390e83b7b75a60","impliedFormat":1},{"version":"0ed013647437fa6f99ff128466bc63da7617d424996363b93f802c46a629843d","impliedFormat":1},{"version":"9ce2630805a121ede26ab84c426011dcdbcb653cf9205c8ca76a7a3893911055","impliedFormat":1},{"version":"be027215c5ee2b49b7489152206927df2b445fa7bbfcc34bce0977faf343ffe2","impliedFormat":1},{"version":"03925a73fad9827b2ad7812d6da4119fede2006e792fba0e59921bf55dde9bd8","impliedFormat":1},{"version":"c9f7ea1441283c00853bde21aebda6882b05e33c6168c93baa2d9b97ca530d43","impliedFormat":1},{"version":"f7f295733dc582028cbdad1e143f235bb85057d2352f7eaad46913b7c633918f","impliedFormat":1},{"version":"3b75242f88aaa3f3f32906223e09604e289fa6307dcd408320c9ed5c1b8189b5","impliedFormat":1},{"version":"6c0e51147f9b5769564aa829ee92beb65d4fde7d7241ec477a5c90dd09bc88a8","impliedFormat":1},{"version":"bb23f3a09f655673fa8c540028fd8cd016a9f5193b99b8dff1fa5233c240f55a","impliedFormat":1},{"version":"17c437eede5b2b3794cee847a4813d34c420cd1d4928b7a1e7322914112c949a","impliedFormat":1},{"version":"5eae95c41ccab2837381bbbf6ad8d2268ba05b65e760a3d0778a17b4d19965e5","impliedFormat":1},{"version":"43859204f2f5c89806116b87e6258aa9a9632d276a4e6f31585e0bcf79f6d81c","impliedFormat":1},{"version":"e175be3dcc5e0bdff3c26ee6ba0df95317312500e77ba770a2bc2e6a6c1ed3e4","impliedFormat":1},{"version":"8c4a91c016dc8cabd9338b7e4f2d1c704e24def84cf11c364eb44182d6ef5571","impliedFormat":1},{"version":"425407e1fb17c6762a6826e200882ab78ab254c06a6444bcb5a3edcf46ceac38","impliedFormat":1},{"version":"cf83180e6daaa29b5d127036a28a163b7dc5847a091f39719b39186a2ec35e7e","impliedFormat":1},{"version":"5a966cbed46a89616d3440cb50faefa551bb97b638ef26463d83a26b80c85584","impliedFormat":1},{"version":"0d8c8a56bd5161dbf6e10ce058d9dfe704ba946dc0d96a06a5b1c24c1d263d9a","impliedFormat":1},{"version":"476a6e9be301a83ea80d7f6475f2149a791e5d0bccc4653e627858ef4de62c0c","impliedFormat":1},{"version":"8c544128f4b4bf0764171b3be269511a3ae1c7ed0a3a721d41a690fdd7be929f","impliedFormat":1},{"version":"b2ea16e5a45b52fcd1c9fe6ad92095043d4d14b6ba661e34b8989f56fd9e43b9","impliedFormat":1},{"version":"d41897ad53cb52a13672bded07f42ce1c26b2e09776f8e6476c3f72f2d66dabc","impliedFormat":1},{"version":"1696982a830aea0e8e2f24ed5948fcec04ffebdb488bd93682313cde65cd4070","impliedFormat":1},{"version":"1e0bf6a0392611a0471a2f5ee45bd0b37b7100f112b5cc6a39d133beef733166","impliedFormat":1},{"version":"3ef07627f9a75f417148c2b65636c85c1995fe1130b194f1ee3e78fe3fbd8e80","impliedFormat":1},{"version":"d41897ad53cb52a13672bded07f42ce1c26b2e09776f8e6476c3f72f2d66dabc","impliedFormat":1},{"version":"3fa41f1b472d6e2719ac119190cc3e2ea4624b215fd15ea9e24fa5b7f8ec92ff","impliedFormat":1},{"version":"a0ad754b3bd67e8319030bbd6fe4749403ae0957153aa9f8f2c3ef72367cb0e7","impliedFormat":1},{"version":"515a4b762ab67fbb967fb5cf5e04ea3bab01b8757f5f0a3b834ff57f64a43217","impliedFormat":1},{"version":"9ff0d5d064fd804259fcad19909310bec4f6aec74c4970717aa604a159f84211","impliedFormat":1},{"version":"8ca03f479209baed02f5887a9e8222d4928850fbb14f79d3efe90d7a47028ba2","impliedFormat":1},{"version":"8341b97d5144a2dd38aa90c0d3a68f513faeefd56c758ddcde9c4d5b509674ed","impliedFormat":1},{"version":"34b5a3984848f246d14980ce87dea6e65318c32d5d33524740554c07ad9887c1","impliedFormat":1},{"version":"c6ca371b4283afbdd3a50f79e622879c00ad47514e242b03fa5179c7eb95dce9","impliedFormat":1},{"version":"e1e33525d37412411fba373f748ad91a6227943562ecba5e5e15ec140b220a44","impliedFormat":1},{"version":"523064befafbbe3bd4531dcf4fcdfa8e8bd25b6254d3da82ca8daf28e929cf45","impliedFormat":1},{"version":"bbbabc262fe1433817034b7225b9ab813063089e7faaabee72bef82178427b6c","impliedFormat":1},{"version":"4abbabd14e5ecb558fb4d8336fef5b2f602cf2a473a4260c5791537b3336a120","impliedFormat":1},{"version":"3559692171981b2101f0632726cabecc990914a9bd9abd4ceda20262811e4739","impliedFormat":1},{"version":"c48ca18e123cb997aeccf59222900780f64f83ab3c09ad585925b4962b15d250","impliedFormat":1},{"version":"401a63669e727547540d3b7baa92a52baa3347da9a306caf2f95700233b53a4e","impliedFormat":1},{"version":"b2233cd6b982a2ed3025edb1cde0f00c2d0d6db1fa8d7fd6b8ff9faf55fff742","impliedFormat":1},{"version":"97a1e967f06b13f2a8d7a3d75d89321458f761da80348c2804efb7e741225b87","impliedFormat":1},{"version":"c99b06fb20ce897f44d6777c61323130a0a21cafb690ff7c7304ea4d0d8745f7","impliedFormat":1},{"version":"82d152b72a86c2e9fb8c04c47716b03d4331c7ea00741d9093e667542c93a9bd","impliedFormat":1},{"version":"12f31c855d6740f7e9e334f93ae201c80044870233588b044e984cf383e9a94f","impliedFormat":1},{"version":"6b3e497a71110453570df44901ecc7dbdd5c5c62b008abe9b69dd8da27def2d5","impliedFormat":1},{"version":"bd89b633f43565e1f28b0add79691af677e16225bb8871f84c0056757f3ad7a0","impliedFormat":1},{"version":"84586dc2e5f93a90a1146cd283267572d6f511d860529e61d59edae63fed30bc","impliedFormat":1},{"version":"f590b53c526623edbd9fce0ca85c4d842c9c6bf44f3b8d7beda62c773ccf17f5","impliedFormat":1},{"version":"68747c8a7d6a02d44b626b1666f1af75dd6d50adef6996ecbc8a762488ed6550","impliedFormat":1},{"version":"96e01aa02ba1cd98b7570bb870537d3f49a68bd6407fd9239139985da202bcf7","impliedFormat":1},{"version":"e24c8e4ce93f2f740d5dd1ea575a85725b8e1dd320da5257356938beec2f5287","impliedFormat":1},{"version":"755f25e8fd9e37870e11091272f14dabb0cd9e3dd86f5df0e364eeb6419de87b","impliedFormat":1},{"version":"327754df1479b0c9c265b97b0aca99fbe1953e3d20497aa42ad6d418e514bd7e","impliedFormat":1},{"version":"3aaff6c0d520561d754395b0c4b7d706f06a98587b100f686734d20a643a4c56","impliedFormat":1},{"version":"0e8d39b8b864d097c5ecc6dcb09be4d6026d54d7a811b7bf7629b756de1c842c","impliedFormat":1},{"version":"a2ed41eaaf4327dabdcfae228cdb972e44b7ee768a13905026951a3d9f23daef","impliedFormat":1},{"version":"9fbf799e5eb45a1236439e09922d29f48da728c266a9db773f49047d43b73f1b","impliedFormat":1},{"version":"5751682bedac376a5779f4495e103aabcb1f363789226e0a754b201a7c3530c8","impliedFormat":1},{"version":"7cd9e903bf78a331847fff8d4d8c468894aadbbf2506a9bedc7c4f0a6a24c3a6","impliedFormat":1},{"version":"a501c4d0b90cde0f0721c1d8bccfdfb6843c650fae6435a185940776e72d82d8","impliedFormat":1},{"version":"8774d92fc085de678c5da7070b9cdbd39b939f629cf683a59218aa1d05db45d0","impliedFormat":1},{"version":"d9dd5e0f97d82848d11e11f87e71e9b9f475fd836f3e879b351cb4ac72bed905","impliedFormat":1},{"version":"d6a2e78ffd68d0a404d13cd60152f7ee4ec48bc1ccada92daab8e4492d502fd0","impliedFormat":1},{"version":"072e6a97e2a9291437f0541d5c06b5579e077d573d41f9cc9740d04972549633","impliedFormat":1},{"version":"d291627c803d32e31129575c8c3c5a83a23e38e69d8e5cfe3de0d2ce3f2c7fc8","impliedFormat":1},{"version":"d25e50fca109215ad1dc01b671caae85734594c677952c26da77facae17849af","impliedFormat":1},{"version":"98dea46d677c4222fa5b77c267335b2d336e393740f22768179fc0a0f9f95bc6","impliedFormat":1},{"version":"daec5d2d52be233262c80013e18d57be920152412de99ddb637700410ee7fa7d","impliedFormat":1},{"version":"e1e1837b07bbeb81a00d1b0b7edebf8f3e2b44ad148d5faff905ba17a0005813","impliedFormat":1},{"version":"e7e02f538956c85e11acbf3586c30048ba17d9457f23a4547cc6213ca80438c4","impliedFormat":1},{"version":"f5c47c1ab571300759282cd621f629a1c905742a67445e08e1fbf23f60183f2a","impliedFormat":1},{"version":"32d0da1473ddefee1c6fda291b0a80b90cc29b595c5482091e3e7ef8290e73aa","impliedFormat":1},{"version":"d025d6a28b3d69ddeb3cb0b9c3e7ed19ec8fb24452e18add0b495fdb5ddd18f1","impliedFormat":1},{"version":"1e778ec11fda32eb4a43f94247733639185f80212b6bb7e340838d4bb5c6249f","impliedFormat":1},{"version":"98a9416dba4de725fef1dd559a12f1fecf1ac784e6542141b590a611ce5084cf","impliedFormat":1},{"version":"20e1e198d28a4ce7f665091b7dea408351573c6599a8a3fef57bb3e345de4660","impliedFormat":1},{"version":"331a4c59ba270fca4e7d2bac87ba39135a117c460a12ec48dd919eb8a47ace50","impliedFormat":1},{"version":"0e56229981d691c2276d9f0112f536e103bba5e8192ccd5554845cd1f22a8c0c","impliedFormat":1},{"version":"c4afd4c403c5c08c2e0ee80f9a2d1653e4a55b5eb826db428ada069871c5b954","impliedFormat":1},{"version":"1bbb133267e10a208164b403e93aab3fbd78bc7d6c846a17804b95d6928b5077","impliedFormat":1},{"version":"ea5dfd206950d5a8eed566a321e42033f5b5a9df94c728e5c777c15fd009fac2","impliedFormat":1},{"version":"3464bfdffab42a9330124e1ee6aadd25433822602ee6a7b30102bf08ed7001fb","impliedFormat":1},{"version":"a7125fe108eb2f3687f74863ce642b05df19b2ccd2ac517a991957e3225c6496","impliedFormat":1},{"version":"41d618c1a7458dbaa9f29c5545d1df2923b8978836c757b41d85627982b01311","impliedFormat":1},{"version":"4bb6ea7f076386c7e82a21f763a931335150189147d191a70eb256f271cc0c8e","impliedFormat":1},{"version":"c7b19f40914ec59fe03cf4d6ebaf1b78a5d919e7284c22fcb57fee0ba547e084","impliedFormat":1},{"version":"0bb2c3e440231a71c28098da7857a79af8b7b462efdff01f6617b6a644aead8d","impliedFormat":1},{"version":"130e2259e30267f491043652773c9bc451fa8c7fb390f015dcfe7b3274b5b943","impliedFormat":1},{"version":"ae8b19ae045199e8177376fbc2d7b5d22dceccdcf965a4fd8b1591b7b1e6c954","impliedFormat":1},{"version":"0f4636ef291069225e2021144bda3c5370940ec70713ee0997f60b5084071823","impliedFormat":1},{"version":"f962fc4f05bde2eac9d70b613116e0e190d01511d62997d156b97d91eaa86ff4","impliedFormat":1},{"version":"6d80a7a75e84e9088cf23db88d829d7bf234c4e0dc4dbec02f78298c933b1882","impliedFormat":1},{"version":"543727847603aef88cf045219ff34f21392234e0cda33c6b4a87b296bacff9c6","impliedFormat":1},{"version":"8043dca35c02bf2e374c2c4e7d6be0429cd0b40ad80d51244adc061d68b54274","impliedFormat":1},{"version":"3c18cf90597200a6d15570e8ebacc02defbbb55077656628ad88e5e441b0b767","impliedFormat":1},{"version":"c369fec12e7e19e0db95d3bb4c5bc2b5b0abdf27cf6a69c07d40af580ba2062f","impliedFormat":1},{"version":"bd88ef18037d28b1f6b73ff2c9656cda9b85662b0a9e713a0531d28edd82ce1b","impliedFormat":1},{"version":"d1ae311b1aa20b835952069b1cf5c5e789140c45ab3a8eeca05781963ffc31f2","impliedFormat":1},{"version":"3a8628855f9dcdf076089ae6191a1797b41d4326aac3ea444e7b25a4e51457ef","impliedFormat":1},{"version":"0a613cd9a16af8a92d40007872548dcc1099e5a8063ceb6353821281c25b972e","impliedFormat":1},{"version":"454f21c515fd79ca2e8a7d024e384a9a680f2e94773c250adea98513a1e22519","impliedFormat":1},{"version":"fa37abd7294cb730fa278277b6aa22ed4c867308e778842113fe7b112c1054a3","impliedFormat":1},{"version":"f42496e94a212599cd12686e30a03c2ee81acb62e8b7dfbd3e84bf80abedda4f","impliedFormat":1},{"version":"6512a1722a7bae28f23066b426ab271134a23438c5dbb4030368dbbd085c220e","impliedFormat":1},{"version":"5a4944638591d30d04ce19dd91d92e083e620b0962f9c6a5dbc73fcfee155e17","impliedFormat":1},{"version":"83295161ed888ff8329c83d76ef4fcd0cd8d75010fde91623e65524017cae470","impliedFormat":1},{"version":"9e0219eefe4f1950bba1be69f32ce595175925332a654bf77d79b5c588acb099","impliedFormat":1},{"version":"e050e9297ced6e6b38841b93032503c6a5a0ba9bbfad6dd100803ba7ee86fb1f","impliedFormat":1},{"version":"2b4464731f95a1383395b4b6ab05750dd8003cd4bfc082328926524dc960071c","impliedFormat":1},{"version":"6c5db87af9fbb0b8ce270c6e700e5792ba4e75dc011932f5ebf8f88815abba3f","impliedFormat":1},{"version":"46609a58ccfa4ed8951d70c8ab20c6210aac7134db4f02f29eb8280601aa2ead","impliedFormat":1},{"version":"d221b97fda8881de90ecd5230e016f799ff3f581365e1ea80ec46bcf9804fca8","impliedFormat":1},{"version":"7fb8c3b540902629363eca66cfef31a0911e173a4b2fda3dcb0c8b38153e784c","impliedFormat":1},{"version":"70f1363b4768270a362bc0c1f3c2c6b4b1cd91ff6e62a861cfefb85f10bd2d90","impliedFormat":1},{"version":"d459a18f41d24c565e0e7bf8071058cdf4a9442a4ed8db1dd1aee59db9ff5cd4","impliedFormat":1},{"version":"624e6a7c29d308edd5de72cfc550bdee7625f2dff415c54d106b3be0b8651e68","impliedFormat":1},{"version":"25839b70a7407a9407a4d1a23fcb27762ef797eb3e94379383de748d52b4bb66","impliedFormat":1},{"version":"0adf7800005a992506b7e466c6591d100b9ad6d35b6d401e36d8307bb5c85015","impliedFormat":1},{"version":"6cc8242641c5e6befff23d1f62e400ee92437ad7bb89aafdb4924a6642564492","impliedFormat":1},{"version":"9d11489bc447facb412f41bec85117d3316e2af4d61eae43373609e890a55a6f","impliedFormat":1},{"version":"df82a8fb2e5cef3128830a08f6d00e5e7c3cfa25444faf10041011ad1ddc7623","impliedFormat":1},{"version":"0fff108215903bb791003f0ec4f522eb5b14986db32e11665ba09e73f407fa8c","impliedFormat":1},{"version":"98e1825ffe5adf884f52d751cde062b83b65fc2700c7098207686ca2f59741d2","impliedFormat":1},{"version":"6a3ecc2e6aaf46352e340596f82bfd01f52af258de902c9f98d332d646e5c9ad","impliedFormat":1},{"version":"77750e016cfd22e596572f957394adc24de3bb58e522cc55e289273442fc5002","impliedFormat":1},{"version":"98084a725f9b773ef2857a65fd4c7ba5d14694f9d73641a73d4647af79285b37","impliedFormat":1},{"version":"911f6b60872922ed17729a45fa3c1fd451e21b3ad8c3713a922beda14d5c7fa8","impliedFormat":1},{"version":"c3a92b5f905158df2f7600695b5af9b5c6254a0c7fa55fd6f191dc57cec97e83","impliedFormat":1},{"version":"a26901dc8a992d9283f94d258becf1500ee527a7941a6d7a5a64c586b6136733","impliedFormat":1},{"version":"2810b64ac19e63be91648169e04961f6add2d4e236a5730ec91d0cd8ee607155","impliedFormat":1},{"version":"09cfcb72ced8e606b5be59f4b87ed0af05fb1971726f21cb88c8c1bbc1cd2248","impliedFormat":1},{"version":"fe058e3ac05f9718ae89fbbae68991631c6540cb86036efba7910eab4557526e","impliedFormat":1},{"version":"6c8117420cc7babd64276da689df960d1949274970e4c0d39966404eaa1e3dd1","impliedFormat":1},{"version":"24184a91f0780558b3f1e8dab0c65ab320acd993e3f96872ab1951ab2020d1aa","impliedFormat":1},{"version":"6f5725b935925bf077168f60943fa29985839b7fa3669fbd5b078c347cd01e05","impliedFormat":1},{"version":"8bc25096cba884c56dc7a170830defd7dbc4eb75ba1e83d1e285216a50870f9a","impliedFormat":1},{"version":"aeca1b84be03d3326ca244d5a45a541004d2ecc543dbbe5e14727d03dff7ff22","impliedFormat":1},{"version":"fa8e0b4784fd50a6d0cfd6f7bbbc2e19d6aaa1cf58f8197c16d5e86e47e44aec","impliedFormat":1},{"version":"2e8e081aaf314b1c50271aa63a84934d91dd664ede3662d65572831b61976aae","impliedFormat":1},{"version":"abf7b81b492331d5c2c126c8d40eb3c8656c4214eb611feefddf12d3f259336d","impliedFormat":1},{"version":"8c8e7e234af3c537f53d8080666c39bc482066e043819d97aee7eccf6ac9d7ab","impliedFormat":1},{"version":"cba3353f5a0c93c5f29d3592f892251c9a367390b86cbfa44dcf92b54f6b1273","impliedFormat":1},{"version":"7b52572cbd825c9ee1cda96d9f2aba22c433ba93708b798dcf688cd79880788e","impliedFormat":1},{"version":"5e33a99c3759bb4ada6eac2103dbf45f073de71d7fdfde76569d81e324e6ec2c","impliedFormat":1},{"version":"75193a248aa1f5916bed2f77cf1aba44f598800089f701a24c8f82dd0fbc6b8b","impliedFormat":1},{"version":"956030ad86fb7367c9372d16f7802e72d67677620e4391f4ddd343629afd13f1","impliedFormat":1},{"version":"acfb2b43dfe5a70cf679bdbe793765d0dc21a6d2ad3f755fb89ecacc18f04b61","impliedFormat":1},{"version":"0a9a5cd5e4510d9f1cb8cdd897a98526b3a387e814b992fdd44eb9ffc6096103","impliedFormat":1},{"version":"944c2fa1a0bd0ec1b6ca003d7fdd4015641d388a124a8a42c9e50204f0b5322e","impliedFormat":1},{"version":"50c88ab8c34ab68c084a9d57e16e7d6df1b2f4b034b2d807b0ac63ffb5452aab","impliedFormat":1},{"version":"acac703a2fe782a9075fa64161d83b93e2ed84971ce5778b54367cae04861b4b","impliedFormat":1},{"version":"1e37e13f7eed10a9113766a659c71c8524131f906f7a255dad2a5bbbf523a3e8","impliedFormat":1},{"version":"acd1a028e3e324ce781004b3d7caf47642583674f37806bc324e712e1a73079d","impliedFormat":1},{"version":"6f8c2f7d30b0826e4abb52cab6ee47b38da458b2f4df1d9847aea7dba09d91d2","impliedFormat":1},{"version":"81e485f9e98308bccf4ac86f1d82f321ceda2457d412fec97000f817b9d643bf","impliedFormat":1},{"version":"6d4035817abe611f96e16ab5c02d08769e57d8378a21bedc639ad01c0dc18f96","impliedFormat":1},{"version":"28f011d350478330e3c38dc8fbd6a803667c93aab3b7f48ee1821b77d1fe295f","impliedFormat":1},{"version":"58f99b255362976cf050f38c16c1d5c2692f16df9c89d32fba375b2d6e245c9f","impliedFormat":1},{"version":"ac21b8dab215ffdd94a264d31c1a103f1367f64572314683f07c668b49a654a5","impliedFormat":1},{"version":"229add56e247c1e8182d073d534d3f907caea366c89c346d8340c247a04cbc8c","impliedFormat":1},{"version":"b6e116973657b5cf2cb3f51332793b26fe31f2153c5eb48caab0d4a5af01542a","impliedFormat":1},{"version":"968ff63aa5d7b93804ed371538653ad8e1f7a8c9988bb1aa9efd65b620aad64d","impliedFormat":1},{"version":"9f2ab92b089dd1b38818c1af589dca006eaab8abea5a4309b57f0de09cb5ae5e","impliedFormat":1},{"version":"6875771fb6530522c5316033bfcb39881bdaaf7266b145792f322d895fb26ea1","impliedFormat":1},{"version":"a8e3fe551a045dce96e3c5edb2bc6f142692ec771758b91e28f1a7107e9c742d","impliedFormat":1},{"version":"d739cf4900378ed3f81009897b135cd8bf836d2c61354a0afc624788c820b0c5","impliedFormat":1},{"version":"09e15e0e59d1be87d2c68a4542c6ca9a6debd152158a6f880454e0ab9be37ad9","impliedFormat":1},{"version":"3710a4a6660a9277bbe498a19aa9999997802dc0dc53dd242087fc8ce4832198","impliedFormat":1},{"version":"fcfa4fd199884206ef931eb960e66d35a21570dd023630504a48c68421a35a6f","impliedFormat":1},{"version":"3c021642295e99ab82b34dfccf1f9107105e765941ee149a58da1e75d8b34fc4","impliedFormat":1},{"version":"eac743b5660e8e7a5b5c3b1cbde9d58d1d938f31c4ce301186d4904ed16d129b","impliedFormat":1},{"version":"35f03a5828927f555db3778528178499447b7ca406f4ec0c94981c715284a637","impliedFormat":1},{"version":"4bef1a896cb320e389ec8ef025097a41159164ff26a14280d59775af2257f9f8","impliedFormat":1},{"version":"dc36e988cb993278abb0cd3dd2c32802d8e8065ee6e970fa69494aa6600dcf5a","impliedFormat":1},{"version":"2a35ef77ab70c650c39416ce43c7c6e1f9cabdfef48314ac1b809cfd6227ce66","impliedFormat":1},{"version":"d97f7d66cff15354733fb262de4a7f2ee46adec1e46f20ee717ec710a9567aeb","impliedFormat":1},{"version":"f8057bf8e38926f5f57ea9a7eba012cd59b33817eb5c548fe2ba784d55adc0c7","impliedFormat":1},{"version":"0531e251316a6e6d629960dbff082680a1dab1953f6b1092c47a3f9941db12d6","impliedFormat":1},{"version":"c3bf7657a61131bd57391555d79d54e2a4dfb8b4df5f3255c3fbf352cbc68801","impliedFormat":1},{"version":"1941d9c193562b505c762f4e2474a170947f4d38ab7cb01cc6cb0cbe19648d2c","impliedFormat":1},{"version":"b6a68e51a0e96f3e28520a55806b70f3d9cac59fe0e1d3d56d9eab26fa07d368","impliedFormat":1},{"version":"ee4a57ab6f2a9e0f7db13574e1ca490c8564076c7e1f1023ef6b033510036005","impliedFormat":1},{"version":"6f948794453feba1a5701259ba0743610aec499fb5d821a35a0d658bc02ba79e","impliedFormat":1},{"version":"3100f28c18a0a974faa3235684d7719d47a88132994ddb00490771217bce03a3","impliedFormat":1},{"version":"896531d3473483a5f8125cfb1939eaca0e68889594423268086db6d111ee522e","impliedFormat":1},{"version":"d8a0e4eb3f52e820e62a823e62815a9727b613ce7fbea995e999af0d8fc5386f","impliedFormat":1},{"version":"75bbd778624ac10799f7b0e5c529bb517ed4b323ec1aa63e7ffc5b9be348aeaa","impliedFormat":1},{"version":"d6c627c11a2d9d4a9911d028cff4c244f5f6cd102adcb575cd6cf92d55582d07","impliedFormat":1},{"version":"5511449580cba83543fcdb22bd6927e7bdb57e3331413921d9846bc6eba5ab2f","impliedFormat":1},{"version":"7c7c0b5bfc91d722fec5c59d43ad9be93a40ffc95d79b3384ac78eed047f9ed6","impliedFormat":1},{"version":"05176fadcabfff757208c5f736ee1689a73345ea9895566e93740738e86e5643","impliedFormat":1},{"version":"3b02d9156887116ffbd6fd7124d9bddfef1b5228adc7028ff0bba5a174d7fcc6","impliedFormat":1},{"version":"07581991b81e0d49d323bd35f17d2d0d00736fca125970998e8ef876dbaf8b13","impliedFormat":1},{"version":"f2b525f05e7ad7fa4f8fe746df2b9d4f41cda24edaa77be17d54f1c10fb51a05","impliedFormat":1},{"version":"5d2017f209bf5c177ffcb026c1e452dff03dd73db56000f65c2c5ea3dec89ec0","impliedFormat":1},{"version":"18977816a92eaca224b1bde34424d2478165d41183916a17c0f151b3666c78a6","impliedFormat":1},{"version":"27fc88c6a6d0ba0ae47f3ec03c9776a8864d13718c2d28d1fec4a2eef81a2c9f","impliedFormat":1},{"version":"18c50657b75421d43fcd0bebf144599e077757e197a16a77fc77c82c56c7fa53","impliedFormat":1},{"version":"ce6503a1afca12129cd690f7394e8b77515e3855637fa4ed3c08e260000bc170","impliedFormat":1},{"version":"253f2f34330657b3b936cd44c74ed1ef99e1c72819cda33dcb68edba670bf745","impliedFormat":1},{"version":"d6f068d7a96ccb435848dd65d8aae4a0cefed10984b270906f1543f7926f7906","impliedFormat":1},{"version":"445aaa283d55e4c514ffd0092dbde240881d006b328f109b3d560dbd4e188f46","impliedFormat":1},{"version":"00e725bfd68aa39a6adb7da022b285e25248ec45c6f5bea067fed2332e9649b3","impliedFormat":1},{"version":"800711e010bf97883d17ad5f9ddf273cbd144154ba049b13be5782ee12631d84","impliedFormat":1},{"version":"197f54fbdb04c26933b16c7136580a64ad04fc06070a45912dee4f6b8fcde925","impliedFormat":1},{"version":"d49017483f66844e8783e9233e0c3f09fec91aa5320f2e748f11d3b3eb9f7d5e","impliedFormat":1},{"version":"23c6c92831e898a6f8b85625b55b9fef92d6881e572de418202f3fc1bccf699d","impliedFormat":1},{"version":"ecec1f45c9cfbc298e3289f86b1f7777fb98d0d30ef0faf9cffd5531f2ebe82a","impliedFormat":1},{"version":"7e15689b7d761fc48392b4567c1686140fb0f5af010c37d8cc73d64a9b342efc","impliedFormat":1},{"version":"7b3bd78b337f25ee3e5fef56bf9128c35a9c373132dc32973a2f3562c05f2c18","impliedFormat":1},{"version":"8017d763bebde1b9b1809b5db43f3bdcb96c6e143acd5508fad20b9241bfe52b","impliedFormat":1},{"version":"8c57412451bb8b0d63059493bd6172b0093b1dc4ab67135800bab686211668e2","impliedFormat":1},{"version":"ec9da0cb04d7c3bb80aeeef3ca4e0e41848cd75d2641b2aebc1cd743a0a92de1","impliedFormat":1},{"version":"55afc4e97b67990ba7cdf4e3411e58b7a71744ff1ac2c4ad1d48242e134f3dfa","impliedFormat":1},{"version":"89740506440be9310e5f28fe1b9934b6be996bd5ace4161ede38a88c639716ad","impliedFormat":1},{"version":"010d565a326fcf7b7dea5721776f7908adec311179cd473e43e93430d3fb52f6","impliedFormat":1},{"version":"67a040f0a1160345ecacacf65694ff1f2b1bb1b8db1543bb89641b4bce078c74","impliedFormat":1},{"version":"be96211f16e21fbac4daa790a0debaeb7d2f33bb66abbce99556041f370402e2","impliedFormat":1},{"version":"b2d6bceecca68f239a650eb576994d1a6df7f8772cdf395210d54d8ba32405d1","impliedFormat":1},{"version":"327107debca41a137b7827a1bff2a7650ee82273ae0c2414956c72463c2c4692","impliedFormat":1},{"version":"e63a99dbdfb1509c282d4871f37230f0220cbb62f6c5b123c7eb29e08925e543","impliedFormat":1},{"version":"282d7d906e2e6a7d1851a4df9bca2313303a60badbc2737edf77c143526b1c88","impliedFormat":1},{"version":"7a9a9af10e90eea2b7ad7c484145e4d7f77c9f02b937c29390c3821886573ac9","impliedFormat":1},{"version":"74792d4ca5e78ab1de2a86d75e81149776cd3ede006e22433232179e1d9d1740","impliedFormat":1},{"version":"2c828772900391675f9010a154eae8c6272d50632474bb62f966b2e9905fca2a","impliedFormat":1},{"version":"206a972d542353e0e574b80ba816be9133791e42f411ca4ccab6bec67ecb1615","impliedFormat":1},{"version":"dfdbc2fa0d615f3c8157094eed58d365f3ee895f0a62d88695effaded9509b58","impliedFormat":1},{"version":"4db4dfd8dd13152d2f0344d3b4ee3676772eb931aa0e93693e5681d1c7e7568a","impliedFormat":1},{"version":"726f3a07eaa8d4ad213f1e35169129bcf300a9f57087882812042fedfb4a1103","impliedFormat":1},{"version":"1d09c5eedc322d202d08f8debb077cee094299482d4f31ed45687b7ff39f0537","impliedFormat":1},{"version":"0ef19fe230623672c6d256236bc6e76623050b292f2b305987de90f06828fff4","impliedFormat":1},{"version":"40c1a51dc07eabd3e30c7a0869fe042a06cb6e397abadea4d981034160533554","impliedFormat":1},{"version":"f6144da2ecbde205418b9306abaa7454f2c963a30fc1a402ee037fe67edb5a85","impliedFormat":1},{"version":"1e371cf5281c9defa39cc57a2bed1dda7bf53051539577eaaaf56d258704403e","impliedFormat":1},{"version":"b7ac271ef8c556941eabe8e72c44f5024e17d910e47ba5babb604f2ad3d9914a","impliedFormat":1},{"version":"254759e0f50858e5be171805b4a673bcc43f2a15f649f436462a7d87ddec1e93","impliedFormat":1},{"version":"ae343c5c09bc1a4a8ccc1c1513797c167e0767993d2d82597bc64d2c42b52685","impliedFormat":1},{"version":"e74200516a897bd98d1609f27be582033cf12b7d4fb01dfcf48092b8ccbfcdc9","impliedFormat":1},{"version":"c00a3889431a387cd5213e40230aa093ac00ecaa3d163a85bc592139ac6631ae","impliedFormat":1},{"version":"7ecab76043bb20076cb5212aa8da948c8771d30ced270ae8ea001f34397b3209","impliedFormat":1},{"version":"1714ce8458fd5b757fcf0a01eb07cc0aa297cf88edd7ef74eb0922b8a80e3b0f","impliedFormat":1},{"version":"a4c896217bf522dbacae0080d82e52dc47718cb7267cdf6c46c4a2febd0e9d2f","impliedFormat":1},{"version":"b750bf8cb0d80e742d74deb78d6c2723e28075665fdbab98f7fbf6984894d950","impliedFormat":1},{"version":"cd22215a4f429603c0ca0989bd2ef90c3214f22d1ed40b93753c30e77e34c23d","impliedFormat":1},{"version":"32cf3787c1c2e11daf3b263983d3d4a286ca876438776e76aab1a7f69a09ffd5","impliedFormat":1},{"version":"3f8b73c205dcc937301e19a8524096481b94b08b3f539f228303ecfe3f720f8a","impliedFormat":1},{"version":"ec172d151652710ccc7561454b21c9891d346b0d42cf3fdb532c9e4c9c18b42b","impliedFormat":1},{"version":"7ed827f20555786ebb85de60f124f7ec5d310e62e8caf09c7fa6fac788ea24dd","impliedFormat":1},{"version":"4f0c321ae3f9670d8752be0d6d8fef08d7f6fcc9048cb65e5d03c0e934b73887","impliedFormat":1},{"version":"ba80c7f32729824e8ec521ecd544355012990ca20c16ddcf968720a7b1c817f1","impliedFormat":1},{"version":"5e0d1da019d104d5340908bd5a3c47704303818d27e07b94abba10170d3f9b83","impliedFormat":1},{"version":"640dfe5cfcb32afd002a422aeb3fd663be2d4f0db7ad2bb2f4fd492a855e49ab","impliedFormat":1},{"version":"1a1bfccc6354ef6e9d73011cc08b734311e0c6cbeb9fe19f6c25e4ee47ce0bf4","impliedFormat":1},{"version":"12c40972340ddbf2a8482e5f7320d5e6aa4230a462be754b7574201d2dbda89f","impliedFormat":1},{"version":"3970ea9e13ee6f473b5912ebde92e3de8857cafa609e9969c3bbfe606907e465","impliedFormat":1},{"version":"a67e70d495ed11f391211a8fbb04c22ea96d97a0646faced3a843aff89b34b7d","impliedFormat":1},{"version":"a9611f7ce5024a263fe3c6d13d6afd7f4d40ac5e8ccae29659f2266b035fea4e","impliedFormat":1},{"version":"69c0910cd2adbac7ef977b3174152f048e22730b9212daf1c04691e27797cbec","impliedFormat":1},{"version":"4cd263e37563aae86103d7f05bf7a7b822c196a5df199de5493321b3956b1d70","impliedFormat":1},{"version":"81a9830fd86e978c54212175d4e98261d483b18b0c20a0d8b7969bca7854abe5","impliedFormat":1},{"version":"e511f9b393c367c510423b8c32cea29b85041cafd62db728820314101d26b63f","impliedFormat":1},{"version":"91cf055ff6d1157cad637c0854905c175ae16e085d90896fc4fdc8579c01f0c5","impliedFormat":1},{"version":"5bd284409327bd032d3a03e4af87b80c140e426338c7be7aa5094da3d0eeee45","impliedFormat":1},{"version":"e73a2f7ff4c22c9f8e8a2c9f2167411a43abf7c2b0df2040fcbef397432d6849","impliedFormat":1},{"version":"9ea0fed4f40164e059b356cfa79eca1f4989262247398dba27d0e4d5301da816","impliedFormat":1},{"version":"509bd89f23a7956d094bcc4c600cc12564ec32e609b6acfe498b6c67d1ccfbfc","impliedFormat":1},{"version":"d63707bd1c8e4d6e988a6f8b81724b1188a23195016f491d31fb6098b600c985","impliedFormat":1},{"version":"47110029aa9cc198e2dd55b8983df71956785bf7aae3d40f1e17c0a41e2f40ba","impliedFormat":1},{"version":"e41408cc29f9283a9cc2479b2ed04d378c1dcc07a132e1a0db61ae5e6fbed624","impliedFormat":1},{"version":"7edfde4df10c002ecdcf9600c1e731c83ce9b88a3895fda32f3cacfe1448a545","impliedFormat":1},{"version":"26f845eb94f0cbff4fb342010e1fc24064a79f3cb244cfbdcb901c72313eaea5","impliedFormat":1},{"version":"c08abe4eb7d27ceb3bdfde948ffa7a7831b9b716bf03618ddba0db0199e49fed","impliedFormat":1},{"version":"0d0437bac216bead268ff9b4a2c66d10efccafdc41ba582b2f35f38f848ed8c2","impliedFormat":1},{"version":"43b31cc0fd38809f0c3bc3c2d2cc77b391acd9085d382c3c91e80e1b4c34caaf","impliedFormat":1},{"version":"da9985233839dc77b5a16b04a3c30afc1db42e3e991a1f23bd42a43deae80e06","impliedFormat":1},{"version":"1d7dfdb7412f7705b88a306775ec0f433b4ca2032484c539af05eb1019855b60","impliedFormat":1},{"version":"b7efab411587fe6eec7d0debbf96fe3ea9a2878dd01a928f5590847bec9ec884","impliedFormat":1},{"version":"fe3231da9e8e77e23d81974eeba44d4de894e4f7631244c12beb30ccb9b7780f","impliedFormat":1},{"version":"d5f05696f63397aa52e7d5f736cfbcd5117fbc1f97e66b60df0ac6926f786024","impliedFormat":1},{"version":"8b1c6336949a671ab4a6f11f9cab39ea5a1fd2ce229490883c43e99c1ae1b9da","impliedFormat":1},{"version":"42ebe555ac2d83bc60369750812eba8e048c83bd650b250780f472329f252c23","impliedFormat":1},{"version":"4d7aa8c8a4ab7c4c98c2786272d4f30111618d73f32a06360b66aa8c03916de9","impliedFormat":1},{"version":"12cc4340b2d5a15599ba3a4ea32aed2f952f0517f61f1c314cdd67a85980b08a","impliedFormat":1},{"version":"3a932644a88d6ae1957c97f3b10c5d1560801d40cc8c96d6cb580c2d90958805","impliedFormat":1},{"version":"f6702e5d7b8933f4c638b391e0c654e4dded8fe60ad98d2fd2d01ba0640c8cdf","impliedFormat":1},{"version":"e43818f6c3bfa9b25be2285a99d55c73b0299a4f964c46a6baff49a4861c77db","impliedFormat":1},{"version":"d9e3b7368160756be2b7be06d2106cc4f88c788b3b264792e7ccf0b82afaf8a1","impliedFormat":1},{"version":"601d218e0d8293f49e6a4e80f8a21e6735d234b1b8b8e302f8273968b82b66f1","impliedFormat":1},{"version":"47e2f1f2056fc79183944dc67435934c076221e0dce4cdbb5d5351c507c8358f","impliedFormat":1},{"version":"0caa8b7fa869d238bfe1ad77608606828d3ed36824f1c6d749fb01f4235c878d","impliedFormat":1},{"version":"a4989e72ed4d93d727577790eeeb8f8e10f555779c10dc38e7cdd4577ec233ca","impliedFormat":1},{"version":"f26c3f9dafe8315df6a5e70b04fdced7963854ee479a73cf41a6f7a7dd7caf4f","impliedFormat":1},{"version":"2d842f7ed1de57ebdfdfdb8a8805ac6301e127f45124dcbcd9115a12c3fc251c","impliedFormat":1},{"version":"0421e5aaae059f79a8579b19c03a6a5ace53545c03215a5e6c35b93ba7c6964b","impliedFormat":1},{"version":"9d23012eb12780a94b65be1e3d8cb9afc3efc8c06d17012307d462117219de12","impliedFormat":1},{"version":"e066a06edf364d52f4257380e6966a02442c01ca2b3e222f496355d35ef7f0b6","impliedFormat":1},{"version":"70002710a6f982715c40fd1da01eca0bc9298ba07f3bc37347995645f53c2dea","impliedFormat":1},{"version":"29c9532cc4863787c5827dcffd566f97b0798ecc33558ddc5167d52d0e6168b9","impliedFormat":1},{"version":"de2127b95990f154f41afb1f80a9f459ae7746354a9437a7eda1e55e4420e529","impliedFormat":1},{"version":"aa2c16e35d7af2b6835509ce8e778f5046c45b91b2d37f5737578e0788d1a7e1","impliedFormat":1},{"version":"93aa2e0816593d2bc0cf04c1c6b14371d2fcada6e561c14bf56d3282d35daaa6","impliedFormat":1},{"version":"fdee57eacfb577d17fe209f809f7affdf510c1a64aba8ed3cedb4d74e899cf84","impliedFormat":1},{"version":"db60e032111a14f8c2b6fe319ba70e199d0cb75a0a5adb68c51754cad0941f59","impliedFormat":1},{"version":"03d492c452bdb5d1f9a9efb0e3b375ac17fec045947da6bed9745853b4ee24bf","impliedFormat":1},{"version":"76613c2b87fe472db96b9a4381cd105444b2a15712dabee2703744f4ea6e2fdb","impliedFormat":1},{"version":"641954759d5b9bb6ddb22115d022e224a3f62bad81077d6fe8d85bdf4ebe3bb2","impliedFormat":1},{"version":"dfd535a8d6b871735d13ee27e090b80eb67185cf52e376076574cf0dbc508dd0","impliedFormat":1},{"version":"b7c031179aea37a4b665ab42bc6832392cfc086651e1f3cbbbe17a1229527ec4","impliedFormat":1},{"version":"2a14128e218dc0fce2ad3700c3e45b79eee6de3919a1af2005205665f30c50f3","impliedFormat":1},{"version":"7c2fdfff73c7b0e57b16b5707ae5b237c8a71473f14961403564741bb2d9ad1b","impliedFormat":1},{"version":"7f262a8e55403fdb506262a921fc15d7e31b6b66295fbb4dad302f6fdf8b21fc","impliedFormat":1},{"version":"75faf23b173bcb248d922a0e7d19b7855afb7f5e386028e87a75f525f22a0bd2","impliedFormat":1},{"version":"05bc146f044fee663255512523593acab4a310fb3700199598dcdf84d9818432","impliedFormat":1},{"version":"fb39949c6605d05313099ad88baaf92f2824eb36d20b80b0bb3fef70b5cf83eb","impliedFormat":1},{"version":"8ba546d0184f4a7cfa7bedb4f0c7cd30b3d8ac67f9fb960dd26fdb9ffc63b713","impliedFormat":1},{"version":"1261f11b2ebd54f4dc6afc809457da931b4c9618c99b488c041c3fffc5f3788b","impliedFormat":1},{"version":"6eb3cf6a903570fd4d8f670cdff675bfb67e8828e7b579b71208c0467eeaaa3b","impliedFormat":1},{"version":"6181651b3d922f2009a00282ec2d6fc0931176a944b894b79f8e18cf4b2b7f74","impliedFormat":1},{"version":"df4c48b5a767ca6d06f0b71b84db179851243122d8b15a92e1b8ddcac7e31547","impliedFormat":1},{"version":"0d2afa97d7b566556abadc03816c3568c5b374a66e72e7e6631bf4e3da6a631a","impliedFormat":1},{"version":"e166c42a1b73ad0a670c7f118a12d89f89a8b7b7120b4a3814a06343b0051ee0","impliedFormat":1},{"version":"eb896f64d252e42a5566ac88ba8262fdeeebe3f1903f38acbed1e3090bffb3fe","impliedFormat":1},{"version":"d0e4b317ecdf6c4f2c0caa0c95f99768cad523ee9e915df43d656fcbb6f00e18","impliedFormat":1},{"version":"a58cb0a782ebf1fb98c33f0c82fd5bfc44663566d47b91de1e242faf18853e30","impliedFormat":1},{"version":"4893fd721b065c846b558036d7110d64708a8337677886a664da64f80d75033e","impliedFormat":1},{"version":"189c79c8717c3a2cb0562feef4597430dce71ab1b123107413b7b92cbdfa6583","impliedFormat":1},{"version":"149fa2725757abef64f95bfe357fa53dcb173502afdc8ee0067ff0b9344ec310","impliedFormat":1},{"version":"0fce30e9ea633141f934dee5bdeba6b955dd4383ebb34553c214280ae6c595f0","impliedFormat":1},{"version":"e42ed423f29f47e2c44a574ca7de673c853231f85f4c3590ee6970db259b75bf","impliedFormat":1},{"version":"5bde7261dd941588be86b702b9dc72786561299cf7271aef232504bd8a22f504","impliedFormat":1},{"version":"926cb5e62425abba24f17d3813e59966bee892e434f84d51fa4ac3c2d2f02ca3","impliedFormat":1},{"version":"47597ce6305dcddc401ba92e383cd8e751ec078fc42546f305326e9f76b4a4ec","impliedFormat":1},{"version":"b1de63b1a81c18999c5331e9a14bb999caba0905b7815619dd1fb1fa690813a1","impliedFormat":1},{"version":"c39749c50dca48cb564a35f413d170089152380233e39396105eba049c1554ec","impliedFormat":1},{"version":"e4128e408464f38961eb93e466b10f0b70a5347bed31a306567de8a9d2cfa2e2","impliedFormat":1},{"version":"2d6abcf5bafa6dcba05d93f3a5addb1fbe1fd97accf0fa31d68cb0efcdb43c09","impliedFormat":1},{"version":"728f996f14dc3935a2ed4c0a419a84163f85c52473fc930b2bc7d29c0c67a309","impliedFormat":1},{"version":"4ec8b0efbfb1789df78f2d1a83701eb6ea2bb28902be8dd48f2881185c056951","impliedFormat":1},{"version":"692ab2223b4e73eb7366d5eddbe53fa33c95c3824db0bd9127ce00f4220f4d2b","impliedFormat":1},"2c347f3123d7bfcbef0ef65ee28afdfbea669a34d0599e3a957c2f7b0b2e2ea1","b454c786b93610e4c1f846e6ec79151383c92a8ba811474e43ccb4b27fb6def2","3aa0191a3fef91838c231928cb85718ddd5cb835e744ff6409fa2041853b5f59","27e94fcd5716ea90316f94c16d7adf20e84ef834f1f2299a06707c3b470d35c7","cf9c748355bd3a2e3fda3af11516ff1514b0d6381b23787de0a3c657a9781020","a05e78cdc4cb75d13705456fa8f9487d6d2971d57fe0b3099f5b2b8635628708","718449c8119775878941cf45768d55238d3da7c44b1d1cc8b5fd7a7c6ca87f4a","ae00d6233f6b444350a758adc33a2bdc7e4114cf85673507f4b0ec0d011bf28f","045faf11c365dbc6efab1eff851db2cf8611e3b4d3d857e3ae20e2d7b073fee4","a3306a655467fd78f94061efea6a4849d73e2ce70c16a7aa2e86edcac8003d67","eb58fe82b94e9d939bf7f9008ec2bd60685abb453c84766ee6b383bc0ea3ee04","865299278243076bc46d6fab22ad7102dadbaf37822f9b8e3e9efb6731551686","1bce8e979bbbfbbafc15255ceeecd3260345ab4d628f6c7d1232ac66576321c0","1fd6adc58258543eb8b1d73733f506d52ea718d3b07052559d1a681e6b59b043",{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"9984ee56114b71935ce5877a2eedba93a8f1c2eabc2cabbf88bfec7c955d4a75","impliedFormat":99},{"version":"e720c8a37b87f5713093ed04015dbc647996545ffc0fdf07885f444af738dcff","impliedFormat":99},{"version":"f73b596cb4b4860fd0a3ea8cab67a42ad344d95a392ca986ca4588f59ea8c2cf","impliedFormat":99},"ad60a27f86232effccda771b5fe6852604ab7fa36637dac3da122be6be7107b7","836dc9b821395e33a0635201a8babad409e4cdf5410f6b91052fd7068481a567","4ef9ca3b2a2bf2f8b21343632ba0146fb9fa05b7ed0ceeea8df8b3bfe4e36131","9e004aab4cd07f39dcb06c24812bf54b4eadea987824d064f194121bb2181750","bb8161c1a15c2a9abd02cd18522ef0f53b4fdcd2a570ef75dd4fc4d556c86a27","7121f8a3d7143ca81e758e5f4924bb60730a03268151ddc0688f144b03d427d2","4b464ebe4030df055365a7b373960c31ad3193a0ca6035dbd47a4524dd3b30e1","33bde33d22193adce818d990639a9648ba80edf3c421f07a5969c531026d7ec2","4237415a94b53051094d964f586967c87a8cb1ab3eb0032c831c2951d4d09edb","fa7aa9c16a019d592fdc0fb49dbd819e070ce7188c86075d2f0bbcd0933e66c8","543e0c4b4aaaf8daf7cff0e2b10057d42f3a1776c16a43553338ad1fc707e1ed","872f02345461bb5215bbefd538532bbf88503ac14d127d957bbefb544fa716ed","789891e8b8386136b7290fe7eba4de8f1f75d0e96b52b4d268b67e5f0c406096","e6e6ec0b2210f5491401581cf12db8c0c2454110f6e582e9a5949215bc895c1a","cb97ad5e7e8900ccde8f4622e4dc09c51c8c4d411c1b963320efa8f3bc111e94","471c11ae126af540479b5f9ca4944304fe529c949d44a9c14649bf2b5aa5c67f","ac572c40e3f87e53112b34060575b5450efbdc11fcb6f077a5e4d1979a10c994","97baaec03502555b8e929aca9be1b28995a0010709c28d4f7922ba51ccd1b397","b2ef51f383a2363e3d66d715c0f9bb84249becf53629f26486d418c8cb6b5aa3","79c662455dda7276e2ade17948973bd374e733279c0db40a19522b9a3f9b7c3f",{"version":"6392353adcff7db02a3f5dcacb5637b791dbbcb76125aac3075da2519af9785a","impliedFormat":99},{"version":"1f3952b74b8c766a2e602a0ba2db19d3d872d00bab4e01746c6b7229c585086c","impliedFormat":99},"8df31065cfb339718aaad75291fa8c1cf6957e08178947f8ddbb81bb08ff5480","4181fe0f4efd449a39014ef97fd87ded8c44e1dde60c1da5a182910e74900ba2","96beaeea47007a8d7f575b648ff2df60e48ebb865bf83539371067692d798c4a","b0d4a0de9bdd186cf2a14f78058ef54f62c2e4757f3a78cf2b490c0db4d6e80a","620ba450e15d2b364888dc6c96b3a1d8859716c544d76a17476c994f9f0fee25","58e83811bbdc661eab637ad96abb4320043cc7b9cfa99b9ecc638face30e5534","58dd7d6545588d7ff9b47101fe2d0d1280069c2254275caf90c5db95e02c95c2","8a097dff56f7a9df9f0d099e472a2bbfc0458a216339f4518e7e6188ce29bcbc","d1dc71213d324f0e882aba598b72e386c7770ebb71ae1435cdaa2bcdda362cc1",{"version":"01a1dacde70dd22ceb029dc47a75ddd4b455647b9b724b1f3e2c9040ab85a4d4","signature":"8039805d93366e08e32ed9a6815636377a1cfd6b6d6dbf2d46e8d766c326884c"},"eb5bd03afd30cee73f8ac1ea025169963b86ec8d37853e8f7ae16fd06b98fdc4","1112723954173b83f679fdf3d528dde3d70edabb8232602f3a0892aac032a78b","60602c57f5d767045ffe824c29dc24c644dcfb7905d6e0f252bb06194d9ee19e",{"version":"c9c42d5948aa033c444cb6a3c188bcd925997bcc2bd8e97928af480ee356417f","impliedFormat":1},{"version":"f4bb2d3708ccd853dac13f97ede135d721bf5c2586f73ab8f1170f439e44b5b4","impliedFormat":1},{"version":"fd5649816766f52b1f86aa290fd07802d26cbb3b66df8ed788a0381494ebd5ed","impliedFormat":1},{"version":"269a13226bf6847c953f01ada5aefe59a3963a3a74f98c866ccbf08679d16b86","impliedFormat":1},{"version":"b769494ac41040c4c26eb6b268d519db4cc8853523d9d6863bee472a08f77f80","impliedFormat":1},{"version":"2fe42f88e2d318ede2a2f84283e36fdb9bd1448cd36b4a66f4ead846c48c1a33","impliedFormat":1},{"version":"cb403dfd16fdbdfd38aa13527bcbb7d15445374bc1c947cfcc3a9e6b514418ab","impliedFormat":1},{"version":"60810cf2adc328fa95c85a0ce2fd10842b8985c97a2832802656166950f8d164","impliedFormat":1},{"version":"de54c75cad3c584e18a8392a9a7e0668b735cd6b81a3f8433e18b5507fd68049","impliedFormat":1},{"version":"c477e5c4e8a805010af88a67996440ba61f826b1ced55e05423ad1b026338582","impliedFormat":1},{"version":"6b419ab45dc8cb943a1da4259a65f203b4bd1d4b67ac4522e43b40d2e424bdd6","impliedFormat":1},{"version":"a364ff73bf9b7b301c73730130aed0b3ca51454a4690922fc4ce0975b6e20a33","impliedFormat":1},{"version":"ef113fa4d5404c269863879ff8c9790aa238e577477d53c781cdae1e4552a0cf","impliedFormat":1},{"version":"5bfa561404d8a4b72b3ab8f2a9e218ab3ebb92a552811c88c878465751b72005","impliedFormat":1},{"version":"45a384db52cf8656860fc79ca496377b60ae93c0966ea65c7b1021d1d196d552","impliedFormat":1},{"version":"b2db0d237108fa98b859197d9fb1e9204915971239edbf63ed418b210e318fb8","impliedFormat":1},{"version":"93470daf956b2faa5f470b910d18b0876cfa3d1f5d7184e9aeafd8de86a30229","impliedFormat":1},{"version":"d472c153510dc0fd95624ad22711d264097ff0518059764981736f7aa94d0fa6","impliedFormat":1},{"version":"01fdef99a0d07e88a5f79d67e0142fc399302a8d679997aac07a901d4cf0fc83","impliedFormat":1},{"version":"ffcbdda683402303fa8845faf9a8fbb068723e08862b9689fc5a37c70ef989b8","impliedFormat":1},{"version":"208c5d0173b66b96c87c659d2decb774be70fb7a5d5af599a5d05f842b2e8d74","impliedFormat":1},{"version":"ec3b09b073a5e8a14fd5932cc4c33efaa0280c967d15bbc4c0c5b73a0d2f1a68","impliedFormat":1},{"version":"4b4c884e11985025294a651092f55dcbf588646d704e339674dfe51bdeead853","impliedFormat":1},{"version":"78c8b34f69c45078c6a3a3f10a24f1a03ea98495b6d75b945c1a3408a3ce5a26","impliedFormat":1},{"version":"0b1a08da571520eb288eb75843aad95d07fed423aba18b1149b5a0c767baf688","impliedFormat":1},{"version":"9c4708e703c8deb525e95946b3fdd8d5caaf724b3ac4a1cd6c2cab759b53f76f","impliedFormat":1},{"version":"ed14fb238769ed0b0dff6b78bef5263f0f50f403878ecd609fc71774b2113b12","impliedFormat":1},{"version":"59405847661d05bec9243efe9498211cb7e66d2620fe946e40750ffcb9e7d56a","impliedFormat":1},{"version":"ef95961bc90e8972bc9d88bee5264544d916929c0240e8c3c8ae220568b26ead","impliedFormat":1},{"version":"3f64230713c989e5f2d1d46c13fc8b2d9193b5dd59d393d5e70098c221894b1e","impliedFormat":1},{"version":"e49eeb0f93ea6a311a22f5b66a155c368e9cdb3585695fd951945df1a4192eb7","impliedFormat":1},{"version":"6f704837b406e4ac6ec5942018691ecc10e2d079cd64706d8ed1e86826d0671e","impliedFormat":1},{"version":"ee2229f4fc2d2306c864e5c2399aaa5958e4b3e1c964701fb8a84709237c9f47","impliedFormat":1},{"version":"6e5563614d424223f4748c6b714e1e197c8422824ff42fdc16f64484e1a863a6","impliedFormat":1},{"version":"8f31673ebf988cfc4b7ce2adb6a6c489dd748025600d8e2b7d922f952d7d21af","impliedFormat":1},{"version":"fd3715f87964b5fc26f4c333422969da8ca45e69e3fb6973ba6c806f437eb012","impliedFormat":1},{"version":"97b1e695f57dd56a6495f7bdca876981cc8db1cc4a555c3964aa14ce26e0f4de","impliedFormat":1},{"version":"cf32c06d23f373f81db3e93d47b7006f5bfc005df4d92bf5407b7792adcb3c47","impliedFormat":1},{"version":"eacc624e44f4b61dae0502e59ca5c0307dee65e7c257ee3eab4b2c8c6f156cd9","impliedFormat":1},{"version":"6041c1c22cb701abf3d98f153f878b12280f3b2213144588209b66ad5f5915dd","impliedFormat":1},{"version":"d95c6fb6552ca855ed11cdcaa5c68ad484bdc6325fd86fbadccdebfe57ed841b","impliedFormat":1},{"version":"0063b3ff097c4542be10322c67ca804e9e4504545b46ae8d620ceab59349ee84","impliedFormat":1},{"version":"9ff44b788f5d8d86f6fa34abf3faec8c425ecf1838248318acb0c5a4c88e62e7","impliedFormat":1},{"version":"4169cb216a6b361ba3caadf4a13670354e2a68ce055f4ec77ae7688902d2ab2d","impliedFormat":1},{"version":"e642a86d8e0956bb7c76aec21b83bde20409b19eb22786ed72ac5515aa9268c8","impliedFormat":1},{"version":"879e2a34d0139f04a32974fdfa44c5720619afd28f8bde0e5860f371d5f65d34","impliedFormat":1},{"version":"8e04860bdf072d4270b09b33b2b91ec4545297f23cc580041cad3e738f58d92c","impliedFormat":1},{"version":"bff595611ce25571f0cb50a83b7dcd7599559d6d3e98bf4fe87ad77b9c347664","impliedFormat":1},{"version":"2eced6af832d4e69811e353c7751f73bba07dc3b63189e0fa963e8264f341c12","impliedFormat":1},{"version":"a884b3560c8a29e5cb7f1263d880ff5c8b017991009edc20f450027c4a112b3f","impliedFormat":1},{"version":"6775c3e28d13ee126ec2c2e0827ec76422b0e11d9d5c2cfdfa7b982d48455fff","impliedFormat":1},{"version":"2ab0ffd4cdaff94c5cb8701f34442f8a018a2b62623528a66ad1ad8172ac6626","impliedFormat":1},{"version":"ea8215cf7cab1015579eac88e2f16fa1fabbe9f84ce4d2848c10f36d7df8ca1d","impliedFormat":1},{"version":"cc894fd562a73055ff72dcb7821729cef909b85bca4d0e2e2cbd0c1a2ecadeba","impliedFormat":1},{"version":"ab058bf3dbdbde6571f97a57a3b52b14be9d7e19f23190e9a551d5d6f6b6563f","impliedFormat":1},{"version":"142892cddebce23312318d79014de94e64a1085b8b0d73b942b4a6ce40a1b18d","impliedFormat":1},{"version":"db84257986e870ab22b304a80b02ea5e079c13a7f7be7891c0950bfd9e33f915","impliedFormat":1},{"version":"24cb43d567d33ac17daaad4e86cd52aba2bb8ff2196d8e1e7f0802faeeb39e95","impliedFormat":1},{"version":"dc6e0137694a7048ceba1ce02e6a57ab77573c38b1d41b36ae8e2e092b04ced2","impliedFormat":1},{"version":"aca624f59f59e63a55f8a5743f02fffc81dd270916e65fcd0edb3d4839641fbe","impliedFormat":1},{"version":"ce47b859c7ada1fbb72b66078a0cade8a234c7ae2ee966f39a21aada85b69dc0","impliedFormat":1},{"version":"389afe4c6734c505044a3a35477b118de0c54a1ae945ad454a065dc9446130a4","impliedFormat":1},{"version":"a44e6996f02661be9aa5c08bce6c2117b675211e92b6e552293e0682325f303e","impliedFormat":1},{"version":"b674f6631098d532a779f21fa6e9bdfca23718614f51d212089c355f27eea479","impliedFormat":1},{"version":"9dbc2b9b24df7b3a609c746eaada8bbc8a49a228d8801e076628d5a067ff3cc3","impliedFormat":1},{"version":"d6ea60339acf1584f623c91f5214be0ac654c0692c0c3abd69a601fe0ff0e165","impliedFormat":1},{"version":"d08badb0bbee55e449ea9ea7e7978cc94859804c49bdc7dc73e25d348337c0da","impliedFormat":1},{"version":"b116a03deacf70767f572c96a833e3c1adf01fff5c47f6c23e7bcb60c71359ba","impliedFormat":1},{"version":"023aedd02204fce1597fd16d7c0f1d7be13fcf4bc1ed28fb30a39587715ea000","impliedFormat":1},{"version":"b18adf3f8103e0711fbe633893cfbce2897f745554058cffa9273348366304d2","impliedFormat":1},{"version":"f41fbddb4a2c67dbf13863507b50f416c2645e7440895ea698605541d5038754","impliedFormat":1},{"version":"636a0fc7a5ee207de956241b8cc821305c8cc72b9f0bec69b9c9de15a9eafcfe","impliedFormat":1},{"version":"c326f85f762b14708a25b9f5c84691562f5cf39ae9148c00f990b8b4a2a4461a","impliedFormat":1},{"version":"caef5b191982cd88619282b10e1c52c3cde8c81d4eaf4650b4e62d73f77483d4","impliedFormat":1},"63a7983879036f467b46466c8360ed47a70db55a8c3d02181181dd629f9256a3",{"version":"de1cf67d3b9dace503c0544040dc4acd35f3a7f9912c00d2a04b087999336ac7","signature":"04f854046a20aca2a026c914b5fcbdb90f7b08bcb2cc6a35953e20e40f2200ea"},"36d7b8ded6867fa2eaba8b55f41504d7d5db0967a86d72635d34bcf10cd8b34e",{"version":"a6dca3804aba1f946b04d4a3b01cf91f91c167f4a0024e022fe3675bc363a598","signature":"caf1101b3030a602c7800d3ca21e22054e350ca16b5bd55def0c7605f96135ca"},"78c1eac4fadcf916d09bef94daeab7d032610da7632d1c2483e1a79e0fa614da",{"version":"9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","impliedFormat":1},"7af2cded11e7ce2a54233ec5eae020dda35621f22de86e892416adb043b081fc",{"version":"3312f7d9eb01483f9e392733e461f06755fdc624b5f2318e01f686a6a036ed7b","impliedFormat":1},{"version":"34491a67ae33c8bdacec1f4c07008f01d2ebe588ed8b7b1bd8f940f5fe953f2a","impliedFormat":1},{"version":"cc0e6f2705c8fd9eb831790840c08be6a3d3108d7c7043c4a1c0a97e3e9e289e","impliedFormat":1},{"version":"273928f388427cb6d6859c6b29d760de7612a110f8a50afe092d3a6440ed0cd3","impliedFormat":1},{"version":"54db43f6a831781a4587d81802277a9686bf34680c586fc0496e32088f2d8942","impliedFormat":1},{"version":"0f53259dab3f0531bfefb89211d4be171821c855980a843b396e9dcf06ab23a3","impliedFormat":1},{"version":"b1b1faeb576467d84ffaab5942f6bd5a024bb715dae28aaeeb22b37cc0f17030","impliedFormat":1},{"version":"a7380d88b8153951784d10b663b949986aa02c238d7aba129d378bc8f0bd2900","impliedFormat":1},{"version":"2110f6c3b26b0d0af8f4d0d7bf8fe89cafbe2a200cc2187db2e446c57628b67f","impliedFormat":1},{"version":"b2d0ca3686d89f74053a1d0d90e8088b9d48869c9814db2cce4554585c83094a","impliedFormat":1},{"version":"6491db94d895853640fd0c6814aa5decc2458a6085193abbd7a83a0a65736a30","impliedFormat":1},{"version":"ce8cd3fcda8947836cb52af1f9a5958fb9cea1ed5eb53466227a82c079ba5622","impliedFormat":1},{"version":"5a081b7e2596e450b5bbcd5c5556806b85bf2c0bdb6b7fbcd640dfa6339a0bb3","impliedFormat":1},{"version":"aac73aa91eb81c430a982c274181ae5768c1c631dd659e603a7070b0310d9d40","impliedFormat":1},"20c7945340b58e982aa79db5a549b5c33ef2dd8dd8c5c71d29c308be0a9ebaee","3bf3a1abfdff65c0dad99949f8aeeefdb65cc943a7175774e1751e1085f06b6c","c1d4d4444aba9b01cb64dd485fe7c8ed3575fae862bc5977db4836ba02890a6a","fa7f2e8b69aa84a64dcf0417f8a8d9719b11af3776c4c1ef35f63e9895cde3b2","daae3fef862be66a4f3d019dbca43534e1e84c56b4b488ebdadcf71d7c93ac4d","bdd3a7ac1f79283acbc594a8d7b17fb3186eb7ff42d19b57f113f7cfecc05ed1","95d4125fa23520b53f94144c541372f2e4aacf495ba6c6f01a76e6ab4aa7f39a","471d2936b56890579899605818de833a454f2e8950a1816394a79d492ba9d94b","297ba6d7e4e8c638f366363cb8d85141fdb1c2daaa6b06ba257eac005ac978fb","0baddfc43f36b1b20d5b3f08162039f860d19470299795b17c44eb8631d4d956","10252be95a2e479a4434d42db379a2331359386072e9a15b2b3e366020616c4c","62612748bead131af42d1680779fe254cfa5a59e87a484fa22e078bdc9978d10","8eb25039b561bc9f7994190dafa895ef1c3438a7576de564f57cc8e7f9f9c47f","ea79deb2c6f4040dc55bd04e4a37ea36858d7e59ae354ebc0eccaa2698fcfeb5","91883e5a7e00b0bc6e87ac5989af4c21de2377268e6bc15379ec1eaae601db50","7c12eca255521629498c645929488f10adfc8c6e03cd4e343115718e5cbec0b1","4c15633afa04ae5207867257f5a56ab0e76c10be5e9ae6b9f9ce7be9a03cd67a","a0630ded9a175c1fc3fca8488e5b04c3954565bd723cbf89e997fde070c2c8c3","3b33ec1a7c1ba2685df026fee39a51c6f7a1db65ebedd9489e50187bf74b6812","3dacc5b5e74ed8864cf1b499d718e937bcec987edff316303d84b0738bb8c28c","5c952d2701fe9cae4313b08b39995dfe280f8e3dd143206aaed88a9369f70c9b","1750df344be53385979e126bf8411a36b545091d74f719327c805e77bd5abdef","4b2b3a557bb745adc2003f01ac67a42ffaec553b3363e84c455e304818de8411","41b37536c68576a51e4a027a6c057de6e3f581967fbdfef4d88e56ce3cd9754a","d763c69fddb176fcae60ee69e091f9ae4b9ef8247abe142ef034b04d9855dd34","ecc2e5e7824d6de1118b83f4d4e3ba4315ac3100ad3b334f091309c38041c34e","48af7517257558314b62056f4ac95d2eb262d4af1489cd925d6f799d5a01904b","43e1113c7fb7a8d33aa20e34a2b9dc8ee5802f95fc5cf9876169931b2934fc33","45f46f7810e24cd766508538e7184733a5b8e3bce1796cfd131fc5a51a9a6260","6c298f95b95399bd38f4bffbd92fc2934e7acd8c700d09d178aa5e4aa99eae3c","dbc5d120ae090bc3b86c888ab051cfacf5e6e214ecfbeada46d3da75039c5012","f3f28aaf7089d69817203730645c71ebe7b21f0b29bef967f4b61b51b27990ed","313c8aafe4e94425f066c93067550d37ca0b15621e1086595a53dea95a974b45","29271907eff0763b42558502632c8a3967be0df3c27432fdabcf0429266157e7","1f43bc59dff60fd58fb5115edc06dbf752022ff4ce091f339879265ed79e1143","fa0267687f9ea8b57f4404ab5f6ce654b89ebf2221a09175d56a8b30df74f636","9a59d5981c4cf2e0574120a1d9c8abe5a18a00e9059f5c3eb499daf22fe12154","f031e290da3a6623e47c7d36933f8fbc5cd1c8b50c391e7e3d81366e07a2f613","2ab3f67c979d3939bd52826532d24ac26cad3ed138c03cc468245fdba7beb290","498c2abd4fd3d4068cac59a57e26311229e155651b2b589fb1784451eec77d14","9d7f4716d0d172817827aef036d4a39e7a95b3af1aec1614572fd271fa148de8",{"version":"55a914fba7f17f73eb971e012bcb90221d5dca20751852c217428a5511db57a4","impliedFormat":99},{"version":"d9b54195cd22859480b70a2e287c41e654c812b0d3945652bd08c8943ddef78b","impliedFormat":99},{"version":"73b32be132963c6e06bb2f833ea0c21116581a3aafc8ac9145cc89a0b6f54bc0","impliedFormat":99},{"version":"73597a22736b6efce7cb30e380705cd6572d9e3f9816068130ec09550129996f","impliedFormat":99},{"version":"04504c465aabfed05529bf3b314df66c4eb449b188547c51edb962d8eb6069e0","impliedFormat":99},{"version":"09466b34e26295ee836861fa6348aff7b2275c6220cc0b41040c9949421e052f","impliedFormat":99},{"version":"242ce683695df72f1cdd40ae2ac06c569412e533528de95d956b26218cd195f5","impliedFormat":99},{"version":"d75a572cfd779c99cbdab5f8f44f6ce465367c057c07e33364d186de41ad9b14","impliedFormat":99},{"version":"8d12c3032607835687037e28dc245a4af486ef4aa6e6cb13744dcb0a3b074ab4","impliedFormat":99},{"version":"7ee2d1edc6f59a50eaeb12ac61a74ab4832f64661f795131df23ac8256df2329","impliedFormat":99},{"version":"8fea385f7e21a39e857e3fae89eabde7b0960083d205177430be507b38413579","impliedFormat":99},{"version":"7fdb8950d8a019940182ff1f50d02809a45832121b9a7899677a497aaba506ce","impliedFormat":99},{"version":"530e23db4425868edfc20e35fe2d8acf047af5b6f14afa46ee2e0e71e40c8df1","impliedFormat":99},{"version":"7cf421c4c6e223d2b648dae0ea51a134c4c8a5d8d55db1287372c4c1569c656f","impliedFormat":99},{"version":"ee662f8ffa58a60ca3ca8c141d4910043216efe63f696146b6fa0a455a4f9034","impliedFormat":99},{"version":"4eb4f2e56895129861a971177f8e9241ccf633daae3a6ac7343b92e973381c26","impliedFormat":99},{"version":"c75223aab2bfbe3fe85211fe56cfc844dd93d33e503e22e9911fd0d3e6f6538f","impliedFormat":99},{"version":"8fcea3d952a8129821d4060969f305a341706c256cb8002aba8e5b07088c24ed","impliedFormat":99},{"version":"2a6cef87ea83b5bdbc862e894329ba11002e76d5fb6ab24247502ecad2c6fbe7","impliedFormat":99},{"version":"39248c14bedc3e2d734739452408661523228ec790d7142a4de185ae88904da4","impliedFormat":99},{"version":"c14433af8654964ed33f9cc16f9369e05ae543d56bbc6a1c3b393fa7077f08a1","impliedFormat":99},{"version":"d867a5469eabe8abab25b27abb7125ef2ba019ef42dd1ca2b5d0871513042629","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"c031417387ddbb2923f41e3fc94b49157745785281c8949a221cd69368610086","impliedFormat":1},{"version":"73ef706b29d220404677226880137ad0da0145b6a2332d5427b9517dee295e70","impliedFormat":99},{"version":"89fc4cad6ac7ac6d922523b3ab51462b050189ab335766149e5cc777483d4e1b","impliedFormat":1},{"version":"27b14b091ccf309c79f3d2cf226edfa4d533b131f19bc0cbe855adebd464c285","impliedFormat":99},{"version":"50854b8ef4c29f3e952f170aaa045604a9d90360b680ddaeff542d1f5bb5fa8c","impliedFormat":99},{"version":"caa3a0be5c051f52e27b91642c8b31037c09ad0b65288498f4c55e33be7ea249","impliedFormat":99},{"version":"48020f2aa87dd71c26414f9afdf172159a6c31186705417da52add9d6cfe2153","impliedFormat":99},{"version":"f4e5a6883146482d6b49c1406f99a38b1ef883382b169bb5fc6cf7cf9f2ac70c","impliedFormat":99},{"version":"8b7b4f82a54a847a29fa481af4ea74372c19b75379bd27658c2a819149f21871","impliedFormat":99},{"version":"4f7faca5821e340342ea0feb3d478126659ece37d5dfdd6d9c9536bfd48def34","impliedFormat":99},{"version":"99878cc85152e70be715546f165826d83cf033547b4647cc3cc9cbd6d4df429a","impliedFormat":99},{"version":"7677f5595e7bdc2e6e42ebe8b4df4f4b520b28f6f175c839b73a208e6f3c8907","impliedFormat":99},{"version":"fd7faa9225e2e61a0a3d786a7a859af52dcb295c06bce7dfca140037655dc095","impliedFormat":99},{"version":"af0f7e3281ab0774f26ca8bc36d6aa37709f3510c8c1eb0ab122e7063159be01","impliedFormat":99},{"version":"960096f9e2ff9e9019e1c23a04916f2005d4c8dbd43f96b196d754b6c8a16700","impliedFormat":99},{"version":"c7c18305c761411b3c168f2b3376101b60d7a7d7c0505e81c6d8193a418f3d63","impliedFormat":99},{"version":"6b9a76dbc0ac3a427aa7370981cea9aea0e8286453b189dd03776f1034f7847c","impliedFormat":99},{"version":"3e48026dd0f58d4668dbfa9c6747302dcbc52e3aec373ec1f95c2ba78c308f33","impliedFormat":99},{"version":"053f54680ea9b4b1a8e9e5fe9f4a1fdcbc00f8f9b6d895109eb0d169915dfd11","impliedFormat":99},{"version":"3b0f440d9e4227285cec9159b1a472bc885687baf227a7b4126e2ba6dbef96fc","impliedFormat":99},{"version":"656e3a4ac005fcb1513ab1224eacfd55ae04b6f16d21d66c971dc901dad62c66","impliedFormat":99},{"version":"ea4891706f147e494a2a7028b2376110c2e85b7561b27448d51a7d1277c6fcf2","impliedFormat":99},{"version":"7f9bb3e6bb8d0607f94d1498c5fa8ac7445fcb4af52d0775a857d0986e0d0c84","impliedFormat":99},{"version":"c98c85d5b894c8955950338b1091f0febdc6c6702cf3b67a171d29d80fb2dfce","impliedFormat":99},{"version":"d00addf28fd877e3f8109b592b1918084cfb831268a0fd052fa72e6e01390cca","impliedFormat":99},{"version":"0cc0f30db3c4a2577606c6930eac2814d0463148d1bf02be9eaa318d6cb6d40e","impliedFormat":99},{"version":"21fb062824012292b09e9357aa7ac3231a0d683a7fbb9bc8e2b027346c7bcb32","impliedFormat":99},{"version":"9aa939dd1371c068dcda7d17c32fcbee08fa994890fefac8ad39d8cd5a294d92","impliedFormat":99},{"version":"8c0e829b03024d1905dba908ed55a5808d79159709770fe7a3b0395fa78125c6","impliedFormat":99},{"version":"15e6253aeb724521fcd0fd8bab60ac00b40e1b6c39aabb0de3b3e45ebe2d584a","impliedFormat":99},{"version":"4d3a0370e69c2d70d62a2eaeb40512474e38b4dff1a4e7ac98637f954ec5c143","impliedFormat":99},{"version":"b0094b81741504d0282359218e3659f5282b9748ad0e80d9a1c634bc1c88af4b","impliedFormat":99},{"version":"2c8e3d7848994c490cace467a6aae3fc4908e5b577b5ab0996200497062bb80b","impliedFormat":99},{"version":"6db32445cedcfaf6f6a4dbb922cdaf87e1cfc0422e4a31efeebef3fb0eb1a93b","impliedFormat":99},{"version":"b5102cfc507fe0c916a9ad45f4f52e00e3959b90eb90c5873e9527cb37eadb78","impliedFormat":99},{"version":"21e3abbcf80dc69638d138f5c6d07f596f8a162a8dca3bd71286403a96f8d0ab","impliedFormat":99},{"version":"20eab98ea24e9bf8834db1a339abb373e6f6a268537efa1fd571cd3809839eb1","impliedFormat":99},{"version":"796885a2efe76d5bef797516bd3a798b275f81075da8497fc1f6a9d3e085f2a8","impliedFormat":99},{"version":"b5a2192e328273da5a8279add3052bbc33b1adecb15f34a577c69c4dd2766d8e","impliedFormat":99},{"version":"20126c8c53f22550e68edb187f5d4d477b79a2effe7801fff3aa47949219d67b","impliedFormat":99},{"version":"8b63cf9a4a5bafaa3d2e157e6d07bb20d0d73fe0c5ddda715342a48d18534154","impliedFormat":99},{"version":"369dd195a978dcb88d63f1f1878e5dabb90bbc79b3e5fb0f16cf06209ab9e7aa","impliedFormat":99},{"version":"090b7d0fd37b238e003029b9137d5dff073791e21adaac556dd7524ed9ed977e","impliedFormat":99},{"version":"efedab846f4656f034814230fc05513b8cefb5f95994faee4f9b174c98bfef41","impliedFormat":99},{"version":"4f8876f00aa99ae0b39d6bca9da9e86f426dc6c458558773a647100a85fc3312","impliedFormat":99},{"version":"a13e1f68a2a1f29ceac30f51562e13677a5b8615377af952f0b7d1f9edff34f4","impliedFormat":99},{"version":"06f1e24d4146a779e7fd7a0f0cfdcdcb878da25e271e1e7d5d7f81d874f2dbec","impliedFormat":99},{"version":"0a3ede23be099f3ad266a10b4ad0cfb6efd446b9951f553274706348c3b56dae","impliedFormat":99},{"version":"c7b05cafd385f8988babecd476f4f9c817ecc68141dad54e2dd3ae458878a8f4","impliedFormat":99},{"version":"8fc8726fe9d96e0440518b06451181cabba87bdcb60a6e854b77e2b6dab52890","impliedFormat":99},{"version":"6cb381987d43f853d8d01c2fd5f32627e0c0f3a4dd1a11d5e3f94ff5832aff2b","impliedFormat":99},{"version":"ba0567434dbadd0fb8e80c4e00fb9c30449497f8bf07e82b2b857db0029f9b18","impliedFormat":99},{"version":"f72e417b7d49a5dec2d4f3857f6925ee78608cda1c42655d0179ccd38c66c15a","impliedFormat":99},{"version":"fdbb1158637d3ca4d209c7174270e5eb1414b4ee5324e9c33b1fae88e83bfc14","impliedFormat":99},{"version":"436cdc04f8ad3a54d2194b9926f52d564157ca162dcf3c9f71fa4711d057190b","impliedFormat":99},{"version":"73d9180a0b84dfb4c1a95bf72028103bd81472595617dd7ce788ea21639bcee4","impliedFormat":99},{"version":"55c1b951a4d7289a3056e2edea9855671a9d1f8f09632916ed1fb2aebb57b5c6","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"bb9c7998d6def957496260f4c881ccc5b3d4eb4084ab00fbd8abc8c1e1ba67b7","impliedFormat":99},{"version":"340efc3f335a2a3ea2ca1899755906bcb6ebcbddf14306e66d0f16746db98273","impliedFormat":99},{"version":"6a691651e2748bf7792a251d820f00e8d9d3e4da1cdfbea91c33beda2bdd8b89","impliedFormat":99},{"version":"c3096b0c0f579462e17c525ee6835d82952c32b35061a1d32ac32d7e0f191da1","impliedFormat":99},{"version":"91b3c513f0ca4e2d0c5bc9ba1f43b169e1da7c49ff2cf5ffe730009c229f359f","impliedFormat":99},{"version":"ea0b435818ce832634961d1b65e972927f65a3c29a3e2c0cec3aafa0d7fe4ea0","impliedFormat":99},{"version":"50fe63347779cd2244429e0d54148fdb5d230dcc11f2bb8c7efc9d12c1e573d2","impliedFormat":99},{"version":"7adac175e5942f34a34f223d213bdd9869935ec6083dc6da836b996b7acdf7d5","impliedFormat":99},{"version":"2af0e322d1c39e8b16436cd9bd9c97b6013b75c179281df61afa10df0c722a1b","impliedFormat":99},{"version":"09b1271f73d90a01c889b4963a350825cff11493498b4141fde2399ce09de43a","impliedFormat":99},{"version":"0ef3eabd40fcec506413988e397ff7dcbed2aebfe4f88c486e2ba8dd1bc0ee0b","impliedFormat":99},{"version":"44dce86f2b5ef5e38fe6c068bc629afc04221adfa039f0dd649ae10f799f9ec8","impliedFormat":99},{"version":"5ad41356543df4a83b3ce069a7e628d2ba648399db0bdd4005bd1dfef26d34e2","impliedFormat":99},{"version":"0b448474270be29ded59bb946ac311c40c579ef0b9cf358a54750eef34359088","impliedFormat":99},{"version":"d7ddde645d6ca5b97f75923b3946e96495f81d7f4fd568201653f1939a3312a3","impliedFormat":99},{"version":"fb1148873f0d706261f8517b7ce3574b369c8213e8304c7c21cb9ca248b8dcc3","impliedFormat":99},{"version":"0637ec66edeed3f9ee0da72c0d5ab2c128db9e5a6226f8aca5672aa617db1726","impliedFormat":99},{"version":"ee49e1206cf12b67d5b72a98eaab773481130b87a9eeaa262086a4314d1cd991","impliedFormat":99},{"version":"9fa29d6f0b05ee8f619202c07680a46025b166da55e431a49c5badaa2983429b","impliedFormat":99},{"version":"f53857d23110842c0c62416b09caccb9286b3ba52fa2b6bbe254c58123d9bb09","impliedFormat":99},{"version":"89c02b0ad4fc44d10576b3e37c2c5262a37f2db171a486d2d5960ee60323bb96","impliedFormat":99},{"version":"59348badf356a43f7e1847364a8fdb8a914b9977a517b41f3ed206db36b875c1","impliedFormat":99},{"version":"ff0c09d8b0c8c0ffb09ef9250fac17c98eb4dd5a4f4955d53fc3880d6553b91b","impliedFormat":99},{"version":"07146d909fcbc1d33c5fc02f74dab3750d075a4de305a6c078fff8265e089c5e","impliedFormat":99},{"version":"b323496b42ebb7f2839ef1acb04947c74cc586c8ad20cc936c069d34b98a29ac","impliedFormat":99},{"version":"62159930f535b73f265f98f669c7f7bbdaef719ebc2de3a2bc4835e71ed68ba0","impliedFormat":99},{"version":"6ae1d121a8c1ff3398eff8af6e398868b631689d120076d7004c787479eacc61","impliedFormat":99},{"version":"d23bfd5a61fb32048f370f988a9772966651be1380c1a93c199d7cb25b7b0cf0","impliedFormat":99},{"version":"7344e1d823581d72124f6a328669abbeec44910c2045823bf7e7bef79ca49f73","impliedFormat":99},{"version":"af4a6e7559998dac4978f02c572d0f391928b6f40c62459c1e4ae5afc12995c7","impliedFormat":99},{"version":"b0a2a4c5ca7f6f874de72e39be8f470b348ec062c005cb5a7acc840fd7f67807","impliedFormat":99},{"version":"75083e759d8b09bcbf201a250c918a35221d05c7524cbb67b2b4d8959c919252","impliedFormat":99},{"version":"d89f7811a420d990b817f383c3fec421559063a7cb744fae619e8bba20dd151d","impliedFormat":99},{"version":"abd03428933117fdb9db45ac492eaac24d9a77c37c3944d26dba044b7fce6870","impliedFormat":99},{"version":"97050f022128934adae6a773a63be3c5bd5726f153fb72e9a8d34f2656135de2","impliedFormat":99},{"version":"3901f637d5f111593a5ea39a31d27e7a5f62195251f4ed6a50b77a020bc6e416","impliedFormat":99},{"version":"7edffa8d9c968f6a96b6ffc774be07717378ec619777e78510a7b6de4bfe67df","impliedFormat":99},{"version":"8f8d24c887f993b6c131075ac4f82cefbb246747b22c50491dc64ffd2cb340d9","impliedFormat":99},{"version":"5ffb8c07f5474d45bab306b6267ef2777ad786a841e0942416f485125cbd2385","impliedFormat":99},{"version":"e0d7a3cdfaa21621610dc3b74f8ccd59a5cd8617843ded1d610f05bf790adde6","impliedFormat":99},{"version":"b8f4165a3fa8fea167bb5016ad7629581d8fffb16447217d480c8a7ea438ed8d","impliedFormat":99},{"version":"b936b8e4ad57e3be1407c74e36645d31bebe7f1183d926a0c438cf416ec708f5","impliedFormat":99},{"version":"13fc27c27bc9a42e5e0c4cc08b64e7693b225c565bdab45ace16c179760f3cc9","impliedFormat":99},{"version":"8ff87eb5acdf565af022fb9145942b2207ac8cd0644917bc7d44efb91f4115d3","impliedFormat":99},{"version":"616ff480886a32cf50f73c4ee5fdd9672a5f21428eadcac34c41acb06035c214","impliedFormat":99},{"version":"f08e5842644a8e03da9efdbf89bf4eb61ea906a3bbc255bd7d7583756cb3dc61","impliedFormat":99},{"version":"562682efb4f43e58eb779a742f3e26c1fd796da0b785620de601202a38764785","impliedFormat":99},{"version":"264f935450101e4b000eb351cf75c9d799ca20a278b260a9e5770303b5f2b6a3","impliedFormat":99},{"version":"f6f171b23ae6db93454343f1b788960f799c8f37043904874a752c0990c6fca6","impliedFormat":99},{"version":"089f9928e7ab1ca2c225e167a80ff1cb5ed0a71c98be7e81f040a51e2cc6bf5e","impliedFormat":99},{"version":"b11acc27c280988d7256bbd8ffe9f1cb5a0e5ed17cddf5335289ee0e81500369","affectsGlobalScope":true,"impliedFormat":99},{"version":"02ab5dbcaa58da1d58c46c7cdfa7f94792c5ccf0fc7c0622ef33755fe415366c","impliedFormat":99},{"version":"e689cc8cd8a102d31c9d3a7b0db0028594202093c4aca25982b425e8ae744556","impliedFormat":99},{"version":"478e59ac0830a0f6360236632d0d589fb0211183aa1ab82292fbca529c0cce35","impliedFormat":99},{"version":"1b4ed9deaba72d4bc8495bf46db690dbf91040da0cb2401db10bad162732c0e2","impliedFormat":99},{"version":"cf60c9e69392dd40b81c02f9674792e8bc5b2aff91d1b468e3d19da8b18358f8","impliedFormat":99},{"version":"3e94295f73335c9122308a858445d2348949842579ac2bacd30728ab46fe75a7","impliedFormat":99},{"version":"8a778c0e0c2f0d9156ca87ab56556b7fd876a185960d829c7e9ed416d5be5fb4","impliedFormat":99},{"version":"b233a945227880b8100b0fec2a8916339fa061ccc23d2d9db4b4646a6cd9655f","impliedFormat":99},{"version":"54821272a9f633d5e8ec23714ece5559ae9a7acc576197fe255974ddbd9b05d6","impliedFormat":99},{"version":"e08685c946d49f555b523e481f4122b398c4444c55b164e5ac67c3ba878db8d1","impliedFormat":99},{"version":"3c99d5232a3c8b54016e5700502078af50fe917eb9cb4b6d9a75a0a3456fcd5d","impliedFormat":99},{"version":"9d8e34ec610435ee2708595564bbad809eab15c9e3fa01ad3746bbe9015faaed","impliedFormat":99},{"version":"7202a89bea0bdab87cc0ae60912b9e631a48f519b6a1f323dba8bc77a02a3481","impliedFormat":99},{"version":"f865343c121abc3516abf5b888d0c1b7596ec772229d8e4d4d796f89e8c9d0c0","impliedFormat":99},{"version":"77114bdbc7388aeeb188c85ebe27e38b1a6e29bc9fea6e09b7011bbb4d71ec41","impliedFormat":99},{"version":"3df489529e6dfe63250b187f1823a9d6006b86a7e9cac6b338944d5fc008db70","impliedFormat":99},{"version":"fe0d316062384b233b16caee26bf8c66f2efdcedcf497be08ad9bcea24bd2d2c","impliedFormat":99},{"version":"2f5846c85bd28a5e8ce93a6e8b67ad0fd6f5a9f7049c74e9c1f6628a0c10062a","impliedFormat":99},{"version":"7dfb517c06ecb1ca89d0b46444eae16ad53d0054e6ec9d82c38e3fbf381ff698","impliedFormat":99},{"version":"35999449fe3af6c7821c63cad3c41b99526113945c778f56c2ae970b4b35c490","impliedFormat":99},{"version":"1fff68ffb3b4a2bf1b6f7f4793f17d6a94c72ca8d67c1d0ac8a872483d23aaf2","impliedFormat":99},{"version":"6dd231d71a5c28f43983de7d91fb34c2c841b0d79c3be2e6bffeb2836d344f00","impliedFormat":99},{"version":"e6a96ceaa78397df35800bafd1069651832422126206e60e1046c3b15b6e5977","impliedFormat":99},{"version":"035dcab32722ff83675483f2608d21cb1ec7b0428b8dca87139f1b524c7fcdb5","impliedFormat":99},{"version":"605892c358273dffa8178aa455edf675c326c4197993f3d1287b120d09cee23f","impliedFormat":99},{"version":"a1caf633e62346bf432d548a0ae03d9288dc803c033412d52f6c4d065ef13c25","impliedFormat":99},{"version":"774f59be62f64cf91d01f9f84c52d9797a86ef7713ff7fc11c8815512be20d12","impliedFormat":99},{"version":"46fc114448951c7b7d9ed1f2cc314e8b9be05b655792ab39262c144c7398be9f","impliedFormat":99},{"version":"9be0a613d408a84fa06b3d748ca37fd83abf7448c534873633b7a1d473c21f76","impliedFormat":99},{"version":"f447ea732d033408efd829cf135cac4f920c4d2065fa926d7f019bff4e119630","impliedFormat":99},{"version":"09f1e21f95a70af0aa40680aaa7aadd7d97eb0ef3b61effd1810557e07e4f66a","impliedFormat":99},{"version":"a43ec5b51f6b4d3c53971d68d4522ef3d5d0b6727e0673a83a0a5d8c1ced6be2","impliedFormat":99},{"version":"c06578ae45a183ba9d35eee917b48ecfdec19bb43860ffc9947a7ab2145c8748","impliedFormat":99},{"version":"2a9b4fd6e99e31552e6c1861352c0f0f2efd6efb6eacf62aa22375b6df1684b1","impliedFormat":99},{"version":"ad9f4320035ac22a5d7f5346a38c9907d06ec35e28ec87e66768e336bc1b4d69","impliedFormat":99},{"version":"05a090d5fb9dc0b48e001b69dc13beaab56883d016e6c6835dbdaf4027d622d4","impliedFormat":99},{"version":"76edff84d1d0ad9cece05db594ebc8d55d6492c9f9cc211776d64b722f1908e0","impliedFormat":99},{"version":"ec7cef68bcd53fae06eecbf331bb3e7fdfbbf34ed0bbb1fb026811a3cd323cb4","impliedFormat":99},{"version":"36ea0d582c82f48990eea829818e7e84e1dd80c9dc26119803b735beac5ee025","impliedFormat":99},{"version":"9c3f927107fb7e1086611de817b1eb2c728da334812ddab9592580070c3d0754","impliedFormat":99},{"version":"eeae71425f0747a79f45381da8dd823d625a28c22c31dca659d62fcc8be159c2","impliedFormat":99},{"version":"d769fae4e2194e67a946d6c51bb8081cf7bd35688f9505951ad2fd293e570701","impliedFormat":99},{"version":"55ce8d5c56f615ae645811e512ddb9438168c0f70e2d536537f7e83cd6b7b4b0","impliedFormat":99},{"version":"fa1369ff60d8c69c1493e4d99f35f43089f0922531205d4040e540bb99c0af4f","impliedFormat":99},{"version":"a3382dd7ef2186ea109a6ee6850ca95db91293693c23f7294045034e7d4e3acf","impliedFormat":99},{"version":"2b1d213281f3aa615ae6c81397247800891be98deca0b8b2123681d736784374","impliedFormat":99},{"version":"c34e7a89ed828af658c88c87db249b579a61e116bea0c472d058e05a19bf5fa9","impliedFormat":99},{"version":"7ae166eb400af5825d3e89eea5783261627959809308d4e383f3c627f9dad3d8","impliedFormat":99},{"version":"69f64614a16f499e755db4951fcbb9cf6e6b722cc072c469b60d2ea9a7d3efe8","impliedFormat":99},{"version":"75df3b2101fc743f2e9443a99d4d53c462953c497497cce204d55fc1efb091e0","impliedFormat":99},{"version":"7dc0f40059b991a1624098161c88b4650644375cc748f4ac142888eb527e9ccd","impliedFormat":99},{"version":"a601809a87528d651b7e1501837d57bb840f47766f06e695949a85f3e58c6315","impliedFormat":99},{"version":"d64f68c9dbd079ad99ec9bae342e1b303da6ce5eac4160eb1ed2ef225a9e9b23","impliedFormat":99},{"version":"99c738354ecc1dba7f6364ed69b4e32f5b0ad6ec39f05e1ee485e1ee40b958eb","impliedFormat":99},{"version":"8cd2c3f1c7c15af539068573c2c77a35cc3a1c6914535275228b8ef934e93ae4","impliedFormat":99},{"version":"efb3ac710c156d408caa25dafd69ea6352257c4cebe80dba0f7554b9e903919c","impliedFormat":99},{"version":"260244548bc1c69fbb26f0a3bb7a65441ae24bcaee4fe0724cf0279596d97fb4","impliedFormat":99},{"version":"ce230ce8f34f70c65809e3ac64dfea499c5fd2f2e73cd2c6e9c7a2c5856215a8","impliedFormat":99},{"version":"0e154a7f40d689bd52af327dee00e988d659258af43ee822e125620bdd3e5519","impliedFormat":99},{"version":"cca506c38ef84e3f70e1a01b709dc98573044530807a74fe090798a8d4dc71ac","impliedFormat":99},{"version":"160dbb165463d553da188b8269b095a4636a48145b733acda60041de8fa0ae88","impliedFormat":99},{"version":"8b1deebfd2c3507964b3078743c1cb8dbef48e565ded3a5743063c5387dec62f","impliedFormat":99},{"version":"6a77c11718845ff230ac61f823221c09ec9a14e5edd4c9eae34eead3fc47e2c7","impliedFormat":99},{"version":"5a633dd8dcf5e35ee141c70e7c0a58df4f481fb44bce225019c75eed483be9be","impliedFormat":99},{"version":"f3fb008d3231c50435508ec6fd8a9e1fdc04dd75d4e56ec3879b08215da02e2c","impliedFormat":99},{"version":"9e4af21f88f57530eea7c963d5223b21de0ddccfd79550636e7618612cc33224","impliedFormat":99},{"version":"b48dd54bd70b7cf7310c671c2b5d21a4c50e882273787eeea62a430c378b041a","impliedFormat":99},{"version":"1302d4a20b1ce874c8c7c0af30051e28b7105dadaec0aebd45545fd365592f30","impliedFormat":99},{"version":"fd939887989692c614ea38129952e34eeca05802a0633cb5c85f3f3b00ce9dff","impliedFormat":99},{"version":"3040f5b3649c95d0df70ce7e7c3cce1d22549dd04ae05e655a40e54e4c6299de","impliedFormat":99},{"version":"de0bd5d5bd17ba2789f4a448964aba57e269a89d0499a521ccb08531d8892f55","impliedFormat":99},{"version":"921d42c7ec8dbefd1457f09466dadedb5855a71fa2637ad67f82ff1ed3ddc0d0","impliedFormat":99},{"version":"b0750451f8aec5c70df9e582ab794fab08dae83ea81bb96bf0b0976e0a2301ee","impliedFormat":99},{"version":"8ba931de83284a779d0524b6f8d6cf3956755fb41c8c8c41cd32caf464d27f05","impliedFormat":99},{"version":"4305804b3ae68aebb7ef164aabd7345c6b91aada8adda10db0227922b2c16502","impliedFormat":99},{"version":"96ae321ebb4b8dcdb57e9f8f92a3f8ddb50bdf534cf58e774281c7a90b502f66","impliedFormat":99},{"version":"934158ee729064a805c8d37713161fef46bf36aa9f0d0949f2cd665ded9e2444","impliedFormat":99},{"version":"6ef5957bb7e973ea49d2b04d739e8561bca5ae125925948491b3cfbd4bf6a553","impliedFormat":99},{"version":"6a32433315d54a605c4be53bf7248dfd784a051e8626aeb01a4e71294dd2747f","impliedFormat":99},{"version":"9476325d3457bfe059adfee87179a5c7d44ecbeec789ede9cfab8dc7b74c48db","impliedFormat":99},{"version":"4f1c9401c286c6fff7bbf2596feef20f76828c99e3ccb81f23d2bd33e72256aa","impliedFormat":99},{"version":"b711cdd39419677f7ca52dd050364d8f8d00ea781bb3252b19c71bdb7ec5423e","impliedFormat":99},{"version":"ee11e2318448babc4d95f7a31f9241823b0dfc4eada26c71ef6899ea06e6f46b","impliedFormat":99},{"version":"27a270826a46278ad5196a6dfc21cd6f9173481ca91443669199379772a32ae8","impliedFormat":99},{"version":"7c52f16314474cef2117a00f8b427dfa62c00e889e6484817dc4cabb9143ac73","impliedFormat":99},{"version":"6c72a60bb273bb1c9a03e64f161136af2eb8aacc23be0c29c8c3ece0ea75a919","impliedFormat":99},{"version":"6fa96d12a720bbad2c4e2c75ddffa8572ef9af4b00750d119a783e32aede3013","impliedFormat":99},{"version":"00128fe475159552deb7d2f8699974a30f25c848cf36448a20f10f1f29249696","impliedFormat":99},{"version":"e7bd1dc063eced5cd08738a5adbba56028b319b0781a8a4971472abf05b0efb4","impliedFormat":99},{"version":"2a92bdf4acbd620f12a8930f0e0ec70f1f0a90e3d9b90a5b0954aac6c1d2a39c","impliedFormat":99},{"version":"c8d08a1e9d91ad3f7d9c3862b30fa32ba4bc3ca8393adafdeeeb915275887b82","impliedFormat":99},{"version":"c0dd6b325d95454319f13802d291f4945556a3df50cf8eed54dbb6d0ade0de2f","impliedFormat":99},{"version":"0627ae8289f0107f1d8425904bb0daa9955481138ca5ba2f8b57707003c428d5","impliedFormat":99},{"version":"4d8c5cc34355bfb08441f6bc18bf31f416afbfa1c71b7b25255d66d349be7e14","impliedFormat":99},{"version":"b365233eaff00901f4709fa605ae164a8e1d304dc6c39b82f49dda3338bea2b0","impliedFormat":99},{"version":"456da89f7f4e0f3dc82afc7918090f550a8af51c72a3cfb9887cf7783d09a266","impliedFormat":99},{"version":"d9a2dcc08e20a9cf3cc56cd6e796611247a0e69aa51254811ec2eed5b63e4ba5","impliedFormat":99},{"version":"44abf5b087f6500ab9280da1e51a2682b985f110134488696ac5f84ae6be566c","impliedFormat":99},{"version":"ced7ef0f2429676d335307ad64116cd2cc727bb0ce29a070bb2992e675a8991e","impliedFormat":99},{"version":"0b73db1447d976759731255d45c5a6feff3d59b7856a1c4da057ab8ccf46dc84","impliedFormat":99},{"version":"3fc6f405e56a678370e4feb7a38afd909f77eb2e26fe153cdaea0fb3c42fbbee","impliedFormat":99},{"version":"2762ed7b9ceb45268b0a8023fd96f02df88f5eb2ad56851cbb3da110fd35fdb5","impliedFormat":99},{"version":"9c20802909ca00f79936c66d8315a5f7f2355d343359a1e51b521ec7a8cfa8bf","impliedFormat":99},{"version":"31ddfdf751c96959c458220cd417454b260ff5e88f66dddc33236343156eb22c","impliedFormat":99},{"version":"ec0339cf070b4dedf708aaed26b8da900a86b3396b30a4777afcd76e69462448","impliedFormat":99},{"version":"067eed0758f3e99f0b1cfe5e3948aa371cbb0f48a26db8c911772e50a9cc9283","impliedFormat":99},{"version":"7dfb9316cfbf2124903d9bc3721d6c19afbf5109dfbc2017ca8ae758f85178ab","impliedFormat":99},{"version":"919a7135fa54057cf42c8cd52165bf938baeb6df316b438bbf4d97f3174ff532","impliedFormat":99},{"version":"4a2957dfe878c8b49acb18299dfba2f72b8bf7a265b793916c0479b3d636b23b","impliedFormat":99},{"version":"fad6a11a73a787168630bf5276f8e8525ab56f897a6a0bf0d3795550201e9df5","impliedFormat":99},{"version":"0cc8d34354ec904617af9f1d569c29b90915634c06d61e7e74b74de26c9379d2","impliedFormat":99},{"version":"529b225f4de49eed08f5a8e5c0b3030699980a8ea130298ff9dfa385a99c2a76","impliedFormat":99},{"version":"77bb50ea87284de10139d000837e5cce037405ac2b699707e3f8766454a8c884","impliedFormat":99},{"version":"95c33ceea3574b974d7a2007fed54992c16b68472b25b426336ef9813e2e96e8","impliedFormat":99},{"version":"1ecb3c690b1bfdc8ea6aaa565415802e5c9012ec616a1d9fb6a2dbd15de7b9dc","impliedFormat":99},{"version":"57fc10e689d39484d5ae38b7fc5632c173d2d9f6f90196fc6a81d6087187ed03","impliedFormat":99},{"version":"f1fb180503fecd5b10428a872f284cc6de52053d4f81f53f7ec2df1c9760d0c0","impliedFormat":99},{"version":"d30d4de63fc781a5b9d8431a4b217cd8ca866d6dc7959c2ce8b7561d57a7213f","impliedFormat":99},{"version":"765896b848b82522a72b7f1837342f613d7c7d46e24752344e790d1f5b02810b","impliedFormat":99},{"version":"ee032efc2dd5c686680f097a676b8031726396a7a2083a4b0b0499b0d32a2aea","impliedFormat":99},{"version":"b76c65680c3160e6b92f5f32bc2e35bca72fedb854195126b26144fd191cd696","impliedFormat":99},{"version":"13e9a215593478bd90e44c1a494caf3c2079c426d5ad8023928261bfc4271c72","impliedFormat":99},{"version":"3e27476a10a715506f9bb196c9c8699a8fe952199233c5af428d801fdda56761","impliedFormat":99},{"version":"dbb9ad48b056876e59a7da5e1552c730b7fa27d59fcd5bf27fd7decc9d823bb8","impliedFormat":99},{"version":"4bd72a99a4273c273201ca6d1e4c77415d10aa24274089b7246d3d0e0084ca06","impliedFormat":99},{"version":"7ae03c4abb0c2d04f81d193895241b40355ae605ec16132c1f339c69552627c1","impliedFormat":99},{"version":"650eddf2807994621e8ca331a29cc5d4a093f5f7ff2f588c3bb7016d3fe4ae6a","impliedFormat":99},{"version":"615834ad3e9e9fe6505d8f657e1de837404a7366e35127fcb20e93e9a0fb1370","impliedFormat":99},{"version":"c3661daba5576b4255a3b157e46884151319d8a270ec37ca8f353c3546b12e9b","impliedFormat":99},{"version":"de4abffb7f7ba4fffbd5986f1fe1d9c73339793e9ac8175176f0d70d4e2c26d2","impliedFormat":99},{"version":"211513b39f80376a8428623bb4d11a8f7ef9cd5aa9adce243200698b84ce4dfb","impliedFormat":99},{"version":"9e8d2591367f2773368f9803f62273eb44ef34dd7dfdaa62ff2f671f30ee1165","impliedFormat":99},{"version":"0f3cef820a473cd90e8c4bdf43be376c7becfda2847174320add08d6a04b5e6e","impliedFormat":99},{"version":"20eed68bc1619806d1a8c501163873b760514b04fcf6a7d185c5595ff5baef65","impliedFormat":99},{"version":"620ef28641765cc6701be0d10d537b61868e6f54c9db153ae64d28187b51dbc0","impliedFormat":99},{"version":"341c8114357c0ec0b17a2a1a99aecbfc6bc0393df49ea6a66193d1e7a691b437","impliedFormat":99},{"version":"b01fe782d4c8efc30ab8f55fae1328898ad88a3b2362ba4daac2059bd30ef903","impliedFormat":99},{"version":"f8e8b33983efa33e28e045b68347341fc77f64821b7aabaac456d17b1781e5f4","impliedFormat":99},{"version":"8d3e416906fb559b9e4ad8b4c4a5f54aeadeb48702e4d0367ffba27483a2e822","impliedFormat":99},{"version":"47db572e8e1c12a37c9ac6bd7e3c88b38e169e3d7fd58cb8fb4a978651e3b121","impliedFormat":99},{"version":"a83a8785713569da150cded8e22c8c14b98b8802eb56167db5734157e23ee804","impliedFormat":99},{"version":"cce1c8b93d1e5ed8dcbaca2c4d346abb34da5c14fa51a1c2e5f93a31c214d8e9","impliedFormat":99},{"version":"213a867daad9eba39f37f264e72e7f2faa0bda9095837de58ab276046d61d97c","impliedFormat":99},{"version":"e1c2ba2ca44e3977d3a79d529940706cef16c9fdd9fd9cad836022643edff84f","impliedFormat":99},{"version":"d63bfe03c3113d5e5b6fcef0bed9cd905e391d523a222caa6d537e767f4e0127","impliedFormat":99},{"version":"4f0a99cb58b887865ae5eed873a34f24032b9a8d390aa27c11982e82f0560b0f","impliedFormat":99},{"version":"3c8a75636dc5639ebd8b0d9b27e5f99cdbc4e52df7f8144bc30e530a90310bbe","impliedFormat":99},{"version":"831ec85d8b9ce9460069612cb8ac6c1407ce45ccaa610a8ae53fe6398f4c1ffd","impliedFormat":99},{"version":"84a15a4f985193d563288b201cb1297f3b2e69cf24042e3f47ad14894bd38e74","impliedFormat":99},{"version":"ea9357f6a359e393d26d83d46f709bc9932a59da732e2c59ea0a46c7db70a8d2","impliedFormat":99},{"version":"2b26c09c593fea6a92facd6475954d4fba0bcc62fe7862849f0cc6073d2c6916","impliedFormat":99},{"version":"b56425afeb034738f443847132bcdec0653b89091e5ea836707338175e5cf014","impliedFormat":99},{"version":"7b3019addc0fd289ab1d174d00854502642f26bec1ae4dadd10ca04db0803a30","impliedFormat":99},{"version":"77883003a85bcfe75dc97d4bd07bd68f8603853d5aad11614c1c57a1204aaf03","impliedFormat":99},{"version":"a69755456ad2d38956b1e54b824556195497fbbb438052c9da5cce5a763a9148","impliedFormat":99},{"version":"c4ea7a4734875037bb04c39e9d9a34701b37784b2e83549b340c01e1851e9fca","impliedFormat":99},{"version":"bba563452954b858d18cc5de0aa8a343b70d58ec0369788b2ffd4c97aa8a8bd1","impliedFormat":99},{"version":"48dd38c566f454246dd0a335309bce001ab25a46be2b44b1988f580d576ae3b5","impliedFormat":99},{"version":"0362f8eccf01deee1ada6f9d899cf83e935970431d6b204a0a450b8a425f8143","impliedFormat":99},{"version":"942c02023b0411836b6d404fc290583309df4c50c0c3a5771051be8ecd832e8d","impliedFormat":99},{"version":"181655e54e8b288d671457be112383e6c51502cff5c4e39020c89f281a987307","impliedFormat":99},{"version":"27d7f5784622ac15e5f56c5d0be9aeefe069ed4855e36cc399c12f31818c40d4","impliedFormat":99},{"version":"0e5e37c5ee7966a03954ddcfc7b11c3faed715ee714a7d7b3f6aaf64173c9ac7","impliedFormat":99},{"version":"adcfd9aaf644eca652b521a4ebac738636c38e28826845dcd2e0dac2130ef539","impliedFormat":99},{"version":"fecc64892b1779fb8ee2f78682f7b4a981a10ed19868108d772bd5807c7fec4f","impliedFormat":99},{"version":"a68eb05fb9bfda476d616b68c2c37776e71cba95406d193b91e71a3369f2bbe7","impliedFormat":99},{"version":"0adf5fa16fe3c677bb0923bde787b4e7e1eb23bcc7b83f89d48d65a6eb563699","impliedFormat":99},{"version":"bf4a06264e6b80cc96fa5e6f11b05825126845563efbf5a68a5b18fddee833b1","impliedFormat":99},{"version":"560a6b3a1e8401fe5e947676dabca8bb337fa115dfd292e96a86f3561274a56d","impliedFormat":99},{"version":"b2e451d7958fb4e559df8470e78cbabd17bcebdf694c3ac05440b00ae685aadb","impliedFormat":1},{"version":"435b214f224e0bd2daa15376b7663fd6f5cb0e2bb3a4042672d6396686f7967b","impliedFormat":99},{"version":"5ac787a4a245d99203a12f93f1004db507735a7f3f16f3bc41d21997ccf54256","impliedFormat":99},{"version":"767a9d1487a4a83e6dbe19a56310706b92a77dc0e6c400aa288f48891c8af8d3","impliedFormat":99},{"version":"198f2246a78930833c24db9c42da7ab40c084c2e2132a899f9c03dcbe59d207d","impliedFormat":99},{"version":"eb07eea29499b56357f7593fbdbc6d2312d8afc32c14396952db8d897ea0c4c2","impliedFormat":99},{"version":"06efe54b5ceaa113fbc649424419746efde6dcd5af2a7d4472efb62d751801b3","impliedFormat":99},{"version":"39613fd5250b0e6b48f03d2c994f0135c55d64060c6a0486ecfd6344d4a90a7f","impliedFormat":99},{"version":"8dfbc0d30d20c17f8a9a4487ca14ca8fab6b7d6e0432378ba50cc689d4c07a73","impliedFormat":99},{"version":"4b91040a9b0a06d098defafb39f7e6794789d39c6be0cfd95d73dd3635ca7961","impliedFormat":99},{"version":"66b67d15116c453abd384a1ec73ad2cb90b19fff4c08289360c4f3f573465838","impliedFormat":99},{"version":"5805f6ee9c3a5369ba7f37a809e226f0b217d2059d6f699cc242c9907671143f","impliedFormat":99},{"version":"2f0578c52f2b95a2a2187ad6d1d8fa4e835278871c81747c500bf04bbe0301a2","impliedFormat":99},{"version":"ee9811c1b947c37077408d66bf61ca0f7e6ffad850ecec1e246e643c51fbb5e3","impliedFormat":99},{"version":"4e919bdf4100bc0338598352ad2778d4750fb0d5facbd1bc7c5210340a1f756d","impliedFormat":99},{"version":"4b54813a405270d710da2c598f57cc0c512aad7b5f34f8d2e109862020568a58","impliedFormat":99},{"version":"ac29a9fe4dc4829c7f3f693c7667483f9903ead6ac67abf8d6a5744a5578a7a4","impliedFormat":99},{"version":"5429b7f938113b40fa315e0f100220a5801992497bc3eb05e3b395055033a93c","impliedFormat":99},{"version":"aac828f821e824489c3f10a5452e05b7abc084894dcf6cef1855fe44c88d8556","impliedFormat":99},{"version":"9dda93662ba9cc072a048ed9717df4869820cdc84ebd33db3db6e1ef354f521a","impliedFormat":99},{"version":"a769f4df15ce86d72fdc646ef33bf9ad634e2d7f544399ca030b61d61c781942","impliedFormat":99},{"version":"e1848b9ea5d00c149eae78db2141cb099cd5cd0573064c03f24fada82b2a0d94","impliedFormat":99},{"version":"535dc92c4a20901f7dad384f1fd2b19735bb33720fad67283f4c2b06c4735777","impliedFormat":99},{"version":"695dbe57a9f1686b727ff8112def7376b69da4a9f92a6b4660cfc7adfeb4fd57","impliedFormat":99},{"version":"e30accdbef6f904f20354b6f598d7f2f7ff29094fc5410c33f63b29b4832172a","impliedFormat":1},{"version":"5fd2267cea69c19286f0e90a9ba78c0e19c3782ab2580bfc2f5678c5326fb78a","impliedFormat":1},{"version":"2a628d887712c299dd78731d2e18e5d456ac03fb258b8e39f61b2478b02481ee","impliedFormat":1},{"version":"b1e5f3a55aa219247976db1b0c6af31d07673e8085197aef925f25ca08fe12c4","impliedFormat":1},{"version":"e9f80c5934982b97886eadab6684c073344a588d1758b12fba2d0184e6f450a2","impliedFormat":99},{"version":"c609560ed4b5a840f9515229fdf7522440cfacaf2b6f21e1c3e6b46bfc4431c6","impliedFormat":99},{"version":"43980aaf3d50729108658c84a9325fb3341186024247f2af90a9114206577d06","impliedFormat":99},{"version":"a59b6920d3cd9ac94aa10df1c8f2aa9c76c91d73e4af0e745821424e73bbffc8","impliedFormat":99},{"version":"26de2510ef97324e48304cad246786f786be6b9d067746ba672724fe99eb4a76","impliedFormat":99},{"version":"a822bb869dd9dfdb4b1b5c887b90373d5a1e900191772646b6211541a5ea13b8","impliedFormat":99},{"version":"ba56cf294acda8f40e97bdf8f102617b57c914664476e1f900db307ad0e8c3f2","impliedFormat":99},{"version":"92be2c8229c02b140324d56906af58882ffd87ead115a34380580e9dedea4a18","impliedFormat":99},{"version":"a507cef707a17f4f58b0f106ed3bf5fb044a9cab3f7c24eaeed10e1fdbab6151","impliedFormat":99},{"version":"a14cb49589c589d4e1257bf7bb457548785b619d37e245fe2a6c1b942156584b","impliedFormat":99},{"version":"272f5f51201ffbd79dbb3533503dd3e20d7f8d1040ad42f33068bf9d0b163e7d","impliedFormat":99},{"version":"85a6e5140a3bf1abbba9e6184d732d25648d20007116cbf39bd3baa9312441f2","impliedFormat":99},{"version":"bb9e472d55badebf8969025cc126eb857874252c58795ee5c6e74d686700ed21","impliedFormat":99},{"version":"7be935d17f4f54e3263e1526bae0128ebd6b15835e6c22116a44d8e0ada5a74b","impliedFormat":99},{"version":"b4aece44eaa3781d058e4f0790aa4a4e1d2012a1d62c73ad05e6a5737a7ee293","impliedFormat":99},{"version":"8519f682ce37f2d021cd6072049a7ac2db5fdef449afa3a2a226d346c25d5962","impliedFormat":99},{"version":"a43478ba83037f64bb87ea8471a7e8a407efa910a75540b384593bcce2d38c48","impliedFormat":99},{"version":"9bc917d7e01d56dfae1f76108a8cad4957f961cb51aa23c5d2e69ef3db286e20","impliedFormat":99},{"version":"b0fc879036b6a62cc7cbd27ea444f6fbe57fbef1b1d039b0d566df2117ffb499","impliedFormat":99},{"version":"69b3e0b9435c37d191bce1a4d38c8d18e8add8cb99835eab8f566b95ad9de828","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"3c1183883c83dbb1be210210e1c11a878f87d60f8afc1b3972cc6388c87e7971","impliedFormat":99},{"version":"0b4125a4b9bc524a75e880a6f31849624262d8c97cde4a5da1d34256c95f5bfe","impliedFormat":99},{"version":"0c95bbcf76de3e231a4288d81d9e897e10c73da899277da633b44a08eb8eefba","impliedFormat":99},{"version":"d0ca01ffa779f381a0ec9d9efe34ea3cc98b45e4056ab44b5268766d63aab647","impliedFormat":99},{"version":"b5738f6245eee46675619b44f6af0d70f7586be229fb360532a80c44b1b49ff9","impliedFormat":99},{"version":"517171e44831ae1b5c34ba7aa7c7f1dcb21902c31d3f7b2abb51e497a0b99e6f","impliedFormat":99},{"version":"e2e3cde2cec99e82ea98a82c5bd92ed12e4fea8cf402a6e035d5bd2a7cca281a","impliedFormat":99},{"version":"9382e32237e08424b2642d1d9ea4af3a76001cef48888273f769af0c95cf169b","impliedFormat":99},{"version":"45a95142d20916e8510b2d4c42b09aaa3d8ca3d0c3dbd7f915da870ad182380c","impliedFormat":99},{"version":"2131b5fbfbb47e80581e06e8bd11c7bfefcda71f088aa5f1d137d289c20a2222","impliedFormat":99},{"version":"c0c57f6c7ed346d12352f55865e539621bdcad36045d2b9e71be0e168b1192aa","impliedFormat":99},{"version":"11fd3ff2c4379a9f482f0d7c8591fd679d4f8dcab82046db3a1812f8713f2373","impliedFormat":99},{"version":"36f2ab77365fd65ee3261475892dba15c0fe452077a93a19a63aaf2acb62fc98","impliedFormat":99},{"version":"bb9cd6cc3af0b5e3ffa70cb1de85fe6946b3a3f1f10ebed7ed8c772f7ae50466","impliedFormat":99},{"version":"5b3a8b45bba54d7ef198eefa8c61eed06ec95d267108353c1517742be9eecb88","impliedFormat":99},{"version":"8081faa1962486c7e9e5fc2dff88fae24d868c5a585cdb2c38ba1c15fce4deae","impliedFormat":99},{"version":"9f57322db1a5da7c827f95f23fc860c2296730373a87436ad2ee23644c3c86a3","impliedFormat":99},{"version":"1ee555a004b7194196d6d51cf73227cfc1c0f0d043da9a649e5e867a25d1a2fc","impliedFormat":99},{"version":"1d6201fba84d7d56be10c34ef4f816988da4bfd1548902300f3e031a4f482833","impliedFormat":99},{"version":"51e530ae5cf54f398bee91699fa140199f96f2f55b8fa23901815b02c9721fde","impliedFormat":99},{"version":"18cc29fdaa42892eb79f03b9f00bd4619a35bb6dbc1805a7c5f94d9b0e96bf6a","impliedFormat":99},{"version":"b00e3cca08af70a9cad820cfc0c78e477d67b3f72d5f2d6ca967172e3a971f8b","impliedFormat":99},{"version":"9151c2db5ef596dc764093003dc730d6d3d1f75eaf5fa117f6caa2474e98a634","impliedFormat":99},{"version":"827f0158dcf51b4afd0bf7867d30ac9436535fb4422b891a16b88799f9caa6e8","impliedFormat":99},{"version":"a178ef7d260e3ae2d4bb5ef46000ac0ad00c79a454a80b1e03615ae4e410596a","impliedFormat":99},{"version":"6e477dd31a5483cbab13f1f907b29474b33a5140dd4e8672a7ebe00aa27984cf","impliedFormat":99},{"version":"b5873d1c47eff986c60cb5d61878fc2734a8c3e8cc64b7e183fbcdae3676aec8","impliedFormat":99},{"version":"3d1354d536d8ea970fca6ea675d5932b2d5720ac458fa85afcdd80f3b708c763","impliedFormat":99},{"version":"a06839234f46aa66759cd492ce3f716a9f32fc30d9310e1b7618c1f5cc075a62","impliedFormat":99},{"version":"92929866d4c2be4b9510afc8ce088817d8a2f5b58398cc032aa3e587fb700a42","impliedFormat":99},{"version":"6483a445bd97d8cc1545cebe5b4b84e7611c5f2ac65adf4fba8188e1758cb1b1","impliedFormat":99},{"version":"513d0b8895a905e579ed2baebdc817a23dae16e78ecd925400e3142a8096f33e","impliedFormat":99},{"version":"d8ef707d006fdf8e64a9ea3673c4748374cac72d794b632dd6868e7973de3b55","impliedFormat":99},"780807f8c8cdf68e8d646043b476ab5e2b4fa0f0f87dffe2007db40a770f6d50","1559f7dcafbe461f88574162b5c133c7443a2543088e50842348ccc11049dfaf","7688bba0d1cce772a26874fb87ad985fa2a488ab711b789563919194aa33b4da","2778747ec5f0fa749a66df42831ea70270ab3a17a94f1313e01905b794f92a47","4a8f3f92baec87162d727caa562595aa6a14d9c126f62283bd5b17fe594d6a2d","d3bb8603a9ce30438913b8acb12952915acb82bf8bcc2af304f4a858f36887ad","c7db7712217e9d79ce5f0993f6664ff5f61bf2b5990c93c8d1a09de51fbcc361",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"7d2c1ce36b9370a3af266ca6c663fe62e82671f9cf41337bda0efd837a5e2de9","impliedFormat":1},{"version":"6e45f5dd809aca05301c8e1b9f526096fe89b3369da10fe34f9c037832f103a9","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"cba87731af3b8e51151ab6b3ba2d9604739649cf132885dff49836d5369ae387","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"108fd0cab464e528dfa511d982368df2c9d9964e1e66f8921ef40accce9dfcf7","impliedFormat":1},{"version":"8d48c98fca3f013fd2872810d7168a9c405c4037962637aaa0a094571e731757","impliedFormat":1},{"version":"9898a7c6ed78c9656079244ea2318282f42ffd1cb5d4aa5753decaa7f3eaafa2","impliedFormat":1},{"version":"6c91dc4348c8e9fd3623bb47b5435d0a7f34467ef4130c72394d15eb076d5e79","signature":"8e4ef7f11e844396ec1dab547d5236a02a5e49fbb1ec65016537ff5676df17be"},"de5c24590448a0399aa7cf3057217387b277f4664c602028531ed60758394287","95ccade4cb1378910811207172141620038bee6a72e0aac8703203a4fa9ee2b1","28b3666039f660adb329975264b4e2ceeffa0dd061155e72da33d773f0e57c30","4f5239569ea92e174986b8cc746afb6d3bd469d9f87d28119997c7ed207c36ed",{"version":"b4f89206c8e318e5e65294ae7925a52a5bc13508809c5c699d7ebfa14e0509eb","affectsGlobalScope":true,"impliedFormat":1},{"version":"d51500cee65d776a8591b72c1019b0dada25d6f7ea39685130ccedad2e8b1eff","impliedFormat":1},{"version":"e733b8a7d2ecce20916d95d75a0c7cdfff7e8371879006902d77969da1550d65","impliedFormat":1},{"version":"d9d5884c0b7a87c6b0b319474eac7987f915f7460a04012d54689c14c800d69c","impliedFormat":1},{"version":"42739f43f21108aaa8b2e9d1246c537c88fc193694d5c3660b49ab5ed87bec60","impliedFormat":1},{"version":"8c4c212cbe640024a5076e006d5ed48c6856bf3a79880c52d0fe453495b84e7d","impliedFormat":1},{"version":"8dbd432facc1bfd211d58bbbf86a405dd55cdf04d6425037171282ae5e1bd5ae","impliedFormat":1},{"version":"bd0ae662720de3f141b078c64de498113fb13faec0c1cbec62f1630f7b8954a3","impliedFormat":1},{"version":"517fee0f998ca443a8eedaed7ad143753cd7ed6c9fc97a62200c09b21ea661d7","impliedFormat":1},{"version":"e94e5a0936bba407a0d0b7846ff8a7960667f09040b575b5035bc30298510781","impliedFormat":1},{"version":"f6a3229a9d452117bfc85b50e955b836c8c91b1244dd8d3413c2824333022982","impliedFormat":1},{"version":"f7a32e6a301921e58c28b8cb944134cd447d4db8b5b85d0e614abc90a333080c","impliedFormat":1},{"version":"28732171a9e5a176e9d8b9bb417b32dc885591bc2642232389a44167bc5ec581","impliedFormat":1},{"version":"90ebe8ddee75b7e87baf030d45d49e13a91dea47fa4cd8494ac85e5ea35779c8","impliedFormat":1},{"version":"6ec1d690b2213c008b55d31778e6c4f13141487fe26749ee6a0b4c2b6f84f9c9","impliedFormat":1},{"version":"43ae0b1b0a836f113aa973b1a4d114e2867fd320125e43a80805d9a80ab07c4b","impliedFormat":1},{"version":"1b6d1aeb6a58db9a9702623d7edaa31eda44cb33fe66f349f6156b20db8b6211","impliedFormat":1},{"version":"5ee542acb0e360c539bcf027de4389536fdaae8653e47b33eb0445ba85bf223a","impliedFormat":1},{"version":"8a0a53613cfa756a769e4514632acac0e17d80631af21a888daa46ac01ccdd1d","impliedFormat":1},{"version":"e7f9e4cf51627c95fdddff062c58c6b1c4e22d1868acbf3e7e663ee95e3790b8","impliedFormat":1},{"version":"449d082b398ad2a53c5def35397b752d61c968a2acacffb935d564b5ff3aa19c","impliedFormat":1},{"version":"1a3aa0fb5f9a2dc05a33faa6246f85ecc52c8af7a5257d8639e724a12ebc92bf","impliedFormat":1},{"version":"6480e9b0877e389c96e3b89c43fb2e4d84bb6ae8cea22f8ea2bf30ac4a4c4136","impliedFormat":1},{"version":"9cd1a75410c01f48f43befd40b47a7d2d42565b5593d5cf02b7472b04a1d98c8","impliedFormat":1},{"version":"d0144e7240c7f26030468a13211194d192316099ebbcee7782c6005cc393c734","impliedFormat":1},{"version":"095a402135de9fbfda29ba7c984bf54b9e65757396b4165706d898e9baa83ed5","impliedFormat":99},{"version":"0b6471168629b8a0cbac9f8f67bbbba83a1d64cf1424cd7d299439b3af88129a","impliedFormat":99},{"version":"3e0fa3b04086663fd406499ea37f0714b0d7cbc296eb81e244f2bf0ba4938bb2","impliedFormat":99},{"version":"3d11abe325e68a5b76d9f53ecc0b4ea29685ccbd8690b279f2177e0750d87f8c","impliedFormat":99},{"version":"f1952d24cb1344241341230924197977764249edcde80605e96454f073ebb35a","impliedFormat":99},{"version":"3b5b37b56d81802168c5b8df2f1d4a7ee018d67e7463f221d49b6ea20af00060","impliedFormat":99},{"version":"f3a6db8faeb959400a4d0e1100b9d5c54eb494800e6dc9a2452bb2e00a27397c","impliedFormat":99},{"version":"d278699a1c7e06a195ecc065c4965d1bbfb5bc2d67176e63bebf58b273158023","impliedFormat":99},{"version":"261ffd2f7502d9387324715c7dcb9f3a30c8d044b6dc3abc7ff80737c366476c","impliedFormat":99},{"version":"28729ff7b2ea98a9ba6ca4490c5540be744a4d73b4199ff6094cb65c9db33607","impliedFormat":99},{"version":"6ac889647435812fb7ced7035daf90c1f307710056e4b496a3fd5cb97c87daed","impliedFormat":99},{"version":"29f60d17027d6bc8891797f6ed95ac84ee42313e6b03ddb49beff6f22f49f8c6","impliedFormat":99},{"version":"f71579228be8825267577e970c8f0ee2869cebae0bb7603b00644fec924c6717","impliedFormat":99},{"version":"e50f096cb424b63343ad5814622623f15cf3830f41710376bebb3c7f71554713","impliedFormat":99},{"version":"69ebae4354b59ff1ba38419d6033e22d0db6ffe6c1d562e78914f88f06ec517f","impliedFormat":99},{"version":"45f0aee62dc187cbde99b10987e1f8649a30bba8bf9c95957e37d1551d0626da","impliedFormat":99},{"version":"919b048385b82efca27e5adec2f61f17a2b219582f2deb8a13b4648c7c8fafbf","impliedFormat":99},{"version":"47747eabb3c64620a12f707bf30c7f7a211e25754a2da1f98267068f49bd0947","impliedFormat":99},{"version":"2dc1bcd6a132924a89f965b60edd5b5333aaa7eb28ba5af44a0a0a328756e9ad","impliedFormat":1},{"version":"ad117b97b2eb65daeeabf0adb13573a8f1d12d5ce21c312eb7eb588106b92560","impliedFormat":1},{"version":"683f7d52795b5e2c0a269c4a202f212d147eee850b6d74050af619cea7638605","impliedFormat":1},{"version":"bf338c88f9e91b1700029f806a2d8bb447f19d3e39fa57dbba16ce8bf43902c2","impliedFormat":1},{"version":"d3c9c7df6fe4c7905f73578af2542e2f303da2b0565abb10ccf8a75626da1bb5","impliedFormat":1},{"version":"a16c041923053317f99708de244e50f0c563de0ee22313739810b67cec8af89a","impliedFormat":1},{"version":"b64880a77efc0fba08ee595d277a52e7abbdef2dde51a163376f03d6d3a67c7a","impliedFormat":1},{"version":"817d7ba9b41a1f3f7d15e8c1067bc32ce0044aab0ba05e2794294ed25959cdf7","impliedFormat":1},{"version":"6e6d52eece8b335d10a436ca59f91cbf0727f9f2ac0521a0b0ffc32da2006948","impliedFormat":1},{"version":"98e70d3105aa56ac3e2a34a78f10c6d352ff9e3148b1bc2bb11c1787f0176d26","impliedFormat":1},{"version":"144ffc9e0632f167247b8ebc6c12b690555b27930cb2d92edceea7df51e54bbe","impliedFormat":1},{"version":"cb6b2bd587f4d8b0299840be7cedf422fb895d3c7f6cbd8c18c041518ba82fee","impliedFormat":1},{"version":"849b51d422f1a846684da755840ffe68f65701b7b7703ea9622847df65dfb2cb","impliedFormat":1},{"version":"3b17eebfd6fea2320c3d3ab55e26bee41e6745fe51432da7901e898249a8c186","impliedFormat":1},{"version":"5d9c054ecd5fad83e0ec5e117196acdcd4b1cc5b8d28f5df752a416c27052aa2","impliedFormat":1},{"version":"949c8eb79434b05b6d1c10d2010216fbd6c920ee376d08627f717d24b6572454","impliedFormat":1},{"version":"25495d26470692e2591e386c1dbffe4aa0b2d8c00af6ac9c8c69657818262dd5","impliedFormat":1},{"version":"abee0197420ed0849c7adbff50fc13f54ccb52f9a8c906e298c28321bf736cd9","impliedFormat":1},{"version":"3af7286265437a7488193d0ab0b56a6e20e1a5e08831a6c3fe0880212c2c6c75","impliedFormat":1},{"version":"d7eadcb936edf325912a70d1c4874c29b92463ba1eecdb302858763db6a68692","impliedFormat":1},{"version":"04fe6e4f5bd35c234cd04ea88ada66b718aec4b3edf611147b0ec9ea216b3cd7","impliedFormat":1},{"version":"7aa826d09dcfa85af6b2cfeeb6a7f340d417968632695fa8eacf4186fb71e8ac","impliedFormat":1},{"version":"ebbf2bf006f21fc203f1a555ff0fdcd8542d1546d7cab60aa835ff5902db0d2d","impliedFormat":1},{"version":"12aaf4e3c85225c710acd6a9f41532bf8e06bf180e54c1bedc60fa9b9c1a7d23","impliedFormat":1},{"version":"7814f653054116409bc9a36968b77c878c2013ef8d8873328e8f6fcd3348d8d9","impliedFormat":1},{"version":"ff4ade9606d1b3fe1a10bdf6ab944e1bb1d5ac86035228ddd3ecb5fbe51d4d47","impliedFormat":99},{"version":"608ffc65e122c3eeeff832a9007ecc00fe71bf1b03a3069a44e8c565ee8af368","impliedFormat":99},{"version":"40b54b241bc79a986a5ac364f7f11c60af8c68ac8d45c80501ed31af7e587a74","impliedFormat":1},{"version":"0d1a503605c35a53f49ff2b6506704b289bc33d9001d2244044c91fc82315c8a","impliedFormat":1},{"version":"96d1d70759af66ea4404f7c18130ef478e5052de8863e2bf4467cfbc2fc7176a","impliedFormat":1},{"version":"d0476ddaacf1b8b9b18aa7cdb54eb8bc7edb69165a455803e2065fc28a321960","impliedFormat":1},{"version":"9332e2b6255fd361167671093522351ad5e2d0e3a78d9bf8f0959d779f6d3246","impliedFormat":1},{"version":"5be2e2b5ca39c4fc74b0273674a3e7705088513872fa3de1e4f75357a507a988","impliedFormat":1},{"version":"fc8bef71b44a15c1c6afe97e2ce74c7beb10d0a3c45d19dca5b9d53cf81cc744","impliedFormat":1},{"version":"41dd7695c5e11ca31e40bb8d9a2edc9c2b3e262d1007fc7471ecb91516874d98","impliedFormat":1},{"version":"262efb4650083ac514f3119534d502211d0270140057698e7d4978caaf4b6f97","impliedFormat":1},{"version":"b5e98f1f4e64ace252ae743df592ff0187aac817efaf58cd97c63e243fe15951","impliedFormat":1},{"version":"151f53de4563905919248ae634d857276a8491e62416b6f2cccbfebfe6794a72","impliedFormat":1},"83e392127f71627fce9a8e0ce30fd22c043db537c93d8731101b138c38fbea04","59d65621a16b1bff32e7a8b07fc677b0cceab8d73c5ebbc0f23a405d5fe63686","752f6b591f1efbb939af28c2e5c33ed607dd554df8711c0a469fb9dc0b59c5f5","a6e0b5559a7189298206415308a4a1f1bd13b5f5ed91da861cee12cab2f641f4","1b4dda36948afd6a509a29f86633a7a538a79211aae9e3e09fe24d3d6dc65a97","1036b4ff3d86ef2764256afd871b34a8546244586f00a93646aed983167dcd22","181dab36aef859f6e4aa54e1b0e755866866228cbbe5455522779dcc99648dc4","b2e1f4d7e311fcbd8998f5a631ea9c77601967f8976c4ca626a1b05ebf3efaa7","31bcdb1016481b1fff0668d003946e34ce93fd86e80777c56026d7d1987305c0","ca28e21dec32859f280a5efcc5392c626582d4017c0b36a8265c9ff581b3617c","246d7397668a7ddf2858967263ed8aeaee0e7ba4f0ec063d639aeffbab6ed81a","d1726a0ddc24aea9e851a8ce56684a29f58aaa37a41d7f3840cbdba69043db99","3eb40afdc378b50a96a2ae67116adbd1c163600481f7d182d46e5a3bf3a8cc25","3c3c17f0acbd71abbd94c109027b0c0274a6bc9aee0fabe5b9d48463ea69d87b","296273d01ad5a060d70f600fa110abc2545b9bc707fcdbeeecc85c4e9cda7509","1ff3822feead679faad5ae04acc6b7a08df0c44e3077e45566b2c4df19df28c3","3a02674c3a48813e03c2fd5ae7fd6307fb6c5bd772065a5cf7ce56633d284a35","e3ee5daefb9a226bf3097abcf3b628db556ccebd9641a7ee0609547d98c851db","203ac3e8a0db9e5eb975c9cbbe5905c7fcc0b1907c4c1e13ae1eb2899ab00055","48d88d2c46c6da424c84808ff7b0df53b716cfee2b8cdead2f491602cfa76796","f2391323b20c3ff6cdc785f9d7e6ec7d515843857f4f2edf4470f4899b91cc5e","f973ea7a19526aa0096d2799105e6d65030be2dc9baf5497c67a1e8355530f50","e4890347e9bcae005176bdde5d04078511f7f0102f856b1ae9d6467622895fca","b59e268333810a6ed4d17e2b490ece89d2db6cef01236b84526bb8248be2aac9","a2fd6350ef2a8ab815957ccdeaa328e0ca6bffbd2b82c6c1fa1b319b0b883a2c",{"version":"5276ee82ef96770571bd5aae9f4f5cdd474c3d4c1a068f1e1d9ab9cf16529975","impliedFormat":1},{"version":"cdb1d174036ebdb04b5a61461ff523efaeefffd87b093f43fdf20196024b2003","impliedFormat":1},{"version":"23c2c70dd974c3b8b66be4f3d6c9351fd41235d9c038b4d57d334dda8f753819","impliedFormat":1},{"version":"dffa09d0911ebb2639cae47397e011cc195de4a3ad83b53efb2651cfa0e0b75e","impliedFormat":1},{"version":"26168183003371ceac063f0cdf62be889d0515a193444a99b176094565dabb0a","impliedFormat":1},{"version":"7fc99221160c51281d2b9095552be2b24b600b3b6fe305cfd068bf501f623ef2","impliedFormat":1},{"version":"0db63cf288cd71a85b06be8065db706797fb7d368a2315bd34967070c880facc","impliedFormat":1},{"version":"755ee0128a813468af08c5e673655a068813c92f4179978fd37ac3df1688c2f8","impliedFormat":1},{"version":"f183da4c889c90d5060aacc1c247c6cd68cc0024b9891402bb1c07a492d18018","impliedFormat":1},{"version":"da1c8718353e2981fa5981328a2d5cf6bc70da59c51967924d032a06177bce50","impliedFormat":1},{"version":"747f48fa4633d85211b7e6afefcbba37b7adf816b171a569105db23ce6009286","impliedFormat":1},{"version":"3965bb091883ba173f7742c16ec8efe81207d75774d3a809385edce6841adca0","impliedFormat":1},{"version":"c1eb69b3ec8f1080980c25c8244c4ba093af729f4dac451758e69026b20c50a7","impliedFormat":1},{"version":"f67870591872110fd6a97ec0d933972f21ccf433bfb9d8ed1f044740958c4e43","impliedFormat":1},"a849f7a91ecba56e6ecacc20a383a825aa6cf5b2842e75a3fa9348f06d71295e","858794e17e92e99c7257ce08c98ad806be9123f7c1fea852f2f899a0508aece7",{"version":"a28e6fadb0b6e7a95cfcd29366f2b72a8e3193270d3f2b673e1876edf0159c7b","impliedFormat":99},"5494ffbcdd6e45046d78e3001b4da0b472dcaf9e6681d1bf84e99c0b206a9861","837c40e7e259b78104bdda5a8fd589b19a753fb7f77c8c316baad18bce444fba",{"version":"9891b4e49d435c7ac14fb3cc769e97077bbd946100c952df08eda117c3b5b68d","impliedFormat":99},{"version":"9be0dc6f4c5ebff5d838dc0d059f25e5a6ab1d224d5adc7ef46887ce8549e897","impliedFormat":99},{"version":"32aa20fd978847e617304582657723f0dcd1809de9b087ed0ad5b7090b1a47c1","impliedFormat":99},{"version":"1f37db92ea78f4d197a201f80a3c52ce6e2b759b19d3a1e9de5aab0c9026fe3f","impliedFormat":99},{"version":"c07898a85c15b3b636506443e88fe6d85bbd568c0bb504a9ae5cb371d58f6319","impliedFormat":99},{"version":"2d45f7ff55036e74513af142af1f414924ad337cc00e612bb37bb55473c70b30","impliedFormat":99},{"version":"3a6b10911970b0588c5a287642e4c6be91c16b96407a499c6dc81a96daf1085a","impliedFormat":99},{"version":"795d467a57e3a7c4aa3d645fa2edae9a2d0d44dde435bd1b222ab533da6fce44","impliedFormat":99},{"version":"bfc5aa7977557874fcbe1e96f7a06e46b3b568b955c82b74a85cc8f6c62060a5","impliedFormat":99},{"version":"f20bb3ae0de20cd6a4b73155cb506bae39e904b7e5ea4f618f5bda7b3ae474fc","impliedFormat":99},{"version":"44c5d9f47e85552ea141ddc1b0af65903297624f0ff2227372d5ce31ff0380c6","impliedFormat":99},"8790b28796d1f491f3268564d782ebe2879829ead0c10d9aab60c2e9d3588d6f",{"version":"c0a4aac782cdc312e796608b467bd8fe8c8202b0fdbce29eb83d1f439f2a09cc","impliedFormat":1},{"version":"c7a397d655099caf70ef4b64ba4fb3c672d810d7c1e46fda7f1ae500131ec248","impliedFormat":1},{"version":"cbe4de475b5492a3fc5443dc2c75c08d054f83d459c06d4e1a82722223fd0fcd","impliedFormat":1},"45ea1eb14968f6bc1c7a77cffc1a5f762a7069668732cd2bd5cf143d96a10d88",{"version":"a896cee6bbf43009c05e9ee4b0cfb1147ae49a4ffc2d814c6d7465806d76fe72","impliedFormat":99},{"version":"6bd987ccf12886137d96b81e48f65a7a6fa940085753c4e212c91f51555f13e5","impliedFormat":1},"a9b4d5ebf62da6decff3d9ba91a354f1f84e4b672160bfe672219d719a6c9735","e6be08931c776916434a0240aea01e097d7c8ab0278ca22c535f9564d99755c7","3bf7074d9fe7a42890f98df09734c059560bee1acd58eeeb45ef749c6590ea72","2f9ac707504adc40be90c966bf6941ca32749c9cff11269ceb74ebce549998fc","760b600c4664aa4cbff56d74e9b168e77d62eb11637f9df97ed4898e6fd0bc7d","2ecea95b433caa7cb7693c720f23e62f076b13c5e46ba8c6bc5ac4a597c2c09b","4b248dbaf94ed07ca827344205498cd6a199486ca4ed481c6823ce4a2a58f101","204f71fd5637e5eaf2acabf1ba5a674077eb97e5920f67ddb43bab804b3bfdb5","1c190c54c58a41ed84b31f88cf7737ffddb2449fa474b154dcf5fb5684667c0c","113d200d8709d86af1e1c17057bc2a59faa494d31fe3aba5d3e472a11196cd66","e5179def8be76cf5e1e4045132bb5bc23bd5bbca339ce159fdcb6a6eced7acf9","cfc919572f1ed08c7f16b22096d3dead757f805e00e1eab0f8d2f2e6a454aa76","93fa6d6206af8ef1708c47eacc1e3315561f7df227c30dcdf22613de15d8dcb8","fdb2f04ac4847fba15176be0465a64b67ae3d16140a62d472516f0024fe576b4","5e074078d297d407f935b084436a66161fe67af6150e64356457a64830a48926","fb78e606dc1da5d66f1d47782c50f29f5f1fb73938572cdc5df442ee3528fb1c","de98eeddf3ed100c9fc5146dbb11932f0234b74b1c8dae05f64dcb766bd2b1b8","648e905763c70a88cdeb815bd4a162250027c2bbd4c17e5f831f0f12c273798e","0f3e97babf73961349e942e4c41f7419163afe93e043ab7cd304cbd492e0f39a","ef5f13cf96aeddd3100b42f791205e602f551c2106eadbab7a72fc8fec1ee543","d1ce233383060afc1db856828610052df70105dff680d55eea0c9a7f82d39bc5","36953fe9fee3721c62cfafe0b87327d606205da9d2f2a3e41abdc9c3ddba7d54","df884a193d2e819aa76f4e57a6c0ef72612663d1e9b37a1de0027c8c11fbf216","3d4cef432d7e96fa18c66c90a6161fc79e3982ac09c6dccb5a1c237b81320591","f34d529d782257ccc87df267226d63b6ebfc985cd5af510a9d4ee3ae8bd14cca","05086b2bdd1ee47459168c8f63a2daa5742ce31567dad416da219f936b4bdfeb","8f72bdd08e7a4c15c7cb3baa6ad7972bb0daef797dc3dda0f2d2122a93a5c786","908a50708098d91ea15a6ad201583246a6ae804572fab4d6096a8ce2bd84801d","f6b4a321f86474cb40c946d6de4cd8c861e983fc266d6a9edad68ffc526da908","35823beef0e23c5e19c2398d9f602d8fe2a3156e4163e62acfdf7d2d0950e48f","e2a2b24f612af140c8d6b59baa23af4df49a95d319d046086bb1e24d1deffa32","b2634ebe505bd7463a3e751f6a27e37074bddaf44fef83514faccb664ac76a13","3463099173871b687dd02764d17d631e92cc63e7cbddd3e8eaa21fd927988901","2c93f90a183e5127f21611e92334bbb85182ce24048054e1d7b148d42e157241","c82b628a7676ad99c15ae7b32bb6e70f8effc59ff56ea5044b7d573c280cf5ce","664fd6bf7cbf4e641f172c6877b41dbc500e606ae01f3917300264ed5f0f55ce","837678e6e5a58f269855ec23e6a2dc16ad61daa89be3793696a550e4ff62739a","a0ead136f7e2ff0de9c31f2bee24dc00988f7789f32a5a648bd365656a9da740","c4bf9ae7d77fbc75fbd333d92e8b5927b33063b64d8a526ee3fae74cd1cc6482","cda56df36d3c1eed4aa985131088cc86268e77fa310c8c939171c2c841e4fbec","cf993bb90feda2f1608bcef93eebd0e834b20a846e85be66fbe61a5646f473b2","433a718101638b14bd7d628d853940bf49c9e73fd649f6bed45d38b08c1a33d8","a5548aa326ca898c07eaf189bd38955265983bfd334838e741f53d473c61a510","7b433aaf72fe38be0c239f9090c8e211352b376ce169567fd935ff31395f9f49","bf9daf2670c8b49fe9e7435d48b1a74215cdfb8a01e2c0d6bbe46d83abf9f31c","69b15103a5bd95b62c4f7c4dc23e1b516766a206f38c8a132bbb70e07c79439b","ec685be78af113fc87ec6998f7ea72d31b6250440bc1763c6279f8b33ff40ae6","16401c0faac33cfc2b628a1cbcc1664559e1c4bb3a085a8538142bb28f8f0e7e","e8da0541d9cc6e6dbf7b8be36c653a109c40310de8d3054e56f55a1609bb119f","f8c32fd18a406cd29fa0ccf06d887ed0c19d5162ef2a3d3129c1dab3ef553ced","abab797abf6b9380a2083d4b164baa04570735d7faf51b5164064cd6e93694f3","d72b48d15417b240c392315dcf497a2beca0c1fdc09d155a3727659a6916fadb","e29318092a9d32cd2b0164102cb746052331b6d7f855f457ca11c0385339b11e","25ebca34c1077f3a29919061e3ac807c17c0fdddc9050b1b8d2bde585c827866","519ffd06ea1dac7802692b811edec2a93b18700f7c940ce65de3bb2235702a1d","2ee58ec4f3f11c32edd3499867198be5f4ad7022f8480369067687547f7ef75b","e8da0541d9cc6e6dbf7b8be36c653a109c40310de8d3054e56f55a1609bb119f","af123751fef26c39cb168362d699b48c419c8c8ad7ec5503c90f6bbce554b467","ed36faa2344c5c40ad5794972657f29d487b68fe0662145a5093a3cd018e15b3","ac9b3c53465714855f732448dc69f0dc56fb108dbe8c2e3e92c723e2a78db039","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","d7804b8341e5a42c044455c766b13098e3e3e03ae11b2ad9b3f3806bcbab3b29","3b6704a38e51fc05dbe9ea78361e0d31bffbe4a602edf08563593b75556f8040","0a714f89f0a6189d342941717d0ff3a0fb57dcab179216fd59f5017c00cbe46e","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","373a74a89570f59c6a418b5e7f31ba11ad1ff0546e36c1bce4cc14bd0c45ee3f","eba3e941058c78550eb515df949f97ea94df504d0f5665783994605e4bc59c96","1d1ff9197037131b99ffc2c4c5dbbaf1868985b02c5f97196723663c9042ecd1","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","74dd0f04dc885d4d6e8d93023de5585ff3f3514eb45cc8d7208e8d35864c4102","7843ad58cd87b4f05b763ee2529d5033b4976ce382035ad56940e5421333a881","bf3d8eb0bc84896bd718e16ffd3242ab613b5038ccc6911138a9f176d009f3ba","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","5cbc2158ab882ffc7cee918a4615273b034bddff06981b2ea0159985a2bfc0e8","e32875bed8e71e5d0f768f568cef2b369ec6fa377e8d6c2bd7c16d159c446e3e","d48b15b88a44803dff86441a47c28527ec6776ff5f9f5174925416ebd48d7243","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","fb2d94450ecefa5d5aafdddbaead3be7851f60ee640ca767fd157420de107031","2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","72f66686356db0a28a50ef2cdc8f3090fd19b8af99a38e694a784890bbf2fc46","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","c974216dd887bd740070ab6149cdf1d229681128db0e3b3e63c5831b6e5a297b","e420e515c767af879783c06b721ed56b8def324c94986c3c68dd298a242c0109","04bc9e2aa8ba0e24cd1ac0412e04f7eda620e79c2568c7d7a563a1d6469cf3d6","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","9cbbeadba97307031520e54afe9d97adb96f07978b5b9355af803b4f0fd9fa14","a5296dc92dd530b36527e0b9e0d8d64098387d58fbfd9b75bc615173710bfb22","50af9f05c8c14400e2e654db0de71b8a3dcbe9a056f7f59b98f355a9c77a7c56","6a63d80e2bcbeb94b2bfc8e8785798c52241197c48907df714a5bbbfc546ab7d","2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","f3568b78c51c0eaa6208e18a24d5f932db096214a4a047e16e2952fa6aac3e20","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","f023f56bf192bb8d3a10e656cdd365d0ac9d36024dc91dee1dc8886a5927420c","abdfa3e09d37d63db9d2f4a01578c283cf3ef67af44b69f0f171b2fffb70654b","61a9872e2f7a0aa6b4a21f036bd1202257c4a3ac248c8cbdab3d7ab5e8c24530","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","fbb5158d60ac1917beb99b62f514d9781276677987ed0112d7240b64bc88468b","2a7560b1cb6d4f91f826c91296116707afe3844e700a6913e754ab1a1666eab2","11e43cb7483636b4b594e4c695ff2eeea74c83518e8bc4acc8874a0395c97c48","690a5a024c85d7af9c4bc5167cba52f0ec38cebfa6b0f02a4231fe19713c353a","6ba4e40c79a235f49c43533e0c3ecc39b5f3e5c94d3e6a340aef1c1948c8cca4","e7fae19caafb8b41e2ce6705a725f30baddaa2523137595a50f4098a00250353","6c1971b1ef9a8b843015e680052166e122c0fbe49a3cf8ffb357dbac6ef0f6ce","6d0015106f628b262842e5206987321769071c2cadf3cb99bd142db2e75aabb5","409bd5c7699db706e9b176afcda3f03a7ec0fc85257544d7184ed887e15fbacb","36418dd9b4281991aa6b096f123a77bb4bb9b8d6564427813980b561fc056140","52abfe012e6f3751811a6a95c31656f073d7cba4c614b693d6dd661f743dd538","9cecd2093208086c1486c2765418e4aa090620a0d6ff193c5a537c81387eebf6","bb409549eff0557c51f60fd5ba3409560ec39f06800cd9e2a29de22a02d89712","3b802579ce8e09cb8fe1e9b9be6b73df3c37b7a951666caf650203cb0e9bb209","8daa5329562a959761c1c35e995dda6367b904bc631939db199f5b9fc2419137","0e3995e174ad08a98e91c411249d15e2b6aed4cf3b1438b39dd84f3bacde83c3","3ac37ece13e9bab69da5166baa4272affdc771469c7d28271e6c47e07f48ab4c","91106a5b9be3398e71729f182a13432bf7ce9e0554527015e4e818dda2c3e9bb","32695b2ac8527912097a5205f2564dde19cd7343de9a3f78b43a489add053d96","f180cdcbfd6c52fab93742caadb7b16d871fe925d8bd49f1e23fcaaa26c85387","32aaeb25b9b7e9c067c1ab26e99dd48f8cad3945b3f5eff231cbe6860c6b7a50","f8592a4dc96fd879fa0dccbb7498b66d489e06c767aad8f25ec7f7b16698be19","b060c231e45cf2b6d8f689b31e8b09823d2b0976b9105124b9ef4da433f56528","ba94d3c66259d075b5e2bba753ac18545f8c37afa836c3dcde2a75f5d61c6a91","d85532cafe5203f0c43984aa52bc1689b250e6a03c7ea93b2d1cd86d6ca7e2b2","777e70b20f712c12efa1725c0a96eda237733bf2fc020dfd98f31dee2b670c5b","8175b911625c67a01cf345e7dc0a03517191a85c5dbdc9ef6306241551dbffcd","450cbfba9e6e5eb96accb26c6c75a31d0f018a6eda0dd9a407778123ba045eaf","2a6c5a33ac04e9578bab2495d168f2482c78037a144a1d18c09ab55aad797b4e","f33bb080cac8ff5d2f4a5cf60ef91706f236254ae0b868008bea767c74f5a7b4","76908abefb913859b0d5aa6a55e0ea01270a21ad02399bec95e9df092902b124","d20cbef7830eb4e327bf0e3693940ed8fc53bdf3e7166a90ff60b7fcd2acdee0","9f310cf1cfb1c765fda6e6e5768aa6c7fca1243b994a5ca997759181590981ec","54fb69757912848ef5be2332c7e6a520d2cb8eeddf07ca128a0497f5c43b9363","bd25366208b91d6bafe0041c1d58443c247a68710d8a614f47f565b7798f45dc",{"version":"541d70899d3b0b5d83c239712934e05b497c9b4c1076155a2890bb85a8aee0ea","signature":"746ca263b34f4de9818ba0d40d9c45f73475bc168d0360e99b5b33323dad149b"},"61b9c114b3e0787363a01a0213e46d8d0c779136e9f0aeedf4046074c6fbbf87","b2c76981efbe8b4fb6b88e7e0d451a9ac3498cea786689d4a0cfcc1aceb0ba1d","9cad936e014102ec314530df983168a713d6661eade3cc9b2e8aacfd0d18d6ee","2d95a52272da8ca2ec37da0ad7ddd089227e97dca9e9e0464b2d2be43fa572d9","67f4ad1ade1c7c1a1b177a84332b36b3d604e9a39d8a7fd8e3b7706bc278ea06","315897e1062e00b74e70c51864b685a36389d96bdafe19d297b6208dddefc740","aad5cd8b3800ef80a0bd9fbf309bf0fef607aab8555352ac11150e5a9a8ba4aa","bd6a585ecb6eb73fc29256c6ef8b100e4bb47e28aeb38473f820a7b63e4da52b","0bfed83ae9c9c74bbb020467548eaf51afe75cb72eba1cc83ba45049b34e2607","9b2884a3729baeeb3708ff8a6edc53378713cbac697fa061035618cdc8845a95","da1ebb8a528155c78e9b278daaab1bb609fff3e8c6477add4bdb698b015358f6","2207ee1ef5d66c035d9245dbd0e1f09da53e13151252e1ad4892beb4301726ee","28469d0d6d7825f55da5a0daa6fff57b5b5be551ffd119352992632a13f69ab9","a952c96a93b87fd33fb519f48d4ff50d30edbdff005e6c488453d837f528714a","d455a31c1e8b57a791b325d376a985b79aabf9bd954f8b974909e087408cd3db","4ba2afb0338a9116a5e7fb0c22af19098a4c7261a0555cd8fd05c93ae0cba2f2","e23076b177e7f44d35c37c9645fa286efb8e155e298aeffd555bcbec9dd148c4","af2c52be7b6ea33fc0a9cc62e9e1709b4a6c3d82522c08f58df28e2ca82680ce","0c285f87cd0f498d364b27cc2ff54a36fdee9091a0f13a00e587313341415cc4","9e1f168fc16f07964cced00315dc5127d4de5ac744b698eac660af137418495d","0b5b656d443c1e8fdff0d18a6337712ce51101d869f841523abfdca018f3d65b","f002d86a49dfd48d8b6eb7f8c817e201f0d8bc95329c7d379914c8d66b047f32","5fe8cba90fd05514a212949ccf3023eb89815d3623eee04dac3556258ef9267c","b2b02f2f2c6dcfe8f71590005cafcaa6d6b80bcf0771c0f004c6e4d7b5b84402","5c00a2bcc6e3c6fd241864a4673644e13b975d46959b6653f489c493e2a66562","8e08ad059dc1d5c4b0c6ca3f40bf5820ed51a9af0ab5519f9c1d800a2968619f","d948ec6d0b9107601583e3ae3af2359519e0c2f1da78905154e1877c6ca4770f","bc0f0db364583c7cfeeed5a28499fbdbf691035183dfc39859fc31e689d1db21",{"version":"52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","impliedFormat":1},{"version":"19726a169a4000cba269c284b97043faa0593de45865c43553c233f6825af0fb","impliedFormat":1},"6d4738306a2f9d923a9641ecce3991e64eb11cc3bdd742bbef72cf929e00c77f","365c25418c596a0ce608713cf26954f79c3a772b894a33bb92553092626a7c89","4982aa30c44f2e60ead9dbb4cf161061ec0111b0fd5c382e1b7aadf07695bdd0","5144645ae774a6e01de125a35dfbf23fc59c648560a64d017718d7ba41fcc7eb","b1c6d98fb75890683d578a2b78e3b0d71f0c47f08debf355253cee18185ab248","27e71a2bc50062a65a09c235470415f30daf22f50a725e4cb1f483fc3f3caf1e","12ef08f711049716cb22a4f1e77a331f49b640134d9c19289690addacd83d766","5d5a30193ac10062960d2679da9e34adbe589aad7c4c80bb2e5380d7cdeb105d","84e4a43313428b2723f1316caa759144c5e2601784416c51d31ab4e77bcc25fb","aed983a78fb2aa231cf118edc699b9cbe731b3c4e3f2023b829d196a24b621d7","493607ce396819ce844d8aa37267a4e2d41ab8fea4b15b6f2568a3aade4c7b45","eb7dc1aecc02de71340df9fe20e6d7ac37cdae03756892a872bc4a8b43a11f29","6418aa13b4f8bdfcd2635cfa609c7e598063ac2d7de516aac055fe13123d4967","9a330e8a3bc218cbfe22f7fa109c16b21c0b08af272d85c6c3fee2100b49d9c0","d7a967e4306c0ef742975cfc121736a576d45685db57e0544d16e2d7636cd0e3","d7f031fd8b8d7452d4e0944ded52e1b308c911d49a903171eedb4e6b1c43188c",{"version":"1b8e4993b0a8abdc8e98f9c11fe535f583dce84039b8402e6afab966c3f84501","affectsGlobalScope":true},{"version":"7c3f548ca157e70e5a54055ac71977acb07fc5e7b69e2041d3387b144fafa9cb","affectsGlobalScope":true},"360938ae1ab9ddfffe8fee6efe46572956c7e900adefb11d4c9995874def011c",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee70b8037ecdf0de6c04f35277f253663a536d7e38f1539d270e4e916d225a3f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"7965dc3c7648e2a7a586d11781cabb43d4859920716bc2fdc523da912b06570d","impliedFormat":1},{"version":"90c2bd9a3e72fe08b8fa5982e78cb8dc855a1157b26e11e37a793283c52bf64b","impliedFormat":1},{"version":"a8122fe390a2a987079e06c573b1471296114677923c1c094c24a53ddd7344a2","impliedFormat":1},{"version":"70c2cb19c0c42061a39351156653aa0cf5ba1ecdc8a07424dd38e3a1f1e3c7f4","impliedFormat":1},{"version":"a8fb10fd8c7bc7d9b8f546d4d186d1027f8a9002a639bec689b5000dab68e35c","impliedFormat":1},{"version":"c9b467ea59b86bd27714a879b9ad43c16f186012a26d0f7110b1322025ceaa83","impliedFormat":1},{"version":"57ea19c2e6ba094d8087c721bac30ff1c681081dbd8b167ac068590ef633e7a5","impliedFormat":1},{"version":"cba81ec9ae7bc31a4dc56f33c054131e037649d6b9a2cfa245124c67e23e4721","impliedFormat":1},{"version":"ad193f61ba708e01218496f093c23626aa3808c296844a99189be7108a9c8343","impliedFormat":1},{"version":"a0544b3c8b70b2f319a99ea380b55ab5394ede9188cdee452a5d0ce264f258b2","impliedFormat":1},{"version":"8c654c17c334c7c168c1c36e5336896dc2c892de940886c1639bebd9fc7b9be4","impliedFormat":1},{"version":"6a4da742485d5c2eb6bcb322ae96993999ffecbd5660b0219a5f5678d8225bb0","impliedFormat":1},{"version":"c65ca21d7002bdb431f9ab3c7a6e765a489aa5196e7e0ef00aed55b1294df599","impliedFormat":1},{"version":"c8fc655c2c4bafc155ceee01c84ab3d6c03192ced5d3f2de82e20f3d1bd7f9fa","impliedFormat":1},{"version":"be5a7ff3b47f7e553565e9483bdcadb0ca2040ac9e5ec7b81c7e115a81059882","impliedFormat":1},{"version":"1a93f36ecdb60a95e3a3621b561763e2952da81962fae217ab5441ac1d77ffc5","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"bf6402a3cfff440801c3ea5835f08784aac18087016534b48741adbcee931921","impliedFormat":1},{"version":"71b110829b8f5e7653352a132544ece2b9a10e93ba1c77453187673bd46f13ee","impliedFormat":1},{"version":"7c0ace9de3109ecdd8ad808dd40a052b82681786c66bb0bff6d848c1fc56a7c4","impliedFormat":1},{"version":"1223780c318ef42fd33ac772996335ed92d57cf7c0fc73178acab5e154971aab","impliedFormat":1},{"version":"0d04cbe88c8a25c2debd2eef03ec5674563e23ca9323fa82ede3577822653bd2","impliedFormat":1},{"version":"aaa70439f135c3fa0a34313de49e94cae3db954c8b8d6af0d56a46c998c2923f","impliedFormat":1},{"version":"4ace083580c1b77eb8ddf4ea915cde605af1a96e426c4c04b897feef1acdb534","impliedFormat":1},{"version":"daf07c1ca8ccfb21ad958833546a4f414c418fe096dcebdbb90b02e12aa5c3a2","impliedFormat":1},{"version":"89ac5224feeb2de76fc52fc2a91c5f6448a98dbe4e8d726ecb1730fa64cd2d30","impliedFormat":1},{"version":"7feb39ba69b3fc6d55faca4f91f06d77d15ffedd3931b0ef7740e8b6fd488b15","impliedFormat":1},{"version":"acf00cfabe8c4de18bea655754ea39c4d04140257556bbf283255b695d00e36f","impliedFormat":1},{"version":"39b70d5f131fcfdeba404ee63aba25f26d8376a73bacd8275fb5a9f06219ac77","impliedFormat":1},{"version":"cdae26c737cf4534eeec210e42eab2d5f0c3855240d8dde3be4aee9194e4e781","impliedFormat":1},{"version":"5aa0c50083d0d9a423a46afaef78c7f42420759cfa038ad40e8b9e6cafc38831","impliedFormat":1},{"version":"10d6a49a99a593678ba4ea6073d53d005adfc383df24a9e93f86bf47de6ed857","impliedFormat":1},{"version":"1b7ea32849a7982047c2e5d372300a4c92338683864c9ab0f5bbd1acadae83a3","impliedFormat":1},{"version":"224083e6fcec1d300229da3d1dafc678c642863996cbfed7290df20954435a55","impliedFormat":1},{"version":"4248ac3167b1a1ce199fda9307abc314b3132527aeb94ec30dbcfe4c6a417b1b","impliedFormat":1},{"version":"633cb8c2c51c550a63bda0e3dec0ad5fa1346d1682111917ad4bc7005d496d8c","impliedFormat":1},{"version":"ca055d26105248f745ea6259b4c498ebeed18c9b772e7f2b3a16f50226ff9078","impliedFormat":1},{"version":"ea6b2badb951d6dfa24bb7d7eb733327e5f9a15fc994d6dc1c54b2c7a83b6a0b","impliedFormat":1},{"version":"03fdf8dba650d830388b9985750d770dd435f95634717f41cea814863a9ac98b","impliedFormat":1},{"version":"6fd08e3ef1568cd0dc735c9015f6765e25143a4a0331d004a29c51b50eec402a","impliedFormat":1},{"version":"2e988cd4d24edac4936449630581c79686c8adac10357eb0cdb410c24f47c7f0","impliedFormat":1},{"version":"b813f62a37886ed986b0f6f8c5bf323b3fcae32c1952b71d75741e74ea9353cf","impliedFormat":1},{"version":"44a1a722038365972b1b52841e1132785bf5d75839dbc6cc1339f2d36f8507a1","impliedFormat":1},{"version":"83fe1053701101ac6d25364696fea50d2ceb2f81d1456bc11e682a20aaeac52e","impliedFormat":1},{"version":"4f228cb2089a5a135a1a8cefe612d5aebcef8258f7dbe3b7c4dad4e26a81ec08","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"683b035f752e318d02e303894e767a1ac16ac4493baa2b593195d7976e6b7310","impliedFormat":99},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"e134052a6b1ded61693b4037f615dc72f14e2881e79c1ddbff6c514c8a516b05","impliedFormat":1},{"version":"957a44f864ab3c182edc747428e8eec1765257deee7fac86c1147eeac897d832","impliedFormat":1},{"version":"3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","impliedFormat":99},{"version":"bbdfaf7d9b20534c5df1e1b937a20f17ca049d603a2afe072983bf7aff2279f5","impliedFormat":99},{"version":"86d818ada2f5f0cfffca153af94205b67ba50f8e36524a413d66652f34ef19af","impliedFormat":99},{"version":"40afd49a15d0bafef682b42664ff21c274e02dcc60052f2df85dd53c70d9394f","impliedFormat":99},{"version":"5a5b1dd91662e93efae28d985e0e44d10f6a7e3c2c2ae8abc29bcfc406cb5310","impliedFormat":99},{"version":"66d0a61b3b0df6c9c2eb09dbe26e3c2aef71d9043fed17cd56de6669cb706325","impliedFormat":99},{"version":"f6692c3a1847d846bc4b7a690ef2ba096b2ca56bea5818f073eb8193ce33b5e1","impliedFormat":99},{"version":"1e4d27cf43aa16d164e958a220fee3c225b9dd146b1912cbc12083263f157ca9","impliedFormat":99},{"version":"a46147f499d4246998d1e44b43beecd2ee04c0a330c35863eaeccc827a737fdf","impliedFormat":1},{"version":"390140c96dcaf0831d24b5408d19af017e3a8f150fed140791d976ac20dd2da7","impliedFormat":99},{"version":"3181a53b0974a6fa4c6f8cf78cf2945248949467f1fc1d3ddb058b0efe6c4f00","impliedFormat":99},{"version":"13e7c1f8ddda39d034935e667f3a314ec8b89b8be18fbd4cd987ea4312b4221f","impliedFormat":99},{"version":"678307b1f5a25d7fb9b7307a7ccd8d146115b28f74315c48511d1e1fdf9f8166","impliedFormat":99},{"version":"ba6f2f79892f59ea9bf645e15ad70658fc76dfbbba32669c2957b7547210e6ff","impliedFormat":99},{"version":"768fd34f23de8dc5f5df6cd45f044bb4193105b5964e4ef734dbfc1a1f8e6223","impliedFormat":1},{"version":"376d229cb7d2f7a4d5fbfb2eb5df262c31385b0c314fffa6660ba7ea4a5937f1","impliedFormat":99},{"version":"0ebf97879a0c2914ab35ef84b5802a5acbc8b6a7fc3ad952c1f8bb568026e571","impliedFormat":99},{"version":"81d3389164d84254c3869f799509672d323d5027a9766c0fa4c22b12c9be6bc5","impliedFormat":99},{"version":"ca6cd2c9c706f1d84fe86e3f87e3aa779256ed9ca3a2adcca81931faab807683","impliedFormat":99},{"version":"cf76eeea2b4ec3fe26520cd129cfc32352d1ddb22b6d4ff0c6a709656a4b1b37","impliedFormat":1},{"version":"fea0cb28540b473977c722853998d39d28575fa12e31b3371fcf1f324e3a9fb7","impliedFormat":1},{"version":"ee4ee9bf6c6d276343e7f0bce3a5374800eb4ec6b2d7c70fab6ae3ef840d9777","impliedFormat":1},{"version":"571ba264349552a1111ac0d6a5ed580a41c390aac43a70546c3a7374c77faa71","impliedFormat":1},"4ad34258acf819cf5f356e000d833974ddb2c2d76f9d50e0783d316986782dd3"],"root":[93,111,[128,150],[1105,1118],[1414,1433],[1436,1448],[1523,1527],1529,[1544,1584],[1968,1974],[1990,1994],[2076,2100],2115,2116,2118,2119,2131,2135,[2138,2297],[2300,2318],2507],"options":{"allowImportingTsExtensions":true,"composite":true,"esModuleInterop":true,"jsx":1,"jsxImportSource":"vue","module":99,"noImplicitThis":true,"skipLibCheck":true,"strict":true,"target":99,"useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[2316,1],[2315,2],[93,3],[105,4],[96,5],[95,6],[748,7],[742,6],[746,7],[745,8],[741,7],[740,6],[749,9],[747,8],[743,8],[744,8],[1119,10],[1120,10],[1121,10],[1122,10],[1123,10],[1124,10],[1125,10],[1126,10],[1127,10],[1128,10],[1129,10],[1130,10],[1131,10],[1132,10],[1133,10],[1134,10],[1135,10],[1136,10],[1137,10],[1138,10],[1139,10],[1140,10],[1141,10],[1142,10],[1143,10],[1144,10],[1145,10],[1146,10],[1147,10],[1148,10],[1149,10],[1150,10],[1151,10],[1152,10],[1153,10],[1154,10],[1155,10],[1156,10],[1157,10],[1158,10],[1159,10],[1160,10],[1161,10],[1162,10],[1163,10],[1164,10],[1165,10],[1166,10],[1167,10],[1168,10],[1169,10],[1170,10],[1171,10],[1172,10],[1173,10],[1174,10],[1175,10],[1176,10],[1177,10],[1178,10],[1179,10],[1180,10],[1181,10],[1182,10],[1183,10],[1184,10],[1185,10],[1186,10],[1187,10],[1188,10],[1189,10],[1190,10],[1191,10],[1192,10],[1193,10],[1194,10],[1195,10],[1196,10],[1197,10],[1198,10],[1199,10],[1200,10],[1201,10],[1202,10],[1203,10],[1204,10],[1205,10],[1206,10],[1207,10],[1208,10],[1209,10],[1210,10],[1211,10],[1212,10],[1213,10],[1214,10],[1215,10],[1216,10],[1217,10],[1218,10],[1219,10],[1220,10],[1221,10],[1222,10],[1223,10],[1224,10],[1225,10],[1226,10],[1227,10],[1228,10],[1229,10],[1230,10],[1231,10],[1232,10],[1233,10],[1234,10],[1235,10],[1236,10],[1237,10],[1238,10],[1239,10],[1240,10],[1241,10],[1242,10],[1243,10],[1244,10],[1245,10],[1246,10],[1247,10],[1248,10],[1249,10],[1250,10],[1251,10],[1252,10],[1253,10],[1254,10],[1255,10],[1256,10],[1257,10],[1258,10],[1259,10],[1260,10],[1412,11],[1261,10],[1262,10],[1263,10],[1264,10],[1265,10],[1266,10],[1267,10],[1268,10],[1269,10],[1270,10],[1271,10],[1272,10],[1273,10],[1274,10],[1275,10],[1276,10],[1277,10],[1278,10],[1279,10],[1280,10],[1281,10],[1282,10],[1283,10],[1284,10],[1285,10],[1286,10],[1287,10],[1288,10],[1289,10],[1290,10],[1291,10],[1292,10],[1293,10],[1294,10],[1295,10],[1296,10],[1297,10],[1298,10],[1299,10],[1300,10],[1301,10],[1302,10],[1303,10],[1304,10],[1305,10],[1306,10],[1307,10],[1308,10],[1309,10],[1310,10],[1311,10],[1312,10],[1313,10],[1314,10],[1315,10],[1316,10],[1317,10],[1318,10],[1319,10],[1320,10],[1321,10],[1322,10],[1323,10],[1324,10],[1325,10],[1326,10],[1327,10],[1328,10],[1329,10],[1330,10],[1331,10],[1332,10],[1333,10],[1334,10],[1335,10],[1336,10],[1337,10],[1338,10],[1339,10],[1340,10],[1341,10],[1342,10],[1343,10],[1344,10],[1345,10],[1346,10],[1347,10],[1348,10],[1349,10],[1350,10],[1351,10],[1352,10],[1353,10],[1354,10],[1355,10],[1356,10],[1357,10],[1358,10],[1359,10],[1360,10],[1361,10],[1362,10],[1363,10],[1364,10],[1365,10],[1366,10],[1367,10],[1368,10],[1369,10],[1370,10],[1371,10],[1372,10],[1373,10],[1374,10],[1375,10],[1376,10],[1377,10],[1378,10],[1379,10],[1380,10],[1381,10],[1382,10],[1383,10],[1384,10],[1385,10],[1386,10],[1387,10],[1388,10],[1389,10],[1390,10],[1391,10],[1392,10],[1393,10],[1394,10],[1395,10],[1396,10],[1397,10],[1398,10],[1399,10],[1400,10],[1401,10],[1402,10],[1403,10],[1404,10],[1405,10],[1406,10],[1407,10],[1408,10],[1409,10],[1410,10],[1411,10],[1413,12],[633,13],[635,14],[632,6],[634,6],[2136,10],[525,15],[521,16],[508,6],[524,17],[517,18],[515,19],[514,19],[513,18],[510,19],[511,18],[519,20],[512,19],[509,18],[516,19],[522,21],[523,22],[518,23],[520,19],[1989,24],[1988,25],[1985,26],[1984,27],[1975,6],[1976,6],[1978,28],[1977,6],[1987,29],[1979,27],[1980,30],[1983,31],[1981,6],[1982,27],[1986,6],[1611,24],[1585,10],[1586,32],[1587,10],[1588,10],[1589,33],[1967,34],[1610,6],[1608,35],[1607,6],[1941,36],[1940,37],[1939,6],[1923,38],[1922,10],[1925,39],[1926,40],[1924,41],[1928,42],[1927,6],[1931,43],[1932,44],[1930,43],[1929,6],[1961,45],[1960,10],[1933,10],[1963,46],[1943,47],[1942,10],[1934,6],[1936,48],[1935,6],[1938,49],[1937,41],[1945,10],[1959,50],[1958,51],[1957,10],[1944,10],[1948,10],[1952,52],[1950,53],[1951,10],[1949,10],[1947,54],[1946,6],[1954,55],[1953,6],[1956,56],[1955,10],[1909,6],[1965,57],[1964,10],[1966,58],[1918,59],[1917,60],[1916,61],[1919,62],[1920,63],[1915,64],[1921,65],[1962,6],[1914,66],[1913,67],[1910,6],[1911,68],[1912,69],[1797,70],[1732,71],[1733,72],[1734,73],[1735,74],[1736,75],[1737,76],[1738,77],[1739,78],[1740,79],[1741,80],[1742,81],[1743,82],[1744,83],[1745,84],[1746,85],[1747,86],[1787,87],[1748,88],[1749,89],[1750,90],[1751,91],[1752,92],[1753,93],[1754,94],[1755,95],[1756,96],[1757,97],[1758,98],[1759,99],[1760,100],[1761,101],[1762,102],[1763,103],[1764,104],[1765,105],[1766,106],[1767,107],[1768,108],[1769,109],[1770,110],[1771,111],[1772,112],[1773,113],[1774,114],[1775,115],[1776,116],[1777,117],[1778,118],[1779,119],[1780,120],[1781,121],[1782,122],[1783,123],[1784,124],[1785,125],[1786,126],[1796,127],[1721,6],[1727,128],[1729,129],[1731,130],[1788,131],[1789,130],[1790,130],[1791,132],[1795,133],[1792,130],[1793,130],[1794,130],[1798,134],[1799,135],[1800,136],[1801,136],[1802,137],[1803,136],[1804,136],[1805,138],[1806,136],[1807,139],[1808,139],[1809,139],[1810,140],[1811,139],[1812,141],[1813,136],[1814,139],[1815,137],[1816,140],[1817,136],[1818,136],[1819,137],[1820,140],[1821,140],[1822,137],[1823,136],[1824,142],[1825,143],[1826,137],[1827,137],[1828,139],[1829,136],[1830,136],[1831,137],[1832,136],[1849,144],[1833,136],[1834,135],[1835,135],[1836,135],[1837,139],[1838,139],[1839,140],[1840,140],[1841,137],[1842,135],[1843,135],[1844,145],[1845,146],[1846,136],[1847,135],[1848,147],[1885,148],[1723,70],[1855,149],[1850,150],[1851,150],[1852,150],[1853,151],[1854,152],[1726,153],[1725,153],[1730,142],[1856,154],[1724,70],[1860,155],[1857,156],[1858,156],[1859,157],[1861,135],[1728,158],[1862,139],[1863,140],[1864,6],[1865,6],[1866,6],[1867,6],[1868,6],[1869,6],[1884,159],[1870,6],[1871,6],[1872,6],[1873,6],[1874,6],[1875,6],[1876,6],[1877,6],[1878,6],[1879,6],[1880,6],[1881,6],[1882,6],[1883,6],[1887,160],[1888,161],[1889,162],[1893,160],[1894,163],[1895,164],[1719,165],[1718,166],[1722,167],[1720,168],[1890,169],[1891,170],[1892,171],[1896,172],[1902,173],[1897,10],[1898,10],[1899,174],[1900,175],[1901,174],[2114,176],[2111,177],[2110,178],[2101,6],[2102,6],[2104,179],[2103,6],[2113,180],[2105,178],[2106,181],[2109,182],[2107,6],[2108,178],[2112,6],[2423,6],[2038,6],[179,183],[180,183],[181,183],[182,183],[183,183],[184,183],[185,183],[186,183],[187,183],[188,183],[189,183],[190,183],[191,183],[192,183],[193,183],[194,183],[195,183],[196,183],[197,183],[198,183],[199,183],[200,183],[201,183],[202,183],[203,183],[204,183],[205,183],[206,183],[207,183],[208,183],[209,183],[210,183],[211,183],[212,183],[213,183],[214,183],[215,183],[216,183],[217,183],[218,183],[219,183],[220,183],[221,183],[222,183],[223,183],[224,183],[225,183],[226,183],[227,183],[228,183],[229,183],[230,183],[231,183],[232,183],[233,183],[234,183],[235,183],[236,183],[237,183],[238,183],[239,183],[240,183],[241,183],[242,183],[243,183],[244,183],[245,183],[246,183],[247,183],[248,183],[249,183],[250,183],[251,183],[252,183],[253,183],[254,183],[255,183],[256,183],[257,183],[258,183],[259,183],[260,183],[261,183],[262,183],[263,183],[264,183],[265,183],[266,183],[267,183],[268,183],[269,183],[270,183],[271,183],[272,183],[273,183],[274,183],[275,183],[483,184],[276,183],[277,183],[278,183],[279,183],[280,183],[281,183],[282,183],[283,183],[284,183],[285,183],[286,183],[287,183],[288,183],[289,183],[290,183],[291,183],[292,183],[293,183],[294,183],[295,183],[296,183],[297,183],[298,183],[299,183],[300,183],[301,183],[302,183],[303,183],[304,183],[305,183],[306,183],[307,183],[308,183],[309,183],[310,183],[311,183],[312,183],[313,183],[314,183],[315,183],[316,183],[317,183],[318,183],[319,183],[320,183],[321,183],[322,183],[323,183],[324,183],[325,183],[326,183],[327,183],[328,183],[329,183],[330,183],[331,183],[332,183],[333,183],[334,183],[335,183],[336,183],[337,183],[338,183],[339,183],[340,183],[341,183],[342,183],[343,183],[344,183],[345,183],[346,183],[347,183],[348,183],[349,183],[350,183],[351,183],[352,183],[353,183],[354,183],[355,183],[356,183],[357,183],[358,183],[359,183],[360,183],[361,183],[362,183],[363,183],[364,183],[365,183],[366,183],[367,183],[368,183],[369,183],[370,183],[371,183],[372,183],[373,183],[374,183],[375,183],[376,183],[377,183],[378,183],[379,183],[380,183],[381,183],[382,183],[383,183],[384,183],[385,183],[386,183],[387,183],[388,183],[389,183],[390,183],[391,183],[392,183],[393,183],[394,183],[395,183],[396,183],[397,183],[398,183],[399,183],[400,183],[401,183],[402,183],[403,183],[404,183],[405,183],[406,183],[407,183],[408,183],[409,183],[410,183],[411,183],[412,183],[413,183],[414,183],[415,183],[416,183],[417,183],[418,183],[419,183],[420,183],[421,183],[422,183],[423,183],[424,183],[425,183],[426,183],[427,183],[428,183],[429,183],[430,183],[431,183],[432,183],[433,183],[434,183],[435,183],[436,183],[437,183],[438,183],[439,183],[440,183],[441,183],[442,183],[443,183],[444,183],[445,183],[446,183],[447,183],[448,183],[449,183],[450,183],[451,183],[452,183],[453,183],[454,183],[455,183],[456,183],[457,183],[458,183],[459,183],[460,183],[461,183],[462,183],[463,183],[464,183],[465,183],[466,183],[467,183],[468,183],[469,183],[470,183],[471,183],[472,183],[473,183],[474,183],[475,183],[476,183],[477,183],[478,183],[479,183],[480,183],[481,183],[482,183],[116,185],[117,186],[115,187],[118,188],[119,189],[120,190],[121,191],[122,192],[123,193],[124,194],[125,195],[126,196],[127,197],[2369,198],[2370,198],[2371,199],[2324,200],[2372,201],[2373,202],[2374,203],[2319,6],[2322,204],[2320,6],[2321,6],[2375,205],[2376,206],[2377,207],[2378,208],[2379,209],[2380,210],[2381,210],[2382,211],[2383,212],[2384,213],[2385,214],[2325,6],[2323,6],[2386,215],[2387,216],[2388,217],[2422,218],[2389,219],[2390,6],[2391,220],[2392,221],[2393,222],[2394,223],[2395,224],[2396,225],[2397,226],[2398,227],[2399,228],[2400,228],[2401,229],[2402,6],[2403,230],[2404,231],[2406,232],[2405,233],[2407,234],[2408,235],[2409,236],[2410,237],[2411,238],[2412,239],[2413,240],[2414,241],[2415,242],[2416,243],[2417,244],[2418,245],[2419,246],[2326,6],[2327,6],[2328,6],[2366,247],[2367,6],[2368,6],[2420,248],[2421,249],[2504,250],[2064,251],[2063,251],[2488,252],[2485,253],[2487,254],[2486,255],[97,256],[98,257],[2483,258],[99,259],[100,260],[102,261],[94,6],[109,262],[108,10],[2042,263],[2056,264],[2057,265],[2058,266],[2062,267],[2043,268],[2069,269],[2070,270],[2061,271],[2047,272],[2051,273],[2041,274],[2049,275],[2050,276],[2048,271],[2046,274],[2044,277],[2060,278],[2045,279],[2066,280],[2067,281],[2065,282],[2040,283],[2059,6],[2071,284],[2073,285],[2074,286],[1999,6],[1997,6],[1998,3],[1995,6],[2072,6],[1996,6],[834,287],[833,6],[114,6],[101,6],[687,288],[686,289],[685,6],[1528,290],[2039,6],[2122,291],[2124,292],[2126,293],[2128,294],[1435,295],[2130,296],[2121,297],[2123,297],[2125,297],[1434,6],[2127,297],[2129,297],[2120,6],[503,298],[501,299],[502,300],[507,301],[504,302],[505,303],[506,304],[1062,305],[1060,10],[1061,306],[1058,307],[1059,308],[654,309],[652,310],[653,311],[661,312],[659,313],[657,314],[655,315],[656,316],[658,317],[660,318],[665,319],[662,10],[663,320],[664,321],[669,322],[666,302],[667,323],[668,324],[2132,3],[676,325],[672,326],[673,327],[670,302],[671,328],[674,328],[675,329],[683,330],[679,331],[680,332],[677,333],[678,331],[681,334],[682,335],[692,336],[684,302],[688,337],[689,338],[690,339],[691,340],[696,341],[693,302],[694,342],[695,343],[703,344],[699,302],[700,345],[697,302],[698,346],[701,345],[702,347],[710,348],[708,349],[709,350],[707,351],[706,352],[705,353],[704,354],[717,355],[714,356],[715,357],[716,358],[720,359],[718,360],[719,361],[727,362],[723,363],[724,364],[725,365],[721,366],[722,363],[726,367],[730,368],[728,369],[729,370],[739,371],[738,10],[737,372],[733,373],[734,374],[731,302],[732,375],[735,375],[736,376],[753,377],[751,378],[752,379],[750,380],[756,381],[754,382],[755,383],[784,384],[780,385],[781,386],[782,387],[783,388],[790,389],[786,10],[785,10],[787,10],[788,10],[789,10],[793,390],[791,391],[792,392],[807,393],[803,394],[802,395],[806,396],[805,397],[804,290],[811,398],[808,399],[810,400],[809,401],[815,402],[814,302],[812,403],[813,404],[765,405],[764,394],[760,302],[761,406],[762,407],[763,407],[2134,408],[818,409],[816,410],[817,411],[821,412],[819,413],[820,414],[828,415],[823,302],[824,10],[825,416],[822,417],[826,418],[827,419],[832,420],[829,302],[830,421],[831,422],[845,423],[841,424],[837,425],[840,426],[838,427],[839,428],[844,429],[842,430],[843,424],[836,431],[835,432],[848,433],[846,434],[847,435],[852,436],[850,437],[851,438],[854,439],[849,440],[853,441],[1095,442],[1079,443],[1078,10],[857,444],[855,445],[856,446],[861,447],[858,448],[859,449],[860,450],[539,451],[536,333],[537,452],[538,453],[768,454],[766,455],[767,456],[1084,457],[1083,458],[1081,459],[1082,458],[1080,460],[1071,461],[1068,462],[1069,463],[1070,464],[1067,6],[871,465],[869,466],[868,10],[866,10],[864,467],[865,468],[863,469],[867,302],[870,6],[862,470],[1087,471],[1085,472],[1086,473],[759,474],[758,475],[757,476],[1090,477],[1089,478],[1088,479],[873,480],[872,481],[2133,482],[876,483],[874,484],[875,485],[879,486],[878,10],[877,302],[882,487],[880,488],[881,489],[1094,490],[1093,10],[1091,491],[1092,492],[535,493],[532,494],[529,10],[526,495],[533,496],[534,497],[527,498],[528,499],[530,500],[531,501],[885,502],[883,503],[884,504],[893,505],[892,506],[888,507],[889,508],[890,509],[891,506],[886,510],[887,511],[896,512],[894,513],[895,514],[899,515],[897,516],[898,517],[903,518],[902,10],[900,519],[901,520],[910,521],[909,10],[904,522],[905,523],[907,524],[906,10],[908,525],[1066,526],[1065,527],[1064,528],[1063,6],[936,529],[925,530],[923,531],[911,6],[924,532],[926,533],[927,534],[935,535],[933,10],[929,302],[932,536],[928,537],[931,538],[934,539],[930,540],[941,541],[939,542],[940,543],[937,544],[938,545],[946,546],[945,547],[943,302],[944,548],[942,549],[950,550],[948,10],[947,481],[949,551],[1077,552],[1075,553],[1076,554],[1073,555],[1074,556],[1072,10],[953,557],[951,558],[952,559],[959,560],[956,561],[957,562],[954,563],[955,564],[958,6],[962,565],[960,566],[961,567],[995,568],[973,10],[975,569],[965,570],[972,4],[976,571],[986,572],[978,573],[980,574],[983,575],[987,576],[984,577],[985,578],[992,579],[991,580],[982,581],[989,582],[988,583],[970,584],[990,585],[963,6],[967,586],[977,587],[979,588],[981,569],[974,6],[994,589],[966,590],[969,591],[971,592],[968,593],[964,594],[993,595],[779,596],[770,597],[769,598],[773,599],[777,600],[774,601],[775,602],[776,603],[772,604],[778,605],[771,606],[1003,607],[998,608],[1000,609],[999,610],[1001,611],[997,612],[996,613],[1002,614],[713,615],[711,616],[712,617],[1006,618],[1004,333],[1005,619],[801,620],[796,621],[794,622],[799,623],[800,624],[797,338],[795,625],[798,626],[1009,627],[1007,628],[1008,629],[1014,630],[1011,631],[1012,632],[1010,302],[1013,633],[651,634],[650,635],[646,636],[645,637],[648,638],[649,639],[647,313],[1057,640],[1051,641],[1055,642],[1056,643],[1053,644],[1054,645],[1052,646],[1019,647],[1017,648],[1016,649],[1015,650],[1018,651],[1031,652],[1030,653],[1029,654],[1036,655],[1035,656],[1034,657],[1032,658],[1033,659],[1028,660],[1026,661],[1024,662],[1023,663],[1021,664],[1027,6],[1020,665],[1022,666],[1025,667],[1047,668],[1037,669],[1046,10],[1041,670],[1040,671],[1045,672],[1044,673],[1043,674],[1042,675],[1038,676],[1039,677],[922,678],[920,679],[921,680],[915,681],[916,549],[912,549],[913,6],[918,682],[919,681],[914,683],[1050,684],[1048,685],[1049,686],[167,6],[172,6],[168,6],[169,6],[173,6],[174,687],[170,6],[171,6],[1096,688],[1097,10],[1102,689],[1101,690],[1098,10],[1099,10],[644,691],[643,10],[540,10],[541,10],[641,10],[637,10],[629,302],[542,692],[543,10],[642,302],[626,6],[636,693],[640,460],[544,10],[630,10],[625,460],[628,10],[612,694],[614,695],[615,10],[616,302],[613,10],[638,10],[627,10],[619,495],[617,10],[618,10],[620,6],[639,333],[621,10],[622,10],[623,6],[624,6],[631,10],[1104,696],[611,697],[546,6],[547,6],[548,6],[549,6],[550,6],[551,6],[552,6],[553,6],[554,6],[555,6],[556,6],[557,6],[545,6],[558,6],[559,6],[560,6],[561,6],[562,6],[563,6],[564,6],[565,6],[566,6],[567,6],[568,6],[569,6],[570,6],[571,6],[572,6],[573,6],[574,6],[575,6],[576,6],[577,6],[578,6],[579,6],[580,6],[581,6],[582,6],[583,6],[584,6],[585,6],[586,6],[587,6],[588,6],[589,6],[590,6],[591,6],[592,6],[593,6],[594,6],[595,6],[596,6],[597,6],[598,6],[599,6],[600,6],[601,6],[602,6],[603,6],[604,6],[605,6],[606,6],[607,6],[110,6],[609,6],[610,6],[608,6],[1103,698],[485,699],[488,692],[151,6],[156,6],[152,6],[157,700],[153,6],[154,6],[155,10],[499,6],[489,6],[490,259],[491,6],[500,701],[492,702],[493,6],[494,6],[495,259],[498,6],[496,259],[497,6],[158,6],[159,10],[178,703],[161,704],[165,705],[163,706],[164,707],[162,6],[166,10],[175,708],[160,10],[176,708],[177,10],[487,709],[486,710],[2428,6],[2137,711],[1450,712],[1451,713],[1449,6],[1505,714],[1457,715],[1459,716],[1452,712],[1506,717],[1458,718],[1463,719],[1464,718],[1465,720],[1466,718],[1467,721],[1468,720],[1469,718],[1470,718],[1502,722],[1497,723],[1498,718],[1499,718],[1471,718],[1472,718],[1500,718],[1473,718],[1493,718],[1496,718],[1495,718],[1494,718],[1474,718],[1475,718],[1476,719],[1477,718],[1478,718],[1491,718],[1480,718],[1479,718],[1503,718],[1482,718],[1501,718],[1481,718],[1492,718],[1484,722],[1485,718],[1487,720],[1486,718],[1488,718],[1504,718],[1489,718],[1490,718],[1455,724],[1454,6],[1460,725],[1462,726],[1456,6],[1461,727],[1483,727],[1453,728],[1508,729],[1515,730],[1516,730],[1518,731],[1517,730],[1507,732],[1521,733],[1510,734],[1512,735],[1520,736],[1513,737],[1511,738],[1519,739],[1514,740],[1509,741],[2068,6],[2456,6],[1522,6],[484,742],[2481,6],[917,6],[2489,6],[1100,6],[1713,6],[113,743],[2445,744],[2443,745],[2444,746],[2432,747],[2433,745],[2440,748],[2431,749],[2436,750],[2446,6],[2437,751],[2442,752],[2448,753],[2447,754],[2430,755],[2438,756],[2439,757],[2434,758],[2441,744],[2435,759],[1714,760],[1717,761],[1715,165],[1716,762],[2425,763],[2424,764],[2469,765],[2450,6],[2470,766],[2452,767],[2477,768],[2471,6],[2473,769],[2474,769],[2475,770],[2472,6],[2476,771],[2455,772],[2453,6],[2454,773],[2468,774],[2451,6],[2466,775],[2457,776],[2458,777],[2459,777],[2460,776],[2467,778],[2461,777],[2462,775],[2463,776],[2464,777],[2465,776],[2053,779],[2052,780],[2055,781],[2054,782],[2000,780],[2019,783],[2012,6],[2003,784],[2001,780],[2004,780],[2002,785],[2005,780],[2007,780],[2006,780],[2009,780],[2008,780],[2011,780],[2010,780],[2013,786],[2014,780],[2018,787],[2015,788],[2016,780],[2017,780],[2035,789],[2021,789],[2029,789],[2020,6],[2037,790],[2031,791],[2033,6],[2036,792],[2024,793],[2025,793],[2027,793],[2023,794],[2030,795],[2026,793],[2022,793],[2032,789],[2034,796],[2028,797],[2429,6],[2493,798],[2492,6],[1886,799],[1543,800],[1530,6],[1540,6],[1536,6],[1537,6],[1531,6],[1541,6],[1542,6],[1539,6],[1535,6],[1534,6],[1538,801],[1532,6],[1533,6],[1598,802],[1597,10],[1643,10],[1592,10],[1593,6],[1594,803],[1662,10],[1663,804],[1664,10],[1666,805],[1665,10],[1599,10],[1667,10],[1668,10],[1696,806],[1697,807],[1692,10],[1669,808],[1670,808],[1672,809],[1671,810],[1673,10],[1674,808],[1698,10],[1700,811],[1676,812],[1675,10],[1687,10],[1688,808],[1689,808],[1690,808],[1701,806],[1677,10],[1605,813],[1602,10],[1603,814],[1604,6],[1596,815],[1595,6],[1644,10],[1691,10],[1699,816],[1615,817],[1613,818],[1614,819],[1642,820],[1694,6],[1695,821],[1680,822],[1647,823],[1648,824],[1649,810],[1650,825],[1702,10],[1703,826],[1651,810],[1652,827],[1653,828],[1704,810],[1705,829],[1706,830],[1707,831],[1640,832],[1641,833],[1681,810],[1682,834],[1708,835],[1709,836],[1621,10],[1654,810],[1656,837],[1655,810],[1657,838],[1659,839],[1591,840],[1711,841],[1710,842],[1904,843],[1903,844],[1712,6],[1906,845],[1905,816],[1683,846],[1684,847],[1601,848],[1600,10],[1661,849],[1660,810],[1686,850],[1685,851],[1907,852],[1908,853],[1606,854],[1646,855],[1645,856],[1678,857],[1693,858],[1679,6],[1627,820],[1633,6],[1632,859],[1636,6],[1620,6],[1622,835],[1630,860],[1631,6],[1618,861],[1619,862],[1609,6],[1616,863],[1639,864],[1624,865],[1590,6],[1612,866],[1629,6],[1635,867],[1634,10],[1617,816],[1628,868],[1625,6],[1623,6],[1638,869],[1626,820],[1637,6],[1658,6],[84,6],[85,6],[15,6],[13,6],[14,6],[19,6],[18,6],[2,6],[20,6],[21,6],[22,6],[23,6],[24,6],[25,6],[26,6],[27,6],[3,6],[28,6],[29,6],[4,6],[30,6],[34,6],[31,6],[32,6],[33,6],[35,6],[36,6],[37,6],[5,6],[38,6],[39,6],[40,6],[41,6],[6,6],[45,6],[42,6],[43,6],[44,6],[46,6],[7,6],[47,6],[52,6],[53,6],[48,6],[49,6],[50,6],[51,6],[8,6],[57,6],[54,6],[55,6],[56,6],[58,6],[9,6],[59,6],[60,6],[61,6],[63,6],[62,6],[64,6],[65,6],[10,6],[66,6],[67,6],[68,6],[11,6],[69,6],[70,6],[71,6],[72,6],[73,6],[1,6],[74,6],[75,6],[12,6],[79,6],[77,6],[82,6],[81,6],[86,6],[76,6],[80,6],[78,6],[83,6],[17,6],[16,6],[2482,6],[2344,870],[2354,871],[2343,870],[2364,872],[2335,873],[2334,874],[2363,250],[2357,875],[2362,876],[2337,877],[2351,878],[2336,879],[2360,880],[2332,881],[2331,250],[2361,882],[2333,883],[2338,884],[2339,6],[2342,884],[2329,6],[2365,885],[2355,886],[2346,887],[2347,888],[2349,889],[2345,890],[2348,891],[2358,250],[2340,892],[2341,893],[2350,894],[2330,895],[2353,886],[2352,884],[2356,6],[2359,896],[2494,897],[2490,898],[2491,899],[2496,900],[2497,901],[2495,6],[2501,902],[2500,903],[2502,904],[2499,905],[2503,906],[2505,907],[2506,906],[92,908],[2480,909],[2427,910],[2426,911],[88,911],[87,6],[89,912],[90,6],[91,913],[2478,914],[2449,6],[2479,915],[2117,6],[112,10],[2299,916],[2298,10],[106,10],[107,917],[2484,255],[103,918],[104,919],[2075,10],[2498,6],[1553,920],[1569,920],[1561,920],[1570,920],[1571,920],[1431,920],[1572,920],[1555,920],[1562,920],[1423,920],[1421,920],[1427,920],[1563,921],[1564,920],[1446,920],[1565,920],[1430,920],[1573,920],[1574,920],[1524,920],[1575,920],[1576,920],[1577,920],[1566,920],[1567,920],[1578,920],[1579,920],[1580,920],[1581,920],[150,920],[1582,920],[1583,920],[1568,920],[1429,920],[1584,920],[131,922],[1557,923],[1969,924],[1970,925],[1990,926],[1556,927],[1991,928],[1992,929],[1993,930],[1994,929],[2082,931],[2083,932],[2084,929],[2085,933],[2087,934],[2088,935],[2086,936],[2089,937],[2091,938],[2092,939],[2090,940],[2095,941],[2093,939],[2096,942],[2094,939],[2077,943],[2078,944],[2080,945],[2081,946],[2079,929],[1447,947],[2097,948],[2098,929],[2099,928],[2076,949],[1968,950],[1523,951],[2100,952],[2115,953],[128,940],[138,940],[111,940],[132,940],[129,940],[130,940],[2116,954],[1414,4],[147,955],[1432,4],[143,956],[2118,957],[2119,958],[1559,4],[2131,959],[2135,960],[2138,961],[2140,962],[2142,963],[2143,4],[1415,964],[144,965],[145,964],[146,928],[1107,966],[148,967],[149,964],[1106,968],[1108,969],[141,970],[142,971],[1114,972],[1109,973],[1111,974],[1112,975],[1113,976],[1115,977],[1560,978],[1558,979],[2141,956],[2144,980],[1547,981],[1546,982],[2139,983],[1554,984],[134,985],[140,986],[137,987],[136,988],[135,940],[1971,940],[1972,940],[2145,940],[1448,940],[1525,940],[2146,940],[1105,989],[2147,4],[1441,990],[1974,940],[1433,991],[1550,992],[1548,993],[1552,994],[1549,995],[139,996],[1973,940],[1110,997],[133,940],[1551,940],[1418,940],[1419,998],[1417,999],[1416,1000],[2148,1001],[2149,1002],[2150,1003],[2151,1004],[2152,1005],[2153,1006],[2154,1007],[2155,1008],[2156,1009],[2162,1010],[2160,1011],[2159,1012],[2158,1013],[2161,1014],[2157,1015],[2164,1016],[2163,1017],[2165,1016],[2166,1016],[2167,1018],[2168,1019],[2169,1020],[2170,1021],[2171,1022],[2172,932],[2173,1021],[2174,1023],[2175,1024],[2176,1025],[2177,1026],[2178,1027],[2179,1028],[2180,1029],[2188,1030],[2184,1031],[2189,1032],[2182,929],[1425,1033],[2190,1034],[2183,1030],[2185,1035],[2186,1036],[2192,1037],[2193,1035],[2194,1038],[2191,1039],[2196,1040],[2197,1041],[2198,1042],[2195,940],[2200,1043],[2201,1044],[2202,1045],[2199,940],[1424,940],[2204,1046],[2205,1047],[2206,1048],[2203,940],[2208,1049],[2209,1050],[2210,1051],[2207,940],[2212,1052],[2213,1053],[2214,1054],[2211,940],[2216,1055],[2217,1056],[2218,1057],[2215,940],[2220,1058],[2221,929],[2222,1059],[2219,940],[2224,1060],[2225,1061],[2223,940],[2227,1062],[2228,929],[2229,1063],[2226,940],[2231,1064],[2232,1065],[2233,1066],[2230,940],[2235,1067],[2236,929],[2237,1068],[2234,940],[2238,1069],[2181,1070],[1426,1071],[2240,1072],[2239,928],[2241,1073],[2187,1074],[2243,1075],[2246,1076],[2244,1077],[2245,1078],[2242,1079],[2247,1080],[2248,1081],[1422,1082],[2249,1083],[2250,1080],[1118,1084],[1117,1084],[1116,1085],[1428,1086],[2251,1087],[2252,1088],[2257,1089],[2258,1090],[2253,1091],[2255,1092],[2254,1093],[2256,1094],[2259,929],[2260,1095],[2261,1096],[2262,1097],[2263,1098],[2264,1099],[2265,1100],[2266,1101],[2267,1102],[2268,1103],[1445,929],[2269,1104],[2270,1105],[2271,1106],[2272,1107],[2273,1108],[2274,1109],[2275,1110],[2276,1111],[2277,1112],[2278,1113],[2279,1112],[2280,1114],[2281,1115],[2282,1116],[2283,1117],[2284,1118],[2285,1119],[2286,1120],[2287,1121],[2288,1122],[2289,1123],[2290,1124],[2291,1125],[2292,1126],[2293,1127],[2294,1128],[2295,1129],[2296,1130],[2297,1131],[2300,1132],[2302,1133],[2301,1134],[2303,1135],[1529,1136],[1444,1137],[1443,1138],[1544,1139],[1436,1140],[1440,1138],[1439,1138],[1437,1141],[1438,1141],[1442,1142],[1527,1143],[1526,1144],[2304,1145],[1545,1146],[2305,1147],[2306,929],[2307,1148],[2308,929],[2309,929],[2310,929],[2311,929],[2312,1149],[2313,1150],[1420,1151],[2314,1152],[2317,6],[2318,1153],[2507,1154]],"semanticDiagnosticsPerFile":[[1428,[{"start":1757,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type '\"\" | \"info\" | \"danger\"' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type '\"\"' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]},{"start":7601,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[1436,[{"start":14231,"length":34,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'number'."}]],[1971,[{"start":10172,"length":13,"code":2339,"category":1,"messageText":"Property 'captureStream' does not exist on type 'HTMLVideoElement'."}]],[2082,[{"start":860,"length":28,"code":7016,"category":1,"messageText":{"messageText":"Could not find a declaration file for module '@wangeditor/editor-for-vue'. '/Users/long/Work/zyt/admin/node_modules/@wangeditor/editor-for-vue/dist/index.esm.js' implicitly has an 'any' type.","category":1,"code":7016,"next":[{"info":{"moduleReference":"@wangeditor/editor-for-vue","mode":99}}]}}]],[2178,[{"start":72450,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ name: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ name: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":72712,"length":962,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":73688,"length":457,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":74159,"length":457,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":74630,"length":780,"code":2322,"category":1,"messageText":"Type '{ name: string; children: { name: string; children: { name: string; }[]; }[]; }' is not assignable to type 'never'."},{"start":48304,"length":6,"code":2322,"category":1,"messageText":{"messageText":"Type '(value: string[]) => void' is not assignable to type '(value: CascaderValue | null | undefined) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'value' and 'value' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'CascaderValue | null | undefined' is not assignable to type 'string[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'undefined' is not assignable to type 'string[]'.","category":1,"code":2322}]}]}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/cascader/src/cascader.vue.d.ts","start":3298,"length":8,"messageText":"The expected type comes from property 'onChange' which is declared here on type '__VLS_NormalizeComponentEvent<NonNullable<Partial<{ disabled: boolean; separator: string; props: CascaderProps; placement: Placement; options: CascaderOption[]; effect: PopperEffect; ... 15 more ...; showCheckedStrategy: \"parent\" | \"child\"; }> & Omit<...> & Record<...>>, { ...; }, \"onChange\", \"change\", \"change\">'","category":3,"code":6500}]}]],[2180,[{"start":115604,"length":19,"code":2322,"category":1,"messageText":{"messageText":"Type '{ value: any; label: any; code: any; children: any; }[]' is not assignable to type 'never[]'.","category":1,"code":2322,"next":[{"messageText":"Type '{ value: any; label: any; code: any; children: any; }' is not assignable to type 'never'.","category":1,"code":2322}]}},{"start":147979,"length":1,"messageText":"Parameter 'v' implicitly has an 'any' type.","category":1,"code":7006},{"start":155179,"length":15,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./src/api/tcm.ts","start":12001,"length":15,"messageText":"The expected type comes from property 'medication_days' which is declared here on type '{ id: number; dose_count?: number | undefined; medication_days?: number | undefined; }'","category":3,"code":6500}]},{"start":160705,"length":15,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'tracking_number' does not exist in type '{ fulfillment_status?: number | undefined; }'."},{"start":167523,"length":18,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'completion_request' does not exist in type '{ id: number; order_type: number; pay_amount: number; pay_remark?: string | undefined; }'."},{"start":168029,"length":13,"code":2561,"category":1,"messageText":"Object literal may only specify known properties, but 'pay_order_ids' does not exist in type '{ id: number; pay_order_id: number; }'. Did you mean to write 'pay_order_id'?"},{"start":11139,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'unknown[]' is not assignable to type 'TreeNodeData[]'.","category":1,"code":2322,"next":[{"messageText":"Type 'unknown' is not assignable to type 'TreeNodeData'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":30781,"length":4,"messageText":"The expected type comes from property 'data' which is declared here on type 'Partial<{ data: TreeData; disabled: EpPropMergeType<BooleanConstructor, unknown, unknown>; tabindex: EpPropMergeType<(NumberConstructor | StringConstructor)[], unknown, unknown>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":23264,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":152027,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":23742,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":169095,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":24188,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":152027,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":24658,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":169951,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":25094,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; express_company?: unknown; tracking_number?: unknown; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; express_company?: unknown; tracking_number?: unknown; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":161591,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":25549,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; diagnosis_id?: number | undefined; pay_order_ids?: number[] | undefined; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":166332,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":25999,"length":10,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Record<string, any>' is not assignable to parameter of type '{ id: number; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'id' is missing in type 'Record<string, any>' but required in type '{ id: number; }'.","category":1,"code":2741}]},"relatedInformation":[{"start":168855,"length":2,"messageText":"'id' is declared here.","category":3,"code":2728}]},{"start":65940,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":752,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type 'Partial<{ disabled: boolean; id: string; valueOnClear: number | \"max\" | \"min\" | null; min: number; max: number; inputmode: \"text\" | \"url\" | \"none\" | \"search\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\"; ... 6 more ...; stepStrictly: boolean; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":77832,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type 'string | number | undefined' is not assignable to type 'number | null | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'number'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/input-number/src/input-number.d.ts","start":752,"length":10,"messageText":"The expected type comes from property 'modelValue' which is declared here on type 'Partial<{ disabled: boolean; id: string; valueOnClear: number | \"max\" | \"min\" | null; min: number; max: number; inputmode: \"text\" | \"url\" | \"none\" | \"search\" | \"email\" | \"tel\" | \"numeric\" | \"decimal\"; ... 6 more ...; stepStrictly: boolean; }> & Omit<...> & Record<...>'","category":3,"code":6500}]},{"start":105819,"length":1,"messageText":"Parameter 'r' implicitly has an 'any' type.","category":1,"code":7006}]],[2192,[{"start":316,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":3919,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]},{"start":442,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ modelValue: any; }' is not assignable to parameter of type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps & Record<...>'.","category":1,"code":2345,"next":[{"messageText":"Property 'itemData' is missing in type '{ modelValue: any; }' but required in type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'.","category":1,"code":2741,"canonicalHead":{"code":2322,"messageText":"Type '{ modelValue: any; }' is not assignable to type '{ readonly modelValue: any[]; readonly max?: number | undefined; readonly min?: number | undefined; readonly itemData: any; readonly \"onUpdate:modelValue\"?: ((value: any) => any) | undefined; }'."}}]},"relatedInformation":[{"file":"./src/views/decoration/component/tabbar/pc/menu-set.vue","start":3919,"length":8,"messageText":"'itemData' is declared here.","category":3,"code":2728}]}]],[2205,[{"start":190,"length":6,"code":2339,"category":1,"messageText":"Property 'height' does not exist on type '{}'."}]],[2247,[{"start":5579,"length":5,"messageText":"Parameter 'depts' implicitly has an 'any' type.","category":1,"code":7006},{"start":5607,"length":6,"messageText":"Variable 'result' implicitly has type 'any[]' in some locations where its type cannot be determined.","category":1,"code":7034},{"start":5645,"length":4,"messageText":"Parameter 'dept' implicitly has an 'any' type.","category":1,"code":7006},{"start":5811,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005},{"start":5906,"length":6,"messageText":"Variable 'result' implicitly has an 'any[]' type.","category":1,"code":7005}]],[2250,[{"start":10049,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":10250,"length":47,"code":2769,"category":1,"messageText":{"messageText":"No overload matches this call.","category":1,"code":2769,"next":[{"messageText":"Overload 1 of 3, '(callbackfn: (previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown, initialValue: unknown): unknown', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: unknown, currentValue: unknown, currentIndex: number, array: unknown[]) => unknown'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'total' and 'previousValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]},{"messageText":"Overload 2 of 3, '(callbackfn: (previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number, initialValue: number): number', gave the following error.","category":1,"code":2772,"next":[{"messageText":"Argument of type '(total: number, count: number) => number' is not assignable to parameter of type '(previousValue: number, currentValue: unknown, currentIndex: number, array: unknown[]) => number'.","category":1,"code":2345,"next":[{"messageText":"Types of parameters 'count' and 'currentValue' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'unknown' is not assignable to type 'number'.","category":1,"code":2322}]}]}]}]},"relatedInformation":[]},{"start":4609,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]},{"start":6777,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[2251,[{"start":7456,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type '\"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\" | undefined'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tag/src/tag.vue.d.ts","start":846,"length":4,"messageText":"The expected type comes from property 'type' which is declared here on type 'Partial<{ type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; effect: \"light\" | \"dark\" | \"plain\"; }> & Omit<{ readonly type: \"success\" | \"primary\" | \"warning\" | \"info\" | \"danger\"; ... 8 more ...; onClose?: ((evt: MouseEvent) => any) | undefined; } & VNodeProps & AllowedComponentProps & ComponentCustomProps,...'","category":3,"code":6500}]}]],[2261,[{"start":386,"length":10,"code":2322,"category":1,"messageText":{"messageText":"Type '(opts?: { silent?: boolean; }) => Promise<any>' is not assignable to type '(name: TabPaneName) => any'.","category":1,"code":2322,"next":[{"messageText":"Types of parameters 'opts' and 'name' are incompatible.","category":1,"code":2328,"next":[{"messageText":"Type 'TabPaneName' is not assignable to type '{ silent?: boolean | undefined; } | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' has no properties in common with type '{ silent?: boolean | undefined; }'.","category":1,"code":2559}]}]}]},"relatedInformation":[{"file":"./node_modules/element-plus/es/components/tabs/src/tabs.d.ts","start":8466,"length":11,"messageText":"The expected type comes from property 'onTabChange' which is declared here on type '__VLS_NormalizeComponentEvent<NonNullable<Partial<{ readonly tabindex: EpPropMergeType<readonly [StringConstructor, NumberConstructor], unknown, unknown>; readonly stretch: boolean; ... 5 more ...; readonly addable: boolean; }> & Omit<...> & Record<...>>, { ...; }, \"onTabChange\", \"tab-change\", \"tabChange\">'","category":3,"code":6500}]}]],[2264,[{"start":46757,"length":34,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367},{"start":18780,"length":28,"messageText":"This comparison appears to be unintentional because the types '\"supplement\"' and '\"normal\"' have no overlap.","category":1,"code":2367}]],[2265,[{"start":723,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":31111,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ data: TreeData; disabled: EpPropMergeType<BooleanConstructor, unknown, unknown>; tabindex: EpPropMergeType<(NumberConstructor | StringConstructor)[], unknown, unknown>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2270,[{"start":1689,"length":5,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'value' does not exist in type 'TreeOptionProps'.","relatedInformation":[{"file":"./node_modules/element-plus/es/components/tree-select/src/tree-select.vue.d.ts","start":31111,"length":5,"messageText":"The expected type comes from property 'props' which is declared here on type 'Partial<{ data: TreeData; disabled: EpPropMergeType<BooleanConstructor, unknown, unknown>; tabindex: EpPropMergeType<(NumberConstructor | StringConstructor)[], unknown, unknown>; ... 48 more ...; cacheData: unknown[]; }> & Omit<...> & Record<...>'","category":3,"code":6500}]}]],[2303,[{"start":31557,"length":6,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":31557,"length":6,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]},{"start":32314,"length":2,"code":2349,"category":1,"messageText":{"messageText":"This expression is not callable.","category":1,"code":2349,"next":[{"messageText":"Type 'String' has no call signatures.","category":1,"code":2757}]},"relatedInformation":[{"start":32314,"length":2,"messageText":"Are you missing a semicolon?","category":1,"code":2734}]}]],[2314,[{"start":24155,"length":1,"messageText":"Parameter 'd' implicitly has an 'any' type.","category":1,"code":7006}]]],"affectedFilesPendingEmit":[1553,1569,1561,1570,1571,1431,1572,1555,1562,1423,1421,1427,1563,1564,1446,1565,1430,1573,1574,1524,1575,1576,1577,1566,1567,1578,1579,1580,1581,150,1582,1583,1568,1429,1584,131,1557,1969,1970,1990,1556,1991,1992,1993,1994,2082,2083,2084,2085,2087,2088,2086,2089,2091,2092,2090,2095,2093,2096,2094,2077,2078,2080,2081,2079,1447,2097,2098,2099,2076,1968,1523,2100,2115,128,138,111,132,129,130,2116,1414,147,1432,143,2118,2119,1559,2131,2135,2138,2140,2142,2143,1415,144,145,146,1107,148,149,1106,1108,141,142,1114,1109,1111,1112,1113,1115,1560,1558,2141,2144,1547,1546,2139,1554,134,140,137,136,135,1971,1972,2145,1448,1525,2146,1105,2147,1441,1974,1433,1550,1548,1552,139,1973,1110,133,1551,1418,1419,1417,1416,2148,2149,2150,2151,2152,2153,2154,2155,2156,2162,2160,2159,2158,2161,2157,2164,2163,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2188,2184,2189,2182,1425,2190,2183,2185,2186,2192,2193,2194,2191,2196,2197,2198,2195,2200,2201,2202,2199,1424,2204,2205,2206,2203,2208,2209,2210,2207,2212,2213,2214,2211,2216,2217,2218,2215,2220,2221,2222,2219,2224,2225,2223,2227,2228,2229,2226,2231,2232,2233,2230,2235,2236,2237,2234,2238,2181,1426,2240,2239,2241,2187,2243,2246,2244,2245,2242,2247,2248,1422,2249,2250,1118,1117,1116,1428,2251,2252,2257,2258,2253,2255,2254,2256,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,1445,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2300,2302,2301,2303,1529,1444,1443,1544,1436,1440,1439,1437,1438,1442,1527,1526,2304,1545,2305,2306,2307,2308,2309,2310,2311,2312,2313,1420,2314,2507],"emitSignatures":[111,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1523,1524,1525,1526,1527,1529,1544,1545,1546,1547,1548,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1968,1969,1970,1971,1972,1973,1974,1990,1991,1992,1993,1994,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2115,2116,2118,2119,2131,2135,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2507],"version":"5.9.3"} \ No newline at end of file diff --git a/server/app/adminapi/controller/doctor/AppointmentController.php b/server/app/adminapi/controller/doctor/AppointmentController.php index 643443e3..d3730db6 100644 --- a/server/app/adminapi/controller/doctor/AppointmentController.php +++ b/server/app/adminapi/controller/doctor/AppointmentController.php @@ -5,6 +5,7 @@ namespace app\adminapi\controller\doctor; use app\adminapi\controller\BaseAdminController; use app\adminapi\lists\doctor\AppointmentLists; use app\adminapi\logic\doctor\AppointmentLogic; +use app\adminapi\logic\doctor\DoctorNoteLogic; use app\adminapi\validate\doctor\AppointmentValidate; /** @@ -104,4 +105,46 @@ class AppointmentController extends BaseAdminController } return $this->success('操作成功'); } + + /** + * @notes 接诊台聚合详情(患者信息 + 诊单病例 + 血糖血压记录) + * @return \think\response\Json + */ + public function reception() + { + $params = (new AppointmentValidate())->goCheck('reception'); + $result = AppointmentLogic::reception($params); + return $this->data($result); + } + + /** + * @notes 通知接诊医助(发企业微信) + * @return \think\response\Json + */ + public function notifyAssistant() + { + $params = (new AppointmentValidate())->post()->goCheck('notifyAssistant'); + $result = AppointmentLogic::notifyAssistant((int) $params['id']); + if (empty($result['ok'])) { + return $this->fail($result['message'] ?? '通知失败'); + } + return $this->success('通知已发送'); + } + + public function addDoctorNote() + { + $params = (new AppointmentValidate())->post()->goCheck('addDoctorNote'); + $params['doctor_id'] = $this->adminId; + $result = DoctorNoteLogic::addOrAppend($params); + if ($result === false) { + return $this->fail(DoctorNoteLogic::getError()); + } + return $this->success('保存成功'); + } + + public function doctorNotes() + { + $params = (new AppointmentValidate())->goCheck('doctorNotes'); + return $this->data(DoctorNoteLogic::getByDiagnosis((int) $params['diagnosis_id'])); + } } diff --git a/server/app/adminapi/logic/doctor/AppointmentLogic.php b/server/app/adminapi/logic/doctor/AppointmentLogic.php index a13fbefa..2f6aa13d 100644 --- a/server/app/adminapi/logic/doctor/AppointmentLogic.php +++ b/server/app/adminapi/logic/doctor/AppointmentLogic.php @@ -10,6 +10,12 @@ use app\common\model\tcm\Diagnosis; use app\common\model\auth\Admin; use app\api\logic\ChatNotifyLogic; use app\adminapi\logic\tcm\PrescriptionLogic; +use app\adminapi\logic\tcm\DiagnosisLogic; +use app\adminapi\logic\tcm\BloodRecordLogic; +use app\adminapi\logic\doctor\DoctorNoteLogic; +use app\common\model\tcm\Prescription; +use app\common\service\wechat\WechatWorkAppMessageService; +use app\common\model\dict\DictData; use think\facade\Db; use think\facade\Log; @@ -444,4 +450,261 @@ class AppointmentLogic extends BaseLogic return false; } } + + /** + * @notes 接诊台聚合:单次返回挂号信息 + 诊单病例 + 血糖血压记录 + 助理姓名 + * 数据复用:detail() / DiagnosisLogic::detail() / BloodRecordLogic::getRecordsByPatient() + * 备注:appointment.patient_id 实际对应 tcm_diagnosis.id + * @param array $params + * @return array + */ + public static function reception(array $params): array + { + // 1) 挂号详情(已包含 patient_name / patient_phone / doctor_name / status_desc 等) + $appointment = self::detail($params); + if (empty($appointment)) { + return []; + } + + // 2) 诊单(病例)详情:appointment.patient_id == tcm_diagnosis.id + $diagnosisId = (int) ($appointment['patient_id'] ?? 0); + $diagnosis = $diagnosisId > 0 + ? DiagnosisLogic::detail(['id' => $diagnosisId]) + : []; + + // 3) 血糖血压记录 + $bloodRecords = $diagnosisId > 0 + ? BloodRecordLogic::getRecordsByPatient(['diagnosis_id' => $diagnosisId]) + : []; + + // 4) 补全医助姓名(detail() 未关联 admin 助理表) + $assistantName = ''; + if (!empty($diagnosis['assistant_id'])) { + $assistant = Admin::where('id', (int) $diagnosis['assistant_id'])->find(); + if ($assistant) { + $assistantName = $assistant->name ?? ''; + } + } + $appointment['assistant_name'] = $assistantName; + $appointment['assistant_id'] = $diagnosis['assistant_id'] ?? 0; + + // 5) 是否已开方(与列表口径一致:未删除 & 未作废) + $hasPrescription = 0; + if ($diagnosisId > 0) { + $rxExists = Prescription::where('diagnosis_id', $diagnosisId) + ->whereNull('delete_time') + ->where('void_status', 0) + ->find(); + $hasPrescription = $rxExists ? 1 : 0; + } + $appointment['has_prescription'] = $hasPrescription; + + // 6) 对诊单字段进行字典/枚举翻译(产出 *_text 附加字段,不覆盖原 value) + $diagnosis = self::enrichDiagnosisLabels($diagnosis); + + // 7) 医生备注 + $doctorNotes = $diagnosisId > 0 + ? DoctorNoteLogic::getByDiagnosis($diagnosisId) + : []; + + return [ + 'appointment' => $appointment, + 'diagnosis' => $diagnosis, + 'blood_records' => $bloodRecords, + 'doctor_notes' => $doctorNotes, + ]; + } + + /** + * 字典翻译:把诊单中以 code 存储的字段(字典/枚举)补一份中文 label 字段, + * 便于前端(接诊台等只读场景)直接渲染,无需加载字典。 + * 原始 code 字段保留不动,edit 场景仍可使用。 + * + * @param array $diagnosis + * @return array + */ + private static function enrichDiagnosisLabels(array $diagnosis): array + { + if (empty($diagnosis)) { + return $diagnosis; + } + + // 单值字段:value 为字典 value,翻译成字典 name + $singleDictFields = [ + 'diagnosis_type' => 'diagnosis_type', + 'syndrome_type' => 'syndrome_type', + 'diabetes_type' => 'diabetes_type', + 'water_intake' => 'water_intake', + 'weight_change' => 'weight_change', + 'fatty_liver_degree' => 'fatty_liver_degree', + ]; + // 多值字段:value 为数组或逗号分隔字符串 + $multiDictFields = [ + 'past_history' => 'past_history', + 'appetite' => 'appetite', + 'diet_condition' => 'diet_condition', + 'body_feeling' => 'body_feeling', + 'sleep_condition' => 'sleep_condition', + 'eye_condition' => 'eye_condition', + 'head_feeling' => 'head_feeling', + 'sweat_condition' => 'sweat_condition', + 'skin_condition' => 'skin_condition', + 'urine_condition' => 'urine_condition', + 'stool_condition' => 'stool_condition', + 'kidney_condition' => 'kidney_condition', + ]; + + // 一次性查出用到的所有字典 + $allTypes = array_values(array_unique(array_merge(array_values($singleDictFields), array_values($multiDictFields)))); + $dictMap = self::buildDictMap($allTypes); + + foreach ($singleDictFields as $field => $type) { + if (!array_key_exists($field, $diagnosis)) { + continue; + } + $diagnosis[$field . '_text'] = self::dictLabel($dictMap, $type, $diagnosis[$field]); + } + foreach ($multiDictFields as $field => $type) { + if (!array_key_exists($field, $diagnosis)) { + continue; + } + $v = $diagnosis[$field]; + $arr = is_array($v) + ? $v + : (is_string($v) && $v !== '' ? preg_split('/[,,、]/', $v) : []); + $labels = []; + foreach ($arr as $item) { + $item = is_string($item) ? trim($item) : $item; + if ($item === '' || $item === null) { + continue; + } + $labels[] = self::dictLabel($dictMap, $type, $item); + } + $diagnosis[$field . '_text'] = implode('、', array_filter($labels)); + } + + // 枚举字段 + $diagnosis['gender_text'] = isset($diagnosis['gender']) ? self::genderText((int) $diagnosis['gender']) : ''; + $diagnosis['marital_status_text'] = array_key_exists('marital_status', $diagnosis) ? self::maritalText($diagnosis['marital_status']) : ''; + foreach (['trauma_history', 'surgery_history', 'allergy_history', 'family_history', 'pregnancy_history'] as $f) { + if (array_key_exists($f, $diagnosis)) { + $diagnosis[$f . '_text'] = self::yesNoText($diagnosis[$f]); + } + } + + return $diagnosis; + } + + /** + * 构建 type_value => [value => name] 的两级查询映射 + * + * @param array $types + * @return array + */ + private static function buildDictMap(array $types): array + { + if (empty($types)) { + return []; + } + $rows = DictData::whereIn('type_value', $types) + ->field(['type_value', 'value', 'name']) + ->select() + ->toArray(); + $map = []; + foreach ($rows as $r) { + $tv = (string) ($r['type_value'] ?? ''); + $v = (string) ($r['value'] ?? ''); + $n = (string) ($r['name'] ?? ''); + if ($tv === '' || $v === '') { + continue; + } + $map[$tv][$v] = $n; + } + return $map; + } + + /** + * 找不到字典项时回显原值(避免空白) + */ + private static function dictLabel(array $dictMap, string $type, $value): string + { + if ($value === null || $value === '') { + return ''; + } + $key = (string) $value; + return $dictMap[$type][$key] ?? $key; + } + + private static function genderText(int $gender): string + { + if ($gender === 1) return '男'; + if ($gender === 0) return '女'; + return ''; + } + + private static function maritalText($v): string + { + if ($v === null || $v === '') return ''; + $n = (int) $v; + if ($n === 0) return '未婚'; + if ($n === 1) return '已婚'; + if ($n === 2) return '离异'; + return ''; + } + + private static function yesNoText($v): string + { + if ($v === null || $v === '') return ''; + return ((int) $v) === 1 ? '有' : '无'; + } + + /** + * @notes 通知接诊医助(按诊单 assistant_id 查企微 userid 后发应用消息) + * 文案固定:马上面诊到你对应的患者了,请联系患者进入诊室等待。 + * @param int $appointmentId + * @return array{ok: bool, message?: string} + */ + public static function notifyAssistant(int $appointmentId): array + { + try { + $appointment = Appointment::findOrEmpty($appointmentId); + if ($appointment->isEmpty()) { + return ['ok' => false, 'message' => '挂号记录不存在']; + } + + $diagnosis = Diagnosis::where('id', (int) $appointment->patient_id)->find(); + if (!$diagnosis) { + return ['ok' => false, 'message' => '未找到对应的诊单']; + } + $assistantId = (int) ($diagnosis->assistant_id ?? 0); + if ($assistantId <= 0) { + return ['ok' => false, 'message' => '该患者尚未指派医助']; + } + + $assistant = Admin::whereNull('delete_time')->find($assistantId); + if (!$assistant) { + return ['ok' => false, 'message' => '医助账号不存在']; + } + $wxId = trim((string) ($assistant->work_wechat_userid ?? '')); + if ($wxId === '') { + Log::warning("接诊台通知医助跳过:医助 admin_id={$assistantId} 未绑定 work_wechat_userid"); + return [ + 'ok' => false, + 'message' => '该医助未绑定企业微信账号,无法推送消息(请其在后台「扫码绑定企业微信」后再试)', + ]; + } + + $patientName = (string) ($diagnosis->patient_name ?? '患者'); + $text = "【接诊通知】马上面诊到你对应的患者了,请联系患者进入诊室等待。\n患者:{$patientName}\n时间:" . (string) $appointment->appointment_date . ' ' . (string) $appointment->appointment_time; + + $result = WechatWorkAppMessageService::sendTextToUser($wxId, $text); + if (empty($result['ok'])) { + Log::warning('接诊台通知医助失败:' . ($result['message'] ?? '')); + } + return $result; + } catch (\Throwable $e) { + Log::error('接诊台通知医助异常:' . $e->getMessage()); + return ['ok' => false, 'message' => '企业微信通知异常:' . $e->getMessage()]; + } + } } diff --git a/server/app/adminapi/logic/doctor/DoctorNoteLogic.php b/server/app/adminapi/logic/doctor/DoctorNoteLogic.php new file mode 100644 index 00000000..bbfd10e4 --- /dev/null +++ b/server/app/adminapi/logic/doctor/DoctorNoteLogic.php @@ -0,0 +1,121 @@ +<?php + +namespace app\adminapi\logic\doctor; + +use app\common\logic\BaseLogic; +use app\common\model\doctor\DoctorNote; + +class DoctorNoteLogic extends BaseLogic +{ + /** + * 按 diagnosis_id + 当天 find-or-create,追加 content / tongue_images + */ + public static function addOrAppend(array $params): bool + { + try { + $diagnosisId = (int) $params['diagnosis_id']; + $doctorId = (int) ($params['doctor_id'] ?? 0); + $today = date('Y-m-d'); + $time = date('H:i'); + + $existing = DoctorNote::where('diagnosis_id', $diagnosisId) + ->where('note_date', $today) + ->whereNull('delete_time') + ->find(); + + $newContent = trim($params['content'] ?? ''); + $newImages = $params['tongue_images'] ?? []; + if (is_string($newImages)) { + $newImages = json_decode($newImages, true) ?: []; + } + + if ($existing) { + $data = []; + + if ($newContent !== '') { + $prev = trim($existing->content ?? ''); + $line = "[{$time}] {$newContent}"; + $data['content'] = $prev !== '' ? ($prev . "\n" . $line) : $line; + } + + if (!empty($newImages)) { + $prev = $existing->tongue_images; + if (is_string($prev)) { + $prev = json_decode($prev, true) ?: []; + } + if (!is_array($prev)) { + $prev = []; + } + $merged = array_values(array_unique(array_merge($prev, $newImages))); + if (count($merged) > 9) { + $merged = array_slice($merged, 0, 9); + } + $data['tongue_images'] = json_encode($merged, JSON_UNESCAPED_UNICODE); + } + + if (!empty($data)) { + $existing->save($data); + } + } else { + $content = $newContent !== '' ? "[{$time}] {$newContent}" : ''; + DoctorNote::create([ + 'diagnosis_id' => $diagnosisId, + 'doctor_id' => $doctorId, + 'note_date' => $today, + 'content' => $content, + 'tongue_images' => !empty($newImages) + ? json_encode($newImages, JSON_UNESCAPED_UNICODE) + : null, + ]); + } + + return true; + } catch (\Exception $e) { + self::setError($e->getMessage()); + return false; + } + } + + /** + * 按 diagnosis_id 获取备注列表(note_date DESC) + */ + public static function getByDiagnosis(int $diagnosisId, int $limit = 30): array + { + try { + if ($diagnosisId <= 0) { + return []; + } + + $records = DoctorNote::where('diagnosis_id', $diagnosisId) + ->whereNull('delete_time') + ->order('note_date', 'desc') + ->limit($limit) + ->select() + ->toArray(); + + $domain = request()->domain(); + + foreach ($records as &$record) { + $images = $record['tongue_images'] ?? []; + if (is_string($images)) { + $images = json_decode($images, true) ?: []; + } + if (!is_array($images)) { + $images = []; + } + $record['tongue_images'] = array_map(function ($url) use ($domain) { + if (empty($url)) return $url; + if (stripos($url, 'http://') === 0 || stripos($url, 'https://') === 0) { + return $url; + } + return $domain . '/' . $url; + }, $images); + } + + return $records; + } catch (\Exception $e) { + self::setError($e->getMessage()); + return []; + } + } +} diff --git a/server/app/adminapi/validate/doctor/AppointmentValidate.php b/server/app/adminapi/validate/doctor/AppointmentValidate.php index 63eb3fd9..7956a79a 100644 --- a/server/app/adminapi/validate/doctor/AppointmentValidate.php +++ b/server/app/adminapi/validate/doctor/AppointmentValidate.php @@ -19,6 +19,7 @@ class AppointmentValidate extends BaseValidate 'id' => 'require', 'patient_id' => 'require|integer', 'doctor_id' => 'require|integer', + 'diagnosis_id' => 'require|integer', 'appointment_date' => 'require|date', 'period' => 'in:morning,afternoon,all', 'appointment_time' => 'require', @@ -34,6 +35,7 @@ class AppointmentValidate extends BaseValidate 'id' => '预约ID', 'patient_id' => '患者ID', 'doctor_id' => '医生ID', + 'diagnosis_id' => '诊单ID', 'appointment_date' => '预约日期', 'period' => '时段', 'appointment_time' => '预约时间', @@ -85,4 +87,32 @@ class AppointmentValidate extends BaseValidate { return $this->only(['id']); } + + /** + * @notes 接诊台聚合详情场景 + * @return AppointmentValidate + */ + public function sceneReception() + { + return $this->only(['id']); + } + + /** + * @notes 通知接诊医助场景 + * @return AppointmentValidate + */ + public function sceneNotifyAssistant() + { + return $this->only(['id']); + } + + public function sceneAddDoctorNote() + { + return $this->only(['diagnosis_id']); + } + + public function sceneDoctorNotes() + { + return $this->only(['diagnosis_id']); + } } diff --git a/server/app/common/model/doctor/DoctorNote.php b/server/app/common/model/doctor/DoctorNote.php new file mode 100644 index 00000000..92e94901 --- /dev/null +++ b/server/app/common/model/doctor/DoctorNote.php @@ -0,0 +1,17 @@ +<?php + +namespace app\common\model\doctor; + +use app\common\model\BaseModel; + +class DoctorNote extends BaseModel +{ + protected $name = 'doctor_note'; + + protected $autoWriteTimestamp = true; + protected $createTime = 'create_time'; + protected $updateTime = 'update_time'; + protected $deleteTime = 'delete_time'; + + protected $dateFormat = false; +} diff --git a/server/sql/1.9.20260421/add_doctor_note_table.sql b/server/sql/1.9.20260421/add_doctor_note_table.sql new file mode 100644 index 00000000..e11f290b --- /dev/null +++ b/server/sql/1.9.20260421/add_doctor_note_table.sql @@ -0,0 +1,16 @@ +-- 医生接诊备注表(按天一条,多次追加更新) + +CREATE TABLE IF NOT EXISTS `zyt_doctor_note` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `diagnosis_id` int(11) unsigned NOT NULL COMMENT '诊单ID (tcm_diagnosis.id)', + `doctor_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '医生ID (system_admin.id)', + `note_date` date NOT NULL COMMENT '记录日期', + `content` text DEFAULT NULL COMMENT '备注文字(多次追加以换行分隔,带时间戳前缀)', + `tongue_images` json DEFAULT NULL COMMENT '舌苔/截屏照片路径数组', + `create_time` int(10) unsigned NOT NULL DEFAULT 0, + `update_time` int(10) unsigned NOT NULL DEFAULT 0, + `delete_time` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_diagnosis_date` (`diagnosis_id`, `note_date`), + KEY `idx_doctor` (`doctor_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='医生接诊备注'; diff --git a/server/sql/1.9.20260421/add_patient_reception_menu.sql b/server/sql/1.9.20260421/add_patient_reception_menu.sql new file mode 100644 index 00000000..88b8e522 --- /dev/null +++ b/server/sql/1.9.20260421/add_patient_reception_menu.sql @@ -0,0 +1,23 @@ +-- 患者管理(一级目录) + 接诊台(二级菜单) + 查看 / 完成接诊 两个按钮权限 + +INSERT INTO `zyt_system_menu` +(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`) +VALUES +(0, 'M', '患者管理', 'el-icon-User', 95, '', '/patient', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); + +SET @patient_pid = LAST_INSERT_ID(); + +INSERT INTO `zyt_system_menu` +(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`) +VALUES +(@patient_pid, 'C', '接诊台', '', 1, 'doctor.appointment/lists', 'reception', 'patient/reception/index', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); + +SET @reception_menu_id = LAST_INSERT_ID(); + +INSERT INTO `zyt_system_menu` +(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`) +VALUES +(@reception_menu_id, 'A', '查看', '', 1, 'doctor.appointment/reception', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(@reception_menu_id, 'A', '完成接诊', '', 2, 'doctor.appointment/complete', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(@reception_menu_id, 'A', '编辑病历', '', 3, 'tcm.diagnosis/edit', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), +(@reception_menu_id, 'A', '备注', '', 4, 'doctor.appointment/addDoctorNote', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); diff --git a/ui-project/untitled.pen b/ui-project/untitled.pen new file mode 100644 index 00000000..03aa4e9c --- /dev/null +++ b/ui-project/untitled.pen @@ -0,0 +1,1011 @@ +{ + "version": "2.11", + "children": [ + { + "type": "frame", + "id": "bi8Au", + "x": 0, + "y": 0, + "name": "Frame", + "clip": true, + "width": 1440, + "height": 1280, + "fill": "$bg", + "layout": "vertical", + "gap": 20, + "padding": [ + 24, + 24, + 28, + 24 + ], + "children": [ + { + "type": "frame", + "id": "N9881", + "name": "header1", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "hZlyc", + "name": "headerLeft1", + "layout": "vertical", + "gap": 6, + "children": [ + { + "type": "text", + "id": "i2yrnT", + "name": "headerEyebrow1", + "fill": "$accent", + "content": "TCM CONSULTATION DESK", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "500", + "letterSpacing": 0.08 + }, + { + "type": "text", + "id": "ddJRm", + "name": "headerTitle1", + "fill": "$ink", + "content": "今日待接诊", + "fontFamily": "$font-heading", + "fontSize": 30, + "fontWeight": "700" + }, + { + "type": "text", + "id": "zQYLh", + "name": "headerDesc1", + "fill": "$muted", + "content": "仅显示今天状态为待接诊的患者队列,左侧选人,右侧处理。", + "fontFamily": "$font-body", + "fontSize": 14, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "cRVHf", + "name": "headerMeta1", + "fill": "$muted", + "content": "2026-04-29 周三", + "fontFamily": "IBM Plex Mono", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "PoApq", + "name": "headerRight1", + "gap": 12, + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "G1buhl", + "name": "livePill1", + "fill": "$surface", + "cornerRadius": 16, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$line" + }, + "gap": 8, + "padding": [ + 10, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "ellipse", + "id": "hLADD", + "name": "liveDot1", + "fill": "$success", + "width": 8, + "height": 8 + }, + { + "type": "text", + "id": "X6yXq", + "name": "liveText1", + "fill": "$ink", + "content": "实时刷新 20s", + "fontFamily": "$font-data", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Y1Nz2r", + "name": "refreshBtn1", + "fill": "$accent-soft", + "cornerRadius": 16, + "gap": 8, + "padding": [ + 10, + 14 + ], + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "B9uYq", + "name": "refreshText1", + "fill": "$accent", + "content": "手动刷新", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "600" + } + ] + } + ] + } + ] + }, + { + "type": "frame", + "id": "jzlvR", + "name": "filterShell1", + "width": "fill_container", + "fill": "$surface", + "cornerRadius": 12, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$line" + }, + "layout": "vertical", + "gap": 12, + "padding": [ + 12, + 16 + ], + "children": [ + { + "type": "frame", + "id": "b1JZpo", + "name": "filterTop1", + "width": "fill_container", + "gap": 12, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "frame", + "id": "wkJ6p", + "name": "searchBox1", + "width": 280, + "fill": "#FFFFFF", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#DCDFE6" + }, + "padding": [ + 10, + 12 + ], + "children": [ + { + "type": "text", + "id": "JkuqL", + "name": "searchText1", + "fill": "#909399", + "content": "请输入患者姓名", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "mTW9F", + "name": "filterHint1", + "fill": "#909399", + "content": "仅显示 今日待接诊 · 未开方 患者", + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "MJP3r", + "name": "mainArea1", + "width": "fill_container", + "height": "fill_container", + "gap": 14, + "children": [ + { + "type": "frame", + "id": "D4iwi", + "name": "queueCol1", + "width": 270, + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "fPiHt", + "name": "queuePanel1", + "width": "fill_container", + "height": "fill_container", + "fill": "$surface", + "cornerRadius": 12, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$line" + }, + "layout": "vertical", + "gap": 10, + "padding": 12, + "children": [ + { + "type": "frame", + "id": "c4GLym", + "name": "queueHead1", + "width": "fill_container", + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "U67w2R", + "name": "queueTitle1", + "fill": "$ink", + "content": "待接诊队列", + "fontFamily": "Geist", + "fontSize": 15, + "fontWeight": "700" + }, + { + "type": "text", + "id": "cLBoV", + "name": "queueMeta1", + "fill": "$muted", + "content": "18 人", + "fontFamily": "IBM Plex Mono", + "fontSize": 12, + "fontWeight": "500" + } + ] + }, + { + "type": "frame", + "id": "Vy2l6", + "name": "rowA1", + "width": "fill_container", + "fill": "#F5F7FA", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#409EFF" + }, + "padding": 10, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "R8gOpa", + "name": "rowAName1", + "fill": "#303133", + "textGrowth": "fixed-width", + "width": 150, + "content": "王桂芳 女 54岁\n09:30 · 医助 李晴", + "lineHeight": 1.35, + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon_font", + "id": "h3Iix", + "width": 18, + "height": 18, + "iconFontName": "phone", + "iconFontFamily": "lucide", + "fill": "$accent" + } + ] + }, + { + "type": "frame", + "id": "QmenJ", + "name": "rowB1", + "width": "fill_container", + "fill": "#FFFFFF", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#EBEEF5" + }, + "padding": 10, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "FIO8H", + "name": "rowBName1", + "fill": "#303133", + "textGrowth": "fixed-width", + "width": 150, + "content": "陈建国 男 47岁\n10:00 · 医助 李晴", + "lineHeight": 1.35, + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon_font", + "id": "WZsvR", + "width": 18, + "height": 18, + "iconFontName": "phone", + "iconFontFamily": "lucide", + "fill": "$accent" + } + ] + }, + { + "type": "frame", + "id": "GsbWq", + "name": "rowC1", + "width": "fill_container", + "fill": "#FFFFFF", + "cornerRadius": 6, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#EBEEF5" + }, + "padding": 10, + "justifyContent": "space_between", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "aHKbK", + "name": "rowCName1", + "fill": "#303133", + "textGrowth": "fixed-width", + "width": 150, + "content": "刘晓燕 女 61岁\n10:40 · 医助 王敏", + "lineHeight": 1.35, + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "600" + }, + { + "type": "icon_font", + "id": "zvZNE", + "width": 18, + "height": 18, + "iconFontName": "phone", + "iconFontFamily": "lucide", + "fill": "$accent" + } + ] + }, + { + "type": "text", + "id": "oqtIP", + "name": "queueHint1", + "fill": "#909399", + "content": "点击电话发起通话", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "500" + } + ] + } + ] + }, + { + "type": "frame", + "id": "eIUBi", + "name": "sidebar1", + "width": "fill_container", + "height": "fill_container", + "layout": "vertical", + "gap": 18, + "children": [ + { + "type": "frame", + "id": "o7d0x", + "name": "sidebarTop1", + "width": "fill_container", + "fill": "$surface", + "cornerRadius": 12, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$line" + }, + "layout": "vertical", + "gap": 10, + "padding": 16, + "children": [ + { + "type": "text", + "id": "VzC2H", + "name": "patientCardTitle1", + "fill": "#303133", + "content": "患者信息", + "fontFamily": "Geist", + "fontSize": 16, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "U6ehR", + "name": "patientHero1", + "width": "fill_container", + "fill": "#F5F7FA", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#EBEEF5" + }, + "layout": "vertical", + "gap": 6, + "padding": 12, + "children": [ + { + "type": "text", + "id": "xE8jJ", + "name": "patientName1", + "fill": "#303133", + "content": "王桂芳", + "fontFamily": "Geist", + "fontSize": 24, + "fontWeight": "700" + }, + { + "type": "text", + "id": "DpFh8", + "name": "patientMeta1", + "fill": "#606266", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "138****2981 · 女 · 54岁\n162cm / 61kg · 江苏苏州\n预约:09:30 · 上午\n医生:张医生 医助:李晴\n状态:待接诊 · 未开方\n备注:空腹血糖偏高,需优先接诊", + "lineHeight": 1.5, + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + } + ] + } + ] + }, + { + "type": "frame", + "id": "HjFMA", + "name": "sidebarBottom1", + "width": "fill_container", + "height": "fill_container", + "fill": "$surface", + "cornerRadius": 12, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "$line" + }, + "layout": "vertical", + "gap": 14, + "padding": 16, + "children": [ + { + "type": "text", + "id": "cVR2V", + "name": "caseTitle1", + "fill": "$ink", + "content": "患者病例", + "fontFamily": "Geist", + "fontSize": 16, + "fontWeight": "700" + }, + { + "type": "frame", + "id": "e6zlH", + "name": "casePaper1", + "width": "fill_container", + "fill": "#FFFFFF", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#EBEEF5" + }, + "layout": "vertical", + "gap": 10, + "padding": 14, + "children": [ + { + "type": "text", + "id": "uEc2r", + "name": "caseMeta1", + "fill": "#909399", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "初诊 | 诊断日期 2026-04-29 | 诊断类型 消渴 | 证型 气阴两虚", + "fontFamily": "IBM Plex Mono", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "DFXeR", + "name": "chiefLabel1", + "fill": "$ink", + "content": "主诉", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "r7shaE", + "name": "chiefBody1", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "近两周空腹血糖波动明显,晨起口干,夜间睡眠浅,偶有双足麻木。", + "lineHeight": 1.55, + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "VwDkg", + "name": "historyLabel1", + "fill": "$ink", + "content": "现病史 / 既往史", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "jjxKR", + "name": "historyBody1", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "2 型糖尿病 8 年,高血压病史 5 年。近 3 月空腹血糖多在 8.5-10.2 mmol/L 波动,近期饮食控制一般。", + "lineHeight": 1.55, + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "AxVdf", + "name": "zhLabel1", + "fill": "$ink", + "content": "中医四诊与辨证", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "m0WNl1", + "name": "zhBody1", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "舌苔:薄黄\n脉象:细数\n治则:益气养阴,和胃生津", + "lineHeight": 1.55, + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "hyTrH", + "name": "rxLabel1", + "fill": "$ink", + "content": "处方意见", + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "700" + }, + { + "type": "text", + "id": "DKf9G", + "name": "rxBody1", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": "fill_container", + "content": "当前未开方。建议先完成问诊沟通,确认近期餐后血糖、睡眠与饮食依从性后再定方。", + "lineHeight": 1.55, + "fontFamily": "Geist", + "fontSize": 13, + "fontWeight": "normal" + } + ] + }, + { + "type": "text", + "id": "J6aHmf", + "name": "metricTitle1", + "fill": "$ink", + "content": "血糖血压记录", + "fontFamily": "Geist", + "fontSize": 16, + "fontWeight": "700" + }, + { + "type": "text", + "id": "lD3mp", + "name": "metricHint2", + "fill": "#909399", + "content": "左右滑动查看全部字段", + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "normal" + }, + { + "type": "frame", + "id": "A53BJm", + "name": "metricViewport2", + "clip": true, + "width": "fill_container", + "height": 338, + "fill": "#FFFFFF", + "cornerRadius": 8, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#EBEEF5" + }, + "layout": "none", + "children": [ + { + "type": "frame", + "id": "BE0mt", + "x": 0, + "y": 0, + "name": "metricInner2", + "width": 1180, + "fill": "#FFFFFF", + "layout": "vertical", + "gap": 8, + "padding": 12, + "children": [ + { + "type": "text", + "id": "YCrvH", + "name": "metricHead3", + "fill": "$ink", + "textGrowth": "fixed-width", + "width": 1160, + "content": "记录日期 记录时间 空腹血糖(mmol/L) 餐后2小时血糖(mmol/L) 其他血糖(mmol/L) 血压(mmHg) 西药 胰岛素 备注", + "fontFamily": "IBM Plex Mono", + "fontSize": 12, + "fontWeight": "700" + }, + { + "type": "text", + "id": "BJkw7", + "name": "metricRowA", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-29 — 4.8 — — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "bIZua", + "name": "metricRowB", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-28 — 6.1 6 — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "WUcgG", + "name": "metricRowC", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-27 — 4.9 6.5 — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "GmPCh", + "name": "metricRowD", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-26 — 5.4 5.9 — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "MeXjg", + "name": "metricRowE", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-25 — 4.8 8.2 — — — — 减半片达格列净", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "M1Aox", + "name": "metricRowF", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-24 — 6 — — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Pz6rl", + "name": "metricRowG", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-23 — 5 6.2 — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "Cbd0d", + "name": "metricRowH", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-21 — 5.2 — — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "gEy4w", + "name": "metricRowI", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-20 — 6.1 5.4 — — — — —", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "fHVsn", + "name": "metricRowJ", + "fill": "$muted", + "textGrowth": "fixed-width", + "width": 1160, + "content": "2026-04-19 — 5.9 5.7 — — 达格列净早一片,沙格列汀二甲双胍缓释...", + "fontFamily": "IBM Plex Mono", + "fontSize": 11, + "fontWeight": "normal" + }, + { + "type": "text", + "id": "GOeP1", + "name": "metricNote2", + "fill": "#909399", + "textGrowth": "fixed-width", + "width": 1160, + "content": "已展示全部录入记录,字段与编辑诊单中的血糖血压记录保持一致。", + "fontFamily": "Geist", + "fontSize": 12, + "fontWeight": "normal" + } + ] + }, + { + "type": "rectangle", + "cornerRadius": 4, + "id": "uSMS9", + "x": 20, + "y": 318, + "name": "scrollTrack2", + "fill": "#EBEEF5", + "width": 220, + "height": 4 + }, + { + "type": "rectangle", + "cornerRadius": 4, + "id": "La8Dq", + "x": 20, + "y": 318, + "name": "scrollThumb2", + "fill": "#C0C4CC", + "width": 96, + "height": 4 + } + ] + } + ] + }, + { + "type": "frame", + "id": "V2cCA5", + "layoutPosition": "absolute", + "x": 980, + "y": 648, + "name": "floatFinish1", + "fill": "$success", + "cornerRadius": 20, + "stroke": { + "align": "inside", + "thickness": 1, + "fill": "#FFFFFF66" + }, + "effect": [ + { + "type": "shadow", + "shadowType": "outer", + "color": "#67C23A26", + "offset": { + "x": 0, + "y": 10 + }, + "blur": 24 + }, + { + "type": "shadow", + "shadowType": "outer", + "color": "#30313314", + "offset": { + "x": 0, + "y": 3 + }, + "blur": 8 + } + ], + "padding": [ + 14, + 20 + ], + "justifyContent": "center", + "alignItems": "center", + "children": [ + { + "type": "text", + "id": "s3lzTi", + "name": "floatFinishText1", + "fill": "$surface", + "content": "完成接诊", + "fontFamily": "Geist", + "fontSize": 14, + "fontWeight": "700" + } + ] + } + ] + } + ] + } + ] + } + ], + "variables": { + "accent": { + "type": "color", + "value": "#409EFF" + }, + "accent-soft": { + "type": "color", + "value": "#ECF5FF" + }, + "bg": { + "type": "color", + "value": "#F5F7FA" + }, + "danger": { + "type": "color", + "value": "#F56C6C" + }, + "danger-soft": { + "type": "color", + "value": "#FEF0F0" + }, + "font-body": { + "type": "string", + "value": "Geist" + }, + "font-data": { + "type": "string", + "value": "IBM Plex Mono" + }, + "font-heading": { + "type": "string", + "value": "Geist" + }, + "info": { + "type": "color", + "value": "#909399" + }, + "info-soft": { + "type": "color", + "value": "#F4F4F5" + }, + "ink": { + "type": "color", + "value": "#303133" + }, + "line": { + "type": "color", + "value": "#EBEEF5" + }, + "muted": { + "type": "color", + "value": "#606266" + }, + "success": { + "type": "color", + "value": "#67C23A" + }, + "success-soft": { + "type": "color", + "value": "#F0F9EB" + }, + "surface": { + "type": "color", + "value": "#FFFFFF" + }, + "surface-strong": { + "type": "color", + "value": "#F5F7FA" + }, + "warn": { + "type": "color", + "value": "#E6A23C" + }, + "warn-soft": { + "type": "color", + "value": "#FDF6EC" + } + } +} \ No newline at end of file From 64a914c05ad2366c4e913a79300bf89ba06ecfc4 Mon Sep 17 00:00:00 2001 From: ShengLong <452591453@qq.com> Date: Thu, 30 Apr 2026 09:16:18 +0800 Subject: [PATCH 2/3] 1 --- .cursor/commands/trellis-before-dev.md | 29 - .cursor/commands/trellis-brainstorm.md | 487 -------- .cursor/commands/trellis-break-loop.md | 107 -- .cursor/commands/trellis-check-cross-layer.md | 153 --- .cursor/commands/trellis-check.md | 25 - .cursor/commands/trellis-create-command.md | 154 --- .cursor/commands/trellis-finish-work.md | 143 --- .cursor/commands/trellis-integrate-skill.md | 219 ---- .cursor/commands/trellis-onboard.md | 358 ------ .cursor/commands/trellis-record-session.md | 62 - .cursor/commands/trellis-start.md | 373 ------ .cursor/commands/trellis-update-spec.md | 354 ------ .cursor/skills/ui-ux-pro-max/SKILL.md | 288 ----- .cursor/skills/ui-ux-pro-max/data/charts.csv | 26 - .cursor/skills/ui-ux-pro-max/data/colors.csv | 97 -- .cursor/skills/ui-ux-pro-max/data/icons.csv | 101 -- .cursor/skills/ui-ux-pro-max/data/landing.csv | 31 - .../skills/ui-ux-pro-max/data/products.csv | 97 -- .../ui-ux-pro-max/data/react-performance.csv | 45 - .../ui-ux-pro-max/data/stacks/astro.csv | 54 - .../ui-ux-pro-max/data/stacks/flutter.csv | 53 - .../data/stacks/html-tailwind.csv | 56 - .../data/stacks/jetpack-compose.csv | 53 - .../ui-ux-pro-max/data/stacks/nextjs.csv | 53 - .../ui-ux-pro-max/data/stacks/nuxt-ui.csv | 51 - .../ui-ux-pro-max/data/stacks/nuxtjs.csv | 59 - .../data/stacks/react-native.csv | 52 - .../ui-ux-pro-max/data/stacks/react.csv | 54 - .../ui-ux-pro-max/data/stacks/shadcn.csv | 61 - .../ui-ux-pro-max/data/stacks/svelte.csv | 54 - .../ui-ux-pro-max/data/stacks/swiftui.csv | 51 - .../skills/ui-ux-pro-max/data/stacks/vue.csv | 50 - .cursor/skills/ui-ux-pro-max/data/styles.csv | 68 -- .../skills/ui-ux-pro-max/data/typography.csv | 58 - .../ui-ux-pro-max/data/ui-reasoning.csv | 101 -- .../ui-ux-pro-max/data/ux-guidelines.csv | 100 -- .../ui-ux-pro-max/data/web-interface.csv | 31 - .../scripts/__pycache__/core.cpython-314.pyc | Bin 12619 -> 0 bytes .../__pycache__/design_system.cpython-314.pyc | Bin 62939 -> 0 bytes .../__pycache__/search.cpython-314.pyc | Bin 6584 -> 0 bytes .cursor/skills/ui-ux-pro-max/scripts/core.py | 253 ---- .../ui-ux-pro-max/scripts/design_system.py | 1067 ----------------- .../skills/ui-ux-pro-max/scripts/search.py | 114 -- .gitignore | 4 + 44 files changed, 4 insertions(+), 5642 deletions(-) delete mode 100644 .cursor/commands/trellis-before-dev.md delete mode 100644 .cursor/commands/trellis-brainstorm.md delete mode 100644 .cursor/commands/trellis-break-loop.md delete mode 100644 .cursor/commands/trellis-check-cross-layer.md delete mode 100644 .cursor/commands/trellis-check.md delete mode 100644 .cursor/commands/trellis-create-command.md delete mode 100644 .cursor/commands/trellis-finish-work.md delete mode 100644 .cursor/commands/trellis-integrate-skill.md delete mode 100644 .cursor/commands/trellis-onboard.md delete mode 100644 .cursor/commands/trellis-record-session.md delete mode 100644 .cursor/commands/trellis-start.md delete mode 100644 .cursor/commands/trellis-update-spec.md delete mode 100644 .cursor/skills/ui-ux-pro-max/SKILL.md delete mode 100644 .cursor/skills/ui-ux-pro-max/data/charts.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/colors.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/icons.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/landing.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/products.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/react-performance.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/astro.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/flutter.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/nextjs.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/react-native.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/react.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/shadcn.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/svelte.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/swiftui.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/stacks/vue.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/styles.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/typography.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/ui-reasoning.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/ux-guidelines.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/data/web-interface.csv delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/core.py delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/design_system.py delete mode 100644 .cursor/skills/ui-ux-pro-max/scripts/search.py diff --git a/.cursor/commands/trellis-before-dev.md b/.cursor/commands/trellis-before-dev.md deleted file mode 100644 index d0807655..00000000 --- a/.cursor/commands/trellis-before-dev.md +++ /dev/null @@ -1,29 +0,0 @@ -Read the relevant development guidelines before starting your task. - -Execute these steps: - -1. **Discover packages and their spec layers**: - ```bash - python3 ./.trellis/scripts/get_context.py --mode packages - ``` - -2. **Identify which specs apply** to your task based on: - - Which package you're modifying (e.g., `cli/`, `docs-site/`) - - What type of work (backend, frontend, unit-test, docs, etc.) - -3. **Read the spec index** for each relevant module: - ```bash - cat .trellis/spec/<package>/<layer>/index.md - ``` - Follow the **"Pre-Development Checklist"** section in the index. - -4. **Read the specific guideline files** listed in the Pre-Development Checklist that are relevant to your task. The index is NOT the goal — it points you to the actual guideline files (e.g., `error-handling.md`, `conventions.md`, `mock-strategies.md`). Read those files to understand the coding standards and patterns. - -5. **Always read shared guides**: - ```bash - cat .trellis/spec/guides/index.md - ``` - -6. Understand the coding standards and patterns you need to follow, then proceed with your development plan. - -This step is **mandatory** before writing any code. diff --git a/.cursor/commands/trellis-brainstorm.md b/.cursor/commands/trellis-brainstorm.md deleted file mode 100644 index a09db1a7..00000000 --- a/.cursor/commands/trellis-brainstorm.md +++ /dev/null @@ -1,487 +0,0 @@ -# Brainstorm - Requirements Discovery (AI Coding Enhanced) - -Guide AI through collaborative requirements discovery **before implementation**, optimized for AI coding workflows: - -* **Task-first** (capture ideas immediately) -* **Action-before-asking** (reduce low-value questions) -* **Research-first** for technical choices (avoid asking users to invent options) -* **Diverge → Converge** (expand thinking, then lock MVP) - ---- - -## When to Use - -Triggered from `/trellis-start` when the user describes a development task, especially when: - -* requirements are unclear or evolving -* there are multiple valid implementation paths -* trade-offs matter (UX, reliability, maintainability, cost, performance) -* the user might not know the best options up front - ---- - -## Core Principles (Non-negotiable) - -1. **Task-first (capture early)** - Always ensure a task exists at the start so the user's ideas are recorded immediately. - -2. **Action before asking** - If you can derive the answer from repo code, docs, configs, conventions, or quick research — do that first. - -3. **One question per message** - Never overwhelm the user with a list of questions. Ask one, update PRD, repeat. - -4. **Prefer concrete options** - For preference/decision questions, present 2–3 feasible, specific approaches with trade-offs. - -5. **Research-first for technical choices** - If the decision depends on industry conventions / similar tools / established patterns, do research first, then propose options. - -6. **Diverge → Converge** - After initial understanding, proactively consider future evolution, related scenarios, and failure/edge cases — then converge to an MVP with explicit out-of-scope. - -7. **No meta questions** - Do not ask "should I search?" or "can you paste the code so I can continue?" - If you need information: search/inspect. If blocked: ask the minimal blocking question. - ---- - -## Step 0: Ensure Task Exists (ALWAYS) - -Before any Q&A, ensure a task exists. If none exists, create one immediately. - -* Use a **temporary working title** derived from the user's message. -* It's OK if the title is imperfect — refine later in PRD. - -```bash -TASK_DIR=$(python3 ./.trellis/scripts/task.py create "brainstorm: <short goal>" --slug <auto>) -``` - -Create/seed `prd.md` immediately with what you know: - -```markdown -# brainstorm: <short goal> - -## Goal - -<one paragraph: what + why> - -## What I already know - -* <facts from user message> -* <facts discovered from repo/docs> - -## Assumptions (temporary) - -* <assumptions to validate> - -## Open Questions - -* <ONLY Blocking / Preference questions; keep list short> - -## Requirements (evolving) - -* <start with what is known> - -## Acceptance Criteria (evolving) - -* [ ] <testable criterion> - -## Definition of Done (team quality bar) - -* Tests added/updated (unit/integration where appropriate) -* Lint / typecheck / CI green -* Docs/notes updated if behavior changes -* Rollout/rollback considered if risky - -## Out of Scope (explicit) - -* <what we will not do in this task> - -## Technical Notes - -* <files inspected, constraints, links, references> -* <research notes summary if applicable> -``` - ---- - -## Step 1: Auto-Context (DO THIS BEFORE ASKING QUESTIONS) - -Before asking questions like "what does the code look like?", gather context yourself: - -### Repo inspection checklist - -* Identify likely modules/files impacted -* Locate existing patterns (similar features, conventions, error handling style) -* Check configs, scripts, existing command definitions -* Note any constraints (runtime, dependency policy, build tooling) - -### Documentation checklist - -* Look for existing PRDs/specs/templates -* Look for command usage examples, README, ADRs if any - -Write findings into PRD: - -* Add to `What I already know` -* Add constraints/links to `Technical Notes` - ---- - -## Step 2: Classify Complexity (still useful, not gating task creation) - -| Complexity | Criteria | Action | -| ------------ | ------------------------------------------------------ | ------------------------------------------- | -| **Trivial** | Single-line fix, typo, obvious change | Skip brainstorm, implement directly | -| **Simple** | Clear goal, 1–2 files, scope well-defined | Ask 1 confirm question, then implement | -| **Moderate** | Multiple files, some ambiguity | Light brainstorm (2–3 high-value questions) | -| **Complex** | Vague goal, architectural choices, multiple approaches | Full brainstorm | - -> Note: Task already exists from Step 0. Classification only affects depth of brainstorming. - ---- - -## Step 3: Question Gate (Ask ONLY high-value questions) - -Before asking ANY question, run the following gate: - -### Gate A — Can I derive this without the user? - -If answer is available via: - -* repo inspection (code/config) -* docs/specs/conventions -* quick market/OSS research - -→ **Do not ask.** Fetch it, summarize, update PRD. - -### Gate B — Is this a meta/lazy question? - -Examples: - -* "Should I search?" -* "Can you paste the code so I can proceed?" -* "What does the code look like?" (when repo is available) - -→ **Do not ask.** Take action. - -### Gate C — What type of question is it? - -* **Blocking**: cannot proceed without user input -* **Preference**: multiple valid choices, depends on product/UX/risk preference -* **Derivable**: should be answered by inspection/research - -→ Only ask **Blocking** or **Preference**. - ---- - -## Step 4: Research-first Mode (Mandatory for technical choices) - -### Trigger conditions (any → research-first) - -* The task involves selecting an approach, library, protocol, framework, template system, plugin mechanism, or CLI UX convention -* The user asks for "best practice", "how others do it", "recommendation" -* The user can't reasonably enumerate options - -### Research steps - -1. Identify 2–4 comparable tools/patterns -2. Summarize common conventions and why they exist -3. Map conventions onto our repo constraints -4. Produce **2–3 feasible approaches** for our project - -### Research output format (PRD) - -Add a section in PRD (either within Technical Notes or as its own): - -```markdown -## Research Notes - -### What similar tools do - -* ... -* ... - -### Constraints from our repo/project - -* ... - -### Feasible approaches here - -**Approach A: <name>** (Recommended) - -* How it works: -* Pros: -* Cons: - -**Approach B: <name>** - -* How it works: -* Pros: -* Cons: - -**Approach C: <name>** (optional) - -* ... -``` - -Then ask **one** preference question: - -* "Which approach do you prefer: A / B / C (or other)?" - ---- - -## Step 5: Expansion Sweep (DIVERGE) — Required after initial understanding - -After you can summarize the goal, proactively broaden thinking before converging. - -### Expansion categories (keep to 1–2 bullets each) - -1. **Future evolution** - - * What might this feature become in 1–3 months? - * What extension points are worth preserving now? - -2. **Related scenarios** - - * What adjacent commands/flows should remain consistent with this? - * Are there parity expectations (create vs update, import vs export, etc.)? - -3. **Failure & edge cases** - - * Conflicts, offline/network failure, retries, idempotency, compatibility, rollback - * Input validation, security boundaries, permission checks - -### Expansion message template (to user) - -```markdown -I understand you want to implement: <current goal>. - -Before diving into design, let me quickly diverge to consider three categories (to avoid rework later): - -1. Future evolution: <1–2 bullets> -2. Related scenarios: <1–2 bullets> -3. Failure/edge cases: <1–2 bullets> - -For this MVP, which would you like to include (or none)? - -1. Current requirement only (minimal viable) -2. Add <X> (reserve for future extension) -3. Add <Y> (improve robustness/consistency) -4. Other: describe your preference -``` - -Then update PRD: - -* What's in MVP → `Requirements` -* What's excluded → `Out of Scope` - ---- - -## Step 6: Q&A Loop (CONVERGE) - -### Rules - -* One question per message -* Prefer multiple-choice when possible -* After each user answer: - - * Update PRD immediately - * Move answered items from `Open Questions` → `Requirements` - * Update `Acceptance Criteria` with testable checkboxes - * Clarify `Out of Scope` - -### Question priority (recommended) - -1. **MVP scope boundary** (what is included/excluded) -2. **Preference decisions** (after presenting concrete options) -3. **Failure/edge behavior** (only for MVP-critical paths) -4. **Success metrics & Acceptance Criteria** (what proves it works) - -### Preferred question format (multiple choice) - -```markdown -For <topic>, which approach do you prefer? - -1. **Option A** — <what it means + trade-off> -2. **Option B** — <what it means + trade-off> -3. **Option C** — <what it means + trade-off> -4. **Other** — describe your preference -``` - ---- - -## Step 7: Propose Approaches + Record Decisions (Complex tasks) - -After requirements are clear enough, propose 2–3 approaches (if not already done via research-first): - -```markdown -Based on current information, here are 2–3 feasible approaches: - -**Approach A: <name>** (Recommended) - -* How: -* Pros: -* Cons: - -**Approach B: <name>** - -* How: -* Pros: -* Cons: - -Which direction do you prefer? -``` - -Record the outcome in PRD as an ADR-lite section: - -```markdown -## Decision (ADR-lite) - -**Context**: Why this decision was needed -**Decision**: Which approach was chosen -**Consequences**: Trade-offs, risks, potential future improvements -``` - ---- - -## Step 8: Final Confirmation + Implementation Plan - -When open questions are resolved, confirm complete requirements with a structured summary: - -### Final confirmation format - -```markdown -Here's my understanding of the complete requirements: - -**Goal**: <one sentence> - -**Requirements**: - -* ... -* ... - -**Acceptance Criteria**: - -* [ ] ... -* [ ] ... - -**Definition of Done**: - -* ... - -**Out of Scope**: - -* ... - -**Technical Approach**: -<brief summary + key decisions> - -**Implementation Plan (small PRs)**: - -* PR1: <scaffolding + tests + minimal plumbing> -* PR2: <core behavior> -* PR3: <edge cases + docs + cleanup> - -Does this look correct? If yes, I'll proceed with implementation. -``` - -### Subtask Decomposition (Complex Tasks) - -For complex tasks with multiple independent work items, create subtasks: - -```bash -# Create child tasks -CHILD1=$(python3 ./.trellis/scripts/task.py create "Child task 1" --slug child1 --parent "$TASK_DIR") -CHILD2=$(python3 ./.trellis/scripts/task.py create "Child task 2" --slug child2 --parent "$TASK_DIR") - -# Or link existing tasks -python3 ./.trellis/scripts/task.py add-subtask "$TASK_DIR" "$CHILD_DIR" -``` - ---- - -## PRD Target Structure (final) - -`prd.md` should converge to: - -```markdown -# <Task Title> - -## Goal - -<why + what> - -## Requirements - -* ... - -## Acceptance Criteria - -* [ ] ... - -## Definition of Done - -* ... - -## Technical Approach - -<key design + decisions> - -## Decision (ADR-lite) - -Context / Decision / Consequences - -## Out of Scope - -* ... - -## Technical Notes - -<constraints, references, files, research notes> -``` - ---- - -## Anti-Patterns (Hard Avoid) - -* Asking user for code/context that can be derived from repo -* Asking user to choose an approach before presenting concrete options -* Meta questions about whether to research -* Staying narrowly on the initial request without considering evolution/edges -* Letting brainstorming drift without updating PRD - ---- - -## Integration with Start Workflow - -After brainstorm completes (Step 8 confirmation approved), the flow continues to the Task Workflow's **Phase 2: Prepare for Implementation**: - -```text -Brainstorm - Step 0: Create task directory + seed PRD - Step 1–7: Discover requirements, research, converge - Step 8: Final confirmation → user approves - ↓ -Task Workflow Phase 2 (Prepare for Implementation) - Code-Spec Depth Check (if applicable) - → Research codebase (based on confirmed PRD) - → Configure code-spec context (jsonl files) - → Activate task - ↓ -Task Workflow Phase 3 (Execute) - Implement → Check → Complete -``` - -The task directory and PRD already exist from brainstorm, so Phase 1 of the Task Workflow is skipped entirely. - ---- - -## Related Commands - -| Command | When to Use | -|---------|-------------| -| `/trellis-start` | Entry point that triggers brainstorm | -| `/trellis-finish-work` | After implementation is complete | -| `/trellis-update-spec` | If new patterns emerge during work | diff --git a/.cursor/commands/trellis-break-loop.md b/.cursor/commands/trellis-break-loop.md deleted file mode 100644 index e09824f1..00000000 --- a/.cursor/commands/trellis-break-loop.md +++ /dev/null @@ -1,107 +0,0 @@ -# Break the Loop - Deep Bug Analysis - -When debug is complete, use this command for deep analysis to break the "fix bug -> forget -> repeat" cycle. - ---- - -## Analysis Framework - -Analyze the bug you just fixed from these 5 dimensions: - -### 1. Root Cause Category - -Which category does this bug belong to? - -| Category | Characteristics | Example | -|----------|-----------------|---------| -| **A. Missing Spec** | No documentation on how to do it | New feature without checklist | -| **B. Cross-Layer Contract** | Interface between layers unclear | API returns different format than expected | -| **C. Change Propagation Failure** | Changed one place, missed others | Changed function signature, missed call sites | -| **D. Test Coverage Gap** | Unit test passes, integration fails | Works alone, breaks when combined | -| **E. Implicit Assumption** | Code relies on undocumented assumption | Timestamp seconds vs milliseconds | - -### 2. Why Fixes Failed (if applicable) - -If you tried multiple fixes before succeeding, analyze each failure: - -- **Surface Fix**: Fixed symptom, not root cause -- **Incomplete Scope**: Found root cause, didn't cover all cases -- **Tool Limitation**: grep missed it, type check wasn't strict -- **Mental Model**: Kept looking in same layer, didn't think cross-layer - -### 3. Prevention Mechanisms - -What mechanisms would prevent this from happening again? - -| Type | Description | Example | -|------|-------------|---------| -| **Documentation** | Write it down so people know | Update thinking guide | -| **Architecture** | Make the error impossible structurally | Type-safe wrappers | -| **Compile-time** | TypeScript strict, no any | Signature change causes compile error | -| **Runtime** | Monitoring, alerts, scans | Detect orphan entities | -| **Test Coverage** | E2E tests, integration tests | Verify full flow | -| **Code Review** | Checklist, PR template | "Did you check X?" | - -### 4. Systematic Expansion - -What broader problems does this bug reveal? - -- **Similar Issues**: Where else might this problem exist? -- **Design Flaw**: Is there a fundamental architecture issue? -- **Process Flaw**: Is there a development process improvement? -- **Knowledge Gap**: Is the team missing some understanding? - -### 5. Knowledge Capture - -Solidify insights into the system: - -- [ ] Update `.trellis/spec/guides/` thinking guides -- [ ] Update `.trellis/spec/backend/` or `frontend/` docs -- [ ] Create issue record (if applicable) -- [ ] Create feature ticket for root fix -- [ ] Update check commands if needed - ---- - -## Output Format - -Please output analysis in this format: - -```markdown -## Bug Analysis: [Short Description] - -### 1. Root Cause Category -- **Category**: [A/B/C/D/E] - [Category Name] -- **Specific Cause**: [Detailed description] - -### 2. Why Fixes Failed (if applicable) -1. [First attempt]: [Why it failed] -2. [Second attempt]: [Why it failed] -... - -### 3. Prevention Mechanisms -| Priority | Mechanism | Specific Action | Status | -|----------|-----------|-----------------|--------| -| P0 | ... | ... | TODO/DONE | - -### 4. Systematic Expansion -- **Similar Issues**: [List places with similar problems] -- **Design Improvement**: [Architecture-level suggestions] -- **Process Improvement**: [Development process suggestions] - -### 5. Knowledge Capture -- [ ] [Documents to update / tickets to create] -``` - ---- - -## Core Philosophy - -> **The value of debugging is not in fixing the bug, but in making this class of bugs never happen again.** - -Three levels of insight: -1. **Tactical**: How to fix THIS bug -2. **Strategic**: How to prevent THIS CLASS of bugs -3. **Philosophical**: How to expand thinking patterns - -30 minutes of analysis saves 30 hours of future debugging. diff --git a/.cursor/commands/trellis-check-cross-layer.md b/.cursor/commands/trellis-check-cross-layer.md deleted file mode 100644 index bc61e28e..00000000 --- a/.cursor/commands/trellis-check-cross-layer.md +++ /dev/null @@ -1,153 +0,0 @@ -# Cross-Layer Check - -Check if your changes considered all dimensions. Most bugs come from "didn't think of it", not lack of technical skill. - -> **Note**: This is a **post-implementation** safety net. Ideally, read the [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) **before** writing code. - ---- - -## Related Documents - -| Document | Purpose | Timing | -|----------|---------|--------| -| [Pre-Implementation Checklist](.trellis/spec/guides/pre-implementation-checklist.md) | Questions before coding | **Before** writing code | -| [Code Reuse Thinking Guide](.trellis/spec/guides/code-reuse-thinking-guide.md) | Pattern recognition | During implementation | -| **`/trellis-check-cross-layer`** (this) | Verification check | **After** implementation | - ---- - -## Execution Steps - -### 1. Identify Change Scope - -```bash -git status -git diff --name-only -``` - -### 2. Select Applicable Check Dimensions - -Based on your change type, execute relevant checks below: - ---- - -## Dimension A: Cross-Layer Data Flow (Required when 3+ layers) - -**Trigger**: Changes involve 3 or more layers - -| Layer | Common Locations | -|-------|------------------| -| API/Routes | `routes/`, `api/`, `handlers/`, `controllers/` | -| Service/Business Logic | `services/`, `lib/`, `core/`, `domain/` | -| Database/Storage | `db/`, `models/`, `repositories/`, `schema/` | -| UI/Presentation | `components/`, `views/`, `templates/`, `pages/` | -| Utility | `utils/`, `helpers/`, `common/` | - -**Checklist**: -- [ ] Read flow: Database -> Service -> API -> UI -- [ ] Write flow: UI -> API -> Service -> Database -- [ ] Types/schemas correctly passed between layers? -- [ ] Errors properly propagated to caller? -- [ ] Loading/pending states handled at each layer? - -**Detailed Guide**: `.trellis/spec/guides/cross-layer-thinking-guide.md` - ---- - -## Dimension B: Code Reuse (Required when modifying constants/config) - -**Trigger**: -- Modifying UI constants (label, icon, color) -- Modifying any hardcoded value -- Seeing similar code in multiple places -- Creating a new utility/helper function -- Just finished batch modifications across files - -**Checklist**: -- [ ] Search first: How many places define this value? - ```bash - # Search in source files (adjust extensions for your project) - grep -r "value-to-change" src/ - ``` -- [ ] If 2+ places define same value -> Should extract to shared constant -- [ ] After modification, all usage sites updated? -- [ ] If creating utility: Does similar utility already exist? - -**Detailed Guide**: `.trellis/spec/guides/code-reuse-thinking-guide.md` - ---- - -## Dimension B2: New Utility Functions - -**Trigger**: About to create a new utility/helper function - -**Checklist**: -- [ ] Search for existing similar utilities first - ```bash - grep -r "functionNamePattern" src/ - ``` -- [ ] If similar exists, can you extend it instead? -- [ ] If creating new, is it in the right location (shared vs domain-specific)? - ---- - -## Dimension B3: After Batch Modifications - -**Trigger**: Just modified similar patterns in multiple files - -**Checklist**: -- [ ] Did you check ALL files with similar patterns? - ```bash - grep -r "patternYouChanged" src/ - ``` -- [ ] Any files missed that should also be updated? -- [ ] Should this pattern be abstracted to prevent future duplication? - ---- - -## Dimension C: Import/Dependency Paths (Required when creating new files) - -**Trigger**: Creating new source files - -**Checklist**: -- [ ] Using correct import paths (relative vs absolute)? -- [ ] No circular dependencies? -- [ ] Consistent with project's module organization? - ---- - -## Dimension D: Same-Layer Consistency - -**Trigger**: -- Modifying display logic or formatting -- Same domain concept used in multiple places - -**Checklist**: -- [ ] Search for other places using same concept - ```bash - grep -r "ConceptName" src/ - ``` -- [ ] Are these usages consistent? -- [ ] Should they share configuration/constants? - ---- - -## Common Issues Quick Reference - -| Issue | Root Cause | Prevention | -|-------|------------|------------| -| Changed one place, missed others | Didn't search impact scope | `grep` before changing | -| Data lost at some layer | Didn't check data flow | Trace data source to destination | -| Type/schema mismatch | Cross-layer types inconsistent | Use shared type definitions | -| UI/output inconsistent | Same concept in multiple places | Extract shared constants | -| Similar utility exists | Didn't search first | Search before creating | -| Batch fix incomplete | Didn't verify all occurrences | grep after fixing | - ---- - -## Output - -Report: -1. Which dimensions your changes involve -2. Check results for each dimension -3. Issues found and fix suggestions diff --git a/.cursor/commands/trellis-check.md b/.cursor/commands/trellis-check.md deleted file mode 100644 index 8e3e272e..00000000 --- a/.cursor/commands/trellis-check.md +++ /dev/null @@ -1,25 +0,0 @@ -Check if the code you just wrote follows the development guidelines. - -Execute these steps: - -1. **Identify changed files**: - ```bash - git diff --name-only HEAD - ``` - -2. **Determine which spec modules apply** based on the changed file paths: - ```bash - python3 ./.trellis/scripts/get_context.py --mode packages - ``` - -3. **Read the spec index** for each relevant module: - ```bash - cat .trellis/spec/<package>/<layer>/index.md - ``` - Follow the **"Quality Check"** section in the index. - -4. **Read the specific guideline files** referenced in the Quality Check section (e.g., `quality-guidelines.md`, `conventions.md`). The index is NOT the goal — it points you to the actual guideline files. Read those files and review your code against them. - -5. **Run lint and typecheck** for the affected package. - -6. **Report any violations** and fix them if found. diff --git a/.cursor/commands/trellis-create-command.md b/.cursor/commands/trellis-create-command.md deleted file mode 100644 index 9e7bbfbf..00000000 --- a/.cursor/commands/trellis-create-command.md +++ /dev/null @@ -1,154 +0,0 @@ -# Create New Slash Command - -Create a new slash command in both `.cursor/commands/` (with `trellis-` prefix) and `.claude/commands/trellis/` directories based on user requirements. - -## Usage - -``` -/trellis-create-command <command-name> <description> -``` - -**Example**: -``` -/trellis-create-command review-pr Check PR code changes against project guidelines -``` - -## Execution Steps - -### 1. Parse Input - -Extract from user input: -- **Command name**: Use kebab-case (e.g., `review-pr`) -- **Description**: What the command should accomplish - -### 2. Analyze Requirements - -Determine command type based on description: -- **Initialization**: Read docs, establish context -- **Pre-development**: Read guidelines, check dependencies -- **Code check**: Validate code quality and guideline compliance -- **Recording**: Record progress, questions, structure changes -- **Generation**: Generate docs, code templates - -### 3. Generate Command Content - -Based on command type, generate appropriate content: - -**Simple command** (1-3 lines): -```markdown -Concise instruction describing what to do -``` - -**Complex command** (with steps): -```markdown -# Command Title - -Command description - -## Steps - -### 1. First Step -Specific action - -### 2. Second Step -Specific action - -## Output Format (if needed) - -Template -``` - -### 4. Create Files - -Create in both directories: -- `.cursor/commands/trellis-<command-name>.md` -- `.claude/commands/trellis/<command-name>.md` - -### 5. Confirm Creation - -Output result: -``` -[OK] Created Slash Command: /<command-name> - -File paths: -- .cursor/commands/trellis-<command-name>.md -- .claude/commands/trellis/<command-name>.md - -Usage: -/trellis-<command-name> - -Description: -<description> -``` - -## Command Content Guidelines - -### [OK] Good command content - -1. **Clear and concise**: Immediately understandable -2. **Executable**: AI can follow steps directly -3. **Well-scoped**: Clear boundaries of what to do and not do -4. **Has output**: Specifies expected output format (if needed) - -### [X] Avoid - -1. **Too vague**: e.g., "optimize code" -2. **Too complex**: Single command should not exceed 100 lines -3. **Duplicate functionality**: Check if similar command exists first - -## Naming Conventions - -| Command Type | Prefix | Example | -|--------------|--------|---------| -| Session Start | `start` | `start` | -| Pre-development | `before-` | `before-dev` | -| Check | `check-` | `check` | -| Record | `record-` | `record-session` | -| Generate | `generate-` | `generate-api-doc` | -| Update | `update-` | `update-changelog` | -| Other | Verb-first | `review-code`, `sync-data` | - -## Example - -### Input -``` -/trellis-create-command review-pr Check PR code changes against project guidelines -``` - -### Generated Command Content -```markdown -# PR Code Review - -Check current PR code changes against project guidelines. - -## Steps - -### 1. Get Changed Files -```bash -git diff main...HEAD --name-only -``` - -### 2. Categorized Review - -**Frontend files** (`apps/web/`): -- Reference `.trellis/spec/frontend/index.md` - -**Backend files** (`packages/api/`): -- Reference `.trellis/spec/backend/index.md` - -### 3. Output Review Report - -Format: - -## PR Review Report - -### Changed Files -- [file list] - -### Check Results -- [OK] Passed items -- [X] Issues found - -### Suggestions -- [improvement suggestions] -``` diff --git a/.cursor/commands/trellis-finish-work.md b/.cursor/commands/trellis-finish-work.md deleted file mode 100644 index d8df83be..00000000 --- a/.cursor/commands/trellis-finish-work.md +++ /dev/null @@ -1,143 +0,0 @@ -# Finish Work - Pre-Commit Checklist - -Before submitting or committing, use this checklist to ensure work completeness. - -**Timing**: After code is written and tested, before commit - ---- - -## Checklist - -### 1. Code Quality - -```bash -# Must pass -pnpm lint -pnpm type-check -pnpm test -``` - -- [ ] `pnpm lint` passes with 0 errors? -- [ ] `pnpm type-check` passes with no type errors? -- [ ] Tests pass? -- [ ] No `console.log` statements (use logger)? -- [ ] No non-null assertions (the `x!` operator)? -- [ ] No `any` types? - -### 2. Code-Spec Sync - -**Code-Spec Docs**: -- [ ] Does `.trellis/spec/backend/` need updates? - - New patterns, new modules, new conventions -- [ ] Does `.trellis/spec/frontend/` need updates? - - New components, new hooks, new patterns -- [ ] Does `.trellis/spec/guides/` need updates? - - New cross-layer flows, lessons from bugs - -**Key Question**: -> "If I fixed a bug or discovered something non-obvious, should I document it so future me (or others) won't hit the same issue?" - -If YES -> Update the relevant code-spec doc. - -### 2.5. Code-Spec Hard Block (Infra/Cross-Layer) - -If this change touches infra or cross-layer contracts, this is a blocking checklist: - -- [ ] Spec content is executable (real signatures/contracts), not principle-only text -- [ ] Includes file path + command/API name + payload field names -- [ ] Includes validation and error matrix -- [ ] Includes Good/Base/Bad cases -- [ ] Includes required tests and assertion points - -**Block Rule**: -If infra/cross-layer changed but the related spec is still abstract, do NOT finish. Run `/trellis-update-spec` manually first. - -### 3. API Changes - -If you modified API endpoints: - -- [ ] Input schema updated? -- [ ] Output schema updated? -- [ ] API documentation updated? -- [ ] Client code updated to match? - -### 4. Database Changes - -If you modified database schema: - -- [ ] Migration file created? -- [ ] Schema file updated? -- [ ] Related queries updated? -- [ ] Seed data updated (if applicable)? - -### 5. Cross-Layer Verification - -If the change spans multiple layers: - -- [ ] Data flows correctly through all layers? -- [ ] Error handling works at each boundary? -- [ ] Types are consistent across layers? -- [ ] Loading states handled? - -### 6. Manual Testing - -- [ ] Feature works in browser/app? -- [ ] Edge cases tested? -- [ ] Error states tested? -- [ ] Works after page refresh? - ---- - -## Quick Check Flow - -```bash -# 1. Code checks -pnpm lint && pnpm type-check - -# 2. View changes -git status -git diff --name-only - -# 3. Based on changed files, check relevant items above -``` - ---- - -## Common Oversights - -| Oversight | Consequence | Check | -|-----------|-------------|-------| -| Code-spec docs not updated | Others don't know the change | Check .trellis/spec/ | -| Spec text is abstract only | Easy regressions in infra/cross-layer changes | Require signature/contract/matrix/cases/tests | -| Migration not created | Schema out of sync | Check db/migrations/ | -| Types not synced | Runtime errors | Check shared types | -| Tests not updated | False confidence | Run full test suite | -| Console.log left in | Noisy production logs | Search for console.log | - ---- - -## Relationship to Other Commands - -``` -Development Flow: - Write code -> Test -> /trellis-finish-work -> git commit -> /trellis-record-session - | | - Ensure completeness Record progress - -Debug Flow: - Hit bug -> Fix -> /trellis-break-loop -> Knowledge capture - | - Deep analysis -``` - -- `/trellis-finish-work` - Check work completeness (this command) -- `/trellis-record-session` - Record session and commits -- `/trellis-break-loop` - Deep analysis after debugging - ---- - -## Core Principle - -> **Delivery includes not just code, but also documentation, verification, and knowledge capture.** - -Complete work = Code + Docs + Tests + Verification diff --git a/.cursor/commands/trellis-integrate-skill.md b/.cursor/commands/trellis-integrate-skill.md deleted file mode 100644 index d3936ad0..00000000 --- a/.cursor/commands/trellis-integrate-skill.md +++ /dev/null @@ -1,219 +0,0 @@ -# Integrate Claude Skill into Project Guidelines - -Adapt and integrate a Claude global skill into your project's development guidelines (not directly into project code). - -## Usage - -``` -/trellis-integrate-skill <skill-name> -``` - -**Examples**: -``` -/trellis-integrate-skill frontend-design -/trellis-integrate-skill mcp-builder -``` - -## Core Principle - -> [!] **Important**: The goal of skill integration is to update **development guidelines**, not to generate project code directly. -> -> - Guidelines content -> Write to `.trellis/spec/{target}/doc.md` -> - Code examples -> Place in `.trellis/spec/{target}/examples/skills/<skill-name>/` -> - Example files -> Use `.template` suffix (e.g., `component.tsx.template`) to avoid IDE errors -> -> Where `{target}` is `frontend` or `backend`, determined by skill type. - -## Execution Steps - -### 1. Read Skill Content - -```bash -openskills read <skill-name> -``` - -If the skill doesn't exist, prompt user to check available skills: -```bash -# Available skills are listed in AGENTS.md under <available_skills> -``` - -### 2. Determine Integration Target - -Based on skill type, determine which guidelines to update: - -| Skill Category | Integration Target | -|----------------|-------------------| -| UI/Frontend (`frontend-design`, `web-artifacts-builder`) | `.trellis/spec/frontend/` | -| Backend/API (`mcp-builder`) | `.trellis/spec/backend/` | -| Documentation (`doc-coauthoring`, `docx`, `pdf`) | `.trellis/` or create dedicated guidelines | -| Testing (`webapp-testing`) | `.trellis/spec/frontend/` (E2E) | - -### 3. Analyze Skill Content - -Extract from the skill: -- **Core concepts**: How the skill works and key concepts -- **Best practices**: Recommended approaches -- **Code patterns**: Reusable code templates -- **Caveats**: Common issues and solutions - -### 4. Execute Integration - -#### 4.1 Update Guidelines Document - -Add a new section to the corresponding `doc.md`: - -```markdown -@@@section:skill-<skill-name> -## # <Skill Name> Integration Guide - -### Overview -[Core functionality and use cases of the skill] - -### Project Adaptation -[How to use this skill in the current project] - -### Usage Steps -1. [Step 1] -2. [Step 2] - -### Caveats -- [Project-specific constraints] -- [Differences from default behavior] - -### Reference Examples -See `examples/skills/<skill-name>/` - -@@@/section:skill-<skill-name> -``` - -#### 4.2 Create Examples Directory (if code examples exist) - -```bash -# Directory structure ({target} = frontend or backend) -.trellis/spec/{target}/ -|-- doc.md # Add skill-related section -|-- index.md # Update index -+-- examples/ - +-- skills/ - +-- <skill-name>/ - |-- README.md # Example documentation - |-- example-1.ts.template # Code example (use .template suffix) - +-- example-2.tsx.template -``` - -**File naming conventions**: -- Code files: `<name>.<ext>.template` (e.g., `component.tsx.template`) -- Config files: `<name>.config.template` (e.g., `tailwind.config.template`) -- Documentation: `README.md` (normal suffix) - -#### 4.3 Update Index File - -Add to the Quick Navigation table in `index.md`: - -```markdown -| <Skill-related task> | <Section name> | `skill-<skill-name>` | -``` - -### 5. Generate Integration Report - ---- - -## Skill Integration Report: `<skill-name>` - -### # Overview -- **Skill description**: [Functionality description] -- **Integration target**: `.trellis/spec/{target}/` - -### # Tech Stack Compatibility - -| Skill Requirement | Project Status | Compatibility | -|-------------------|----------------|---------------| -| [Tech 1] | [Project tech] | [OK]/[!]/[X] | - -### # Integration Locations - -| Type | Path | -|------|------| -| Guidelines doc | `.trellis/spec/{target}/doc.md` (section: `skill-<name>`) | -| Code examples | `.trellis/spec/{target}/examples/skills/<name>/` | -| Index update | `.trellis/spec/{target}/index.md` | - -> `{target}` = `frontend` or `backend` - -### # Dependencies (if needed) - -```bash -# Install required dependencies (adjust for your package manager) -npm install <package> -# or -pnpm add <package> -# or -yarn add <package> -``` - -### [OK] Completed Changes - -- [ ] Added `@@@section:skill-<name>` section to `doc.md` -- [ ] Added index entry to `index.md` -- [ ] Created example files in `examples/skills/<name>/` -- [ ] Example files use `.template` suffix - -### # Related Guidelines - -- [Existing related section IDs] - ---- - -## 6. Optional: Create Usage Command - -If this skill is frequently used, create a shortcut command: - -```bash -/trellis-create-command use-<skill-name> Use <skill-name> skill following project guidelines -``` - -## Common Skill Integration Reference - -| Skill | Integration Target | Examples Directory | -|-------|-------------------|-------------------| -| `frontend-design` | `frontend` | `examples/skills/frontend-design/` | -| `mcp-builder` | `backend` | `examples/skills/mcp-builder/` | -| `webapp-testing` | `frontend` | `examples/skills/webapp-testing/` | -| `doc-coauthoring` | `.trellis/` | N/A (documentation workflow only) | - -## Example: Integrating `mcp-builder` Skill - -### Directory Structure - -``` -.trellis/spec/backend/ -|-- doc.md # Add MCP section -|-- index.md # Add index entry -+-- examples/ - +-- skills/ - +-- mcp-builder/ - |-- README.md - |-- server.ts.template - |-- tools.ts.template - +-- types.ts.template -``` - -### New Section in doc.md - -```markdown -@@@section:skill-mcp-builder -## # MCP Server Development Guide - -### Overview -Create LLM-callable tool services using MCP (Model Context Protocol). - -### Project Adaptation -- Place services in a dedicated directory -- Follow existing TypeScript and type definition conventions -- Use project's logging system - -### Reference Examples -See `examples/skills/mcp-builder/` - -@@@/section:skill-mcp-builder -``` diff --git a/.cursor/commands/trellis-onboard.md b/.cursor/commands/trellis-onboard.md deleted file mode 100644 index 206c1260..00000000 --- a/.cursor/commands/trellis-onboard.md +++ /dev/null @@ -1,358 +0,0 @@ -You are a senior developer onboarding a new team member to this project's AI-assisted workflow system. - -YOUR ROLE: Be a mentor and teacher. Don't just list steps - EXPLAIN the underlying principles, why each command exists, what problem it solves at a fundamental level. - -## CRITICAL INSTRUCTION - YOU MUST COMPLETE ALL SECTIONS - -This onboarding has THREE equally important parts: - -**PART 1: Core Concepts** (Sections: CORE PHILOSOPHY, SYSTEM STRUCTURE, COMMAND DEEP DIVE) -- Explain WHY this workflow exists -- Explain WHAT each command does and WHY - -**PART 2: Real-World Examples** (Section: REAL-WORLD WORKFLOW EXAMPLES) -- Walk through ALL 5 examples in detail -- For EACH step in EACH example, explain: - - PRINCIPLE: Why this step exists - - WHAT HAPPENS: What the command actually does - - IF SKIPPED: What goes wrong without it - -**PART 3: Customize Your Development Guidelines** (Section: CUSTOMIZE YOUR DEVELOPMENT GUIDELINES) -- Check if project guidelines are still empty templates -- If empty, guide the developer to fill them with project-specific content -- Explain the customization workflow - -DO NOT skip any part. All three parts are essential: -- Part 1 teaches the concepts -- Part 2 shows how concepts work in practice -- Part 3 ensures the project has proper guidelines for AI to follow - -After completing ALL THREE parts, ask the developer about their first task. - ---- - -## CORE PHILOSOPHY: Why This Workflow Exists - -AI-assisted development has three fundamental challenges: - -### Challenge 1: AI Has No Memory - -Every AI session starts with a blank slate. Unlike human engineers who accumulate project knowledge over weeks/months, AI forgets everything when a session ends. - -**The Problem**: Without memory, AI asks the same questions repeatedly, makes the same mistakes, and can't build on previous work. - -**The Solution**: The `.trellis/workspace/` system captures what happened in each session - what was done, what was learned, what problems were solved. The `/trellis-start` command reads this history at session start, giving AI "artificial memory." - -### Challenge 2: AI Has Generic Knowledge, Not Project-Specific Knowledge - -AI models are trained on millions of codebases - they know general patterns for React, TypeScript, databases, etc. But they don't know YOUR project's conventions. - -**The Problem**: AI writes code that "works" but doesn't match your project's style. It uses patterns that conflict with existing code. It makes decisions that violate unwritten team rules. - -**The Solution**: The `.trellis/spec/` directory contains project-specific guidelines. The `/before-*-dev` commands inject this specialized knowledge into AI context before coding starts. - -### Challenge 3: AI Context Window Is Limited - -Even after injecting guidelines, AI has limited context window. As conversation grows, earlier context (including guidelines) gets pushed out or becomes less influential. - -**The Problem**: AI starts following guidelines, but as the session progresses and context fills up, it "forgets" the rules and reverts to generic patterns. - -**The Solution**: The `/check-*` commands re-verify code against guidelines AFTER writing, catching drift that occurred during development. The `/trellis-finish-work` command does a final holistic review. - ---- - -## SYSTEM STRUCTURE - -``` -.trellis/ -|-- .developer # Your identity (gitignored) -|-- workflow.md # Complete workflow documentation -|-- workspace/ # "AI Memory" - session history -| |-- index.md # All developers' progress -| +-- {developer}/ # Per-developer directory -| |-- index.md # Personal progress index -| +-- journal-N.md # Session records (max 2000 lines) -|-- tasks/ # Task tracking (unified) -| +-- {MM}-{DD}-{slug}/ # Task directory -| |-- task.json # Task metadata -| +-- prd.md # Requirements doc -|-- spec/ # "AI Training Data" - project knowledge -| |-- frontend/ # Frontend conventions -| |-- backend/ # Backend conventions -| +-- guides/ # Thinking patterns -+-- scripts/ # Automation tools -``` - -### Understanding spec/ subdirectories - -**frontend/** - Single-layer frontend knowledge: -- Component patterns (how to write components in THIS project) -- State management rules (Redux? Zustand? Context?) -- Styling conventions (CSS modules? Tailwind? Styled-components?) -- Hook patterns (custom hooks, data fetching) - -**backend/** - Single-layer backend knowledge: -- API design patterns (REST? GraphQL? tRPC?) -- Database conventions (query patterns, migrations) -- Error handling standards -- Logging and monitoring rules - -**guides/** - Cross-layer thinking guides: -- Code reuse thinking guide -- Cross-layer thinking guide -- Pre-implementation checklists - ---- - -## COMMAND DEEP DIVE - -### /trellis-start - Restore AI Memory - -**WHY IT EXISTS**: -When a human engineer joins a project, they spend days/weeks learning: What is this project? What's been built? What's in progress? What's the current state? - -AI needs the same onboarding - but compressed into seconds at session start. - -**WHAT IT ACTUALLY DOES**: -1. Reads developer identity (who am I in this project?) -2. Checks git status (what branch? uncommitted changes?) -3. Reads recent session history from `workspace/` (what happened before?) -4. Identifies active features (what's in progress?) -5. Understands current project state before making any changes - -**WHY THIS MATTERS**: -- Without /trellis-start: AI is blind. It might work on wrong branch, conflict with others' work, or redo already-completed work. -- With /trellis-start: AI knows project context, can continue where previous session left off, avoids conflicts. - ---- - -### /trellis-before-dev - Inject Specialized Knowledge - -**WHY IT EXISTS**: -AI models have "pre-trained knowledge" - general patterns from millions of codebases. But YOUR project has specific conventions that differ from generic patterns. - -**WHAT IT ACTUALLY DOES**: -1. Discovers spec layers via `get_context.py --mode packages` and reads relevant guidelines -2. Loads project-specific patterns into AI's working context: - - Component naming conventions - - State management patterns - - Database query patterns - - Error handling standards - -**WHY THIS MATTERS**: -- Without before-dev: AI writes generic code that doesn't match project style. -- With before-dev: AI writes code that looks like the rest of the codebase. - ---- - -### /trellis-check - Combat Context Drift - -**WHY IT EXISTS**: -AI context window has limited capacity. As conversation progresses, guidelines injected at session start become less influential. This causes "context drift." - -**WHAT IT ACTUALLY DOES**: -1. Re-reads the guidelines that were injected earlier -2. Compares written code against those guidelines -3. Runs type checker and linter -4. Identifies violations and suggests fixes - -**WHY THIS MATTERS**: -- Without check-*: Context drift goes unnoticed, code quality degrades. -- With check-*: Drift is caught and corrected before commit. - ---- - -### /trellis-check-cross-layer - Multi-Dimension Verification - -**WHY IT EXISTS**: -Most bugs don't come from lack of technical skill - they come from "didn't think of it": -- Changed a constant in one place, missed 5 other places -- Modified database schema, forgot to update the API layer -- Created a utility function, but similar one already exists - -**WHAT IT ACTUALLY DOES**: -1. Identifies which dimensions your change involves -2. For each dimension, runs targeted checks: - - Cross-layer data flow - - Code reuse analysis - - Import path validation - - Consistency checks - ---- - -### /trellis-finish-work - Holistic Pre-Commit Review - -**WHY IT EXISTS**: -The `/check-*` commands focus on code quality within a single layer. But real changes often have cross-cutting concerns. - -**WHAT IT ACTUALLY DOES**: -1. Reviews all changes holistically -2. Checks cross-layer consistency -3. Identifies broader impacts -4. Checks if new patterns should be documented - ---- - -### /trellis-record-session - Persist Memory for Future - -**WHY IT EXISTS**: -All the context AI built during this session will be lost when session ends. The next session's `/trellis-start` needs this information. - -**WHAT IT ACTUALLY DOES**: -1. Records session summary to `workspace/{developer}/journal-N.md` -2. Captures what was done, learned, and what's remaining -3. Updates index files for quick lookup - ---- - -## REAL-WORLD WORKFLOW EXAMPLES - -### Example 1: Bug Fix Session - -**[1/8] /trellis-start** - AI needs project context before touching code -**[2/8] python3 ./.trellis/scripts/task.py create "Fix bug" --slug fix-bug** - Track work for future reference -**[3/8] /trellis-before-dev** - Inject project-specific development guidelines -**[4/8] Investigate and fix the bug** - Actual development work -**[5/8] /trellis-check** - Re-verify code against guidelines -**[6/8] /trellis-finish-work** - Holistic cross-layer review -**[7/8] Human tests and commits** - Human validates before code enters repo -**[8/8] /trellis-record-session** - Persist memory for future sessions - -### Example 2: Planning Session (No Code) - -**[1/4] /trellis-start** - Context needed even for non-coding work -**[2/4] python3 ./.trellis/scripts/task.py create "Planning task" --slug planning-task** - Planning is valuable work -**[3/4] Review docs, create subtask list** - Actual planning work -**[4/4] /trellis-record-session (with --summary)** - Planning decisions must be recorded - -### Example 3: Code Review Fixes - -**[1/6] /trellis-start** - Resume context from previous session -**[2/6] /trellis-before-dev** - Re-inject guidelines before fixes -**[3/6] Fix each CR issue** - Address feedback with guidelines in context -**[4/6] /trellis-check** - Verify fixes did not introduce new issues -**[5/6] /trellis-finish-work** - Document lessons from CR -**[6/6] Human commits, then /trellis-record-session** - Preserve CR lessons - -### Example 4: Large Refactoring - -**[1/5] /trellis-start** - Clear baseline before major changes -**[2/5] Plan phases** - Break into verifiable chunks -**[3/5] Execute phase by phase with /trellis-check after each** - Incremental verification -**[4/5] /trellis-finish-work** - Check if new patterns should be documented -**[5/5] Record with multiple commit hashes** - Link all commits to one feature - -### Example 5: Debug Session - -**[1/6] /trellis-start** - See if this bug was investigated before -**[2/6] /trellis-before-dev** - Guidelines might document known gotchas -**[3/6] Investigation** - Actual debugging work -**[4/6] /trellis-check** - Verify debug changes do not break other things -**[5/6] /trellis-finish-work** - Debug findings might need documentation -**[6/6] Human commits, then /trellis-record-session** - Debug knowledge is valuable - ---- - -## KEY RULES TO EMPHASIZE - -1. **AI NEVER commits** - Human tests and approves. AI prepares, human validates. -2. **Guidelines before code** - /before-dev command injects project knowledge. -3. **Check after code** - /check-* commands catch context drift. -4. **Record everything** - /trellis-record-session persists memory. - ---- - -# PART 3: Customize Your Development Guidelines - -After explaining Part 1 and Part 2, check if the project's development guidelines need customization. - -## Step 1: Check Current Guidelines Status - -Check if `.trellis/spec/` contains empty templates or customized guidelines: - -```bash -# Check if files are still empty templates (look for placeholder text) -grep -l "To be filled by the team" .trellis/spec/backend/*.md 2>/dev/null | wc -l -grep -l "To be filled by the team" .trellis/spec/frontend/*.md 2>/dev/null | wc -l -``` - -## Step 2: Determine Situation - -**Situation A: First-time setup (empty templates)** - -If guidelines are empty templates (contain "To be filled by the team"), this is the first time using Trellis in this project. - -Explain to the developer: - -"I see that the development guidelines in `.trellis/spec/` are still empty templates. This is normal for a new Trellis setup! - -The templates contain placeholder text that needs to be replaced with YOUR project's actual conventions. Without this, `/before-*-dev` commands won't provide useful guidance. - -**Your first task should be to fill in these guidelines:** - -1. Look at your existing codebase -2. Identify the patterns and conventions already in use -3. Document them in the guideline files - -For example, for `.trellis/spec/backend/database-guidelines.md`: -- What ORM/query library does your project use? -- How are migrations managed? -- What naming conventions for tables/columns? - -Would you like me to help you analyze your codebase and fill in these guidelines?" - -**Situation B: Guidelines already customized** - -If guidelines have real content (no "To be filled" placeholders), this is an existing setup. - -Explain to the developer: - -"Great! Your team has already customized the development guidelines. You can start using `/before-*-dev` commands right away. - -I recommend reading through `.trellis/spec/` to familiarize yourself with the team's coding standards." - -## Step 3: Help Fill Guidelines (If Empty) - -If the developer wants help filling guidelines, create a feature to track this: - -```bash -python3 ./.trellis/scripts/task.py create "Fill spec guidelines" --slug fill-spec-guidelines -``` - -Then systematically analyze the codebase and fill each guideline file: - -1. **Analyze the codebase** - Look at existing code patterns -2. **Document conventions** - Write what you observe, not ideals -3. **Include examples** - Reference actual files in the project -4. **List forbidden patterns** - Document anti-patterns the team avoids - -Work through one file at a time: -- `backend/directory-structure.md` -- `backend/database-guidelines.md` -- `backend/error-handling.md` -- `backend/quality-guidelines.md` -- `backend/logging-guidelines.md` -- `frontend/directory-structure.md` -- `frontend/component-guidelines.md` -- `frontend/hook-guidelines.md` -- `frontend/state-management.md` -- `frontend/quality-guidelines.md` -- `frontend/type-safety.md` - ---- - -## Completing the Onboard Session - -After covering all three parts, summarize: - -"You're now onboarded to the Trellis workflow system! Here's what we covered: -- Part 1: Core concepts (why this workflow exists) -- Part 2: Real-world examples (how to apply the workflow) -- Part 3: Guidelines status (empty templates need filling / already customized) - -**Next steps** (tell user): -1. Run `/trellis-record-session` to record this onboard session -2. [If guidelines empty] Start filling in `.trellis/spec/` guidelines -3. [If guidelines ready] Start your first development task - -What would you like to do first?" diff --git a/.cursor/commands/trellis-record-session.md b/.cursor/commands/trellis-record-session.md deleted file mode 100644 index 8bea4f9b..00000000 --- a/.cursor/commands/trellis-record-session.md +++ /dev/null @@ -1,62 +0,0 @@ -[!] **Prerequisite**: This command should only be used AFTER the human has tested and committed the code. - -**Do NOT run `git commit` directly** — the scripts below handle their own commits for `.trellis/` metadata. You only need to read git history (`git log`, `git status`, `git diff`) and run the Python scripts. - ---- - -## Record Work Progress - -### Step 1: Get Context & Check Tasks - -```bash -python3 ./.trellis/scripts/get_context.py --mode record -``` - -[!] Archive tasks whose work is **actually done** — judge by work status, not the `status` field in task.json: -- Code committed? → Archive it (don't wait for PR) -- All acceptance criteria met? → Archive it -- Don't skip archiving just because `status` still says `planning` or `in_progress` - -```bash -python3 ./.trellis/scripts/task.py archive <task-name> -``` - -### Step 2: One-Click Add Session - -```bash -# Method 1: Simple parameters -python3 ./.trellis/scripts/add_session.py \ - --title "Session Title" \ - --commit "hash1,hash2" \ - --summary "Brief summary of what was done" - -# Method 2: Pass detailed content via stdin -cat << 'EOF' | python3 ./.trellis/scripts/add_session.py --stdin --title "Title" --commit "hash" -| Feature | Description | -|---------|-------------| -| New API | Added user authentication endpoint | -| Frontend | Updated login form | - -**Updated Files**: -- `packages/api/modules/auth/router.ts` -- `apps/web/modules/auth/components/login-form.tsx` -EOF -``` - -**Auto-completes**: -- [OK] Appends session to journal-N.md -- [OK] Auto-detects line count, creates new file if >2000 lines -- [OK] Auto-detects Branch context (`--branch` override; otherwise Branch = task.json -> current git branch; missing values are omitted gracefully) -- [OK] Updates index.md (Total Sessions +1, Last Active, line stats, history) -- [OK] Auto-commits .trellis/workspace and .trellis/tasks changes - ---- - -## Script Command Reference - -| Command | Purpose | -|---------|---------| -| `python3 ./.trellis/scripts/get_context.py --mode record` | Get context for record-session | -| `python3 ./.trellis/scripts/add_session.py --title "..." --commit "..."` | **One-click add session (recommended, branch auto-complete)** | -| `python3 ./.trellis/scripts/task.py archive <name>` | Archive completed task (auto-commits) | -| `python3 ./.trellis/scripts/task.py list` | List active tasks | diff --git a/.cursor/commands/trellis-start.md b/.cursor/commands/trellis-start.md deleted file mode 100644 index ebbe85ab..00000000 --- a/.cursor/commands/trellis-start.md +++ /dev/null @@ -1,373 +0,0 @@ -# Start Session - -Initialize your AI development session and begin working on tasks. - ---- - -## Operation Types - -Operations in this document are categorized as: - -| Marker | Meaning | Executor | -|--------|---------|----------| -| `[AI]` | Bash scripts or file reads executed by AI | You (AI) | -| `[USER]` | Slash commands executed by user | User | - ---- - -## Initialization - -### Step 1: Understand Trellis Workflow `[AI]` - -First, read the workflow guide to understand the development process: - -```bash -cat .trellis/workflow.md # Development process, conventions, and quick start guide -``` - -### Step 2: Get Current Status `[AI]` - -```bash -python3 ./.trellis/scripts/get_context.py -``` - -This returns: -- Developer identity -- Git status (branch, uncommitted changes) -- Recent commits -- Active tasks -- Journal file status - -### Step 3: Read Guidelines Index `[AI]` - -```bash -python3 ./.trellis/scripts/get_context.py --mode packages -``` - -This shows available packages and their spec layers. Read the relevant spec indexes: - -```bash -cat .trellis/spec/<package>/<layer>/index.md # Package-specific guidelines -cat .trellis/spec/guides/index.md # Thinking guides (always read) -``` - -> **Important**: The index files are navigation — they list the actual guideline files (e.g., `error-handling.md`, `conventions.md`, `mock-strategies.md`). -> At this step, just read the indexes to understand what's available. -> When you start actual development, you MUST go back and read the specific guideline files relevant to your task, as listed in the index's Pre-Development Checklist. - -### Step 4: Check Active Tasks `[AI]` - -```bash -python3 ./.trellis/scripts/task.py list -``` - -If continuing previous work, review the task file. - -### Step 5: Report Ready Status and Ask for Tasks - -Output a summary: - -```markdown -## Session Initialized - -| Item | Status | -|------|--------| -| Developer | {name} | -| Branch | {branch} | -| Uncommitted | {count} file(s) | -| Journal | {file} ({lines}/2000 lines) | -| Active Tasks | {count} | - -Ready for your task. What would you like to work on? -``` - ---- - -## Task Classification - -When user describes a task, classify it: - -| Type | Criteria | Workflow | -|------|----------|----------| -| **Question** | User asks about code, architecture, or how something works | Answer directly | -| **Trivial Fix** | Typo fix, comment update, single-line change, < 5 minutes | Direct Edit | -| **Simple Task** | Clear goal, 1-2 files, well-defined scope | Quick confirm → Task Workflow | -| **Complex Task** | Vague goal, multiple files, architectural decisions | **Brainstorm → Task Workflow** | - -### Decision Rule - -> **If in doubt, use Brainstorm + Task Workflow.** -> -> Task Workflow ensures code-specs are injected to the right context, resulting in higher quality code. -> The overhead is minimal, but the benefit is significant. - -> **Subtask Decomposition**: If brainstorm reveals multiple independent work items, -> consider creating subtasks using `--parent` flag or `add-subtask` command. -> See `/trellis:brainstorm` Step 8 for details. - ---- - -## Question / Trivial Fix - -For questions or trivial fixes, work directly: - -1. Answer question or make the fix -2. If code was changed, remind user to run `/trellis-finish-work` - ---- - -## Simple Task - -For simple, well-defined tasks: - -1. Quick confirm: "I understand you want to [goal]. Shall I proceed?" -2. If no, clarify and confirm again -3. **If yes: execute ALL steps below without stopping. Do NOT ask for additional confirmation between steps.** - - Create task directory (Phase 1 Path B, Step 2) - - Write PRD (Step 3) - - Research codebase (Phase 2, Step 5) - - Configure context (Step 6) - - Activate task (Step 7) - - Implement (Phase 3, Step 8) - - Check quality (Step 9) - - Complete (Step 10) - ---- - -## Complex Task - Brainstorm First - -For complex or vague tasks, **automatically start the brainstorm process** — do NOT skip directly to implementation. Use `/trellis-brainstorm`. - -Summary: - -1. **Acknowledge and classify** - State your understanding -2. **Create task directory** - Track evolving requirements in `prd.md` -3. **Ask questions one at a time** - Update PRD after each answer -4. **Propose approaches** - For architectural decisions -5. **Confirm final requirements** - Get explicit approval -6. **Proceed to Task Workflow** - With clear requirements in PRD - ---- - -## Task Workflow (Development Tasks) - -**Why this workflow?** -- Run a dedicated research pass before coding -- Configure specs in jsonl context files -- Implement using injected context -- Verify with a separate check pass -- Result: Code that follows project conventions automatically - -### Overview: Two Entry Points - -``` -From Brainstorm (Complex Task): - PRD confirmed → Research → Configure Context → Activate → Implement → Check → Complete - -From Simple Task: - Confirm → Create Task → Write PRD → Research → Configure Context → Activate → Implement → Check → Complete -``` - -**Key principle: Research happens AFTER requirements are clear (PRD exists).** - ---- - -### Phase 1: Establish Requirements - -#### Path A: From Brainstorm (skip to Phase 2) - -PRD and task directory already exist from brainstorm. Skip directly to Phase 2. - -#### Path B: From Simple Task - -**Step 1: Confirm Understanding** `[AI]` - -Quick confirm: -- What is the goal? -- What type of development? (frontend / backend / fullstack) -- Any specific requirements or constraints? - -If unclear, ask clarifying questions. - -**Step 2: Create Task Directory** `[AI]` - -```bash -TASK_DIR=$(python3 ./.trellis/scripts/task.py create "<title>" --slug <name>) -``` - -**Step 3: Write PRD** `[AI]` - -Create `prd.md` in the task directory with: - -```markdown -# <Task Title> - -## Goal -<What we're trying to achieve> - -## Requirements -- <Requirement 1> -- <Requirement 2> - -## Acceptance Criteria -- [ ] <Criterion 1> -- [ ] <Criterion 2> - -## Technical Notes -<Any technical decisions or constraints> -``` - ---- - -### Phase 2: Prepare for Implementation (shared) - -> Both paths converge here. PRD and task directory must exist before proceeding. - -**Step 4: Code-Spec Depth Check** `[AI]` - -If the task touches infra or cross-layer contracts, do not start implementation until code-spec depth is defined. - -Trigger this requirement when the change includes any of: -- New or changed command/API signatures -- Database schema or migration changes -- Infra integrations (storage, queue, cache, secrets, env contracts) -- Cross-layer payload transformations - -Must-have before proceeding: -- [ ] Target code-spec files to update are identified -- [ ] Concrete contract is defined (signature, fields, env keys) -- [ ] Validation and error matrix is defined -- [ ] At least one Good/Base/Bad case is defined - -**Step 5: Research the Codebase** `[AI]` - -Based on the confirmed PRD, run a focused research pass and produce: - -1. Relevant spec files in `.trellis/spec/` -2. Existing code patterns to follow (2-3 examples) -3. Files that will likely need modification - -Use this output format: - -```markdown -## Relevant Specs -- <path>: <why it's relevant> - -## Code Patterns Found -- <pattern>: <example file path> - -## Files to Modify -- <path>: <what change> -``` - -**Step 6: Configure Context** `[AI]` - -Initialize default context: - -```bash -python3 ./.trellis/scripts/task.py init-context "$TASK_DIR" <type> -# type: backend | frontend | fullstack -``` - -Add specs found in your research pass: - -```bash -# For each relevant spec and code pattern: -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<path>" "<reason>" -python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" check "<path>" "<reason>" -``` - -**Step 7: Activate Task** `[AI]` - -```bash -python3 ./.trellis/scripts/task.py start "$TASK_DIR" -``` - -This sets `.current-task` so hooks can inject context. - ---- - -### Phase 3: Execute (shared) - -**Step 8: Implement** `[AI]` - -Implement the task described in `prd.md`. - -- Follow all specs injected into implement context -- Keep changes scoped to requirements -- Run lint and typecheck before finishing - -**Step 9: Check Quality** `[AI]` - -Run a quality pass against check context: - -- Review all code changes against the specs -- Fix issues directly -- Ensure lint and typecheck pass - -**Step 10: Complete** `[AI]` - -1. Verify lint and typecheck pass -2. Report what was implemented -3. Remind user to: - - Test the changes - - Commit when ready - - Run `/trellis-record-session` to record this session - ---- - -## User Available Commands `[USER]` - -The following slash commands are for users (not AI): - -| Command | Description | -|---------|-------------| -| `/trellis-start` | Start development session (this command) | -| `/trellis-brainstorm` | Clarify vague requirements before implementation | -| `/trellis-before-dev` | Read development guidelines | -| `/trellis-check` | Check code quality | -| `/trellis-check-cross-layer` | Cross-layer verification | -| `/trellis-finish-work` | Pre-commit checklist | -| `/trellis-record-session` | Record session progress | - ---- - -## AI Executed Scripts `[AI]` - -| Script | Purpose | -|--------|---------| -| `python3 ./.trellis/scripts/task.py create "<title>" [--slug <name>]` | Create task directory | -| `python3 ./.trellis/scripts/task.py list` | List active tasks | -| `python3 ./.trellis/scripts/task.py archive <name>` | Archive task | -| `python3 ./.trellis/scripts/get_context.py` | Get session context | - ---- - -## Platform Detection - -Trellis auto-detects your platform based on config directories. For Cursor users, ensure detection works correctly: - -| Condition | Detected Platform | -|-----------|-------------------| -| Only `.cursor/` exists | `cursor` ✅ | -| Both `.cursor/` and `.claude/` exist | `claude` (default) | - -If auto-detection fails, set manually: - -```bash -export TRELLIS_PLATFORM=cursor -``` - -Or prefix commands: - -```bash -TRELLIS_PLATFORM=cursor python3 ./.trellis/scripts/task.py list -``` - ---- - -## Session End Reminder - -**IMPORTANT**: When a task or session is completed, remind the user: - -> Before ending this session, please run `/trellis-record-session` to record what we accomplished. diff --git a/.cursor/commands/trellis-update-spec.md b/.cursor/commands/trellis-update-spec.md deleted file mode 100644 index 84736af3..00000000 --- a/.cursor/commands/trellis-update-spec.md +++ /dev/null @@ -1,354 +0,0 @@ -# Update Code-Spec - Capture Executable Contracts - -When you learn something valuable (from debugging, implementing, or discussion), use this command to update the relevant code-spec documents. - -**Timing**: After completing a task, fixing a bug, or discovering a new pattern - ---- - -## Code-Spec First Rule (CRITICAL) - -In this project, "spec" for implementation work means **code-spec**: -- Executable contracts (not principle-only text) -- Concrete signatures, payload fields, env keys, and boundary behavior -- Testable validation/error behavior - -If the change touches infra or cross-layer contracts, code-spec depth is mandatory. - -### Mandatory Triggers - -Apply code-spec depth when the change includes any of: -- New/changed command or API signature -- Cross-layer request/response contract change -- Database schema/migration change -- Infra integration (storage, queue, cache, secrets, env wiring) - -### Mandatory Output (7 Sections) - -For triggered tasks, include all sections below: -1. Scope / Trigger -2. Signatures (command/API/DB) -3. Contracts (request/response/env) -4. Validation & Error Matrix -5. Good/Base/Bad Cases -6. Tests Required (with assertion points) -7. Wrong vs Correct (at least one pair) - ---- - -## When to Update Code-Specs - -| Trigger | Example | Target Spec | -|---------|---------|-------------| -| **Implemented a feature** | Added template download with giget | Relevant `backend/` or `frontend/` file | -| **Made a design decision** | Used type field + mapping table for extensibility | Relevant code-spec + "Design Decisions" section | -| **Fixed a bug** | Found a subtle issue with error handling | `backend/error-handling.md` | -| **Discovered a pattern** | Found a better way to structure code | Relevant `backend/` or `frontend/` file | -| **Hit a gotcha** | Learned that X must be done before Y | Relevant code-spec + "Common Mistakes" section | -| **Established a convention** | Team agreed on naming pattern | `quality-guidelines.md` | -| **New thinking trigger** | "Don't forget to check X before doing Y" | `guides/*.md` (as a checklist item, not detailed rules) | - -**Key Insight**: Code-spec updates are NOT just for problems. Every feature implementation contains design decisions and contracts that future AI/developers need to execute safely. - ---- - -## Spec Structure Overview - -``` -.trellis/spec/ -├── backend/ # Backend coding standards -│ ├── index.md # Overview and links -│ └── *.md # Topic-specific guidelines -├── frontend/ # Frontend coding standards -│ ├── index.md # Overview and links -│ └── *.md # Topic-specific guidelines -└── guides/ # Thinking checklists (NOT coding specs!) - ├── index.md # Guide index - └── *.md # Topic-specific guides -``` - -### CRITICAL: Code-Spec vs Guide - Know the Difference - -| Type | Location | Purpose | Content Style | -|------|----------|---------|---------------| -| **Code-Spec** | `backend/*.md`, `frontend/*.md` | Tell AI "how to implement safely" | Signatures, contracts, matrices, cases, test points | -| **Guide** | `guides/*.md` | Help AI "what to think about" | Checklists, questions, pointers to specs | - -**Decision Rule**: Ask yourself: - -- "This is **how to write** the code" → Put in `backend/` or `frontend/` -- "This is **what to consider** before writing" → Put in `guides/` - -**Example**: - -| Learning | Wrong Location | Correct Location | -|----------|----------------|------------------| -| "Use `reconfigure()` not `TextIOWrapper` for Windows stdout" | ❌ `guides/cross-platform-thinking-guide.md` | ✅ `backend/script-conventions.md` | -| "Remember to check encoding when writing cross-platform code" | ❌ `backend/script-conventions.md` | ✅ `guides/cross-platform-thinking-guide.md` | - -**Guides should be short checklists that point to specs**, not duplicate the detailed rules. - ---- - -## Update Process - -### Step 1: Identify What You Learned - -Answer these questions: - -1. **What did you learn?** (Be specific) -2. **Why is it important?** (What problem does it prevent?) -3. **Where does it belong?** (Which spec file?) - -### Step 2: Classify the Update Type - -| Type | Description | Action | -|------|-------------|--------| -| **Design Decision** | Why we chose approach X over Y | Add to "Design Decisions" section | -| **Project Convention** | How we do X in this project | Add to relevant section with examples | -| **New Pattern** | A reusable approach discovered | Add to "Patterns" section | -| **Forbidden Pattern** | Something that causes problems | Add to "Anti-patterns" or "Don't" section | -| **Common Mistake** | Easy-to-make error | Add to "Common Mistakes" section | -| **Convention** | Agreed-upon standard | Add to relevant section | -| **Gotcha** | Non-obvious behavior | Add warning callout | - -### Step 3: Read the Target Code-Spec - -Before editing, read the current code-spec to: -- Understand existing structure -- Avoid duplicating content -- Find the right section for your update - -```bash -cat .trellis/spec/<category>/<file>.md -``` - -### Step 4: Make the Update - -Follow these principles: - -1. **Be Specific**: Include concrete examples, not just abstract rules -2. **Explain Why**: State the problem this prevents -3. **Show Contracts**: Add signatures, payload fields, and error behavior -4. **Show Code**: Add code snippets for key patterns -5. **Keep it Short**: One concept per section - -### Step 5: Update the Index (if needed) - -If you added a new section or the code-spec status changed, update the category's `index.md`. - ---- - -## Update Templates - -### Mandatory Template for Infra/Cross-Layer Work - -```markdown -## Scenario: <name> - -### 1. Scope / Trigger -- Trigger: <why this requires code-spec depth> - -### 2. Signatures -- Backend command/API/DB signature(s) - -### 3. Contracts -- Request fields (name, type, constraints) -- Response fields (name, type, constraints) -- Environment keys (required/optional) - -### 4. Validation & Error Matrix -- <condition> -> <error> - -### 5. Good/Base/Bad Cases -- Good: ... -- Base: ... -- Bad: ... - -### 6. Tests Required -- Unit/Integration/E2E with assertion points - -### 7. Wrong vs Correct -#### Wrong -... -#### Correct -... -``` - -### Adding a Design Decision - -```markdown -### Design Decision: [Decision Name] - -**Context**: What problem were we solving? - -**Options Considered**: -1. Option A - brief description -2. Option B - brief description - -**Decision**: We chose Option X because... - -**Example**: -\`\`\`typescript -// How it's implemented -code example -\`\`\` - -**Extensibility**: How to extend this in the future... -``` - -### Adding a Project Convention - -```markdown -### Convention: [Convention Name] - -**What**: Brief description of the convention. - -**Why**: Why we do it this way in this project. - -**Example**: -\`\`\`typescript -// How to follow this convention -code example -\`\`\` - -**Related**: Links to related conventions or specs. -``` - -### Adding a New Pattern - -```markdown -### Pattern Name - -**Problem**: What problem does this solve? - -**Solution**: Brief description of the approach. - -**Example**: -\`\`\` -// Good -code example - -// Bad -code example -\`\`\` - -**Why**: Explanation of why this works better. -``` - -### Adding a Forbidden Pattern - -```markdown -### Don't: Pattern Name - -**Problem**: -\`\`\` -// Don't do this -bad code example -\`\`\` - -**Why it's bad**: Explanation of the issue. - -**Instead**: -\`\`\` -// Do this instead -good code example -\`\`\` -``` - -### Adding a Common Mistake - -```markdown -### Common Mistake: Description - -**Symptom**: What goes wrong - -**Cause**: Why this happens - -**Fix**: How to correct it - -**Prevention**: How to avoid it in the future -``` - -### Adding a Gotcha - -```markdown -> **Warning**: Brief description of the non-obvious behavior. -> -> Details about when this happens and how to handle it. -``` - ---- - -## Interactive Mode - -If you're unsure what to update, answer these prompts: - -1. **What did you just finish?** - - [ ] Fixed a bug - - [ ] Implemented a feature - - [ ] Refactored code - - [ ] Had a discussion about approach - -2. **What did you learn or decide?** - - Design decision (why X over Y) - - Project convention (how we do X) - - Non-obvious behavior (gotcha) - - Better approach (pattern) - -3. **Would future AI/developers need to know this?** - - To understand how the code works → Yes, update spec - - To maintain or extend the feature → Yes, update spec - - To avoid repeating mistakes → Yes, update spec - - Purely one-off implementation detail → Maybe skip - -4. **Which area does it relate to?** - - [ ] Backend code - - [ ] Frontend code - - [ ] Cross-layer data flow - - [ ] Code organization/reuse - - [ ] Quality/testing - ---- - -## Quality Checklist - -Before finishing your code-spec update: - -- [ ] Is the content specific and actionable? -- [ ] Did you include a code example? -- [ ] Did you explain WHY, not just WHAT? -- [ ] Did you include executable signatures/contracts? -- [ ] Did you include validation and error matrix? -- [ ] Did you include Good/Base/Bad cases? -- [ ] Did you include required tests with assertion points? -- [ ] Is it in the right code-spec file? -- [ ] Does it duplicate existing content? -- [ ] Would a new team member understand it? - ---- - -## Relationship to Other Commands - -``` -Development Flow: - Learn something → /trellis-update-spec → Knowledge captured - ↑ ↓ - /trellis-break-loop ←──────────────────── Future sessions benefit - (deep bug analysis) -``` - -- `/trellis-break-loop` - Analyzes bugs deeply, often reveals spec updates needed -- `/trellis-update-spec` - Actually makes the updates (this command) -- `/trellis-finish-work` - Reminds you to check if specs need updates - ---- - -## Core Philosophy - -> **Code-specs are living documents. Every debugging session, every "aha moment" is an opportunity to make the implementation contract clearer.** - -The goal is **institutional memory**: -- What one person learns, everyone benefits from -- What AI learns in one session, persists to future sessions -- Mistakes become documented guardrails diff --git a/.cursor/skills/ui-ux-pro-max/SKILL.md b/.cursor/skills/ui-ux-pro-max/SKILL.md deleted file mode 100644 index f53d42ba..00000000 --- a/.cursor/skills/ui-ux-pro-max/SKILL.md +++ /dev/null @@ -1,288 +0,0 @@ -# ui-ux-pro-max - -Comprehensive design guide for web and mobile applications. Contains 67 styles, 96 color palettes, 57 font pairings, 99 UX guidelines, and 25 chart types across 13 technology stacks. Searchable database with priority-based recommendations. - -## Prerequisites - -Check if Python is installed: - -```bash -python3 --version || python --version -``` - -If Python is not installed, install it based on user's OS: - -**macOS:** -```bash -brew install python3 -``` - -**Ubuntu/Debian:** -```bash -sudo apt update && sudo apt install python3 -``` - -**Windows:** -```powershell -winget install Python.Python.3.12 -``` - ---- - -## How to Use This Skill - -When user requests UI/UX work (design, build, create, implement, review, fix, improve), follow this workflow: - -### Step 1: Analyze User Requirements - -Extract key information from user request: -- **Product type**: SaaS, e-commerce, portfolio, dashboard, landing page, etc. -- **Style keywords**: minimal, playful, professional, elegant, dark mode, etc. -- **Industry**: healthcare, fintech, gaming, education, etc. -- **Stack**: React, Vue, Next.js, or default to `html-tailwind` - -### Step 2: Generate Design System (REQUIRED) - -**Always start with `--design-system`** to get comprehensive recommendations with reasoning: - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "<product_type> <industry> <keywords>" --design-system [-p "Project Name"] -``` - -This command: -1. Searches 5 domains in parallel (product, style, color, landing, typography) -2. Applies reasoning rules from `ui-reasoning.csv` to select best matches -3. Returns complete design system: pattern, style, colors, typography, effects -4. Includes anti-patterns to avoid - -**Example:** -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service" --design-system -p "Serenity Spa" -``` - -### Step 2b: Persist Design System (Master + Overrides Pattern) - -To save the design system for hierarchical retrieval across sessions, add `--persist`: - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name" -``` - -This creates: -- `design-system/MASTER.md` — Global Source of Truth with all design rules -- `design-system/pages/` — Folder for page-specific overrides - -**With page-specific override:** -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name" --page "dashboard" -``` - -This also creates: -- `design-system/pages/dashboard.md` — Page-specific deviations from Master - -**How hierarchical retrieval works:** -1. When building a specific page (e.g., "Checkout"), first check `design-system/pages/checkout.md` -2. If the page file exists, its rules **override** the Master file -3. If not, use `design-system/MASTER.md` exclusively - -### Step 3: Supplement with Detailed Searches (as needed) - -After getting the design system, use domain searches to get additional details: - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --domain <domain> [-n <max_results>] -``` - -**When to use detailed searches:** - -| Need | Domain | Example | -|------|--------|---------| -| More style options | `style` | `--domain style "glassmorphism dark"` | -| Chart recommendations | `chart` | `--domain chart "real-time dashboard"` | -| UX best practices | `ux` | `--domain ux "animation accessibility"` | -| Alternative fonts | `typography` | `--domain typography "elegant luxury"` | -| Landing structure | `landing` | `--domain landing "hero social-proof"` | - -### Step 4: Stack Guidelines (Default: html-tailwind) - -Get implementation-specific best practices. If user doesn't specify a stack, **default to `html-tailwind`**. - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --stack html-tailwind -``` - -Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`, `react-native`, `flutter`, `shadcn`, `jetpack-compose` - ---- - -## Search Reference - -### Available Domains - -| Domain | Use For | Example Keywords | -|--------|---------|------------------| -| `product` | Product type recommendations | SaaS, e-commerce, portfolio, healthcare, beauty, service | -| `style` | UI styles, colors, effects | glassmorphism, minimalism, dark mode, brutalism | -| `typography` | Font pairings, Google Fonts | elegant, playful, professional, modern | -| `color` | Color palettes by product type | saas, ecommerce, healthcare, beauty, fintech, service | -| `landing` | Page structure, CTA strategies | hero, hero-centric, testimonial, pricing, social-proof | -| `chart` | Chart types, library recommendations | trend, comparison, timeline, funnel, pie | -| `ux` | Best practices, anti-patterns | animation, accessibility, z-index, loading | -| `react` | React/Next.js performance | waterfall, bundle, suspense, memo, rerender, cache | -| `web` | Web interface guidelines | aria, focus, keyboard, semantic, virtualize | -| `prompt` | AI prompts, CSS keywords | (style name) | - -### Available Stacks - -| Stack | Focus | -|-------|-------| -| `html-tailwind` | Tailwind utilities, responsive, a11y (DEFAULT) | -| `react` | State, hooks, performance, patterns | -| `nextjs` | SSR, routing, images, API routes | -| `vue` | Composition API, Pinia, Vue Router | -| `svelte` | Runes, stores, SvelteKit | -| `swiftui` | Views, State, Navigation, Animation | -| `react-native` | Components, Navigation, Lists | -| `flutter` | Widgets, State, Layout, Theming | -| `shadcn` | shadcn/ui components, theming, forms, patterns | -| `jetpack-compose` | Composables, Modifiers, State Hoisting, Recomposition | - ---- - -## Example Workflow - -**User request:** "Làm landing page cho dịch vụ chăm sóc da chuyên nghiệp" - -### Step 1: Analyze Requirements -- Product type: Beauty/Spa service -- Style keywords: elegant, professional, soft -- Industry: Beauty/Wellness -- Stack: html-tailwind (default) - -### Step 2: Generate Design System (REQUIRED) - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service elegant" --design-system -p "Serenity Spa" -``` - -**Output:** Complete design system with pattern, style, colors, typography, effects, and anti-patterns. - -### Step 3: Supplement with Detailed Searches (as needed) - -```bash -# Get UX guidelines for animation and accessibility -python3 skills/ui-ux-pro-max/scripts/search.py "animation accessibility" --domain ux - -# Get alternative typography options if needed -python3 skills/ui-ux-pro-max/scripts/search.py "elegant luxury serif" --domain typography -``` - -### Step 4: Stack Guidelines - -```bash -python3 skills/ui-ux-pro-max/scripts/search.py "layout responsive form" --stack html-tailwind -``` - -**Then:** Synthesize design system + detailed searches and implement the design. - ---- - -## Output Formats - -The `--design-system` flag supports two output formats: - -```bash -# ASCII box (default) - best for terminal display -python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system - -# Markdown - best for documentation -python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system -f markdown -``` - ---- - -## Tips for Better Results - -1. **Be specific with keywords** - "healthcare SaaS dashboard" > "app" -2. **Search multiple times** - Different keywords reveal different insights -3. **Combine domains** - Style + Typography + Color = Complete design system -4. **Always check UX** - Search "animation", "z-index", "accessibility" for common issues -5. **Use stack flag** - Get implementation-specific best practices -6. **Iterate** - If first search doesn't match, try different keywords - ---- - -## Common Rules for Professional UI - -These are frequently overlooked issues that make UI look unprofessional: - -### Icons & Visual Elements - -| Rule | Do | Don't | -|------|----|----- | -| **No emoji icons** | Use SVG icons (Heroicons, Lucide, Simple Icons) | Use emojis like 🎨 🚀 ⚙️ as UI icons | -| **Stable hover states** | Use color/opacity transitions on hover | Use scale transforms that shift layout | -| **Correct brand logos** | Research official SVG from Simple Icons | Guess or use incorrect logo paths | -| **Consistent icon sizing** | Use fixed viewBox (24x24) with w-6 h-6 | Mix different icon sizes randomly | - -### Interaction & Cursor - -| Rule | Do | Don't | -|------|----|----- | -| **Cursor pointer** | Add `cursor-pointer` to all clickable/hoverable cards | Leave default cursor on interactive elements | -| **Hover feedback** | Provide visual feedback (color, shadow, border) | No indication element is interactive | -| **Smooth transitions** | Use `transition-colors duration-200` | Instant state changes or too slow (>500ms) | - -### Light/Dark Mode Contrast - -| Rule | Do | Don't | -|------|----|----- | -| **Glass card light mode** | Use `bg-white/80` or higher opacity | Use `bg-white/10` (too transparent) | -| **Text contrast light** | Use `#0F172A` (slate-900) for text | Use `#94A3B8` (slate-400) for body text | -| **Muted text light** | Use `#475569` (slate-600) minimum | Use gray-400 or lighter | -| **Border visibility** | Use `border-gray-200` in light mode | Use `border-white/10` (invisible) | - -### Layout & Spacing - -| Rule | Do | Don't | -|------|----|----- | -| **Floating navbar** | Add `top-4 left-4 right-4` spacing | Stick navbar to `top-0 left-0 right-0` | -| **Content padding** | Account for fixed navbar height | Let content hide behind fixed elements | -| **Consistent max-width** | Use same `max-w-6xl` or `max-w-7xl` | Mix different container widths | - ---- - -## Pre-Delivery Checklist - -Before delivering UI code, verify these items: - -### Visual Quality -- [ ] No emojis used as icons (use SVG instead) -- [ ] All icons from consistent icon set (Heroicons/Lucide) -- [ ] Brand logos are correct (verified from Simple Icons) -- [ ] Hover states don't cause layout shift -- [ ] Use theme colors directly (bg-primary) not var() wrapper - -### Interaction -- [ ] All clickable elements have `cursor-pointer` -- [ ] Hover states provide clear visual feedback -- [ ] Transitions are smooth (150-300ms) -- [ ] Focus states visible for keyboard navigation - -### Light/Dark Mode -- [ ] Light mode text has sufficient contrast (4.5:1 minimum) -- [ ] Glass/transparent elements visible in light mode -- [ ] Borders visible in both modes -- [ ] Test both modes before delivery - -### Layout -- [ ] Floating elements have proper spacing from edges -- [ ] No content hidden behind fixed navbars -- [ ] Responsive at 375px, 768px, 1024px, 1440px -- [ ] No horizontal scroll on mobile - -### Accessibility -- [ ] All images have alt text -- [ ] Form inputs have labels -- [ ] Color is not the only indicator -- [ ] `prefers-reduced-motion` respected diff --git a/.cursor/skills/ui-ux-pro-max/data/charts.csv b/.cursor/skills/ui-ux-pro-max/data/charts.csv deleted file mode 100644 index 9463c37d..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/charts.csv +++ /dev/null @@ -1,26 +0,0 @@ -No,Data Type,Keywords,Best Chart Type,Secondary Options,Color Guidance,Performance Impact,Accessibility Notes,Library Recommendation,Interactive Level -1,Trend Over Time,"trend, time-series, line, growth, timeline, progress",Line Chart,"Area Chart, Smooth Area",Primary: #0080FF. Multiple series: use distinct colors. Fill: 20% opacity,⚡ Excellent (optimized),✓ Clear line patterns for colorblind users. Add pattern overlays.,"Chart.js, Recharts, ApexCharts",Hover + Zoom -2,Compare Categories,"compare, categories, bar, comparison, ranking",Bar Chart (Horizontal or Vertical),"Column Chart, Grouped Bar",Each bar: distinct color. Category: grouped same color. Sorted: descending order,⚡ Excellent,✓ Easy to compare. Add value labels on bars for clarity.,"Chart.js, Recharts, D3.js",Hover + Sort -3,Part-to-Whole,"part-to-whole, pie, donut, percentage, proportion, share",Pie Chart or Donut,"Stacked Bar, Treemap",Colors: 5-6 max. Contrasting palette. Large slices first. Use labels.,⚡ Good (limit 6 slices),⚠ Hard for accessibility. Better: Stacked bar with legend. Avoid pie if >5 items.,"Chart.js, Recharts, D3.js",Hover + Drill -4,Correlation/Distribution,"correlation, distribution, scatter, relationship, pattern",Scatter Plot or Bubble Chart,"Heat Map, Matrix",Color axis: gradient (blue-red). Size: relative. Opacity: 0.6-0.8 to show density,⚠ Moderate (many points),⚠ Provide data table alternative. Use pattern + color distinction.,"D3.js, Plotly, Recharts",Hover + Brush -5,Heatmap/Intensity,"heatmap, heat-map, intensity, density, matrix",Heat Map or Choropleth,"Grid Heat Map, Bubble Heat",Gradient: Cool (blue) to Hot (red). Scale: clear legend. Divergent for ±data,⚡ Excellent (color CSS),⚠ Colorblind: Use pattern overlay. Provide numerical legend.,"D3.js, Plotly, ApexCharts",Hover + Zoom -6,Geographic Data,"geographic, map, location, region, geo, spatial","Choropleth Map, Bubble Map",Geographic Heat Map,Regional: single color gradient or categorized colors. Legend: clear scale,⚠ Moderate (rendering),⚠ Include text labels for regions. Provide data table alternative.,"D3.js, Mapbox, Leaflet",Pan + Zoom + Drill -7,Funnel/Flow,funnel/flow,"Funnel Chart, Sankey",Waterfall (for flows),Stages: gradient (starting color → ending color). Show conversion %,⚡ Good,✓ Clear stage labels + percentages. Good for accessibility if labeled.,"D3.js, Recharts, Custom SVG",Hover + Drill -8,Performance vs Target,performance-vs-target,Gauge Chart or Bullet Chart,"Dial, Thermometer",Performance: Red→Yellow→Green gradient. Target: marker line. Threshold colors,⚡ Good,✓ Add numerical value + percentage label beside gauge.,"D3.js, ApexCharts, Custom SVG",Hover -9,Time-Series Forecast,time-series-forecast,Line with Confidence Band,Ribbon Chart,Actual: solid line #0080FF. Forecast: dashed #FF9500. Band: light shading,⚡ Good,✓ Clearly distinguish actual vs forecast. Add legend.,"Chart.js, ApexCharts, Plotly",Hover + Toggle -10,Anomaly Detection,anomaly-detection,Line Chart with Highlights,Scatter with Alert,Normal: blue #0080FF. Anomaly: red #FF0000 circle/square marker + alert,⚡ Good,✓ Circle/marker for anomalies. Add text alert annotation.,"D3.js, Plotly, ApexCharts",Hover + Alert -11,Hierarchical/Nested Data,hierarchical/nested-data,Treemap,"Sunburst, Nested Donut, Icicle",Parent: distinct hues. Children: lighter shades. White borders 2-3px.,⚠ Moderate,⚠ Poor - provide table alternative. Label large areas.,"D3.js, Recharts, ApexCharts",Hover + Drilldown -12,Flow/Process Data,flow/process-data,Sankey Diagram,"Alluvial, Chord Diagram",Gradient from source to target. Opacity 0.4-0.6 for flows.,⚠ Moderate,⚠ Poor - provide flow table alternative.,"D3.js (d3-sankey), Plotly",Hover + Drilldown -13,Cumulative Changes,cumulative-changes,Waterfall Chart,"Stacked Bar, Cascade",Increases: #4CAF50. Decreases: #F44336. Start: #2196F3. End: #0D47A1.,⚡ Good,✓ Good - clear directional colors with labels.,"ApexCharts, Highcharts, Plotly",Hover -14,Multi-Variable Comparison,multi-variable-comparison,Radar/Spider Chart,"Parallel Coordinates, Grouped Bar",Single: #0080FF 20% fill. Multiple: distinct colors per dataset.,⚡ Good,⚠ Moderate - limit 5-8 axes. Add data table.,"Chart.js, Recharts, ApexCharts",Hover + Toggle -15,Stock/Trading OHLC,stock/trading-ohlc,Candlestick Chart,"OHLC Bar, Heikin-Ashi",Bullish: #26A69A. Bearish: #EF5350. Volume: 40% opacity below.,⚡ Good,⚠ Moderate - provide OHLC data table.,"Lightweight Charts (TradingView), ApexCharts",Real-time + Hover + Zoom -16,Relationship/Connection Data,relationship/connection-data,Network Graph,"Hierarchical Tree, Adjacency Matrix",Node types: categorical colors. Edges: #90A4AE 60% opacity.,❌ Poor (500+ nodes struggles),❌ Very Poor - provide adjacency list alternative.,"D3.js (d3-force), Vis.js, Cytoscape.js",Drilldown + Hover + Drag -17,Distribution/Statistical,distribution/statistical,Box Plot,"Violin Plot, Beeswarm",Box: #BBDEFB. Border: #1976D2. Median: #D32F2F. Outliers: #F44336.,⚡ Excellent,"✓ Good - include stats table (min, Q1, median, Q3, max).","Plotly, D3.js, Chart.js (plugin)",Hover -18,Performance vs Target (Compact),performance-vs-target-(compact),Bullet Chart,"Gauge, Progress Bar","Ranges: #FFCDD2, #FFF9C4, #C8E6C9. Performance: #1976D2. Target: black 3px.",⚡ Excellent,✓ Excellent - compact with clear values.,"D3.js, Plotly, Custom SVG",Hover -19,Proportional/Percentage,proportional/percentage,Waffle Chart,"Pictogram, Stacked Bar 100%",10x10 grid. 3-5 categories max. 2-3px spacing between squares.,⚡ Good,✓ Good - better than pie for accessibility.,"D3.js, React-Waffle, Custom CSS Grid",Hover -20,Hierarchical Proportional,hierarchical-proportional,Sunburst Chart,"Treemap, Icicle, Circle Packing",Center to outer: darker to lighter. 15-20% lighter per level.,⚠ Moderate,⚠ Poor - provide hierarchy table alternative.,"D3.js (d3-hierarchy), Recharts, ApexCharts",Drilldown + Hover -21,Root Cause Analysis,"root cause, decomposition, tree, hierarchy, drill-down, ai-split",Decomposition Tree,"Decision Tree, Flow Chart",Nodes: #2563EB (Primary) vs #EF4444 (Negative impact). Connectors: Neutral grey.,⚠ Moderate (calculation heavy),✓ clear hierarchy. Allow keyboard navigation for nodes.,"Power BI (native), React-Flow, Custom D3.js",Drill + Expand -22,3D Spatial Data,"3d, spatial, immersive, terrain, molecular, volumetric",3D Scatter/Surface Plot,"Volumetric Rendering, Point Cloud",Depth cues: lighting/shading. Z-axis: color gradient (cool to warm).,❌ Heavy (WebGL required),❌ Poor - requires alternative 2D view or data table.,"Three.js, Deck.gl, Plotly 3D",Rotate + Zoom + VR -23,Real-Time Streaming,"streaming, real-time, ticker, live, velocity, pulse",Streaming Area Chart,"Ticker Tape, Moving Gauge",Current: Bright Pulse (#00FF00). History: Fading opacity. Grid: Dark.,⚡ Optimized (canvas/webgl),⚠ Flashing elements - provide pause button. High contrast.,Smoothed D3.js, CanvasJS -24,Sentiment/Emotion,"sentiment, emotion, nlp, opinion, feeling",Word Cloud with Sentiment,"Sentiment Arc, Radar Chart",Positive: #22C55E. Negative: #EF4444. Neutral: #94A3B8. Size = Frequency.,⚡ Good,⚠ Word clouds poor for screen readers. Use list view.,"D3-cloud, Highcharts, Nivo",Hover + Filter -25,Process Mining,"process, mining, variants, path, bottleneck, log",Process Map / Graph,"Directed Acyclic Graph (DAG), Petri Net",Happy path: #10B981 (Thick). Deviations: #F59E0B (Thin). Bottlenecks: #EF4444.,⚠ Moderate to Heavy,⚠ Complex graphs hard to navigate. Provide path summary.,"React-Flow, Cytoscape.js, Recharts",Drag + Node-Click diff --git a/.cursor/skills/ui-ux-pro-max/data/colors.csv b/.cursor/skills/ui-ux-pro-max/data/colors.csv deleted file mode 100644 index a1878457..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/colors.csv +++ /dev/null @@ -1,97 +0,0 @@ -No,Product Type,Primary (Hex),Secondary (Hex),CTA (Hex),Background (Hex),Text (Hex),Border (Hex),Notes -1,SaaS (General),#2563EB,#3B82F6,#F97316,#F8FAFC,#1E293B,#E2E8F0,Trust blue + orange CTA contrast -2,Micro SaaS,#6366F1,#818CF8,#10B981,#F5F3FF,#1E1B4B,#E0E7FF,Indigo primary + emerald CTA -3,E-commerce,#059669,#10B981,#F97316,#ECFDF5,#064E3B,#A7F3D0,Success green + urgency orange -4,E-commerce Luxury,#1C1917,#44403C,#CA8A04,#FAFAF9,#0C0A09,#D6D3D1,Premium dark + gold accent -5,Service Landing Page,#0EA5E9,#38BDF8,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Sky blue trust + warm CTA -6,B2B Service,#0F172A,#334155,#0369A1,#F8FAFC,#020617,#E2E8F0,Professional navy + blue CTA -7,Financial Dashboard,#0F172A,#1E293B,#22C55E,#020617,#F8FAFC,#334155,Dark bg + green positive indicators -8,Analytics Dashboard,#1E40AF,#3B82F6,#F59E0B,#F8FAFC,#1E3A8A,#DBEAFE,Blue data + amber highlights -9,Healthcare App,#0891B2,#22D3EE,#059669,#ECFEFF,#164E63,#A5F3FC,Calm cyan + health green -10,Educational App,#4F46E5,#818CF8,#F97316,#EEF2FF,#1E1B4B,#C7D2FE,Playful indigo + energetic orange -11,Creative Agency,#EC4899,#F472B6,#06B6D4,#FDF2F8,#831843,#FBCFE8,Bold pink + cyan accent -12,Portfolio/Personal,#18181B,#3F3F46,#2563EB,#FAFAFA,#09090B,#E4E4E7,Monochrome + blue accent -13,Gaming,#7C3AED,#A78BFA,#F43F5E,#0F0F23,#E2E8F0,#4C1D95,Neon purple + rose action -14,Government/Public Service,#0F172A,#334155,#0369A1,#F8FAFC,#020617,#E2E8F0,High contrast navy + blue -15,Fintech/Crypto,#F59E0B,#FBBF24,#8B5CF6,#0F172A,#F8FAFC,#334155,Gold trust + purple tech -16,Social Media App,#E11D48,#FB7185,#2563EB,#FFF1F2,#881337,#FECDD3,Vibrant rose + engagement blue -17,Productivity Tool,#0D9488,#14B8A6,#F97316,#F0FDFA,#134E4A,#99F6E4,Teal focus + action orange -18,Design System/Component Library,#4F46E5,#6366F1,#F97316,#EEF2FF,#312E81,#C7D2FE,Indigo brand + doc hierarchy -19,AI/Chatbot Platform,#7C3AED,#A78BFA,#06B6D4,#FAF5FF,#1E1B4B,#DDD6FE,AI purple + cyan interactions -20,NFT/Web3 Platform,#8B5CF6,#A78BFA,#FBBF24,#0F0F23,#F8FAFC,#4C1D95,Purple tech + gold value -21,Creator Economy Platform,#EC4899,#F472B6,#F97316,#FDF2F8,#831843,#FBCFE8,Creator pink + engagement orange -22,Sustainability/ESG Platform,#059669,#10B981,#0891B2,#ECFDF5,#064E3B,#A7F3D0,Nature green + ocean blue -23,Remote Work/Collaboration Tool,#6366F1,#818CF8,#10B981,#F5F3FF,#312E81,#E0E7FF,Calm indigo + success green -24,Mental Health App,#8B5CF6,#C4B5FD,#10B981,#FAF5FF,#4C1D95,#EDE9FE,Calming lavender + wellness green -25,Pet Tech App,#F97316,#FB923C,#2563EB,#FFF7ED,#9A3412,#FED7AA,Playful orange + trust blue -26,Smart Home/IoT Dashboard,#1E293B,#334155,#22C55E,#0F172A,#F8FAFC,#475569,Dark tech + status green -27,EV/Charging Ecosystem,#0891B2,#22D3EE,#22C55E,#ECFEFF,#164E63,#A5F3FC,Electric cyan + eco green -28,Subscription Box Service,#D946EF,#E879F9,#F97316,#FDF4FF,#86198F,#F5D0FE,Excitement purple + urgency orange -29,Podcast Platform,#1E1B4B,#312E81,#F97316,#0F0F23,#F8FAFC,#4338CA,Dark audio + warm accent -30,Dating App,#E11D48,#FB7185,#F97316,#FFF1F2,#881337,#FECDD3,Romantic rose + warm orange -31,Micro-Credentials/Badges Platform,#0369A1,#0EA5E9,#CA8A04,#F0F9FF,#0C4A6E,#BAE6FD,Trust blue + achievement gold -32,Knowledge Base/Documentation,#475569,#64748B,#2563EB,#F8FAFC,#1E293B,#E2E8F0,Neutral grey + link blue -33,Hyperlocal Services,#059669,#10B981,#F97316,#ECFDF5,#064E3B,#A7F3D0,Location green + action orange -34,Beauty/Spa/Wellness Service,#EC4899,#F9A8D4,#8B5CF6,#FDF2F8,#831843,#FBCFE8,Soft pink + lavender luxury -35,Luxury/Premium Brand,#1C1917,#44403C,#CA8A04,#FAFAF9,#0C0A09,#D6D3D1,Premium black + gold accent -36,Restaurant/Food Service,#DC2626,#F87171,#CA8A04,#FEF2F2,#450A0A,#FECACA,Appetizing red + warm gold -37,Fitness/Gym App,#F97316,#FB923C,#22C55E,#1F2937,#F8FAFC,#374151,Energy orange + success green -38,Real Estate/Property,#0F766E,#14B8A6,#0369A1,#F0FDFA,#134E4A,#99F6E4,Trust teal + professional blue -39,Travel/Tourism Agency,#0EA5E9,#38BDF8,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Sky blue + adventure orange -40,Hotel/Hospitality,#1E3A8A,#3B82F6,#CA8A04,#F8FAFC,#1E40AF,#BFDBFE,Luxury navy + gold service -41,Wedding/Event Planning,#DB2777,#F472B6,#CA8A04,#FDF2F8,#831843,#FBCFE8,Romantic pink + elegant gold -42,Legal Services,#1E3A8A,#1E40AF,#B45309,#F8FAFC,#0F172A,#CBD5E1,Authority navy + trust gold -43,Insurance Platform,#0369A1,#0EA5E9,#22C55E,#F0F9FF,#0C4A6E,#BAE6FD,Security blue + protected green -44,Banking/Traditional Finance,#0F172A,#1E3A8A,#CA8A04,#F8FAFC,#020617,#E2E8F0,Trust navy + premium gold -45,Online Course/E-learning,#0D9488,#2DD4BF,#F97316,#F0FDFA,#134E4A,#5EEAD4,Progress teal + achievement orange -46,Non-profit/Charity,#0891B2,#22D3EE,#F97316,#ECFEFF,#164E63,#A5F3FC,Compassion blue + action orange -47,Music Streaming,#1E1B4B,#4338CA,#22C55E,#0F0F23,#F8FAFC,#312E81,Dark audio + play green -48,Video Streaming/OTT,#0F0F23,#1E1B4B,#E11D48,#000000,#F8FAFC,#312E81,Cinema dark + play red -49,Job Board/Recruitment,#0369A1,#0EA5E9,#22C55E,#F0F9FF,#0C4A6E,#BAE6FD,Professional blue + success green -50,Marketplace (P2P),#7C3AED,#A78BFA,#22C55E,#FAF5FF,#4C1D95,#DDD6FE,Trust purple + transaction green -51,Logistics/Delivery,#2563EB,#3B82F6,#F97316,#EFF6FF,#1E40AF,#BFDBFE,Tracking blue + delivery orange -52,Agriculture/Farm Tech,#15803D,#22C55E,#CA8A04,#F0FDF4,#14532D,#BBF7D0,Earth green + harvest gold -53,Construction/Architecture,#64748B,#94A3B8,#F97316,#F8FAFC,#334155,#E2E8F0,Industrial grey + safety orange -54,Automotive/Car Dealership,#1E293B,#334155,#DC2626,#F8FAFC,#0F172A,#E2E8F0,Premium dark + action red -55,Photography Studio,#18181B,#27272A,#F8FAFC,#000000,#FAFAFA,#3F3F46,Pure black + white contrast -56,Coworking Space,#F59E0B,#FBBF24,#2563EB,#FFFBEB,#78350F,#FDE68A,Energetic amber + booking blue -57,Cleaning Service,#0891B2,#22D3EE,#22C55E,#ECFEFF,#164E63,#A5F3FC,Fresh cyan + clean green -58,Home Services (Plumber/Electrician),#1E40AF,#3B82F6,#F97316,#EFF6FF,#1E3A8A,#BFDBFE,Professional blue + urgent orange -59,Childcare/Daycare,#F472B6,#FBCFE8,#22C55E,#FDF2F8,#9D174D,#FCE7F3,Soft pink + safe green -60,Senior Care/Elderly,#0369A1,#38BDF8,#22C55E,#F0F9FF,#0C4A6E,#E0F2FE,Calm blue + reassuring green -61,Medical Clinic,#0891B2,#22D3EE,#22C55E,#F0FDFA,#134E4A,#CCFBF1,Medical teal + health green -62,Pharmacy/Drug Store,#15803D,#22C55E,#0369A1,#F0FDF4,#14532D,#BBF7D0,Pharmacy green + trust blue -63,Dental Practice,#0EA5E9,#38BDF8,#FBBF24,#F0F9FF,#0C4A6E,#BAE6FD,Fresh blue + smile yellow -64,Veterinary Clinic,#0D9488,#14B8A6,#F97316,#F0FDFA,#134E4A,#99F6E4,Caring teal + warm orange -65,Florist/Plant Shop,#15803D,#22C55E,#EC4899,#F0FDF4,#14532D,#BBF7D0,Natural green + floral pink -66,Bakery/Cafe,#92400E,#B45309,#F8FAFC,#FEF3C7,#78350F,#FDE68A,Warm brown + cream white -67,Coffee Shop,#78350F,#92400E,#FBBF24,#FEF3C7,#451A03,#FDE68A,Coffee brown + warm gold -68,Brewery/Winery,#7C2D12,#B91C1C,#CA8A04,#FEF2F2,#450A0A,#FECACA,Deep burgundy + craft gold -69,Airline,#1E3A8A,#3B82F6,#F97316,#EFF6FF,#1E40AF,#BFDBFE,Sky blue + booking orange -70,News/Media Platform,#DC2626,#EF4444,#1E40AF,#FEF2F2,#450A0A,#FECACA,Breaking red + link blue -71,Magazine/Blog,#18181B,#3F3F46,#EC4899,#FAFAFA,#09090B,#E4E4E7,Editorial black + accent pink -72,Freelancer Platform,#6366F1,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Creative indigo + hire green -73,Consulting Firm,#0F172A,#334155,#CA8A04,#F8FAFC,#020617,#E2E8F0,Authority navy + premium gold -74,Marketing Agency,#EC4899,#F472B6,#06B6D4,#FDF2F8,#831843,#FBCFE8,Bold pink + creative cyan -75,Event Management,#7C3AED,#A78BFA,#F97316,#FAF5FF,#4C1D95,#DDD6FE,Excitement purple + action orange -76,Conference/Webinar Platform,#1E40AF,#3B82F6,#22C55E,#EFF6FF,#1E3A8A,#BFDBFE,Professional blue + join green -77,Membership/Community,#7C3AED,#A78BFA,#22C55E,#FAF5FF,#4C1D95,#DDD6FE,Community purple + join green -78,Newsletter Platform,#0369A1,#0EA5E9,#F97316,#F0F9FF,#0C4A6E,#BAE6FD,Trust blue + subscribe orange -79,Digital Products/Downloads,#6366F1,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Digital indigo + buy green -80,Church/Religious Organization,#7C3AED,#A78BFA,#CA8A04,#FAF5FF,#4C1D95,#DDD6FE,Spiritual purple + warm gold -81,Sports Team/Club,#DC2626,#EF4444,#FBBF24,#FEF2F2,#7F1D1D,#FECACA,Team red + championship gold -82,Museum/Gallery,#18181B,#27272A,#F8FAFC,#FAFAFA,#09090B,#E4E4E7,Gallery black + white space -83,Theater/Cinema,#1E1B4B,#312E81,#CA8A04,#0F0F23,#F8FAFC,#4338CA,Dramatic dark + spotlight gold -84,Language Learning App,#4F46E5,#818CF8,#22C55E,#EEF2FF,#312E81,#C7D2FE,Learning indigo + progress green -85,Coding Bootcamp,#0F172A,#1E293B,#22C55E,#020617,#F8FAFC,#334155,Terminal dark + success green -86,Cybersecurity Platform,#00FF41,#0D0D0D,#FF3333,#000000,#E0E0E0,#1F1F1F,Matrix green + alert red -87,Developer Tool / IDE,#1E293B,#334155,#22C55E,#0F172A,#F8FAFC,#475569,Code dark + run green -88,Biotech / Life Sciences,#0EA5E9,#0284C7,#10B981,#F0F9FF,#0C4A6E,#BAE6FD,DNA blue + life green -89,Space Tech / Aerospace,#F8FAFC,#94A3B8,#3B82F6,#0B0B10,#F8FAFC,#1E293B,Star white + launch blue -90,Architecture / Interior,#171717,#404040,#D4AF37,#FFFFFF,#171717,#E5E5E5,Minimal black + accent gold -91,Quantum Computing,#00FFFF,#7B61FF,#FF00FF,#050510,#E0E0FF,#333344,Quantum cyan + interference purple -92,Biohacking / Longevity,#FF4D4D,#4D94FF,#00E676,#F5F5F7,#1C1C1E,#E5E5EA,Bio red/blue + vitality green -93,Autonomous Systems,#00FF41,#008F11,#FF3333,#0D1117,#E6EDF3,#30363D,Terminal green + alert red -94,Generative AI Art,#18181B,#3F3F46,#EC4899,#FAFAFA,#09090B,#E4E4E7,Canvas neutral + creative pink -95,Spatial / Vision OS,#FFFFFF,#E5E5E5,#007AFF,#888888,#000000,#CCCCCC,Glass white + system blue -96,Climate Tech,#059669,#10B981,#FBBF24,#ECFDF5,#064E3B,#A7F3D0,Nature green + solar gold diff --git a/.cursor/skills/ui-ux-pro-max/data/icons.csv b/.cursor/skills/ui-ux-pro-max/data/icons.csv deleted file mode 100644 index a85e97f8..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/icons.csv +++ /dev/null @@ -1,101 +0,0 @@ -No,Category,Icon Name,Keywords,Library,Import Code,Usage,Best For,Style -1,Navigation,menu,hamburger menu navigation toggle bars,Lucide,import { Menu } from 'lucide-react',<Menu />,Mobile navigation drawer toggle sidebar,Outline -2,Navigation,arrow-left,back previous return navigate,Lucide,import { ArrowLeft } from 'lucide-react',<ArrowLeft />,Back button breadcrumb navigation,Outline -3,Navigation,arrow-right,next forward continue navigate,Lucide,import { ArrowRight } from 'lucide-react',<ArrowRight />,Forward button next step CTA,Outline -4,Navigation,chevron-down,dropdown expand accordion select,Lucide,import { ChevronDown } from 'lucide-react',<ChevronDown />,Dropdown toggle accordion header,Outline -5,Navigation,chevron-up,collapse close accordion minimize,Lucide,import { ChevronUp } from 'lucide-react',<ChevronUp />,Accordion collapse minimize,Outline -6,Navigation,home,homepage main dashboard start,Lucide,import { Home } from 'lucide-react',<Home />,Home navigation main page,Outline -7,Navigation,x,close cancel dismiss remove exit,Lucide,import { X } from 'lucide-react',<X />,Modal close dismiss button,Outline -8,Navigation,external-link,open new tab external link,Lucide,import { ExternalLink } from 'lucide-react',<ExternalLink />,External link indicator,Outline -9,Action,plus,add create new insert,Lucide,import { Plus } from 'lucide-react',<Plus />,Add button create new item,Outline -10,Action,minus,remove subtract decrease delete,Lucide,import { Minus } from 'lucide-react',<Minus />,Remove item quantity decrease,Outline -11,Action,trash-2,delete remove discard bin,Lucide,import { Trash2 } from 'lucide-react',<Trash2 />,Delete action destructive,Outline -12,Action,edit,pencil modify change update,Lucide,import { Edit } from 'lucide-react',<Edit />,Edit button modify content,Outline -13,Action,save,disk store persist save,Lucide,import { Save } from 'lucide-react',<Save />,Save button persist changes,Outline -14,Action,download,export save file download,Lucide,import { Download } from 'lucide-react',<Download />,Download file export,Outline -15,Action,upload,import file attach upload,Lucide,import { Upload } from 'lucide-react',<Upload />,Upload file import,Outline -16,Action,copy,duplicate clipboard paste,Lucide,import { Copy } from 'lucide-react',<Copy />,Copy to clipboard,Outline -17,Action,share,social distribute send,Lucide,import { Share } from 'lucide-react',<Share />,Share button social,Outline -18,Action,search,find lookup filter query,Lucide,import { Search } from 'lucide-react',<Search />,Search input bar,Outline -19,Action,filter,sort refine narrow options,Lucide,import { Filter } from 'lucide-react',<Filter />,Filter dropdown sort,Outline -20,Action,settings,gear cog preferences config,Lucide,import { Settings } from 'lucide-react',<Settings />,Settings page configuration,Outline -21,Status,check,success done complete verified,Lucide,import { Check } from 'lucide-react',<Check />,Success state checkmark,Outline -22,Status,check-circle,success verified approved complete,Lucide,import { CheckCircle } from 'lucide-react',<CheckCircle />,Success badge verified,Outline -23,Status,x-circle,error failed cancel rejected,Lucide,import { XCircle } from 'lucide-react',<XCircle />,Error state failed,Outline -24,Status,alert-triangle,warning caution attention danger,Lucide,import { AlertTriangle } from 'lucide-react',<AlertTriangle />,Warning message caution,Outline -25,Status,alert-circle,info notice information help,Lucide,import { AlertCircle } from 'lucide-react',<AlertCircle />,Info notice alert,Outline -26,Status,info,information help tooltip details,Lucide,import { Info } from 'lucide-react',<Info />,Information tooltip help,Outline -27,Status,loader,loading spinner processing wait,Lucide,import { Loader } from 'lucide-react',<Loader className="animate-spin" />,Loading state spinner,Outline -28,Status,clock,time schedule pending wait,Lucide,import { Clock } from 'lucide-react',<Clock />,Pending time schedule,Outline -29,Communication,mail,email message inbox letter,Lucide,import { Mail } from 'lucide-react',<Mail />,Email contact inbox,Outline -30,Communication,message-circle,chat comment bubble conversation,Lucide,import { MessageCircle } from 'lucide-react',<MessageCircle />,Chat comment message,Outline -31,Communication,phone,call mobile telephone contact,Lucide,import { Phone } from 'lucide-react',<Phone />,Phone contact call,Outline -32,Communication,send,submit dispatch message airplane,Lucide,import { Send } from 'lucide-react',<Send />,Send message submit,Outline -33,Communication,bell,notification alert ring reminder,Lucide,import { Bell } from 'lucide-react',<Bell />,Notification bell alert,Outline -34,User,user,profile account person avatar,Lucide,import { User } from 'lucide-react',<User />,User profile account,Outline -35,User,users,team group people members,Lucide,import { Users } from 'lucide-react',<Users />,Team group members,Outline -36,User,user-plus,add invite new member,Lucide,import { UserPlus } from 'lucide-react',<UserPlus />,Add user invite,Outline -37,User,log-in,signin authenticate enter,Lucide,import { LogIn } from 'lucide-react',<LogIn />,Login signin,Outline -38,User,log-out,signout exit leave logout,Lucide,import { LogOut } from 'lucide-react',<LogOut />,Logout signout,Outline -39,Media,image,photo picture gallery thumbnail,Lucide,import { Image } from 'lucide-react',<Image />,Image photo gallery,Outline -40,Media,video,movie film play record,Lucide,import { Video } from 'lucide-react',<Video />,Video player media,Outline -41,Media,play,start video audio media,Lucide,import { Play } from 'lucide-react',<Play />,Play button video audio,Outline -42,Media,pause,stop halt video audio,Lucide,import { Pause } from 'lucide-react',<Pause />,Pause button media,Outline -43,Media,volume-2,sound audio speaker music,Lucide,import { Volume2 } from 'lucide-react',<Volume2 />,Volume audio sound,Outline -44,Media,mic,microphone record voice audio,Lucide,import { Mic } from 'lucide-react',<Mic />,Microphone voice record,Outline -45,Media,camera,photo capture snapshot picture,Lucide,import { Camera } from 'lucide-react',<Camera />,Camera photo capture,Outline -46,Commerce,shopping-cart,cart checkout basket buy,Lucide,import { ShoppingCart } from 'lucide-react',<ShoppingCart />,Shopping cart e-commerce,Outline -47,Commerce,shopping-bag,purchase buy store bag,Lucide,import { ShoppingBag } from 'lucide-react',<ShoppingBag />,Shopping bag purchase,Outline -48,Commerce,credit-card,payment card checkout stripe,Lucide,import { CreditCard } from 'lucide-react',<CreditCard />,Payment credit card,Outline -49,Commerce,dollar-sign,money price currency cost,Lucide,import { DollarSign } from 'lucide-react',<DollarSign />,Price money currency,Outline -50,Commerce,tag,label price discount sale,Lucide,import { Tag } from 'lucide-react',<Tag />,Price tag label,Outline -51,Commerce,gift,present reward bonus offer,Lucide,import { Gift } from 'lucide-react',<Gift />,Gift reward offer,Outline -52,Commerce,percent,discount sale offer promo,Lucide,import { Percent } from 'lucide-react',<Percent />,Discount percentage sale,Outline -53,Data,bar-chart,analytics statistics graph metrics,Lucide,import { BarChart } from 'lucide-react',<BarChart />,Bar chart analytics,Outline -54,Data,pie-chart,statistics distribution breakdown,Lucide,import { PieChart } from 'lucide-react',<PieChart />,Pie chart distribution,Outline -55,Data,trending-up,growth increase positive trend,Lucide,import { TrendingUp } from 'lucide-react',<TrendingUp />,Growth trend positive,Outline -56,Data,trending-down,decline decrease negative trend,Lucide,import { TrendingDown } from 'lucide-react',<TrendingDown />,Decline trend negative,Outline -57,Data,activity,pulse heartbeat monitor live,Lucide,import { Activity } from 'lucide-react',<Activity />,Activity monitor pulse,Outline -58,Data,database,storage server data backend,Lucide,import { Database } from 'lucide-react',<Database />,Database storage,Outline -59,Files,file,document page paper doc,Lucide,import { File } from 'lucide-react',<File />,File document,Outline -60,Files,file-text,document text page article,Lucide,import { FileText } from 'lucide-react',<FileText />,Text document article,Outline -61,Files,folder,directory organize group files,Lucide,import { Folder } from 'lucide-react',<Folder />,Folder directory,Outline -62,Files,folder-open,expanded browse files view,Lucide,import { FolderOpen } from 'lucide-react',<FolderOpen />,Open folder browse,Outline -63,Files,paperclip,attachment attach file link,Lucide,import { Paperclip } from 'lucide-react',<Paperclip />,Attachment paperclip,Outline -64,Files,link,url hyperlink chain connect,Lucide,import { Link } from 'lucide-react',<Link />,Link URL hyperlink,Outline -65,Files,clipboard,paste copy buffer notes,Lucide,import { Clipboard } from 'lucide-react',<Clipboard />,Clipboard paste,Outline -66,Layout,grid,tiles gallery layout dashboard,Lucide,import { Grid } from 'lucide-react',<Grid />,Grid layout gallery,Outline -67,Layout,list,rows table lines items,Lucide,import { List } from 'lucide-react',<List />,List view rows,Outline -68,Layout,columns,layout split dual sidebar,Lucide,import { Columns } from 'lucide-react',<Columns />,Column layout split,Outline -69,Layout,maximize,fullscreen expand enlarge zoom,Lucide,import { Maximize } from 'lucide-react',<Maximize />,Fullscreen maximize,Outline -70,Layout,minimize,reduce shrink collapse exit,Lucide,import { Minimize } from 'lucide-react',<Minimize />,Minimize reduce,Outline -71,Layout,sidebar,panel drawer navigation menu,Lucide,import { Sidebar } from 'lucide-react',<Sidebar />,Sidebar panel,Outline -72,Social,heart,like love favorite wishlist,Lucide,import { Heart } from 'lucide-react',<Heart />,Like favorite love,Outline -73,Social,star,rating review favorite bookmark,Lucide,import { Star } from 'lucide-react',<Star />,Star rating favorite,Outline -74,Social,thumbs-up,like approve agree positive,Lucide,import { ThumbsUp } from 'lucide-react',<ThumbsUp />,Like approve thumb,Outline -75,Social,thumbs-down,dislike disapprove disagree negative,Lucide,import { ThumbsDown } from 'lucide-react',<ThumbsDown />,Dislike disapprove,Outline -76,Social,bookmark,save later favorite mark,Lucide,import { Bookmark } from 'lucide-react',<Bookmark />,Bookmark save,Outline -77,Social,flag,report mark important highlight,Lucide,import { Flag } from 'lucide-react',<Flag />,Flag report,Outline -78,Device,smartphone,mobile phone device touch,Lucide,import { Smartphone } from 'lucide-react',<Smartphone />,Mobile smartphone,Outline -79,Device,tablet,ipad device touch screen,Lucide,import { Tablet } from 'lucide-react',<Tablet />,Tablet device,Outline -80,Device,monitor,desktop screen computer display,Lucide,import { Monitor } from 'lucide-react',<Monitor />,Desktop monitor,Outline -81,Device,laptop,notebook computer portable device,Lucide,import { Laptop } from 'lucide-react',<Laptop />,Laptop computer,Outline -82,Device,printer,print document output paper,Lucide,import { Printer } from 'lucide-react',<Printer />,Printer print,Outline -83,Security,lock,secure password protected private,Lucide,import { Lock } from 'lucide-react',<Lock />,Lock secure,Outline -84,Security,unlock,open access unsecure public,Lucide,import { Unlock } from 'lucide-react',<Unlock />,Unlock open,Outline -85,Security,shield,protection security safe guard,Lucide,import { Shield } from 'lucide-react',<Shield />,Shield protection,Outline -86,Security,key,password access unlock login,Lucide,import { Key } from 'lucide-react',<Key />,Key password,Outline -87,Security,eye,view show visible password,Lucide,import { Eye } from 'lucide-react',<Eye />,Show password view,Outline -88,Security,eye-off,hide invisible password hidden,Lucide,import { EyeOff } from 'lucide-react',<EyeOff />,Hide password,Outline -89,Location,map-pin,location marker place address,Lucide,import { MapPin } from 'lucide-react',<MapPin />,Location pin marker,Outline -90,Location,map,directions navigate geography location,Lucide,import { Map } from 'lucide-react',<Map />,Map directions,Outline -91,Location,navigation,compass direction pointer arrow,Lucide,import { Navigation } from 'lucide-react',<Navigation />,Navigation compass,Outline -92,Location,globe,world international global web,Lucide,import { Globe } from 'lucide-react',<Globe />,Globe world,Outline -93,Time,calendar,date schedule event appointment,Lucide,import { Calendar } from 'lucide-react',<Calendar />,Calendar date,Outline -94,Time,refresh-cw,reload sync update refresh,Lucide,import { RefreshCw } from 'lucide-react',<RefreshCw />,Refresh reload,Outline -95,Time,rotate-ccw,undo back revert history,Lucide,import { RotateCcw } from 'lucide-react',<RotateCcw />,Undo revert,Outline -96,Time,rotate-cw,redo forward repeat history,Lucide,import { RotateCw } from 'lucide-react',<RotateCw />,Redo forward,Outline -97,Development,code,develop programming syntax html,Lucide,import { Code } from 'lucide-react',<Code />,Code development,Outline -98,Development,terminal,console cli command shell,Lucide,import { Terminal } from 'lucide-react',<Terminal />,Terminal console,Outline -99,Development,git-branch,version control branch merge,Lucide,import { GitBranch } from 'lucide-react',<GitBranch />,Git branch,Outline -100,Development,github,repository code open source,Lucide,import { Github } from 'lucide-react',<Github />,GitHub repository,Outline diff --git a/.cursor/skills/ui-ux-pro-max/data/landing.csv b/.cursor/skills/ui-ux-pro-max/data/landing.csv deleted file mode 100644 index dd2e775f..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/landing.csv +++ /dev/null @@ -1,31 +0,0 @@ -No,Pattern Name,Keywords,Section Order,Primary CTA Placement,Color Strategy,Recommended Effects,Conversion Optimization -1,Hero + Features + CTA,"hero, hero-centric, features, feature-rich, cta, call-to-action","1. Hero with headline/image, 2. Value prop, 3. Key features (3-5), 4. CTA section, 5. Footer",Hero (sticky) + Bottom,Hero: Brand primary or vibrant. Features: Card bg #FAFAFA. CTA: Contrasting accent color,"Hero parallax, feature card hover lift, CTA glow on hover",Deep CTA placement. Use contrasting color (at least 7:1 contrast ratio). Sticky navbar CTA. -2,Hero + Testimonials + CTA,"hero, testimonials, social-proof, trust, reviews, cta","1. Hero, 2. Problem statement, 3. Solution overview, 4. Testimonials carousel, 5. CTA",Hero (sticky) + Post-testimonials,"Hero: Brand color. Testimonials: Light bg #F5F5F5. Quotes: Italic, muted color #666. CTA: Vibrant","Testimonial carousel slide animations, quote marks animations, avatar fade-in",Social proof before CTA. Use 3-5 testimonials. Include photo + name + role. CTA after social proof. -3,Product Demo + Features,"demo, product-demo, features, showcase, interactive","1. Hero, 2. Product video/mockup (center), 3. Feature breakdown per section, 4. Comparison (optional), 5. CTA",Video center + CTA right/bottom,Video surround: Brand color overlay. Features: Icon color #0080FF. Text: Dark #222,"Video play button pulse, feature scroll reveals, demo interaction highlights",Embedded product demo increases engagement. Use interactive mockup if possible. Auto-play video muted. -4,Minimal Single Column,"minimal, simple, direct, single-column, clean","1. Hero headline, 2. Short description, 3. Benefit bullets (3 max), 4. CTA, 5. Footer","Center, large CTA button",Minimalist: Brand + white #FFFFFF + accent. Buttons: High contrast 7:1+. Text: Black/Dark grey,Minimal hover effects. Smooth scroll. CTA scale on hover (subtle),Single CTA focus. Large typography. Lots of whitespace. No nav clutter. Mobile-first. -5,Funnel (3-Step Conversion),"funnel, conversion, steps, wizard, onboarding","1. Hero, 2. Step 1 (problem), 3. Step 2 (solution), 4. Step 3 (action), 5. CTA progression",Each step: mini-CTA. Final: main CTA,"Step colors: 1 (Red/Problem), 2 (Orange/Process), 3 (Green/Solution). CTA: Brand color","Step number animations, progress bar fill, step transitions smooth scroll",Progressive disclosure. Show only essential info per step. Use progress indicators. Multiple CTAs. -6,Comparison Table + CTA,"comparison, table, compare, versus, cta","1. Hero, 2. Problem intro, 3. Comparison table (product vs competitors), 4. Pricing (optional), 5. CTA",Table: Right column. CTA: Below table,Table: Alternating rows (white/light grey). Your product: Highlight #FFFACD (light yellow) or green. Text: Dark,"Table row hover highlight, price toggle animations, feature checkmark animations",Use comparison to show unique value. Highlight your product row. Include 'free trial' in pricing row. -7,Lead Magnet + Form,"lead, form, signup, capture, email, magnet","1. Hero (benefit headline), 2. Lead magnet preview (ebook cover, checklist, etc), 3. Form (minimal fields), 4. CTA submit",Form CTA: Submit button,Lead magnet: Professional design. Form: Clean white bg. Inputs: Light border #CCCCCC. CTA: Brand color,"Form focus state animations, input validation animations, success confirmation animation",Form fields ≤ 3 for best conversion. Offer valuable lead magnet preview. Show form submission progress. -8,Pricing Page + CTA,"pricing, plans, tiers, comparison, cta","1. Hero (pricing headline), 2. Price comparison cards, 3. Feature comparison table, 4. FAQ section, 5. Final CTA",Each card: CTA button. Sticky CTA in nav,"Free: Grey, Starter: Blue, Pro: Green/Gold, Enterprise: Dark. Cards: 1px border, shadow","Price toggle animation (monthly/yearly), card comparison highlight, FAQ accordion open/close",Recommend starter plan (pre-select/highlight). Show annual discount (20-30%). Use FAQs to address concerns. -9,Video-First Hero,"video, hero, media, visual, engaging","1. Hero with video background, 2. Key features overlay, 3. Benefits section, 4. CTA",Overlay on video (center/bottom) + Bottom section,Dark overlay 60% on video. Brand accent for CTA. White text on dark.,"Video autoplay muted, parallax scroll, text fade-in on scroll",86% higher engagement with video. Add captions for accessibility. Compress video for performance. -10,Scroll-Triggered Storytelling,"storytelling, scroll, narrative, story, immersive","1. Intro hook, 2. Chapter 1 (problem), 3. Chapter 2 (journey), 4. Chapter 3 (solution), 5. Climax CTA",End of each chapter (mini) + Final climax CTA,Progressive reveal. Each chapter has distinct color. Building intensity.,"ScrollTrigger animations, parallax layers, progressive disclosure, chapter transitions",Narrative increases time-on-page 3x. Use progress indicator. Mobile: simplify animations. -11,AI Personalization Landing,"ai, personalization, smart, recommendation, dynamic","1. Dynamic hero (personalized), 2. Relevant features, 3. Tailored testimonials, 4. Smart CTA",Context-aware placement based on user segment,Adaptive based on user data. A/B test color variations per segment.,"Dynamic content swap, fade transitions, personalized product recommendations",20%+ conversion with personalization. Requires analytics integration. Fallback for new users. -12,Waitlist/Coming Soon,"waitlist, coming-soon, launch, early-access, notify","1. Hero with countdown, 2. Product teaser/preview, 3. Email capture form, 4. Social proof (waitlist count)",Email form prominent (above fold) + Sticky form on scroll,Anticipation: Dark + accent highlights. Countdown in brand color. Urgency indicators.,"Countdown timer animation, email validation feedback, success confetti, social share buttons",Scarcity + exclusivity. Show waitlist count. Early access benefits. Referral program. -13,Comparison Table Focus,"comparison, table, versus, compare, features","1. Hero (problem statement), 2. Comparison matrix (you vs competitors), 3. Feature deep-dive, 4. Winner CTA",After comparison table (highlighted row) + Bottom,Your product column highlighted (accent bg or green). Competitors neutral. Checkmarks green.,"Table row hover highlight, feature checkmark animations, sticky comparison header",Show value vs competitors. 35% higher conversion. Be factual. Include pricing if favorable. -14,Pricing-Focused Landing,"pricing, price, cost, plans, subscription","1. Hero (value proposition), 2. Pricing cards (3 tiers), 3. Feature comparison, 4. FAQ, 5. Final CTA",Each pricing card + Sticky CTA in nav + Bottom,Popular plan highlighted (brand color border/bg). Free: grey. Enterprise: dark/premium.,"Price toggle monthly/annual animation, card hover lift, FAQ accordion smooth open",Annual discount 20-30%. Recommend mid-tier (most popular badge). Address objections in FAQ. -15,App Store Style Landing,"app, mobile, download, store, install","1. Hero with device mockup, 2. Screenshots carousel, 3. Features with icons, 4. Reviews/ratings, 5. Download CTAs",Download buttons prominent (App Store + Play Store) throughout,Dark/light matching app store feel. Star ratings in gold. Screenshots with device frames.,"Device mockup rotations, screenshot slider, star rating animations, download button pulse",Show real screenshots. Include ratings (4.5+ stars). QR code for mobile. Platform-specific CTAs. -16,FAQ/Documentation Landing,"faq, documentation, help, support, questions","1. Hero with search bar, 2. Popular categories, 3. FAQ accordion, 4. Contact/support CTA",Search bar prominent + Contact CTA for unresolved questions,"Clean, high readability. Minimal color. Category icons in brand color. Success green for resolved.","Search autocomplete, smooth accordion open/close, category hover, helpful feedback buttons",Reduce support tickets. Track search analytics. Show related articles. Contact escalation path. -17,Immersive/Interactive Experience,"immersive, interactive, experience, 3d, animation","1. Full-screen interactive element, 2. Guided product tour, 3. Key benefits revealed, 4. CTA after completion",After interaction complete + Skip option for impatient users,Immersive experience colors. Dark background for focus. Highlight interactive elements.,"WebGL, 3D interactions, gamification elements, progress indicators, reward animations",40% higher engagement. Performance trade-off. Provide skip option. Mobile fallback essential. -18,Event/Conference Landing,"event, conference, meetup, registration, schedule","1. Hero (date/location/countdown), 2. Speakers grid, 3. Agenda/schedule, 4. Sponsors, 5. Register CTA",Register CTA sticky + After speakers + Bottom,Urgency colors (countdown). Event branding. Speaker cards professional. Sponsor logos neutral.,"Countdown timer, speaker hover cards with bio, agenda tabs, early bird countdown",Early bird pricing with deadline. Social proof (past attendees). Speaker credibility. Multi-ticket discounts. -19,Product Review/Ratings Focused,"reviews, ratings, testimonials, social-proof, stars","1. Hero (product + aggregate rating), 2. Rating breakdown, 3. Individual reviews, 4. Buy/CTA",After reviews summary + Buy button alongside reviews,Trust colors. Star ratings gold. Verified badge green. Review sentiment colors.,"Star fill animations, review filtering, helpful vote interactions, photo lightbox",User-generated content builds trust. Show verified purchases. Filter by rating. Respond to negative reviews. -20,Community/Forum Landing,"community, forum, social, members, discussion","1. Hero (community value prop), 2. Popular topics/categories, 3. Active members showcase, 4. Join CTA",Join button prominent + After member showcase,"Warm, welcoming. Member photos add humanity. Topic badges in brand colors. Activity indicators green.","Member avatars animation, activity feed live updates, topic hover previews, join success celebration","Show active community (member count, posts today). Highlight benefits. Preview content. Easy onboarding." -21,Before-After Transformation,"before-after, transformation, results, comparison","1. Hero (problem state), 2. Transformation slider/comparison, 3. How it works, 4. Results CTA",After transformation reveal + Bottom,Contrast: muted/grey (before) vs vibrant/colorful (after). Success green for results.,"Slider comparison interaction, before/after reveal animations, result counters, testimonial videos",Visual proof of value. 45% higher conversion. Real results. Specific metrics. Guarantee offer. -22,Marketplace / Directory,"marketplace, directory, search, listing","1. Hero (Search focused), 2. Categories, 3. Featured Listings, 4. Trust/Safety, 5. CTA (Become a host/seller)",Hero Search Bar + Navbar 'List your item',Search: High contrast. Categories: Visual icons. Trust: Blue/Green.,Search autocomplete animation," map hover pins, card carousel, Search bar is the CTA. Reduce friction to search. Popular searches suggestions." -23,Newsletter / Content First,"newsletter, content, writer, blog, subscribe","1. Hero (Value Prop + Form), 2. Recent Issues/Archives, 3. Social Proof (Subscriber count), 4. About Author",Hero inline form + Sticky header form,Minimalist. Paper-like background. Text focus. Accent color for Subscribe.,Text highlight animations," typewriter effect, subtle fade-in, Single field form (Email only). Show 'Join X, 000 readers'. Read sample link." -24,Webinar Registration,"webinar, registration, event, training, live","1. Hero (Topic + Timer + Form), 2. What you'll learn, 3. Speaker Bio, 4. Urgency/Bonuses, 5. Form (again)",Hero (Right side form) + Bottom anchor,Urgency: Red/Orange. Professional: Blue/Navy. Form: High contrast white.,Countdown timer," speaker avatar float, urgent ticker, Limited seats logic. 'Live' indicator. Auto-fill timezone." -25,Enterprise Gateway,"enterprise, corporate, gateway, solutions, portal","1. Hero (Video/Mission), 2. Solutions by Industry, 3. Solutions by Role, 4. Client Logos, 5. Contact Sales",Contact Sales (Primary) + Login (Secondary),Corporate: Navy/Grey. High integrity. Conservative accents.,Slow video background," logo carousel, tab switching for industries, Path selection (I am a...). Mega menu navigation. Trust signals prominent." -26,Portfolio Grid,"portfolio, grid, showcase, gallery, masonry","1. Hero (Name/Role), 2. Project Grid (Masonry), 3. About/Philosophy, 4. Contact",Project Card Hover + Footer Contact,Neutral background (let work shine). Text: Black/White. Accent: Minimal.,Image lazy load reveal," hover overlay info, lightbox view, Visuals first. Filter by category. Fast loading essential." -27,Horizontal Scroll Journey,"horizontal, scroll, journey, gallery, storytelling, panoramic","1. Intro (Vertical), 2. The Journey (Horizontal Track), 3. Detail Reveal, 4. Vertical Footer",Floating Sticky CTA or End of Horizontal Track,Continuous palette transition. Chapter colors. Progress bar #000000.,"Scroll-jacking (careful), parallax layers, horizontal slide, progress indicator","Immersive product discovery. High engagement. Keep navigation visible. -28,Bento Grid Showcase,bento, grid, features, modular, apple-style, showcase"", 1. Hero, 2. Bento Grid (Key Features), 3. Detail Cards, 4. Tech Specs, 5. CTA, Floating Action Button or Bottom of Grid, Card backgrounds: #F5F5F7 or Glass. Icons: Vibrant brand colors. Text: Dark., Hover card scale (1.02), video inside cards, tilt effect, staggered reveal, Scannable value props. High information density without clutter. Mobile stack. -29,Interactive 3D Configurator,3d, configurator, customizer, interactive, product"", 1. Hero (Configurator), 2. Feature Highlight (synced), 3. Price/Specs, 4. Purchase, Inside Configurator UI + Sticky Bottom Bar, Neutral studio background. Product: Realistic materials. UI: Minimal overlay., Real-time rendering, material swap animation, camera rotate/zoom, light reflection, Increases ownership feeling. 360 view reduces return rates. Direct add-to-cart. -30,AI-Driven Dynamic Landing,ai, dynamic, personalized, adaptive, generative"", 1. Prompt/Input Hero, 2. Generated Result Preview, 3. How it Works, 4. Value Prop, Input Field (Hero) + 'Try it' Buttons, Adaptive to user input. Dark mode for compute feel. Neon accents., Typing text effects, shimmering generation loaders, morphing layouts, Immediate value demonstration. 'Show, don't tell'. Low friction start." diff --git a/.cursor/skills/ui-ux-pro-max/data/products.csv b/.cursor/skills/ui-ux-pro-max/data/products.csv deleted file mode 100644 index 6ff9ba43..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/products.csv +++ /dev/null @@ -1,97 +0,0 @@ -No,Product Type,Keywords,Primary Style Recommendation,Secondary Styles,Landing Page Pattern,Dashboard Style (if applicable),Color Palette Focus,Key Considerations -1,SaaS (General),"app, b2b, cloud, general, saas, software, subscription",Glassmorphism + Flat Design,"Soft UI Evolution, Minimalism",Hero + Features + CTA,Data-Dense + Real-Time Monitoring,Trust blue + accent contrast,Balance modern feel with clarity. Focus on CTAs. -2,Micro SaaS,"app, b2b, cloud, indie, micro, micro-saas, niche, saas, small, software, solo, subscription",Flat Design + Vibrant & Block,"Motion-Driven, Micro-interactions",Minimal & Direct + Demo,Executive Dashboard,Vibrant primary + white space,"Keep simple, show product quickly. Speed is key." -3,E-commerce,"buy, commerce, e, ecommerce, products, retail, sell, shop, store",Vibrant & Block-based,"Aurora UI, Motion-Driven",Feature-Rich Showcase,Sales Intelligence Dashboard,Brand primary + success green,Engagement & conversions. High visual hierarchy. -4,E-commerce Luxury,"buy, commerce, e, ecommerce, elegant, exclusive, high-end, luxury, premium, products, retail, sell, shop, store",Liquid Glass + Glassmorphism,"3D & Hyperrealism, Aurora UI",Feature-Rich Showcase,Sales Intelligence Dashboard,Premium colors + minimal accent,Elegance & sophistication. Premium materials. -5,Service Landing Page,"appointment, booking, consultation, conversion, landing, marketing, page, service",Hero-Centric + Trust & Authority,"Social Proof-Focused, Storytelling",Hero-Centric Design,N/A - Analytics for conversions,Brand primary + trust colors,Social proof essential. Show expertise. -6,B2B Service,"appointment, b, b2b, booking, business, consultation, corporate, enterprise, service",Trust & Authority + Minimal,"Feature-Rich, Conversion-Optimized",Feature-Rich Showcase,Sales Intelligence Dashboard,Professional blue + neutral grey,Credibility essential. Clear ROI messaging. -7,Financial Dashboard,"admin, analytics, dashboard, data, financial, panel",Dark Mode (OLED) + Data-Dense,"Minimalism, Accessible & Ethical",N/A - Dashboard focused,Financial Dashboard,Dark bg + red/green alerts + trust blue,"High contrast, real-time updates, accuracy paramount." -8,Analytics Dashboard,"admin, analytics, dashboard, data, panel",Data-Dense + Heat Map & Heatmap,"Minimalism, Dark Mode (OLED)",N/A - Analytics focused,Drill-Down Analytics + Comparative,Cool→Hot gradients + neutral grey,Clarity > aesthetics. Color-coded data priority. -9,Healthcare App,"app, clinic, health, healthcare, medical, patient",Neumorphism + Accessible & Ethical,"Soft UI Evolution, Claymorphism (for patients)",Social Proof-Focused,User Behavior Analytics,Calm blue + health green + trust,Accessibility mandatory. Calming aesthetic. -10,Educational App,"app, course, education, educational, learning, school, training",Claymorphism + Micro-interactions,"Vibrant & Block-based, Flat Design",Storytelling-Driven,User Behavior Analytics,Playful colors + clear hierarchy,Engagement & ease of use. Age-appropriate design. -11,Creative Agency,"agency, creative, design, marketing, studio",Brutalism + Motion-Driven,"Retro-Futurism, Storytelling-Driven",Storytelling-Driven,N/A - Portfolio focused,Bold primaries + artistic freedom,Differentiation key. Wow-factor necessary. -12,Portfolio/Personal,"creative, personal, portfolio, projects, showcase, work",Motion-Driven + Minimalism,"Brutalism, Aurora UI",Storytelling-Driven,N/A - Personal branding,Brand primary + artistic interpretation,Showcase work. Personality shine through. -13,Gaming,"entertainment, esports, game, gaming, play",3D & Hyperrealism + Retro-Futurism,"Motion-Driven, Vibrant & Block",Feature-Rich Showcase,N/A - Game focused,Vibrant + neon + immersive colors,Immersion priority. Performance critical. -14,Government/Public Service,"appointment, booking, consultation, government, public, service",Accessible & Ethical + Minimalism,"Flat Design, Inclusive Design",Minimal & Direct,Executive Dashboard,Professional blue + high contrast,WCAG AAA mandatory. Trust paramount. -15,Fintech/Crypto,"banking, blockchain, crypto, defi, finance, fintech, money, nft, payment, web3",Glassmorphism + Dark Mode (OLED),"Retro-Futurism, Motion-Driven",Conversion-Optimized,Real-Time Monitoring + Predictive,Dark tech colors + trust + vibrant accents,Security perception. Real-time data critical. -16,Social Media App,"app, community, content, entertainment, media, network, sharing, social, streaming, users, video",Vibrant & Block-based + Motion-Driven,"Aurora UI, Micro-interactions",Feature-Rich Showcase,User Behavior Analytics,Vibrant + engagement colors,Engagement & retention. Addictive design ethics. -17,Productivity Tool,"collaboration, productivity, project, task, tool, workflow",Flat Design + Micro-interactions,"Minimalism, Soft UI Evolution",Interactive Product Demo,Drill-Down Analytics,Clear hierarchy + functional colors,Ease of use. Speed & efficiency focus. -18,Design System/Component Library,"component, design, library, system",Minimalism + Accessible & Ethical,"Flat Design, Zero Interface",Feature-Rich Showcase,N/A - Dev focused,Clear hierarchy + code-like structure,Consistency. Developer-first approach. -19,AI/Chatbot Platform,"ai, artificial-intelligence, automation, chatbot, machine-learning, ml, platform",AI-Native UI + Minimalism,"Zero Interface, Glassmorphism",Interactive Product Demo,AI/ML Analytics Dashboard,Neutral + AI Purple (#6366F1),Conversational UI. Streaming text. Context awareness. Minimal chrome. -20,NFT/Web3 Platform,"nft, platform, web",Cyberpunk UI + Glassmorphism,"Aurora UI, 3D & Hyperrealism",Feature-Rich Showcase,Crypto/Blockchain Dashboard,Dark + Neon + Gold (#FFD700),Wallet integration. Transaction feedback. Gas fees display. Dark mode essential. -21,Creator Economy Platform,"creator, economy, platform",Vibrant & Block-based + Bento Box Grid,"Motion-Driven, Aurora UI",Social Proof-Focused,User Behavior Analytics,Vibrant + Brand colors,Creator profiles. Monetization display. Engagement metrics. Social proof. -22,Sustainability/ESG Platform,"ai, artificial-intelligence, automation, esg, machine-learning, ml, platform, sustainability",Organic Biophilic + Minimalism,"Accessible & Ethical, Flat Design",Trust & Authority,Energy/Utilities Dashboard,Green (#228B22) + Earth tones,Carbon footprint visuals. Progress indicators. Certification badges. Eco-friendly imagery. -23,Remote Work/Collaboration Tool,"collaboration, remote, tool, work",Soft UI Evolution + Minimalism,"Glassmorphism, Micro-interactions",Feature-Rich Showcase,Drill-Down Analytics,Calm Blue + Neutral grey,Real-time collaboration. Status indicators. Video integration. Notification management. -24,Mental Health App,"app, health, mental",Neumorphism + Accessible & Ethical,"Claymorphism, Soft UI Evolution",Social Proof-Focused,Healthcare Analytics,Calm Pastels + Trust colors,Calming aesthetics. Privacy-first. Crisis resources. Progress tracking. Accessibility mandatory. -25,Pet Tech App,"app, pet, tech",Claymorphism + Vibrant & Block-based,"Micro-interactions, Flat Design",Storytelling-Driven,User Behavior Analytics,Playful + Warm colors,Pet profiles. Health tracking. Playful UI. Photo galleries. Vet integration. -26,Smart Home/IoT Dashboard,"admin, analytics, dashboard, data, home, iot, panel, smart",Glassmorphism + Dark Mode (OLED),"Minimalism, AI-Native UI",Interactive Product Demo,Real-Time Monitoring,Dark + Status indicator colors,Device status. Real-time controls. Energy monitoring. Automation rules. Quick actions. -27,EV/Charging Ecosystem,"charging, ecosystem, ev",Minimalism + Aurora UI,"Glassmorphism, Organic Biophilic",Hero-Centric Design,Energy/Utilities Dashboard,Electric Blue (#009CD1) + Green,Charging station maps. Range estimation. Cost calculation. Environmental impact. -28,Subscription Box Service,"appointment, booking, box, consultation, membership, plan, recurring, service, subscription",Vibrant & Block-based + Motion-Driven,"Claymorphism, Aurora UI",Feature-Rich Showcase,E-commerce Analytics,Brand + Excitement colors,Unboxing experience. Personalization quiz. Subscription management. Product reveals. -29,Podcast Platform,"platform, podcast",Dark Mode (OLED) + Minimalism,"Motion-Driven, Vibrant & Block-based",Storytelling-Driven,Media/Entertainment Dashboard,Dark + Audio waveform accents,Audio player UX. Episode discovery. Creator tools. Analytics for podcasters. -30,Dating App,"app, dating",Vibrant & Block-based + Motion-Driven,"Aurora UI, Glassmorphism",Social Proof-Focused,User Behavior Analytics,Warm + Romantic (Pink/Red gradients),Profile cards. Swipe interactions. Match animations. Safety features. Video chat. -31,Micro-Credentials/Badges Platform,"badges, credentials, micro, platform",Minimalism + Flat Design,"Accessible & Ethical, Swiss Modernism 2.0",Trust & Authority,Education Dashboard,Trust Blue + Gold (#FFD700),Credential verification. Badge display. Progress tracking. Issuer trust. LinkedIn integration. -32,Knowledge Base/Documentation,"base, documentation, knowledge",Minimalism + Accessible & Ethical,"Swiss Modernism 2.0, Flat Design",FAQ/Documentation,N/A - Documentation focused,Clean hierarchy + minimal color,Search-first. Clear navigation. Code highlighting. Version switching. Feedback system. -33,Hyperlocal Services,"appointment, booking, consultation, hyperlocal, service, services",Minimalism + Vibrant & Block-based,"Micro-interactions, Flat Design",Conversion-Optimized,Drill-Down Analytics + Map,Location markers + Trust colors,Map integration. Service categories. Provider profiles. Booking system. Reviews. -34,Beauty/Spa/Wellness Service,"appointment, beauty, booking, consultation, service, spa, wellness",Soft UI Evolution + Neumorphism,"Glassmorphism, Minimalism",Hero-Centric Design + Social Proof,User Behavior Analytics,Soft pastels (Pink #FFB6C1 Sage #90EE90) + Cream + Gold accents,Calming aesthetic. Booking system. Service menu. Before/after gallery. Testimonials. Relaxing imagery. -35,Luxury/Premium Brand,"brand, elegant, exclusive, high-end, luxury, premium",Liquid Glass + Glassmorphism,"Minimalism, 3D & Hyperrealism",Storytelling-Driven + Feature-Rich,Sales Intelligence Dashboard,Black + Gold (#FFD700) + White + Minimal accent,Elegance paramount. Premium imagery. Storytelling. High-quality visuals. Exclusive feel. -36,Restaurant/Food Service,"appointment, booking, consultation, delivery, food, menu, order, restaurant, service",Vibrant & Block-based + Motion-Driven,"Claymorphism, Flat Design",Hero-Centric Design + Conversion,N/A - Booking focused,Warm colors (Orange Red Brown) + appetizing imagery,Menu display. Online ordering. Reservation system. Food photography. Location/hours prominent. -37,Fitness/Gym App,"app, exercise, fitness, gym, health, workout",Vibrant & Block-based + Dark Mode (OLED),"Motion-Driven, Neumorphism",Feature-Rich Showcase,User Behavior Analytics,Energetic (Orange #FF6B35 Electric Blue) + Dark bg,Progress tracking. Workout plans. Community features. Achievements. Motivational design. -38,Real Estate/Property,"buy, estate, housing, property, real, real-estate, rent",Glassmorphism + Minimalism,"Motion-Driven, 3D & Hyperrealism",Hero-Centric Design + Feature-Rich,Sales Intelligence Dashboard,Trust Blue (#0077B6) + Gold accents + White,Property listings. Virtual tours. Map integration. Agent profiles. Mortgage calculator. High-quality imagery. -39,Travel/Tourism Agency,"agency, booking, creative, design, flight, hotel, marketing, studio, tourism, travel, vacation",Aurora UI + Motion-Driven,"Vibrant & Block-based, Glassmorphism",Storytelling-Driven + Hero-Centric,Booking Analytics,Vibrant destination colors + Sky Blue + Warm accents,Destination showcase. Booking system. Itinerary builder. Reviews. Inspiration galleries. Mobile-first. -40,Hotel/Hospitality,"hospitality, hotel",Liquid Glass + Minimalism,"Glassmorphism, Soft UI Evolution",Hero-Centric Design + Social Proof,Revenue Management Dashboard,Warm neutrals + Gold (#D4AF37) + Brand accent,Room booking. Amenities showcase. Location maps. Guest reviews. Seasonal pricing. Luxury imagery. -41,Wedding/Event Planning,"conference, event, meetup, planning, registration, ticket, wedding",Soft UI Evolution + Aurora UI,"Glassmorphism, Motion-Driven",Storytelling-Driven + Social Proof,N/A - Planning focused,Soft Pink (#FFD6E0) + Gold + Cream + Sage,Portfolio gallery. Vendor directory. Planning tools. Timeline. Budget tracker. Romantic aesthetic. -42,Legal Services,"appointment, attorney, booking, compliance, consultation, contract, law, legal, service, services",Trust & Authority + Minimalism,"Accessible & Ethical, Swiss Modernism 2.0",Trust & Authority + Minimal,Case Management Dashboard,Navy Blue (#1E3A5F) + Gold + White,Credibility paramount. Practice areas. Attorney profiles. Case results. Contact forms. Professional imagery. -43,Insurance Platform,"insurance, platform",Trust & Authority + Flat Design,"Accessible & Ethical, Minimalism",Conversion-Optimized + Trust,Claims Analytics Dashboard,Trust Blue (#0066CC) + Green (security) + Neutral,Quote calculator. Policy comparison. Claims process. Trust signals. Clear pricing. Security badges. -44,Banking/Traditional Finance,"banking, finance, traditional",Minimalism + Accessible & Ethical,"Trust & Authority, Dark Mode (OLED)",Trust & Authority + Feature-Rich,Financial Dashboard,Navy (#0A1628) + Trust Blue + Gold accents,Security-first. Account overview. Transaction history. Mobile banking. Accessibility critical. Trust paramount. -45,Online Course/E-learning,"course, e, learning, online",Claymorphism + Vibrant & Block-based,"Motion-Driven, Flat Design",Feature-Rich Showcase + Social Proof,Education Dashboard,Vibrant learning colors + Progress green,Course catalog. Progress tracking. Video player. Quizzes. Certificates. Community forums. Gamification. -46,Non-profit/Charity,"charity, non, profit",Accessible & Ethical + Organic Biophilic,"Minimalism, Storytelling-Driven",Storytelling-Driven + Trust,Donation Analytics Dashboard,Cause-related colors + Trust + Warm,Impact stories. Donation flow. Transparency reports. Volunteer signup. Event calendar. Emotional connection. -47,Music Streaming,"music, streaming",Dark Mode (OLED) + Vibrant & Block-based,"Motion-Driven, Aurora UI",Feature-Rich Showcase,Media/Entertainment Dashboard,Dark (#121212) + Vibrant accents + Album art colors,Audio player. Playlist management. Artist pages. Personalization. Social features. Waveform visualizations. -48,Video Streaming/OTT,"ott, streaming, video",Dark Mode (OLED) + Motion-Driven,"Glassmorphism, Vibrant & Block-based",Hero-Centric Design + Feature-Rich,Media/Entertainment Dashboard,Dark bg + Content poster colors + Brand accent,Video player. Content discovery. Watchlist. Continue watching. Personalized recommendations. Thumbnail-heavy. -49,Job Board/Recruitment,"board, job, recruitment",Flat Design + Minimalism,"Vibrant & Block-based, Accessible & Ethical",Conversion-Optimized + Feature-Rich,HR Analytics Dashboard,Professional Blue + Success Green + Neutral,Job listings. Search/filter. Company profiles. Application tracking. Resume upload. Salary insights. -50,Marketplace (P2P),"buyers, listings, marketplace, p, platform, sellers",Vibrant & Block-based + Flat Design,"Micro-interactions, Trust & Authority",Feature-Rich Showcase + Social Proof,E-commerce Analytics,Trust colors + Category colors + Success green,Seller/buyer profiles. Listings. Reviews/ratings. Secure payment. Messaging. Search/filter. Trust badges. -51,Logistics/Delivery,"delivery, logistics",Minimalism + Flat Design,"Dark Mode (OLED), Micro-interactions",Feature-Rich Showcase + Conversion,Real-Time Monitoring + Route Analytics,Blue (#2563EB) + Orange (tracking) + Green (delivered),Real-time tracking. Delivery scheduling. Route optimization. Driver management. Status updates. Map integration. -52,Agriculture/Farm Tech,"agriculture, farm, tech",Organic Biophilic + Flat Design,"Minimalism, Accessible & Ethical",Feature-Rich Showcase + Trust,IoT Sensor Dashboard,Earth Green (#4A7C23) + Brown + Sky Blue,Crop monitoring. Weather data. IoT sensors. Yield tracking. Market prices. Sustainable imagery. -53,Construction/Architecture,"architecture, construction",Minimalism + 3D & Hyperrealism,"Brutalism, Swiss Modernism 2.0",Hero-Centric Design + Feature-Rich,Project Management Dashboard,Grey (#4A4A4A) + Orange (safety) + Blueprint Blue,Project portfolio. 3D renders. Timeline. Material specs. Team collaboration. Blueprint aesthetic. -54,Automotive/Car Dealership,"automotive, car, dealership",Motion-Driven + 3D & Hyperrealism,"Dark Mode (OLED), Glassmorphism",Hero-Centric Design + Feature-Rich,Sales Intelligence Dashboard,Brand colors + Metallic accents + Dark/Light,Vehicle showcase. 360° views. Comparison tools. Financing calculator. Test drive booking. High-quality imagery. -55,Photography Studio,"photography, studio",Motion-Driven + Minimalism,"Aurora UI, Glassmorphism",Storytelling-Driven + Hero-Centric,N/A - Portfolio focused,Black + White + Minimal accent,Portfolio gallery. Before/after. Service packages. Booking system. Client galleries. Full-bleed imagery. -56,Coworking Space,"coworking, space",Vibrant & Block-based + Glassmorphism,"Minimalism, Motion-Driven",Hero-Centric Design + Feature-Rich,Occupancy Dashboard,Energetic colors + Wood tones + Brand accent,Space tour. Membership plans. Booking system. Amenities. Community events. Virtual tour. -57,Cleaning Service,"appointment, booking, cleaning, consultation, service",Soft UI Evolution + Flat Design,"Minimalism, Micro-interactions",Conversion-Optimized + Trust,Service Analytics,Fresh Blue (#00B4D8) + Clean White + Green,Service packages. Booking system. Price calculator. Before/after gallery. Reviews. Trust badges. -58,Home Services (Plumber/Electrician),"appointment, booking, consultation, electrician, home, plumber, service, services",Flat Design + Trust & Authority,"Minimalism, Accessible & Ethical",Conversion-Optimized + Trust,Service Analytics,Trust Blue + Safety Orange + Professional grey,Service list. Emergency contact. Booking. Price transparency. Certifications. Local trust signals. -59,Childcare/Daycare,"childcare, daycare",Claymorphism + Vibrant & Block-based,"Soft UI Evolution, Accessible & Ethical",Social Proof-Focused + Trust,Parent Dashboard,Playful pastels + Safe colors + Warm accents,Programs. Staff profiles. Safety certifications. Parent portal. Activity updates. Cheerful imagery. -60,Senior Care/Elderly,"care, elderly, senior",Accessible & Ethical + Soft UI Evolution,"Minimalism, Neumorphism",Trust & Authority + Social Proof,Healthcare Analytics,Calm Blue + Warm neutrals + Large text,Care services. Staff qualifications. Facility tour. Family portal. Large touch targets. High contrast. Accessibility-first. -61,Medical Clinic,"clinic, medical",Accessible & Ethical + Minimalism,"Neumorphism, Trust & Authority",Trust & Authority + Conversion,Healthcare Analytics,Medical Blue (#0077B6) + Trust White + Calm Green,Services. Doctor profiles. Online booking. Patient portal. Insurance info. HIPAA compliant. Trust signals. -62,Pharmacy/Drug Store,"drug, pharmacy, store",Flat Design + Accessible & Ethical,"Minimalism, Trust & Authority",Conversion-Optimized + Trust,Inventory Dashboard,Pharmacy Green + Trust Blue + Clean White,Product catalog. Prescription upload. Refill reminders. Health info. Store locator. Safety certifications. -63,Dental Practice,"dental, practice",Soft UI Evolution + Minimalism,"Accessible & Ethical, Trust & Authority",Social Proof-Focused + Conversion,Patient Analytics,Fresh Blue + White + Smile Yellow accent,Services. Dentist profiles. Before/after. Online booking. Insurance. Patient testimonials. Friendly imagery. -64,Veterinary Clinic,"clinic, veterinary",Claymorphism + Accessible & Ethical,"Soft UI Evolution, Flat Design",Social Proof-Focused + Trust,Pet Health Dashboard,Caring Blue + Pet-friendly colors + Warm accents,Pet services. Vet profiles. Online booking. Pet portal. Emergency info. Friendly animal imagery. -65,Florist/Plant Shop,"florist, plant, shop",Organic Biophilic + Vibrant & Block-based,"Aurora UI, Motion-Driven",Hero-Centric Design + Conversion,E-commerce Analytics,Natural Green + Floral pinks/purples + Earth tones,Product catalog. Occasion categories. Delivery scheduling. Care guides. Seasonal collections. Beautiful imagery. -66,Bakery/Cafe,"bakery, cafe",Vibrant & Block-based + Soft UI Evolution,"Claymorphism, Motion-Driven",Hero-Centric Design + Conversion,N/A - Order focused,Warm Brown + Cream + Appetizing accents,Menu display. Online ordering. Location/hours. Catering. Seasonal specials. Appetizing photography. -67,Coffee Shop,"coffee, shop",Minimalism + Organic Biophilic,"Soft UI Evolution, Flat Design",Hero-Centric Design + Conversion,N/A - Order focused,Coffee Brown (#6F4E37) + Cream + Warm accents,Menu. Online ordering. Loyalty program. Location. Story/origin. Cozy aesthetic. -68,Brewery/Winery,"brewery, winery",Motion-Driven + Storytelling-Driven,"Dark Mode (OLED), Organic Biophilic",Storytelling-Driven + Hero-Centric,N/A - E-commerce focused,Deep amber/burgundy + Gold + Craft aesthetic,Product showcase. Story/heritage. Tasting notes. Events. Club membership. Artisanal imagery. -69,Airline,"ai, airline, artificial-intelligence, automation, machine-learning, ml",Minimalism + Glassmorphism,"Motion-Driven, Accessible & Ethical",Conversion-Optimized + Feature-Rich,Operations Dashboard,Sky Blue + Brand colors + Trust accents,Flight search. Booking. Check-in. Boarding pass. Loyalty program. Route maps. Mobile-first. -70,News/Media Platform,"content, entertainment, media, news, platform, streaming, video",Minimalism + Flat Design,"Dark Mode (OLED), Accessible & Ethical",Hero-Centric Design + Feature-Rich,Media Analytics Dashboard,Brand colors + High contrast + Category colors,Article layout. Breaking news. Categories. Search. Subscription. Mobile reading. Fast loading. -71,Magazine/Blog,"articles, blog, content, magazine, posts, writing",Swiss Modernism 2.0 + Motion-Driven,"Minimalism, Aurora UI",Storytelling-Driven + Hero-Centric,Content Analytics,Editorial colors + Brand primary + Clean white,Article showcase. Category navigation. Author profiles. Newsletter signup. Related content. Typography-focused. -72,Freelancer Platform,"freelancer, platform",Flat Design + Minimalism,"Vibrant & Block-based, Micro-interactions",Feature-Rich Showcase + Conversion,Marketplace Analytics,Professional Blue + Success Green + Neutral,Profile creation. Portfolio. Skill matching. Messaging. Payment. Reviews. Project management. -73,Consulting Firm,"consulting, firm",Trust & Authority + Minimalism,"Swiss Modernism 2.0, Accessible & Ethical",Trust & Authority + Feature-Rich,N/A - Lead generation,Navy + Gold + Professional grey,Service areas. Case studies. Team profiles. Thought leadership. Contact. Professional credibility. -74,Marketing Agency,"agency, creative, design, marketing, studio",Brutalism + Motion-Driven,"Vibrant & Block-based, Aurora UI",Storytelling-Driven + Feature-Rich,Campaign Analytics,Bold brand colors + Creative freedom,Portfolio. Case studies. Services. Team. Creative showcase. Results-focused. Bold aesthetic. -75,Event Management,"conference, event, management, meetup, registration, ticket",Vibrant & Block-based + Motion-Driven,"Glassmorphism, Aurora UI",Hero-Centric Design + Feature-Rich,Event Analytics,Event theme colors + Excitement accents,Event showcase. Registration. Agenda. Speakers. Sponsors. Ticket sales. Countdown timer. -76,Conference/Webinar Platform,"conference, platform, webinar",Glassmorphism + Minimalism,"Motion-Driven, Flat Design",Feature-Rich Showcase + Conversion,Attendee Analytics,Professional Blue + Video accent + Brand,Registration. Agenda. Speaker profiles. Live stream. Networking. Recording access. Virtual event features. -77,Membership/Community,"community, membership",Vibrant & Block-based + Soft UI Evolution,"Bento Box Grid, Micro-interactions",Social Proof-Focused + Conversion,Community Analytics,Community brand colors + Engagement accents,Member benefits. Pricing tiers. Community showcase. Events. Member directory. Exclusive content. -78,Newsletter Platform,"newsletter, platform",Minimalism + Flat Design,"Swiss Modernism 2.0, Accessible & Ethical",Minimal & Direct + Conversion,Email Analytics,Brand primary + Clean white + CTA accent,Subscribe form. Archive. About. Social proof. Sample content. Simple conversion. -79,Digital Products/Downloads,"digital, downloads, products",Vibrant & Block-based + Motion-Driven,"Glassmorphism, Bento Box Grid",Feature-Rich Showcase + Conversion,E-commerce Analytics,Product category colors + Brand + Success green,Product showcase. Preview. Pricing. Instant delivery. License management. Customer reviews. -80,Church/Religious Organization,"church, organization, religious",Accessible & Ethical + Soft UI Evolution,"Minimalism, Trust & Authority",Hero-Centric Design + Social Proof,N/A - Community focused,Warm Gold + Deep Purple/Blue + White,Service times. Events. Sermons. Community. Giving. Location. Welcoming imagery. -81,Sports Team/Club,"club, sports, team",Vibrant & Block-based + Motion-Driven,"Dark Mode (OLED), 3D & Hyperrealism",Hero-Centric Design + Feature-Rich,Performance Analytics,Team colors + Energetic accents,Schedule. Roster. News. Tickets. Merchandise. Fan engagement. Action imagery. -82,Museum/Gallery,"gallery, museum",Minimalism + Motion-Driven,"Swiss Modernism 2.0, 3D & Hyperrealism",Storytelling-Driven + Feature-Rich,Visitor Analytics,Art-appropriate neutrals + Exhibition accents,Exhibitions. Collections. Tickets. Events. Virtual tours. Educational content. Art-focused design. -83,Theater/Cinema,"cinema, theater",Dark Mode (OLED) + Motion-Driven,"Vibrant & Block-based, Glassmorphism",Hero-Centric Design + Conversion,Booking Analytics,Dark + Spotlight accents + Gold,Showtimes. Seat selection. Trailers. Coming soon. Membership. Dramatic imagery. -84,Language Learning App,"app, language, learning",Claymorphism + Vibrant & Block-based,"Micro-interactions, Flat Design",Feature-Rich Showcase + Social Proof,Learning Analytics,Playful colors + Progress indicators + Country flags,Lesson structure. Progress tracking. Gamification. Speaking practice. Community. Achievement badges. -85,Coding Bootcamp,"bootcamp, coding",Dark Mode (OLED) + Minimalism,"Cyberpunk UI, Flat Design",Feature-Rich Showcase + Social Proof,Student Analytics,Code editor colors + Brand + Success green,Curriculum. Projects. Career outcomes. Alumni. Pricing. Application. Terminal aesthetic. -86,Cybersecurity Platform,"cyber, security, platform",Cyberpunk UI + Dark Mode (OLED),"Neubrutalism, Minimal & Direct",Trust & Authority + Real-Time,Real-Time Monitoring + Heat Map,Matrix Green + Deep Black + Terminal feel,Data density. Threat visualization. Dark mode default. -87,Developer Tool / IDE,"dev, developer, tool, ide",Dark Mode (OLED) + Minimalism,"Flat Design, Bento Box Grid",Minimal & Direct + Documentation,Real-Time Monitor + Terminal,Dark syntax theme colors + Blue focus,Keyboard shortcuts. Syntax highlighting. Fast performance. -88,Biotech / Life Sciences,"biotech, biology, science",Glassmorphism + Clean Science,"Minimalism, Organic Biophilic",Storytelling-Driven + Research,Data-Dense + Predictive,Sterile White + DNA Blue + Life Green,Data accuracy. Cleanliness. Complex data viz. -89,Space Tech / Aerospace,"aerospace, space, tech",Holographic / HUD + Dark Mode,"Glassmorphism, 3D & Hyperrealism",Immersive Experience + Hero,Real-Time Monitoring + 3D,Deep Space Black + Star White + Metallic,High-tech feel. Precision. Telemetry data. -90,Architecture / Interior,"architecture, design, interior",Exaggerated Minimalism + High Imagery,"Swiss Modernism 2.0, Parallax",Portfolio Grid + Visuals,Project Management + Gallery,Monochrome + Gold Accent + High Imagery,High-res images. Typography. Space. -91,Quantum Computing Interface,"quantum, computing, physics, qubit, future, science",Holographic / HUD + Dark Mode,"Glassmorphism, Spatial UI",Immersive/Interactive Experience,3D Spatial Data + Real-Time Monitor,Quantum Blue #00FFFF + Deep Black + Interference patterns,Visualize complexity. Qubit states. Probability clouds. High-tech trust. -92,Biohacking / Longevity App,"biohacking, health, longevity, tracking, wellness, science",Biomimetic / Organic 2.0,"Minimalism, Dark Mode (OLED)",Data-Dense + Storytelling,Real-Time Monitor + Biological Data,Cellular Pink/Red + DNA Blue + Clean White,Personal data privacy. Scientific credibility. Biological visualizations. -93,Autonomous Drone Fleet Manager,"drone, autonomous, fleet, aerial, logistics, robotics",HUD / Sci-Fi FUI,"Real-Time Monitor, Spatial UI",Real-Time Monitor,Geographic + Real-Time,Tactical Green #00FF00 + Alert Red + Map Dark,Real-time telemetry. 3D spatial awareness. Latency indicators. Safety alerts. -94,Generative Art Platform,"art, generative, ai, creative, platform, gallery",Minimalism (Frame) + Gen Z Chaos,"Masonry Grid, Dark Mode",Bento Grid Showcase,Gallery / Portfolio,Neutral #F5F5F5 (Canvas) + User Content,Content is king. Fast loading. Creator attribution. Minting flow. -95,Spatial Computing OS / App,"spatial, vr, ar, vision, os, immersive, mixed-reality",Spatial UI (VisionOS),"Glassmorphism, 3D & Hyperrealism",Immersive/Interactive Experience,Spatial Dashboard,Frosted Glass + System Colors + Depth,Gaze/Pinch interaction. Depth hierarchy. Environment awareness. -96,Sustainable Energy / Climate Tech,"climate, energy, sustainable, green, tech, carbon",Organic Biophilic + E-Ink / Paper,"Data-Dense, Swiss Modernism",Interactive Demo + Data,Energy/Utilities Dashboard,Earth Green + Sky Blue + Solar Yellow,Data transparency. Impact visualization. Low-carbon web design. \ No newline at end of file diff --git a/.cursor/skills/ui-ux-pro-max/data/react-performance.csv b/.cursor/skills/ui-ux-pro-max/data/react-performance.csv deleted file mode 100644 index 671465f2..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/react-performance.csv +++ /dev/null @@ -1,45 +0,0 @@ -No,Category,Issue,Keywords,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity -1,Async Waterfall,Defer Await,async await defer branch,React/Next.js,Move await into branches where actually used to avoid blocking unused code paths,Move await operations into branches where they're needed,Await at top of function blocking all branches,"if (skip) return { skipped: true }; const data = await fetch()","const data = await fetch(); if (skip) return { skipped: true }",Critical -2,Async Waterfall,Promise.all Parallel,promise all parallel concurrent,React/Next.js,Execute independent async operations concurrently using Promise.all(),Use Promise.all() for independent operations,Sequential await for independent operations,"const [user, posts] = await Promise.all([fetchUser(), fetchPosts()])","const user = await fetchUser(); const posts = await fetchPosts()",Critical -3,Async Waterfall,Dependency Parallelization,better-all dependency parallel,React/Next.js,Use better-all for operations with partial dependencies to maximize parallelism,Use better-all to start each task at earliest possible moment,Wait for unrelated data before starting dependent fetch,"await all({ user() {}, config() {}, profile() { return fetch((await this.$.user).id) } })","const [user, config] = await Promise.all([...]); const profile = await fetchProfile(user.id)",Critical -4,Async Waterfall,API Route Optimization,api route waterfall promise,React/Next.js,In API routes start independent operations immediately even if not awaited yet,Start promises early and await late,Sequential awaits in API handlers,"const sessionP = auth(); const configP = fetchConfig(); const session = await sessionP","const session = await auth(); const config = await fetchConfig()",Critical -5,Async Waterfall,Suspense Boundaries,suspense streaming boundary,React/Next.js,Use Suspense to show wrapper UI faster while data loads,Wrap async components in Suspense boundaries,Await data blocking entire page render,"<Suspense fallback={<Skeleton />}><DataDisplay /></Suspense>","const data = await fetchData(); return <DataDisplay data={data} />",High -6,Bundle Size,Barrel Imports,barrel import direct path,React/Next.js,Import directly from source files instead of barrel files to avoid loading unused modules,Import directly from source path,Import from barrel/index files,"import Check from 'lucide-react/dist/esm/icons/check'","import { Check } from 'lucide-react'",Critical -7,Bundle Size,Dynamic Imports,dynamic import lazy next,React/Next.js,Use next/dynamic to lazy-load large components not needed on initial render,Use dynamic() for heavy components,Import heavy components at top level,"const Monaco = dynamic(() => import('./monaco'), { ssr: false })","import { MonacoEditor } from './monaco-editor'",Critical -8,Bundle Size,Defer Third Party,analytics defer third-party,React/Next.js,Load analytics and logging after hydration since they don't block interaction,Load non-critical scripts after hydration,Include analytics in main bundle,"const Analytics = dynamic(() => import('@vercel/analytics'), { ssr: false })","import { Analytics } from '@vercel/analytics/react'",Medium -9,Bundle Size,Conditional Loading,conditional module lazy,React/Next.js,Load large data or modules only when a feature is activated,Dynamic import when feature enabled,Import large modules unconditionally,"useEffect(() => { if (enabled) import('./heavy.js') }, [enabled])","import { heavyData } from './heavy.js'",High -10,Bundle Size,Preload Intent,preload hover focus intent,React/Next.js,Preload heavy bundles on hover/focus before they're needed,Preload on user intent signals,Load only on click,"onMouseEnter={() => import('./editor')}","onClick={() => import('./editor')}",Medium -11,Server,React.cache Dedup,react cache deduplicate request,React/Next.js,Use React.cache() for server-side request deduplication within single request,Wrap data fetchers with cache(),Fetch same data multiple times in tree,"export const getUser = cache(async () => await db.user.find())","export async function getUser() { return await db.user.find() }",Medium -12,Server,LRU Cache Cross-Request,lru cache cross request,React/Next.js,Use LRU cache for data shared across sequential requests,Use LRU for cross-request caching,Refetch same data on every request,"const cache = new LRUCache({ max: 1000, ttl: 5*60*1000 })","Always fetch from database",High -13,Server,Minimize Serialization,serialization rsc boundary,React/Next.js,Only pass fields that client actually uses across RSC boundaries,Pass only needed fields to client components,Pass entire objects to client,"<Profile name={user.name} />","<Profile user={user} /> // 50 fields serialized",High -14,Server,Parallel Fetching,parallel fetch component composition,React/Next.js,Restructure components to parallelize data fetching in RSC,Use component composition for parallel fetches,Sequential fetches in parent component,"<Header /><Sidebar /> // both fetch in parallel","const header = await fetchHeader(); return <><div>{header}</div><Sidebar /></>",Critical -15,Server,After Non-blocking,after non-blocking logging,React/Next.js,Use Next.js after() to schedule work after response is sent,Use after() for logging/analytics,Block response for non-critical operations,"after(async () => { await logAction() }); return Response.json(data)","await logAction(); return Response.json(data)",Medium -16,Client,SWR Deduplication,swr dedup cache revalidate,React/Next.js,Use SWR for automatic request deduplication and caching,Use useSWR for client data fetching,Manual fetch in useEffect,"const { data } = useSWR('/api/users', fetcher)","useEffect(() => { fetch('/api/users').then(setUsers) }, [])",Medium-High -17,Client,Event Listener Dedup,event listener deduplicate global,React/Next.js,Share global event listeners across component instances,Use useSWRSubscription for shared listeners,Register listener per component instance,"useSWRSubscription('global-keydown', () => { window.addEventListener... })","useEffect(() => { window.addEventListener('keydown', handler) }, [])",Low -18,Rerender,Defer State Reads,state read callback subscription,React/Next.js,Don't subscribe to state only used in callbacks,Read state on-demand in callbacks,Subscribe to state used only in handlers,"const handleClick = () => { const params = new URLSearchParams(location.search) }","const params = useSearchParams(); const handleClick = () => { params.get('ref') }",Medium -19,Rerender,Memoized Components,memo extract expensive,React/Next.js,Extract expensive work into memoized components for early returns,Extract to memo() components,Compute expensive values before early return,"const UserAvatar = memo(({ user }) => ...); if (loading) return <Skeleton />","const avatar = useMemo(() => compute(user)); if (loading) return <Skeleton />",Medium -20,Rerender,Narrow Dependencies,effect dependency primitive,React/Next.js,Specify primitive dependencies instead of objects in effects,Use primitive values in dependency arrays,Use object references as dependencies,"useEffect(() => { console.log(user.id) }, [user.id])","useEffect(() => { console.log(user.id) }, [user])",Low -21,Rerender,Derived State,derived boolean subscription,React/Next.js,Subscribe to derived booleans instead of continuous values,Use derived boolean state,Subscribe to continuous values,"const isMobile = useMediaQuery('(max-width: 767px)')","const width = useWindowWidth(); const isMobile = width < 768",Medium -22,Rerender,Functional setState,functional setstate callback,React/Next.js,Use functional setState updates for stable callbacks and no stale closures,Use functional form: setState(curr => ...),Reference state directly in setState,"setItems(curr => [...curr, newItem])","setItems([...items, newItem]) // items in deps",Medium -23,Rerender,Lazy State Init,usestate lazy initialization,React/Next.js,Pass function to useState for expensive initial values,Use function form for expensive init,Compute expensive value directly,"useState(() => buildSearchIndex(items))","useState(buildSearchIndex(items)) // runs every render",Medium -24,Rerender,Transitions,starttransition non-urgent,React/Next.js,Mark frequent non-urgent state updates as transitions,Use startTransition for non-urgent updates,Block UI on every state change,"startTransition(() => setScrollY(window.scrollY))","setScrollY(window.scrollY) // blocks on every scroll",Medium -25,Rendering,SVG Animation Wrapper,svg animation wrapper div,React/Next.js,Wrap SVG in div and animate wrapper for hardware acceleration,Animate div wrapper around SVG,Animate SVG element directly,"<div class='animate-spin'><svg>...</svg></div>","<svg class='animate-spin'>...</svg>",Low -26,Rendering,Content Visibility,content-visibility auto,React/Next.js,Apply content-visibility: auto to defer off-screen rendering,Use content-visibility for long lists,Render all list items immediately,".item { content-visibility: auto; contain-intrinsic-size: 0 80px }","Render 1000 items without optimization",High -27,Rendering,Hoist Static JSX,hoist static jsx element,React/Next.js,Extract static JSX outside components to avoid re-creation,Hoist static elements to module scope,Create static elements inside components,"const skeleton = <div class='animate-pulse' />; function C() { return skeleton }","function C() { return <div class='animate-pulse' /> }",Low -28,Rendering,Hydration No Flicker,hydration mismatch flicker,React/Next.js,Use inline script to set client-only data before hydration,Inject sync script for client-only values,Use useEffect causing flash,"<script dangerouslySetInnerHTML={{ __html: 'el.className = localStorage.theme' }} />","useEffect(() => setTheme(localStorage.theme), []) // flickers",Medium -29,Rendering,Conditional Render,conditional render ternary,React/Next.js,Use ternary instead of && when condition can be 0 or NaN,Use explicit ternary for conditionals,Use && with potentially falsy numbers,"{count > 0 ? <Badge>{count}</Badge> : null}","{count && <Badge>{count}</Badge>} // renders '0'",Low -30,Rendering,Activity Component,activity show hide preserve,React/Next.js,Use Activity component to preserve state/DOM for toggled components,Use Activity for expensive toggle components,Unmount/remount on visibility toggle,"<Activity mode={isOpen ? 'visible' : 'hidden'}><Menu /></Activity>","{isOpen && <Menu />} // loses state",Medium -31,JS Perf,Batch DOM CSS,batch dom css reflow,React/Next.js,Group CSS changes via classes or cssText to minimize reflows,Use class toggle or cssText,Change styles one property at a time,"element.classList.add('highlighted')","el.style.width='100px'; el.style.height='200px'",Medium -32,JS Perf,Index Map Lookup,map index lookup find,React/Next.js,Build Map for repeated lookups instead of multiple .find() calls,Build index Map for O(1) lookups,Use .find() in loops,"const byId = new Map(users.map(u => [u.id, u])); byId.get(id)","users.find(u => u.id === order.userId) // O(n) each time",Low-Medium -33,JS Perf,Cache Property Access,cache property loop,React/Next.js,Cache object property lookups in hot paths,Cache values before loops,Access nested properties in loops,"const val = obj.config.settings.value; for (...) process(val)","for (...) process(obj.config.settings.value)",Low-Medium -34,JS Perf,Cache Function Results,memoize cache function,React/Next.js,Use module-level Map to cache repeated function results,Use Map cache for repeated calls,Recompute same values repeatedly,"const cache = new Map(); if (cache.has(x)) return cache.get(x)","slugify(name) // called 100 times same input",Medium -35,JS Perf,Cache Storage API,localstorage cache read,React/Next.js,Cache localStorage/sessionStorage reads in memory,Cache storage reads in Map,Read storage on every call,"if (!cache.has(key)) cache.set(key, localStorage.getItem(key))","localStorage.getItem('theme') // every call",Low-Medium -36,JS Perf,Combine Iterations,combine filter map loop,React/Next.js,Combine multiple filter/map into single loop,Single loop for multiple categorizations,Chain multiple filter() calls,"for (u of users) { if (u.isAdmin) admins.push(u); if (u.isTester) testers.push(u) }","users.filter(admin); users.filter(tester); users.filter(inactive)",Low-Medium -37,JS Perf,Length Check First,length check array compare,React/Next.js,Check array lengths before expensive comparisons,Early return if lengths differ,Always run expensive comparison,"if (a.length !== b.length) return true; // then compare","a.sort().join() !== b.sort().join() // even when lengths differ",Medium-High -38,JS Perf,Early Return,early return exit function,React/Next.js,Return early when result is determined to skip processing,Return immediately on first error,Process all items then check errors,"for (u of users) { if (!u.email) return { error: 'Email required' } }","let hasError; for (...) { if (!email) hasError=true }; if (hasError)...",Low-Medium -39,JS Perf,Hoist RegExp,regexp hoist module,React/Next.js,Don't create RegExp inside render - hoist or memoize,Hoist RegExp to module scope,Create RegExp every render,"const EMAIL_RE = /^[^@]+@[^@]+$/; function validate() { EMAIL_RE.test(x) }","function C() { const re = new RegExp(pattern); re.test(x) }",Low-Medium -40,JS Perf,Loop Min Max,loop min max sort,React/Next.js,Use loop for min/max instead of sort - O(n) vs O(n log n),Single pass loop for min/max,Sort array to find min/max,"let max = arr[0]; for (x of arr) if (x > max) max = x","arr.sort((a,b) => b-a)[0] // O(n log n)",Low -41,JS Perf,Set Map Lookups,set map includes has,React/Next.js,Use Set/Map for O(1) lookups instead of array.includes(),Convert to Set for membership checks,Use .includes() for repeated checks,"const allowed = new Set(['a','b']); allowed.has(id)","const allowed = ['a','b']; allowed.includes(id)",Low-Medium -42,JS Perf,toSorted Immutable,tosorted sort immutable,React/Next.js,Use toSorted() instead of sort() to avoid mutating arrays,Use toSorted() for immutability,Mutate arrays with sort(),"users.toSorted((a,b) => a.name.localeCompare(b.name))","users.sort((a,b) => a.name.localeCompare(b.name)) // mutates",Medium-High -43,Advanced,Event Handler Refs,useeffectevent ref handler,React/Next.js,Store callbacks in refs for stable effect subscriptions,Use useEffectEvent for stable handlers,Re-subscribe on every callback change,"const onEvent = useEffectEvent(handler); useEffect(() => { listen(onEvent) }, [])","useEffect(() => { listen(handler) }, [handler]) // re-subscribes",Low -44,Advanced,useLatest Hook,uselatest ref callback,React/Next.js,Access latest values in callbacks without adding to dependency arrays,Use useLatest for fresh values in stable callbacks,Add callback to effect dependencies,"const cbRef = useLatest(cb); useEffect(() => { setTimeout(() => cbRef.current()) }, [])","useEffect(() => { setTimeout(() => cb()) }, [cb]) // re-runs",Low diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/astro.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/astro.csv deleted file mode 100644 index cacba81c..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/astro.csv +++ /dev/null @@ -1,54 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Architecture,Use Islands Architecture,Astro's partial hydration only loads JS for interactive components,Interactive components with client directives,Hydrate entire page like traditional SPA,<Counter client:load />,Everything as client component,High,https://docs.astro.build/en/concepts/islands/ -2,Architecture,Default to zero JS,Astro ships zero JS by default - add only when needed,Static components without client directive,Add client:load to everything,<Header /> (static),<Header client:load /> (unnecessary),High,https://docs.astro.build/en/basics/astro-components/ -3,Architecture,Choose right client directive,Different directives for different hydration timing,client:visible for below-fold client:idle for non-critical,client:load for everything,<Comments client:visible />,<Comments client:load />,Medium,https://docs.astro.build/en/reference/directives-reference/#client-directives -4,Architecture,Use content collections,Type-safe content management for blogs docs,Content collections for structured content,Loose markdown files without schema,const posts = await getCollection('blog'),import.meta.glob('./posts/*.md'),High,https://docs.astro.build/en/guides/content-collections/ -5,Architecture,Define collection schemas,Zod schemas for content validation,Schema with required fields and types,No schema validation,"defineCollection({ schema: z.object({...}) })",defineCollection({}),High,https://docs.astro.build/en/guides/content-collections/#defining-a-collection-schema -6,Routing,Use file-based routing,Create routes by adding .astro files in pages/,pages/ directory for routes,Manual route configuration,src/pages/about.astro,Custom router setup,Medium,https://docs.astro.build/en/basics/astro-pages/ -7,Routing,Dynamic routes with brackets,Use [param] for dynamic routes,Bracket notation for params,Query strings for dynamic content,pages/blog/[slug].astro,pages/blog.astro?slug=x,Medium,https://docs.astro.build/en/guides/routing/#dynamic-routes -8,Routing,Use getStaticPaths for SSG,Generate static pages at build time,getStaticPaths for known dynamic routes,Fetch at runtime for static content,"export async function getStaticPaths() { return [...] }",No getStaticPaths with dynamic route,High,https://docs.astro.build/en/reference/api-reference/#getstaticpaths -9,Routing,Enable SSR when needed,Server-side rendering for dynamic content,output: 'server' or 'hybrid' for dynamic,SSR for purely static sites,"export const prerender = false;",SSR for static blog,Medium,https://docs.astro.build/en/guides/server-side-rendering/ -10,Components,Keep .astro for static,Use .astro components for static content,Astro components for layout structure,React/Vue for static markup,<Layout><slot /></Layout>,<ReactLayout>{children}</ReactLayout>,High, -11,Components,Use framework components for interactivity,React Vue Svelte for complex interactivity,Framework component with client directive,Astro component with inline scripts,<ReactCounter client:load />,<script> in .astro for complex state,Medium,https://docs.astro.build/en/guides/framework-components/ -12,Components,Pass data via props,Astro components receive props in frontmatter,Astro.props for component data,Global state for simple data,"const { title } = Astro.props;",Import global store,Low,https://docs.astro.build/en/basics/astro-components/#component-props -13,Components,Use slots for composition,Named and default slots for flexible layouts,<slot /> for child content,Props for HTML content,<slot name="header" />,<Component header={<div>...</div>} />,Medium,https://docs.astro.build/en/basics/astro-components/#slots -14,Components,Colocate component styles,Scoped styles in component file,<style> in same .astro file,Separate CSS files for component styles,<style> .card { } </style>,import './Card.css',Low, -15,Styling,Use scoped styles by default,Astro scopes styles to component automatically,<style> for component-specific styles,Global styles for everything,<style> h1 { } </style> (scoped),<style is:global> for everything,Medium,https://docs.astro.build/en/guides/styling/#scoped-styles -16,Styling,Use is:global sparingly,Global styles only when truly needed,is:global for base styles or overrides,is:global for component styles,<style is:global> body { } </style>,<style is:global> .card { } </style>,Medium, -17,Styling,Integrate Tailwind properly,Use @astrojs/tailwind integration,Official Tailwind integration,Manual Tailwind setup,npx astro add tailwind,Manual PostCSS config,Low,https://docs.astro.build/en/guides/integrations-guide/tailwind/ -18,Styling,Use CSS variables for theming,Define tokens in :root,CSS custom properties for themes,Hardcoded colors everywhere,:root { --primary: #3b82f6; },color: #3b82f6; everywhere,Medium, -19,Data,Fetch in frontmatter,Data fetching in component frontmatter,Top-level await in frontmatter,useEffect for initial data,const data = await fetch(url),client-side fetch on mount,High,https://docs.astro.build/en/guides/data-fetching/ -20,Data,Use Astro.glob for local files,Import multiple local files,Astro.glob for markdown/data files,Manual imports for each file,const posts = await Astro.glob('./posts/*.md'),"import post1; import post2;",Medium, -21,Data,Prefer content collections over glob,Type-safe collections for structured content,getCollection() for blog/docs,Astro.glob for structured content,await getCollection('blog'),await Astro.glob('./blog/*.md'),High, -22,Data,Use environment variables correctly,Import.meta.env for env vars,PUBLIC_ prefix for client vars,Expose secrets to client,import.meta.env.PUBLIC_API_URL,import.meta.env.SECRET in client,High,https://docs.astro.build/en/guides/environment-variables/ -23,Performance,Preload critical assets,Use link preload for important resources,Preload fonts above-fold images,No preload hints,"<link rel=""preload"" href=""font.woff2"" as=""font"">",No preload for critical assets,Medium, -24,Performance,Optimize images with astro:assets,Built-in image optimization,<Image /> component for optimization,<img> for local images,"import { Image } from 'astro:assets';","<img src=""./image.jpg"">",High,https://docs.astro.build/en/guides/images/ -25,Performance,Use picture for responsive images,Multiple formats and sizes,<Picture /> for art direction,Single image size for all screens,<Picture /> with multiple sources,<Image /> with single size,Medium, -26,Performance,Lazy load below-fold content,Defer loading non-critical content,loading=lazy for images client:visible for components,Load everything immediately,"<img loading=""lazy"">",No lazy loading,Medium, -27,Performance,Minimize client directives,Each directive adds JS bundle,Audit client: usage regularly,Sprinkle client:load everywhere,Only interactive components hydrated,Every component with client:load,High, -28,ViewTransitions,Enable View Transitions,Smooth page transitions,<ViewTransitions /> in head,Full page reloads,"import { ViewTransitions } from 'astro:transitions';",No transition API,Medium,https://docs.astro.build/en/guides/view-transitions/ -29,ViewTransitions,Use transition:name,Named elements for morphing,transition:name for persistent elements,Unnamed transitions,"<header transition:name=""header"">",<header> without name,Low, -30,ViewTransitions,Handle transition:persist,Keep state across navigations,transition:persist for media players,Re-initialize on every navigation,"<video transition:persist id=""player"">",Video restarts on navigation,Medium, -31,ViewTransitions,Add fallback for no-JS,Graceful degradation,Content works without JS,Require JS for basic navigation,Static content accessible,Broken without ViewTransitions JS,High, -32,SEO,Use built-in SEO component,Head management for meta tags,Astro SEO integration or manual head,No meta tags,"<title>{title}",No SEO tags,High, -33,SEO,Generate sitemap,Automatic sitemap generation,@astrojs/sitemap integration,Manual sitemap maintenance,npx astro add sitemap,Hand-written sitemap.xml,Medium,https://docs.astro.build/en/guides/integrations-guide/sitemap/ -34,SEO,Add RSS feed for content,RSS for blogs and content sites,@astrojs/rss for feed generation,No RSS feed,rss() helper in pages/rss.xml.js,No feed for blog,Low,https://docs.astro.build/en/guides/rss/ -35,SEO,Use canonical URLs,Prevent duplicate content issues,Astro.url for canonical generation,"",No canonical tags,Medium, -36,Integrations,Use official integrations,Astro's integration system,npx astro add for integrations,Manual configuration,npx astro add react,Manual React setup,Medium,https://docs.astro.build/en/guides/integrations-guide/ -37,Integrations,Configure integrations in astro.config,Centralized configuration,integrations array in config,Scattered configuration,"integrations: [react(), tailwind()]",Multiple config files,Low, -38,Integrations,Use adapter for deployment,Platform-specific adapters,Correct adapter for host,Wrong or no adapter,@astrojs/vercel for Vercel,No adapter for SSR,High,https://docs.astro.build/en/guides/deploy/ -39,TypeScript,Enable TypeScript,Type safety for Astro projects,tsconfig.json with astro types,No TypeScript,Astro TypeScript template,JavaScript only,Medium,https://docs.astro.build/en/guides/typescript/ -40,TypeScript,Type component props,Define prop interfaces,Props interface in frontmatter,Untyped props,"interface Props { title: string }",No props typing,Medium, -41,TypeScript,Use strict mode,Catch errors early,strict: true in tsconfig,Loose TypeScript config,strictest template,base template,Low, -42,Markdown,Use MDX for components,Components in markdown content,@astrojs/mdx for interactive docs,Plain markdown with workarounds, in .mdx,HTML in .md files,Medium,https://docs.astro.build/en/guides/integrations-guide/mdx/ -43,Markdown,Configure markdown plugins,Extend markdown capabilities,remarkPlugins rehypePlugins in config,Manual HTML for features,remarkPlugins: [remarkToc],Manual TOC in every post,Low, -44,Markdown,Use frontmatter for metadata,Structured post metadata,Frontmatter with typed schema,Inline metadata,title date in frontmatter,# Title as first line,Medium, -45,API,Use API routes for endpoints,Server endpoints in pages/api,pages/api/[endpoint].ts for APIs,External API for simple endpoints,pages/api/posts.json.ts,Separate Express server,Medium,https://docs.astro.build/en/guides/endpoints/ -46,API,Return proper responses,Use Response object,new Response() with headers,Plain objects,return new Response(JSON.stringify(data)),return data,Medium, -47,API,Handle methods correctly,Export named method handlers,export GET POST handlers,Single default export,export const GET = async () => {},export default async () => {},Low, -48,Security,Sanitize user content,Prevent XSS in dynamic content,set:html only for trusted content,set:html with user input,"","
",High, -49,Security,Use HTTPS in production,Secure connections,HTTPS for all production sites,HTTP in production,https://example.com,http://example.com,High, -50,Security,Validate API input,Check and sanitize all input,Zod validation for API routes,Trust all input,const body = schema.parse(data),const body = await request.json(),High, -51,Build,Use hybrid rendering,Mix static and dynamic pages,output: 'hybrid' for flexibility,All SSR or all static,prerender per-page basis,Single rendering mode,Medium,https://docs.astro.build/en/guides/server-side-rendering/#hybrid-rendering -52,Build,Analyze bundle size,Monitor JS bundle impact,Build output shows bundle sizes,Ignore bundle growth,Check astro build output,No size monitoring,Medium, -53,Build,Use prefetch,Preload linked pages,prefetch integration,No prefetch for navigation,npx astro add prefetch,Manual prefetch,Low,https://docs.astro.build/en/guides/prefetch/ diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/flutter.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/flutter.csv deleted file mode 100644 index b8dfd0d6..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/flutter.csv +++ /dev/null @@ -1,53 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Widgets,Use StatelessWidget when possible,Immutable widgets are simpler,StatelessWidget for static UI,StatefulWidget for everything,class MyWidget extends StatelessWidget,class MyWidget extends StatefulWidget (static),Medium,https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html -2,Widgets,Keep widgets small,Single responsibility principle,Extract widgets into smaller pieces,Large build methods,Column(children: [Header() Content()]),500+ line build method,Medium, -3,Widgets,Use const constructors,Compile-time constants for performance,const MyWidget() when possible,Non-const for static widgets,const Text('Hello'),Text('Hello') for literals,High,https://dart.dev/guides/language/language-tour#constant-constructors -4,Widgets,Prefer composition over inheritance,Combine widgets using children,Compose widgets,Extend widget classes,Container(child: MyContent()),class MyContainer extends Container,Medium, -5,State,Use setState correctly,Minimal state in StatefulWidget,setState for UI state changes,setState for business logic,setState(() { _counter++; }),Complex logic in setState,Medium,https://api.flutter.dev/flutter/widgets/State/setState.html -6,State,Avoid setState in build,Never call setState during build,setState in callbacks only,setState in build method,onPressed: () => setState(() {}),build() { setState(); },High, -7,State,Use state management for complex apps,Provider Riverpod BLoC,State management for shared state,setState for global state,Provider.of(context),Global setState calls,Medium, -8,State,Prefer Riverpod or Provider,Recommended state solutions,Riverpod for new projects,InheritedWidget manually,ref.watch(myProvider),Custom InheritedWidget,Medium,https://riverpod.dev/ -9,State,Dispose resources,Clean up controllers and subscriptions,dispose() for cleanup,Memory leaks from subscriptions,@override void dispose() { controller.dispose(); },No dispose implementation,High, -10,Layout,Use Column and Row,Basic layout widgets,Column Row for linear layouts,Stack for simple layouts,"Column(children: [Text(), Button()])",Stack for vertical list,Medium,https://api.flutter.dev/flutter/widgets/Column-class.html -11,Layout,Use Expanded and Flexible,Control flex behavior,Expanded to fill space,Fixed sizes in flex containers,Expanded(child: Container()),Container(width: 200) in Row,Medium, -12,Layout,Use SizedBox for spacing,Consistent spacing,SizedBox for gaps,Container for spacing only,SizedBox(height: 16),Container(height: 16),Low, -13,Layout,Use LayoutBuilder for responsive,Respond to constraints,LayoutBuilder for adaptive layouts,Fixed sizes for responsive,LayoutBuilder(builder: (context constraints) {}),Container(width: 375),Medium,https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html -14,Layout,Avoid deep nesting,Keep widget tree shallow,Extract deeply nested widgets,10+ levels of nesting,Extract widget to method or class,Column(Row(Column(Row(...)))),Medium, -15,Lists,Use ListView.builder,Lazy list building,ListView.builder for long lists,ListView with children for large lists,"ListView.builder(itemCount: 100, itemBuilder: ...)",ListView(children: items.map(...).toList()),High,https://api.flutter.dev/flutter/widgets/ListView-class.html -16,Lists,Provide itemExtent when known,Skip measurement,itemExtent for fixed height items,No itemExtent for uniform lists,ListView.builder(itemExtent: 50),ListView.builder without itemExtent,Medium, -17,Lists,Use keys for stateful items,Preserve widget state,Key for stateful list items,No key for dynamic lists,ListTile(key: ValueKey(item.id)),ListTile without key,High, -18,Lists,Use SliverList for custom scroll,Custom scroll effects,CustomScrollView with Slivers,Nested ListViews,CustomScrollView(slivers: [SliverList()]),ListView inside ListView,Medium,https://api.flutter.dev/flutter/widgets/SliverList-class.html -19,Navigation,Use Navigator 2.0 or GoRouter,Declarative routing,go_router for navigation,Navigator.push for complex apps,GoRouter(routes: [...]),Navigator.push everywhere,Medium,https://pub.dev/packages/go_router -20,Navigation,Use named routes,Organized navigation,Named routes for clarity,Anonymous routes,Navigator.pushNamed(context '/home'),Navigator.push(context MaterialPageRoute()),Low, -21,Navigation,Handle back button (PopScope),Android back behavior and predictive back (Android 14+),Use PopScope widget (WillPopScope is deprecated),Use WillPopScope,"PopScope(canPop: false, onPopInvoked: (didPop) => ...)",WillPopScope(onWillPop: ...),High,https://api.flutter.dev/flutter/widgets/PopScope-class.html -22,Navigation,Pass typed arguments,Type-safe route arguments,Typed route arguments,Dynamic arguments,MyRoute(id: '123'),arguments: {'id': '123'},Medium, -23,Async,Use FutureBuilder,Async UI building,FutureBuilder for async data,setState for async,FutureBuilder(future: fetchData()),fetchData().then((d) => setState()),Medium,https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html -24,Async,Use StreamBuilder,Stream UI building,StreamBuilder for streams,Manual stream subscription,StreamBuilder(stream: myStream),stream.listen in initState,Medium,https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html -25,Async,Handle loading and error states,Complete async UI states,ConnectionState checks,Only success state,if (snapshot.connectionState == ConnectionState.waiting),No loading indicator,High, -26,Async,Cancel subscriptions,Clean up stream subscriptions,Cancel in dispose,Memory leaks,subscription.cancel() in dispose,No subscription cleanup,High, -27,Theming,Use ThemeData,Consistent theming,ThemeData for app theme,Hardcoded colors,Theme.of(context).primaryColor,Color(0xFF123456) everywhere,Medium,https://api.flutter.dev/flutter/material/ThemeData-class.html -28,Theming,Use ColorScheme,Material 3 color system,ColorScheme for colors,Individual color properties,colorScheme: ColorScheme.fromSeed(),primaryColor: Colors.blue,Medium, -29,Theming,Access theme via context,Dynamic theme access,Theme.of(context),Static theme reference,Theme.of(context).textTheme.bodyLarge,TextStyle(fontSize: 16),Medium, -30,Theming,Support dark mode,Respect system theme,darkTheme in MaterialApp,Light theme only,"MaterialApp(theme: light, darkTheme: dark)",MaterialApp(theme: light),Medium, -31,Animation,Use implicit animations,Simple animations,AnimatedContainer AnimatedOpacity,Explicit for simple transitions,AnimatedContainer(duration: Duration()),AnimationController for fade,Low,https://api.flutter.dev/flutter/widgets/AnimatedContainer-class.html -32,Animation,Use AnimationController for complex,Fine-grained control,AnimationController with Ticker,Implicit for complex sequences,AnimationController(vsync: this),AnimatedContainer for staggered,Medium, -33,Animation,Dispose AnimationControllers,Clean up animation resources,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High, -34,Animation,Use Hero for transitions,Shared element transitions,Hero for navigation animations,Manual shared element,Hero(tag: 'image' child: Image()),Custom shared element animation,Low,https://api.flutter.dev/flutter/widgets/Hero-class.html -35,Forms,Use Form widget,Form validation,Form with GlobalKey,Individual validation,Form(key: _formKey child: ...),TextField without Form,Medium,https://api.flutter.dev/flutter/widgets/Form-class.html -36,Forms,Use TextEditingController,Control text input,Controller for text fields,onChanged for all text,final controller = TextEditingController(),onChanged: (v) => setState(),Medium, -37,Forms,Validate on submit,Form validation flow,_formKey.currentState!.validate(),Skip validation,if (_formKey.currentState!.validate()),Submit without validation,High, -38,Forms,Dispose controllers,Clean up text controllers,dispose() for controllers,Memory leaks,controller.dispose() in dispose,No controller disposal,High, -39,Performance,Use const widgets,Reduce rebuilds,const for static widgets,No const for literals,const Icon(Icons.add),Icon(Icons.add),High, -40,Performance,Avoid rebuilding entire tree,Minimal rebuild scope,Isolate changing widgets,setState on parent,Consumer only around changing widget,setState on root widget,High, -41,Performance,Use RepaintBoundary,Isolate repaints,RepaintBoundary for animations,Full screen repaints,RepaintBoundary(child: AnimatedWidget()),Animation without boundary,Medium,https://api.flutter.dev/flutter/widgets/RepaintBoundary-class.html -42,Performance,Profile with DevTools,Measure before optimizing,Flutter DevTools profiling,Guess at performance,DevTools performance tab,Optimize without measuring,Medium,https://docs.flutter.dev/tools/devtools -43,Accessibility,Use Semantics widget,Screen reader support,Semantics for accessibility,Missing accessibility info,Semantics(label: 'Submit button'),GestureDetector without semantics,High,https://api.flutter.dev/flutter/widgets/Semantics-class.html -44,Accessibility,Support large fonts,MediaQuery text scaling,MediaQuery.textScaleFactor,Fixed font sizes,style: Theme.of(context).textTheme,TextStyle(fontSize: 14),High, -45,Accessibility,Test with screen readers,TalkBack and VoiceOver,Test accessibility regularly,Skip accessibility testing,Regular TalkBack testing,No screen reader testing,High, -46,Testing,Use widget tests,Test widget behavior,WidgetTester for UI tests,Unit tests only,testWidgets('...' (tester) async {}),Only test() for UI,Medium,https://docs.flutter.dev/testing -47,Testing,Use integration tests,Full app testing,integration_test package,Manual testing only,IntegrationTestWidgetsFlutterBinding,Manual E2E testing,Medium, -48,Testing,Mock dependencies,Isolate tests,Mockito or mocktail,Real dependencies in tests,when(mock.method()).thenReturn(),Real API calls in tests,Medium, -49,Platform,Use Platform checks,Platform-specific code,Platform.isIOS Platform.isAndroid,Same code for all platforms,if (Platform.isIOS) {},Hardcoded iOS behavior,Medium, -50,Platform,Use kIsWeb for web,Web platform detection,kIsWeb for web checks,Platform for web,if (kIsWeb) {},Platform.isWeb (doesn't exist),Medium, -51,Packages,Use pub.dev packages,Community packages,Popular maintained packages,Custom implementations,cached_network_image,Custom image cache,Medium,https://pub.dev/ -52,Packages,Check package quality,Quality before adding,Pub points and popularity,Any package without review,100+ pub points,Unmaintained packages,Medium, diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv deleted file mode 100644 index 51ff57a6..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +++ /dev/null @@ -1,56 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Animation,Use Tailwind animate utilities,Built-in animations are optimized and respect reduced-motion,Use animate-pulse animate-spin animate-ping,Custom @keyframes for simple effects,animate-pulse,@keyframes pulse {...},Medium,https://tailwindcss.com/docs/animation -2,Animation,Limit bounce animations,Continuous bounce is distracting and causes motion sickness,Use animate-bounce sparingly on CTAs only,Multiple bounce animations on page,Single CTA with animate-bounce,5+ elements with animate-bounce,High, -3,Animation,Transition duration,Use appropriate transition speeds for UI feedback,duration-150 to duration-300 for UI,duration-1000 or longer for UI elements,transition-all duration-200,transition-all duration-1000,Medium,https://tailwindcss.com/docs/transition-duration -4,Animation,Hover transitions,Add smooth transitions on hover state changes,Add transition class with hover states,Instant hover changes without transition,hover:bg-gray-100 transition-colors,hover:bg-gray-100 (no transition),Low, -5,Z-Index,Use Tailwind z-* scale,Consistent stacking context with predefined scale,z-0 z-10 z-20 z-30 z-40 z-50,Arbitrary z-index values,z-50 for modals,z-[9999],Medium,https://tailwindcss.com/docs/z-index -6,Z-Index,Fixed elements z-index,Fixed navigation and modals need explicit z-index,z-50 for nav z-40 for dropdowns,Relying on DOM order for stacking,fixed top-0 z-50,fixed top-0 (no z-index),High, -7,Z-Index,Negative z-index for backgrounds,Use negative z-index for decorative backgrounds,z-[-1] for background elements,Positive z-index for backgrounds,-z-10 for decorative,z-10 for background,Low, -8,Layout,Container max-width,Limit content width for readability,max-w-7xl mx-auto for main content,Full-width content on large screens,max-w-7xl mx-auto px-4,w-full (no max-width),Medium,https://tailwindcss.com/docs/container -9,Layout,Responsive padding,Adjust padding for different screen sizes,px-4 md:px-6 lg:px-8,Same padding all sizes,px-4 sm:px-6 lg:px-8,px-8 (same all sizes),Medium, -10,Layout,Grid gaps,Use consistent gap utilities for spacing,gap-4 gap-6 gap-8,Margins on individual items,grid gap-6,grid with mb-4 on each item,Medium,https://tailwindcss.com/docs/gap -11,Layout,Flexbox alignment,Use flex utilities for alignment,items-center justify-between,Multiple nested wrappers,flex items-center justify-between,Nested divs for alignment,Low, -12,Images,Aspect ratio,Maintain consistent image aspect ratios,aspect-video aspect-square,No aspect ratio on containers,aspect-video rounded-lg,No aspect control,Medium,https://tailwindcss.com/docs/aspect-ratio -13,Images,Object fit,Control image scaling within containers,object-cover object-contain,Stretched distorted images,object-cover w-full h-full,No object-fit,Medium,https://tailwindcss.com/docs/object-fit -14,Images,Lazy loading,Defer loading of off-screen images,loading='lazy' on images,All images eager load,, without lazy,High, -15,Images,Responsive images,Serve appropriate image sizes,srcset and sizes attributes,Same large image all devices,srcset with multiple sizes,4000px image everywhere,High, -16,Typography,Prose plugin,Use @tailwindcss/typography for rich text,prose prose-lg for article content,Custom styles for markdown,prose prose-lg max-w-none,Custom text styling,Medium,https://tailwindcss.com/docs/typography-plugin -17,Typography,Line height,Use appropriate line height for readability,leading-relaxed for body text,Default tight line height,leading-relaxed (1.625),leading-none or leading-tight,Medium,https://tailwindcss.com/docs/line-height -18,Typography,Font size scale,Use consistent text size scale,text-sm text-base text-lg text-xl,Arbitrary font sizes,text-lg,text-[17px],Low,https://tailwindcss.com/docs/font-size -19,Typography,Text truncation,Handle long text gracefully,truncate or line-clamp-*,Overflow breaking layout,line-clamp-2,No overflow handling,Medium,https://tailwindcss.com/docs/text-overflow -20,Colors,Opacity utilities,Use color opacity utilities,bg-black/50 text-white/80,Separate opacity class,bg-black/50,bg-black opacity-50,Low,https://tailwindcss.com/docs/background-color -21,Colors,Dark mode,Support dark mode with dark: prefix,dark:bg-gray-900 dark:text-white,No dark mode support,dark:bg-gray-900,Only light theme,Medium,https://tailwindcss.com/docs/dark-mode -22,Colors,Semantic colors,Use semantic color naming in config,primary secondary danger success,Generic color names in components,bg-primary,bg-blue-500 everywhere,Medium, -23,Spacing,Consistent spacing scale,Use Tailwind spacing scale consistently,p-4 m-6 gap-8,Arbitrary pixel values,p-4 (1rem),p-[15px],Low,https://tailwindcss.com/docs/customizing-spacing -24,Spacing,Negative margins,Use sparingly for overlapping effects,-mt-4 for overlapping elements,Negative margins for layout fixing,-mt-8 for card overlap,-m-2 to fix spacing issues,Medium, -25,Spacing,Space between,Use space-y-* for vertical lists,space-y-4 on flex/grid column,Margin on each child,space-y-4,Each child has mb-4,Low,https://tailwindcss.com/docs/space -26,Forms,Focus states,Always show focus indicators,focus:ring-2 focus:ring-blue-500,Remove focus outline,focus:ring-2 focus:ring-offset-2,focus:outline-none (no replacement),High, -27,Forms,Input sizing,Consistent input dimensions,h-10 px-3 for inputs,Inconsistent input heights,h-10 w-full px-3,Various heights per input,Medium, -28,Forms,Disabled states,Clear disabled styling,disabled:opacity-50 disabled:cursor-not-allowed,No disabled indication,disabled:opacity-50,Same style as enabled,Medium, -29,Forms,Placeholder styling,Style placeholder text appropriately,placeholder:text-gray-400,Dark placeholder text,placeholder:text-gray-400,Default dark placeholder,Low, -30,Responsive,Mobile-first approach,Start with mobile styles and add breakpoints,Default mobile + md: lg: xl:,Desktop-first approach,text-sm md:text-base,text-base max-md:text-sm,Medium,https://tailwindcss.com/docs/responsive-design -31,Responsive,Breakpoint testing,Test at standard breakpoints,320 375 768 1024 1280 1536,Only test on development device,Test all breakpoints,Single device testing,High, -32,Responsive,Hidden/shown utilities,Control visibility per breakpoint,hidden md:block,Different content per breakpoint,hidden md:flex,Separate mobile/desktop components,Low,https://tailwindcss.com/docs/display -33,Buttons,Button sizing,Consistent button dimensions,px-4 py-2 or px-6 py-3,Inconsistent button sizes,px-4 py-2 text-sm,Various padding per button,Medium, -34,Buttons,Touch targets,Minimum 44px touch target on mobile,min-h-[44px] on mobile,Small buttons on mobile,min-h-[44px] min-w-[44px],h-8 w-8 on mobile,High, -35,Buttons,Loading states,Show loading feedback,disabled + spinner icon,Clickable during loading,,Button without loading state,High, -36,Buttons,Icon buttons,Accessible icon-only buttons,aria-label on icon buttons,Icon button without label,,,High, -37,Cards,Card structure,Consistent card styling,rounded-lg shadow-md p-6,Inconsistent card styles,rounded-2xl shadow-lg p-6,Mixed card styling,Low, -38,Cards,Card hover states,Interactive cards should have hover feedback,hover:shadow-lg transition-shadow,No hover on clickable cards,hover:shadow-xl transition-shadow,Static cards that are clickable,Medium, -39,Cards,Card spacing,Consistent internal card spacing,space-y-4 for card content,Inconsistent internal spacing,space-y-4 or p-6,Mixed mb-2 mb-4 mb-6,Low, -40,Accessibility,Screen reader text,Provide context for screen readers,sr-only for hidden labels,Missing context for icons,Close menu,No label for icon button,High,https://tailwindcss.com/docs/screen-readers -41,Accessibility,Focus visible,Show focus only for keyboard users,focus-visible:ring-2,Focus on all interactions,focus-visible:ring-2,focus:ring-2 (shows on click too),Medium, -42,Accessibility,Reduced motion,Respect user motion preferences,motion-reduce:animate-none,Ignore motion preferences,motion-reduce:transition-none,No reduced motion support,High,https://tailwindcss.com/docs/hover-focus-and-other-states#prefers-reduced-motion -43,Performance,Configure content paths,Tailwind needs to know where classes are used,Use 'content' array in config,Use deprecated 'purge' option (v2),"content: ['./src/**/*.{js,ts,jsx,tsx}']",purge: [...],High,https://tailwindcss.com/docs/content-configuration -44,Performance,JIT mode,Use JIT for faster builds and smaller bundles,JIT enabled (default in v3),Full CSS in development,Tailwind v3 defaults,Tailwind v2 without JIT,Medium, -45,Performance,Avoid @apply bloat,Use @apply sparingly,Direct utilities in HTML,Heavy @apply usage,class='px-4 py-2 rounded',@apply px-4 py-2 rounded;,Low,https://tailwindcss.com/docs/reusing-styles -46,Plugins,Official plugins,Use official Tailwind plugins,@tailwindcss/forms typography aspect-ratio,Custom implementations,@tailwindcss/forms,Custom form reset CSS,Medium,https://tailwindcss.com/docs/plugins -47,Plugins,Custom utilities,Create utilities for repeated patterns,Custom utility in config,Repeated arbitrary values,Custom shadow utility,"shadow-[0_4px_20px_rgba(0,0,0,0.1)] everywhere",Medium, -48,Layout,Container Queries,Use @container for component-based responsiveness,Use @container and @lg: etc.,Media queries for component internals,@container @lg:grid-cols-2,@media (min-width: ...) inside component,Medium,https://github.com/tailwindlabs/tailwindcss-container-queries -49,Interactivity,Group and Peer,Style based on parent/sibling state,group-hover peer-checked,JS for simple state interactions,group-hover:text-blue-500,onMouseEnter={() => setHover(true)},Low,https://tailwindcss.com/docs/hover-focus-and-other-states#styling-based-on-parent-state -50,Customization,Arbitrary Values,Use [] for one-off values,w-[350px] for specific needs,Creating config for single use,top-[117px] (if strictly needed),style={{ top: '117px' }},Low,https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values -51,Colors,Theme color variables,Define colors in Tailwind theme and use directly,bg-primary text-success border-cta,bg-[var(--color-primary)] text-[var(--color-success)],bg-primary,bg-[var(--color-primary)],Medium,https://tailwindcss.com/docs/customizing-colors -52,Colors,Use bg-linear-to-* for gradients,Tailwind v4 uses bg-linear-to-* syntax for gradients,bg-linear-to-r bg-linear-to-b,bg-gradient-to-* (deprecated in v4),bg-linear-to-r from-blue-500 to-purple-500,bg-gradient-to-r from-blue-500 to-purple-500,Medium,https://tailwindcss.com/docs/background-image -53,Layout,Use shrink-0 shorthand,Shorter class name for flex-shrink-0,shrink-0 shrink,flex-shrink-0 flex-shrink,shrink-0,flex-shrink-0,Low,https://tailwindcss.com/docs/flex-shrink -54,Layout,Use size-* for square dimensions,Single utility for equal width and height,size-4 size-8 size-12,Separate h-* w-* for squares,size-6,h-6 w-6,Low,https://tailwindcss.com/docs/size -55,Images,SVG explicit dimensions,Add width/height attributes to SVGs to prevent layout shift before CSS loads,,SVG without explicit dimensions,,,High, diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv deleted file mode 100644 index 971ff9e3..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +++ /dev/null @@ -1,53 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Composable,Pure UI composables,Composable functions should only render UI,Accept state and callbacks,Calling usecase/repo,Pure UI composable,Business logic in UI,High,https://developer.android.com/jetpack/compose/mental-model -2,Composable,Small composables,Each composable has single responsibility,Split into components,Huge composable,Reusable UI,Monolithic UI,Medium, -3,Composable,Stateless by default,Prefer stateless composables,Hoist state,Local mutable state,Stateless UI,Hidden state,High,https://developer.android.com/jetpack/compose/state#state-hoisting -4,State,Single source of truth,UI state comes from one source,StateFlow from VM,Multiple states,Unified UiState,Scattered state,High,https://developer.android.com/topic/architecture/ui-layer -5,State,Model UI State,Use sealed interface/data class,UiState.Loading,Boolean flags,Explicit state,Flag hell,High, -6,State,remember only UI state,remember for UI-only state,"Scroll, animation",Business state,Correct remember,Misuse remember,High,https://developer.android.com/jetpack/compose/state -7,State,rememberSaveable,Persist state across config,rememberSaveable,remember,State survives,State lost,High,https://developer.android.com/jetpack/compose/state#restore-ui-state -8,State,derivedStateOf,Optimize recomposition,derivedStateOf,Recompute always,Optimized,Jank,Medium,https://developer.android.com/jetpack/compose/performance -9,SideEffect,LaunchedEffect keys,Use correct keys,LaunchedEffect(id),LaunchedEffect(Unit),Scoped effect,Infinite loop,High,https://developer.android.com/jetpack/compose/side-effects -10,SideEffect,rememberUpdatedState,Avoid stale lambdas,rememberUpdatedState,Capture directly,Safe callback,Stale state,Medium,https://developer.android.com/jetpack/compose/side-effects -11,SideEffect,DisposableEffect,Clean up resources,onDispose,No cleanup,No leak,Memory leak,High, -12,Architecture,Unidirectional data flow,UI → VM → State,onEvent,Two-way binding,Predictable flow,Hard debug,High,https://developer.android.com/topic/architecture -13,Architecture,No business logic in UI,Logic belongs to VM,Collect state,Call repo,Clean UI,Fat UI,High, -14,Architecture,Expose immutable state,Expose StateFlow,asStateFlow,Mutable exposed,Safe API,State mutation,High, -15,Lifecycle,Lifecycle-aware collect,Use collectAsStateWithLifecycle,Lifecycle aware,collectAsState,No leak,Leak,High,https://developer.android.com/jetpack/compose/lifecycle -16,Navigation,Event-based navigation,VM emits navigation event,"VM: Channel + receiveAsFlow(), V: Collect with Dispatchers.Main.immediate",Nav in UI,Decoupled nav,Using State / SharedFlow for navigation -> event is replayed and navigation fires again (StateFlow),High,https://developer.android.com/jetpack/compose/navigation -17,Navigation,Typed routes,Use sealed routes,sealed class Route,String routes,Type-safe,Runtime crash,Medium, -18,Performance,Stable parameters,Prefer immutable/stable params,@Immutable,Mutable params,Stable recomposition,Extra recomposition,High,https://developer.android.com/jetpack/compose/performance -19,Performance,Use key in Lazy,Provide stable keys,key=id,No key,Stable list,Item jump,High, -20,Performance,Avoid heavy work,No heavy computation in UI,Precompute in VM,Compute in UI,Smooth UI,Jank,High, -21,Performance,Remember expensive objects,remember heavy objects,remember,Recreate each recomposition,Efficient,Wasteful,Medium, -22,Theming,Design system,Centralized theme,Material3 tokens,Hardcoded values,Consistent UI,Inconsistent,High,https://developer.android.com/jetpack/compose/themes -23,Theming,Dark mode support,Theme-based colors,colorScheme,Fixed color,Adaptive UI,Broken dark,Medium, -24,Layout,Prefer Modifier over extra layouts,Use Modifier to adjust layout instead of adding wrapper composables,Use Modifier.padding(),Wrap content with extra Box,Padding via modifier,Box just for padding,High,https://developer.android.com/jetpack/compose/modifiers -25,Layout,Avoid deep layout nesting,Deep layout trees increase measure & layout cost,Keep layout flat,Box ? Column ? Box ? Row,Flat hierarchy,Deep nested tree,High, -26,Layout,Use Row/Column for linear layout,Linear layouts are simpler and more performant,Use Row / Column,Custom layout for simple cases,Row/Column usage,Over-engineered layout,High, -27,Layout,Use Box only for overlapping content,Box should be used only when children overlap,Stack elements,Use Box as Column,Proper overlay,Misused Box,Medium, -28,Layout,Prefer LazyColumn over Column scroll,Lazy layouts are virtualized and efficient,LazyColumn,Column.verticalScroll(),Lazy list,Scrollable Column,High,https://developer.android.com/jetpack/compose/lists -29,Layout,Avoid nested scroll containers,Nested scrolling causes UX & performance issues,Single scroll container,Scroll inside scroll,One scroll per screen,Nested scroll,High, -30,Layout,Avoid fillMaxSize by default,fillMaxSize may break parent constraints,Use exact size,Fill max everywhere,Constraint-aware size,Overfilled layout,Medium, -31,Layout,Avoid intrinsic size unless necessary,Intrinsic measurement is expensive,Explicit sizing,IntrinsicSize.Min,Predictable layout,Expensive measure,High,https://developer.android.com/jetpack/compose/layout/intrinsics -32,Layout,Use Arrangement and Alignment APIs,Declare layout intent explicitly,Use Arrangement / Alignment,Manual spacing hacks,Declarative spacing,Magic spacing,High, -33,Layout,Extract reusable layout patterns,Repeated layouts should be shared,Create layout composable,Copy-paste layouts,Reusable scaffold,Duplicated layout,High, -34,Theming,No hardcoded text style,Use typography,MaterialTheme.typography,Hardcode sp,Scalable,Inconsistent,Medium, -35,Testing,Stateless UI testing,Composable easy to test,Pass state,Hidden state,Testable,Hard test,High,https://developer.android.com/jetpack/compose/testing -36,Testing,Use testTag,Stable UI selectors,Modifier.testTag,Find by text,Stable tests,Flaky tests,Medium, -37,Preview,Multiple previews,Preview multiple states,@Preview,Single preview,Better dev UX,Misleading,Low,https://developer.android.com/jetpack/compose/tooling/preview -38,DI,Inject VM via Hilt,Use hiltViewModel,@HiltViewModel,Manual VM,Clean DI,Coupling,High,https://developer.android.com/training/dependency-injection/hilt-jetpack -39,DI,No DI in UI,Inject in VM,Constructor inject,Inject composable,Proper scope,Wrong scope,High, -40,Accessibility,Content description,Accessible UI,contentDescription,Ignore a11y,Inclusive,A11y fail,Medium,https://developer.android.com/jetpack/compose/accessibility -41,Accessibility,Semantics,Use semantics API,Modifier.semantics,None,Testable a11y,Invisible,Medium, -42,Animation,Compose animation APIs,Use animate*AsState,AnimatedVisibility,Manual anim,Smooth,Jank,Medium,https://developer.android.com/jetpack/compose/animation -43,Animation,Avoid animation logic in VM,Animation is UI concern,Animate in UI,Animate in VM,Correct layering,Mixed concern,Low, -44,Modularization,Feature-based UI modules,UI per feature,:feature:ui,God module,Scalable,Tight coupling,High,https://developer.android.com/topic/modularization -45,Modularization,Public UI contracts,Expose minimal UI API,Interface/Route,Expose impl,Encapsulated,Leaky module,Medium, -46,State,Snapshot state only,Use Compose state,mutableStateOf,Custom observable,Compose aware,Buggy UI,Medium, -47,State,Avoid mutable collections,Immutable list/map,PersistentList,MutableList,Stable UI,Silent bug,High, -48,Lifecycle,RememberCoroutineScope usage,Only for UI jobs,UI coroutine,Long jobs,Scoped job,Leak,Medium,https://developer.android.com/jetpack/compose/side-effects#remembercoroutinescope -49,Interop,Interop View carefully,Use AndroidView,Isolated usage,Mix everywhere,Safe interop,Messy UI,Low,https://developer.android.com/jetpack/compose/interop -50,Interop,Avoid legacy patterns,No LiveData in UI,StateFlow,LiveData,Modern stack,Legacy debt,Medium, -51,Debug,Use layout inspector,Inspect recomposition,Tools,Blind debug,Fast debug,Guessing,Low,https://developer.android.com/studio/debug/layout-inspector -52,Debug,Enable recomposition counts,Track recomposition,Debug flags,Ignore,Performance aware,Hidden jank,Low, diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/nextjs.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/nextjs.csv deleted file mode 100644 index 8762161a..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/nextjs.csv +++ /dev/null @@ -1,53 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Routing,Use App Router for new projects,App Router is the recommended approach in Next.js 14+,app/ directory with page.tsx,pages/ for new projects,app/dashboard/page.tsx,pages/dashboard.tsx,Medium,https://nextjs.org/docs/app -2,Routing,Use file-based routing,Create routes by adding files in app directory,page.tsx for routes layout.tsx for layouts,Manual route configuration,app/blog/[slug]/page.tsx,Custom router setup,Medium,https://nextjs.org/docs/app/building-your-application/routing -3,Routing,Colocate related files,Keep components styles tests with their routes,Component files alongside page.tsx,Separate components folder,app/dashboard/_components/,components/dashboard/,Low, -4,Routing,Use route groups for organization,Group routes without affecting URL,Parentheses for route groups,Nested folders affecting URL,(marketing)/about/page.tsx,marketing/about/page.tsx,Low,https://nextjs.org/docs/app/building-your-application/routing/route-groups -5,Routing,Handle loading states,Use loading.tsx for route loading UI,loading.tsx alongside page.tsx,Manual loading state management,app/dashboard/loading.tsx,useState for loading in page,Medium,https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming -6,Routing,Handle errors with error.tsx,Catch errors at route level,error.tsx with reset function,try/catch in every component,app/dashboard/error.tsx,try/catch in page component,High,https://nextjs.org/docs/app/building-your-application/routing/error-handling -7,Rendering,Use Server Components by default,Server Components reduce client JS bundle,Keep components server by default,Add 'use client' unnecessarily,export default function Page(),('use client') for static content,High,https://nextjs.org/docs/app/building-your-application/rendering/server-components -8,Rendering,Mark Client Components explicitly,'use client' for interactive components,Add 'use client' only when needed,Server Component with hooks/events,('use client') for onClick useState,No directive with useState,High,https://nextjs.org/docs/app/building-your-application/rendering/client-components -9,Rendering,Push Client Components down,Keep Client Components as leaf nodes,Client wrapper for interactive parts only,Mark page as Client Component, in Server Page,('use client') on page.tsx,High, -10,Rendering,Use streaming for better UX,Stream content with Suspense boundaries,Suspense for slow data fetches,Wait for all data before render,,await allData then render,Medium,https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming -11,Rendering,Choose correct rendering strategy,SSG for static SSR for dynamic ISR for semi-static,generateStaticParams for known paths,SSR for static content,export const revalidate = 3600,fetch without cache config,Medium, -12,DataFetching,Fetch data in Server Components,Fetch directly in async Server Components,async function Page() { const data = await fetch() },useEffect for initial data,const data = await fetch(url),useEffect(() => fetch(url)),High,https://nextjs.org/docs/app/building-your-application/data-fetching -13,DataFetching,Configure caching explicitly (Next.js 15+),Next.js 15 changed defaults to uncached for fetch,Explicitly set cache: 'force-cache' for static data,Assume default is cached (it's not in Next.js 15),fetch(url { cache: 'force-cache' }),fetch(url) // Uncached in v15,High,https://nextjs.org/docs/app/building-your-application/upgrading/version-15 -14,DataFetching,Deduplicate fetch requests,React and Next.js dedupe same requests,Same fetch call in multiple components,Manual request deduplication,Multiple components fetch same URL,Custom cache layer,Low, -15,DataFetching,Use Server Actions for mutations,Server Actions for form submissions,action={serverAction} in forms,API route for every mutation,
,
,Medium,https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations -16,DataFetching,Revalidate data appropriately,Use revalidatePath/revalidateTag after mutations,Revalidate after Server Action,'use client' with manual refetch,revalidatePath('/posts'),router.refresh() everywhere,Medium,https://nextjs.org/docs/app/building-your-application/caching#revalidating -17,Images,Use next/image for optimization,Automatic image optimization and lazy loading, component for all images,
tags directly,{},,High,https://nextjs.org/docs/app/building-your-application/optimizing/images -18,Images,Provide width and height,Prevent layout shift with dimensions,width and height props or fill,Missing dimensions,,,High, -19,Images,Use fill for responsive images,Fill container with object-fit,fill prop with relative parent,Fixed dimensions for responsive,"",,Medium, -20,Images,Configure remote image domains,Whitelist external image sources,remotePatterns in next.config.js,Allow all domains,remotePatterns: [{ hostname: 'cdn.example.com' }],domains: ['*'],High,https://nextjs.org/docs/app/api-reference/components/image#remotepatterns -21,Images,Use priority for LCP images,Mark above-fold images as priority,priority prop on hero images,All images with priority,, on every image,Medium, -22,Fonts,Use next/font for fonts,Self-hosted fonts with zero layout shift,next/font/google or next/font/local,External font links,import { Inter } from 'next/font/google',"",Medium,https://nextjs.org/docs/app/building-your-application/optimizing/fonts -23,Fonts,Apply font to layout,Set font in root layout for consistency,className on body in layout.tsx,Font in individual pages,,Each page imports font,Low, -24,Fonts,Use variable fonts,Variable fonts reduce bundle size,Single variable font file,Multiple font weights as files,Inter({ subsets: ['latin'] }),Inter_400 Inter_500 Inter_700,Low, -25,Metadata,Use generateMetadata for dynamic,Generate metadata based on params,export async function generateMetadata(),Hardcoded metadata everywhere,generateMetadata({ params }),export const metadata = {},Medium,https://nextjs.org/docs/app/building-your-application/optimizing/metadata -26,Metadata,Include OpenGraph images,Add OG images for social sharing,opengraph-image.tsx or og property,Missing social preview images,opengraph: { images: ['/og.png'] },No OG configuration,Medium, -27,Metadata,Use metadata API,Export metadata object for static metadata,export const metadata = {},Manual head tags,export const metadata = { title: 'Page' },Page,Medium, -28,API,Use Route Handlers for APIs,app/api routes for API endpoints,app/api/users/route.ts,pages/api for new projects,export async function GET(request),export default function handler,Medium,https://nextjs.org/docs/app/building-your-application/routing/route-handlers -29,API,Return proper Response objects,Use NextResponse for API responses,NextResponse.json() for JSON,Plain objects or res.json(),return NextResponse.json({ data }),return { data },Medium, -30,API,Handle HTTP methods explicitly,Export named functions for methods,Export GET POST PUT DELETE,Single handler for all methods,export async function POST(),switch(req.method),Low, -31,API,Validate request body,Validate input before processing,Zod or similar for validation,Trust client input,const body = schema.parse(await req.json()),const body = await req.json(),High, -32,Middleware,Use middleware for auth,Protect routes with middleware.ts,middleware.ts at root,Auth check in every page,export function middleware(request),if (!session) redirect in page,Medium,https://nextjs.org/docs/app/building-your-application/routing/middleware -33,Middleware,Match specific paths,Configure middleware matcher,config.matcher for specific routes,Run middleware on all routes,matcher: ['/dashboard/:path*'],No matcher config,Medium, -34,Middleware,Keep middleware edge-compatible,Middleware runs on Edge runtime,Edge-compatible code only,Node.js APIs in middleware,Edge-compatible auth check,fs.readFile in middleware,High, -35,Environment,Use NEXT_PUBLIC prefix,Client-accessible env vars need prefix,NEXT_PUBLIC_ for client vars,Server vars exposed to client,NEXT_PUBLIC_API_URL,API_SECRET in client code,High,https://nextjs.org/docs/app/building-your-application/configuring/environment-variables -36,Environment,Validate env vars,Check required env vars exist,Validate on startup,Undefined env at runtime,if (!process.env.DATABASE_URL) throw,process.env.DATABASE_URL (might be undefined),High, -37,Environment,Use .env.local for secrets,Local env file for development secrets,.env.local gitignored,Secrets in .env committed,.env.local with secrets,.env with DATABASE_PASSWORD,High, -38,Performance,Analyze bundle size,Use @next/bundle-analyzer,Bundle analyzer in dev,Ship large bundles blindly,ANALYZE=true npm run build,No bundle analysis,Medium,https://nextjs.org/docs/app/building-your-application/optimizing/bundle-analyzer -39,Performance,Use dynamic imports,Code split with next/dynamic,dynamic() for heavy components,Import everything statically,const Chart = dynamic(() => import('./Chart')),import Chart from './Chart',Medium,https://nextjs.org/docs/app/building-your-application/optimizing/lazy-loading -40,Performance,Avoid layout shifts,Reserve space for dynamic content,Skeleton loaders aspect ratios,Content popping in,"",No placeholder for async content,High, -41,Performance,Use Partial Prerendering,Combine static and dynamic in one route,Static shell with Suspense holes,Full dynamic or static pages,Static header + dynamic content,Entire page SSR,Low,https://nextjs.org/docs/app/building-your-application/rendering/partial-prerendering -42,Link,Use next/link for navigation,Client-side navigation with prefetching," for internal links", for internal navigation,"About","About",High,https://nextjs.org/docs/app/api-reference/components/link -43,Link,Prefetch strategically,Control prefetching behavior,prefetch={false} for low-priority,Prefetch all links,,Default prefetch on every link,Low, -44,Link,Use scroll option appropriately,Control scroll behavior on navigation,scroll={false} for tabs pagination,Always scroll to top,,Manual scroll management,Low, -45,Config,Use next.config.js correctly,Configure Next.js behavior,Proper config options,Deprecated or wrong options,images: { remotePatterns: [] },images: { domains: [] },Medium,https://nextjs.org/docs/app/api-reference/next-config-js -46,Config,Enable strict mode,Catch potential issues early,reactStrictMode: true,Strict mode disabled,reactStrictMode: true,reactStrictMode: false,Medium, -47,Config,Configure redirects and rewrites,Use config for URL management,redirects() rewrites() in config,Manual redirect handling,redirects: async () => [...],res.redirect in pages,Medium,https://nextjs.org/docs/app/api-reference/next-config-js/redirects -48,Deployment,Use Vercel for easiest deploy,Vercel optimized for Next.js,Deploy to Vercel,Self-host without knowledge,vercel deploy,Complex Docker setup for simple app,Low,https://nextjs.org/docs/app/building-your-application/deploying -49,Deployment,Configure output for self-hosting,Set output option for deployment target,output: 'standalone' for Docker,Default output for containers,output: 'standalone',No output config for Docker,Medium,https://nextjs.org/docs/app/building-your-application/deploying#self-hosting -50,Security,Sanitize user input,Never trust user input,Escape sanitize validate all input,Direct interpolation of user data,DOMPurify.sanitize(userInput),dangerouslySetInnerHTML={{ __html: userInput }},High, -51,Security,Use CSP headers,Content Security Policy for XSS protection,Configure CSP in next.config.js,No security headers,headers() with CSP,No CSP configuration,High,https://nextjs.org/docs/app/building-your-application/configuring/content-security-policy -52,Security,Validate Server Action input,Server Actions are public endpoints,Validate and authorize in Server Action,Trust Server Action input,Auth check + validation in action,Direct database call without check,High, diff --git a/.cursor/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv b/.cursor/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv deleted file mode 100644 index 7146e848..00000000 --- a/.cursor/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +++ /dev/null @@ -1,51 +0,0 @@ -No,Category,Guideline,Description,Do,Don't,Code Good,Code Bad,Severity,Docs URL -1,Installation,Add Nuxt UI module,Install and configure Nuxt UI in your Nuxt project,pnpm add @nuxt/ui and add to modules,Manual component imports,"modules: ['@nuxt/ui']","import { UButton } from '@nuxt/ui'",High,https://ui.nuxt.com/docs/getting-started/installation/nuxt -2,Installation,Import Tailwind and Nuxt UI CSS,Required CSS imports in main.css file,@import tailwindcss and @import @nuxt/ui,Skip CSS imports,"@import ""tailwindcss""; @import ""@nuxt/ui"";",No CSS imports,High,https://ui.nuxt.com/docs/getting-started/installation/nuxt -3,Installation,Wrap app with UApp component,UApp provides global configs for Toast Tooltip and overlays, wrapper in app.vue,Skip UApp wrapper,, without wrapper,High,https://ui.nuxt.com/docs/components/app -4,Components,Use U prefix for components,All Nuxt UI components use U prefix by default,UButton UInput UModal,Button Input Modal,Click,,Medium,https://ui.nuxt.com/docs/getting-started/installation/nuxt -5,Components,Use semantic color props,Use semantic colors like primary secondary error,color="primary" color="error",Hardcoded colors,"","",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system -6,Components,Use variant prop for styling,Nuxt UI provides solid outline soft subtle ghost link variants,variant="soft" variant="outline",Custom button classes,"","",Medium,https://ui.nuxt.com/docs/components/button -7,Components,Use size prop consistently,Components support xs sm md lg xl sizes,size="sm" size="lg",Arbitrary sizing classes,"","",Low,https://ui.nuxt.com/docs/components/button -8,Icons,Use icon prop with Iconify format,Nuxt UI supports Iconify icons via icon prop,icon="lucide:home" icon="heroicons:user",i-lucide-home format,"","",Medium,https://ui.nuxt.com/docs/getting-started/integrations/icons/nuxt -9,Icons,Use leadingIcon and trailingIcon,Position icons with dedicated props for clarity,leadingIcon="lucide:plus" trailingIcon="lucide:arrow-right",Manual icon positioning,"","Add",Low,https://ui.nuxt.com/docs/components/button -10,Theming,Configure colors in app.config.ts,Runtime color configuration without restart,ui.colors.primary in app.config.ts,Hardcoded colors in components,"defineAppConfig({ ui: { colors: { primary: 'blue' } } })","",High,https://ui.nuxt.com/docs/getting-started/theme/design-system -11,Theming,Use @theme directive for custom colors,Define design tokens in CSS with Tailwind @theme,@theme { --color-brand-500: #xxx },Inline color definitions,@theme { --color-brand-500: #ef4444; },:style="{ color: '#ef4444' }",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system -12,Theming,Extend semantic colors in nuxt.config,Register new colors like tertiary in theme.colors,theme.colors array in ui config,Use undefined colors,"ui: { theme: { colors: ['primary', 'tertiary'] } }"," without config",Medium,https://ui.nuxt.com/docs/getting-started/theme/design-system -13,Forms,Use UForm with schema validation,UForm supports Zod Yup Joi Valibot schemas,:schema prop with validation schema,Manual form validation,"",Manual @blur validation,High,https://ui.nuxt.com/docs/components/form -14,Forms,Use UFormField for field wrapper,Provides label error message and validation display,UFormField with name prop,Manual error handling,"",
error
,Medium,https://ui.nuxt.com/docs/components/form-field -15,Forms,Handle form submit with @submit,UForm emits submit event with validated data,@submit handler on UForm,@click on submit button,"","",Medium,https://ui.nuxt.com/docs/components/form -16,Forms,Use validateOn prop for validation timing,Control when validation triggers (blur change input),validateOn="['blur']" for performance,Always validate on input,""," (validates on every keystroke)",Low,https://ui.nuxt.com/docs/components/form -17,Overlays,Use v-model:open for overlay control,Modal Slideover Drawer use v-model:open,v-model:open for controlled state,Manual show/hide logic,"",,Medium,https://ui.nuxt.com/docs/components/modal -18,Overlays,Use useOverlay composable for programmatic overlays,Open overlays programmatically without template refs,useOverlay().open(MyModal),Template ref and manual control,"const overlay = useOverlay(); overlay.open(MyModal, { props })","const modal = ref(); modal.value.open()",Medium,https://ui.nuxt.com/docs/components/modal -19,Overlays,Use title and description props,Built-in header support for overlays,title="Confirm" description="Are you sure?",Manual header content,"","",Low,https://ui.nuxt.com/docs/components/modal -20,Dashboard,Use UDashboardSidebar for navigation,Provides collapsible resizable sidebar with mobile support,UDashboardSidebar with header default footer slots,Custom sidebar implementation,,