@asrunjs/asrun 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/explore-case.md +2 -1
- package/.claude/commands/gen-spec.md +2 -1
- package/.claude/commands/heal-spec.md +2 -1
- package/.claude/commands/make-case.md +2 -1
- package/.claude/skills/exploring-cases/SKILL.md +59 -64
- package/.claude/skills/exploring-cases/references/case-rules.md +5 -0
- package/.claude/skills/exploring-cases/references/notes.md +87 -0
- package/.claude/skills/exploring-cases/references/open-questions.md +8 -0
- package/.claude/skills/exploring-cases/references/readiness.md +3 -2
- package/.claude/skills/exploring-cases/references/tools.md +34 -0
- package/.claude/skills/exploring-cases/references/user-handoff.md +13 -9
- package/.claude/skills/generating-specs/SKILL.md +61 -47
- package/.claude/skills/generating-specs/references/conventions.md +6 -2
- package/.claude/skills/making-cases/SKILL.md +12 -5
- package/.claude/skills/making-cases/references/writes-and-email.md +5 -2
- package/AGENTS.md +30 -14
- package/README.md +16 -11
- package/bin/asrun.mjs +1 -0
- package/dist/lib/case-doc.d.ts +1 -1
- package/dist/lib/config.d.ts +26 -0
- package/dist/lib/config.js +51 -0
- package/dist/lib/explore-notes.d.ts +74 -0
- package/dist/lib/explore-notes.js +242 -0
- package/dist/lib/fixtures.d.ts +1 -1
- package/dist/lib/fixtures.js +7 -4
- package/dist/lib/paths.d.ts +2 -0
- package/dist/lib/paths.js +2 -0
- package/dist/lib/records.d.ts +17 -2
- package/dist/lib/records.js +32 -2
- package/dist/lib/rules.d.ts +57 -0
- package/dist/lib/rules.js +140 -0
- package/dist/scripts/cleanup.js +10 -1
- package/dist/scripts/cli.js +17 -2
- package/dist/scripts/doctor.js +27 -48
- package/dist/scripts/explore-notes.d.ts +1 -0
- package/dist/scripts/explore-notes.js +131 -0
- package/dist/scripts/lint-specs.js +23 -1
- package/dist/scripts/rules.d.ts +1 -0
- package/dist/scripts/rules.js +148 -0
- package/docs/agents/case-format.md +9 -5
- package/docs/agents/framework-dev.md +4 -0
- package/docs/ai-workflow.md +30 -13
- package/docs/cases.md +14 -10
- package/docs/commands.md +33 -4
- package/docs/install.md +2 -1
- package/docs/theme-guide.html +79 -2
- package/docs/troubleshooting.md +11 -2
- package/docs/web-ui.md +40 -12
- package/package.json +3 -1
- package/templates/.claude/commands/explore-case.md +3 -1
- package/templates/.claude/commands/gen-spec.md +3 -1
- package/templates/.claude/commands/heal-spec.md +3 -1
- package/templates/.claude/commands/make-case.md +3 -1
- package/templates/AGENTS.md +17 -8
- package/templates/cases/_template.md +3 -3
- package/templates/package.json +5 -0
- package/ui/dist/assets/{dist-BmWaNjqO.js → dist-BX88bMYN.js} +1 -1
- package/ui/dist/assets/{dist-2msWI-5M.js → dist-Bfv586Or.js} +1 -1
- package/ui/dist/assets/{dist-e-KhTWHJ.js → dist-BjlbPf3t.js} +1 -1
- package/ui/dist/assets/{dist-BVvHVJ3N.js → dist-CJnqQMvX.js} +1 -1
- package/ui/dist/assets/{dist-BMfJatHo.js → dist-CaAcCNRS.js} +1 -1
- package/ui/dist/assets/{dist-sfZKBSMm.js → dist-Clj0wGFy.js} +1 -1
- package/ui/dist/assets/{dist-J36xayOv.js → dist-D8TUm3Ai.js} +1 -1
- package/ui/dist/assets/{dist-4U_gPHXf.js → dist-DUDqh_3e.js} +1 -1
- package/ui/dist/assets/{dist-BwNz_xW2.js → dist-DkAx5a-Y.js} +1 -1
- package/ui/dist/assets/{dist-wjB7g6OJ.js → dist-cuboTVh-.js} +1 -1
- package/ui/dist/assets/index-DaUQORCy.js +353 -0
- package/ui/dist/assets/index-j3W4BBCj.css +2 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-CGbRJT3b.js +0 -348
- package/ui/dist/assets/index-CI0i0LWc.css +0 -2
package/docs/commands.md
CHANGED
|
@@ -10,6 +10,7 @@ thin wrappers, so `pnpm asrun`, `pnpm signin` and the rest work as below. The sa
|
|
|
10
10
|
| Install the framework in a project | `pnpm dlx @asrunjs/asrun init --install` |
|
|
11
11
|
| Upgrade the framework and migrate the workspace | `pnpm asrun upgrade [--version <v>] [--dry-run]` |
|
|
12
12
|
| Prepare or check the workspace | `pnpm asrun init [--update]`, `pnpm asrun doctor` |
|
|
13
|
+
| See the effective rules and project settings | `pnpm asrun rules [--json] [--case <case-id>]` |
|
|
13
14
|
| See or apply the workspace migrations after a manual install | `pnpm asrun migrate [--list] [--dry-run]` |
|
|
14
15
|
| Start over with fresh dependencies | `pnpm asrun reset [--yes] [--state] [--lockfile]` |
|
|
15
16
|
| Start the web UI | `pnpm go`, `pnpm ui`, `pnpm ui:dev` |
|
|
@@ -18,6 +19,7 @@ thin wrappers, so `pnpm asrun`, `pnpm signin` and the rest work as below. The sa
|
|
|
18
19
|
| Run tests | `pnpm asrun --env <env> [filters]` |
|
|
19
20
|
| Open the last report | `pnpm report` |
|
|
20
21
|
| Look around a page as a profile | `pnpm explore <profile-id> [path]` |
|
|
22
|
+
| See or validate what an exploration recorded for a case | `pnpm explore:notes <case-id> [--profile <id>] [--json] [--check]` |
|
|
21
23
|
| Read what the last report says about a case | `pnpm heal:evidence --case <case-id> --env <env>` |
|
|
22
24
|
| List or forget test data that could not be removed | `pnpm cleanup --env <env> [--forget]` |
|
|
23
25
|
| Create or validate a case | `pnpm case:new <id>`, `pnpm case:check [case-id]` |
|
|
@@ -141,6 +143,9 @@ pnpm pdf:render report.pdf --out .explore/targets/header-logo --corner top-left
|
|
|
141
143
|
|
|
142
144
|
```bash
|
|
143
145
|
pnpm explore example-staging /app/home
|
|
146
|
+
pnpm explore:notes conduit/header-navigation
|
|
147
|
+
pnpm explore:notes conduit/header-navigation --profile example-staging --json
|
|
148
|
+
pnpm explore:notes conduit/header-navigation --check
|
|
144
149
|
pnpm heal:evidence --case header-logo --env staging
|
|
145
150
|
```
|
|
146
151
|
|
|
@@ -149,6 +154,28 @@ are saved to `~/Downloads` and never overwrite an existing file. `heal:evidence`
|
|
|
149
154
|
step, error, call log and screenshots for a case, and whether the report is stale; it is what `/heal-spec` reads
|
|
150
155
|
first.
|
|
151
156
|
|
|
157
|
+
`explore:notes` reads the **exploration note** that `/explore-case` writes for a case under
|
|
158
|
+
`.explore/notes/<case-id>/<profile-id>.json`. It prints one line per profile (fresh or stale, the steps and targets it
|
|
159
|
+
covers) and `--json` prints the parsed notes for a run that reads them. A note is local, git-ignored and optional:
|
|
160
|
+
`/gen-spec` uses a fresh one to verify the locators and request patterns instead of rediscovering them, and replays the
|
|
161
|
+
case when it is missing or stale. `--check` fails on a malformed note and warns about a stale one (it prints the current
|
|
162
|
+
`caseSha256`); `--hash` prints that hash. Deleting `.explore/notes/` is always safe.
|
|
163
|
+
|
|
164
|
+
## Rules
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
pnpm asrun rules
|
|
168
|
+
pnpm asrun rules --json
|
|
169
|
+
pnpm asrun rules --case conduit/publish-article
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Prints the effective rules of the workspace: the framework baseline, the project's `AGENTS.md` §2 table (id, effect
|
|
173
|
+
and text), and the project settings the framework needs at run time (`testDataPrefix` and the resulting data-name
|
|
174
|
+
format). `--case <id>` adds that case's `## Rules`. `--json` is the machine-readable form the AI steps read before
|
|
175
|
+
they apply anything. A §2 row that is invalid — an unknown baseline id, a `[non-negotiable]` rule, a duplicate id, a
|
|
176
|
+
project id (`P1`, ...) without `adds` — is printed as an error and the command exits 1; `doctor` shows the same errors.
|
|
177
|
+
The point is that "§2 wins over the baseline" is a fact the tool states, not a judgment an agent has to make.
|
|
178
|
+
|
|
152
179
|
## Cleanup
|
|
153
180
|
|
|
154
181
|
```bash
|
|
@@ -156,10 +183,12 @@ pnpm cleanup --env staging
|
|
|
156
183
|
pnpm cleanup --env staging --forget
|
|
157
184
|
```
|
|
158
185
|
|
|
159
|
-
A write case registers everything it creates (named
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
186
|
+
A write case registers everything it creates (named with the project's prefix and a run stamp, for example
|
|
187
|
+
`[asrun] Draft CMA (2026-11-09 12-34-56)`) and removes it after the test, also after a failure. Whatever could not be
|
|
188
|
+
removed is listed in the report and by `cleanup`. Delete it by hand in the product, then run `--forget` so it is not
|
|
189
|
+
listed again. The run stamp matches the report folder and the ledger entry, so one run's leftovers are easy to find.
|
|
190
|
+
`--env` is required. `cleanup` is about test data in the product; `pnpm asrun reset` (below) is the command that
|
|
191
|
+
removes workspace files and dependencies.
|
|
163
192
|
|
|
164
193
|
## Web UI
|
|
165
194
|
|
package/docs/install.md
CHANGED
|
@@ -163,7 +163,8 @@ Run it after changing profiles, rules or overrides, and after an update. It chec
|
|
|
163
163
|
- that `.gitignore` ignores `.auth/` and `reports/`;
|
|
164
164
|
- whether the installed version is behind the package's templates, and whether `dist/` is out of date;
|
|
165
165
|
- the workspace migrations: the baseline in `.asrun.json`, what still applies, and the manual steps left open;
|
|
166
|
-
- the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a non-negotiable rule
|
|
166
|
+
- the project rule table in `AGENTS.md` §2 (unknown ids, a missing `Effect`, a duplicate id, a non-negotiable rule, a
|
|
167
|
+
project id without `adds`) and the project settings in `package.json` `"asrun"` (for example `testDataPrefix`);
|
|
167
168
|
- the framework skills and the project overrides under `.claude/skills/<skill>.md`, and lists the ones it sees.
|
|
168
169
|
|
|
169
170
|
## Which workspace a command runs against
|
package/docs/theme-guide.html
CHANGED
|
@@ -144,6 +144,13 @@
|
|
|
144
144
|
}
|
|
145
145
|
.btn:hover { transform: translateY(-1px); }
|
|
146
146
|
.btn[disabled] { opacity: .5; cursor: not-allowed; box-shadow: none; transform: none; }
|
|
147
|
+
/* A button disabled because something must happen first: gold with a lock, not faded (see "Blocked" below). */
|
|
148
|
+
.btn[disabled][data-blocked] {
|
|
149
|
+
opacity: 1;
|
|
150
|
+
background: var(--gold-bg);
|
|
151
|
+
color: var(--gold-deep);
|
|
152
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--gold-deep) 45%, transparent);
|
|
153
|
+
}
|
|
147
154
|
.btn svg { flex: none; }
|
|
148
155
|
.btn-primary, .btn-success {
|
|
149
156
|
color: #fff;
|
|
@@ -330,6 +337,7 @@
|
|
|
330
337
|
<a href="#icons">Icons</a>
|
|
331
338
|
<a href="#tooltips">Tooltips</a>
|
|
332
339
|
<a href="#editor">Markdown editor</a>
|
|
340
|
+
<a href="#document-tabs">Document tabs</a>
|
|
333
341
|
<a href="#surfaces">Surfaces</a>
|
|
334
342
|
<a href="#sections">Sidebar sections</a>
|
|
335
343
|
<a href="#checklist">Checklist</a>
|
|
@@ -517,6 +525,11 @@
|
|
|
517
525
|
<button class="btn btn-info">Full screen</button>
|
|
518
526
|
<button class="btn btn-danger">Cancel</button>
|
|
519
527
|
<button class="btn btn-secondary" disabled>Disabled</button>
|
|
528
|
+
<button class="btn btn-secondary" disabled data-blocked>
|
|
529
|
+
<!-- Lock icon from Feather (https://feathericons.com/) -->
|
|
530
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
|
|
531
|
+
Blocked
|
|
532
|
+
</button>
|
|
520
533
|
</div>
|
|
521
534
|
<table>
|
|
522
535
|
<thead><tr><th>Variant</th><th>Use for</th></tr></thead>
|
|
@@ -530,7 +543,12 @@
|
|
|
530
543
|
<tr><td><code>invalid</code> (red field)</td><td>A control that is required and still empty, drawn as a button because it opens a panel instead of a native list (the environment picker of the case toolbar). The same red as an invalid dropdown; it is not an action.</td></tr>
|
|
531
544
|
</tbody>
|
|
532
545
|
</table>
|
|
533
|
-
<p class="small muted">Hover lifts the button 1px
|
|
546
|
+
<p class="small muted">Hover lifts the button 1px. Disabled has two looks, and they must not be mixed up: a control with
|
|
547
|
+
nothing to do yet, or one that waits for the app (a running job, a pending request), is 50% opacity with no shadow;
|
|
548
|
+
a control that is disabled because <b>you</b> must do something first (save the file, choose an environment, tick a
|
|
549
|
+
profile, fix a name) is <b>blocked</b>: the gold tint above, a Feather <code>Lock</code> icon instead of its usual icon, and a
|
|
550
|
+
tooltip that says what to do (<code>blocked()</code> in <code>components/status.tsx</code> sets
|
|
551
|
+
<code>data-blocked</code>). With an icon, add <code>gap-1.5</code> to the button.</p>
|
|
534
552
|
|
|
535
553
|
<h2 id="badges">Badges</h2>
|
|
536
554
|
<div class="demo">
|
|
@@ -833,7 +851,10 @@ import {FilterChips} from '../components/filter-chips';
|
|
|
833
851
|
Write a plain <code>title="..."</code> on the element. <code>lib/tooltip.ts</code> (tippy.js) turns every <code>title</code> into
|
|
834
852
|
a dark tooltip with an arrow on hover, so the browser's native tooltip never shows. Do not set up tippy per component and do not
|
|
835
853
|
use a <code>title</code> on an <code>iframe</code>. Each <code>\n</code> in the text starts a new paragraph, and a line that starts with <code># </code> is a bold heading. Keep it short: a heading, then one or two sentences. Never put a command line or other long raw text in a tooltip. Disabled buttons and inputs get the
|
|
836
|
-
tooltip too, so a <code>title</code> that says why something is disabled works.
|
|
854
|
+
tooltip too, so a <code>title</code> that says why something is disabled works. Point at the control, not at a
|
|
855
|
+
position: never write "above", "below", "left" or "right", because a layout change silently makes it wrong; name the
|
|
856
|
+
control or the bar instead ("in the AI toolbar below the tabs"). A tooltip of a disabled control says what to do
|
|
857
|
+
first, and when it is <b>blocked</b> (see the buttons above) the lock and the gold say so without opening it. The box is styled by <code>.tippy-box[data-theme~='tip']</code>
|
|
837
858
|
in <code>index.css</code>; the keyword help of the case editor and the ? help of the case panel have their own
|
|
838
859
|
<code>inkstone</code> theme, and both open on click (see <code>ui/web/src/lib/section-help.ts</code>).
|
|
839
860
|
A target card is too long for a tooltip: it opens as a window (<code>components/case-panel/target-card-dialog.tsx</code>).
|
|
@@ -959,6 +980,62 @@ import {FilterChips} from '../components/filter-chips';
|
|
|
959
980
|
<li><b>Every expand/collapse animates.</b> Use <code>Collapse</code> from <code>components/collapse.tsx</code> (height and fade, 200ms, <code>ease-out</code>) for content that appears and disappears, and rotate the chevron with <code>transition-transform duration-200</code> instead of swapping two icons. Always add <code>motion-reduce:transition-none</code>. Turn transitions off while the user drags a resize handle.</li>
|
|
960
981
|
</ul>
|
|
961
982
|
|
|
983
|
+
<h2 id="document-tabs">Document tabs</h2>
|
|
984
|
+
<p class="muted">
|
|
985
|
+
A page that holds more than one file of the same thing puts them in a tab strip: <code>DocumentTabs</code> in
|
|
986
|
+
<code>pages/cases.tsx</code>, where <b>Case</b> is the source a person writes and <b>Spec</b> what a run
|
|
987
|
+
generated from it. The strip is the only place the file names appear. The bar under it carries the tools of the
|
|
988
|
+
file on screen (<code>WorkbenchControls</code>, the layout and pane switches), never a second copy of the name,
|
|
989
|
+
and <b>Save</b> / <b>Discard</b> always sit at the same end of the strip and act on the file on screen.
|
|
990
|
+
</p>
|
|
991
|
+
<div class="demo" style="align-items:flex-end;gap:16px;padding:12px 16px 0;background:var(--warm);border-bottom:1px solid var(--line-mid)">
|
|
992
|
+
<span style="display:flex;align-items:center;gap:8px;margin-bottom:-1px;padding:6px 12px;border-bottom:2px solid var(--theme-btn);border-radius:6px 6px 0 0;background:var(--card);font-size:14px">
|
|
993
|
+
<span style="font-size:12px;font-weight:500;letter-spacing:.05em;color:var(--theme-ink)">Case</span>
|
|
994
|
+
<span class="mono">favorite-article.md</span>
|
|
995
|
+
<span title="Unsaved changes" style="width:6px;height:6px;border-radius:9999px;background:var(--gold-deep)"></span>
|
|
996
|
+
</span>
|
|
997
|
+
<span style="display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:2px solid transparent;border-radius:6px 6px 0 0;font-size:14px;color:var(--ink-2)">
|
|
998
|
+
<span style="font-size:12px;font-weight:500;letter-spacing:.05em;color:var(--ink-3)">Spec</span>
|
|
999
|
+
<span class="mono">favorite-article.spec.ts</span>
|
|
1000
|
+
</span>
|
|
1001
|
+
<span style="display:flex;align-items:center;gap:8px;margin-left:auto;padding-bottom:8px">
|
|
1002
|
+
<span class="btn btn-secondary">Discard</span>
|
|
1003
|
+
<span class="btn btn-primary">Save</span>
|
|
1004
|
+
<span class="btn btn-secondary">...</span>
|
|
1005
|
+
</span>
|
|
1006
|
+
</div>
|
|
1007
|
+
<div class="demo" style="gap:16px;background:var(--card);border-bottom:1px solid var(--line-mid);padding:8px 16px">
|
|
1008
|
+
<span style="display:flex;align-items:center;gap:6px">
|
|
1009
|
+
<span style="font-size:12px;color:var(--ink-3)">Layout</span>
|
|
1010
|
+
<span style="display:flex;overflow:hidden;border-radius:4px;box-shadow:0 0 0 1px var(--line-mid)">
|
|
1011
|
+
<span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Split</span>
|
|
1012
|
+
<span style="padding:4px 10px;font-size:14px;background:var(--theme-btn);color:#fff">Single</span>
|
|
1013
|
+
</span>
|
|
1014
|
+
</span>
|
|
1015
|
+
<span style="display:flex;align-items:center;gap:6px">
|
|
1016
|
+
<span style="font-size:12px;color:var(--ink-3)">Pane</span>
|
|
1017
|
+
<span style="display:flex;overflow:hidden;border-radius:4px;box-shadow:0 0 0 1px var(--line-mid)">
|
|
1018
|
+
<span style="padding:4px 10px;font-size:14px;background:var(--theme-btn);color:#fff">Panel</span>
|
|
1019
|
+
<span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Editor</span>
|
|
1020
|
+
<span style="padding:4px 10px;font-size:14px;background:var(--card);color:var(--ink-2)">Doc</span>
|
|
1021
|
+
</span>
|
|
1022
|
+
</span>
|
|
1023
|
+
</div>
|
|
1024
|
+
<ul class="tight">
|
|
1025
|
+
<li>The active tab is <code>bg-card</code> with a <code>border-b-2 border-theme-btn</code> underline; the others are
|
|
1026
|
+
<code>text-ink-2</code> on the warm strip. The name is <code>font-mono</code>; the kind in front of it is
|
|
1027
|
+
<code>text-xs tracking-wider</code>, <code>text-theme-ink</code> when active and <code>text-ink-3</code> otherwise.</li>
|
|
1028
|
+
<li>Unsaved changes are a 6px <code>bg-gold-deep</code> dot on the tab, never a badge in the page header. A file
|
|
1029
|
+
that does not exist yet keeps its tab, disabled with <code>data-blocked</code> (gold tint and a Feather
|
|
1030
|
+
<code>Lock</code>), with a tooltip that says where to create it (the AI toolbar below the tabs).</li>
|
|
1031
|
+
<li>The switches of the bar under the tabs are a segmented control, not buttons: active <code>bg-theme-btn</code>
|
|
1032
|
+
with white text, the others <code>bg-card</code>, the whole group ringed with <code>ring-1 ring-line-mid</code>, and
|
|
1033
|
+
a <code>text-xs text-ink-3</code> label in front (<code>Layout</code>, <code>Pane</code>). A switch group without a
|
|
1034
|
+
label is not discoverable; never ship one.</li>
|
|
1035
|
+
<li>Switching tabs keeps the other tab's draft, so <b>Save</b> and <b>Discard</b> take the active file; the tab
|
|
1036
|
+
dot is what says another file still has unsaved changes.</li>
|
|
1037
|
+
</ul>
|
|
1038
|
+
|
|
962
1039
|
<h2 id="sections">Sidebar sections and selection</h2>
|
|
963
1040
|
<div class="row" style="align-items:flex-start">
|
|
964
1041
|
<div class="side">
|
package/docs/troubleshooting.md
CHANGED
|
@@ -164,8 +164,17 @@ environment, aliases or gateway expose.
|
|
|
164
164
|
|
|
165
165
|
**Thinking does nothing** — it is an OpenCode flag. Claude Code has no such flag; its model and settings decide.
|
|
166
166
|
|
|
167
|
-
**A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows` or `
|
|
168
|
-
|
|
167
|
+
**A project rule does nothing** — `AGENTS.md` §2 needs the rule id and an `Effect` of `narrows`, `replaces` or `adds`.
|
|
168
|
+
A rule the baseline does not have needs a project id (`P1`, `P2`, ...) and `adds`. `F1`..`F6` and `R2` cannot be
|
|
169
|
+
changed. `pnpm asrun doctor` names a wrong id, a missing `Effect`, a duplicate id or a non-negotiable rule, and
|
|
170
|
+
`pnpm asrun rules` prints what the AI steps will actually read. A difference between §2 and a framework default is
|
|
171
|
+
not a conflict: it is applied, not turned into a question.
|
|
172
|
+
|
|
173
|
+
**A test-data prefix is not `[asrun]`** — set it in `package.json`: `"asrun": { "testDataPrefix": "[autotest]" }`.
|
|
174
|
+
The runtime (`records.track`), `pnpm cleanup` and the AI steps all read that one value; without it the default
|
|
175
|
+
`[asrun]` applies. Created names get the run stamp on top: `[autotest] <base> (2026-11-09 12-34-56)`. A prefix written
|
|
176
|
+
only as prose in `AGENTS.md` cannot reach the runtime: `doctor` and `pnpm asrun rules` report the mismatch and name the
|
|
177
|
+
`package.json` value to set.
|
|
169
178
|
|
|
170
179
|
**A skill override does nothing** — it must be `.claude/skills/<skill>.md` (the skill name, for example
|
|
171
180
|
`generating-specs`, not the command name), and it is not discovered as a standalone skill: the command and the skill
|
package/docs/web-ui.md
CHANGED
|
@@ -55,9 +55,31 @@ One row per profile, with the same login check as `pnpm status`.
|
|
|
55
55
|
|
|
56
56
|
## Cases
|
|
57
57
|
|
|
58
|
-
The case list is grouped by folder and collapses.
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
The case list is grouped by folder and collapses. A case opens on the **Case** tab, with the **Spec** tab beside it:
|
|
59
|
+
|
|
60
|
+
- **Case** (`favorite-article.md`) is the source a person writes: the steps, values, rules and questions.
|
|
61
|
+
- **Spec** (`favorite-article.spec.ts`) is what a generate or heal run wrote from it. It stays visible but blocked (gold,
|
|
62
|
+
with a lock) until the case has a spec; its tooltip says to choose **Generate spec** in the AI toolbar below the tabs,
|
|
63
|
+
pick an environment and press **Run AI**.
|
|
64
|
+
|
|
65
|
+
The tab is the page's state: it lives in the URL (`?view=spec`), so a reload, a shared link and the Back button land on
|
|
66
|
+
the same file, and every other link opens the case. Each tab keeps its own unsaved draft while you switch between them;
|
|
67
|
+
an amber dot on a tab means that file has unsaved changes, and **Save** (`Ctrl/Cmd+S`) and **Discard** always sit at the
|
|
68
|
+
right of the tab strip and act on the file on screen.
|
|
69
|
+
|
|
70
|
+
A control that is disabled because **you** must do something first (save a file, choose an environment, tick a profile) is
|
|
71
|
+
**blocked**: gold with a lock, and its tooltip says what to do; the Run AI button for example names the tab whose draft is
|
|
72
|
+
unsaved. A faded control instead just has nothing to do yet or waits for the app (a running job, a pending request).
|
|
73
|
+
|
|
74
|
+
Under the tabs, the first row is the AI toolbar (command, environment, profiles, attended, **Run AI**, copy the shell
|
|
75
|
+
command, AI guide). It is the same on both tabs, because every AI command acts on the case. The row below holds the
|
|
76
|
+
tools of the file on screen: on **Case** the **Layout** (Split / Single) and **Pane** (Panel / Editor / Doc) switches
|
|
77
|
+
and the previous / next of an outstanding mark; on **Spec** the line that says the file is generated from the case
|
|
78
|
+
(with a link back to it), **Open in editor**, **Copy path** and copy the spec. **Rename or move** and **Delete** live
|
|
79
|
+
in the **⋯** menu at the end of the tab strip.
|
|
80
|
+
|
|
81
|
+
The editor opens in **Single** with the **Panel** full width; **Split** puts the source on the left and one pane on the
|
|
82
|
+
right (drag the divider to resize, double-click to reset).
|
|
61
83
|
|
|
62
84
|
- **Source and preview** scroll together, the preview block at the caret is shaded, and a click in the preview puts
|
|
63
85
|
the caret on that line. `Ctrl/Cmd+S` saves.
|
|
@@ -66,9 +88,11 @@ Single, between **Panel**, **Editor** and **Doc**.
|
|
|
66
88
|
green. Hover for a tooltip; the small X after a marker removes it (or the whole question block for a `TODO`) in one
|
|
67
89
|
step, with Undo; the file is saved when you save it.
|
|
68
90
|
- **New case** takes an optional folder and runs `pnpm case:new`.
|
|
69
|
-
- **The Panel** shows the case as a form, with the open questions first
|
|
70
|
-
|
|
71
|
-
|
|
91
|
+
- **The Panel** shows the case as a form, with the open questions first: each one shows what the case says above it,
|
|
92
|
+
then the question, and offers **Keep what the case says** (the question block disappears, that text stays) or
|
|
93
|
+
**Write your answer** (the AI folds it in). Only the two texts jump to the source; the rest of the row does not.
|
|
94
|
+
Then the front matter (title, login, suites, writes and its note, environments), the `## Rules` bullets, the steps
|
|
95
|
+
(sentence, `[writes]` / `[input]` / `[email]` tags, `- Ready when:` lines,
|
|
72
96
|
`- Recipe:` lines), the `## Expected` and `## Visual checks` bullets (drag to reorder), the `## Values` table (one
|
|
73
97
|
column per profile; an
|
|
74
98
|
empty cell inherits `default`), and the `## Targets` cards read-only, with what each is missing. With two or more
|
|
@@ -84,15 +108,19 @@ Single, between **Panel**, **Editor** and **Doc**.
|
|
|
84
108
|
when it saved one, the **screenshot** from the exploration, so you look at the image instead of opening the page
|
|
85
109
|
again. Rows that change an assertion are highlighted; **Confirm** settles one line and **Confirm all** settles the
|
|
86
110
|
list in one undo step. None of this blocks generating a spec; healing stops until the case is settled.
|
|
87
|
-
- **Spec view** is editable too (`Ctrl/Cmd+S`; refused when the file changed on disk meanwhile)
|
|
88
|
-
opens it in the default application for `.spec.ts`, **Copy
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
- **Spec view** is editable too (`Ctrl/Cmd+S`; refused when the file changed on disk meanwhile), and its tab links back
|
|
112
|
+
to the case it was generated from. **Open in editor** opens it in the default application for `.spec.ts`, **Copy
|
|
113
|
+
path** copies its absolute path.
|
|
114
|
+
- **Rename or move** (in the **⋯** menu) keeps the spec and the baselines with the case and rewrites the spec;
|
|
115
|
+
**Delete** (type the id, or fill it in with the feather icon) removes the case, its spec and its baselines. Both
|
|
116
|
+
dialogs list exactly what they touch, and are refused while an AI or test run is in progress or while a draft is
|
|
117
|
+
unsaved.
|
|
118
|
+
- **AI toolbar:** command (explore / generate / heal, explore by default), **Environment** (required, no default),
|
|
93
119
|
**Profiles** (explore only: every profile that is logged in is ticked, the choice is remembered per environment, and
|
|
94
120
|
only the ticked ones are opened), **Attended** (only for explore, ticked by default), **Run AI**, copy the shell
|
|
95
121
|
command, open the AI guide.
|
|
122
|
+
- **Writes in …** is one line under the toolbar, in red: the environments whose data the case writes, then its note,
|
|
123
|
+
with the full note in its tooltip. A case that only runs in some environments shows that line instead.
|
|
96
124
|
- **From memo** opens a Markdown editor with a preview for raw notes. **Make cases** saves them to `.tmp/memos/` and
|
|
97
125
|
runs `/make-case` one-shot (defaults for gaps, `TODO` for unknown values, no page exploration, existing cases never
|
|
98
126
|
overwritten); **Copy /make-case** copies the memo for the interactive dialogue. When the run ends, **What to do
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asrunjs/asrun",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Multi-profile end-to-end test suite: plain-language cases, AI-written Playwright specs, evidence for every run.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Zoro Chen",
|
|
@@ -49,9 +49,11 @@
|
|
|
49
49
|
"status": "tsx scripts/status.ts",
|
|
50
50
|
"reset": "tsx scripts/cli.ts reset",
|
|
51
51
|
"asrun": "tsx scripts/cli.ts",
|
|
52
|
+
"rules": "tsx scripts/cli.ts rules",
|
|
52
53
|
"report": "tsx scripts/report.ts",
|
|
53
54
|
"heal:evidence": "node scripts/heal-evidence.mjs",
|
|
54
55
|
"explore": "tsx scripts/explore.ts",
|
|
56
|
+
"explore:notes": "tsx scripts/explore-notes.ts",
|
|
55
57
|
"cleanup": "tsx scripts/cleanup.ts",
|
|
56
58
|
"case:new": "tsx scripts/new-case.ts",
|
|
57
59
|
"case:check": "tsx scripts/check-cases.ts",
|
|
@@ -6,7 +6,9 @@ Load the framework skill `{{framework}}/.claude/skills/exploring-cases/SKILL.md`
|
|
|
6
6
|
|
|
7
7
|
Rules combine in this order, and a later one wins where they conflict: the framework baseline
|
|
8
8
|
`{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/exploring-cases.md` if it exists, then the workspace
|
|
9
|
-
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win.
|
|
9
|
+
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
|
|
10
|
+
applied as written and is never turned into a question (a difference from a framework default is not a conflict).
|
|
11
|
+
Project facts are in `AGENTS.md` §3.
|
|
10
12
|
|
|
11
13
|
Arguments: `<case-id> <env> [--attended] [--profiles a,b] [--hints <file>]`. The case id is the path below `cases/` without `.md` (it may include a
|
|
12
14
|
group folder, e.g. `documents/landing-page`) and is required. `<env>` is `staging` or `production`; it is required and there
|
|
@@ -7,7 +7,9 @@ $ARGUMENTS
|
|
|
7
7
|
|
|
8
8
|
Rules combine in this order, and a later one wins where they conflict: the framework baseline
|
|
9
9
|
`{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
|
|
10
|
-
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win.
|
|
10
|
+
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
|
|
11
|
+
applied as written and is never turned into a question (a difference from a framework default is not a conflict).
|
|
12
|
+
Project facts are in `AGENTS.md` §3.
|
|
11
13
|
|
|
12
14
|
Arguments: `<case-id> [<env>] [--force] [--hints <file>]`. The case file is `cases/<case-id>.md` (the id may include one group folder,
|
|
13
15
|
e.g. `documents/landing-page`). `<env>` is the environment to explore in (`staging` or `production`); there is no default. If
|
|
@@ -7,7 +7,9 @@ spec", and follow it exactly.
|
|
|
7
7
|
|
|
8
8
|
Rules combine in this order, and a later one wins where they conflict: the framework baseline
|
|
9
9
|
`{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/generating-specs.md` if it exists, then the workspace
|
|
10
|
-
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win.
|
|
10
|
+
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
|
|
11
|
+
applied as written and is never turned into a question (a difference from a framework default is not a conflict).
|
|
12
|
+
Project facts are in `AGENTS.md` §3.
|
|
11
13
|
|
|
12
14
|
Arguments: $ARGUMENTS
|
|
13
15
|
Format: `<case-id> <env> [--profiles a,b] [--report <run-id>] [--hints <file>]`, with optional free text after them.
|
|
@@ -7,7 +7,9 @@ documents: $ARGUMENTS
|
|
|
7
7
|
|
|
8
8
|
Rules combine in this order, and a later one wins where they conflict: the framework baseline
|
|
9
9
|
`{{framework}}/AGENTS.md`, the framework skill, `.claude/skills/making-cases.md` if it exists, then the workspace
|
|
10
|
-
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win.
|
|
10
|
+
`AGENTS.md` §2 (Project rules). F1–F6 and R2 always win. The effective set is what `pnpm asrun rules` prints; §2 is
|
|
11
|
+
applied as written and is never turned into a question (a difference from a framework default is not a conflict).
|
|
12
|
+
Project facts are in `AGENTS.md` §3.
|
|
11
13
|
|
|
12
14
|
The input is either text or a path to a file with the notes. Follow the skill's procedure exactly. Ask me the open
|
|
13
15
|
questions before writing any case file. Do not generate specs; that is `/gen-spec`.
|
package/templates/AGENTS.md
CHANGED
|
@@ -22,24 +22,31 @@ The framework skills are loaded by the commands in `.claude/commands/` (Claude C
|
|
|
22
22
|
|
|
23
23
|
## 2. Project rules
|
|
24
24
|
|
|
25
|
-
Only what differs from the baseline
|
|
26
|
-
default, for example the artifact language)
|
|
27
|
-
|
|
25
|
+
Only what differs from the baseline. A row names the baseline rule it changes and whether it `narrows` (stricter) or
|
|
26
|
+
`replaces` (a different default, for example the artifact language) it. A rule the baseline does not have gets a
|
|
27
|
+
project id (`P1`, `P2`, ...) and `adds`. `replaces` is refused for `F1`–`F6` and `R2`. Rows whose first cell is not a
|
|
28
|
+
rule id are ignored, so the placeholder below can stay until you need it.
|
|
28
29
|
|
|
29
30
|
| Rule | Project rule | Effect |
|
|
30
31
|
|---|---|---|
|
|
31
|
-
| <rule id, e.g. F10> | <what this project does differently from the baseline> | narrows |
|
|
32
|
+
| <rule id, e.g. F10 or P1> | <what this project does differently from the baseline> | <narrows / replaces / adds> |
|
|
32
33
|
|
|
33
34
|
Examples (delete what you do not use; the fenced block is an example, not a rule):
|
|
34
35
|
|
|
35
36
|
```markdown
|
|
36
37
|
| F10 | Case prose, report summaries and assertion messages in Simplified Chinese; code and commit messages stay English. | replaces |
|
|
37
|
-
|
|
|
38
|
-
|
|
|
38
|
+
| F11 | Test data carries the ticket id as well as the run stamp: `[autotest] ABC-123 <title> (<run stamp>)`. | narrows |
|
|
39
|
+
| P1 | Staging writes are limited to accounts named `qa-*`. | adds |
|
|
39
40
|
```
|
|
40
41
|
|
|
41
|
-
`pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown
|
|
42
|
-
not `narrows` or `
|
|
42
|
+
`pnpm asrun doctor` fails when this table names a `[non-negotiable]` rule, an unknown baseline id, a duplicate id, a
|
|
43
|
+
project id without `adds`, or an `Effect` that is not `narrows`, `replaces` or `adds`. `pnpm asrun rules` prints the
|
|
44
|
+
effective set, and every AI step reads it before it applies the rules: **§2 is applied as written and is never a
|
|
45
|
+
question.** A difference between §2 and a framework default is not a conflict.
|
|
46
|
+
|
|
47
|
+
The test-data prefix is not written here: it is `asrun.testDataPrefix` in `package.json` (default `[asrun]`), so the
|
|
48
|
+
document and the code read the same value. A case's data is named `testDataName(base)`:
|
|
49
|
+
`<prefix> <base> (<UTC time of the run>)`, so two runs never collide.
|
|
43
50
|
|
|
44
51
|
The structural tokens are fixed English whatever the project language: the section headings (`## Values`, `## Rules`,
|
|
45
52
|
`## Targets`, ...), a step's `- Recipe (phase): ...` lines, `### T<n>`, the `TODO` blocks with their `Answer:` line,
|
|
@@ -60,6 +67,8 @@ and the front-matter keys. See "Fixed tokens" in the framework baseline.
|
|
|
60
67
|
- `cases/**/*.md` human-written test cases (committed)
|
|
61
68
|
- `tests/**/*.spec.ts` generated Playwright specs and their `*-snapshots/` baselines (committed)
|
|
62
69
|
- `profiles.yaml` one entry per environment, connection settings only (committed)
|
|
70
|
+
- `package.json` npm scripts and the framework dependency; its `"asrun"` object holds project settings
|
|
71
|
+
(`testDataPrefix`, committed)
|
|
63
72
|
- `.claude/commands/` `/make-case`, `/explore-case`, `/gen-spec`, `/heal-spec` for Claude Code
|
|
64
73
|
- `.opencode/commands/` the same commands for OpenCode (it does not read `.claude/commands`)
|
|
65
74
|
- `.claude/skills/` optional overrides of a framework skill: `<skill>.md`
|
|
@@ -4,7 +4,7 @@ title: One-line summary of what this case proves
|
|
|
4
4
|
login: required # required | none (none = public page, no saved session needed)
|
|
5
5
|
suites: [smoke, regression] # a case may be in several suites; filter with `pnpm asrun --suite <name>`
|
|
6
6
|
# writes: [staging] # omit = read-only. The environments in which the case may create or change data of the test accounts (and cleans it up); elsewhere it is skipped with a notice
|
|
7
|
-
# writes-note: What the case creates or changes, e.g. one draft named "[asrun] ...", deleted at the end. (required when writes is set)
|
|
7
|
+
# writes-note: What the case creates or changes, e.g. one draft named "[asrun] ... (<run stamp>)", deleted at the end. (required when writes is set)
|
|
8
8
|
# envs: [production, staging] # optional: run only in these environments (default: all); must include every environment in `writes`
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -24,8 +24,8 @@ none.
|
|
|
24
24
|
row. It says when to look; what must be true afterwards goes under Expected.>
|
|
25
25
|
2. <What to look at or click.>
|
|
26
26
|
3. <A step that needs a person's choice or writes something.> [input] [writes]
|
|
27
|
-
- Recipe (start): <what the person did, recorded by /explore-case --attended: positions,
|
|
28
|
-
labels; never selectors or ids. One line per phase.>
|
|
27
|
+
- Recipe (start): <what the person did, recorded by /explore-case --attended: positions, created names (project
|
|
28
|
+
prefix plus the run's UTC stamp), control labels; never selectors or ids. One line per phase.>
|
|
29
29
|
|
|
30
30
|
## Expected
|
|
31
31
|
- <Behaviour that must hold for every profile.>
|
package/templates/package.json
CHANGED
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
"scripts": {
|
|
9
9
|
"go": "asrun go",
|
|
10
10
|
"asrun": "asrun",
|
|
11
|
+
"rules": "asrun rules",
|
|
11
12
|
"signin": "asrun signin",
|
|
12
13
|
"status": "asrun status",
|
|
13
14
|
"reset": "asrun reset",
|
|
14
15
|
"report": "asrun report",
|
|
15
16
|
"heal:evidence": "asrun heal:evidence",
|
|
16
17
|
"explore": "asrun explore",
|
|
18
|
+
"explore:notes": "asrun explore:notes",
|
|
17
19
|
"cleanup": "asrun cleanup",
|
|
18
20
|
"case:new": "asrun case:new",
|
|
19
21
|
"case:check": "asrun case:check",
|
|
@@ -30,5 +32,8 @@
|
|
|
30
32
|
"@playwright/test": "1.64.1",
|
|
31
33
|
"@types/node": "^22.20.5",
|
|
32
34
|
"typescript": "^7.0.2"
|
|
35
|
+
},
|
|
36
|
+
"asrun": {
|
|
37
|
+
"testDataPrefix": "[asrun]"
|
|
33
38
|
}
|
|
34
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-CGbRJT3b.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};
|
|
1
|
+
import{C as e,D as t,L as n,h as r,n as i,r as a,s as o,u as s,x as c,z as l}from"./dist-Dr9crbBz.js";import{r as u}from"./index-DaUQORCy.js";var d=110,f=1,p=2,m=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288];function h(e){return e>=65&&e<=90||e>=97&&e<=122||e>=161}function g(e){return e>=48&&e<=57}var _=new i((e,t)=>{if(e.next==40){let t=e.peek(-1);(h(t)||g(t)||t==95||t==45)&&e.acceptToken(p,1)}}),v=new i(e=>{if(m.indexOf(e.peek(-1))>-1){let{next:t}=e;(h(t)||t==95||t==35||t==46||t==91||t==58||t==45)&&e.acceptToken(d)}}),y=new i(e=>{if(m.indexOf(e.peek(-1))<0){let{next:t}=e;if(t==37&&(e.advance(),e.acceptToken(f)),h(t)){do e.advance();while(h(e.next));e.acceptToken(f)}}}),b=n({"import charset namespace keyframes media supports when":l.definitionKeyword,"from to selector":l.keyword,NamespaceName:l.namespace,KeyframeName:l.labelName,TagName:l.tagName,ClassName:l.className,PseudoClassName:l.constant(l.className),IdName:l.labelName,"FeatureName PropertyName PropertyVariable":l.propertyName,AttributeName:l.attributeName,NumberLiteral:l.number,KeywordQuery:l.keyword,UnaryQueryOp:l.operatorKeyword,"CallTag ValueName":l.atom,VariableName:l.variableName,"AtKeyword Interpolation":l.special(l.variableName),Callee:l.operatorKeyword,Unit:l.unit,"UniversalSelector NestingSelector":l.definitionOperator,MatchOp:l.compareOperator,"ChildOp SiblingOp, LogicOp":l.logicOperator,BinOp:l.arithmeticOperator,Important:l.modifier,"Comment LineComment":l.blockComment,ColorLiteral:l.color,"ParenthesizedContent StringLiteral":l.string,Escape:l.special(l.string),": ...":l.punctuation,"PseudoOp #":l.derefOperator,"; ,":l.separator,"( )":l.paren,"[ ]":l.squareBracket,"{ }":l.brace}),x={__proto__:null,lang:40,"nth-child":40,"nth-last-child":40,"nth-of-type":40,"nth-last-of-type":40,dir:40,"host-context":40,and:244,or:244,not:74,only:74,url:86,"url-prefix":86,domain:86,regexp:86,when:117,selector:142,from:172,to:174},S={__proto__:null,"@import":126,"@plugin":126,"@media":152,"@charset":156,"@namespace":160,"@keyframes":166,"@supports":178},C=a.deserialize({version:14,states:"@^O!gQWOOO!nQaO'#CeOOQP'#Cd'#CdO$RQWO'#CgO$xQaO'#EaO%cQWO'#CiO%kQWO'#DZO%pQWO'#D^O%uQaO'#DfOOQP'#Es'#EsO'YQWO'#DlO'yQWO'#DyO(QQWO'#D{O(xQWO'#D}O)TQWO'#EQO'bQWO'#EWO)YQ`O'#FTO)]Q`O'#FTO)hQ`O'#FTO)vQWO'#EYOOQO'#Er'#ErOOQO'#FV'#FVOOQO'#Ec'#EcO){QWO'#EqO*WQWO'#EqQOQWOOOOQP'#Ch'#ChOOQP,59R,59RO$RQWO,59RO*bQWO'#EdO+PQWO,58|O+_QWO,59TO%kQWO,59uO%pQWO,59xO*bQWO,59{O*bQWO,59}OOQO'#De'#DeO*bQWO,5:OO,bQpO'#E}O,iQWO'#DkOOQO,58|,58|O(QQWO,58|O,pQWO,5:{OOQO,5:{,5:{OOQT'#Cl'#ClO-UQeO,59TO.cQ[O,59TOOQP'#D]'#D]OOQP,59u,59uOOQO'#D_'#D_O.hQpO,59xOOQO'#EZ'#EZO.pQ`O,5;oOOQO,5;o,5;oO/OQWO,5:WO/VQWO,5:WOOQS'#Dn'#DnO/rQWO'#DsO/yQ!fO'#FRO0eQWO'#DtOOQS'#FS'#FSO+YQWO,5:eO'bQWO'#DrOOQS'#Cu'#CuO(QQWO'#CwO0jQ!hO'#CyO2^Q!fO,5:gO2oQWO'#DWOOQS'#Ex'#ExO(QQWO'#DQOOQO'#EP'#EPO2tQWO,5:iO2yQWO,5:iOOQO'#ES'#ESO3RQWO,5:lO3WQ!fO,5:rO3iQ`O'#EkO.pQ`O,5;oOOQO,5:|,5:|O3zQWO,5:tOOQO,5:},5:}O4XQWO,5;]OOQO-E8a-E8aOOQP1G.m1G.mOOQP'#Ce'#CeO5RQaO,5;OOOQP'#Df'#DfOOQO-E8b-E8bOOQO1G.h1G.hO(QQWO1G.hO5fQWO1G.hO5nQeO1G.oO.cQ[O1G.oOOQP1G/a1G/aO6{QpO1G/dO7fQaO1G/gO8cQaO1G/iO9`QaO1G/jO:]Q!fO'#FOO:yQ!fO'#ExOOQO'#FO'#FOOOQO,5;i,5;iO<^QWO,5;iO<iQWO,5:VO<nQ!fO1G.hOOQO1G0g1G0gO=PQWO'#CnOOQP1G.o1G.oO=WQWO'#CqOOQP1G/d1G/dO(QQWO1G/dO=_Q`O1G1ZOOQO1G1Z1G1ZO=mQWO1G/rO=rQ!fO'#FQO>WQWO1G/rO>]Q!fO'#DnO>qQWO,5:ZO>vQ!fO,5:_OOQO'#DP'#DPO'bQWO,5:]O?XQWO'#DwOOQS,5:b,5:bO?`QWO,5:dO'bQWO'#EiO?gQWO,5;mO*bQWO,5:`OOQO1G0P1G0PO?uQ!fO,5:^O@aQ!fO,59cOOQS,59e,59eO(QQWO,59iOOQS,59n,59nO@rQWO,59pOOQO1G0R1G0RO@yQ#tO,59rOARQ!fO,59lOOQO1G0T1G0TOBrQWO1G0TOBwQWO'#ETOOQO1G0W1G0WOOQO1G0^1G0^OOQO,5;V,5;VOOQO-E8i-E8iOCVQ!fO1G0bOCvQWO1G0`O%kQWO'#E_O$RQWO'#E`OEZQWO'#E^OOQO1G0b1G0bPEkQWO'#EcO<nQ!fO7+$SOOQO7+$S7+$SO(QQWO7+$SOOQP7+$Z7+$ZOOQP7+%O7+%OO(QQWO7+%OOEpQ!fO'#EeOF}QWO,5;jO(QQWO,5;jOOQO,5;j,5;jO+gQpO'#EgOG[QWO1G1TOOQO1G1T1G1TOOQO1G/q1G/qOGgQaO'#EvOGnQWO,59YOGsQWO'#EwOG}QWO,59]OHSQ!fO7+%OOOQO7+&u7+&uOOQO7+%^7+%^O(QQWO'#EhOHeQWO,5;lOHmQWO7+%^O(QQWO1G/uOOQS1G/y1G/yOOQS1G/w1G/wOHrQWO,5:cOHwQ!fO1G0OOOQS1G0O1G0OOIYQ!fO,5;TOOQO-E8g-E8gOItQaO1G/zOOQS1G.}1G.}OOQS1G/T1G/TOI{Q!fO1G/[OOQS1G/[1G/[OJ^QWO1G/^OOQO7+%o7+%oOJcQYO'#CyO+YQWO'#EjOJkQWO,5:oOOQO,5:o,5:oOJyQ!fO'#ElO(QQWO'#ElOL^QWO7+%|OOQO7+%|7+%|OOQO7+%z7+%zOOQO,5:y,5:yOOQO,5:z,5:zOLqQaO,5:xOOQO,5:x,5:xOOQO<<Gn<<GnO<nQ!fO<<GnOMRQ!fO<<HjOOQO-E8c-E8cOMdQWO1G1UOOQO,5;R,5;ROOQO-E8e-E8eOOQO7+&o7+&oOMqQWO,5;bOOQP1G.t1G.tO(QQWO'#EfOMyQWO,5;cOOQT1G.w1G.wOOQP<<Hj<<HjONRQ!fO,5;SOOQO-E8f-E8fO/OQWO<<HxONgQWO7+%aOOQS1G/}1G/}OOQS7+%j7+%jOOQS7+%f7+%fOOQS7+$v7+$vOOQS7+$x7+$xOOQO,5;U,5;UOOQO-E8h-E8hOOQO1G0Z1G0ZONnQ!fO,5;WOOQO-E8j-E8jOOQO<<Ih<<IhOOQO1G0d1G0dOOQOAN=YAN=YOOQPAN>UAN>UO!!RQWO,5;QOOQO-E8d-E8dO!!]QWOAN>dOOQS<<H{<<H{OOQOG24OG24O",stateData:"!!n~O#dOSROSSOS~OVXOYXO^TO_TOfaOgbOoaOpWOyVO!OUO!aYO!nZO!p[O!r]O!u^O!{_O#hPO#iRO~O#a#eP~P]O^XX^!}X_XXcXXjXXp!}XyXX!OXX!UXX!ZXX![XX!^XX#PXX#aXX#bXX#iXX#oXX#pXX#p!}X#x!}X!]XX~O#hjO~O^oO_oOcmOyqO!OpO!UrO#bsO#ilO#otO#ptO~OjvO![yO!^wO#P{O!Z#TX#a#TX!]#TX~P$WOd!OO#h|O~O#h!PO~O#h!RO~O#h!TO#p!VO#x!VO^!YX^#wX_!YXc!YXj!YXy!YX!O!YX!U!YX!Z!YX![!YX!^!YX#P!YX#a!YX#b!YX#i!YX#o!YX#p!YX!]!YX~Oj!XOn!WO~Og!^Oj!ZOo!^Op!^Ou!`O!i!]O#h!YO~O!^#uP~P'bOf!fOg!fOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO~On!iO{!eO#h!hO~O#h!kO~Op!nO#p!VO#x!VO^#wX~OjvO#p!VO#x!VO^#wX~O^!qO~O!Z!rO#a#eX!]#eX~O#a#eX!]#eX~P]OVXOYXO^TO_TOp!xOyVO!OUO#h!vO#iRO~OcmOjvO![!{O!^wO~Od#OO#h|O~Of!fOg#VOh!fOj!bOl!fOn!fOo!fOp!fOu!gO{!eO#h!aO#m!cO#s#WO~Oa#XO~P+gO!]#eP~P]O![!{O!^wO#P#]O!Z#Ta#a#Ta!]#Ta~OQ#^O^]a_]ac]aj]ay]a!O]a!U]a!Z]a![]a!^]a#P]a#a]a#b]a#i]a#o]a#p]a!]]aa]a~OQ#`O~Ow#aO!S#bO~Op!nO#p#dO#x#dO^#wa~O!Z#uP~P'bOa#tP~P(QOg!^Oj!ZOo!^Op!^Ou!`O!i!]O~O#h#hO~P/^OQ#mOc#pOr#lOy#oO#n#kO!^#uX!Z#uXa#uX~Oj#rO~OP#vOQmXrmXymX!ZmX#nmX^mXamXcmXfmXgmXhmXjmXlmXnmXomXpmXumX{mX#hmX#mmX!^mX#PmX#amXwmX!]mX~OQ#`Or#wOy#yO!Z#zO#n#kO~Oj#{O~O!Z#}O~On$OO{!eO~O!^$PO~OQ#mOr#lOy#oO!^wO#n#kO~O#h!TO^#_Xp#_X#p#_X#x#_X~O!O$WO!^wO#i$XO~P(QO!Z!rO#a#ea!]#ea~O^oO_oOyqO!OpO!UrO#bsO#ilO#otO#ptO~Oc#Waj#Wa![#Wa!^#Waa#Wa~P4dO![$_O!^wO~OQ#^O^]i_]ic]ij]iy]i!O]i!U]i!Z]i![]i!^]i#P]i#a]i#b]i#i]i#o]i#p]i!]]ia]i~Ow$aO!S$bO~O^oO_oOyqO!OpO#ilO~Oc!Tij!Ti!U!Ti!Z!Ti![!Ti!^!Ti#P!Ti#a!Ti#b!Ti#o!Ti#p!Ti!]!Tia!Ti~P7TOc!Vij!Vi!U!Vi!Z!Vi![!Vi!^!Vi#P!Vi#a!Vi#b!Vi#o!Vi#p!Vi!]!Via!Vi~P7TOc!Wij!Wi!U!Wi!Z!Wi![!Wi!^!Wi#P!Wi#a!Wi#b!Wi#o!Wi#p!Wi!]!Wia!Wi~P7TOQ#`O^$eOr#wOy#yO#n#kOa#rXc#rX!Z#rX~P(QO#s$fOQ#lX^#lXa#lXc#lXf#lXg#lXh#lXj#lXl#lXn#lXo#lXp#lXr#lXu#lXy#lX{#lX!Z#lX#h#lX#m#lX#n#lX~Oa$iOc$gO!Z$gO~O!]$jO~OQ#`Or#wOy#yO!^wO#n#kO~Oa#jP~P*bOa#kP~P(QOp!nO#p$pO#x$pO^#wi~O!Z$qO~OQ#`Oc$rOr#wOy#yO#n#kOa#tX~Oa$tO~OQ!bX^!dXa!bXr!bXy!bX#n!bX~O^$uO~OQ#mOa$vOr#lOy#oO#n#kO~Oa#uP~P'bOw$zO~P(QOc#pO!^#ua!Z#uaa#ua~OQ#mOr#lOy#oO#n#kOc!fa!^!fa!Z!faa!fa~OQ#`Oa%OOr#wOy#yO#n#kO~Ow%RO~P(QOn%SO|%SO~OQ#`Or#wOy#yO#n#kO!Zta^taatactaftagtahtajtaltantaotaptauta{ta#hta#mta!^ta#Pta#atawta!]ta~O!Z%TO~O!]%XO!x%VO!y%VO#m%UO~OQ#`Oc%ZOr#wOy#yO#P%]O#n#kO!Z#Oi#a#Oi!]#Oi~P(QO!Z%^OV!|iY!|i^!|i_!|if!|ig!|io!|ip!|iy!|i!O!|i!a!|i!n!|i!p!|i!r!|i!u!|i!{!|i#a!|i#h!|i#i!|i!]!|i~OjvO!Z#QX#a#QX!]#QX~P*bO!Z!rO~OQ#`Or#wOy#yO#n#kOa#XXc#XXf#XXg#XXh#XXj#XXl#XXn#XXo#XXp#XXu#XX{#XX!Z#XX#h#XX#m#XX~Oa#rac#ra!Z#ra~P(QOa%jOc$gO!Z$gO~Oa#jX~P$WOa%lO~Oc%mOa#kX~P(QOa%oO~OQ#`Or#wOw%pOy#yO#n#kO~Oc$rOa#ta~On%sO~Oa%uO~OQ#`Or#wOw%vOy#yO#n#kO~OQ#mOr#lOy#oO#n#kOc#]a!^#]a!Z#]aa#]a~Oa%wO~P4dOQ#`Or#wOw%xOy#yO#n#kO~Oa%yO~OP#vO!^mX~O!]%|O!x%VO!y%VO#m%UO~OQ#`Or#wOy#yO#n#kOc#`Xf#`Xg#`Xh#`Xj#`Xl#`Xn#`Xo#`Xp#`Xu#`X{#`X!Z#`X#P#`X#a#`X#h#`X#m#`X!]#`X~Oc%ZO#P&PO!Z#Oq#a#Oq!]#Oq~P(QOjvO!Z#Qa#a#Qa!]#Qa~P4dOQ#`Or#wOw&SOy#yO#n#kO~Oa#ric#ri!Z#ri~P(QOcmOa#ja~Oc%mOa#ka~OQ#`Or#wOy#yO#n#kOa#[ac#[a~Oa&WO~P(QOQ#`Or#wOy#yO#n#kOc#`af#`ag#`ah#`aj#`al#`an#`ao#`ap#`au#`a{#`a!Z#`a#P#`a#a#`a#h#`a#m#`a!]#`a~Oa#Yac#Ya~P(QO!Z&XO~Of#dpg#m|#iRSRr~",goto:"0^#zPPPPPP#{P$Q$^P$Q$j$QPP$sP$yPP%PPPP%jP%jP&ZPPP%jP'O%jP%jP%jP'jPP$QP(a$Q(jP$QP$Q$Q(p$QPPPP(w#{P)f)f)q)f)f)f)fP)f)t)f#{P#{P#{P){#{P*O*RPP#{P#{*U*aP*f*i*i*a*a*l*s*}+e+k+q+w+},T,_PPPP,e,k,pPP-[-_-bPPPP.u/UP/[/_/k0QP0VVdOhweXOhmrsuw#^#r$YeQOhmrsuw#^#r$YQkRQ!ulR%`$XQ}TR!}oQ#_}R$`!}Q#_!Or#x!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}R$`#O!]!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&T![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TT%V$P%WY#l![!m#j#t${s#w!d#U#[#f#u#|$U$]$c$o$y%Q%Y%d%e%q%}![!f[vy!X!b!g!q!{#U#`#b#o#w#y$U$_$b$d$e$g$m$r$u%Z%[%g%m%t&TQ!i]R$O!jQ!QUQ#PpR%_$WQ!SVR#QqZuS!w$k$}%aQxSS!znzQ#s!_Q$R!mQ$V!qS$^!|#[Q%c$]Q%z%VR&R%dc!^Z_!W!Z!`#l#m#p%sR#i!ZZ#n![!m#j#t${R!j]R!l^R$Q!lU`OhwQ!UWR$S!nVeOhwR$Z!qR$Y!qShOwR!thQnSS!yn%kR%k$kQ$d#UQ$m#`Y%f$d$m%g%t&TQ%g$eQ%t$uR&T%mQ%n$mR&U%nQ$h#YR%i$hQ$s#fR%r$sQ#q![R$|#qQ%W$PR%{%WQ!o`Q#c!UT$T!o#cQ%[$UR&O%[QiOR#ZwVfOhwUSOhwQ!wmQ#RrQ#SsQ#TuQ$k#^Q$}#rR%a$YR$l#^R$n#`Q!d[S#Uv$gQ#[yQ#f!XQ#u!bQ#|!gQ$U!qQ$]!{d$c#U#`$d$e$m$u%g%m%t&TQ$o#bQ$y#oQ%P#wQ%Q#yS%Y$U%[Q%d$_Q%e$bQ%q$rR%}%ZQzSQ!pbQ!|nQ%b$YR&Q%aQ#YvR%h$gR#g!XQ!_ZQ#e!WQ$x#mR&V%sW![Z!W#m%sQ!m_Q#j!ZQ#t!`Q$w#lR${#pVcOhwSgOwR!sh",nodeNames:`⚠ Unit ( Comment LineComment StyleSheet RuleSet UniversalSelector TagSelector TagName NestingSelector ClassSelector ClassName PseudoClassSelector : :: PseudoClassName ) ArgList , PseudoClassName ArgList VariableName AtKeyword PropertyVariable ValueName ( ParenthesizedValue ColorLiteral NumberLiteral StringLiteral Escape Interpolation BinaryExpression BinOp LogicOp UnaryExpression UnaryQueryOp CallExpression ] SubscriptExpression [ CallLiteral CallTag ParenthesizedContent IdSelector # IdName AttributeSelector AttributeName MatchOp ChildSelector ChildOp DescendantSelector SiblingSelector SiblingOp InterpolatedSelector ; when } { Block ImportStatement import KeywordQuery FeatureQuery FeatureName BinaryQuery UnaryQuery ParenthesizedQuery SelectorQuery selector CallQuery ArgList SubscriptQuery MediaStatement media CharsetStatement charset NamespaceStatement namespace NamespaceName KeyframesStatement keyframes KeyframeName KeyframeList from to SupportsStatement supports DetachedRuleSet PropertyName Declaration Important Inclusion IdSelector ClassSelector Inclusion CallExpression`,maxTerm:133,nodeProps:[[`isolate`,-3,3,4,30,``],[`openedBy`,17,`(`,59,`{`],[`closedBy`,26,`)`,60,`}`]],propSources:[b],skippedNodes:[0,3,4],repeatNodeCount:10,tokenData:"!2q~R!ZOX$tX^%l^p$tpq%lqr)Ors-xst/ltu6Zuv$tvw8^wx:Uxy;syz<Uz{<Z{|<t|}BQ}!OBc!O!PDo!P!QFY!Q![Jw![!]Kr!]!^Ln!^!_MP!_!`M{!`!aNl!a!b$t!b!c! m!c!}!&R!}#O!'y#O#P$t#P#Q!([#Q#R!(m#R#T$t#T#o!&R#o#p!)S#p#q!(m#q#r!)e#r#s!)v#s#y$t#y#z%l#z$f$t$f$g%l$g#BY$t#BY#BZ%l#BZ$IS$t$IS$I_%l$I_$I|$t$I|$JO%l$JO$JT$t$JT$JU%l$JU$KV$t$KV$KW%l$KW&FU$t&FU&FV%l&FV;'S$t;'S;=`!2k<%lO$t`$wSOy%Tz;'S%T;'S;=`%f<%lO%T`%YS|`Oy%Tz;'S%T;'S;=`%f<%lO%T`%iP;=`<%l%T~%qh#d~OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%T~'dh#d~|`OX%TX^']^p%Tpq']qy%Tz#y%T#y#z']#z$f%T$f$g']$g#BY%T#BY#BZ']#BZ$IS%T$IS$I_']$I_$I|%T$I|$JO']$JO$JT%T$JT$JU']$JU$KV%T$KV$KW']$KW&FU%T&FU&FV']&FV;'S%T;'S;=`%f<%lO%Tk)RUOy%Tz#]%T#]#^)e#^;'S%T;'S;=`%f<%lO%Tk)jU|`Oy%Tz#a%T#a#b)|#b;'S%T;'S;=`%f<%lO%Tk*RU|`Oy%Tz#d%T#d#e*e#e;'S%T;'S;=`%f<%lO%Tk*jU|`Oy%Tz#c%T#c#d*|#d;'S%T;'S;=`%f<%lO%Tk+RU|`Oy%Tz#f%T#f#g+e#g;'S%T;'S;=`%f<%lO%Tk+jU|`Oy%Tz#h%T#h#i+|#i;'S%T;'S;=`%f<%lO%Tk,RU|`Oy%Tz#T%T#T#U,e#U;'S%T;'S;=`%f<%lO%Tk,jU|`Oy%Tz#b%T#b#c,|#c;'S%T;'S;=`%f<%lO%Tk-RU|`Oy%Tz#h%T#h#i-e#i;'S%T;'S;=`%f<%lO%Tk-lS#PZ|`Oy%Tz;'S%T;'S;=`%f<%lO%T~-{WOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f<%lO-x~.jOn~~.mRO;'S-x;'S;=`.v;=`O-x~.yXOY-xZr-xrs.es#O-x#O#P.j#P;'S-x;'S;=`/f;=`<%l-x<%lO-x~/iP;=`<%l-xo/qY!OROy%Tz!Q%T!Q![0a![!c%T!c!i0a!i#T%T#T#Z0a#Z;'S%T;'S;=`%f<%lO%Tm0fY|`Oy%Tz!Q%T!Q![1U![!c%T!c!i1U!i#T%T#T#Z1U#Z;'S%T;'S;=`%f<%lO%Tm1ZY|`Oy%Tz!Q%T!Q![1y![!c%T!c!i1y!i#T%T#T#Z1y#Z;'S%T;'S;=`%f<%lO%Tm2QYl]|`Oy%Tz!Q%T!Q![2p![!c%T!c!i2p!i#T%T#T#Z2p#Z;'S%T;'S;=`%f<%lO%Tm2wYl]|`Oy%Tz!Q%T!Q![3g![!c%T!c!i3g!i#T%T#T#Z3g#Z;'S%T;'S;=`%f<%lO%Tm3lY|`Oy%Tz!Q%T!Q![4[![!c%T!c!i4[!i#T%T#T#Z4[#Z;'S%T;'S;=`%f<%lO%Tm4cYl]|`Oy%Tz!Q%T!Q![5R![!c%T!c!i5R!i#T%T#T#Z5R#Z;'S%T;'S;=`%f<%lO%Tm5WY|`Oy%Tz!Q%T!Q![5v![!c%T!c!i5v!i#T%T#T#Z5v#Z;'S%T;'S;=`%f<%lO%Tm5}Sl]|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm6^YOy%Tz!_%T!_!`6|!`!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Td7TS!SS|`Oy%Tz;'S%T;'S;=`%f<%lO%Tm7h[h]|`Oy%Tz}%T}!O7a!O!Q%T!Q![7a![!c%T!c!}7a!}#T%T#T#o7a#o;'S%T;'S;=`%f<%lO%Ta8c[YPOy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%Ta9`[YP|`Oy%Tz}%T}!O9X!O!Q%T!Q![9X![!c%T!c!}9X!}#T%T#T#o9X#o;'S%T;'S;=`%f<%lO%T~:XWOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m<%lO:U~:tRO;'S:U;'S;=`:};=`O:U~;QXOY:UZw:Uwx.ex#O:U#O#P:q#P;'S:U;'S;=`;m;=`<%l:U<%lO:U~;pP;=`<%l:Uo;xSj_Oy%Tz;'S%T;'S;=`%f<%lO%T~<ZOa~m<bUVPrWOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%To<{Y#pQrWOy%Tz!O%T!O!P=k!P!Q%T!Q![@p![#R%T#R#SAm#S;'S%T;'S;=`%f<%lO%Tm=pU|`Oy%Tz!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%Tm>ZY#m]|`Oy%Tz!Q%T!Q![>S![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%Tm?OY|`Oy%Tz{%T{|?n|}%T}!O?n!O!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm?sU|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@^U#m]|`Oy%Tz!Q%T!Q![@V![;'S%T;'S;=`%f<%lO%Tm@w[#m]|`Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TbAtS#xQ|`Oy%Tz;'S%T;'S;=`%f<%lO%TkBVScZOy%Tz;'S%T;'S;=`%f<%lO%TmBhXrWOy%Tz}%T}!OCT!O!P=k!P!Q%T!Q![@p![;'S%T;'S;=`%f<%lO%TmCYW|`Oy%Tz!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%TmCy[f]|`Oy%Tz}%T}!OCr!O!Q%T!Q![Cr![!c%T!c!}Cr!}#T%T#T#oCr#o;'S%T;'S;=`%f<%lO%ToDtW#iROy%Tz!O%T!O!PE^!P!Q%T!Q![>S![;'S%T;'S;=`%f<%lO%TlEcU|`Oy%Tz!O%T!O!PEu!P;'S%T;'S;=`%f<%lO%TlE|S#s[|`Oy%Tz;'S%T;'S;=`%f<%lO%T~F_VrWOy%Tz{Ft{!P%T!P!QIl!Q;'S%T;'S;=`%f<%lO%T~FyU|`OyFtyzG]z{Hd{;'SFt;'S;=`If<%lOFt~G`TOzG]z{Go{;'SG];'S;=`H^<%lOG]~GrVOzG]z{Go{!PG]!P!QHX!Q;'SG];'S;=`H^<%lOG]~H^OR~~HaP;=`<%lG]~HiW|`OyFtyzG]z{Hd{!PFt!P!QIR!Q;'SFt;'S;=`If<%lOFt~IYS|`R~Oy%Tz;'S%T;'S;=`%f<%lO%T~IiP;=`<%lFt~IsV|`S~OYIlYZ%TZyIlyzJYz;'SIl;'S;=`Jq<%lOIl~J_SS~OYJYZ;'SJY;'S;=`Jk<%lOJY~JnP;=`<%lJY~JtP;=`<%lIlmJ|[#m]Oy%Tz!O%T!O!P>S!P!Q%T!Q![@p![!g%T!g!h>y!h#X%T#X#Y>y#Y;'S%T;'S;=`%f<%lO%TkKwU^ZOy%Tz![%T![!]LZ!];'S%T;'S;=`%f<%lO%TcLbS_R|`Oy%Tz;'S%T;'S;=`%f<%lO%TkLsS!ZZOy%Tz;'S%T;'S;=`%f<%lO%ThMUUrWOy%Tz!_%T!_!`Mh!`;'S%T;'S;=`%f<%lO%ThMoS|`rWOy%Tz;'S%T;'S;=`%f<%lO%TlNSW!SSrWOy%Tz!^%T!^!_Mh!_!`%T!`!aMh!a;'S%T;'S;=`%f<%lO%TjNsV!UQrWOy%Tz!_%T!_!`Mh!`!a! Y!a;'S%T;'S;=`%f<%lO%Tb! aS!UQ|`Oy%Tz;'S%T;'S;=`%f<%lO%To! rYg]Oy%Tz!b%T!b!c!!b!c!}!#R!}#T%T#T#o!#R#o#p!$O#p;'S%T;'S;=`%f<%lO%Tm!!iWg]|`Oy%Tz!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%Tm!#Y[g]|`Oy%Tz}%T}!O!#R!O!Q%T!Q![!#R![!c%T!c!}!#R!}#T%T#T#o!#R#o;'S%T;'S;=`%f<%lO%To!$TW|`Oy%Tz!c%T!c!}!$m!}#T%T#T#o!$m#o;'S%T;'S;=`%f<%lO%To!$r^|`Oy%Tz}%T}!O!$m!O!Q%T!Q![!$m![!c%T!c!}!$m!}#T%T#T#o!$m#o#q%T#q#r!%n#r;'S%T;'S;=`%f<%lO%To!%uSp_|`Oy%Tz;'S%T;'S;=`%f<%lO%To!&W[#h_Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%To!'T[#h_|`Oy%Tz}%T}!O!&|!O!Q%T!Q![!&|![!c%T!c!}!&|!}#T%T#T#o!&|#o;'S%T;'S;=`%f<%lO%Tk!(OSyZOy%Tz;'S%T;'S;=`%f<%lO%Tm!(aSw]Oy%Tz;'S%T;'S;=`%f<%lO%Td!(pUOy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tk!)XS!^ZOy%Tz;'S%T;'S;=`%f<%lO%Tk!)jS!]ZOy%Tz;'S%T;'S;=`%f<%lO%To!){Y#oQOr%Trs!*ksw%Twx!.wxy%Tz!_%T!_!`6|!`;'S%T;'S;=`%f<%lO%Tm!*pZ|`OY!*kYZ%TZr!*krs!+csy!*kyz!+vz#O!*k#O#P!-j#P;'S!*k;'S;=`!.q<%lO!*km!+jSo]|`Oy%Tz;'S%T;'S;=`%f<%lO%T]!+yWOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d<%lO!+v]!,hOo]]!,kRO;'S!+v;'S;=`!,t;=`O!+v]!,wXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!+v<%lO!+v]!-gP;=`<%l!+vm!-oU|`Oy!*kyz!+vz;'S!*k;'S;=`!.R;=`<%l!+v<%lO!*km!.UXOY!+vZr!+vrs!,cs#O!+v#O#P!,h#P;'S!+v;'S;=`!-d;=`<%l!*k<%lO!+vm!.tP;=`<%l!*km!.|Z|`OY!.wYZ%TZw!.wwx!+cxy!.wyz!/oz#O!.w#O#P!1^#P;'S!.w;'S;=`!2e<%lO!.w]!/rWOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W<%lO!/o]!0_RO;'S!/o;'S;=`!0h;=`O!/o]!0kXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!/o<%lO!/o]!1ZP;=`<%l!/om!1cU|`Oy!.wyz!/oz;'S!.w;'S;=`!1u;=`<%l!/o<%lO!.wm!1xXOY!/oZw!/owx!,cx#O!/o#O#P!0[#P;'S!/o;'S;=`!1W;=`<%l!.w<%lO!/om!2hP;=`<%l!.w`!2nP;=`<%l$t",tokenizers:[v,y,_,0,1,2,3,4],topRules:{StyleSheet:[0,5]},specialized:[{term:116,get:e=>x[e]||-1},{term:23,get:e=>S[e]||-1}],tokenPrec:2180}),w=o.define({name:`less`,parser:C.configure({props:[t.add({Declaration:r()}),e.add({Block:c})]}),languageData:{commentTokens:{block:{open:`/*`,close:`*/`},line:`//`},indentOnInput:/^\s*\}$/,wordChars:`@-`}}),T=u(e=>e.name==`VariableName`||e.name==`AtKeyword`);function E(){return new s(w,w.data.of({autocomplete:T}))}export{E as less};
|