{
  "markdown": "<!-- AGENT-FIRST NOTICE -->\n> [!IMPORTANT]\n> ### 🤖 Read this with your AI agent — don't read it by hand.\n> This repo is written agent-first. Point Claude Code, GitHub Copilot, Cursor, or any agent at it:\n> *\"Read the README and AGENTS.md, then help me run / extend this.\"*\n> Structure + [`AGENTS.md`](AGENTS.md) are optimized for agent comprehension.\n<!-- /AGENT-FIRST NOTICE -->\n\n<div align=\"center\">\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"./brand/archlang-wordmark.svg\" />\n  <img src=\"./brand/archlang-wordmark-black.svg\" alt=\"ArchLang\" width=\"440\" />\n</picture>\n\n### Floor plans as code — like Typst/LaTeX, but for architecture.\n\n**Text in, a precise architectural drawing out.** Deterministic, zero-dependency,\nand built so an **AI agent can verify its own plan without ever looking at an image**.\n\n[![npm](https://img.shields.io/npm/v/@chanmeng666/archlang?style=flat-square&logo=npm&color=CB3837)](https://www.npmjs.com/package/@chanmeng666/archlang)\n[![CI](https://img.shields.io/github/actions/workflow/status/chanmeng666/archlang/ci.yml?branch=main&style=flat-square&logo=githubactions&logoColor=white&label=CI)](https://github.com/chanmeng666/archlang/actions/workflows/ci.yml)\n[![Node](https://img.shields.io/node/v/@chanmeng666/archlang?style=flat-square&logo=nodedotjs&color=339933)](https://nodejs.org)\n[![Runtime deps](https://img.shields.io/badge/runtime%20deps-0-2e7d32?style=flat-square)](#-why-it-is-different)\n[![License](https://img.shields.io/github/license/chanmeng666/archlang?style=flat-square)](LICENSE)\n[![Stars](https://img.shields.io/github/stars/chanmeng666/archlang?style=flat-square)](https://github.com/chanmeng666/archlang/stargazers)\n[![Sponsor](https://img.shields.io/badge/Sponsor-%E2%9D%A4-EA4AAA?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/ChanMeng666)\n\n**[▶ Live Playground](https://playground.archlang.uk)** · **[📖 Docs](https://archlang.uk)** · **[⌨ CLI reference](https://archlang.uk/cli)** · **[📦 npm](https://www.npmjs.com/package/@chanmeng666/archlang)** · **[🧩 VS Code](https://marketplace.visualstudio.com/items?itemName=ChanMeng.archlang)**\n\n</div>\n\n## 👀 See it\n\nHere is a **whole program**, and below it **the actual drawing it compiles to** — not a mock-up.\nNot one coordinate in it places a door, a window or a piece of furniture: every opening is pinned to\na distance along a *named wall*, every fixture resolves against a room or a wall, and the bath and\nbedroom are laid out by a `strip`. `site { street north }` names the two facades the plan turns\non — the front door faces the lane, the glazing faces the garden.\n\n```arch\n# A one-bedroom laneway cottage — 49 m² that reads as one program.\n#\n# Nothing here is positioned by hand. Every opening is pinned to a run distance along a\n# named wall (`on <wall> at <pos>`), every fixture resolves against a room or a wall\n# (`in <room> anchor …`, `against wall …`), and the bath/bedroom pair is laid out by\n# `strip`. `site { street north }` names the two facades the plan turns on: the door\n# faces the lane, the glass faces the garden.\nplan \"Laneway House\" {\n  units mm\n  grid 50            # partitions are 100 thick, so a `flush` fixture lands on a …50\n  north up\n  dims auto all\n  site { street north }\n\n  wall id=w_lane   exterior  thickness 200 { (0,0) (7500,0) }\n  wall id=w_east   exterior  thickness 200 { (7500,0) (7500,6500) }\n  wall id=w_garden exterior  thickness 200 { (0,6500) (7500,6500) }\n  wall id=w_west   exterior  thickness 200 { (0,0) (0,6500) }\n  wall id=w_hall   partition thickness 100 { (4200,0) (4200,6500) }\n  wall id=w_bath   partition thickness 100 { (4200,2500) (7500,2500) }\n\n  room id=r_live at (0,0) size 4200x6500 label \"Living / Kitchen\" uses living kitchen\n  strip down at (4200,0) gap 0 width 3300 {\n    room id=r_bath size 2500 label \"Bath\"    uses bath\n    room id=r_bed  size 4000 label \"Bedroom\" uses bedroom\n  }\n\n  door id=d_front  on w_lane at 2100 width 900 hinge near start swing into r_live\n  door id=d_garden sliding on w_garden at 2700 width 1800 slide left\n  door id=d_bed    on w_hall at 5600 width 800 hinge left swing into r_bed\n  # `w_hall` is walked lane→garden, so `slide right` sends the panel down the solid wall\n  # below the jamb; `slide left` would aim it at 500 mm and trip `W_POCKET_RUN`.\n  door id=d_bath   pocket on w_hall at 900 width 800 slide right\n\n  window on w_west   at 2400 width 1200\n  window on w_garden at 700  width 1000\n  window on w_garden at 5850 width 1600\n  window on w_east   at 1500 width 600\n\n  furniture fridge       against wall w_west offset 400  in r_live\n  furniture stove        against wall w_west offset 1200 in r_live\n  furniture kitchen_sink against wall w_west offset 2000 in r_live\n  furniture table  in r_live centered size 1300x900 label \"Table\"\n  furniture sofa   in r_live anchor bottom-left flush inset 250 size 900x2000  label \"Sofa\"\n  furniture bed    in r_bed  anchor bottom-right flush inset 250 size 1500x2000 label \"Bed\"\n  furniture robe   in r_bed  anchor top-left     flush inset 200 size 1800x600  label \"Wardrobe\"\n  furniture shower in r_bath anchor top-right    flush size 900x900\n  furniture wc     in r_bath anchor bottom-left  flush size 400x700\n  furniture basin  in r_bath anchor bottom-right flush size 600x450\n\n  title { project \"Laneway House\" drawn_by \"ArchLang\" date \"2026-08-16\" }\n}\n```\n\n<div align=\"center\">\n\n<a href=\"https://playground.archlang.uk/#z=jVZdbhs3EH7fU3yQXhxAdmjZUuw2CZC2AQrESIs0QdAn70gcaVmvSIGkvHIDA3nqAYqeoQfoEXqUnKQYciWtHMepnijuzMdvvvkh-3gBZ_lwwto7t0BNlhu6wdTFSHPGp49_4fQci3__QawowjPpAArihKV3c0-Lo6Jf9PHaxcrYOSr2DBOwdMFE4yxrTG5QkdVHeHnN_gZuyVYsxchYMYgOBL-y0CZEslMG1c7OQUUflhas0VBd46B0Fk9l-RwU8XTpwvPy0QCcYGdmHVee4Tm4-poDaE7GhijQEprzoIRT9HFQGounsv0cZKeV8_j08e9ygHLjlA6UvUcDkNWIFWNCsXq8UWpJxksINRkNt4qY3BR9lCF6syyPUAYTGR8QomeOsM7HCrdlCicktNg4zGhKuv2_rMkirrwVcb9JW9o5X_TFqrWR9AzSal5TCJ0vc_Ka7VGRUHoXbRp_dKvAPXwogJU1MWCxKIC5Nxojhc6vjyX5mBIWQJ5xrBRiZaZXAwTJTjmrV6EqtyrXZLUQBYlKI1WgjXG1LABtFgG0krzWdQHcK0ZRIMts9LPmUkIDwOvI3jiPfLrlEDBUCh9woAbqEQ6ejFRa3O55M4X4sPfGLy_GI_UZRpbwYQbZ78sYDX-NRyZxv3clK-xS0fE-zt6nwzaKtLgPQ4r0f2AMO4EMW5gCuVOMfuYva3PN0mWZcDC_M8RxLWeipgnX6F2Ya2nkx3hl4rRi28MqcECdt6_ypqRfmgLaNTYhboKY0xIKjdGxwsmJkCukFnccUizp6GHn1O8oVj0xTIeJzV031mgZq45bbtyWY9vGBXLc0mnirC9n3tkIqey2JiliKMplnudKQeYcwzJ5hEg-IjRpntnokIXbQ2zrKtRGi1lCbvcE-8kW-_hMqWTGqHkW90BSTC2tVCYUMRpvXc-2tMRzn9CEdSEdXmbPUqZWQ_UV6zRPPv3xZ2aTOr3M53szr2KJwNLlaTqR5TqnUP4GV5s8lRP0hGvXpA-_0WLy7QZFuJRo3KrWILOAiYm2Ulgs8lSVuijfX_780_evXr69fPPudXm0H3ZbzW56xXE_-vO94Du001wxVrsmO7Q9KVqf7rQeKnXHbpcTScnGTj1gNzobbfHGn9m1M4kijkfbc8WsAGYrb00apDNv9JzbMbx3-7TM3WwWOEopA8buCmwHEaK73iA8BCExfwGi7dXLYOzVQxBDdQeij7cVw6_SdU4W717_8PLNxYtfB9CeGosJz5znXEKG821FUfrGapHJRKm6XFIzkqJIoJEmNcu1gWsTzKS-EdvolvAUK_YCYlHlhjIxPVPyPZ5fE4In7T1Aba4yzfRIyE8UrgOnd8oAVrZBmDrntbEU-WhPFwmsI_vmsTBxMbrFYeo1YzfpyZPqTKn1yWmqhh1OjqcDNGUbWdgmp-MTpdbnu1n1Vsx7-0kWeb5CJd3RLaHhqCV0rtQ6pW0D_oub0T52O1wSdlrvY6euuh9cKjuj76bsPrZ3E74PO7plJi2_PeyNkjIO1-MO8ffktcDdEaZyDfv2ABkXnQMy8-0BWz3O76SnmWInQAejK24X41Sp9ZM7GBMKxn4ZoytiwhgrtT4dpWkQTazlfbT07jeexs_eb6mVLic36L3w0-qC7LwHTZHRG6rh-FCdHR6Pe7gtbov_AA\">\n<img src=\"./examples/laneway-house.svg\" alt=\"The floor plan the program above compiles to — click to open it in the live playground\" width=\"620\" />\n</a>\n\n**↑ `arch compile laneway-house.arch` — that program, rendered.** The walls join and hatch\nthemselves, the hinged doors draw their own swing arcs, the sliding and pocket leaves draw panels\ninstead (a pocket door has no arc, because it has no swing), and `dims auto all` measures the\nbuilding it was given.\n\n**▶ [Click the drawing](https://playground.archlang.uk/#z=jVZdbhs3EH7fU3yQXhxAdmjZUuw2CZC2AQrESIs0QdAn70gcaVmvSIGkvHIDA3nqAYqeoQfoEXqUnKQYciWtHMepnijuzMdvvvkh-3gBZ_lwwto7t0BNlhu6wdTFSHPGp49_4fQci3__QawowjPpAArihKV3c0-Lo6Jf9PHaxcrYOSr2DBOwdMFE4yxrTG5QkdVHeHnN_gZuyVYsxchYMYgOBL-y0CZEslMG1c7OQUUflhas0VBd46B0Fk9l-RwU8XTpwvPy0QCcYGdmHVee4Tm4-poDaE7GhijQEprzoIRT9HFQGounsv0cZKeV8_j08e9ygHLjlA6UvUcDkNWIFWNCsXq8UWpJxksINRkNt4qY3BR9lCF6syyPUAYTGR8QomeOsM7HCrdlCicktNg4zGhKuv2_rMkirrwVcb9JW9o5X_TFqrWR9AzSal5TCJ0vc_Ka7VGRUHoXbRp_dKvAPXwogJU1MWCxKIC5Nxojhc6vjyX5mBIWQJ5xrBRiZaZXAwTJTjmrV6EqtyrXZLUQBYlKI1WgjXG1LABtFgG0krzWdQHcK0ZRIMts9LPmUkIDwOvI3jiPfLrlEDBUCh9woAbqEQ6ejFRa3O55M4X4sPfGLy_GI_UZRpbwYQbZ78sYDX-NRyZxv3clK-xS0fE-zt6nwzaKtLgPQ4r0f2AMO4EMW5gCuVOMfuYva3PN0mWZcDC_M8RxLWeipgnX6F2Ya2nkx3hl4rRi28MqcECdt6_ypqRfmgLaNTYhboKY0xIKjdGxwsmJkCukFnccUizp6GHn1O8oVj0xTIeJzV031mgZq45bbtyWY9vGBXLc0mnirC9n3tkIqey2JiliKMplnudKQeYcwzJ5hEg-IjRpntnokIXbQ2zrKtRGi1lCbvcE-8kW-_hMqWTGqHkW90BSTC2tVCYUMRpvXc-2tMRzn9CEdSEdXmbPUqZWQ_UV6zRPPv3xZ2aTOr3M53szr2KJwNLlaTqR5TqnUP4GV5s8lRP0hGvXpA-_0WLy7QZFuJRo3KrWILOAiYm2Ulgs8lSVuijfX_780_evXr69fPPudXm0H3ZbzW56xXE_-vO94Du001wxVrsmO7Q9KVqf7rQeKnXHbpcTScnGTj1gNzobbfHGn9m1M4kijkfbc8WsAGYrb00apDNv9JzbMbx3-7TM3WwWOEopA8buCmwHEaK73iA8BCExfwGi7dXLYOzVQxBDdQeij7cVw6_SdU4W717_8PLNxYtfB9CeGosJz5znXEKG821FUfrGapHJRKm6XFIzkqJIoJEmNcu1gWsTzKS-EdvolvAUK_YCYlHlhjIxPVPyPZ5fE4In7T1Aba4yzfRIyE8UrgOnd8oAVrZBmDrntbEU-WhPFwmsI_vmsTBxMbrFYeo1YzfpyZPqTKn1yWmqhh1OjqcDNGUbWdgmp-MTpdbnu1n1Vsx7-0kWeb5CJd3RLaHhqCV0rtQ6pW0D_oub0T52O1wSdlrvY6euuh9cKjuj76bsPrZ3E74PO7plJi2_PeyNkjIO1-MO8ffktcDdEaZyDfv2ABkXnQMy8-0BWz3O76SnmWInQAejK24X41Sp9ZM7GBMKxn4ZoytiwhgrtT4dpWkQTazlfbT07jeexs_eb6mVLic36L3w0-qC7LwHTZHRG6rh-FCdHR6Pe7gtbov_AA)** — it opens the\nlive playground with **this exact plan already loaded**. Change a number and watch it redraw;\nthe compiler runs in your browser, nothing is sent to a server.\n\n</div>\n\n> **Why a link and not a live embed?** ArchLang *does* ship an embeddable viewer — but\n> **GitHub's markdown sanitizer strips `<iframe>`** (it comes back as escaped text, exactly like\n> `<script>`), so no README on GitHub can host one. The embed works everywhere GitHub isn't:\n> see [Embed a plan anywhere](#embed-a-plan-anywhere). Source:\n> [`examples/laneway-house.arch`](examples/laneway-house.arch).\n\n## 🌟 Introduction\n\n**ArchLang** is a small declarative language for floor plans. You *declare* a plan — walls, rooms,\ndoors, windows, furniture — and the compiler renders a clean, professional **SVG** (also DXF, PDF,\nPNG, and a zero-dependency ASCII plan).\n\nCoordinates are integer **millimetres**, so output is **deterministic**: the same source always\nproduces byte-identical bytes, and changing one number changes exactly one thing. *\"Make the bedroom\n1 m wider\"* is a one-number diff — not a re-roll of a raster image that silently redraws the kitchen\ntoo.\n\nThe compiler is **pure TypeScript with zero runtime dependencies** and is isomorphic — the same code\nruns in Node and in the browser, which is why the [playground](https://playground.archlang.uk)\nis fully client-side.\n\n> ArchLang is the floor-plan engine behind [ArchCanvas](https://github.com/archcanvas/archcanvas),\n> an AI design agent — but it stands alone and is useful in any app or script.\n\n## 💡 Why it is different\n\nMost \"AI floor plan\" tools generate a **picture**. A picture cannot be checked, diffed, or reasoned\nabout — and neither the model nor you can tell whether the bathroom is actually reachable.\n\nArchLang generates a **program**, and then lets you interrogate it as **facts**:\n\n| | Raster image generation | **ArchLang** |\n|---|---|---|\n| Output | pixels | a `.arch` program → SVG / DXF / PDF / PNG / TXT |\n| Edit \"widen the bedroom\" | re-roll the whole image | change one number |\n| Same input twice | different image | **byte-identical** output |\n| \"Is the bath reachable?\" | look at it and guess | `arch describe --json` → access graph |\n| \"Does it match the brief?\" | eyeball it | `arch validate --intent` → exit code |\n| Wrong syntax | — | **errors returned as data, each carrying its own `fix`** |\n\nThat last row is the whole design: **`compile()` never throws.** It *returns* `diagnostics` with byte\nspans and a machine-applicable fix, which is what makes a tight self-correction loop possible.\n\n## 🤖 The agent loop\n\nAn agent can author a plan, correct itself, and **confirm the plan matches the brief without\nrendering an image at all** — which is what makes ArchLang cheap to drive from a text-only model.\n\n```mermaid\nflowchart TD\n    B([Brief]) --> S[\"<b>arch context</b> — the whole language, one call\"]\n    S --> W[\"Write <b>.arch</b>\"]\n    W --> C{\"<b>arch compile --json</b>\"}\n    C -->|\"ok: false\"| F[\"<b>arch fix</b><br/><i>each diagnostic carries its own fix</i>\"]\n    F --> C\n    C -->|\"ok: true\"| D[\"<b>arch describe --json</b><br/><i>rooms · areas · adjacency · access graph</i>\"]\n    D --> V{\"<b>arch validate --intent</b><br/><i>does it meet the brief?</i>\"}\n    V -->|\"no\"| G[\"<b>arch suggest</b><br/><i>candidate door / window statements</i>\"]\n    G --> W\n    V -->|\"yes\"| O([SVG · DXF · PDF · PNG])\n\n    style B fill:#ede7f6,stroke:#6b3ae0,color:#1a1a1a\n    style O fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a\n    style C fill:#fff8e1,stroke:#7a6000,color:#1a1a1a\n    style V fill:#fff8e1,stroke:#7a6000,color:#1a1a1a\n    style D fill:#e8f5e9,stroke:#2e7d32,color:#1a1a1a\n    style F fill:#fdecea,stroke:#b3261e,color:#1a1a1a\n    style G fill:#fdecea,stroke:#b3261e,color:#1a1a1a\n```\n\n**Cold start in one command.** `arch context` prints the entire agent context — language spec,\nworkflow skill, CLI reference and every diagnostic code — as one system-prompt-ready document (the\nsame [`llms-full.txt`](https://archlang.uk/llms-full.txt) the docs site serves).\n\n```bash\nnpx @chanmeng666/archlang context                       # EVERYTHING: spec + skill + CLI + error catalog\nnpx @chanmeng666/archlang context --section errors      # …or one section of it (the catalog alone: 60 KB → 13 KB)\nnpx @chanmeng666/archlang spec                          # just the language, one page (~2k tokens)\nnpx @chanmeng666/archlang help describe                 # one command, with worked examples\nnpx @chanmeng666/archlang compile plan.arch --json      # render → { ok, diagnostics, summary }\nnpx @chanmeng666/archlang fix plan.arch --dry-run       # the exact unified diff it would write, applying nothing\nnpx @chanmeng666/archlang describe plan.arch --json     # VERIFY, without an image\nnpx @chanmeng666/archlang validate plan.arch --strict   # the ship gate\n```\n\nEvery command takes `--json` (result on stdout, messages on stderr) with deterministic exit codes\n(`0` ok · `2` user-source error · `1` IO · `3` usage) — and a typo *earns* that `3`: `arch lint\n--jsn` exits 3 with `did you mean --json?` rather than quietly reading `--jsn` as a filename, and\n`arch comple` suggests `compile`.\n\n**One manifest, no drift.** The per-command help (`arch <cmd> --help`), the flag parser, and the\ngenerated **[CLI reference](https://archlang.uk/cli)** are all rendered from the same\nmanifest — which is why they cannot advertise a flag a command doesn't take. `arch manifest --json`\nis that manifest as data, and `arch <cmd> --help` is the cheap way to read one row of it.\n\nReads are bounded, so a big plan can't flood a context window: `describe --select`/`--room`,\n`lint|validate --code`/`--severity`, `context --section`. Filtering what you *read* never changes\nwhat *gates* — the exit code always weighs every diagnostic. And because `arch fix` rewrites your\nsource, it prints the unified diff first and takes `--backup`.\n\nSee [`SKILL.md`](SKILL.md).\n\n<details>\n<summary><b>Machine-native artifacts</b> — Plan JSON, a GBNF grammar, an intent schema, and an optional MCP server</summary>\n\n<br/>\n\n| Artifact | Use |\n|---|---|\n| [`/plan.schema.json`](https://archlang.uk/plan.schema.json) | Emit structured JSON, compile it with `arch compile --from-json` |\n| [`/archlang.gbnf`](https://archlang.uk/archlang.gbnf) | Constrain a local model to parseable output |\n| [`/intent.schema.json`](https://archlang.uk/intent.schema.json) | Write the brief down as a contract; gate on it with `validate --intent` |\n| [`/llms-full.txt`](https://archlang.uk/llms-full.txt) | The whole context bundle (`arch context`) |\n\n**MCP server (optional).** [`@chanmeng666/archlang-mcp`](packages/mcp) is a stdio Model Context\nProtocol shim over the library, listed on the official registry as `io.github.ChanMeng666/archlang-mcp`:\n\n```bash\nclaude mcp add archlang -- npx -y @chanmeng666/archlang-mcp\n```\n\nPrefer the **CLI** when your agent has a shell — a CLI costs nothing in the context window until it\nis called, whereas an MCP tool schema sits there permanently. The server exists so MCP-native hosts\ncan *discover* ArchLang. The core stays zero-dependency; the SDK lives only in that package\n([ADR 0012](docs/adr/0012-mcp-shim-discoverability.md)).\n\n**In CI:** [`.github/actions/arch-render`](.github/actions/arch-render) renders every ` ```arch `\nfence in your Markdown to images in one step.\n\n</details>\n\n## ✨ Features\n\n<details open>\n<summary><b>It draws like an architect, not like a plotter</b></summary>\n\n<br/>\n\nPoché-hatched walls (by material), door **swing arcs**, window glazing, computed room areas,\ndimension lines, layers, line weights, a north arrow, a scale bar and a title block. **Real drawn\nsymbols for every catalogued furniture kind** — 129 words across 83 families, the bathroom and\nkitchen fixtures, the room furniture and the garden beside them, each with the detail that makes it\nreadable at plan scale (see [Furniture & Fixtures](docs/furniture.md), or the\n[`furnished-flat`](examples/furnished-flat.arch) and\n[`garden-house`](examples/garden-house.arch) examples) — plus the two **drawing-only**\nannotations a plan needs above and below the cut: `roof overhang 600` puts a dashed eaves line\naround the building (an exact mitred offset of the wall ring, at any angle), and `void` puts a stair\nwell or an atrium on the floor plate. And `dims auto` synthesizes the dimension strings for you.\n\n</details>\n\n<details>\n<summary><b>It checks architectural soundness, not just syntax</b></summary>\n\n<br/>\n\n`arch lint` encodes tacit professional knowledge: a bathroom reachable only *through* a bedroom, a\nwet room that isn't fully walled in, a door whose swing hits furniture or another door, a windowless\nbedroom, an unenterable room, a too-narrow door, a bath/kitchen with no fixtures, and a room whose use\nwas merely *inferred* from an indirect label (`W_ALIAS_MATCH` — with a fix that pins the explicit\n`uses`). All tunable via the ruleset.\n\n</details>\n\n<details>\n<summary><b>It models how a person actually walks the plan</b></summary>\n\n<br/>\n\n`arch describe` runs a clearance-eroded nav grid: per-room walk distance, the **narrowest pinch on\nthe way in**, and how circuitous the route is — with advisory lint for a too-tight\n(`W_PATH_TOO_NARROW`) or roundabout (`W_CIRCUITOUS_PATH`) walk, and an opt-in\n`arch compile --overlay circulation` that draws the routes on top of the plan.\n\n**Facts and advice — never an invisible auto-arranger** ([ADR 0005](docs/adr/0005-no-invisible-architect.md)).\n`arch repair` is the one *explicit* corrector: it pushes furniture out of walls, doorways and swing\narcs, and emits a change log you review.\n\n</details>\n\n<details>\n<summary><b>Errors are data, and many carry a machine-applicable fix</b></summary>\n\n<br/>\n\n`compile()` **never throws** on bad source — it *returns* `diagnostics` with byte spans, a catalogued\n`E_*`/`W_*` code, and a `fix`. Where the edit is mechanical, the diagnostic also carries applicable\n`fixes` that `arch fix` applies for you. `--error-svg` even turns a plan that *won't* compile into a\nself-describing error card an agent can look at.\n\n</details>\n\n<details>\n<summary><b>Parametric, scriptable, and still deterministic</b></summary>\n\n<br/>\n\nValues, arithmetic, arrays, `for`/`if`/`while` and pure functions — plus **relational placement**\n(`right-of` / `below` / …) and room **strips**, resolved by deterministic topological arithmetic, not\nan optimizer. All of it expands at compile time: no runtime, no clock, no I/O. Optional metric unit\nsuffixes (`4m` / `40cm` / `20mm`) fold exactly to millimetres at lex time.\n\n</details>\n\n<details>\n<summary><b>Five output formats · accessible SVG · IDE-grade tooling</b></summary>\n\n<br/>\n\n**SVG**, **DXF** and a **TXT** ASCII plan with zero dependencies; **PDF** (vector, selectable text)\nand **PNG** (deterministic raster) via optional, lazily-loaded add-ons the default install never\npulls. `arch compile --accessible` stamps the SVG with `<title>`/`<desc>` + `role=\"img\"`.\n\nA full **LSP** (hover, completion, go-to-definition, rename, signature help), an `arch fmt`\nformatter, an `arch explain <CODE>` catalog, a self-documenting CLI (`arch <cmd> --help`, rendered\nfrom the manifest, worked examples included), and a\n[VS Code extension](https://marketplace.visualstudio.com/items?itemName=ChanMeng.archlang).\n\n</details>\n\n## 🚀 Quick start\n\n```bash\nnpx @chanmeng666/archlang new -o plan.arch          # scaffold a starter plan\nnpx @chanmeng666/archlang compile plan.arch -o plan.svg\n```\n\nOr install it:\n\n```bash\nnpm install @chanmeng666/archlang\n```\n\n**As a library** (zero dependencies, runs in Node *and* the browser):\n\n```ts\nimport { compile } from \"@chanmeng666/archlang\";\n\nconst { svg, diagnostics } = compile(`\nplan \"Tiny\" {\n  units mm\n  grid 50\n  wall exterior thickness 200 { (0,0) (4000,0) (4000,3000) (0,3000) close }\n  room id=r at (0,0) size 4000x3000 label \"Studio\"\n  door at (2000,3000) width 900 wall exterior hinge left swing in\n  window at (0,1500) width 1200 wall exterior\n}`);\n\n// compile() never throws — errors come back as data, each with a span and a fix.\nif (diagnostics.some((d) => d.severity === \"error\")) console.error(diagnostics);\nelse writeFileSync(\"tiny.svg\", svg);\n```\n\n**Also exported, all pure:** `describe()` (facts), `lint()` (soundness), `validateIntent()` +\n`projectSubscores()` (does it match the brief?), `repair()`, `applyFixes()`, `suggestTopology()`,\n`renderAscii()`, `toDxf()`, and the LSP core (`completion`, `hover`, …).\n\n<details>\n<summary><b>Develop this repo</b></summary>\n\n<br/>\n\n```bash\nnpm install          # one install bootstraps every workspace\nnpm run build        # build the library + CLI into dist/\nnpm run check        # typecheck + lint + the full test suite\nnpm run check:drift  # every generated artifact must match its source\nnpm run playground:dev   # build the core, then open the playground\n```\n\n</details>\n\n## 🖼️ Gallery\n\nEvery one of these is a real, compiled example from [`examples/`](examples) — and every drawing on\nthis page is **generated from its source by `npm run gen:example-svgs`**, so a picture here can\nnever drift from the compiler that made it. Click a drawing to open it in the playground, or the\nname for the source.\n\n**The showpiece** — the whole language on one sheet: `site` orientation, a polygon reading\nnook and an L-shaped master suite, a bowed arc bay, all five door kinds, a shared stair shaft, a\nvoid over the double-height living room, a roof overhang, and a mirrored pair of ensuite bathrooms\ncomposed from one `component`. Every room is reachable, every doorway clears, and the three\nwarnings `arch lint` still raises are left in on purpose and explained in the source.\n\n<div align=\"center\">\n\n<a href=\"https://playground.archlang.uk/#z=vVzdchs3lr7XU5ySLiKtKan5p7_EU-WMNbZrHDtlOcnF1BQJdoNsjJoNLoAWqaSyNQ-xz7CvsPf7KPMkW-ccoBts_khJOaMLu0k1PhwcHJx_6Ag-5xLu3n786ft3t3--hWkhZjZXC_jXP_8bBLilPrVOG_kIuSoKqzIJD6ooBCyVy0GUIJwTaS4zmAkjZrIDLpewKPA3B0cwVca6U6fmOMwqpw04Ta8UopxVYibB5roqMrBSnsHtgzSPLlflDGRhJagS5ErMF4W056As6FIeHAG_kOlSwlIWxdf4Bf0OX0HsZa6LaAZd0i9tLqU7g7vKTEUqLSgHciVNqqy0NwdHMLbKyTEcT9WDhEwa9SAzSPV8IayFUsylPYH_-18YL8RCmvGLsU1FIccvxmIlLX3MZVbRN4WcyTIbw7EAI0VxcMRze56BU66QMCl0es-IP-sSJy7Ugypn51aaB5XKc1tIucCVLlU5sx0wuihkBtUC2eJy5ESYE2w1cdqJwpNotJ7DQhePM10SGWku5lNpZAal1vegp1NilHVV9tgBUWb08f2pzcVCZgdHMBfWSQO2Uk4ypjDpGJaiKEBmM4mgE72UGUzEY43HKwCcngZJ3E_ItDZwr8oMhergCHD7ZHZuC5Xhehc6vZfufKKmusjOJ8KUHZAizWGZSyNBwKRSRSYNLElQROoqURSPsKgc7iHStlRlppcHR7jV3yCNfwLh4JuFtn8aw6KoLAgYT7UZQ6H1Amm3zkjpTqciJYLVZIJSMmWOAOMRM1EwCvkgC-iOz_1Tb0yzWieUGcOxFXMJKoOJdjnQG7bjJU5MHXPvQSsWiExXk0Ke5lLNcndwBDOxAP0gzVb-4UZO6de5KGdjOMaXpHiQtgOZEUsUbBpYLRa4W3RSA9UourqUpRvDCxgvCpFK-Nc__wfmyhhtYEXk8AeZwUIogwyQJe05TITLkQ6WqP_qJzCtTKlcZVDwpmKuCiUtiNRoa-FeuTSX5bkX4YnMcOw5cfOcNcO5k8YgDbiuTM0tiMppEEXht4gP91yUlSggU_Ozg6ODI1JPi0I7mBpdOuvFFjcvrP3Dx0-f33b8oYBSG5dLU0Iu58ouSIRQl1kN44lI78co7cge-Z-VcNqMUKeNQRhJw-9efXcLpOaOra5cftKBZa7SHFXLMn9s7xKrO2FSOgaMzELvWRCInAmTyRImdNTEPU9GM8BUpCKTzSn07PJqgIbgUXcivbcgCl3OIiacBbWF4mCh1KQcv8aDocvikfUWZMrI1Cld2rMD0s2Hb4M2_xG1-SH8cgBQlcpZmM8PAGZGZdBNkgMAUnfwqof6NLOpWMgDANJ90L0Z4hvEcqgWBwBr-0rveQVFonQAwKrxAH-FUvZL2EvGiPaMv_gV3zyCV42cfv_q3aetctrBeXN6R5epPAsi7188PgFh4RvkByoHgj1edR5P4G_hQPx9DKq0TpROCccGQliycVlmpLVigmpbr-AY-aSXJavDF7Q4eAEuN1IS8FI6mKoVHhZ78jWbRGFk6SCtnGXtRlR9xTikISePgOrBOZmBkaityxRNIBtMwmXyUhxGUx-PZdk7w8dxB8ay7PPzCUk8CQmqJlIEVuH-Q6pLZ0SKKyPEcW1f55WV1fyUjM2ZMGk-PoMPmklT1qubdx_u3r2-JehavaCILyqz0Fbe8GEh5HAAUBIXsrS8Em-hmRtfWchkqqzSqPJXInXFIxTKnw6k5CsLOS4UqTg7gGjSZltRdIH5obKX9P9CGMfrdblK70tpLUoz_ALHSSc5gePuVRI99C4SfA4PaaGthF8JlpeQvaT_hfPjrfpZAg5d4QgoxEQWcHjLJB1CZaUlwSSIIxir0koH3WEy7uARhfG0qGw-7gTt4Jaa1VgtNTdejZAMz3HBEzr_LheODLCH1shUAZ_fvvvzX28_Qa6tC6Jhc4m6tTdMYD6HqTYgy965LPsdGC9HRW-EmmUMvST6_Wh-4oFNVZao5SKFg7JUqFLiqSCXq94NL8ZdhqL5UQL9MtEJyqwXYsQupTDSoOKTpPVSXRQqk5YdJJxrKgzagzNS_zbXS2lgpqUFpxenn969efvZM8gjRgcjyB0JLumswOX3t3_57J2XsXBwOUySMUxkoZcnrH1FmAotSCCWvY4CrS7KcqnBLoP6P6N3asMYhquS5UaUaU4e7-LUoLkHgFoSWIauk2R1TWo2hpkIq0rYBlPIKaK0YS6SZDUYtmGWKfC7azAT7ZyeMxLtD71EMIMkWV0SNV7vvvwjfgj5_e2Pt--hS2IiS2ce2XG6qcMI75p6hyJTKIzn3s3ogPcl_lAivdcHh2-MrsoMpoXW5tCrmyM4PT09BTpj9Pglfjzyx1KyDsrAoKTh0UT5nQtVwoMuqrnshFii8cEL6Wpj4T2LY_Y6wpGmczmRufKORuTH-HAvrQwGPejP3L5-c8vKSoCVC2GEkz6wSJVJCznuNLD3MkP_bA7Hg0GSdLpJD_Wo03DcvWg-E8njdDlGZ0w5mFTFTFr4-MPnn159en22psaZsXLlpFG0_KDGUZ3xFkCtzPuszcO3_JknDd9FdPmvcJFr5BmRqcqiPkwgXTZTrI2ifaFnOiK4_s-Nz1Y5VShH8cPshv0BciYtO2PkN0x1hZ4NOV_eGtLG0opZkQbGSutISXaQYd61a2yxW6pUnqyzbTnCqUdlw7k26-D4dDj0xo_-_XUbwPJ5APzk-bcVyD4N5Icf7wRCrgJsN-ox0EXAufAwno9_wcjhlFzvGsPCsfc8cSM2uKinU5XKkdw1LfsSg8TzgR4GW4lf6GUmzWi5H-kqINFDbx_SEzR1kwDFT9uxOJh6SEf2SaoYwB-q7WikwEf2IYXnol3FDIu36RzdHA6T7EKV62FRJsv2NrY3ruiSWzNabqWkF3zAwRYytgPJfUDReM-gHWDqYZShSd8nxINmPD_vOA6ZKkf3yj1DoOJVXu3EQlu6l7BoPD_vIOxeOQ-29cwnG2DMsqt1MSC76iO6mdHVQmZs1ygywSjJ58t-q2H9mVIyPqo-vPMPiHpYW5Ta3R-xRgfy-WuFFxwl_LxCLRNc_zf09iGw689jNyCDdWggWVE1kKhHAuQP_LaPJvzYDUxWCkxmUCI1mWjKVr2IzO_p7UDmMt2EE-SLEVytSQJc_6oNR28HOMw-hWX73SSWezfj8D3_v85wNp_k7N0ApktTJ8pZIdlZQHt5dwupNqU0URJTcdSDcQVCYk4TFUWN-erDm_e3r3ldD0q0E6Lk7JQccaLPLilRIIwUHb804TjGRc2mVXa2wSg2EAHS_7r2SNYNQ39A0t7vNUfSP9TjPEPvkA9-x3mGjYnZWeYdGrQ2CD-vBr04IuX9CT8EzAg5J2jWwf1W-UCXaa3BcfcvIgHl_TxcB2eEDWD23z3VjZ5jseq1gF_Tyy1gRtgA9hFBI_8R8PCqdaT-yi8frgF7hA3kkK6ska9ayL0I-TO_fFhL4LfsZvOBO-eD0kGBpVoJ-cq0OSyeujGhLJ0z9SDJN1SGAlkLoobGkgLEuUWN4apPWgqOeyktMBFGdujN0wI1MAUwUGLcDEbOFGb4MS1TI1MuM03x3ZkRi7yDMTbOoasZHkbMnt9T6umecmF-fipunGyekaBraw729nAw6OO3oij8CaDMDwYbVSHQMq273WQniDc3lGynAgNlwZWr6H34fQEYZ7yylxl7SbUY4jIu_Ilbqszl0MWjRvaPwxUqbABF1pwjID3lz2wL2yuQCJtOM7IkwF8H9Mgf3TVFpC2aOYIN4x__iaxP73IYraOfNDNx_LAVaKSYG6wdtlIa84FTHs-lMnj5XAZC0fKOv3CA1AaWD5OkxmwBeRs5kivnqeR11uFni6k-QNmkVleuBR3MLP9wxYppjDxp4dD7CpReIaGY1mLoNqA3tPyDRa9tcP3rGu5697rR70q18eQRTOO9IvsaFJLYndsTq8IGvvE3a_jwFYI3K6bFPxMwaNfIc7nevku1i7pL9JtcUJspzSS-1sjU134qcrghvzeodwwnaeGxYRv5Oo4nel20uskT6gDlimAxIU4ryF7qOjjgjfMf1jmLVG4ObMIuGtp8XBdEzFPvGuzt8prMLHE8uqMRX9aUrq-O3pDy31E6xTTFWs31CaWLOS6Fqcrk7Kxfe4cMhuQxR5HtSNgLUPAf0O02vL_0a_Qxyea4LrIhkq7WzxHwidw5_DpZP0Qb44MnciyFz8Gf7ALrdb8kWCTC3cE2sHAMngHWvUz2cQmO0Bc3KtNmF1ptJdePxtX60ajhWAA7PmGJb6yJWpPM_oIZ1gY0k_a-bd87vUtye7nGc8EpcUqix-arwfCmOc2xgI4YuCEd1LknTXIeq0R7MCboV-WymAY6MFTot-not-hogZhqBhuLGSYNSJ_CwUFAiVz1qIKhp2JUxCiXiHLRoCDAiszwbpRUT6dSjhx5iRxMIlMuG_8PT8BqWHNlK4owc-ZqTQuFUMPLYUDB8snVMEGn02F-une5jyqsfK-7c0jUYNCsbX2rtoMoUep1PnNgN2jW1kcO9fdyyD2MsNwOYiawdhWMXW0LplMs8NDRjkHa8kunx_OZlCPu-cVVTQplALo1ig-iNnarKl3j3ayRxMfVyhnVILuBsAG5I_VGXoQJYoPfTOC_HVlV3j9zAowP9kFapx9ktA3PgLwY7ofMlM2XwuaeE8-BvOzuh5walTUO-PMgL_dDUqfPKBUTVUoHG_JT-31ho55YtLJYIl0T52s6ZJE4X3GRch_MRBjrtC4imKtrFMVhDTPgYBx-I8z18IvAdJPudpw1mHYBlaWhxWNfIAlSVQtqnKKLpMo8Un5uH8bloI2xtZJLb_hIZGcxt1XI3Swrb0GJC9QRSqgqt9WFYDt3Somcy3U5GdSqIEqCbhlLRvKpse0zX5WjQlflTDLINWVlYit5HVvrOC7YDdJFB8yj7AHhaEDN6ww4StLpn-paIwlWEIkkAYdBaEgLwfDsClbQO0tgfshQ1DtIhU4X_AbUqd75YN3dC7o7U4bbq_5NZfked8yF_lNfmccmFStTXWbCPHL7ku34-mXTLBo6KWaiKLg_46jpb1xrfozrz_-GQn4PDn-gLsk_vo5fV_I_6JB1oTYT7pqZau0WBnMpyKlSc-vgRFN_CSbBFwXWg0MHQMiId7hqbkNPUas1lCegqMsq7OiCuXLUDMdCSfn0UEP2dX4Mn-W0svK31N7bVff1entUxg1tVDGfo_rrl-R0U4OayKw3srC_A8z3e3HC7WJ7wa5Ef2UfzDDqHLvajTSRWf8Jgq4jJF9m3U4Ut2w9q7K5rxrpj-b-0ubuamRUTAsa4vAu7lXfVk7DfalTh75GFRUt4ja6b30DVy800vHnLcWKUpYMObwKhZBGc8aQ7_HVwybnH5eqWlT2g9-xDrmTyv5WKre0nsqyFxdt9r3YX6MgtKcerJXMYp17g9Ws96d3b199f_u6XexaGrGgrQlNq36y0Nhsg07hPjrfRO3SnLvNXa5M1oGqbDrF65ZEPW01mWIvIDbSUEHC5VFFbiJJ7wjSO1T-CHquVnCbBQS_xo0iWyybaL5bHzj-8Udg7UPQUYONBqG6BPcdz3nHnZw-AE46l2Tgn7vTI-4VjWiLaxeRCIuS0pI-o34RhZDoEHVjEeZXd5VG1nqR6HjfYMEG233R8aR9wjsIW-8asPHwBgbupVzYIC0ed1oVha8fYZl0rS4koH-WwAoGZz2YA1290RPrTJX6dv25yjL8cgrKnR20y-xE7FrFcXu58Q2_-QQDmqrQF7TmG4Uh1maUNQ0GJyRsn07Xs5IJg_u_bTArPZ8qZhtFyc1m8GU9OJQxjuB7KlhwOx_fvrnhJvTQRa8sp-iwexcT4KG7UGYdWAqTGT2RvhNHBQ8EiVqi64I7oecL6eJmRVIKdSewYJLYmxRTyAXeVeALPk5DWkhhzlpLRYUZ11pCqzux63LYWvHOSguq03WY_u-DmXP1A083A2wbv6N-xJqMqzS8ed6WU6p-uKeEwiM38_fh4GygDdcT_36zyPqUGRuXwmoC8_dCikeuF_treaSRjrn2jPbi7uMPn9_SVnag0Kkomg7x00KWM5fDsJ8kJ6Q_SKq431uQL5oLI7PzWYW9jNgSj18vKdtMVyu8AJ7h7YXRfBxESxZqIrHltHiM9NHHD7fE007T6OpNRHPbpmDFh1Yt3JPzFghvkfGVAuwu9z0l3i1mScX7EY1KCZGMnyIclVDDx6kOQt3c-Ao5W9j66oP1NyXKB1kipCggFVaGvtpMTmXquFUeb1xgd70b8x1MUOHwHo9_Gn376vPb0Y_vXo2-vX396ePH78Yn9WkMs9B1SGFIQuh7uuhDfevIiU50TWPLSatFsz5lWATq17K0T7hl2Y-G958evqWY9OW19bbqRq85rb5U0txT6XX8naNl6IzZWkW6aBdbGoT-LgRKxkf-R1xwXCuKHLVC6agq0oKj5EnwoyN6WnBeS3S4l_gPL69sKbFMZBan4XpYjx82GZthaAOhbAsa09b4EnUxXu7I6mpENH4w9NnAneNr6-ULK5hk6cdddysyfNH4_QtAbc0U7FhAf_8Cur2LJAaoV7BrfGsB3X53bQWDjRX09xSGSBIp9dbkd7E9LSoLRQYnymJS4gbReReQhsuL9fRdw4WtEC0-YCo2hmjt5HMgrnErfiNEi5vDpFW6uVqrAG2FiMpSBIG8uE6SjZrUBgTeY4xbFkO0Rf1bS2XlKXZsAdVVvXnyEdb7oAr852A1nypnkr7pXHab9fXi5ObW5W3UM8k_6VzuKmh6kM0ABIxQBXl81DWWoWWs7fbOTKBPZLHTyNema39T0gVXMDKrUslGDof422cUmByPM2lToyao0v5hMQA2cqGNo-ucVYlZb0K1f_v72PesUVykspcPa9EIKophw7l-6K2MV0rG9ab-YwEU135---7O38T2hPlMHmnlTp2WqxzKIi1UOb6-65E5Ldj8GYQOTPiqO3FgZiiRiMmbmazDqSYVSLa2MQO_M92ccexHESv-gQOf0lnh0KRD6ZAOUNoLuE-YQ1Z66dG_RJoOkGf4Uq-5WMZ_AIERF0b_A52g9o1k9jHwosto8giHr0yavxflzH-Pxd7DXtK7OE2uTnuXh4T868H_Aw\">\n<img src=\"./examples/hillside-villa.svg\" alt=\"Hillside Villa — a two-storey villa with an attached garage, ground floor shown\" width=\"620\" />\n</a>\n\n<b><a href=\"examples/hillside-villa.arch\">hillside-villa</a></b>\n\n</div>\n\n**The site plan** — the same language pointed at everything OUTSIDE the wall line: a surveyed lot\nboundary, nine `outdoor` ground materials from lawn to swimming pool, a posted `fence` round the\nwater, a `garage` with the sixth door kind, and fifteen outdoor fixture families from the bins to\nthe trampoline. The ground is drawn and measured but is emphatically not floor area.\n\n<div align=\"center\">\n\n<a href=\"https://playground.archlang.uk/#z=rVvdchu3kr7nU3RJF7GrKGb4J5FO-UKJaVsVR_TKyvFunTrFAWdADqLhgAEworSpVJ2H2GfYB9hH2Ec5T7LV3cDMcEjJcTa-sEgO-kOj0Wj035zCbSZh_vPtm_n8Bla5WNtMbeFf__wvEOB2-sw6beQjrMRG5Y-Q6dJK0AUIGAzgAf_bgC2XpVmKAnLtupAasStAWBCdU_h0dTuDbS6KV-AyCctS5akq1qAsZCJfgV6Bcl0QRUrPtcuk4SfKwtroskh7ndPOKczupXl0GdLK3EpQBcgHsdnm0n5LU1rYZcIhmSqsSiXh7USeQ64K2YPbTFnQhcQR-AiZIhZ5ScqCSFwp8vwRlLWlTEHYLuwylWSBZJfpXMJWq8Ih4_jTfb837IMtzUok0r6C2Con4V___O_OKSyRe2EeY9iWjhFy7YgdlCB-t5mUrgsF_hTr0qVam9ivGzbCSaNEbsGKR16dRCl0TsH-WgojYSOdkaBLt7dgC1efuhCvZJHIGLba-sm3WucgiyTXtjSykrl1RkrXOYWV0YUTa8nb0R-HNQ764FmDlXpwSEvaoKSFVWkKZTMatxYmlYVn4xH_dk7hTrkkk0WgrClEeMT7ezO7fAO372efZnD7_mY2g7eXP9x-gu9nb-c3M3p6df0OB8Cbm8vPV9fvenAZBOXFj9t0Pb8FAUbrzStQqA2dUxBLKwuHy9tAnEqbGLWUcHb2i9VF_I2FGIfbv_8j7voxTjuR294q19oshJFisRnEJBR6jgskJe-cQmyTTKZlLmlOG4MTy9xLUDkLSA25KFJUywrZi7PGVoV1UqQ9uMKN0EvrTJk4Ws57XDcex2oLVZHkZSpT-tVqSJRJylw4pQvc_zuLWyrUOnMgEqOtV17Upu86p-D8MRFgnXAyhfs-WLXZ5mqlEkKpz2NQIpZzzYGthIAH0opHVaw7p6yj-GSjU5lDqqWFQrseXJI44N3N_PMn2sSPl-9mr_aPhLJsTSoZs2J2wWqEVi7TpYN4K7bSxHwSmHAnaa2KVY-P806XeQpLCTYRuUzB6YaK9uA9LstrKJ1BVkLk7N3lzeW7GVwxn_Pb97MbeH_54S3M39IvN7MPs8tPsx6rDR51KK20CC3WMmbJIgt3qkiR-TBNpShSpBZO3tH4ExJ1_HnB0y5u5_PF9eXNzfxzDBspLB0Z5V7BuDeGjd_PLoi1QJXx0IPeBWzItm2FuZMpxIkwMRRSphZVygIdXmUhpg-e1S5LWT24jJj1Rt_KBJVA5J1TyKVYscI4cSdRHyHJBa5OOBB53oWlTOi7cjS5hfnfZjfv8TAbQcbcZaIAi3qCqqINiiJXeAnUapYKm8kUjEycKNa5bJpwZpZVTjjQ99JkUqSwNfoX5rQHn9FKIzASISf8zOK2KwtvZjdXf5u96aIuws4o56S_j4y0Or-XBimWku8HujNcppK7QloLerXqnIIUSQZkZIhnEgZdWEigXAZkLHp0maZG3Uu0gMEwo-CDBQ0PY1p955StFMjNNhNOJXT_IJuEF9QHRGF30oRzxyJhlZ3fXM2uby9vr-bXPPsWDxSZcts4ReHCuZ7f3L7vhrNSaIN7VEAmN8puM2mkP26x_LUUTpsFLoCU2urSZZUhCgfp1huTXfbIp1nd4zbj0WD18kb-21QVbCNIfjsdLheXGSlhKVOynyRZZpumW4lEpI2rSpp7lUhY4g_WieTOgsg14dZr9YK5nsGb2Yer72c3l7cz-Hx5c311_a4LuVyRrdAFbEuz1Va-ovEAnxc38_lPi-v57WL2bz9f3s5vFm8vf0Dz-9CnhX_PXMIAXuTyXuYweBm2BPUgE0tF5p-Wz2pRaILm1exUkepdD-aF961oHeSIIL0XAmSCFLcWBe-gsFuZ1L4S4aIgWXBbqbe5BJtLucXloVSkdbCWrrVhEgyaIbRTBYj0XlltHtGWrxzvEEAmS6OsUwkfGQGpeMzJyHqbtJFFxQl6XCyERKDlRS0K18PKSUOIeGxxWjRmPYiFSTK4F7lKhWP1SnIpiu9aT-DszDqjEheDkVttSKXZjet1SG5oRtHpeI9W_wR-6wCUBV68m00HYG1UCv0o6gDQtQGXA76ME7GVHeDLAfqveAidBii3HYBUbSyI0mliXOQ5DW7e9B2AXK5lkXY6AKck1nCT9SDmLYu_jeuDFdN1ifIkJxZlpws87GIjIVWGbZn9DuLKbyTkhoJthSHHk5zMmO0huZaquAsHfIvG8oUgk3qWarKFW2ncY_A7CfSHs483848viQuRppYhe7l2tU-CGj-ajGDzv_8DbBmWj-hzJw5spmUuEtlDsaDDi3KHoKgkR_qhXn3jx7A8eBF1o5fwYjCIouYn-v8lPuVPHYDfWcifMpnnkMjCGYmrsazOzaBCFPDhFQjo93tjeIApbIJDgKdR0DX6AOew8UaUcHVBvhqzf0Yme5WL4q5Hm-zgFl7DMIog_DsF-YCuuTb1PdGhsWgU-nDyjv0lsuEnXjh0raj0taVFHALArR8I8GIwjqLuaExi6E8PvvQj_20UHX4b8jeC8F_Q45eE_fseK7tF1gfSKkXOY81LP4rgN3hxPqmnps8e8ABm8CzMdFDD0OcnYHbPc0NLmkY1N_y5jSL7X2ZmEjVENjkKsxbmKMyAYZh0dGQjSFmB7wCVvjaLDDEB0GVqShSs-k8Jg1EUPeBCAHKxlDmcvBd5fgL1P_IuCQMV_7Hp7rcmsq5MH_1EDRXiiUbDKHrAH6qJPuHwk9ZEerVSiWwB-1u9BmbJPwX8gYaf7AMzRgu4dKoSTUNLPPAkih6GTeCfncqVq3km4JJ_hF3SAg-hZwU-iVrg4yb4j95TeUOeygmDBwzvvuxP4F1TmqCpDzQBYj-cNzc2ePx73Hsz1GG7guaMfDfy2LtVmoANK3tD6L35cMZu8bohWvbw09fpgul1AWxphCNWYKdSl-EhiAAvIMmOEDnmDMiKWnFSh0KYGerBtYaYCGN0CiBGJ776jCj-s97Kgi8PDtHw4mJfb4PhOKPPFgi6-PHq-s3ihw-XP3-asTdBbraRq9IKijLRLGvMJpl1iT6HDxkpKjHiXuYWfv5ILivjOrprFEad8IvYLNGP4tViVFto79xrCkEk-440caFRCNJsZKrQ8dhq6w9-gMbb2_v3B9FKdQ0fjVrwUi5kHoKzEMF0PTBO7yGV929yUaxLsZbfcESS6OJeFsTOShsQhU-EiaW-5-mS0pEfeaAMng__p6kU_dFgHLRiGEVRp0XpjQnmFPCaEA4tXyCYRtG-6tDoFoK3Gg2E8_HTCA37cAqXsNXJnXS01bzp4Zhz7FVoSLQxKsVTEsIDFjNtrfXeHIH3e0PYeGS9giXe7Xx2WB9eKMfBMkzGEalu0LtJFME2LzGkJ3USea53okjky7agyZJ5pnnFA5LypFoxfmK1w5Pn2fFGB1XS71GIsDZlekamhubgsyScE-iFhrGZsEc2nOfHD_sMHIgcefZ8sMkmSVZm07DXabcU9taZpIbVwcNOgOlrXdnbxvLP69n750HH2Mxh6OIzhsi97fLhr863YL9OGp_L2ZaOjzcm_uKlWuk8jYkB4sojN-JP0MFMbvGy_A4EGy00VbAVytTEULPuSVKZ3PXgWiqc0mPbnZRbWx8_3ClKqHxCob54SXFMUeY5nVLeMcqrLDFvRWYojUPSLsQB_hLn-NVJY1DYPgJcSriTW0exkUHNFSSa9pbT8oAlAntnfNSvDxye3hYhLhJCNmaPcDga1BtXK67BGJA3kWNZcpVUUXkee5NPL_Y3_5AsXP9Nsin6abXGHqEK3sgew9PR3h13hKyhnjXZoEE2CApqHWoH-uqOnbZpFHXHg-pqn6JfggJKlcF40e_g2dnZGVzxHYCf6WdKd1POPJX2ji9-VQSLCaJIMowC9PaM7mOkyEub8UQotocLv5oaaan1HS5hdQRpqZ3TGwZrInlfqoWUZLjS4IENh1HUPY9qFwZdpCgCozFRjBiNCTstKKtXgoB8apIsKwvayjVe3oAVhZWVDga4x-z-Dtj9ZeDGHVADm3Jdc0jRQzSqWCR6FNMzAO5-gTkBAhiT9zqo_UDc9QdUgj2AFsIOr2fz7NqisLaLYWCmMq8NHTCPiPOHgCb9Z4CWwqriDwJNp88A7RLWyT8C1I_2kVpQ_oAtLKYj9vAoKPMg55Ws_fi2Hjl0auAIV02UesuPo6yMStfySygYyzyHwl7_gpN65OVHrICTSgHpiE6fh-FTxvRDou9_8Yx9Eanf_6uQmKf-5ADpaxj5EnmbXnjq8Qht67SWJxrXUXWGqizNnvKr5DEJOzIho1UbZ9yP_kWLvmmh0fnwhcPKSp_6AdfoE4ZqbhdrI3UVFkMgLlMJn98uKLapinXBMWiEMrqQjfCBam6YcjwTO_SuMuFwDNYfBDgVwputcA6T8j54sJggpKXNryks-_R-NrsFEVxISl9ivV25uuyFnt-rcVTXZ9gdSdVGFhYDCYU5L7AOPRq9WjXred-EKM3IlTRUKavpmlUdpNuoPFdUh7bkW_tcnHcPfdFDpa_XC6p8QF0d4ah5zLk_una98rSyCW88wckh5Fa4DDDbww4BQaL9DYhepUYe8hCAYuUccuxYqFI0fAk2eDrHDMdw1ODpLcXYSHbyBOiS4jFHTrWDF5NpA5UXOvKgTwDIfYA-elMBgZd1EQCOCkZpAP_HJ27OKfN20crcDIeNdX1EgiNLytGktwRNXtEe3iDgHdl8cjXB_2kkfPYZQi9lMG1uvkzujm08VqGBa9oBrj9mvNqWYErmYdhMwXzUOj-2PN7_PTUYU77zYtRwFYZoW_C_KtF1XAEehUkBqw-YodiTfhNuGHm0Q4ClTBcW9hWAAAb9foMfjK4engTYtQCa29_QoEn0FICEtgpOaojaWE-i_cCu1WbCReWYYvMYqJ-g0VZDHQOCaZbCGEVVTgzxaKRv6QiZEsyOUI9D_gozAFVSllI7W51kmBxzkFHLS6Gr8JS7MeAXrQr6XSQJpuwZdW3ENqNK60FzSFV1Ug7KAmNRbojAZhFOG6FZDY-o9-bv_4h7cBmg8SJWFlI0pEamWEGhek_Tiq7EHT_JpWNZc4iGq-CAVDk2p14k6esVHwDOd1AyupGcf9Gfnh9-Q7P4shrJ36gu4BPfvHch0Vh1AvlCMfdlWfeYS2woQCdta4GjY666-3IuWeRQoQw3n7pvbnmmd7jjilIlvKSNlHR_UoYb0ysH6_WMearf4AW6DXSYXlz0w8ffD-95TjAc3PNv1cpJjAV9EXonC_d4Rtd56HTyHU5463OkHlKLsZG_lspI-1nkefwqUNhGHM9VBL6-5UMit3VXjah6qKwTBZetWMYblaa59GE-WiLVTGwU2mxEDsIYUayp_rqnRAKLTcJxHB_EVzlMod-odmQHeJv0R6MDP_YJytrfG7DZnzzjd34RY3jx_8dgPsajNsYfnPyLhOVmaWSeC6huhNG0JbPpUZEtl782qjfe8u5fTBfebrdDn7JY5Los1pI55ZM76u_R9Q9nbNP1oycJ25SYTGxwykKd1oRUnuofSUGoYm-JAzYr53tu-PkXyYbnf4gsydEAWapg17NNGmmAMUfxLTp5j_tu1hS7V0WaQdT0EB6GB2QbofKlfqj3D7lsXpyBrJ1oMGKz1RWXU9r2i1rLh8EfOaCTsqkuFFA1i1W0C4PRlwjJvej2J43tQ3kOjghUF2pVu04oETwTtWDw80P_8FRksgqrG07JoO2UHBLazJTLmnBazwfPHaZjZBeDP0U2HX0t2SDqt9Tza8imf45sWMvyj61tVFN9BVnfhwPHZvu9bmYYwMlbZaz7i3oZjhTNv7Zf4a9pV_hruhX-kmaFP9Wr4L2Ck9CS1j_BjlVyI4QqqlayUEyq2hSpCV_kiS4eyZHDioXYyJRKFsoFJ6YoN0tp9jwMLIkZKpzpRuMeNrNSrz9Y6TvC_HMOkVaqqot66FBaI4UKXZjoQFPjP7nnKwyuMaegEtvlLikqcqJapGcrbTYgrVMb8q5D_SR28sGdeaqes9xgCSc_NeRxQiGHSmuvadSbwIbLRZQy6UdRr9384N20VvtGq3ujighp8Eko7zd7szPuI2tiL2U6gMOOjVZfhceu2g99b4Jf1CHkcA9yGn0Zcvg8JKdZ2l0arSaNAClcxrL2kML3fe2x2N_Dm0T7eOMjLPZbLIaMna7tDznufI6wm4veW6Fym-QqOVbdpcHSm-z5cAedwqXM9Q4zkkbJpstNiTdV9XCDzcTKVUErB5OhXE8aEprMG91f7VodbfjxmvqkXZ7FsYfkwycK6sfIh21y3MhnqtN75GHf9mbvP1HdPTZ7v9lL8v3lhx_m1__R6PnWdGMIB3dUVlVY7F-LHF8WqNulva2KwQiVW5_FRB_EQ_smW7aoaOVqG7qUmeK4H3Wg6kplu7XC_9Aq2S6kEiPUFFeESVuPjJN8w6Zqo1J-6YdyGdyv79ezuJ5TK0sMK0UpUDQqnumKOZ-GaLCscNhBozn1xtJ7SqEmS5XwqvWdYchui9xqbL20lD5uhJ5N5cN3WzDjFh8mXAKLpQ2vPB1oqh9xrDw8GI6_qjzMZm6v--SirvI-URxmq9Mkmoy_VBpm47fHKlW_np-IzNEeUaNuXpeF9xNkXjzhL9myYSs_NqLq5KRpHGn0yZ-oM6d6V4QDRS_DoSWENb5iEzcLXDH3bMe-Hozvp1AdOH5VjYu9ynOCAl8lc7UOlaaAtzfzn6pERmX_0HwuNeY2Jb7PVG7Bv-2Do-jY8pyYzZIpH-tQScC4Hu_AiBSQsmYUSfDbD9uSAlGnG4oaf168vfr3259vZovvL3_4cXE7p_b8uJ3bWIYI9pkKZl18HIfCM-U7BlWJlcxVu-hrUnwrpB7QqNYfVOkPY6wCTwMleRoO97Rxc4658FzP_ydWNqxWdlGtjILFqIE8-NLKBk-tbHQ8UfFVnGFV4CnOhk_1SFQDvpYz4TJXLj09JyOrDguyT-0Wi4vjLRa-vn6A0-yvaOKcs2f1RHX9KRjmqAEz8tw0crJS3EtbtYKiHLxrQ44xe_johGC8hhaftiFuvuYa2gjJf-60OtiNN-63768-0dsDXW5P4nx2HN73wkBBylSmvZBY9f2NVmEPZHCZmDPU-eBPFZpX4N8_WIUAoHKzV9wRKYo1jOvw0ymXh_cK_OtcrZc9-L7C9zAXy0c4uTRJ9kEUa_87xgYng2hwfhZNzgaTE8L9vfN_\">\n<img src=\"./examples/garden-house.svg\" alt=\"Garden House — a two-storey family house on a 22 x 22 m suburban lot, ground floor shown\" width=\"620\" />\n</a>\n\n<b><a href=\"examples/garden-house.arch\">garden-house</a></b>\n\n</div>\n\n<table>\n<tr>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=jVfbjts4En33Vxy4H9pG3B3Z7UvSQRbIJD2YwQZYIJnZeUxoqWRxmyYFkmq7dxBgn_YL5l_2fT5lvmRQRcmW3VlM-qVpieewLqeKpQu8Qe62tcojQmwK7aBq5eOWbMQf__kNsSLkyjqrc2XwxufVe2U3oL3a1oauBxeDC3mqI-Wx8cqYRwTX2AKjWoVAAZ-VzysYbePn8S3ogfwjvHNbuJpsgCtLKORko1cGlTJmMrhAcHLyWsUKOsAyDJ5UXlGBWHnXbKq0gwome3WyvWzYDLK5cYEKKFsMLlDqGKnATseKmQxKvY-Np_CKN8A6FM55GFIlwo6oDnA2OpSNt5o3XuMjmfIqdzYqbYk5R9ZBb2vnYxizzTpKNLWhgNK7LRSCthtDKDVHqzbKYvgxBXr63Ychfh0AjdUxYLsdABuvCyyyARByZQjTW_lhnY8VmnowAC5wt4_ktfMIFRmDZ-CM6aidDdf4qSLsX8-zLEOhH3TBcWtskPh8__P796hIb6rYj7CQ6oCdMoYKyYgYz--NftB2g1CrnFKQvcBzZ5qtRagN2645UG0q8FyyiOfCfT2A8II6oxErnd9bCgGzLMOvGGWTbIzRKst6i2WW8bpbSCbxpSM7ONwjmyayeUczP9J8M-4mnbo6rr8ZOp8foWn9hbMlEdHFa_-pjaSKrcPpL-h_E5hgz6bCqDUZDN-nvc_xdx3ziuwQDZdSS3GfHp6wr6lgOmbvItCxsyP7mx77dylRQxz_hL5N4AmvpLLHm6Jy5J3Oj7w_KGP6pC0tU5zaymXa40zh6nEue7aqWH2FU2SbioEbh80pafDrkhUnjLb3gSu03dbJlYu_q4RroWyj_8d_f0tIHbhDKW4l3LP43SjXPm-MEkFYoiKcNJDxq_4RQsrHiOPcxLChCJXakIC45jpL2Qh5CHC8ik9bpW0br5ujqHe6iBVLMDsvsErbDcFQGYGwY3M1i6WzXRevXV-NKa-rI-fLLDsX_blJPbkt5wdZJPiLp_DWpNQ6kkmuiU9Ie7pYHnTxV6R9P5mUC1bbwu3aUpuJaUAXsMV5wE4BUsC86RDh2TcAFrMjYHUw9QAQBbS1zO0Yyji7kYyn1s7bb_muuMfv_0PuGhvJ8zJE90C8KL0uNoRR4dXOQgWEx-3amTBmuRzuqK43fBKqVjGT2YIjIAX2InWaE0x3HLqUsssJJJjlVzDJLvQwLxd_hWldOGJmq6fnLLJBvwifHer0wDPBPdURuSHFhSNRFB2JBsJpPIIrVYrDIpvMbw6NhlWxF6G3jeajK9XwBCoaFzHeJIW3UBbHfnbaT4fJaO5Wydh2tvh_tl4G8MTziJo1PzpzgXUs_UxIu74wvkWo3I48tJWHpfLInbfkJ1iroC3URmkborw91MkEv7yFS5Dgmva-F4F2E57UUKy0LzojxYsQ1WOQvsHjwqNreBSEymOT5rxINbQNuqDUOHn2-OWt9EubV87zrOYOdJchHQ8qNjRJ41KAdzF10dH0RSYG5TpE8raFCnHCscljZn939-HHf969e4XPpWlC9RlbUoHD3c0tKsrmS55MLHmUKid4FSvy_NYeiMVNT3lUPKVdBhlEyRtt6WgmOzDLsu02DVyXcqWVV8c54DChWrWl4kyAKWXSKaVTHC_Ql50E-XroZe4Oz_BRHAgYpQSPT5UpyRZObjyT-fykhuaLxLlW-X2XgOq8nR_ZdrkUpLZor-aUPKxdjCxlDvFhTtmvsrZA3-kt2cCZC9Gzam9TNKUJBqi1e6AJ3AP5rhXaGKA8fxykMdVTSZ5snlIx2unI0Ryjdpq3Bh072a4bbQptN5cB__j5p7sPktCA0f711TTLnq-mWTbBY_qx5KmslC59cZ66cZdOMUeM51QHVrqPHFB-KaUhkuFL25MquCB3yhcTIU25rt09NygJ8mH26AwVIe8qbSiVXa0sH6KN6bTaV1pb6L0ncilz279p_6_a_3L3y4Sgt-3VzV6Pr_42alecS1eWgSJmiwyR9hFD3jjsUKs-6kjxFHXTR2WTZQtJA_rZWXytJtTq5KxpN7AwcHqYTJ-gloIaAFFHQ_JdBNTe_YvyePhketN9mw7ltdyFn9aPGPIn6FtlH1Ro36hIGM6y2fIqW17NVvz0y-DL4E8\"><img src=\"./examples/studio.svg\" width=\"270\" alt=\"Studio one-bedroom flat\" /></a><br/>\n<b><a href=\"examples/studio.arch\">studio</a></b><br/>\n<sub>The flagship: fitted kitchen and bath,<br/>an enclosed bath off a central hall.<br/><b>Lint-clean, and import-free.</b></sub>\n</td>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=lZfbbuM2EIbv_RQD78UmgJ3S8iHuFltgW7Qo0Ba96N7HI3EkspFJgxxFyS4C9CEK9IH6Jn2SgqSkWDl4U99Yljmf5viTegMfgFs7z0k6a_eAB3S8J8PQalaAUJBhhzUU1jktrbuYHGo0MP3Y2vl3ndGPNfIUPk8AGqPZw34_AaiclrAQYgLgC6wJFu_SL2MdK3C6UjyZALRY16Dl-_bKK6prAKBbJqetA2Cli2tD3kO2FvAZzsRMnMPZQghxfLUVIvzoL4raeoL7Efs6h_gJ4WnW1hyxFyKyVz00XqwjagzJ1esgybZz7jnQdZ59CTRQXvYGWV21r_Zm9ZCpMUdhzPopzuUR5_KYMwGIHaDle3d1rblQZAC5K1T38foTQXj8bUBAjTnVMP25W_0V_KJvtKmmI1ZOchFsA6svzMDaPGb9ip7JQdePT0hZT-qDGHu1PCL1LZ09giCrkTsdJ0KWTyDI6qkjfZ4D4_KLjJ-wrqchv9JaFwDyqnTWcDTfrocatFqyCnUSqaT9GCltKoKaSgbfalOBNmwhedFTh2iydfQksb4WomuPh454hjZyLSbZGkitjQxZdGjgJfs482N3guGxO-v1Q2KS-fb_uTNkd_O6mMY-RUHSRto2grKjzkugbEh0r1Jji-1Ti9VpCzFbDj3ZFXN92iLpyvK4_CcsklaE-gwRjTpn9ahzQgrewEdFsE9TlZN860ERStAesHaE8g6iTFAn5tH-zFlGJhDnFzCM0VsPXqEjD8ZGcHpU2FuCeb-rzMBbCFtHfExlyQPbuMLbpn-ANp4J5cUEoGyc0dw4Ct6lxulycp7mabEV4jZbjAZ7-qzhMjTc9sFwFQzHijCFLrTFVowYLTrpbE6gDXSahaZQ1gHbwzy1Vlk3XnXsTIjbjXiBgRWGCPtidPJuy9ITpwr3T8lSjXoFdY0BrK2pYsJa6hgzKGpCB7ZM95-03Dfxfh3VFxTWJdgygsPtWD7Ga_KA4G2JgEaGy31wjzGvaVyI0mlZUSf5j2JJkuSpiieLZR_U5RBUt3WMgJ7tTc97JXCzPQXs7l15ba5fC1yc9DCkJY3Vdi1mm6GJtutY576FfrclTuFlTsxmP56zZTZwLtM-13M-hnXTMWfskLItudOdFHs7dRKyGrdi8eVcZz1ntX6Rk6PX5rWc5WrEGdSH8Ib8O9h1hrsgPqExw_HzrQdrKB305MN50WlTRSUxFnbhqTsoamw8gfaRa4gkySAtUnvc57pqwlhrvkg7dQn2hpxCU8FaiOTLbzfkemU17GdgG_ZaEpRYUEAd_34Hu_Dld3BovCIPhIUCMvJgteGwNDKt6dQt6RqHEfZxS4zuxzCdNkwS_AFNHzq7hmAhlkLAP3_DNnyzokjMG13LMMd7Qt8Evf33z7-iUdwt4vrwHcc6Hs0PdePT1EeZjcVBHhyeRWyYeWOZjtZoHw4r4W48lCuKWlrENO_6Q_8OvMFD53V_mryIyB9useD6Lv6FTrPaE-sCEBQaOW-dZiYDO6Zb3kFF7KF1QdvONEPjU_U83qW4zgNT6n1Mvh9eAebfjt4MermJyjtaHZc-s2wCwJprii81AAdn_6CCn3nriX9Lh625yu9g-sEV6ns0N-i7f0J7TTORbeZiM8_W4e795H7yHw\"><img src=\"./examples/two-bed.svg\" width=\"270\" alt=\"Two-bedroom flat\" /></a><br/>\n<b><a href=\"examples/two-bed.arch\">two-bed</a></b><br/>\n<sub>A larger dwelling: central corridor,<br/>five rooms, windows on three exterior walls.</sub>\n</td>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=hVXbaiNHEH2frzjIhJWIJUZeLSHBNnhDAoE8JXm3StMlTZOZrqG7xuNcDH7aDwj5gjzsh_lLQnePbibBTx7aVadOnao6usAdxPF8w8aLtNg2pKBea_FsMFitoTXjYblYvkfXUMUtO0Xod-Tx8vw3nKAmZ-aVtF2vbIoLVCLeWEfKAVvxkI6ddbsA8dj23lntPS_wg4If2Vc2cLiEyo61Zv9NcQHg5fkfrIN6261TFYKXAbJFJBnQkDWQXsHOQCX-OaQdqpEqVTWnAMJATYPNb-gkWLXiMF0bEf_nYJ2RAS_PnyEO1zHsFqS47iTcrmcHWEIMh9akqUSAykDegOCoZZOYYboOg3U7WKeynqG2bscmwo0ETokepMi6GnhuSO0DZ8IjnnW4jp-3IFfVEkX_nGh9K21nGw6oGiYHcgYdhcABa_JVjcY6XS-KriGHyd1ei-XHnyb4owB6ZzWgbQtg563BsiwLwInXGn1XFMAFfrQPsZkvsd-OpHvDW52rzL3d1RolJaRJXSLU5GMCYYUWhjutFwXyf5HDSTEtL8sZdtShRM3pdVWWZWKF3LY1N_6-ydWD_Z1zQEMbbjDJrCZAH5vNUa9SN2ziQ0p9f5L6MfcxyaljVwXwlPv97lHZW_EINTcNKK5v7yN_SjTjCAOmTFUNGnUPSl5fPv01bmJeOohTmSXMrulDOqGOvObN27AOzC696iB5p6NQaUWsuRnu8xx4zwda2-pXxyHgKio1ajj9qizTx9NZcpD-reSo5z4_f59DDBwUb9f_72SmN5L3tP-_fhQLJ5IdIZYZYrWHWJ1C5Ck69eQqjtVKtC2oEbdLamdlYpnLk9tMNx0f34U8zmQr5EyCG_0knXQCGfcyTm2BX2o-XEcyCHGvpp3NwrpoFnHIKcqaG3PfknUxfj8x0kx5sEbr2GiZScIx-ZHZ0V6wv5AzzLT5CTNLeI75dVniHGLDJqt2h9EJK3YavV8c0qLH1t6F4zijUGlZc3iqldaFFB_KL_bsV8lPToPSWpwHXZVlrv79ay-MtpL9zrpgDR-5YOr4gT1ku41HePitmUVSR08NsiVYd1BpD6fSzaODRVzW6A7ZJqJKj0mf0St-li1NziCTtgly9JcTyOxurzCXH8ry8ercfybFU_Ev\"><img src=\"./examples/attached.svg\" width=\"270\" alt=\"Attached one-bedroom flat\" /></a><br/>\n<b><a href=\"examples/attached.arch\">attached</a></b><br/>\n<sub>No hand-computed coordinates at all:<br/>strips, on-wall openings, anchors.</sub>\n</td>\n</tr>\n<tr>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=pVrNchs3Er7zKbqkQ6RaUktSkSIr5QMt0TbLDpmVqNWRBGdADiIQYACMKCaVqjxEnmEfLE-y1d3AzJCO4-zGB5c4HHxo9O_XDR7DALwyKy07Plgnd-DLRekWwsCiNCuh7RZ-__U3CIWEyd1oOJ4OpqPJuDMY33Ym3w_Ho_G7e5AvYr3REk6ee2f9i9Oz1nHrGKaFhI22AZbOmuAJwQcnZQBr6NP95GH6HoTJ6dNKuFya9N14cjd93wbFn7wtQyGdaR1DIdfKbwrp5BlMC4FgEpYiC5DLTOWSN9oWVkvQYmfL0AZv6eFGCwM-iCA9qHBNUgJ4FST8nESjnRqbxAe_0MtzfHcOuRNbD8aGQpnVGYwCGLGWHpbqWUKunMyCssbjUebCZQXk0mdOLSR0Oj94a6DT8VLLLNDe82tCpu3ncHJ_2ob5QmRPczgZV6pn5eBX8sdSBOtmXuUSX2nDQmai9ElSu6QF8bXWcfMTaCVRcBeKrXA5wvnSOOVlghuekj3wsZchPX08PYP3qIwomDA5yrwvinCSrTr4bgj4qA3bQmUFKI8OkgW9g22xo3cKiwKH0hkPYit26CNr_KZ1DM6K_Jre0upZmRU4a9ck1cKGAhYyxwcegnjiDek86AIC90zu5KV7VpmEBT74_dffWscgTXC7NhRC6zYsRCjaoEVpcnz4pEJWSEMKVx69JHuSOQhtzarhumcwMRJE_qy8dTvQygQUudQSnBQ5-lUb5o-zu8nku9l4Mp0N__UwmE7uZm8HN6Pxu_m3oKV4liDSOWCrQpF8CRZlABU8SOERd6tMbrd0JBVgq7QGL3bgbRVhXpLeb-8Gb6ej8Tt4P3y4G91PRzf38HZyB4MxDO6_H95M27gFCMjFTqtVEWAthS-dXEsTzmDgsuKjMCsohG8dg7HgSwNrm0uNC0GLoEKZS5LEWMhFkBRVBy7gxc5Ho6NRRTqAtvYJgXk5H3VbiCCfpQOxsGWAwm5hXWYFsHiZXVMkO1uuClChTikWEwHacJlcncJacdzn1jr4MBrf3p_BAHW9xG_o7HqL0uHeMq_chOLDSXQi08nlUpQ6wJMyuQeKflSuFHge_giLUulcOtjaUucgslAKrXewKSkRVTlFqxwP2UxsJFqK52WpdaeQdFZ8WTqwJnCaymX2RCgbmz3JAIzC_mqXSxDQu-h2Yb2GzDqncuuuyUh0WM6X7OIGU2N8gssJdKGWVucRtHJ_fIYCKxQCPdBuDdiNNBSAgnQeCmHAPtNfEtYiK5SRnk48IP2xblkQv5VyUyVJdhbUwP1WmdXJ6Ryc5PA3pdawtA6E1tEWMb08zu4fR-N3s8mb--ndw810eDuHTBgy5majd8D6WpNSrdGcWsLWVrGFG_qUhlK-aB1DMvScJZ7DYgdbpwIe1liyPwh0Gd2GTDiHruxRcBAuO2uRwx29ieXxCH5uAZQGtbZetwCOYb5yKoeL7rzKzejpO9gIFxTWBnYu5aHX7UIoVPZU5a3kzR7rJKYDQ5Do8J21DE56qjillzkqYIFO-Ti5-zC4mzyMb0F42Eqtr0HAUr2E0hFiJnOYL3XpizmIlVDGBxCEiwLUYmmBnm8NCN6QRDPSezj5_df_XHRPIbPW5cpQAkgiO-mtRr-IQhEwqqDjjdig3wS4Hd6N_j28bawHrZ7Q1iDKUFgncwwgdhRSX6_bnYOzpcklpT8sPYQ8Gk8nXOTRZVAIJxTuPH-cvX24G4-mD3fD2ePg48fZzeTjx9H9aDKe86EwYLDuopIxQeTSqWeZE2xDMkoZgKlfOsAzbDBlRBZBwikPS3JVVGaKai_BlOuFdB7zBoGWJitEnXG8pWpIzrDYBfRHRFJaMqk4awFE32kBbMRGOhics1kysUFMnwktoXfd6-IrXPvKTQsgV2uPurTot_RiIXMqTFguW62_zHRI8E6n0wFfSK3hH7iizMiXOv_HPw6J7cxvlJFzcKXxVQ6ErcpDQbrJ1XNF32LKpNpN1IBUFmukLBQVxG8rYC71c8htXO_FWlJSaZBOBDuDN8ghMKsjZcur-Ey1w8NCarslZNGIHWvmnGsWO7h7GMPt6H46GN8MK-JCzvgV2tL5ABurTGCTxx1Y1sfZ95ObD8Pp7O5hPE81mEXeCCMRIBPPKuwi8cAEzoJ6uaJa3QJ2e5W_ZuvgP_kSpFPWAdQB2-924Wc46ba7p3DS63e7zb-uLrr4If2Raesl_NLA3s4WMu8hdp0cauweY18mUPrj6yuE-gSk_wWQVwnk1edAyG_-HCQtjMf7I5RE8P4E5bxey3-zdg6kibzySziX5w2B-MOBbkQovqCbi6saiP7-I4FiDf8znKuGQFfNg9Whzpy68zf_Ed67RvCeUII6ZT7Pe2ykxV7Rq8ApUUu5AWXaMS2iyzOxW8dekEAj0ewsRYZJgNn-GdzXsQ0nlMD29qLSk1sigEZSHcEIInKg8tduFlsMrPYcKvzPq58koFe_oDuAFgup4egjv_xPuFXIi46w3vnUpeT0bA88hRCCp1hJ4OeH4G8iZ-kdRRkIPDKZQ9h-gn31V2H7X4RNAcKq4DDYgz3_pob9wC8n0AgbIfZgkYomaRsBRrAo_QuR2Qj7XmhdYyZYgsiUy0psROw-fgqjCp_9nPD7V93uS7_f0IYIxaf4xI33vCKGFGI2YpAx-weYH_nlA1WUQWkVdnuw1H9GUa8ORP26ewA7xJePDkUliEbYUs26pqAh1oqEwatQkp7gfwpbbK5oVMOdivJpFBPrZ7PBViE1XMS7q_rT6AAwzhgof53PGBgP3uvWCYiLPz7hfMYVjUBAy2WIpFuZViVho5lCAhd7J-Wpn8QGV2ZPVeNStWfKN-WOUwjCbM4YMsE9T2RlwsUOI7Is7NSRkQvucKSgfoGYjEZxuMSTRCR9g-pQcScGC8Hi6KVJGXwQLsQmJm7orVY5bJR0BLqQYSuTXNXhIvvmHjs2-JmzPlIoLbzfN0LUXWpO0RoYjO3KEv0DS9RnYQO8SbOXJ8zZ3KtSJ3Vdt1LJFDtbwgpT8-dbK-zzEJapMzZuaYZEXsV8LPav1BbRrKTRiqF97ILZ6f5RKfVaA4k9iADfYJ6JB8UE2XCz2s8OMPoHGL0ughxiOG7jP_FVzCvopM2-mJh2IbDB4JHCylpq5Fb2Gvs9cg7sdrTNnnzd68cWhft9nIumF5e21D62-F5RVxPnBnQSYfwWGxKcnbXjbE_TsIbnIhHXr2VQGUuHnthk1WhRoXEatpU-oKw4nuJOjT2EFIBzUfXcZLOErZJPU3Jbr7G4s3uTo-259g9ivaj8OiVhDvVmXBFuHMCoNSpBBFqSWWcwGxgfpMjbcWhDdKCkpjrOTVILjN9cXfAjbrOv-AWOV2QMMXEcMHfe3MmNdTiwg3MG8YV1h46I5SkahH0p8kcRsPw1fKmhytqFqgENZnhKUsvS0TSmMZnEZgeVibaP4x38z-9Ncwgy5g6ynYou68FIRZCVqZKfYeL7dOKzf8Bkprjx4RnP9w7JB7sR2K1HWfx1s7SzztM4C3dK6U7lr-0eR8HASDQlpq-vU_qKIXu4vMn2vv5kee9LyzeCC3hFNS4uLurlryi98PKaCO0BNAkA10FmAHH_fmN_1mCj0nOa_7sUnfDGPDDHTvU6su5CLFQQizgtwMTtmxcHiXYLv5FZaAz2KdVjNfCpwf3c5Bt-LBXOz6eF5IwuDQZXSB_TVELlkppcnhyr_LVJZot8t2Lph1ajmnWwNFJwXIr5P62NSy-_sLRf2ape--Wlcm8p9X_omZ-aOTXwxxBvYej0aYQHIl7VHIBHQl2DsxceOmENzhP1g9D-Crlkvge9nXllniA1Q5eX3X1t_bHcPhqtXScKhNlD9omlU-RcVvwvIl_uC91w-jjC_JteH52-GohSVeArOxw_LrzVZZDNAWA1IyWx2vHiwkiiMriMvd1ZvEyck1NXN0hYalw1yaITfeW5dMYhDpdOu1x6vPFTWOVz5YMwGXPSwcfJ-B33rnEFnMRZURyHYU7fmzSlUc5pfVFGZdh6FTum46qw_lgKF6Tr4PydGFecgu7Psr6NpvxJxsuY6ttMBKHtqpRnVZnywqgg3K42GOIKk_Fgl31PudgL7ZfnNJdO0zACrTZDzkzXRcyVlcEC_3ZwMyQlGns4p8ac5FQI1CNsDdLPAgd_LcDKaRQ5QDQV-3uydZP3Rq2fAxsJehhXykDdJdNsN48Oz56-t4UP9lmm1u0vbdE72GIPbulUvpL_AxyR3T24PTziivEFik22VaTDQCaJjelF9-WSZs316m1GcnyyemFDQIrSWN3tvnxzsNoXdkts42A10-jm6lfd7ssrZg318syWJqT1Vaf-OQGwPJD8-yLYpajmMu0-Z7q6vacsGvvwe7sUR3uLuU5WqaxXzzNos-biKb66v3oh8zQS6uPe9dZIaF6oBatnN59b--ovra0TKRVc8fw3Mylnp_qHIcrD2nq82HfWLjlN8uWRDfzbj3pQQNfenNMKkbJjqm_H2K7-dHjXKMwutrF0666xCePfXqjAUz5bBnqqfHXBtMDLWF_wLA77cYyP-VceHMJj_04pQS8pidaJY6NLj5WoDWsVMGmJwDe_3FQkyry2zzFFqWWVKz3OGGN6den6yMvM4nwTif-yUVw8psMnHnqCD3JzloQE5VM_zB0wzeVzmKf5ypxDHjdJ8lR82Yg1HhCbNypSqULZJRVmvIWCfdIyxyOIJKdlNfKVfJ7jjVW8P6HWGxkhQw6R4r2dDb57M3r3MHm4n-_bDFal5MHDMd_WhWiz5uX_2jpJl9bz9NMYvBJ-kjv-uYEygX5TQZ8a91jbM3gsBPesKvB1D9-vJS_7fvBuWF2y4764G6rPBOy4QZlMl8n7KCCqez1fSBni1SUS7WChwI4GJ9FxaLyvSgyvoIKWdAEMsHH2B7xcPLpPv6CqrojpexTHzBY7OMLfW9wI8yx8_AY5x1G_27_sdK86vXN8-kvrl9Z_AQ\"><img src=\"./examples/bungalow.svg\" width=\"270\" alt=\"Bungalow with sliding, pocket and bifold doors\" /></a><br/>\n<b><a href=\"examples/bungalow.arch\">bungalow</a></b><br/>\n<sub>The door vocabulary: sliding, pocket<br/>and bifold leaves — panels, not arcs.</sub>\n</td>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=pVrvcttGkv_Op-iSKmX7jmRIUbRk7TlVdETb2tNKLkk5J19OGgJNYlbDGezMQCCzlao8xD7DPlie5Kp7ZgBQkp29LD_YItDof9N_f-A-zKDAjVgZLRSshM1RQykepJJGn4CTG_BWlPizkTkTKIVWogMr9UrqFQjIpM0qJSxY4yudi2Fvv7cP8we0WzC-QAu4EetSIUid_nTfgnSwqKTysLRmDRYzL_RKoevDAjNROQRfCE9kNf0vevuwVMZYKJXQULlKKLUF6YZwU0gHRiPRauMTL9ZpdvHT54_zq3kfhM5BesCNdN6BN-AKU_f2gxRfIPjagDZ6QI9LJTWySWYNS2PXDjKzLo1DqKUvyOrKPmAOtVDqhA2GQPzbr_-E0qjtymh4uelvX_GVzkeQE0olM-nZifDbr_8gt2SeNEIlMgRhUfRBiQUqEJ6Z__6HbMhQe2tk3gdtYGEqnZOEhdmA0Nu6QMuHQJRCuxrtrt50kgpBeHiZbfrZ9hVYkcvKkdZgiVs4gj4rCGsUrrKYg3DBALWFUl797wFzFTaLDohMrh4r3Djx8-z8HOanH-Z9yK2oNTEU4G2FcP0_H749_fE9cWMv33ycw8f5j7MPlxdwdg0XlzdwNf_ww_nsqg-zi1O4-Ti7oRtE9-ny7OJmCDOwGIIhBjqYZQjaddKstw-ZsBzXS1NZIpDewQNaLzN05JEtvIX__HYAV__h_mb9y8mrbw_45IQGaa3wkhNIV-sFWnL-ysocMqF7-3TcFp1jcmeYs1OmxByWIhM5OtD4gDb5s_G10FtfSL06AYeeA9xUnnS5grdwNB2NevtgNAiYjmC9DhIpylFkBWizlqQR0QHmK6QARgcLkd3TxUNyDHmbAoRzIBNKOf6ztx8ekw7UVupVSB5SoEMoPbMBZcy9AyXvSfG1dF7c4xCuDXhKS1egUk2uJ4Ung8PBFLyVnPIgtfMo8mEsGjvOAeexdHBI-ojMGudYmdej0QhyU-s-1IXMit4-CUlRSNoHpZE50kHiBpTQOVUKTgByV8pcgJdj4tg_Go1Gr-DleEwMxuHLtPP3uEMUrk92nuBvzPQ9xVE6X7OMKlGNMUvWvg_0yAg2MD6g_80DWqFUDKqkeQyoqLMrEH0wVUBdGIWwlkrJNXqOG3JyjpbiLsRM5VO98qLEUJln4DAzOm_SQfjGcYVQS3CZUAiO4lRqJ3ME6anKIreDtgUISwGBVENTi3Dwbn7zeT6_SBX1JCRUaaT2jiMzOqHyaDsJpvOmBkut2WJ0vX1YYCHDvTV7huPS2HD-0SvBy_2gPEdovBG078OEgwWxHMK13HA9Eqq3D64099TKKg1CGc4DhL8aqV0IHgFr4Yy2W8httYalDAlCTs9zFd1JfuHbMtwrhfVQG-sLsCi4_vpaZjiEs9DNrPQeucZdXsy5gVBIkOUO1zJ1094-3Amb3XHuOnjpQ_GmDgeZMg4HQg-oxlJ3OqFaShfzUFKTLsS0EOoBOV2le9UHQxVJhEaB1OVIeKyD7CcynCKS8je7H4aLsbMKWFpEyAojMzwJPKOnNTeTGFIvHJxdXM1Oz3647lPJ89FHL1xXcHw2dh2pXWblAvPQoYRPzPoUYKbKCh43lOIoJI9REqdgfBHDhr1FwdoZHRT6ICkOKLCgmL3jtheFU_frOOGOY40zTqyxo3OsNkl1Y3Ophd3CzGbFudAraiRGP6CmfhCsENxfX7jQjolYOu4BdPI7Duk3aWCR4i4U8mDiljlXlETCwez0z7Pv5xc3NMZ0DbOC5y1fCE12UFdwhbE-NLSQwyHzljRmcD2kcPAweU0VqRTOt-fZOc3MWI2WG-FkMj3cOVRwZImp3aMToTrVnEmq8aSJQvEQR0eLjuynq5UmNhhHjJT40rNX6LxyuYZcijWS_tHiu9iMuDHGtlkWkstDW7IyQZlhStRSr0LdKo2TdEbIrI0OlggP_1Vm_ru7dM61UPfBLs7TxRZmV9_D-fziw83H1M-Ph5PJ5Bs61QlVmZVFGmLd3yphkRtePKRQNMhUkQ41VRBKKm71VNdTWfZ0_FQbF2Td7OLi8mZ2c3Z5MYxNazxknzgQlTepfdw1oanVNtxZmxxjQSqC46mUcPauJJUGIufOITmA-UPNvpkfs0JI3edrV3R61GJKtJBL56XOPM96aUQg99PNzlpg1sPE94aj1ayZnH3KzB2phlTbxEbydK4kxqIcRpzJILi2qfYhAhPfMLyTjann0innco3a8THDu5_g4-zidAhznXM7gsur0_lVUyXKKjYooFxs_FD50EPapYSOcEnd1VbadRrH-fz9DemwFlzQaa0ZfOcNhwkVfQSUlJ6JdSmk5XGsFjZvW2AqjWES9oU11arYOSN4eff59vTsL7dnF9dnp3MKVu7xifFaUK3EgShpzRALaua1KF8NYRZlXL5_fz2_gUKwqxcIC7lapcIhfZjpTkJpqVTjjDigupj6pB9p-8JRbAefihWdpt_R94XjIx_gxiMVsHeXP_LxcSuKm4Arldi2Q1-mUFgZHcthEjsQanYH-XR8HBqT85Luh0mlExLNStlvehglUtx_1sKupIawE4k2UmCBdKIuROzBEC7CqUFBB0Q1KG0KAu48bvwdp57lICESHek1Ig-beNIZUlrd4vYa50IO5k7LSg4mFzixjdpMaGZPyyVnEa-I3E5QLal8UWOhznB1eXYa9GEDu7thqhC1sa7ZLcuwdz4IqThgeAplvw1ocGonPBo7XVPMWN8kgEvoolI0r1AnSbylDzlQSBUIqURQ3R7weaRQvwxDYyrx_WYobSXEqv_CNelZa9DUomtTqRxWhjePMDqzg0qqLeQUplpswzFyvtyF_Xrvt1__ucc7Ly2rd_1O5qc5Mk4GfEIL6TDzgSdJr6m79ckftdjCAn2NqFt3cJ-NqZ04h1Boh5RQrjGeAcendDRtYsd0UfnCWLjX1GidWSP3iy7b5nxzg5ws7XxaCoXeh7KCVtLOzaiLACd5A8uMojE9-IWGbQwEe_sHy9fLQ9wLExFpWeAGHoSqkKfzsFRyOPE6wlvHklO2D6XJCuzHhs4DtdbG864MUt-7YY-xnL2PseN9irjTHvy9B1Bp8vF63YOw2k5HPYi7yfiEv4SCX5U9gCeNsNdjROSJIXR9HwaDwSDspiE7w1CUOu_g__Nhfp-Fuk9OJX5Ig1TcOjNlsvtaOkzhVIpV0794Pkkty1aauY0GvOaweQNi1ecyMRhPmst94C-DA9pII2WNRMlXBgfHROpMla4zY746mBw29_rAXwaHvIIGchIYR8U0MVFNrB_NTSFQjUPm3K6hbmcKLdFSXIpVF9gTXSSGOjdPiAr1yheOu5I2zDVGZ8sk5OAahXaw93ioCm7cG_Ygtoz8bYAfqPFYaWxYaTRhMTQdU5Dtbv7xQrv9hwvTR9_Hjx7oIAE7HNorvJz1AH7phF-qESecVsuKZiHeRvrdHZFyoLPGPRd-yVguOLR-yrh9JGN5nft7V7VWeYbpps217hbU3u889IjgsUEUznGtHvyxD_Ob0xzG81WoU3p3I0mpRTU6TtctoIAbWODWxOUhjonEtLMs8qwQNutYnF2YMxpUI2x-ZA6NOG4nqMi-W4Rnfc2uhpfjg4NpCyd1sKVfnjDS-FVGI3r28Cku9Qyj-muMjlo-O5jWUz71Vy07PGoM28HDnvJxv68PW_cIS3uG0b_gocSpm3o70UnjwB8Oym508lwh87dp6e6g5sfPpkkE8veuwgN7LenxhEgrh1T1Qs9K3FccF-lFwpfRyd34aKOOkzcJDjhUEBxoqOBHyUrSUrgrGjqiv4SFHnUFt1p0BV_7KpemY_BBa7BZLmWGu2LrVuyXUNdO-HU06Aq9QQFXxqyDWKbvWJtL_dha1xH7RYB3J1xbJXatNRY7Ut8cN1KdN1asdq118NjaZ7Dkx-HdUaMreq69FTqL0o8IzBmPjxrxNBlud4XjkxOePC1Wj8rY6HnhHwKY0Q2vjukxvNpELI31QrmT56CZOCEFEPP3EjE-RQaVlC0dFCdiMlDL3BcwPuRetUsPXfqD6Tc8Q3-Fvu7SH46Hr18fffMVerdDP40KfYV-R5-j39XH7dj75qk-rcMxBge3upUSPxOTP9aXaSps2DklcwJbZ4QJLUkdWknQxWXM1bQ4ChgPD2ENBId5tINcuiy9yEmNuR3i0irEgRpA4IBROC-2ARX4Ey3eJFrq1V2QzJJ45QkYsSeYOEy8jmAhcLxIE5QBDIog85S-AV0am-6ZU1rueHOh1p_TBkMj1u1aSA1RPJkcJkzCRSmLOgcQ3AMKl57OopY6NzXxqKWO0do-ezQdpcM-CIf9iB526MejVtbz9PUu_dHB9Kv0bpf-gOrXV-kf6X_8iH8bfA2w8m_13rDhPYF_4-VuzRp8t9OxIlQXp1UmbjsL0bbFDnaIWwuUIcBjWVktPb2e_TfG2k8d7MaBxWVCFIXOaLsPvzR4Ob_9dD77fn776fL8p4jEaAL0IsQWaAO-JJhvA3W94oE34B_0qmbgvAgYbikxQ0gvkYQGsXBGVR7hTvi7sO_RnhFADpHdM2MGr1u0gdS9SxAfzWgNUE756UDhisBPAmx3YKq0-Ekf8j3hiM2-zL8AYPTM-PZqQI4B9vmpmWZweCCUXNH-GSySJIxBmASqd2DN9A40qSzg-vzy0_w04hP0YoE4U7ovhY1vORoQzkYAnl3CE-lSWhfALNKTHiPBQ3hnfAEL1EwelmUngq1j3tv5VUyEKEXg5YySOVTaSwV3n2_f_3B1cXbzw9X8lnxx-_3l-fnZ9dnlBZc4S_YSlJ9-IcCsmU2CDfn1XMc9f2rKYSHCy2TICszuMR_CfzOiR69UCRpgvCbhTNvAmV8QLG_ZpFB2A8gTX823QEEDxy9vHdJvAwJtmtvp9NrMkfnb5W2O7h7Cuyy00A2mWE8crtb0TmjczUdw8mfkvzbTdqL-bOx98PseBcLqVj-VR0yXX5AX150oJ1RtkkML8-Z1K-e6QNq-oxBXP5VCr3oBPGOnPAZRO-hPp1MqLMzzzWi0eTMatWMq0Sa18SlHjwK6HCfHLcMvcESxR3Arc3xGx3Ca4d8wqr2ZjvrHh62O5IHN4bSx-13Hte4ZHfnIOxzfHE5Hff45w7_EkTE66RVGcKK05q-Y-WcAQb7NMPHtYgt76XVrvC48wt7B6OD1YHQ8GL_eY1zil97_AQ\"><img src=\"./examples/hexagon-pavilion.svg\" width=\"270\" alt=\"Hexagonal pavilion of six wedge-shaped galleries\" /></a><br/>\n<b><a href=\"examples/hexagon-pavilion.arch\">hexagon-pavilion</a></b><br/>\n<sub>Six polygon rooms round a circular rotunda:<br/><code>room … polygon</code> meets <code>room circle</code>.</sub>\n</td>\n<td width=\"33%\" align=\"center\" valign=\"top\">\n<a href=\"https://playground.archlang.uk/#z=pVnbbhs5En3XVxTsh9iIpGnJl3E8cQBtosTGJHJga2EPBoOI6q5Wc0KRGpLttjYIkI_Yb8iH5Ut2q8huXeLJZHb1YMlU87CqWHXqol0YgDUVmBxyU1rwaK1IEbIKlZJ65mCGGq3wmEFuzRwuR0NIzXxhNGrfhoUSKWYgdAZzaa2xmHVbu61dGDRQ0oEvEJyYIz2u40Fyjq4NzoD04ApTqgymCJWV3qMGo1PswqQ5aQKPW7sw4eMmBFmYCgY2LV4LPQMnlnSI8G2WxBfSQS7V6uy5UAqdZ8kVegS8F_QJTN7a5UcWwnu0-pSFh5WKUGrp96o2ZG2YianCffgAXz59ho8QX0avzNUGUfqCrBCstZe0k32QGqR3jPvdr8ubEaTG2Exq4clSC2HFHD1a6TCD6RIqmfmCQdkqQdCbXhteDN-Oz9vQ2wfhoOyB8LD35dPnfYIVGkSWWXSOdIGL0fV4MHo-hC-f_g14h3YJMgOpnczw78k7xdTM0cGk7HWfyuzZhE1hOjJzYNF5YT0s0P49UKmdFzpF9hO6JXYdYRGMzdB2pM5wgTpD7RmY7oV07q90Dl4J91-DC7AoFFjMFaZeGn0KmTEWXEV-34ZC6hk6cqi_JzTJWRVGIeTSd0zJXodAH4IwHTkXM2RHGxcWkfyVIk1M6RnaThFJWlbG-oLEzKSeQaqMQ7UM8fXm4urq8upi9AreDi6urmF8PoR_ji7G112Y1DpPauXWsesrf-TAVBqMlTOp2cCitdsEMXsThU8d4J5cGF4OruAeMJshe0zZp0eODpOEvBE5-FYbeslJkrShKmRKfroovaNgN5p3fPn0mR_owkBR5AlPOpKEUXzpoCqEh7l4T9fQ8Enz6ZSdm6-n7MMc0YMyqVCd-7MKvFn9U7uPtDAVvrDGzPle4b30aYEabKkdTEX6Hoz2hiPaFcIiQS-E9UuohFKBXMi56O1g88Rk_cSkC-MCITXa4R8l6hTpW228rPlQ-Mg71lSPHPjKwMur4TBQjOPLnxpf8COMCnQEScGGZ5sGCy1hwpuYFXuQGwtlr7UbhDzkt4RXCYrOkTpaOcsUBp0IhdYmMp_E6Of_VyzIlycg8kIldUZJQ7MmQSzC0aYq0CKgchjclNzy8uXL6-H4GgZXQxhcXYzP3wzHF8_bMLocw_iXtxejV12YMJs5VoI4ylqxZMjb_g-3Bz_cHrJJBN2UlnrW2gVXzilrSd9t0kIqtDYeZqbWQcAkN3YCe6yccPBUizk-C6eQpxIzE3vIXKJt0w2x5UBqj3ZhlCBe2N-kHyV1vKFSW6PUf9mYrmRKgV4IPaNjWRuWP5AqRRMh5x4txcDc3KEj-1FQmUqvjHU9Hrx6NbyCi2tOtc8vL69eXIwG4-EqTgLVO3DSw3GSQF5aX6ANGYfTnbeIPkYeGM2uJh24gjx2jkK7xo2DYVdBu4QzSMJXvdrR4_L1cPyPwfOfg29zWJArCKUcOC-VgtRInZLdzR3aoDlTG9uGPeWYCMEZQJEW8HupmXchs6KKibowlgyF95TojAWLvrSaPE9U3nBE1DSQ-lIotYRCuGC-m_Nf2IRvXw9GZL_x-cU1_9PdKnKk4yOpymAjs12aS2bmY2ldae_kHVLmjoUEMUNVGEdxyyRiMequcCYpowoPAv4ohaWbNnnIBuwNG3ErWILgyUQT3gpJ9RT5L_t_WkiPqS-tUHRqiNNAySErTJEsWxhNdQ2LKz1k1txx6LZ2QYmlKX0XXpLKLG6Az-UdnoKSd7R_nQU5r2okP9Ked0AlIwfNqIBaUvi1dkPc4wYzspoUsnDUPYR5wBAzZrvmpqalVL4LI0GFgsmDNY3NujAy7CitXdDCWlMh0ZXQ0OuewDw4nCc9pWMVdjKDnEuIoKTCHfawsBoCjqUPN-PEMpZflO-IAGp6iMEXfHiHL8gZmJDxIUOXWjlF6HR-d0ZTKl0YyzkqbwxKFU0T21x4IrwdvSI3prsFJ-89ooZSm6nztkypjFZiiiq4TlMXpwWm79tkXqboSixdNxQHJHa-Ih_Ntot7LebGIry9GI2GL8JdTRgddr58-rzDRdB9e7k_aTd1dSD_1i48v3zz9nI0HI1jHbBWa54SN0qta1kjWxqpPSj5ntL8EgydzzGzYl9rZQgWckhrylnwnZwK13ZjIFJwo8ygHsOvZX7MYGGcZGqgxJVbxC68wjpl8hVaOSs8qUNOxCG7CpDmOzJZ4IaJL3COMFUlLqykfoKVGg3eDF9A_E64UNWIWL6lS6GNXy7I0xV6j4Fha69ts8XJZU0NHzuDCUyVSd9Tzp9TWAupuy1ufXbGkb2uTLUDH1oQDTCftwB24SgJIdpLktMmxNgQ4c57SUJMnr5vjFmXmJw209B5THJVumIC3jBoKHzoPi3kIqVeItCQEjrjJFQIlXcYV6Nz667QbQHMrMzgKGkBaCaectECyCSxX0nF0h1aoVSrBbBlY1pS6EM_AgBn8CRJkvVSeXctPW70iRkufPETGK2Wawx6J9jBAmrMRnDGOXATNeCEhHEKYjtvelyEam8rY0bkUIqQvL9SodqG8Pc4qT__Vmt204Oz-PivyW_1Yn-12GsWD1aL_WbxcLV4wKC7cBUKnLq8aZR37JpcDmLuQwlu8pBIg_l06K63bo_OuSUxk_ofEu-2B4_hplcvkXC3fVrq10sk2u0BLR0EwTqdTmej1-WV_-nV-ov-ukW3SFLwBcMZHH7lN3xpCnHB5YXQWZvYjlZDGR8st1DGN2Dng9evX8AZ9E4eAkutcY4iQcEUfUWsXZMVwbs1mcbnN3AG_X6SrBaHL25I0Ao64YHmm5dXl6MxnEHG3zz_GTpBkBY_wZWzzM5cgUrRQlP4wCoe-0cJfIijhL0q_s32aSXbD10hfNyAq95Rn0OTgZo_1uCIRD7AHonMWPyBRNv_CoXM8U5_CyWJO_eqb0G4v4aAx8EuDdRq4WOwFad0mZ1NMeP23UeTrL2c_BeGu7iPvhPT4T8w26k39SiaT5LVztKhgylmdMDmScGItKm21uZJ7ArxqPok4YudtU3wGHq9JGn3e3RiOIpgSy-V9MuN89j7as2COTfOq-A-ejE0mp0LpXZqJRgglTYtQ-eygV5XfP5rkzfowVtX6K95T6gkKvgB-u3jJ7Xl-MQImkkmrVhJhvvahZdcSPJQxeT5GtFSfxU7qqbW_CnWmTZDHfZwhnZKZrHQ0CbiKhQ5uApxEVJGvDvIlTG2yw8FgOws4PO1_5hwvIRU8uQodtMh8njmE6QKGm2AWBSWBant1-sn7HoBq8fzjzUwEplpurWCoWlWdpa9Y-81GprgEh76B2GA4gsgbloTZopZ1HliNDylQ57RjqcL455NwMfRiJKeknBTNjW9DPG1WSBfTuhbMhlGahE2zM9cXdJzJrm5eDE-50YjFo1iVf_F5zhJkzSPHKSovUXqirsPqEu-Hrynw4aKfr3Slg3XWGNdd-ELBqwVkNmZ4efW7OcI_Eljvl6SJJFZw4iCOEjqd0rehbg6Dk4QX9EXKB-s7u_h7f1GiycNxOrMb2_nO28IoQOHR2vec_KXp2_Y8CipSS9sP9raHu_1sq6cKIGFsof7A8HVdMi0XHaHmU59Yl1jcHXPewtxhyAi6qrjC-1HKOpFIy816mvPxG6t_j64h8zj6Wdn0Iu5flvj8EBgqkCc0dT9r039sWGbWApPl7EUPo3V5UJiGLvNUbiymc2TTYg2HoXRH4cIQb8cPB9GyL1YSu9H_gnTDB5xUWxw7K3qLTAWxFYxHXTOS6ulLy0yJQV_iGmMhtz8OchMUz9v5h0u8vhwalaRW4JA0xRE9z3y2bXc9tAplbAZ0B9rprh1SuiQ4iscw-DHhN2vY2gLkLpatBDfCJAdMyB6swhCbyE-SZL7J7FS2jaDcFIDxLcH8BoptyQ8PHoQr0qDK6WNWdfwol0D5BoeWfPHP1PY5AIg_JV6NTL5k4tivBOy4Mnqdq5NLnZqFx1vTFLAygzd1ijlFCZiJuiHjwlkaGn8tEbr3BfVzV8EjcOmDg_Kmo5mNbDmFiEVXigzK8n55T2rOLX8q0M9BMmN8dy2PeiyTur3AHWCD_9GOTdSH87mVNT3KOGT2x5Tamts9yCyp5EVxLf408x3IP_Y_yvk3ErqkuLb9yOf9LaQP651QPXPM53_68V4g9W8o_6h61u_uDAHlX1IqeN2cNv_8unzbf_xTTPIDV8w9O0hfXn4-Oaw28xxD3lCs4xlFhFsrsTsp7VJMJUTG73zI9cUaMze3_FD422vXbfm-1s7-s2OZH_tZ7rYePJq_cvV1s6D7Z0HYefBn551uC3dYdhxSGcdbp5FkwvpFcZktLDmd0w97NDgtBOmwWFqE2iWR8fvpkvYqX9_juuUAnb6Sf-4k5x0esc77DkfW_8B\"><img src=\"./examples/terrace-row.svg\" width=\"270\" alt=\"A terrace of four mirrored houses\" /></a><br/>\n<b><a href=\"examples/terrace-row.arch\">terrace-row</a></b><br/>\n<sub>One <code>component</code>, <code>place</code>d four times —<br/>mirrored in pairs,",
  "bytes": 60000,
  "sha": "285b475ea5ff5ea5dc46f839f9e3361273041979fe43062fd015489d0049a556",
  "repo_slug": "chanmeng666/archlang",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_chanmeng666_archlang_mcp_af1d5371/readme"
}