@asrunjs/asrun 0.11.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 +14 -6
- package/.claude/skills/exploring-cases/references/case-rules.md +5 -0
- package/.claude/skills/exploring-cases/references/open-questions.md +8 -0
- package/.claude/skills/exploring-cases/references/user-handoff.md +12 -8
- package/.claude/skills/generating-specs/SKILL.md +17 -10
- 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 +20 -5
- package/README.md +10 -6
- 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/fixtures.d.ts +1 -1
- package/dist/lib/fixtures.js +7 -4
- 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 +9 -1
- package/dist/scripts/doctor.js +27 -48
- 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 +8 -5
- package/docs/ai-workflow.md +21 -12
- package/docs/cases.md +10 -6
- package/docs/commands.md +22 -4
- package/docs/install.md +2 -1
- package/docs/theme-guide.html +24 -3
- package/docs/troubleshooting.md +11 -2
- package/docs/web-ui.md +12 -5
- package/package.json +2 -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 +4 -0
- package/ui/dist/assets/{dist--BXJInTq.js → dist-BX88bMYN.js} +1 -1
- package/ui/dist/assets/{dist-BMmNFIUH.js → dist-Bfv586Or.js} +1 -1
- package/ui/dist/assets/{dist-C9ra6_BD.js → dist-BjlbPf3t.js} +1 -1
- package/ui/dist/assets/{dist-ByLbEOlF.js → dist-CJnqQMvX.js} +1 -1
- package/ui/dist/assets/{dist-DTYj2vUD.js → dist-CaAcCNRS.js} +1 -1
- package/ui/dist/assets/{dist-BXNaYHeh.js → dist-Clj0wGFy.js} +1 -1
- package/ui/dist/assets/{dist-CTrwRc3Q.js → dist-D8TUm3Ai.js} +1 -1
- package/ui/dist/assets/{dist-CK8mow8u.js → dist-DUDqh_3e.js} +1 -1
- package/ui/dist/assets/{dist-CQS0So-i.js → dist-DkAx5a-Y.js} +1 -1
- package/ui/dist/assets/{dist-mV0_nQZe.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-BzMqkmQ9.js +0 -348
- package/ui/dist/assets/index-DcJR-8Mt.css +0 -2
package/docs/ai-workflow.md
CHANGED
|
@@ -93,10 +93,11 @@ opened and nothing is written about them, so a case can be explored in passes: A
|
|
|
93
93
|
case keeps what the earlier runs recorded. In the web UI the profile picker of the toolbar does the same: every profile
|
|
94
94
|
that is logged in in that environment is ticked, and the list you tick is remembered for the next run there.
|
|
95
95
|
|
|
96
|
-
**To
|
|
97
|
-
again. In the web UI
|
|
98
|
-
**Use the suggested defaults** and **Generate spec**. A continued
|
|
99
|
-
can be continued once per turn, only while the UI server has not
|
|
96
|
+
**To keep what the case says, delete the whole block.** **To answer, write after `Answer:`.** Then run the command
|
|
97
|
+
again. In the web UI the panel calls the first action **Keep what the case says**. The run's **What to do next** bar
|
|
98
|
+
offers **Answer**: the question list, an answer box, **Use the suggested defaults** and **Generate spec**. A continued
|
|
99
|
+
job keeps the same conversation and permissions, and can be continued once per turn, only while the UI server has not
|
|
100
|
+
restarted.
|
|
100
101
|
|
|
101
102
|
### Attended exploration (`--attended`)
|
|
102
103
|
|
|
@@ -109,9 +110,10 @@ the browser window opens and the agent waits while you do those steps.
|
|
|
109
110
|
- Recording starts and stops by itself. If Playwright's own recording toolbar shows at the top of the page, leave it
|
|
110
111
|
alone: it can stop the recording.
|
|
111
112
|
- The card records what you did, and the agent writes it into the case under the step as **general recipe lines**
|
|
112
|
-
(`- Recipe (phase): ...`): positions instead of names of changeable data,
|
|
113
|
-
labels but no selectors.
|
|
114
|
-
- Delete the
|
|
113
|
+
(`- Recipe (phase): ...`): positions instead of names of changeable data, created names (project prefix plus the
|
|
114
|
+
run's UTC stamp), control labels but no selectors.
|
|
115
|
+
- Delete the test items you created (they start with the project's test-data prefix and carry this run's timestamp)
|
|
116
|
+
before you press Done on the last step.
|
|
115
117
|
- Without `--attended` the agent never waits: a step that needs a person becomes a `TODO [blocking]`.
|
|
116
118
|
|
|
117
119
|
In the web UI the **Attended** box is ticked by default for Explore.
|
|
@@ -221,6 +223,10 @@ Several binding rules hold in exploring, generating and healing. They live in th
|
|
|
221
223
|
- **Case rules.** A `## Rules` bullet says how to run the case, never what it proves. The agent applies it while
|
|
222
224
|
exploring and generating, marks code that exists only because of a rule with `// rule: <short quote>`, and lists every
|
|
223
225
|
rule in its report. It never becomes an assertion and never authorizes a write or a person's step.
|
|
226
|
+
- **Test data is findable per run.** Everything a write case creates is named with the project's test-data prefix
|
|
227
|
+
(`package.json` `"asrun"`, default `[asrun]`) and the run's UTC stamp: `testDataName()` builds
|
|
228
|
+
`[autotest] Draft CMA (2026-11-09 12-34-56)`. Two runs never share a name, the stamp matches `reports/<run-id>`, and
|
|
229
|
+
a person can search the product for one run's data. The case's `## Values` holds the base without the stamp.
|
|
224
230
|
- **Targets.** A check on a logo, image, icon, file, PDF, screenshot or repeated text points to a `[T1]` card under
|
|
225
231
|
`## Targets`: what it is (and what it is not), where it is, how it is identified (never `.first()` or a bare `img`),
|
|
226
232
|
when it is ready, and a highlighted reference screenshot under `.explore/targets/`. When in doubt the agent does not
|
|
@@ -240,9 +246,10 @@ Checks you can run yourself:
|
|
|
240
246
|
|
|
241
247
|
| Command | What it checks |
|
|
242
248
|
|---|---|
|
|
243
|
-
| `pnpm spec:lint [case-id]` | fails on screenshots without a target, `.first()` on images, sleeps, `networkidle`, raw download events, a `%PDF` check on its own |
|
|
249
|
+
| `pnpm spec:lint [case-id]` | fails on screenshots without a target, `.first()` on images, sleeps, `networkidle`, raw download events, a `%PDF` check on its own; warns when a tracked test-data name is not built with `testDataName()` |
|
|
244
250
|
| `pnpm baselines:review [case-id] [--new]` | lists every baseline with the card that says what it must show, so you can look at each new image |
|
|
245
251
|
| `pnpm case:check [case-id]` | fails on an incomplete card, bad values, a marker inside a question or a question under a marked line; warns on an image check with no card and on a marker that does not say what to decide |
|
|
252
|
+
| `pnpm asrun rules [--json] [--case <id>]` | prints the effective rules (baseline, §2, project settings) the AI steps read; fails on an invalid §2 row or `testDataPrefix` |
|
|
246
253
|
| `pnpm markers:confirm --case <id> --env <env> [--report <run-id>]` | after a passing run, removes the `🔍 to be confirmed` markers whose line the spec checks with `// unconfirmed:`; `--dry-run` lists them |
|
|
247
254
|
| `pnpm pdf:render <file.pdf> --out <dir> [--pages all] [--corner top-left]` | renders the pages to images and prints the text, to look at a PDF by hand |
|
|
248
255
|
|
|
@@ -281,10 +288,12 @@ An override is plain Markdown; write only what differs:
|
|
|
281
288
|
- The staging account has no published documents: assert the empty state there instead.
|
|
282
289
|
```
|
|
283
290
|
|
|
284
|
-
The project's `AGENTS.md` §2 is the other place: a table of rule ids (`F7`–`
|
|
285
|
-
`R2` are fixed) with `narrows` (stricter) or `replaces` (a different default).
|
|
286
|
-
|
|
287
|
-
|
|
291
|
+
The project's `AGENTS.md` §2 is the other place: a table of rule ids (`F7`–`F11`, `R1`, `R3`, `R4`; `F1`–`F6` and
|
|
292
|
+
`R2` are fixed) with `narrows` (stricter) or `replaces` (a different default). A rule the baseline does not have gets
|
|
293
|
+
a project id (`P1`, `P2`, ...) and `adds`. For example, a project that writes cases in Simplified Chinese `replaces`
|
|
294
|
+
`F10`. `pnpm asrun doctor` fails on an unknown id, a missing `Effect`, a duplicate id, a non-negotiable rule or a
|
|
295
|
+
project id without `adds`, and `pnpm asrun rules` prints the effective set (the AI steps read it before they apply
|
|
296
|
+
anything). A project rule is applied as written: a difference from the baseline is never a question.
|
|
288
297
|
|
|
289
298
|
An update never overwrites `AGENTS.md`, `CLAUDE.md` or `.claude/skills/**`: `pnpm asrun init --force` refuses them
|
|
290
299
|
without `--reset-rules`. Never edit the framework package itself.
|
package/docs/cases.md
CHANGED
|
@@ -110,13 +110,14 @@ report and the trace read like the case.
|
|
|
110
110
|
choice (an existing document, items), `[email]` for a step that sends email. They are written at the end of the
|
|
111
111
|
step line.
|
|
112
112
|
- **`- Recipe (phase):`** under a tagged step records what a person did in the browser during an attended
|
|
113
|
-
exploration: positions instead of names of changeable data (`select items #1 to #3`),
|
|
114
|
-
|
|
115
|
-
generated: `/gen-spec` stops with `needs-input`.
|
|
113
|
+
exploration: positions instead of names of changeable data (`select items #1 to #3`), created names (project prefix
|
|
114
|
+
plus run stamp), control labels but no selectors. Several lines per step are normal. A tagged step with no recipe is
|
|
115
|
+
not generated: `/gen-spec` stops with `needs-input`.
|
|
116
116
|
- **Open questions** go in a `🚫 TODO [blocking]` or `❓ TODO [non-blocking]` block under the sentence they are about,
|
|
117
117
|
with the agent's suggestion written above and a last line `- ✍️ Answer:`. Accepting a question means deleting the
|
|
118
|
-
whole block; answering means writing after `Answer:`.
|
|
119
|
-
under
|
|
118
|
+
whole block; answering means writing after `Answer:`. In the web panel the two actions are **Keep what the case
|
|
119
|
+
says** and **Write your answer**. Hang the block under the sentence that makes the claim, not under a broader one
|
|
120
|
+
above it, and one claim gets one block.
|
|
120
121
|
- **What the AI saw** is marked by what happens if it is wrong: `(seen on <profile>)` is a plain note the run checks by
|
|
121
122
|
itself, and `(observed on <profile>, 🔍 to be confirmed: <what a person must decide>)` is a line that would pass even
|
|
122
123
|
if it were wrong, so a person settles it. A marker may name a screenshot (`evidence: .explore/.../x.png`) so nobody
|
|
@@ -173,7 +174,10 @@ anything.
|
|
|
173
174
|
|
|
174
175
|
A case may write only in the environments listed under `writes`, and only data of the test account:
|
|
175
176
|
|
|
176
|
-
- everything it creates is named
|
|
177
|
+
- everything it creates is named with the project's prefix and the run stamp, `<prefix> <base> (<run stamp>)`
|
|
178
|
+
(prefix: `asrun.testDataPrefix` in `package.json`, default `[asrun]`; stamp: the run's UTC time). The spec builds
|
|
179
|
+
the name with `testDataName()` (`records` refuses a name without the prefix), so two runs never collide and a
|
|
180
|
+
person can search the product for one run's data. `## Values` holds the base without the stamp;
|
|
177
181
|
- created data is registered with `records.track` and removed after the test, also after a failure;
|
|
178
182
|
- the case's own last step is normally the deletion; `track` is the safety net;
|
|
179
183
|
- staging needs no confirmation. In any other environment a person confirms every run (typing the environment name,
|
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` |
|
|
@@ -160,6 +161,21 @@ covers) and `--json` prints the parsed notes for a run that reads them. A note i
|
|
|
160
161
|
case when it is missing or stale. `--check` fails on a malformed note and warns about a stale one (it prints the current
|
|
161
162
|
`caseSha256`); `--hash` prints that hash. Deleting `.explore/notes/` is always safe.
|
|
162
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
|
+
|
|
163
179
|
## Cleanup
|
|
164
180
|
|
|
165
181
|
```bash
|
|
@@ -167,10 +183,12 @@ pnpm cleanup --env staging
|
|
|
167
183
|
pnpm cleanup --env staging --forget
|
|
168
184
|
```
|
|
169
185
|
|
|
170
|
-
A write case registers everything it creates (named
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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.
|
|
174
192
|
|
|
175
193
|
## Web UI
|
|
176
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;
|
|
@@ -518,6 +525,11 @@
|
|
|
518
525
|
<button class="btn btn-info">Full screen</button>
|
|
519
526
|
<button class="btn btn-danger">Cancel</button>
|
|
520
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>
|
|
521
533
|
</div>
|
|
522
534
|
<table>
|
|
523
535
|
<thead><tr><th>Variant</th><th>Use for</th></tr></thead>
|
|
@@ -531,7 +543,12 @@
|
|
|
531
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>
|
|
532
544
|
</tbody>
|
|
533
545
|
</table>
|
|
534
|
-
<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>
|
|
535
552
|
|
|
536
553
|
<h2 id="badges">Badges</h2>
|
|
537
554
|
<div class="demo">
|
|
@@ -834,7 +851,10 @@ import {FilterChips} from '../components/filter-chips';
|
|
|
834
851
|
Write a plain <code>title="..."</code> on the element. <code>lib/tooltip.ts</code> (tippy.js) turns every <code>title</code> into
|
|
835
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
|
|
836
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
|
|
837
|
-
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>
|
|
838
858
|
in <code>index.css</code>; the keyword help of the case editor and the ? help of the case panel have their own
|
|
839
859
|
<code>inkstone</code> theme, and both open on click (see <code>ui/web/src/lib/section-help.ts</code>).
|
|
840
860
|
A target card is too long for a tooltip: it opens as a window (<code>components/case-panel/target-card-dialog.tsx</code>).
|
|
@@ -1006,7 +1026,8 @@ import {FilterChips} from '../components/filter-chips';
|
|
|
1006
1026
|
<code>text-ink-2</code> on the warm strip. The name is <code>font-mono</code>; the kind in front of it is
|
|
1007
1027
|
<code>text-xs tracking-wider</code>, <code>text-theme-ink</code> when active and <code>text-ink-3</code> otherwise.</li>
|
|
1008
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
|
|
1009
|
-
that does not exist yet keeps its tab, disabled
|
|
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>
|
|
1010
1031
|
<li>The switches of the bar under the tabs are a segmented control, not buttons: active <code>bg-theme-btn</code>
|
|
1011
1032
|
with white text, the others <code>bg-card</code>, the whole group ringed with <code>ring-1 ring-line-mid</code>, and
|
|
1012
1033
|
a <code>text-xs text-ink-3</code> label in front (<code>Layout</code>, <code>Pane</code>). A switch group without a
|
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
|
@@ -58,14 +58,19 @@ One row per profile, with the same login check as `pnpm status`.
|
|
|
58
58
|
The case list is grouped by folder and collapses. A case opens on the **Case** tab, with the **Spec** tab beside it:
|
|
59
59
|
|
|
60
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
|
|
62
|
-
until the case has a spec
|
|
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**.
|
|
63
64
|
|
|
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
|
|
65
66
|
the same file, and every other link opens the case. Each tab keeps its own unsaved draft while you switch between them;
|
|
66
67
|
an amber dot on a tab means that file has unsaved changes, and **Save** (`Ctrl/Cmd+S`) and **Discard** always sit at the
|
|
67
68
|
right of the tab strip and act on the file on screen.
|
|
68
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
|
+
|
|
69
74
|
Under the tabs, the first row is the AI toolbar (command, environment, profiles, attended, **Run AI**, copy the shell
|
|
70
75
|
command, AI guide). It is the same on both tabs, because every AI command acts on the case. The row below holds the
|
|
71
76
|
tools of the file on screen: on **Case** the **Layout** (Split / Single) and **Pane** (Panel / Editor / Doc) switches
|
|
@@ -83,9 +88,11 @@ right (drag the divider to resize, double-click to reset).
|
|
|
83
88
|
green. Hover for a tooltip; the small X after a marker removes it (or the whole question block for a `TODO`) in one
|
|
84
89
|
step, with Undo; the file is saved when you save it.
|
|
85
90
|
- **New case** takes an optional folder and runs `pnpm case:new`.
|
|
86
|
-
- **The Panel** shows the case as a form, with the open questions first
|
|
87
|
-
|
|
88
|
-
|
|
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,
|
|
89
96
|
`- Recipe:` lines), the `## Expected` and `## Visual checks` bullets (drag to reorder), the `## Values` table (one
|
|
90
97
|
column per profile; an
|
|
91
98
|
empty cell inherits `default`), and the `## Targets` cards read-only, with what each is missing. With two or more
|
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,6 +49,7 @@
|
|
|
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",
|
|
@@ -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,6 +8,7 @@
|
|
|
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",
|
|
@@ -31,5 +32,8 @@
|
|
|
31
32
|
"@playwright/test": "1.64.1",
|
|
32
33
|
"@types/node": "^22.20.5",
|
|
33
34
|
"typescript": "^7.0.2"
|
|
35
|
+
},
|
|
36
|
+
"asrun": {
|
|
37
|
+
"testDataPrefix": "[asrun]"
|
|
34
38
|
}
|
|
35
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-BzMqkmQ9.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};
|